diff --git a/.babelrc b/.babelrc index 883c03b7..0111d616 100644 --- a/.babelrc +++ b/.babelrc @@ -1,18 +1,11 @@ { - "presets": ["airbnb"], - "sourceMaps": "inline", - "retainLines": true, + "presets": [["@babel/preset-env", { "targets": { "node": 16 } }]], "env": { "test": { - "plugins": [ - "istanbul", - ["module-resolver", { "root": ["./src/"] }], - ] + "plugins": ["istanbul", ["module-resolver", { "root": ["./src/"] }]] }, "testCompiled": { - "plugins": [ - ["module-resolver", { "root": ["./lib/"] }], - ] + "plugins": [["module-resolver", { "root": ["./lib/"] }]] } } } diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 709a4744..00000000 --- a/.eslintrc +++ /dev/null @@ -1,247 +0,0 @@ -{ - "root": true, - "plugins": [ - "eslint-plugin", - "import", - ], - "extends": [ - "eslint:recommended", - "plugin:eslint-plugin/recommended", - "plugin:import/recommended", - ], - "env": { - "node": true, - "es6": true, - "es2017": true, - }, - "parserOptions": { - "sourceType": "module", - "ecmaVersion": 2020, - }, - "rules": { - "arrow-body-style": [2, "as-needed"], - "arrow-parens": [2, "always"], - "arrow-spacing": [2, { "before": true, "after": true }], - "block-spacing": [2, "always"], - "brace-style": [2, "1tbs", { "allowSingleLine": true }], - "comma-dangle": ["error", { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "always-multiline", - "exports": "always-multiline", - "functions": "always-multiline", - }], - "comma-spacing": [2, { "before": false, "after": true }], - "comma-style": [2, "last"], - "computed-property-spacing": [2, "never"], - "curly": [2, "all"], - "default-case": [2, { "commentPattern": "(?:)" }], - "default-case-last": [2], - "default-param-last": [2], - "dot-location": [2, "property"], - "dot-notation": [2, { "allowKeywords": true, "allowPattern": "throws" }], - "eol-last": [2, "always"], - "eqeqeq": [2, "allow-null"], - "for-direction": [2], - "function-call-argument-newline": [2, "consistent"], - "func-call-spacing": [2, "never"], - "implicit-arrow-linebreak": [2, "beside"], - "indent": [2, 2, { - "SwitchCase": 1, - "VariableDeclarator": 1, - "outerIIFEBody": 1, - "FunctionDeclaration": { - "parameters": 1, - "body": 1 - }, - "FunctionExpression": { - "parameters": 1, - "body": 1 - }, - "CallExpression": { - "arguments": 1 - }, - "ArrayExpression": 1, - "ObjectExpression": 1, - "ImportDeclaration": 1, - "flatTernaryExpressions": false, - }], - "jsx-quotes": [2, "prefer-double"], - "key-spacing": [2, { - "beforeColon": false, - "afterColon": true, - "mode": "strict", - }], - "keyword-spacing": ["error", { - "before": true, - "after": true, - "overrides": { - "return": { "after": true }, - "throw": { "after": true }, - "case": { "after": true } - } - }], - "linebreak-style": [2, "unix"], - "lines-around-directive": [2, { - "before": "always", - "after": "always", - }], - "max-len": 0, - "new-parens": 2, - "no-array-constructor": 2, - "no-compare-neg-zero": 2, - "no-cond-assign": [2, "always"], - "no-extra-parens": 2, - "no-multiple-empty-lines": [2, { "max": 1, "maxEOF": 1, "maxBOF": 0 }], - "no-return-assign": [2, "always"], - "no-trailing-spaces": 2, - "no-var": 2, - "object-curly-spacing": [2, "always"], - "object-shorthand": ["error", "always", { - "ignoreConstructors": false, - "avoidQuotes": false, - "avoidExplicitReturnArrows": true, - }], - "one-var": [2, "never"], - "operator-linebreak": [2, "none", { - "overrides": { - "?": "before", - ":": "before", - "&&": "before", - "||": "before", - }, - }], - "prefer-const": 2, - "prefer-object-spread": 2, - "prefer-rest-params": 2, - "prefer-template": 2, - "quote-props": [2, "as-needed", { "keywords": false }], - "quotes": [2, "single", { - "allowTemplateLiterals": true, - "avoidEscape": true, - }], - "rest-spread-spacing": [2, "never"], - "semi": [2, "always"], - "semi-spacing": [2, { "before": false, "after": true }], - "semi-style": [2, "last"], - "space-before-blocks": [2, { "functions": "always", "keywords": "always", "classes": "always" }], - "space-before-function-paren": ["error", { - "anonymous": "always", - "named": "never", - "asyncArrow": "always", - }], - "space-in-parens": [2, "never"], - "space-infix-ops": [2], - "space-unary-ops": [2, { "words": true, "nonwords": false }], - "switch-colon-spacing": [2, { "after": true, "before": false }], - "template-curly-spacing": [2, "never"], - "template-tag-spacing": [2, "never"], - "unicode-bom": [2, "never"], - "use-isnan": [2, { "enforceForSwitchCase": true }], - "valid-typeof": [2], - "wrap-iife": [2, "outside", { "functionPrototypeMethods": true }], - "wrap-regex": [2], - "yield-star-spacing": [2, { "before": false, "after": true }], - "yoda": [2, "never", { "exceptRange": true, "onlyEquality": false }], - - "eslint-plugin/consistent-output": [ - "error", - "always", - ], - "eslint-plugin/meta-property-ordering": "error", - "eslint-plugin/no-deprecated-context-methods": "error", - "eslint-plugin/no-deprecated-report-api": "off", - "eslint-plugin/prefer-replace-text": "error", - "eslint-plugin/report-message-format": "error", - "eslint-plugin/require-meta-docs-description": ["error", { "pattern": "^(Enforce|Ensure|Prefer|Forbid).+\\.$" }], - "eslint-plugin/require-meta-schema": "error", - "eslint-plugin/require-meta-type": "error", - - // dog fooding - "import/no-extraneous-dependencies": ["error", { - "devDependencies": [ - "tests/**", - "resolvers/*/test/**", - "scripts/**" - ], - "optionalDependencies": false, - "peerDependencies": true, - "bundledDependencies": false, - }], - "import/unambiguous": "off", - }, - - "settings": { - "import/resolver": { - "node": { - "paths": [ - "src", - ], - }, - }, - }, - - "overrides": [ - { - "files": "scripts/**", - "rules": { - "no-console": "off", - }, - }, - { - "files": "resolvers/**", - "env": { - "es6": false, - }, - }, - { - "files": "resolvers/webpack/**", - "rules": { - "no-console": 1, - "prefer-template": 0, - "prefer-object-spread": 0, - "prefer-rest-params": 0, - }, - "env": { - "es6": true, - }, - }, - { - "files": [ - "resolvers/*/test/**/*", - ], - "env": { - "mocha": true, - "es6": false - }, - }, - { - "files": "utils/**", - "parserOptions": { - "ecmaVersion": 6, - }, - "rules": { - "comma-dangle": ["error", { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "always-multiline", - "exports": "always-multiline", - "functions": "never" - }], - "prefer-object-spread": "off", - "prefer-template": "off", - "no-console": 1, - }, - }, - { - "files": "tests/**", - "env": { - "mocha": true, - }, - "rules": { - "max-len": 0, - "import/default": 0, - }, - }, - ], -} diff --git a/scripts/resolverDirectories.js b/scripts/resolverDirectories.js index f0c03a3c..a7cadb55 100644 --- a/scripts/resolverDirectories.js +++ b/scripts/resolverDirectories.js @@ -1,3 +1,3 @@ -import glob from 'glob'; +import { globSync } from 'glob'; -export default glob.sync('./resolvers/*/'); +export default globSync('./resolvers/*/'); diff --git a/src/docsUrl.js b/src/docsUrl.js index 92b838c0..ccb13ba0 100644 --- a/src/docsUrl.js +++ b/src/docsUrl.js @@ -1,7 +1,7 @@ -import pkg from '../package.json'; +import { version } from '../package.json'; const repoUrl = 'https://github.com/import-js/eslint-plugin-import'; -export default function docsUrl(ruleName, commitish = `v${pkg.version}`) { +export default function docsUrl(ruleName, commitish = `v${version}`) { return `${repoUrl}/blob/${commitish}/docs/rules/${ruleName}.md`; } diff --git a/src/index.js b/src/index.js index feafba90..84992bef 100644 --- a/src/index.js +++ b/src/index.js @@ -1,71 +1,132 @@ -export const rules = { - 'no-unresolved': require('./rules/no-unresolved'), - named: require('./rules/named'), - default: require('./rules/default'), - namespace: require('./rules/namespace'), - 'no-namespace': require('./rules/no-namespace'), - export: require('./rules/export'), - 'no-mutable-exports': require('./rules/no-mutable-exports'), - extensions: require('./rules/extensions'), - 'no-restricted-paths': require('./rules/no-restricted-paths'), - 'no-internal-modules': require('./rules/no-internal-modules'), - 'group-exports': require('./rules/group-exports'), - 'no-relative-packages': require('./rules/no-relative-packages'), - 'no-relative-parent-imports': require('./rules/no-relative-parent-imports'), - 'consistent-type-specifier-style': require('./rules/consistent-type-specifier-style'), +/* eslint-disable spaced-comment */ +import noUnresolved from './rules/no-unresolved'; +import named from './rules/named'; +import defaultRule from './rules/default'; +import namespace from './rules/namespace'; +import noNamespace from './rules/no-namespace'; +import exportRule from './rules/export'; +import noMutableExports from './rules/no-mutable-exports'; +import extensions from './rules/extensions'; +import noRestrictedPaths from './rules/no-restricted-paths'; +import noInternalModules from './rules/no-internal-modules'; +import groupExports from './rules/group-exports'; +import noRelativePackages from './rules/no-relative-packages'; +import noRelativeParentImports from './rules/no-relative-parent-imports'; +import consistentTypeSpecifierStyle from './rules/consistent-type-specifier-style'; +import noSelfImport from './rules/no-self-import'; +import noCycle from './rules/no-cycle'; +import noNamedDefault from './rules/no-named-default'; +import noNamedAsDefault from './rules/no-named-as-default'; +import noNamedAsDefaultMember from './rules/no-named-as-default-member'; +import noAnonymousDefaultExport from './rules/no-anonymous-default-export'; +import noUnusedModules from './rules/no-unused-modules'; +import noCommonjs from './rules/no-commonjs'; +import noAmd from './rules/no-amd'; +import noDuplicates from './rules/no-duplicates'; +import first from './rules/first'; +import maxDependencies from './rules/max-dependencies'; +import noExtraneousDependencies from './rules/no-extraneous-dependencies'; +import noAbsolutePath from './rules/no-absolute-path'; +import noNodejsModules from './rules/no-nodejs-modules'; +import noWebpackLoaderSyntax from './rules/no-webpack-loader-syntax'; +import order from './rules/order'; +import newlineAfterImport from './rules/newline-after-import'; +import preferDefaultExport from './rules/prefer-default-export'; +import noDefaultExport from './rules/no-default-export'; +import noNamedExport from './rules/no-named-export'; +import noDynamicRequire from './rules/no-dynamic-require'; +import unambiguous from './rules/unambiguous'; +import noUnassignedImport from './rules/no-unassigned-import'; +import noUselessPathSegments from './rules/no-useless-path-segments'; +import dynamicImportChunkname from './rules/dynamic-import-chunkname'; +import noImportModuleExports from './rules/no-import-module-exports'; +import noEmptyNamedBlocks from './rules/no-empty-named-blocks'; +import exportsLast from './rules/exports-last'; +import noDeprecated from './rules/no-deprecated'; +import importsFirst from './rules/imports-first'; +import recommended from '../config/recommended'; +import errors from '../config/errors'; +import warnings from '../config/warnings'; +import stage0 from '../config/stage-0'; +import react from '../config/react'; +import reactNative from '../config/react-native'; +import electron from '../config/electron'; +import typescript from '../config/typescript'; - 'no-self-import': require('./rules/no-self-import'), - 'no-cycle': require('./rules/no-cycle'), - 'no-named-default': require('./rules/no-named-default'), - 'no-named-as-default': require('./rules/no-named-as-default'), - 'no-named-as-default-member': require('./rules/no-named-as-default-member'), - 'no-anonymous-default-export': require('./rules/no-anonymous-default-export'), - 'no-unused-modules': require('./rules/no-unused-modules'), +export const rules = /*#__PURE__*/ kebabCase({ + noUnresolved, + named, + default: defaultRule, + namespace, + noNamespace, + export: exportRule, + noMutableExports, + extensions, + noRestrictedPaths, + noInternalModules, + groupExports, + noRelativePackages, + noRelativeParentImports, + consistentTypeSpecifierStyle, - 'no-commonjs': require('./rules/no-commonjs'), - 'no-amd': require('./rules/no-amd'), - 'no-duplicates': require('./rules/no-duplicates'), - first: require('./rules/first'), - 'max-dependencies': require('./rules/max-dependencies'), - 'no-extraneous-dependencies': require('./rules/no-extraneous-dependencies'), - 'no-absolute-path': require('./rules/no-absolute-path'), - 'no-nodejs-modules': require('./rules/no-nodejs-modules'), - 'no-webpack-loader-syntax': require('./rules/no-webpack-loader-syntax'), - order: require('./rules/order'), - 'newline-after-import': require('./rules/newline-after-import'), - 'prefer-default-export': require('./rules/prefer-default-export'), - 'no-default-export': require('./rules/no-default-export'), - 'no-named-export': require('./rules/no-named-export'), - 'no-dynamic-require': require('./rules/no-dynamic-require'), - unambiguous: require('./rules/unambiguous'), - 'no-unassigned-import': require('./rules/no-unassigned-import'), - 'no-useless-path-segments': require('./rules/no-useless-path-segments'), - 'dynamic-import-chunkname': require('./rules/dynamic-import-chunkname'), - 'no-import-module-exports': require('./rules/no-import-module-exports'), - 'no-empty-named-blocks': require('./rules/no-empty-named-blocks'), + noSelfImport, + noCycle, + noNamedDefault, + noNamedAsDefault, + noNamedAsDefaultMember, + noAnonymousDefaultExport, + noUnusedModules, + + noCommonjs, + noAmd, + noDuplicates, + first, + maxDependencies, + noExtraneousDependencies, + noAbsolutePath, + noNodejsModules, + noWebpackLoaderSyntax, + order, + newlineAfterImport, + preferDefaultExport, + noDefaultExport, + noNamedExport, + noDynamicRequire, + unambiguous, + noUnassignedImport, + noUselessPathSegments, + dynamicImportChunkname, + noImportModuleExports, + noEmptyNamedBlocks, // export - 'exports-last': require('./rules/exports-last'), + exportsLast, // metadata-based - 'no-deprecated': require('./rules/no-deprecated'), + noDeprecated, // deprecated aliases to rules - 'imports-first': require('./rules/imports-first'), -}; + importsFirst, +}); -export const configs = { - recommended: require('../config/recommended'), +export const configs = /*#__PURE__*/ kebabCase({ + recommended, - errors: require('../config/errors'), - warnings: require('../config/warnings'), + errors, + warnings, // shhhh... work in progress "secret" rules - 'stage-0': require('../config/stage-0'), + 'stage-0': stage0, // useful stuff for folks using various environments - react: require('../config/react'), - 'react-native': require('../config/react-native'), - electron: require('../config/electron'), - typescript: require('../config/typescript'), -}; + react, + reactNative, + electron, + typescript, +}); + +function kebabCase(obj) { + return Object.fromEntries( + Object.entries(obj).map(([key, value]) => [key.replace(/([A-Z])/g, '-$1').toLowerCase(), value]) + ) +} \ No newline at end of file