From d951a53081601acec8b110faefd39c39eba3ed11 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Wed, 8 Apr 2020 04:46:22 -0500 Subject: [PATCH] Use eslint for ts files and run on staged files fix lint-staged update lint-staged update lint-staged Remove unused log file Add a root tsconfig for eslint wip Prep for linting clean up base config inheritance Update lint config --- .eslintignore | 20 +- .eslintrc | 23 -- .eslintrc.js | 249 ++++++++++++++++++++++ buildutils/src/ensure-package.ts | 72 ++++--- lint-staged.config.js | 11 +- package.json | 10 +- packages/celltags-extension/tsconfig.json | 3 +- packages/celltags/tsconfig.json | 3 +- tsconfig.eslint.json | 21 ++ tslint.json | 127 ----------- 10 files changed, 334 insertions(+), 205 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.js create mode 100644 tsconfig.eslint.json delete mode 100644 tslint.json diff --git a/.eslintignore b/.eslintignore index 9b4de212b811..572134dd536b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,29 +1,29 @@ +node_modules **/build **/lib **/node_modules +**/mock_packages **/static +**/typings +**/schemas +**/themes tests/**/coverage +*.map.js +*.bundle.js dev_mode/index.js -dev_mode/schemas !dev_mode/static/index.out.js -dev_mode/static -dev_mode/themes dev_mode/workspaces docs/_build docs/api -examples/app/build -examples/app/schemas -examples/app/themes +docs/build examples/chrome-example-test.js jupyterlab/chrome-test.js jupyterlab/geckodriver -jupyterlab/schemas packages/extensionmanager-extension/examples/listings -jupyterlab/staging/index.js -jupyterlab/staging/yarn.js -jupyterlab/themes packages/ui-components/src/icon/iconimports.ts +jupyterlab/staging/yarn.js +jupyterlab/staging/index.js # jetbrains IDE stuff .idea/ diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 210d8b9cef83..000000000000 --- a/.eslintrc +++ /dev/null @@ -1,23 +0,0 @@ -{ - "env": { - "browser": true, - "node": true, - "commonjs": true - }, - "extends": ["eslint:recommended", "prettier"], - "plugins": ["prettier"], - "parserOptions": { - "ecmaVersion": 2017, - "sourceType": "module", - "ecmaFeatures": { - "modules": true, - "jsx": true - } - }, - "rules": { - "prettier/prettier": ["error", { "singleQuote": true }], - "indent": ["error", 2], - "linebreak-style": ["error", "unix"], - "no-console": ["error", { "allow": ["warn", "error"] }] - } -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000000..8a1a87536b0b --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,249 @@ +module.exports = { + env: { + browser: true, + es6: true, + commonjs: true + }, + root: true, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier' + ], + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.eslint.json' + }, + plugins: ['@typescript-eslint'], + rules: { + indent: ['error', 2], + 'linebreak-style': ['error', 'unix'], + 'no-console': [ + 'error', + { + allow: ['error', 'warn', 'debug'] + } + ], + 'arrow-body-style': [0], + curly: 'error', + 'lines-around-comment': [0], + 'max-len': 'off', + 'no-confusing-arrow': [0], + 'no-mixed-operators': [0], + 'no-tabs': [0], + 'no-unexpected-multiline': [0], + 'prefer-arrow-callback': [0], + quotes: [0], + 'array-bracket-newline': ['off'], + 'array-bracket-spacing': ['off'], + 'array-element-newline': ['off'], + 'arrow-parens': ['off'], + 'arrow-spacing': ['off'], + 'block-spacing': ['off'], + 'brace-style': ['off'], + 'comma-dangle': 'off', + 'comma-spacing': ['off'], + 'comma-style': ['off'], + 'computed-property-spacing': ['off'], + 'dot-location': ['off'], + 'eol-last': 'error', + 'func-call-spacing': ['off'], + 'function-call-argument-newline': ['off'], + 'function-paren-newline': ['off'], + 'generator-star': ['off'], + 'generator-star-spacing': ['off'], + 'implicit-arrow-linebreak': ['off'], + 'jsx-quotes': ['off'], + 'key-spacing': ['off'], + 'keyword-spacing': ['off'], + 'multiline-ternary': ['off'], + 'newline-per-chained-call': ['off'], + 'new-parens': 'error', + 'no-arrow-condition': ['off'], + 'no-comma-dangle': ['off'], + 'no-extra-parens': ['off'], + 'no-extra-semi': ['off'], + 'no-floating-decimal': ['off'], + 'no-mixed-spaces-and-tabs': ['off'], + 'no-multi-spaces': ['off'], + 'no-multiple-empty-lines': 'off', + 'no-reserved-keys': ['off'], + 'no-space-before-semi': ['off'], + 'no-trailing-spaces': 'error', + 'no-whitespace-before-property': ['off'], + 'no-wrap-func': ['off'], + 'nonblock-statement-body-position': ['off'], + 'object-curly-newline': ['off'], + 'object-curly-spacing': ['off'], + 'object-property-newline': ['off'], + 'one-var-declaration-per-line': ['off'], + 'operator-linebreak': ['off'], + 'padded-blocks': ['off'], + 'quote-props': ['off'], + 'rest-spread-spacing': ['off'], + semi: ['off'], + 'semi-spacing': ['off'], + 'semi-style': ['off'], + 'space-after-function-name': ['off'], + 'space-after-keywords': ['off'], + 'space-before-blocks': ['off'], + 'space-before-function-paren': ['off'], + 'space-before-function-parentheses': ['off'], + 'space-before-keywords': ['off'], + 'space-in-brackets': ['off'], + 'space-in-parens': ['off'], + 'space-infix-ops': ['off'], + 'space-return-throw-case': ['off'], + 'space-unary-ops': ['off'], + 'space-unary-word-ops': ['off'], + 'switch-colon-spacing': ['off'], + 'template-curly-spacing': ['off'], + 'template-tag-spacing': ['off'], + 'unicode-bom': ['off'], + 'wrap-iife': ['off'], + 'wrap-regex': ['off'], + 'yield-star-spacing': ['off'], + 'indent-legacy': ['off'], + 'no-spaced-func': ['off'], + 'constructor-super': ['error'], + 'for-direction': ['error'], + 'getter-return': ['error'], + 'no-async-promise-executor': ['error'], + 'no-case-declarations': ['off'], + 'no-class-assign': ['error'], + 'no-compare-neg-zero': ['error'], + 'no-cond-assign': 'error', + 'no-const-assign': ['error'], + 'no-constant-condition': ['error'], + 'no-control-regex': ['off'], + 'no-debugger': 'error', + 'no-delete-var': ['error'], + 'no-dupe-args': ['error'], + 'no-dupe-class-members': ['error'], + 'no-dupe-keys': ['error'], + 'no-duplicate-case': ['error'], + 'no-empty': 'error', + 'no-empty-character-class': ['error'], + 'no-empty-pattern': ['error'], + 'no-ex-assign': ['error'], + 'no-extra-boolean-cast': ['error'], + 'no-fallthrough': 'error', + 'no-func-assign': ['error'], + 'no-global-assign': ['error'], + 'no-inner-declarations': ['off'], + 'no-invalid-regexp': ['error'], + 'no-irregular-whitespace': ['error'], + 'no-misleading-character-class': ['error'], + 'no-new-symbol': ['error'], + 'no-obj-calls': ['error'], + 'no-octal': ['error'], + 'no-prototype-builtins': ['off'], + 'no-redeclare': 'warn', + 'no-regex-spaces': ['error'], + 'no-self-assign': ['error'], + 'no-shadow-restricted-names': ['error'], + 'no-sparse-arrays': ['error'], + 'no-this-before-super': ['error'], + 'no-unreachable': ['error'], + 'no-unsafe-finally': ['error'], + 'no-unsafe-negation': ['error'], + 'no-unused-labels': 'error', + '@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }], + '@typescript-eslint/no-namespace': 'off', + 'no-useless-catch': ['error'], + 'no-useless-escape': ['off'], + 'no-with': ['error'], + 'require-yield': ['error'], + 'use-isnan': 'error', + 'valid-typeof': ['error'], + '@typescript-eslint/class-name-casing': 'error', + '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/explicit-member-accessibility': [ + 'off', + { + accessibility: 'explicit' + } + ], + '@typescript-eslint/indent': [ + 'error', + 2, + { + FunctionDeclaration: { + parameters: 'first' + }, + FunctionExpression: { + parameters: 'first' + } + } + ], + '@typescript-eslint/interface-name-prefix': [ + 'error', + { prefixWithI: 'always' } + ], + '@typescript-eslint/member-delimiter-style': [ + 'error', + { + multiline: { + delimiter: 'semi', + requireLast: true + }, + singleline: { + delimiter: 'semi', + requireLast: false + } + } + ], + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/member-ordering': 'off', + '@typescript-eslint/no-empty-function': 'error', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-floating-promises': ['error', { ignoreVoid: true }], + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/no-require-imports': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/prefer-namespace-keyword': 'error', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/quotes': [ + 'off', + 'single', + { + avoidEscape: true + } + ], + '@typescript-eslint/semi': ['error', 'always'], + '@typescript-eslint/triple-slash-reference': 'off', + '@typescript-eslint/type-annotation-spacing': 'off', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/camelcase': 'off', + 'default-case': 'error', + 'dot-notation': 'off', + 'no-undef': 'off', + 'prefer-const': 'warn', + eqeqeq: ['error', 'smart'], + 'guard-for-in': 'off', + 'id-blacklist': ['error', 'any', 'boolean', 'Undefined'], + 'id-match': 'error', + 'import/no-default-export': 'off', + 'no-bitwise': 'off', + 'no-caller': 'error', + 'no-eval': 'error', + 'no-invalid-this': 'off', + 'no-new-wrappers': 'error', + 'no-null/no-null': 'off', + 'no-shadow': [ + 'off', + { + hoist: 'all' + } + ], + 'no-underscore-dangle': 'off', + 'no-var': 'error', + 'one-var': ['error', 'never'], + radix: 'error', + 'spaced-comment': 'error', + '@typescript-eslint/no-non-null-assertion': 'off' + }, + settings: {} +}; diff --git a/buildutils/src/ensure-package.ts b/buildutils/src/ensure-package.ts index ae60ec6ada63..335911acc33d 100644 --- a/buildutils/src/ensure-package.ts +++ b/buildutils/src/ensure-package.ts @@ -1,4 +1,4 @@ -/*----------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ @@ -56,16 +56,16 @@ const ICON_CSS_CLASSES_TEMPLATE = ` export async function ensurePackage( options: IEnsurePackageOptions ): Promise { - let { data, pkgPath } = options; - let deps: { [key: string]: string } = data.dependencies || {}; - let devDeps: { [key: string]: string } = data.devDependencies || {}; - let seenDeps = options.depCache || {}; - let missing = options.missing || []; - let unused = options.unused || []; - let messages: string[] = []; - let locals = options.locals || {}; - let cssImports = options.cssImports || []; - let differentVersions = options.differentVersions || []; + const { data, pkgPath } = options; + const deps: { [key: string]: string } = data.dependencies || {}; + const devDeps: { [key: string]: string } = data.devDependencies || {}; + const seenDeps = options.depCache || {}; + const missing = options.missing || []; + const unused = options.unused || []; + const messages: string[] = []; + const locals = options.locals || {}; + const cssImports = options.cssImports || []; + const differentVersions = options.differentVersions || []; // Verify dependencies are consistent. let promises = Object.keys(deps).map(async name => { @@ -106,7 +106,9 @@ export async function ensurePackage( filenames = glob.sync(path.join(pkgPath, 'src/*.ts*')); filenames = filenames.concat(glob.sync(path.join(pkgPath, 'src/**/*.ts*'))); - if (!fs.existsSync(path.join(pkgPath, 'tsconfig.json'))) { + const tsConfigPath = path.join(pkgPath, 'tsconfig.json'); + + if (!fs.existsSync(tsConfigPath)) { if (utils.writePackageData(path.join(pkgPath, 'package.json'), data)) { messages.push('Updated package.json'); } @@ -115,7 +117,7 @@ export async function ensurePackage( // Make sure typedoc config files are consistent if (fs.existsSync(path.join(pkgPath, 'typedoc.json'))) { - let name = data.name.split('/'); + const name = data.name.split('/'); utils.writeJSONFile(path.join(pkgPath, 'typedoc.json'), { excludeNotExported: true, mode: 'file', @@ -128,11 +130,11 @@ export async function ensurePackage( // Extract all of the imports from the TypeScript files. filenames.forEach(fileName => { - let sourceFile = ts.createSourceFile( + const sourceFile = ts.createSourceFile( fileName, fs.readFileSync(fileName).toString(), (ts.ScriptTarget as any).ES6, - /*setParentNodes */ true + /* setParentNodes */ true ); imports = imports.concat(getImports(sourceFile)); }); @@ -148,7 +150,7 @@ export async function ensurePackage( let names: string[] = Array.from(new Set(imports)).sort(); names = names.map(function(name) { - let parts = name.split('/'); + const parts = name.split('/'); if (name.indexOf('@') === 0) { return parts[0] + '/' + parts[1]; } @@ -211,7 +213,7 @@ export async function ensurePackage( } } if (names.indexOf(name) === -1) { - let version = data.dependencies[name]; + const version = data.dependencies[name]; messages.push( `Unused dependency: ${name}@${version}: remove or add to list of known unused dependencies for this package` ); @@ -228,7 +230,7 @@ export async function ensurePackage( } // Handle references. - let references: { [key: string]: string } = Object.create(null); + const references: { [key: string]: string } = Object.create(null); Object.keys(deps).forEach(name => { if (!(name in locals)) { return; @@ -237,14 +239,13 @@ export async function ensurePackage( if (!fs.existsSync(path.join(target, 'tsconfig.json'))) { return; } - let ref = path.relative(pkgPath, locals[name]); + const ref = path.relative(pkgPath, locals[name]); references[name] = ref.split(path.sep).join('/'); }); if ( data.name.indexOf('example-') === -1 && Object.keys(references).length > 0 ) { - const tsConfigPath = path.join(pkgPath, 'tsconfig.json'); const tsConfigData = utils.readJSONFile(tsConfigPath); tsConfigData.references = []; Object.keys(references).forEach(name => { @@ -253,6 +254,19 @@ export async function ensurePackage( utils.writeJSONFile(tsConfigPath, tsConfigData); } + // Inherit from the base tsconfig. + if (fs.existsSync(tsConfigPath)) { + const tsConfigData = utils.readJSONFile(tsConfigPath); + let prefix = ''; + let dirName = pkgPath; + while (!fs.existsSync(path.join(dirName, 'tsconfigbase.json'))) { + dirName = path.dirname(dirName); + prefix += '../'; + } + tsConfigData.extends = path.join(prefix, 'tsconfigbase'); + utils.writeJSONFile(tsConfigPath, tsConfigData); + } + // Get a list of all the published files. // This will not catch .js or .d.ts files if they have not been built, // but we primarily use this to check for files that are published as-is, @@ -275,7 +289,7 @@ export async function ensurePackage( } else if (!schemaDir && schemas.length) { messages.push(`Schemas found, but no schema indicated in ${pkgPath}`); } - for (let schema of schemas) { + for (const schema of schemas) { if (!published.has(schema)) { messages.push(`Schema ${schema} not published in ${pkgPath}`); } @@ -283,7 +297,7 @@ export async function ensurePackage( // Ensure that the `style` directories match what is in the `package.json` const styles = glob.sync(path.join(pkgPath, 'style', '**/*.*')); - for (let style of styles) { + for (const style of styles) { if (!published.has(style)) { messages.push(`Style file ${style} not published in ${pkgPath}`); } @@ -356,7 +370,7 @@ export async function ensureUiComponents( ): Promise { const funcName = 'ensureUiComponents'; const pkgName = utils.stem(pkgPath); - let messages: string[] = []; + const messages: string[] = []; const svgPaths = glob.sync(path.join(pkgPath, 'style/icons', '**/*.svg')); @@ -364,8 +378,8 @@ export async function ensureUiComponents( const iconSrcDir = path.join(pkgPath, 'src/icon'); // build the per-icon import code - let _svgImportStatements: string[] = []; - let _labiconConstructions: string[] = []; + const _svgImportStatements: string[] = []; + const _labiconConstructions: string[] = []; svgPaths.forEach(svgPath => { const svgName = utils.stem(svgPath); const svgImportPath = path @@ -408,8 +422,8 @@ export async function ensureUiComponents( const iconCSSDir = path.join(pkgPath, 'style'); // build the per-icon import code - let _iconCSSUrls: string[] = []; - let _iconCSSDeclarations: string[] = []; + const _iconCSSUrls: string[] = []; + const _iconCSSDeclarations: string[] = []; svgPaths.forEach(svgPath => { const svgName = utils.stem(svgPath); const urlName = 'jp-icon-' + svgName; @@ -512,7 +526,7 @@ function ensureFile( contents: string, prettify: boolean = true ): string[] { - let messages: string[] = []; + const messages: string[] = []; if (!fs.existsSync(fpath)) { // bail @@ -551,7 +565,7 @@ function ensureFile( * @returns An array of package names. */ function getImports(sourceFile: ts.SourceFile): string[] { - let imports: string[] = []; + const imports: string[] = []; handleNode(sourceFile); function handleNode(node: any): void { diff --git a/lint-staged.config.js b/lint-staged.config.js index 875da8ac3f59..7f99d9ce4d97 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,6 +1,7 @@ const escape = require('shell-quote').quote; const fs = require('fs'); const isWin = process.platform === 'win32'; +const fs = require('fs'); const escapeFileNames = filenames => filenames @@ -16,15 +17,7 @@ module.exports = { `git add ${escapedFileNames}` ]; }, - '**/*{.ts,.tsx}': filenames => { - const escapedFileNames = escapeFileNames(filenames); - return [ - `prettier --write ${escapedFileNames}`, - `tslint --fix ${escapedFileNames}`, - `git add ${escapedFileNames}` - ]; - }, - '**/*{.js,.jsx}': filenames => { + '**/*{.ts,.tsx,.js,.jsx}': filenames => { const escapedFileNames = escapeFileNames(filenames); return [ `prettier --write ${escapedFileNames}`, diff --git a/package.json b/package.json index 4ed60419531a..ee1f41a2fbb9 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,8 @@ "create:theme": "node buildutils/lib/create-theme.js", "deduplicate": "jlpm yarn-deduplicate -s fewer --fail", "docs": "lerna run docs", - "eslint": "eslint --fix .", - "eslint:check": "eslint .", + "eslint": "eslint --ext .js,.jsx,.ts,.tsx --fix .", + "eslint:check": "eslint --ext .js,.jsx,.ts,.tsx .", "get:dependency": "node buildutils/lib/get-dependency.js", "postinstall": "node scripts/ensure-buildutils.js", "integrity": "node scripts/ensure-buildutils.js && node buildutils/lib/ensure-repo.js", @@ -60,8 +60,8 @@ "lighthouse:compare": "node testutils/lib/compare-lighthouse.js", "lighthouse:throttling:start": "comcast --latency=40 --target-bw=30000 --packet-loss=0.2%", "lighthouse:throttling:stop": "comcast --stop", - "lint": "jlpm && jlpm run prettier && jlpm run eslint && jlpm run tslint", - "lint:check": "jlpm run prettier:check && jlpm run eslint:check && jlpm run tslint:check", + "lint": "jlpm && jlpm run prettier && jlpm run eslint", + "lint:check": "jlpm run prettier:check && jlpm run eslint:check", "patch:release": "node buildutils/lib/patch-release.js", "prepublish:check": "node buildutils/lib/prepublish-check.js", "prettier": "prettier --write \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", @@ -78,7 +78,7 @@ "test:firefox": "lerna run test:firefox --scope \"@jupyterlab/*\" --concurrency 1 --stream", "test:ie": "lerna run test:ie --scope \"@jupyterlab/*\" --concurrency 1 --stream", "test:scope": "lerna run test --concurrency 1 --stream", - "test:summary": "lerna run test --scope \"@jupyterlab/*\" --parallel --no-bail | grep -Ei '.* test.*(failed|passed|total|completed|skipped)' | sort", + "test:summary": "lerna run test --scope \"@jupyterlab/test-*\" --parallel --no-bail | grep -Ei '.* test.*(failed|passed|total|completed|skipped)' | sort", "tslint": "tslint --fix -c tslint.json --project tsconfigbase.json '**/*{.ts,.tsx}'", "tslint:check": "tslint -c tslint.json --project tsconfigbase.json '**/*{.ts,.tsx}'", "update:dependency": "node buildutils/lib/update-dependency.js --lerna", diff --git a/packages/celltags-extension/tsconfig.json b/packages/celltags-extension/tsconfig.json index a68cc31546ae..eb95d15c2cca 100644 --- a/packages/celltags-extension/tsconfig.json +++ b/packages/celltags-extension/tsconfig.json @@ -31,5 +31,6 @@ { "path": "../notebook" } - ] + ], + "extends": "../../tsconfigbase" } diff --git a/packages/celltags/tsconfig.json b/packages/celltags/tsconfig.json index d2fd9e21416c..1c5d8122646e 100644 --- a/packages/celltags/tsconfig.json +++ b/packages/celltags/tsconfig.json @@ -34,5 +34,6 @@ { "path": "../ui-components" } - ] + ], + "extends": "../../tsconfigbase" } diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 000000000000..77b5f54f8f69 --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfigbase", + "include": [ + "packages/**/src/**/*", + "packages/**/test/**/*", + "testutils/src/*", + "buildutils/**/*", + "tests/**/*", + "dev_mode/*", + "docs/**/*", + "examples/**/*", + "*", + "packages/services/examples/**/*", + "packages/**/*.config.js", + "packages/metapackage/build-doc-index.js", + "packages/**/stories/*", + "scripts/*", + "jupyterlab/*", + "jupyterlab/staging/*" + ] +} diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 4434a32c5956..000000000000 --- a/tslint.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "rulesDirectory": ["tslint-plugin-prettier"], - "rules": { - "prettier": [true, { "singleQuote": true }], - "align": [true, "parameters", "statements"], - "await-promise": true, - "ban": [ - true, - ["_", "forEach"], - ["_", "each"], - ["$", "each"], - ["angular", "forEach"] - ], - "class-name": true, - "comment-format": [true, "check-space"], - "curly": true, - "eofline": true, - "forin": false, - "indent": [true, "spaces", 2], - "interface-name": [true, "always-prefix"], - "jsdoc-format": true, - "label-position": true, - "max-line-length": [false], - "member-access": false, - "member-ordering": [false], - "new-parens": true, - "no-angle-bracket-type-assertion": true, - "no-any": false, - "no-arg": true, - "no-bitwise": true, - "no-conditional-assignment": true, - "no-consecutive-blank-lines": false, - "no-console": [true, "debug", "info", "time", "timeEnd", "trace"], - "no-construct": true, - "no-debugger": true, - "no-default-export": false, - "no-duplicate-variable": true, - "no-empty": true, - "no-eval": true, - "no-floating-promises": true, - "no-inferrable-types": false, - "no-internal-module": true, - "no-invalid-this": [true, "check-function-in-method"], - "no-null-keyword": false, - "no-reference": true, - "no-require-imports": false, - "no-shadowed-variable": false, - "no-string-literal": false, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-use-before-declare": false, - "no-var-keyword": true, - "no-var-requires": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-finally", - "check-whitespace" - ], - "one-variable-per-declaration": [true, "ignore-for-loop"], - "quotemark": { - "options": [true, "single", "avoid-escape"], - "severity": "off" - }, - "radix": true, - "semicolon": [true, "always", "ignore-bound-class-methods"], - "switch-default": true, - "trailing-comma": [ - false, - { - "multiline": "never", - "singleline": "never" - } - ], - "triple-equals": [true, "allow-null-check", "allow-undefined-check"], - "typedef": [false], - "typedef-whitespace": [ - false, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - }, - { - "call-signature": "space", - "index-signature": "space", - "parameter": "space", - "property-declaration": "space", - "variable-declaration": "space" - } - ], - "use-isnan": true, - "use-strict": [false], - "variable-name": [ - true, - "check-format", - "allow-leading-underscore", - "ban-keywords", - "allow-pascal-case" - ], - "whitespace": [ - true, - "check-branch", - "check-operator", - "check-separator", - "check-type" - ] - }, - "linterOptions": { - "exclude": [ - "**/*.d.ts", - "jupyterlab/**/*.ts", - "packages/ui-components/src/icon/iconimports.ts", - "node_modules/**/*.ts", - "node_modules/**/*.tsx", - - ".idea/", - ".history/", - ".vscode/" - ] - } -}