eslint-config-amex
Version:
American Express' ESLint config
294 lines (247 loc) • 13.3 kB
JavaScript
/*
* 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",
};