Procházet zdrojové kódy

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
Steven Silvester před 5 roky
rodič
revize
d951a53081

+ 10 - 10
.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/

+ 0 - 23
.eslintrc

@@ -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"] }]
-  }
-}

+ 249 - 0
.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: {}
+};

+ 43 - 29
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<string[]> {
-  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<string[]> {
   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 {

+ 2 - 9
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}`,

+ 5 - 5
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",

+ 2 - 1
packages/celltags-extension/tsconfig.json

@@ -31,5 +31,6 @@
     {
       "path": "../notebook"
     }
-  ]
+  ],
+  "extends": "../../tsconfigbase"
 }

+ 2 - 1
packages/celltags/tsconfig.json

@@ -34,5 +34,6 @@
     {
       "path": "../ui-components"
     }
-  ]
+  ],
+  "extends": "../../tsconfigbase"
 }

+ 21 - 0
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/*"
+  ]
+}

+ 0 - 127
tslint.json

@@ -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/"
-    ]
-  }
-}