diff --git a/.env b/.env new file mode 100644 index 0000000..cd6c868 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +EXTEND_ESLINT=true diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..a3352fb --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,98 @@ +module.exports = { + "env": { + "browser": true, + "es6": true, + "node": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "settings": { + "react": { + "version": "detect", + }, + }, + "plugins": [ + "@typescript-eslint", + ], + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/member-delimiter-style": ["error", { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "comma", + "requireLast": false + } + }], + "@typescript-eslint/no-unused-vars": ["warn", { + "vars": "all", + "args": "after-used", + "ignoreRestSiblings": true, + "argsIgnorePattern": "^_", + }], + + "react/display-name": "off", + "react/no-unescaped-entities": "off", + "react/jsx-tag-spacing": ["error", { + "closingSlash": "never", + "beforeSelfClosing": "always", + "afterOpening": "never", + "beforeClosing": "never" + }], + "react/jsx-boolean-value": ["error", "never"], + "react/jsx-curly-spacing": ["error", "never"], + "react/jsx-key": ["error", { "checkFragmentShorthand": true }], + + "quotes": "off", + "@typescript-eslint/quotes": ["error", "single", { "allowTemplateLiterals": true }], + "semi": ["error", "always", { "omitLastInOneLineBlock": true }], + "camelcase": ["error"], + "comma-dangle": ["error", { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "never" + }], + "eqeqeq": ["error", "smart"], + "indent": ["error", 2, { + "SwitchCase": 1, + }], + "no-multi-spaces": "error", + "object-curly-spacing": ["error", "always"], + "arrow-parens": "error", + "arrow-spacing": "error", + "key-spacing": "error", + "keyword-spacing": "error", + "func-call-spacing": "off", + "@typescript-eslint/func-call-spacing": ["error"], + "space-before-function-paren": ["error", { + "anonymous": "always", + "named": "never", + "asyncArrow": "always" + }], + "space-in-parens": ["error", "never"], + "space-before-blocks": "error", + "curly": ["error", "all"], + "space-infix-ops": "error", + "consistent-return": "error", + "brace-style": ["error", "1tbs", { "allowSingleLine": true }], + "jsx-quotes": ["error"], + } +}; diff --git a/.gitignore b/.gitignore index 4fa2376..7bfe0df 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,3 @@ Session.vim npm-debug.log* yarn-debug.log* yarn-error.log* - -/.env diff --git a/package.json b/package.json index 451295c..4b2c3ed 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,6 @@ "@types/sjcl": "^1.0.28", "@types/urijs": "^1.15.38", "@types/uuid": "^3.4.3", - "tslint": "^5.12.1", - "tslint-react": "^3.6.0", "typescript": "^3.3.3" }, "browserslist": [ diff --git a/src/App.test.tsx b/src/App.test.tsx index 07ebd54..a758f0c 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -11,5 +11,5 @@ it('renders without crashing', () => { - , div); + , div); }); diff --git a/src/App.tsx b/src/App.tsx index a1e8604..25edbdd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -97,11 +97,11 @@ export const routeResolver = new RouteResolver({ const AppBarWitHistory = withRouter( class extends React.PureComponent { public props: { - title: string, - toggleDrawerIcon: any, + title: string; + toggleDrawerIcon: any; history?: History; staticContext?: any; - iconElementRight: any, + iconElementRight: any; }; constructor(props: any) { @@ -159,7 +159,7 @@ const IconRefreshWithSpin = withSpin(NavigationRefresh); class App extends React.PureComponent { public state: { - drawerOpen: boolean, + drawerOpen: boolean; }; public props: { @@ -193,37 +193,37 @@ class App extends React.PureComponent { return ( -
- } - iconElementRight={ - - - } - - /> - - - - - - - -
+
+ } + iconElementRight={ + + + } + + /> + + + + + + + +
); } private toggleDrawer() { - this.setState({drawerOpen: !this.state.drawerOpen}); + this.setState({ drawerOpen: !this.state.drawerOpen }); } private closeDrawer() { - this.setState({drawerOpen: false}); + this.setState({ drawerOpen: false }); } private refresh() { @@ -238,7 +238,7 @@ const credentialsSelector = createSelector( (state: store.StoreState) => state.encryptionKey.key, (value, error, fetching, encryptionKey) => { if (value === null) { - return {value, error, fetching}; + return { value, error, fetching }; } return { diff --git a/src/Journals/ImportDialog.tsx b/src/Journals/ImportDialog.tsx index 77c3a5f..03a6f2d 100644 --- a/src/Journals/ImportDialog.tsx +++ b/src/Journals/ImportDialog.tsx @@ -71,14 +71,14 @@ class ImportDialog extends React.Component { Import entries from file? { loading ? - + : - {({getRootProps, getInputProps}) => ( + {({ getRootProps, getInputProps }) => (
@@ -87,7 +87,7 @@ class ImportDialog extends React.Component {
- )} + )}
}
diff --git a/src/Journals/Journal.tsx b/src/Journals/Journal.tsx index a3e6f2a..e9f71a6 100644 --- a/src/Journals/Journal.tsx +++ b/src/Journals/Journal.tsx @@ -51,8 +51,8 @@ const JournalTaskList = journalView(TaskList, Task); class Journal extends React.Component { public state: { - tab: number, - importDialogOpen: boolean, + tab: number; + importDialogOpen: boolean; }; constructor(props: PropsTypeInner) { @@ -87,7 +87,7 @@ class Journal extends React.Component { itemsView = ; itemsTitle = 'Contacts'; - } else if (collectionInfo.type === 'TASKS') { + } else if (collectionInfo.type === 'TASKS') { itemsView = ( { diff --git a/src/Journals/JournalEdit.tsx b/src/Journals/JournalEdit.tsx index 8d59e29..a6a19a2 100644 --- a/src/Journals/JournalEdit.tsx +++ b/src/Journals/JournalEdit.tsx @@ -54,7 +54,7 @@ class JournalEdit extends React.PureComponent { if (this.props.item !== undefined) { const collection = this.props.item; - this.state.info = {...collection}; + this.state.info = { ...collection }; } else { this.state.info.uid = EteSync.genUid(); this.state.info.type = 'ADDRESS_BOOK'; @@ -86,9 +86,9 @@ class JournalEdit extends React.PureComponent { return ( <> - +
- + Collection type @@ -126,17 +126,17 @@ class JournalEdit extends React.PureComponent { variant="contained" onClick={onCancel} > - + Cancel {this.props.item && } @@ -145,9 +145,9 @@ class JournalEdit extends React.PureComponent { type="submit" variant="contained" color="secondary" - style={{marginLeft: 15}} + style={{ marginLeft: 15 }} > - + Save @@ -158,7 +158,7 @@ class JournalEdit extends React.PureComponent { labelOk="Delete" open={this.state.showDeleteDialog} onOk={() => onDelete(this.props.item!)} - onCancel={() => this.setState({showDeleteDialog: false})} + onCancel={() => this.setState({ showDeleteDialog: false })} > Are you sure you would like to delete this journal? diff --git a/src/Journals/JournalMemberAddDialog.tsx b/src/Journals/JournalMemberAddDialog.tsx index 500babb..19edb5e 100644 --- a/src/Journals/JournalMemberAddDialog.tsx +++ b/src/Journals/JournalMemberAddDialog.tsx @@ -119,7 +119,7 @@ class JournalMemberAddDialog extends React.PureComponent { publicKey: userInfo.publicKey, }); }).catch((error) => { - this.setState({error}); + this.setState({ error }); }); } diff --git a/src/Journals/JournalMembers.tsx b/src/Journals/JournalMembers.tsx index 62f3a0b..a0cb01a 100644 --- a/src/Journals/JournalMembers.tsx +++ b/src/Journals/JournalMembers.tsx @@ -53,26 +53,26 @@ class JournalMembers extends React.PureComponent { return ( <> - + { members ? - - } onClick={() => this.setState({ addMemberOpen: true })}> + + } onClick={() => this.setState({ addMemberOpen: true })}> Add member - - {(members.length > 0 ? - members.map((member) => ( - this.onRevokeRequest(member.user)}> - {member.user} - - )) + + {(members.length > 0 ? + members.map((member) => ( + this.onRevokeRequest(member.user)}> + {member.user} + + )) : - + No members - - )} - + + )} + : - + } { labelOk="OK" open={revokeUser !== null} onOk={this.onRevokeDo} - onCancel={() => this.setState({revokeUser: null})} + onCancel={() => this.setState({ revokeUser: null })} > Would you like to revoke {revokeUser}'s access?
Please be advised that a malicious user would potentially be able to retain access to encryption keys. Please refer to the FAQ for more information. @@ -94,7 +94,7 @@ class JournalMembers extends React.PureComponent { onOk={this.onMemberAdd} onClose={() => this.setState({ addMemberOpen: false })} /> - : + : diff --git a/src/Journals/index.tsx b/src/Journals/index.tsx index efe79ce..2a34aae 100644 --- a/src/Journals/index.tsx +++ b/src/Journals/index.tsx @@ -62,7 +62,7 @@ class Journals extends React.PureComponent { /> { + render={({ match }) => { const journalUid = match.params.journalUid; const syncJournal = this.props.syncInfo.get(journalUid); diff --git a/src/Journals/journalView.tsx b/src/Journals/journalView.tsx index 69262bd..95ac41e 100644 --- a/src/Journals/journalView.tsx +++ b/src/Journals/journalView.tsx @@ -14,9 +14,9 @@ function objValues(obj: any) { export function journalView(JournalList: any, JournalItem: any) { return withRouter(class extends React.PureComponent { public props: { - journal: EteSync.Journal, - entries: {[key: string]: any}, - history?: History, + journal: EteSync.Journal; + entries: {[key: string]: any}; + history?: History; }; constructor(props: any) { @@ -41,13 +41,13 @@ export function journalView(JournalList: any, JournalItem: any) { exact render={() => ( - ) + ) } /> { + render={({ match }) => { return ( diff --git a/src/LoginGate.tsx b/src/LoginGate.tsx index babd157..75ca86d 100644 --- a/src/LoginGate.tsx +++ b/src/LoginGate.tsx @@ -35,7 +35,7 @@ function EncryptionPart(props: { credentials: CredentialsType, onEncryptionFormS return ( - +

Encryption Password

{ (isNewUser) ?
@@ -93,7 +93,7 @@ class LoginGate extends React.Component { }; return ( - +

Please Log In

{ constructor(props: any) { super(props); - this.state = {tab: 1}; + this.state = { tab: 1 }; this.eventClicked = this.eventClicked.bind(this); this.taskClicked = this.taskClicked.bind(this); this.contactClicked = this.contactClicked.bind(this); @@ -78,7 +78,7 @@ class PimMain extends React.PureComponent { public newEvent(start?: Date, end?: Date) { this.props.history!.push( routeResolver.getRoute('pim.events.new'), - {start, end} + { start, end } ); } @@ -116,7 +116,7 @@ class PimMain extends React.PureComponent { variant="fullWidth" style={{ backgroundColor: theme.palette.primary.main }} value={tab} - onChange={(event, value) => this.setState({tab: value})} + onChange={(event, value) => this.setState({ tab: value })} > { }); type CollectionRoutesPropsType = RouteComponentProps<{}> & { - syncInfo: SyncInfo, - routePrefix: string, - collections: EteSync.CollectionInfo[], - componentEdit: any, - componentView: any, - items: {[key: string]: PimType}, + syncInfo: SyncInfo; + routePrefix: string; + collections: EteSync.CollectionInfo[]; + componentEdit: any; + componentView: any; + items: {[key: string]: PimType}; onItemSave: (item: PimType, journalUid: string, originalContact?: PimType) => void; onItemDelete: (item: PimType, journalUid: string) => void; onItemCancel: () => void; @@ -135,8 +135,8 @@ const CollectionRoutes = withStyles(styles)(withRouter( ( - + render={({ match }) => ( + ( - + render={({ match }) => ( + {(match.params.itemUid in props.items) && ( + render={({ match }) => ( ( + render={({ match, history }) => ( -
+
@@ -199,11 +199,11 @@ const CollectionRoutes = withStyles(styles)(withRouter( variant="contained" disabled={!props.componentEdit} className={classes.button} - style={{marginLeft: 15}} + style={{ marginLeft: 15 }} onClick={() => history.push(routeResolver.getRoute( props.routePrefix + '._id.edit', - {itemUid: match.params.itemUid})) + { itemUid: match.params.itemUid })) } > @@ -254,20 +254,20 @@ class Pim extends React.PureComponent { store.dispatch(fetchEntries(this.props.etesync, journal.uid, prevUid)) .then((entriesAction: Action) => { - last = entriesAction.payload!.slice(-1).pop() as EteSync.Entry; + last = entriesAction.payload!.slice(-1).pop() as EteSync.Entry; - if (last) { - prevUid = last.uid; - } + if (last) { + prevUid = last.uid; + } - const saveEvent = store.dispatch( - addJournalEntry( - this.props.etesync, this.props.userInfo, journal, - prevUid, action, item.toIcal())); - (saveEvent as any).then(() => { - this.props.history.goBack(); + const saveEvent = store.dispatch( + addJournalEntry( + this.props.etesync, this.props.userInfo, journal, + prevUid, action, item.toIcal())); + (saveEvent as any).then(() => { + this.props.history.goBack(); + }); }); - }); } public onItemDelete(item: PimType, journalUid: string) { @@ -289,20 +289,20 @@ class Pim extends React.PureComponent { store.dispatch(fetchEntries(this.props.etesync, journal.uid, prevUid)) .then((entriesAction: Action) => { - last = entriesAction.payload!.slice(-1).pop() as EteSync.Entry; + last = entriesAction.payload!.slice(-1).pop() as EteSync.Entry; - if (last) { - prevUid = last.uid; - } + if (last) { + prevUid = last.uid; + } - const deleteItem = store.dispatch( - addJournalEntry( - this.props.etesync, this.props.userInfo, journal, - prevUid, action, item.toIcal())); - (deleteItem as any).then(() => { - this.props.history.push(routeResolver.getRoute('pim')); + const deleteItem = store.dispatch( + addJournalEntry( + this.props.etesync, this.props.userInfo, journal, + prevUid, action, item.toIcal())); + (deleteItem as any).then(() => { + this.props.history.push(routeResolver.getRoute('pim')); + }); }); - }); } public onCancel() { @@ -317,7 +317,7 @@ class Pim extends React.PureComponent { ( + render={({ history }) => ( {

Date & Time

- + Locale @@ -62,7 +62,7 @@ class Settings extends React.PureComponent { const value = event.target.value; const { settings } = this.props; - store.dispatch(setSettings({ ...settings, [name]: value})); + store.dispatch(setSettings({ ...settings, [name]: value })); } } diff --git a/src/SideMenu/index.tsx b/src/SideMenu/index.tsx index a9166a7..ed88e2d 100644 --- a/src/SideMenu/index.tsx +++ b/src/SideMenu/index.tsx @@ -68,16 +68,16 @@ class SideMenu extends React.PureComponent { this.props.history.push(routeResolver.getRoute('settings')); }} /> - } onClick={this.logout} /> + } onClick={this.logout} /> ); } return ( -
+
App logo -
+
{username}
diff --git a/src/SyncGate.tsx b/src/SyncGate.tsx index e8be9c2..f4a3fb0 100644 --- a/src/SyncGate.tsx +++ b/src/SyncGate.tsx @@ -123,7 +123,7 @@ class SyncGate extends React.PureComponent { if (!journalAction.error) { store.dispatch(fetchEntries(this.props.etesync, collection.uid)); } - }); + }); }); }); }; @@ -162,14 +162,14 @@ class SyncGate extends React.PureComponent { const errors: Array<{journal: string, error: Error}> = []; this.props.entries.forEach((entry, journal) => { if (entry.error) { - errors.push({journal, error: entry.error}); + errors.push({ journal, error: entry.error }); } }); if (errors.length > 0) { return (
    - {errors.map((error) => (
  • {error.journal}: {error.error.toString()}
  • ))} + {errors.map((error, idx) => (
  • {error.journal}: {error.error.toString()}
  • ))}
); } @@ -178,8 +178,8 @@ class SyncGate extends React.PureComponent { if ((this.props.userInfo.value === null) || (journals === null) || ((this.props.fetchCount > 0) && ((entryArrays.size === 0) || !entryArrays.every((x: any) => (x.value !== null)))) - ) { - return (); + ) { + return (); } // FIXME: Shouldn't be here @@ -193,13 +193,13 @@ class SyncGate extends React.PureComponent { ( + render={() => ( )} /> ( + render={({ history }) => ( <> { ( + render={({ history }) => ( @@ -238,7 +238,7 @@ class SyncGate extends React.PureComponent { } } -const mapStateToProps = (state: StoreState, props: PropsType) => { +const mapStateToProps = (state: StoreState, _props: PropsType) => { return { settings: state.settings, journals: state.cache.journals, diff --git a/src/api/EteSync.test.ts b/src/api/EteSync.test.ts index 62332d4..208ab8a 100644 --- a/src/api/EteSync.test.ts +++ b/src/api/EteSync.test.ts @@ -30,7 +30,7 @@ it('Simple sync', async () => { const uid1 = sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash('id1')); const cryptoManager = new EteSync.CryptoManager(keyBase64, USER); - const info1 = new EteSync.CollectionInfo({uid: uid1, content: 'test', displayName: 'Dislpay 1'}); + const info1 = new EteSync.CollectionInfo({ uid: uid1, content: 'test', displayName: 'Dislpay 1' }); const journal = new EteSync.Journal(); journal.setInfo(cryptoManager, info1); @@ -66,7 +66,7 @@ it('Journal Entry sync', async () => { const uid1 = sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash('id1')); const cryptoManager = new EteSync.CryptoManager(keyBase64, USER); - const info1 = new EteSync.CollectionInfo({uid: uid1, content: 'test', displayName: 'Dislpay 1'}); + const info1 = new EteSync.CollectionInfo({ uid: uid1, content: 'test', displayName: 'Dislpay 1' }); const journal = new EteSync.Journal(); journal.setInfo(cryptoManager, info1); @@ -77,7 +77,7 @@ it('Journal Entry sync', async () => { let entries = await entryManager.list(null); expect(entries.length).toBe(0); - const syncEntry = new EteSync.SyncEntry({action: 'ADD', content: 'bla'}); + const syncEntry = new EteSync.SyncEntry({ action: 'ADD', content: 'bla' }); let prevUid = null; const entry = new EteSync.Entry(); entry.setSyncEntry(cryptoManager, syncEntry, prevUid); diff --git a/src/api/EteSync.ts b/src/api/EteSync.ts index b14341f..fabf02f 100644 --- a/src/api/EteSync.ts +++ b/src/api/EteSync.ts @@ -48,7 +48,7 @@ function CastJson(json: any, to: any) { } function hmacToHex(hmac: byte[]): string { - return sjcl.codec.hex.fromBits(sjcl.codec.bytes.toBits(hmac)); + return sjcl.codec.hex.fromBits(sjcl.codec.bytes.toBits(hmac)); } export class Credentials { @@ -497,7 +497,7 @@ export class EntryManager extends BaseManager { super(credentials, apiBase, ['journals', journalId, 'entries', '']); } - public list(lastUid: string | null, limit: number = 0): Promise { + public list(lastUid: string | null, limit = 0): Promise { let apiBase = this.apiBase.clone(); apiBase = apiBase.search({ last: (lastUid !== null) ? lastUid : undefined, diff --git a/src/components/AddressBook.tsx b/src/components/AddressBook.tsx index e8811b1..dc24e26 100644 --- a/src/components/AddressBook.tsx +++ b/src/components/AddressBook.tsx @@ -48,7 +48,7 @@ const AddressBookItem = React.memo((_props: any) => { return ( + {name && name[0].toUpperCase()} } primaryText={name} @@ -64,7 +64,7 @@ const sortSelector = createSelector( const a = _a.fn; const b = _b.fn; - return a.localeCompare(b, undefined, {sensitivity: 'base'}); + return a.localeCompare(b, undefined, { sensitivity: 'base' }); }); } ); diff --git a/src/components/Calendar.tsx b/src/components/Calendar.tsx index 1929456..778f361 100644 --- a/src/components/Calendar.tsx +++ b/src/components/Calendar.tsx @@ -72,7 +72,7 @@ class Calendar extends React.PureComponent { }); return ( -
+
{ selectable onSelectEvent={this.props.onItemClick as any} onSelectSlot={this.slotClicked as any} - formats={{agendaHeaderFormat: agendaHeaderFormat as any}} + formats={{ agendaHeaderFormat: agendaHeaderFormat as any }} eventPropGetter={eventPropGetter} date={this.state.currentDate} onNavigate={this.onNavigate} @@ -93,11 +93,11 @@ class Calendar extends React.PureComponent { } private onNavigate(currentDate: Date) { - this.setState({currentDate}); + this.setState({ currentDate }); } private onView(view: string) { - this.setState({view}); + this.setState({ view }); } private slotClicked(slotInfo: {start: Date, end: Date}) { diff --git a/src/components/Contact.tsx b/src/components/Contact.tsx index 462b819..6d454e2 100644 --- a/src/components/Contact.tsx +++ b/src/components/Contact.tsx @@ -16,7 +16,7 @@ import { IconButton } from '@material-ui/core'; class Contact extends React.PureComponent { public props: { - item?: ContactType, + item?: ContactType; }; public render() { diff --git a/src/components/ContactEdit.tsx b/src/components/ContactEdit.tsx index 8ac8545..0d319fe 100644 --- a/src/components/ContactEdit.tsx +++ b/src/components/ContactEdit.tsx @@ -24,24 +24,24 @@ import * as EteSync from '../api/EteSync'; import { ContactType } from '../pim-types'; const telTypes = [ - {type: 'Home'}, - {type: 'Work'}, - {type: 'Cell'}, - {type: 'Other'}, + { type: 'Home' }, + { type: 'Work' }, + { type: 'Cell' }, + { type: 'Other' }, ]; const emailTypes = telTypes; const addressTypes = [ - {type: 'Home'}, - {type: 'Work'}, - {type: 'Other'}, + { type: 'Home' }, + { type: 'Work' }, + { type: 'Other' }, ]; const imppTypes = [ - {type: 'Jabber'}, - {type: 'Hangouts'}, - {type: 'Other'}, + { type: 'Jabber' }, + { type: 'Hangouts' }, + { type: 'Other' }, ]; const TypeSelector = (props: any) => { @@ -122,7 +122,7 @@ interface PropsType { class ContactEdit extends React.PureComponent { public state: { - uid: string, + uid: string; fn: string; phone: ValueType[]; email: ValueType[]; @@ -297,7 +297,7 @@ class ContactEdit extends React.PureComponent { setProperties('email', this.state.email); setProperties('adr', this.state.address); setProperties('impp', this.state.impp.map((x) => ( - {type: x.type, value: x.type + ':' + x.value} + { type: x.type, value: x.type + ':' + x.value } ))); function setProperty(name: string, value: string) { @@ -341,7 +341,7 @@ class ContactEdit extends React.PureComponent { {this.props.item ? 'Edit Contact' : 'New Contact'} - + Saving to @@ -382,7 +382,7 @@ class ContactEdit extends React.PureComponent { value={this.state.phone[idx]} onClearRequest={(name: string) => this.removeValueType(name, idx)} onChange={(name: string, type: string, value: string) => ( - this.handleValueTypeChange(name, idx, {type, value}) + this.handleValueTypeChange(name, idx, { type, value }) )} /> ))} @@ -405,7 +405,7 @@ class ContactEdit extends React.PureComponent { value={this.state.email[idx]} onClearRequest={(name: string) => this.removeValueType(name, idx)} onChange={(name: string, type: string, value: string) => ( - this.handleValueTypeChange(name, idx, {type, value}) + this.handleValueTypeChange(name, idx, { type, value }) )} /> ))} @@ -428,7 +428,7 @@ class ContactEdit extends React.PureComponent { value={this.state.impp[idx]} onClearRequest={(name: string) => this.removeValueType(name, idx)} onChange={(name: string, type: string, value: string) => ( - this.handleValueTypeChange(name, idx, {type, value}) + this.handleValueTypeChange(name, idx, { type, value }) )} /> ))} @@ -451,7 +451,7 @@ class ContactEdit extends React.PureComponent { value={this.state.address[idx]} onClearRequest={(name: string) => this.removeValueType(name, idx)} onChange={(name: string, type: string, value: string) => ( - this.handleValueTypeChange(name, idx, {type, value}) + this.handleValueTypeChange(name, idx, { type, value }) )} /> ))} @@ -486,17 +486,17 @@ class ContactEdit extends React.PureComponent { variant="contained" onClick={this.props.onCancel} > - + Cancel {this.props.item && } @@ -505,9 +505,9 @@ class ContactEdit extends React.PureComponent { type="submit" variant="contained" color="secondary" - style={{marginLeft: 15}} + style={{ marginLeft: 15 }} > - + Save
@@ -518,15 +518,15 @@ class ContactEdit extends React.PureComponent {
- this.props.onDelete(this.props.item!, this.props.initialCollection!)} - onCancel={() => this.setState({showDeleteDialog: false})} - > + this.props.onDelete(this.props.item!, this.props.initialCollection!)} + onCancel={() => this.setState({ showDeleteDialog: false })} + > Are you sure you would like to delete this contact? - + ); } diff --git a/src/components/EncryptionLoginForm.tsx b/src/components/EncryptionLoginForm.tsx index b90dd93..97be3ac 100644 --- a/src/components/EncryptionLoginForm.tsx +++ b/src/components/EncryptionLoginForm.tsx @@ -8,7 +8,7 @@ interface FormErrors { class EncryptionLoginForm extends React.PureComponent { public state: { - errors: FormErrors, + errors: FormErrors; encryptionPassword: string; }; @@ -48,10 +48,10 @@ class EncryptionLoginForm extends React.PureComponent { } if (Object.keys(errors).length) { - this.setState({errors}); + this.setState({ errors }); return; } else { - this.setState({errors: {}}); + this.setState({ errors: {} }); } this.props.onSubmit(encryptionPassword); diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx index 9c5cc6c..9ee09e8 100644 --- a/src/components/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary.tsx @@ -6,17 +6,21 @@ import { resetKey } from '../store/actions'; import { EncryptionPasswordError, IntegrityError } from '../api/EteSync'; import PrettyError from '../widgets/PrettyError'; -class ErrorBoundary extends React.Component { +interface PropsType { + children: React.ReactNode | React.ReactNode[]; +} + +class ErrorBoundary extends React.Component { public state: { error?: Error; }; - constructor(props: any) { + constructor(props: PropsType) { super(props); this.state = { }; } - public componentDidCatch(error: Error, info: any) { + public componentDidCatch(error: Error, _info: any) { if (error instanceof EncryptionPasswordError) { store.dispatch(resetKey()); } else if (error instanceof IntegrityError) { @@ -46,7 +50,7 @@ class ErrorBoundary extends React.Component { Please log out from the menu, refresh the page and try again, and if the problem persists, contact support.

-                {error.message}
+              {error.message}
             
); diff --git a/src/components/Event.tsx b/src/components/Event.tsx index 6942deb..32d6379 100644 --- a/src/components/Event.tsx +++ b/src/components/Event.tsx @@ -8,7 +8,7 @@ import { EventType } from '../pim-types'; class Event extends React.PureComponent { public props: { - item?: EventType, + item?: EventType; }; public render() { diff --git a/src/components/EventEdit.tsx b/src/components/EventEdit.tsx index 513fcf9..90706ed 100644 --- a/src/components/EventEdit.tsx +++ b/src/components/EventEdit.tsx @@ -42,7 +42,7 @@ interface PropsType { class EventEdit extends React.PureComponent { public state: { - uid: string, + uid: string; title: string; allDay: boolean; start?: Date; @@ -143,14 +143,14 @@ class EventEdit extends React.PureComponent { } public toggleAllDay() { - this.setState({allDay: !this.state.allDay}); + this.setState({ allDay: !this.state.allDay }); } public onSubmit(e: React.FormEvent) { e.preventDefault(); if ((!this.state.start) || (!this.state.end)) { - this.setState({error: 'Both start and end time must be set!'}); + this.setState({ error: 'Both start and end time must be set!' }); return; } @@ -173,7 +173,7 @@ class EventEdit extends React.PureComponent { } if (startDate.compare(endDate) >= 0) { - this.setState({error: 'End time must be later than start time!'}); + this.setState({ error: 'End time must be later than start time!' }); return; } @@ -242,7 +242,7 @@ class EventEdit extends React.PureComponent { onChange={this.handleInputChange} /> - + Saving to @@ -277,7 +277,7 @@ class EventEdit extends React.PureComponent { dateOnly={this.state.allDay} placeholder="Start" value={this.state.start} - onChange={(date?: Date) => this.setState({start: date})} + onChange={(date?: Date) => this.setState({ start: date })} />
@@ -286,7 +286,7 @@ class EventEdit extends React.PureComponent { dateOnly={this.state.allDay} placeholder="End" value={this.state.end} - onChange={(date?: Date) => this.setState({end: date})} + onChange={(date?: Date) => this.setState({ end: date })} />
@@ -312,17 +312,17 @@ class EventEdit extends React.PureComponent { variant="contained" onClick={this.props.onCancel} > - + Cancel {this.props.item && } @@ -331,9 +331,9 @@ class EventEdit extends React.PureComponent { type="submit" variant="contained" color="secondary" - style={{marginLeft: 15}} + style={{ marginLeft: 15 }} > - + Save
@@ -344,15 +344,15 @@ class EventEdit extends React.PureComponent {
- this.props.onDelete(this.props.item!, this.props.initialCollection!)} - onCancel={() => this.setState({showDeleteDialog: false})} - > + this.props.onDelete(this.props.item!, this.props.initialCollection!)} + onCancel={() => this.setState({ showDeleteDialog: false })} + > Are you sure you would like to delete this event? - + ); } diff --git a/src/components/JournalEntries.tsx b/src/components/JournalEntries.tsx index ebd28ce..6769861 100644 --- a/src/components/JournalEntries.tsx +++ b/src/components/JournalEntries.tsx @@ -27,9 +27,9 @@ class JournalEntries extends React.PureComponent { }; public props: { - journal: EteSync.Journal, - entries: Immutable.List, - uid?: string, + journal: EteSync.Journal; + entries: Immutable.List; + uid?: string; }; constructor(props: any) { @@ -47,11 +47,11 @@ class JournalEntries extends React.PureComponent { let icon; if (syncEntry.action === EteSync.SyncEntryAction.Add) { - icon = (); + icon = (); } else if (syncEntry.action === EteSync.SyncEntryAction.Change) { - icon = (); + icon = (); } else if (syncEntry.action === EteSync.SyncEntryAction.Delete) { - icon = (); + icon = (); } let name; @@ -91,7 +91,7 @@ class JournalEntries extends React.PureComponent { }); }} /> - ); + ); }).reverse(); return ( @@ -99,7 +99,7 @@ class JournalEntries extends React.PureComponent { { - this.setState({dialog: undefined}); + this.setState({ dialog: undefined }); }} > @@ -112,7 +112,7 @@ class JournalEntries extends React.PureComponent {
+
this.setState({due: date})} + onChange={(date?: Date) => this.setState({ due: date })} />
@@ -316,17 +316,17 @@ class TaskEdit extends React.PureComponent { variant="contained" onClick={this.props.onCancel} > - + Cancel {this.props.item && } @@ -335,9 +335,9 @@ class TaskEdit extends React.PureComponent { type="submit" variant="contained" color="secondary" - style={{marginLeft: 15}} + style={{ marginLeft: 15 }} > - + Save @@ -348,15 +348,15 @@ class TaskEdit extends React.PureComponent { - this.props.onDelete(this.props.item!, this.props.initialCollection!)} - onCancel={() => this.setState({showDeleteDialog: false})} - > + this.props.onDelete(this.props.item!, this.props.initialCollection!)} + onCancel={() => this.setState({ showDeleteDialog: false })} + > Are you sure you would like to delete this event? - + ); } diff --git a/src/components/TaskList.tsx b/src/components/TaskList.tsx index 80b4f3d..807dc85 100644 --- a/src/components/TaskList.tsx +++ b/src/components/TaskList.tsx @@ -41,8 +41,8 @@ const sortSelector = createSelector( class TaskList extends React.PureComponent { public props: { - entries: TaskType[], - onItemClick: (contact: TaskType) => void, + entries: TaskType[]; + onItemClick: (contact: TaskType) => void; }; public render() { diff --git a/src/pim-types.ts b/src/pim-types.ts index c06947e..4f65fab 100644 --- a/src/pim-types.ts +++ b/src/pim-types.ts @@ -91,7 +91,7 @@ export class TaskType extends EventType { } set status(status: TaskStatusType) { - this.component.updatePropertyWithValue('status', status); + this.component.updatePropertyWithValue('status', status); } get status(): TaskStatusType { diff --git a/src/routes.test.ts b/src/routes.test.ts index 09d8da3..c46f62b 100644 --- a/src/routes.test.ts +++ b/src/routes.test.ts @@ -26,9 +26,9 @@ it('translating routes', () => { expect(routeResolver.getRoute('post')).toBe('/post'); expect(routeResolver.getRoute('post._id', { postId: 3 })).toBe('/post/3'); expect(routeResolver.getRoute('post._id.comment', - { postId: 3, commentId: 5 })).toBe('/post/3/comment/5'); + { postId: 3, commentId: 5 })).toBe('/post/3/comment/5'); expect(routeResolver.getRoute('post._id.revision', - { postId: 3, revisionId: 5, someOtherVar: 'a' })).toBe('/post/3/history/5/a/test'); + { postId: 3, revisionId: 5, someOtherVar: 'a' })).toBe('/post/3/history/5/a/test'); // Failing basic resolves expect(() => { diff --git a/src/store/actions.ts b/src/store/actions.ts index c18faf6..c365840 100644 --- a/src/store/actions.ts +++ b/src/store/actions.ts @@ -189,6 +189,6 @@ export function fetchAll(etesync: CredentialsData, currentEntries: EntriesType) export const setSettings = createAction( 'SET_SETTINGS', (settings: SettingsType) => { - return {...settings}; + return { ...settings }; } ); diff --git a/src/store/construct.ts b/src/store/construct.ts index 3d2d919..42b0b1b 100644 --- a/src/store/construct.ts +++ b/src/store/construct.ts @@ -73,14 +73,14 @@ const entriesSerialize = (state: FetchType) => { const entriesDeserialize = (state: EteSync.EntryJson[]): FetchType => { if (state === null) { - return new EntriesFetchRecord({value: null}); + return new EntriesFetchRecord({ value: null }); } - return new EntriesFetchRecord({value: List(state.map((x: any) => { + return new EntriesFetchRecord({ value: List(state.map((x: any) => { const ret = new EteSync.Entry(); ret.deserialize(x); return ret; - }))}); + })) }); }; const userInfoSerialize = (state: FetchType) => { @@ -125,9 +125,9 @@ const cacheDeserialize = (state: any, key: string) => { }); return ImmutableMap(ret); } else if (key === 'journals') { - return new JournalsFetchRecord({value: journalsDeserialize(state)}); + return new JournalsFetchRecord({ value: journalsDeserialize(state) }); } else if (key === 'userInfo') { - return new UserInfoFetchRecord({value: userInfoDeserialize(state)}); + return new UserInfoFetchRecord({ value: userInfoDeserialize(state) }); } return state; @@ -147,7 +147,7 @@ const cachePersistConfig = { version: 1, storage: localforage, transforms: [createTransform(cacheSerialize, cacheDeserialize)], - migrate: createMigrate(cacheMigrations, { debug: false}), + migrate: createMigrate(cacheMigrations, { debug: false }), }; const reducers = combineReducers({ diff --git a/src/store/index.test.ts b/src/store/index.test.ts index 49ead34..0d60bc5 100644 --- a/src/store/index.test.ts +++ b/src/store/index.test.ts @@ -17,7 +17,7 @@ it('Entries reducer', () => { const action = { type: fetchEntries.toString(), - meta: {journal: jId, prevUid: null as string | null}, + meta: { journal: jId, prevUid: null as string | null }, payload: [entry], }; diff --git a/src/store/promise-middleware.ts b/src/store/promise-middleware.ts index 1a8b662..4f9bf7d 100644 --- a/src/store/promise-middleware.ts +++ b/src/store/promise-middleware.ts @@ -7,7 +7,7 @@ function isPromise(val: any) { export default function promiseMiddleware({ dispatch }: any) { return (next: any) => (action: any) => { if (isPromise(action.payload)) { - dispatch({...action, payload: undefined}); + dispatch({ ...action, payload: undefined }); return action.payload.then( (result: any) => dispatch({ ...action, payload: result }), diff --git a/src/store/reducers.ts b/src/store/reducers.ts index e29f2a8..33a6de6 100644 --- a/src/store/reducers.ts +++ b/src/store/reducers.ts @@ -53,7 +53,7 @@ export type UserInfoType = FetchType; export type UserInfoTypeImmutable = Record; function fetchTypeIdentityReducer( - state: Record> = fetchTypeRecord()(), action: any, extend: boolean = false) { + state: Record> = fetchTypeRecord()(), action: any, extend = false) { if (action.error) { return state.set('error', action.payload); } else { @@ -82,22 +82,22 @@ function fetchTypeIdentityReducer( export const encryptionKeyReducer = handleActions( { [actions.deriveKey.toString()]: (state: {key: string | null}, action: any) => ( - {key: action.payload} + { key: action.payload } ), [actions.resetKey.toString()]: (state: {key: string | null}, action: any) => ( - {key: null} + { key: null } ), [actions.logout.toString()]: (state: {key: string | null}, action: any) => { - return {out: true, key: null}; + return { out: true, key: null }; }, }, - {key: null} + { key: null } ); export const credentials = handleActions( { [actions.fetchCredentials.toString()]: ( - state: CredentialsTypeRemote, action: any, extend: boolean = false) => { + state: CredentialsTypeRemote, action: any, extend = false) => { if (action.error) { return { value: null, @@ -119,10 +119,10 @@ export const credentials = handleActions( } }, [actions.logout.toString()]: (state: CredentialsTypeRemote, action: any) => { - return {out: true, value: null}; + return { out: true, value: null }; }, }, - {value: null} + { value: null } ); const setMapModelReducer = , V extends BaseModel>(state: T, action: any) => { @@ -200,7 +200,7 @@ function fetchCreateEntriesReducer(state: EntriesTypeImmutable, action: any) { const prevState = state.get(action.meta.journal); const extend = action.meta.prevUid != null; return state.set(action.meta.journal, - fetchTypeIdentityReducer(prevState, action, extend)); + fetchTypeIdentityReducer(prevState, action, extend)); } export const entries = handleActions( @@ -229,7 +229,7 @@ export const userInfo = handleAction( actions.fetchUserInfo, actions.createUserInfo ), - (state: Record> = fetchTypeRecord()(), action: any, extend: boolean = false) => { + (state: Record> = fetchTypeRecord()(), action: any, extend = false) => { if (action.error) { return state.set('error', action.payload); } else { @@ -285,7 +285,7 @@ export interface SettingsType { export const settingsReducer = handleActions( { [actions.setSettings.toString()]: (state: {key: string | null}, action: any) => ( - {...action.payload} + { ...action.payload } ), }, { locale: 'en-gb' } diff --git a/src/widgets/ExternalLink.tsx b/src/widgets/ExternalLink.tsx index 18ec1bf..4520227 100644 --- a/src/widgets/ExternalLink.tsx +++ b/src/widgets/ExternalLink.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -export const ExternalLink = React.memo(({children, ...props}: any) => ( +export const ExternalLink = React.memo(({ children, ...props }: any) => ( {children} diff --git a/src/widgets/PrettyFingerprint.tsx b/src/widgets/PrettyFingerprint.tsx index b05b648..9e87986 100644 --- a/src/widgets/PrettyFingerprint.tsx +++ b/src/widgets/PrettyFingerprint.tsx @@ -8,7 +8,7 @@ function byteArray4ToNumber(bytes: byte[], offset: number) { return ( ((bytes[offset + 0] & 0xff) * (1 << 24)) + ((bytes[offset + 1] & 0xff) * (1 << 16)) + - ((bytes[offset + 2] & 0xff) * (1 << 8)) + + ((bytes[offset + 2] & 0xff) * (1 << 8)) + ((bytes[offset + 3] & 0xff)) ); } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 195a66e..0000000 --- a/tslint.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "extends": ["tslint:recommended", "tslint-react"], - "rules": { - "no-console": [true, "error"], - "interface-name": [true, "never-prefix"], - "ordered-imports": false, - "jsx-boolean-value": [true, "never"], - "jsx-curly-spacing": [true, "never"], - "jsx-no-bind": [true, "allowArrowFunctions"], - "jsx-no-lambda": [false], - "jsx-no-multiline-js": false, - "jsx-space-before-trailing-slash": true, - "jsx-key": true, - "max-classes-per-file": [false, 0], - "max-line-length": false, - "no-consecutive-blank-lines": false, - "no-conditional-assignment": false, - "object-literal-sort-keys": false, - "quotemark": [true, "single", "jsx-double", "avoid-escape", "avoid-template"], - "semicolon": [true, "always", "ignore-bound-class-methods"], - "variable-name": [true, "ban-keywords", "check-format", "allow-pascal-case", "allow-leading-underscore"], - "trailing-comma": [ - true, - { - "multiline": { - "objects": "always", - "arrays": "always", - "functions": "never", - "typeLiterals": "ignore" - }, - "esSpecCompliant": true - } - ], - "whitespace": [true,"check-branch", "check-decl", "check-operator", "check-module", "check-separator", "check-rest-spread", "check-type", "check-typecast", "check-type-operator", "check-preblock"] - }, - "linterOptions": { - "exclude": [ - "config/**/*.js", - "node_modules/**/*.ts" - ] - } -} diff --git a/yarn.lock b/yarn.lock index 2f8c25b..23eafed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2461,11 +2461,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -2601,7 +2596,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2824,7 +2819,7 @@ commander@^2.11.0, commander@^2.20.0, commander@~2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^2.12.1, commander@~2.19.0: +commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -3531,11 +3526,6 @@ diff-sequences@^24.9.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== -diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -6010,7 +6000,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.13.1, js-yaml@^3.7.0: +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -10182,48 +10172,11 @@ ts-pnp@1.1.4, ts-pnp@^1.1.2: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.4.tgz#ae27126960ebaefb874c6d7fa4729729ab200d90" integrity sha512-1J/vefLC+BWSo+qe8OnJQfWTYRS6ingxjwqmHMqaMxXMj7kFtKLgAaYW3JeX3mktjgUL+etlU8/B4VUAUI9QGw== -tslib@^1.8.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - tslib@^1.8.1, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tslint-react@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/tslint-react/-/tslint-react-3.6.0.tgz#7f462c95c4a0afaae82507f06517ff02942196a1" - integrity sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw== - dependencies: - tsutils "^2.13.1" - -tslint@^5.12.1: - version "5.12.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.1.tgz#8cec9d454cf8a1de9b0a26d7bdbad6de362e52c1" - integrity sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw== - dependencies: - babel-code-frame "^6.22.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^3.2.0" - glob "^7.1.1" - js-yaml "^3.7.0" - minimatch "^3.0.4" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.27.2" - -tsutils@^2.13.1, tsutils@^2.27.2: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"