portainer/portainer

View on GitHub
.eslintrc.yml

Summary

Maintainability
Test Coverage
env:
  browser: true
  jquery: true
  node: true
  es6: true

globals:
  angular: true

extends:
  - 'eslint:recommended'
  - 'plugin:storybook/recommended'
  - 'plugin:import/typescript'
  - prettier

plugins:
  - import

parserOptions:
  ecmaVersion: 2018
  sourceType: module
  project: './tsconfig.json'
  ecmaFeatures:
    modules: true

rules:
  no-console: error
  no-alert: error
  no-control-regex: 'off'
  no-empty: warn
  no-empty-function: warn
  no-useless-escape: 'off'
  import/named: error
  import/order:
    [
      'error',
      {
        pathGroups:
          [
            { pattern: '@@/**', group: 'internal', position: 'after' },
            { pattern: '@/**', group: 'internal' },
            { pattern: '{Kubernetes,Portainer,Agent,Azure,Docker}/**', group: 'internal' },
          ],
        groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
        pathGroupsExcludedImportTypes: ['internal'],
      },
    ]
  no-restricted-imports:
    - error
    - patterns:
        - group:
            - '@/react/test-utils/*'
          message: 'These utils are just for test files'

settings:
  'import/resolver':
    alias:
      map:
        - ['@@', './app/react/components']
        - ['@', './app']
      extensions: ['.js', '.ts', '.tsx']
    typescript: true
    node: true

overrides:
  - files:
      - app/**/*.ts{,x}
    parserOptions:
      project: './tsconfig.json'
    parser: '@typescript-eslint/parser'
    plugins:
      - '@typescript-eslint'
      - 'regex'
    extends:
      - airbnb
      - airbnb-typescript
      - 'plugin:eslint-comments/recommended'
      - 'plugin:react-hooks/recommended'
      - 'plugin:react/jsx-runtime'
      - 'plugin:@typescript-eslint/recommended'
      - 'plugin:@typescript-eslint/eslint-recommended'
      - 'plugin:promise/recommended'
      - 'plugin:storybook/recommended'
      - prettier # should be last
    settings:
      react:
        version: 'detect'

    rules:
      import/order:
        [
          'error',
          {
            pathGroups: [{ pattern: '@@/**', group: 'internal', position: 'after' }, { pattern: '@/**', group: 'internal' }],
            groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
            'newlines-between': 'always',
          },
        ]
      no-plusplus: off
      func-style: [error, 'declaration']
      import/prefer-default-export: off
      no-use-before-define: 'off'
      '@typescript-eslint/no-use-before-define': ['error', { functions: false, 'allowNamedExports': true }]
      no-shadow: 'off'
      '@typescript-eslint/no-shadow': off
      jsx-a11y/no-autofocus: warn
      react/forbid-prop-types: off
      react/require-default-props: off
      react/no-array-index-key: off
      no-underscore-dangle: off
      react/jsx-filename-extension: [0]
      import/no-extraneous-dependencies: ['error', { devDependencies: true }]
      '@typescript-eslint/explicit-module-boundary-types': off
      '@typescript-eslint/no-unused-vars': 'error'
      '@typescript-eslint/no-explicit-any': 'error'
      'jsx-a11y/label-has-associated-control': ['error', { 'assert': 'either', controlComponents: ['Input', 'Checkbox'] }]
      'react/function-component-definition': ['error', { 'namedComponents': 'function-declaration' }]
      'react/jsx-no-bind': off
      'no-await-in-loop': 'off'
      'react/jsx-no-useless-fragment': ['error', { allowExpressions: true }]
      'regex/invalid': ['error', [{ 'regex': '<Icon icon="(.*)"', 'message': 'Please directly import the `lucide-react` icon instead of using the string' }]]
      '@typescript-eslint/no-restricted-imports':
        - error
        - patterns:
            - group:
                - '@/react/test-utils/*'
              message: 'These utils are just for test files'
    overrides: # allow props spreading for hoc files
      - files:
          - app/**/with*.ts{,x}
        rules:
          'react/jsx-props-no-spreading': off
  - files:
      - app/**/*.test.*
    extends:
      - 'plugin:vitest/recommended'
    env:
      'vitest/env': true
    rules:
      'react/jsx-no-constructed-context-values': off
      '@typescript-eslint/no-restricted-imports': off
      no-restricted-imports: off
      'react/jsx-props-no-spreading': off
  - files:
      - app/**/*.stories.*
    rules:
      'no-alert': off
      '@typescript-eslint/no-restricted-imports': off
      no-restricted-imports: off
      'react/jsx-props-no-spreading': off