parserOptions:
  sourceType: script
env:
  es2022: true
reportUnusedDisableDirectives: true
plugins:
  - internal-rules
  - node
  - import
  - simple-import-sort
settings:
  node:
    tryExtensions: ['.js', '.jsx', '.json', '.node', '.ts', '.d.ts']

rules:
  ##############################################################################
  # Internal rules located in 'resources/eslint-internal-rules'.
  # See './resources/eslint-internal-rules/README.md'
  ##############################################################################

  internal-rules/only-ascii: error
  internal-rules/no-dir-import: error
  internal-rules/require-to-string-tag: off

  ##############################################################################
  # `eslint-plugin-node` rule list based on `v11.1.x`
  ##############################################################################

  # Possible Errors
  # https://github.com/mysticatea/eslint-plugin-node#possible-errors

  node/handle-callback-err: [error, error]
  node/no-callback-literal: error
  node/no-exports-assign: error
  node/no-extraneous-import: error
  node/no-extraneous-require: error
  node/no-missing-import: error
  node/no-missing-require: error
  node/no-new-require: error
  node/no-path-concat: error
  node/no-process-exit: off
  node/no-unpublished-bin: error
  node/no-unpublished-import: error
  node/no-unpublished-require: error
  node/no-unsupported-features/es-builtins: error
  node/no-unsupported-features/es-syntax: [error, { ignores: [modules] }]
  node/no-unsupported-features/node-builtins: error
  node/process-exit-as-throw: error
  node/shebang: error

  # Best Practices
  # https://github.com/mysticatea/eslint-plugin-node#best-practices
  node/no-deprecated-api: error

  # Stylistic Issues
  # https://github.com/mysticatea/eslint-plugin-node#stylistic-issues

  node/callback-return: error
  node/exports-style: off # TODO consider
  node/file-extension-in-import: off # TODO consider
  node/global-require: error
  node/no-mixed-requires: error
  node/no-process-env: off
  node/no-restricted-import: off
  node/no-restricted-require: off
  node/no-sync: error
  node/prefer-global/buffer: error
  node/prefer-global/console: error
  node/prefer-global/process: error
  node/prefer-global/text-decoder: error
  node/prefer-global/text-encoder: error
  node/prefer-global/url-search-params: error
  node/prefer-global/url: error
  node/prefer-promises/dns: off
  node/prefer-promises/fs: off

  ##############################################################################
  # `eslint-plugin-import` rule list based on `v2.26.x`
  ##############################################################################

  # Static analysis
  # https://github.com/benmosher/eslint-plugin-import#static-analysis
  import/no-unresolved: error
  import/named: error
  import/default: error
  import/namespace: error
  import/no-restricted-paths:
    - error
    - basePath: './'
      zones:
        - { target: './src', from: 'src/__testUtils__' }
  import/no-absolute-path: error
  import/no-dynamic-require: error
  import/no-internal-modules: off
  import/no-webpack-loader-syntax: error
  import/no-self-import: error
  import/no-cycle: error
  import/no-useless-path-segments: error
  import/no-relative-parent-imports: off
  import/no-relative-packages: off

  # Helpful warnings
  # https://github.com/benmosher/eslint-plugin-import#helpful-warnings
  import/export: error
  import/no-named-as-default: error
  import/no-named-as-default-member: error
  import/no-deprecated: error
  import/no-extraneous-dependencies: [error, { devDependencies: false }]
  import/no-mutable-exports: error
  import/no-unused-modules: error

  # Module systems
  # https://github.com/benmosher/eslint-plugin-import#module-systems
  import/unambiguous: error
  import/no-commonjs: error
  import/no-amd: error
  import/no-nodejs-modules: error
  import/no-import-module-exports: off

  # Style guide
  # https://github.com/benmosher/eslint-plugin-import#style-guide
  import/first: error
  import/exports-last: off
  import/no-duplicates: error
  import/no-namespace: error
  import/extensions:
    - error
    - ignorePackages
    - ts: never # TODO: remove once TS supports extensions
  import/order: [error, { newlines-between: always-and-inside-groups }]
  import/newline-after-import: error
  import/prefer-default-export: off
  import/max-dependencies: off
  import/no-unassigned-import: error
  import/no-named-default: error
  import/no-default-export: error
  import/no-named-export: off
  import/no-anonymous-default-export: error
  import/group-exports: off
  import/dynamic-import-chunkname: off

  ##############################################################################
  # `eslint-plugin-simple-import-sort` rule list based on `v2.25.x`
  # https://github.com/lydell/eslint-plugin-simple-import-sort
  ##############################################################################
  simple-import-sort/imports:
    - error
    - groups:
        # Packages.
        # Things that start with a letter (or digit or underscore), or `@` followed by a letter.
        - ["^@?\\w"]

        # General utilities
        - ["^(\\./|(\\.\\./)+)__testUtils__/"]
        - ["^(\\./|(\\.\\./)+)jsutils/"]

        # Top-level directories
        - ["^(\\./|(\\.\\./)+)error/"]
        - ["^(\\./|(\\.\\./)+)language/"]
        - ["^(\\./|(\\.\\./)+)type/"]
        - ["^(\\./|(\\.\\./)+)validation/"]
        - ["^(\\./|(\\.\\./)+)execution/"]
        - ["^(\\./|(\\.\\./)+)utilities/"]

        # Relative imports.
        # Anything that starts with a dot.
        - ["^(\\.\\./){4,}"]
        - ["^(\\.\\./){3}"]
        - ["^(\\.\\./){2}"]
        - ["^(\\.\\./){1}"]
        - ["^\\./"]
  simple-import-sort/exports: off # TODO

  ##############################################################################
  # ESLint builtin rules list based on `v8.13.x`
  ##############################################################################

  # Possible Errors
  # https://eslint.org/docs/rules/#possible-errors

  for-direction: error
  getter-return: error
  no-async-promise-executor: error
  no-await-in-loop: error
  no-compare-neg-zero: error
  no-cond-assign: error
  no-console: warn
  no-constant-condition: error
  no-control-regex: error
  no-debugger: warn
  no-dupe-args: error
  no-dupe-else-if: error
  no-dupe-keys: error
  no-duplicate-case: error
  no-empty: error
  no-empty-character-class: error
  no-ex-assign: error
  no-extra-boolean-cast: error
  no-func-assign: error
  no-import-assign: error
  no-inner-declarations: [error, both]
  no-invalid-regexp: error
  no-irregular-whitespace: error
  no-loss-of-precision: error
  no-misleading-character-class: error
  no-obj-calls: error
  no-promise-executor-return: off # TODO
  no-prototype-builtins: error
  no-regex-spaces: error
  no-setter-return: error
  no-sparse-arrays: error
  no-template-curly-in-string: error
  no-unreachable: error
  no-unreachable-loop: error
  no-unsafe-finally: error
  no-unsafe-negation: error
  no-unsafe-optional-chaining: [error, { disallowArithmeticOperators: true }]
  no-unused-private-class-members: error
  no-useless-backreference: error
  require-atomic-updates: error
  use-isnan: error
  valid-typeof: error

  # Best Practices
  # https://eslint.org/docs/rules/#best-practices

  accessor-pairs: error
  array-callback-return: error
  block-scoped-var: error
  class-methods-use-this: off
  complexity: off
  consistent-return: off
  curly: error
  default-case: off
  default-case-last: error
  default-param-last: error
  dot-notation: error
  eqeqeq: [error, smart]
  grouped-accessor-pairs: error
  guard-for-in: error
  max-classes-per-file: off
  no-alert: error
  no-caller: error
  no-case-declarations: error
  no-constructor-return: error
  no-div-regex: error
  no-else-return: error
  no-empty-function: error
  no-empty-pattern: error
  no-eq-null: off
  no-eval: error
  no-extend-native: error
  no-extra-bind: error
  no-extra-label: error
  no-fallthrough: error
  no-global-assign: error
  no-implicit-coercion: error
  no-implicit-globals: off
  no-implied-eval: error
  no-invalid-this: error
  no-iterator: error
  no-labels: error
  no-lone-blocks: error
  no-loop-func: error
  no-magic-numbers: off
  no-multi-str: error
  no-new: error
  no-new-func: error
  no-new-wrappers: error
  no-nonoctal-decimal-escape: error
  no-octal: error
  no-octal-escape: error
  no-param-reassign: error
  no-proto: error
  no-redeclare: error
  no-restricted-properties: off
  no-return-assign: error
  no-return-await: error
  no-script-url: error
  no-self-assign: error
  no-self-compare: off # TODO
  no-sequences: error
  no-throw-literal: error
  no-unmodified-loop-condition: error
  no-unused-expressions: error
  no-unused-labels: error
  no-useless-call: error
  no-useless-catch: error
  no-useless-concat: error
  no-useless-escape: error
  no-useless-return: error
  no-void: error
  no-warning-comments: off
  no-with: error
  prefer-named-capture-group: off # ES2018
  prefer-promise-reject-errors: error
  prefer-regex-literals: error
  radix: error
  require-await: error
  require-unicode-regexp: off
  vars-on-top: error
  yoda: [error, never, { exceptRange: true }]

  # Strict Mode
  # https://eslint.org/docs/rules/#strict-mode

  strict: error

  # Variables
  # https://eslint.org/docs/rules/#variables

  init-declarations: off
  no-delete-var: error
  no-label-var: error
  no-restricted-globals: off
  no-shadow: error
  no-shadow-restricted-names: error
  no-undef: error
  no-undef-init: error
  no-undefined: off
  no-unused-vars: [error, { vars: all, args: all, argsIgnorePattern: '^_' }]
  no-use-before-define: off

  # Stylistic Issues
  # https://eslint.org/docs/rules/#stylistic-issues

  camelcase: error
  capitalized-comments: off # maybe
  consistent-this: off
  func-name-matching: off
  func-names: [error, as-needed] # improve debug experience
  func-style: off
  id-denylist: off
  id-length: off
  id-match: [error, '^(?:_?[a-zA-Z0-9]*)|[_A-Z0-9]+$']
  line-comment-position: off
  lines-around-comment: off
  lines-between-class-members: [error, always, { exceptAfterSingleLine: true }]
  max-depth: off
  max-lines: off
  max-lines-per-function: off
  max-nested-callbacks: off
  max-params: off
  max-statements: off
  max-statements-per-line: off
  multiline-comment-style: off
  new-cap: error
  no-array-constructor: error
  no-bitwise: off
  no-continue: off
  no-inline-comments: off
  no-lonely-if: error
  no-multi-assign: off
  no-negated-condition: off
  no-nested-ternary: off
  no-new-object: error
  no-plusplus: off
  no-restricted-syntax: off
  no-tabs: error
  no-ternary: off
  no-underscore-dangle: off # TODO
  no-unneeded-ternary: error
  one-var: [error, never]
  operator-assignment: error
  padding-line-between-statements: off
  prefer-exponentiation-operator: error
  prefer-object-spread: error
  quotes: [error, single, { avoidEscape: true }]
  sort-keys: off
  sort-vars: off
  spaced-comment: error

  # ECMAScript 6
  # https://eslint.org/docs/rules/#ecmascript-6

  arrow-body-style: error
  constructor-super: error
  no-class-assign: error
  no-const-assign: error
  no-dupe-class-members: error
  no-duplicate-imports: off # Superseded by `import/no-duplicates`
  no-new-symbol: error
  no-restricted-exports: off
  no-restricted-imports: off
  no-this-before-super: error
  no-useless-computed-key: error
  no-useless-constructor: error
  no-useless-rename: error
  no-var: error
  object-shorthand: error
  prefer-arrow-callback: error
  prefer-const: error
  prefer-destructuring: off
  prefer-numeric-literals: error
  prefer-object-has-own: off # TODO requires Node.js v16.9.0
  prefer-rest-params: off # TODO
  prefer-spread: error
  prefer-template: off
  require-yield: error
  sort-imports: off
  symbol-description: off

  # Bellow rules are disabled because coflicts with Prettier, see:
  # https://github.com/prettier/eslint-config-prettier/blob/master/index.js
  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: off
  func-call-spacing: off
  function-call-argument-newline: off
  function-paren-newline: off
  generator-star-spacing: off
  implicit-arrow-linebreak: off
  indent: off
  jsx-quotes: off
  key-spacing: off
  keyword-spacing: off
  linebreak-style: off
  max-len: off
  multiline-ternary: off
  newline-per-chained-call: off
  new-parens: off
  no-confusing-arrow: off
  no-extra-parens: off
  no-extra-semi: off
  no-floating-decimal: off
  no-mixed-operators: off
  no-mixed-spaces-and-tabs: off
  no-multi-spaces: off
  no-multiple-empty-lines: off
  no-trailing-spaces: off
  no-unexpected-multiline: off
  no-whitespace-before-property: 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-before-blocks: off
  space-before-function-paren: off
  space-in-parens: off
  space-infix-ops: off
  space-unary-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

overrides:
  - files:
      - '**/*.ts'
      - '**/*.tsx'
    parser: '@typescript-eslint/parser'
    parserOptions:
      sourceType: module
      project: ['./tsconfig.json', './website/tsconfig.json']
    plugins:
      - '@typescript-eslint'
      - 'eslint-plugin-tsdoc'
    extends:
      - plugin:import/typescript
    rules:
      ##########################################################################
      # `eslint-plugin-tsdoc` rule list based on `v0.2.x`
      # https://github.com/microsoft/tsdoc/tree/master/eslint-plugin
      ##########################################################################

      tsdoc/syntax: error

      ##########################################################################
      # `@typescript-eslint/eslint-plugin` rule list based on `v5.19.x`
      ##########################################################################

      # Supported Rules
      # https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#supported-rules
      '@typescript-eslint/adjacent-overload-signatures': error
      '@typescript-eslint/array-type': [error, { default: generic }]
      '@typescript-eslint/await-thenable': error
      '@typescript-eslint/ban-ts-comment': [error, { 'ts-expect-error': false }]
      '@typescript-eslint/ban-tslint-comment': error
      '@typescript-eslint/ban-types': off # TODO temporarily disabled
      '@typescript-eslint/class-literal-property-style': off # TODO enable after TS conversion
      '@typescript-eslint/consistent-indexed-object-style':
        [error, index-signature]
      '@typescript-eslint/consistent-type-assertions': off # TODO temporarily disable
      '@typescript-eslint/consistent-type-definitions': error
      '@typescript-eslint/consistent-type-exports': error
      '@typescript-eslint/consistent-type-imports': error
      '@typescript-eslint/explicit-function-return-type': off # TODO consider
      '@typescript-eslint/explicit-member-accessibility': off # TODO consider
      '@typescript-eslint/explicit-module-boundary-types': off # TODO consider
      '@typescript-eslint/member-ordering': error
      '@typescript-eslint/method-signature-style': error
      '@typescript-eslint/naming-convention': off # TODO consider
      '@typescript-eslint/no-base-to-string': error
      '@typescript-eslint/no-confusing-non-null-assertion': error
      '@typescript-eslint/no-confusing-void-expression': off # TODO enable with ignoreArrowShorthand
      '@typescript-eslint/no-dynamic-delete': off
      '@typescript-eslint/no-empty-interface': error
      '@typescript-eslint/no-explicit-any': off # TODO error
      '@typescript-eslint/no-extra-non-null-assertion': error
      '@typescript-eslint/no-extraneous-class': off # TODO consider
      '@typescript-eslint/no-floating-promises': error
      '@typescript-eslint/no-for-in-array': error
      '@typescript-eslint/no-implicit-any-catch': off # TODO: Enable after TS conversion
      '@typescript-eslint/no-implied-eval': error
      '@typescript-eslint/no-inferrable-types':
        [error, { ignoreParameters: true, ignoreProperties: true }]
      '@typescript-eslint/no-misused-new': error
      '@typescript-eslint/no-misused-promises': error
      '@typescript-eslint/no-namespace': error
      '@typescript-eslint/no-non-null-asserted-nullish-coalescing': error
      '@typescript-eslint/no-non-null-asserted-optional-chain': error
      '@typescript-eslint/no-non-null-assertion': error
      '@typescript-eslint/no-parameter-properties': error
      '@typescript-eslint/no-redundant-type-constituents': error
      '@typescript-eslint/no-invalid-void-type': error
      '@typescript-eslint/no-require-imports': error
      '@typescript-eslint/no-this-alias': error
      '@typescript-eslint/no-type-alias': off # TODO consider
      '@typescript-eslint/no-unnecessary-boolean-literal-compare': error
      '@typescript-eslint/no-unnecessary-condition': off # TODO temporary disable
      '@typescript-eslint/no-unnecessary-qualifier': error
      '@typescript-eslint/no-unnecessary-type-arguments': error
      '@typescript-eslint/no-unnecessary-type-assertion': error
      '@typescript-eslint/no-unnecessary-type-constraint': error
      '@typescript-eslint/no-unsafe-argument': off # TODO consider
      '@typescript-eslint/no-unsafe-assignment': off # TODO consider
      '@typescript-eslint/no-unsafe-call': off # TODO consider
      '@typescript-eslint/no-unsafe-member-access': off # TODO consider
      '@typescript-eslint/no-unsafe-return': off # TODO consider
      '@typescript-eslint/no-useless-empty-export': error
      '@typescript-eslint/no-var-requires': error
      '@typescript-eslint/non-nullable-type-assertion-style': off #TODO temporarily disabled
      '@typescript-eslint/prefer-as-const': error
      '@typescript-eslint/prefer-enum-initializers': error
      '@typescript-eslint/prefer-for-of': error
      '@typescript-eslint/prefer-function-type': error
      '@typescript-eslint/prefer-includes': error
      '@typescript-eslint/prefer-literal-enum-member': error
      '@typescript-eslint/prefer-namespace-keyword': error
      '@typescript-eslint/prefer-nullish-coalescing': error
      '@typescript-eslint/prefer-optional-chain': error
      '@typescript-eslint/prefer-readonly': off
      '@typescript-eslint/prefer-readonly-parameter-types': off # TODO consider
      '@typescript-eslint/prefer-reduce-type-parameter': error
      '@typescript-eslint/prefer-regexp-exec': off
      '@typescript-eslint/prefer-return-this-type': error
      '@typescript-eslint/prefer-string-starts-ends-with': error
      '@typescript-eslint/prefer-ts-expect-error': error
      '@typescript-eslint/promise-function-async': off
      '@typescript-eslint/require-array-sort-compare': error
      '@typescript-eslint/restrict-plus-operands': off #TODO temporarily disabled
      '@typescript-eslint/restrict-template-expressions': off #TODO temporarily disabled
      '@typescript-eslint/sort-type-union-intersection-members': off # TODO consider
      '@typescript-eslint/strict-boolean-expressions': off # TODO consider
      '@typescript-eslint/switch-exhaustiveness-check': error
      '@typescript-eslint/triple-slash-reference': error
      '@typescript-eslint/typedef': off
      '@typescript-eslint/unbound-method': off # TODO consider
      '@typescript-eslint/unified-signatures': error

      # Extension Rules
      # https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#extension-rules

      # Disable conflicting ESLint rules and enable TS-compatible ones
      default-param-last: off
      dot-notation: off
      lines-between-class-members: off
      no-array-constructor: off
      no-dupe-class-members: off
      no-empty-function: off
      no-invalid-this: off
      no-loop-func: off
      no-loss-of-precision: off
      no-redeclare: off
      no-throw-literal: off
      no-shadow: off
      no-unused-expressions: off
      no-unused-vars: off
      no-useless-constructor: off
      require-await: off
      no-return-await: off
      '@typescript-eslint/default-param-last': error
      '@typescript-eslint/dot-notation': error
      '@typescript-eslint/lines-between-class-members':
        [error, always, { exceptAfterSingleLine: true }]
      '@typescript-eslint/no-array-constructor': error
      '@typescript-eslint/no-dupe-class-members': error
      '@typescript-eslint/no-empty-function': error
      '@typescript-eslint/no-invalid-this': error
      '@typescript-eslint/no-loop-func': error
      '@typescript-eslint/no-loss-of-precision': error
      '@typescript-eslint/no-redeclare': error
      '@typescript-eslint/no-throw-literal': error # TODO [error, { allowThrowingAny: false, allowThrowingUnknown: false }]
      '@typescript-eslint/no-shadow': error
      '@typescript-eslint/no-unused-expressions': error
      '@typescript-eslint/no-unused-vars':
        [
          error,
          {
            vars: all,
            args: all,
            argsIgnorePattern: '^_',
            varsIgnorePattern: '^_T',
          },
        ]
      '@typescript-eslint/no-useless-constructor': error
      '@typescript-eslint/require-await': error
      '@typescript-eslint/return-await': error

      # Disable for JS and TS
      '@typescript-eslint/init-declarations': off
      '@typescript-eslint/no-magic-numbers': off
      '@typescript-eslint/no-restricted-imports': off
      '@typescript-eslint/no-use-before-define': off
      '@typescript-eslint/no-duplicate-imports': off # Superseded by `import/no-duplicates`

      # Below rules are disabled because they conflict with Prettier, see:
      # https://github.com/prettier/eslint-config-prettier/blob/main/index.js
      '@typescript-eslint/object-curly-spacing': off
      '@typescript-eslint/quotes': off
      '@typescript-eslint/brace-style': off
      '@typescript-eslint/comma-dangle': off
      '@typescript-eslint/comma-spacing': off
      '@typescript-eslint/func-call-spacing': off
      '@typescript-eslint/indent': off
      '@typescript-eslint/keyword-spacing': off
      '@typescript-eslint/member-delimiter-style': off
      '@typescript-eslint/no-extra-parens': off
      '@typescript-eslint/no-extra-semi': off
      '@typescript-eslint/semi': off
      '@typescript-eslint/space-before-blocks': off
      '@typescript-eslint/space-before-function-paren': off
      '@typescript-eslint/space-infix-ops': off
      '@typescript-eslint/type-annotation-spacing': off
  - files: 'src/**'
    rules:
      internal-rules/require-to-string-tag: error
  - files: 'src/**/__*__/**'
    rules:
      internal-rules/require-to-string-tag: off
      node/no-unpublished-import: [error, { allowModules: ['chai', 'mocha'] }]
      import/no-deprecated: off
      import/no-restricted-paths: off
      import/no-extraneous-dependencies: [error, { devDependencies: true }]
  - files: 'integrationTests/*'
    env:
      node: true
    rules:
      node/no-sync: off
      node/no-unpublished-require: [error, { allowModules: ['mocha'] }]
      import/no-extraneous-dependencies: [error, { devDependencies: true }]
      import/no-nodejs-modules: off
  - files: 'integrationTests/*/**'
    env:
      node: true
    rules:
      node/no-sync: off
      node/no-missing-require: [error, { allowModules: ['graphql'] }]
      import/no-commonjs: off
      import/no-nodejs-modules: off
      no-console: off
  - files: 'benchmark/**'
    env:
      node: true
    rules:
      internal-rules/only-ascii: [error, { allowEmoji: true }]
      node/no-sync: off
      node/no-missing-require: off
      import/no-nodejs-modules: off
      import/no-commonjs: off
      no-console: off
      no-await-in-loop: off
  - files: 'resources/**'
    env:
      node: true
    rules:
      internal-rules/only-ascii: [error, { allowEmoji: true }]
      node/no-unpublished-require: off
      node/no-sync: off
      import/no-extraneous-dependencies: [error, { devDependencies: true }]
      import/no-nodejs-modules: off
      import/no-commonjs: off
      no-console: off
  - files: '**/*.jsx'
    parserOptions:
      sourceType: module
      ecmaFeatures:
        jsx: true
    rules:
      node/no-unpublished-import: off
      import/no-default-export: off
  - files: 'website/**'
    env:
      node: true
    plugins:
      - 'react'
    extends:
      - 'plugin:react/recommended'
      - 'plugin:react-hooks/recommended'
    settings:
      react:
        version: detect
    rules:
      node/no-unpublished-require: off
      node/no-missing-import: off
      import/no-default-export: off
      import/no-commonjs: off
      import/no-nodejs-modules: off
      import/no-extraneous-dependencies: off