UNPKG

eslint-config-amex

Version:
294 lines (247 loc) 13.3 kB
/* * Copyright (c) 2026 American Express Travel Related Services Company, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ /** * This file contains all rules for the `eslint-plugin-import` plugin. * * * The rules in this file were migrated from https://github.com/airbnb/javascript/blob/eslint-config-airbnb-v19.0.4/packages/eslint-config-airbnb-base/rules/imports.js. * * Additionally, some rule updates were migrated from https://github.com/americanexpress/eslint-config-amex/blob/16.x/index.js. * * For a complete list of rules, see https://github.com/import-js/eslint-plugin-import/tree/v2.32.0/docs/rules. */ export default { // ensure imports point to files/modules that can be resolved // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-unresolved.md "import/no-unresolved": ["error", { commonjs: true, caseSensitive: true, // this rule is not aware of subpath exports: https://github.com/import-js/eslint-plugin-import/issues/1810 // however we need to use subpath exports from these packages in eslint.config.js file // TODO: remove these exceptions once the rule supports subpath exports ignore: ["eslint", "eslint-config-amex", "@americanexpress"] }], // ensure named imports coupled with named exports // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/named.md "import/named": "error", // ensure default import coupled with default export // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/default.md "import/default": "off", // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/namespace.md "import/namespace": "off", // Helpful warnings: // disallow invalid exports, e.g. multiple defaults // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/export.md "import/export": "error", // do not allow a default import name to match a named export // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-named-as-default.md "import/no-named-as-default": "error", // warn on accessing default export property names that are also named exports // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-named-as-default-member.md "import/no-named-as-default-member": "error", // disallow use of jsdoc-marked-deprecated imports // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-deprecated.md "import/no-deprecated": "off", // Forbid the use of extraneous packages // paths are treated both as absolute paths, and relative to process.cwd() // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-extraneous-dependencies.md // migrated from https://github.com/americanexpress/eslint-config-amex/blob/16.x/index.js#L190 "import/no-extraneous-dependencies": [ "error", { devDependencies: [ // base list from airbnb config + typescript extensions "test/**", // tape, common npm pattern "tests/**", // also common npm pattern "spec/**", // mocha, rspec-like pattern "**/__tests__/**", // jest pattern "**/__mocks__/**", // jest pattern "test.{js,jsx,ts,tsx}", // repos with a single test file "test-*.{js,jsx,ts,tsx}", // repos with multiple top-level test files "**/*{.,_}{test,spec}.{js,jsx,ts,tsx}", // tests where the extension or filename suffix denotes that it is a test "**/jest.config.js", // jest config "**/jest.setup.js", // jest setup "**/vue.config.js", // vue-cli config "**/webpack.config.js", // webpack config "**/webpack.config.*.js", // webpack config "**/rollup.config.js", // rollup config "**/rollup.config.*.js", // rollup config "**/gulpfile.js", // gulp config "**/gulpfile.*.js", // gulp config "**/Gruntfile{,.js}", // grunt config "**/protractor.conf.js", // protractor config "**/protractor.conf.*.js", // protractor config // additional paths used only in development "dev.*.js", // developer config "mock{,s}/**", // parrot mocks "**/vite.config.{ts,js}", // vite config "**/vitest.config.{ts,js}", // vitest config "eslint.config.{js,mjs,cjs}" // eslint config ], optionalDependencies: false, }, ], // Forbid mutable exports // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-mutable-exports.md "import/no-mutable-exports": "error", // disallow require() // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-commonjs.md "import/no-commonjs": "off", // disallow AMD require/define // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-amd.md "import/no-amd": "error", // No Node.js builtin modules // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-nodejs-modules.md // TODO: enable? "import/no-nodejs-modules": "off", // disallow non-import statements appearing before import statements // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/first.md "import/first": "error", // disallow duplicate imports // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-duplicates.md "import/no-duplicates": "error", // disallow namespace imports // TODO: enable? // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-namespace.md "import/no-namespace": "off", // Ensure consistent use of file extension within the import path // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/extensions.md "import/extensions": [ "error", "ignorePackages", { js: "never", mjs: "never", jsx: "never", }, ], // ensure absolute imports are above relative imports and that unassigned imports are ignored // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/order.md // TODO: enforce a stricter convention in module import order? "import/order": ["error", { groups: [["builtin", "external", "internal"]] }], // Require a newline after the last import/require in a group // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/newline-after-import.md "import/newline-after-import": "error", // Require modules with a single export to use a default export // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/prefer-default-export.md // migrated from https://github.com/americanexpress/eslint-config-amex/blob/16.x/index.js#L226 "import/prefer-default-export": "off", // Restrict which files can be imported in a given folder // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-restricted-paths.md "import/no-restricted-paths": "off", // Forbid modules to have too many dependencies // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/max-dependencies.md "import/max-dependencies": ["off", { max: 10 }], // Forbid import of modules using absolute paths // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-absolute-path.md "import/no-absolute-path": "error", // Forbid require() calls with expressions // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-dynamic-require.md "import/no-dynamic-require": "error", // prevent importing the submodules of other modules // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-internal-modules.md "import/no-internal-modules": [ "off", { allow: [], }, ], // Warn if a module could be mistakenly parsed as a script by a consumer // leveraging Unambiguous JavaScript Grammar // this should not be enabled until this proposal has at least been *presented* to TC39. // At the moment, it's not a thing. // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/unambiguous.md "import/unambiguous": "off", // Forbid Webpack loader syntax in imports // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-webpack-loader-syntax.md "import/no-webpack-loader-syntax": "error", // Prevent unassigned imports // importing for side effects is perfectly acceptable, if you need side effects. // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-unassigned-import.md "import/no-unassigned-import": "off", // Prevent importing the default as if it were named // https://github.com/import-js/eslint-plugin-import/blob/v2.32.0/docs/rules/no-named-default.md "import/no-named-default": "error", // Reports if a module's default export is unnamed // https://github.com/import-js/eslint-plugin-import/blob/d9b712ac7fd1fddc391f7b234827925c160d956f/docs/rules/no-anonymous-default-export.md // migrated from https://github.com/americanexpress/eslint-config-amex/blob/16.x/index.js#L169 "import/no-anonymous-default-export": [ "error", { allowArray: true, allowArrowFunction: false, allowAnonymousClass: false, allowAnonymousFunction: false, allowLiteral: true, allowObject: true, }, ], // This rule enforces that all exports are declared at the bottom of the file. // https://github.com/import-js/eslint-plugin-import/blob/98acd6afd04dcb6920b81330114e146dc8532ea4/docs/rules/exports-last.md // TODO: enable? "import/exports-last": "off", // Reports when named exports are not grouped together in a single export declaration // or when multiple assignments to CommonJS module.exports or exports object are present // in a single file. // https://github.com/import-js/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/group-exports.md "import/group-exports": "off", // forbid default exports. this is a terrible rule, do not use it. // https://github.com/import-js/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-default-export.md "import/no-default-export": "off", // Prohibit named exports. this is a terrible rule, do not use it. // https://github.com/import-js/eslint-plugin-import/blob/1ec80fa35fa1819e2d35a70e68fb6a149fb57c5e/docs/rules/no-named-export.md "import/no-named-export": "off", // Forbid a module from importing itself // https://github.com/import-js/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-self-import.md "import/no-self-import": "error", // Forbid cyclical dependencies between modules // https://github.com/import-js/eslint-plugin-import/blob/d81f48a2506182738409805f5272eff4d77c9348/docs/rules/no-cycle.md "import/no-cycle": ["error", { maxDepth: "∞" }], // Ensures that there are no useless path segments // https://github.com/import-js/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/no-useless-path-segments.md "import/no-useless-path-segments": ["error", { commonjs: true }], // dynamic imports require a leading comment with a webpackChunkName // https://github.com/import-js/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/dynamic-import-chunkname.md "import/dynamic-import-chunkname": [ "off", { importFunctions: [], webpackChunknameFormat: "[0-9a-zA-Z-_/.]+", }, ], // Use this rule to prevent imports to folders in relative parent paths. // https://github.com/import-js/eslint-plugin-import/blob/c34f14f67f077acd5a61b3da9c0b0de298d20059/docs/rules/no-relative-parent-imports.md "import/no-relative-parent-imports": "off", // Reports modules without any exports, or with unused exports // https://github.com/import-js/eslint-plugin-import/blob/f63dd261809de6883b13b6b5b960e6d7f42a7813/docs/rules/no-unused-modules.md // TODO: enable once it supports CJS "import/no-unused-modules": [ "off", { ignoreExports: [], missingExports: true, unusedExports: true, }, ], // Reports the use of import declarations with CommonJS exports in any module except for the main module. // https://github.com/import-js/eslint-plugin-import/blob/1012eb951767279ce3b540a4ec4f29236104bb5b/docs/rules/no-import-module-exports.md "import/no-import-module-exports": [ "error", { exceptions: [], }, ], // Use this rule to prevent importing packages through relative paths. // https://github.com/import-js/eslint-plugin-import/blob/1012eb951767279ce3b540a4ec4f29236104bb5b/docs/rules/no-relative-packages.md "import/no-relative-packages": "error", };