From 5ca9b4d29f747e9cf5c9055e85c93b3b605d57fc Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Mon, 10 Jul 2023 17:38:50 +0200 Subject: [PATCH] chore: update eslint-config-eslint exports (#17336) * chore: update eslint-config-eslint export * update naming in README * main export for ESM, additional for CJS * update usage in README * update package.exports * rename file * add eslintrc export * add `files` to simplify usage --- eslint.config.js | 4 +- packages/eslint-config-eslint/README.md | 26 +- packages/eslint-config-eslint/base.js | 387 ++++++++++++++++++++ packages/eslint-config-eslint/cjs.js | 9 + packages/eslint-config-eslint/index.js | 407 +-------------------- packages/eslint-config-eslint/nodejs.js | 33 ++ packages/eslint-config-eslint/package.json | 14 +- 7 files changed, 477 insertions(+), 403 deletions(-) create mode 100644 packages/eslint-config-eslint/base.js create mode 100644 packages/eslint-config-eslint/cjs.js create mode 100644 packages/eslint-config-eslint/nodejs.js diff --git a/eslint.config.js b/eslint.config.js index 09497a915b6..214be713d4c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -31,7 +31,7 @@ const eslintPluginRulesRecommendedConfig = require("eslint-plugin-eslint-plugin/ const eslintPluginTestsRecommendedConfig = require("eslint-plugin-eslint-plugin/configs/tests-recommended"); const globals = require("globals"); const merge = require("lodash.merge"); -const baseConfig = require("eslint-config-eslint"); +const eslintConfigESLintCJS = require("eslint-config-eslint/cjs"); //----------------------------------------------------------------------------- // Helpers @@ -75,7 +75,7 @@ function createInternalFilesPatterns(pattern = null) { } module.exports = [ - ...baseConfig, + ...eslintConfigESLintCJS, { ignores: [ "build/**", diff --git a/packages/eslint-config-eslint/README.md b/packages/eslint-config-eslint/README.md index 6be0d1c91f1..645a1938260 100644 --- a/packages/eslint-config-eslint/README.md +++ b/packages/eslint-config-eslint/README.md @@ -22,11 +22,33 @@ npm install eslint-config-eslint --save-dev ## Usage +### ESM (`"type":"module"`) projects + In your `eslint.config.js` file, add: ```js -const eslintConfig = require("eslint-config-eslint"); -module.exports = eslintConfig; +import eslintConfigESLint from "eslint-config-eslint"; + +export default [ + ...eslintConfigESLint +]; +``` + +**Note**: This configuration array contains configuration objects with the `files` property. + +* `files: ["**/*.js"]`: ESM-specific configurations. +* `files: ["**/*.cjs"]`: CommonJS-specific configurations. + +### CommonJS projects + +In your `eslint.config.js` file, add: + +```js +const eslintConfigESLintCJS = require("eslint-config-eslint/cjs"); + +module.exports = [ + ...eslintConfigESLintCJS +]; ``` ### Where to ask for help? diff --git a/packages/eslint-config-eslint/base.js b/packages/eslint-config-eslint/base.js new file mode 100644 index 00000000000..1365108390d --- /dev/null +++ b/packages/eslint-config-eslint/base.js @@ -0,0 +1,387 @@ +"use strict"; + +const js = require("@eslint/js"); +const jsdoc = require("eslint-plugin-jsdoc"); +const eslintComments = require("eslint-plugin-eslint-comments"); +const unicorn = require("eslint-plugin-unicorn"); + +/* + * the plugins' configs are not updated to support the flat config, + * need to manually update the `plugins` property + */ +jsdoc.configs.recommended.plugins = { jsdoc }; +eslintComments.configs.recommended.plugins = { "eslint-comments": eslintComments }; + +// extends eslint recommended config +const jsConfigs = [js.configs.recommended, { + rules: { + "array-bracket-spacing": "error", + "array-callback-return": "error", + "arrow-body-style": ["error", "as-needed"], + "arrow-parens": ["error", "as-needed"], + "arrow-spacing": "error", + indent: ["error", 4, { SwitchCase: 1 }], + "block-spacing": "error", + "brace-style": ["error", "1tbs"], + camelcase: "error", + "class-methods-use-this": "error", + "comma-dangle": "error", + "comma-spacing": "error", + "comma-style": ["error", "last"], + "computed-property-spacing": "error", + "consistent-return": "error", + curly: ["error", "all"], + "default-case": "error", + "default-case-last": "error", + "default-param-last": "error", + "dot-location": ["error", "property"], + "dot-notation": [ + "error", + { allowKeywords: true } + ], + "eol-last": "error", + eqeqeq: "error", + "func-call-spacing": "error", + "func-style": ["error", "declaration"], + "function-call-argument-newline": ["error", "consistent"], + "function-paren-newline": ["error", "consistent"], + "generator-star-spacing": "error", + "grouped-accessor-pairs": "error", + "guard-for-in": "error", + "key-spacing": ["error", { beforeColon: false, afterColon: true }], + "keyword-spacing": "error", + "lines-around-comment": ["error", + { + beforeBlockComment: true, + afterBlockComment: false, + beforeLineComment: true, + afterLineComment: false + } + ], + "max-len": ["error", 160, + { + ignoreComments: true, + ignoreUrls: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + ignoreRegExpLiterals: true + } + ], + "max-statements-per-line": "error", + "new-cap": "error", + "new-parens": "error", + "no-alert": "error", + "no-array-constructor": "error", + "no-caller": "error", + "no-confusing-arrow": "error", + "no-console": "error", + "no-constant-binary-expression": "error", + "no-constructor-return": "error", + "no-else-return": ["error", { allowElseIf: false } + ], + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-floating-decimal": "error", + "no-implied-eval": "error", + "no-invalid-this": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-loop-func": "error", + "no-mixed-spaces-and-tabs": ["error", false], + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-multiple-empty-lines": [ + "error", + { + max: 2, + maxBOF: 0, + maxEOF: 0 + } + ], + "no-nested-ternary": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-wrappers": "error", + "no-octal-escape": "error", + "no-param-reassign": "error", + "no-proto": "error", + "no-process-exit": "off", + "no-restricted-properties": ["error", + { + property: "substring", + message: "Use .slice instead of .substring." + }, + { + property: "substr", + message: "Use .slice instead of .substr." + }, + { + object: "assert", + property: "equal", + message: "Use assert.strictEqual instead of assert.equal." + }, + { + object: "assert", + property: "notEqual", + message: "Use assert.notStrictEqual instead of assert.notEqual." + }, + { + object: "assert", + property: "deepEqual", + message: "Use assert.deepStrictEqual instead of assert.deepEqual." + }, + { + object: "assert", + property: "notDeepEqual", + message: "Use assert.notDeepStrictEqual instead of assert.notDeepEqual." + } + ], + "no-return-assign": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow": "error", + "no-tabs": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef": ["error", { typeof: true }], + "no-undef-init": "error", + "no-undefined": "error", + "no-underscore-dangle": ["error", { allowAfterThis: true } + ], + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": "error", + "no-unreachable-loop": "error", + "no-unused-expressions": "error", + "no-unused-vars": ["error", { + vars: "all", + args: "after-used", + caughtErrors: "all" + } + ], + "no-use-before-define": "error", + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-whitespace-before-property": "error", + "no-var": "error", + "object-curly-newline": ["error", + { + consistent: true, + multiline: true + } + ], + "object-curly-spacing": ["error", "always"], + "object-property-newline": ["error", + { + allowAllPropertiesOnSameLine: true + } + ], + "object-shorthand": ["error", + "always", + { + avoidExplicitReturnArrows: true + } + ], + "one-var-declaration-per-line": "error", + "operator-assignment": "error", + "operator-linebreak": "error", + "padding-line-between-statements": ["error", + { + blankLine: "always", + prev: ["const", "let", "var"], + next: "*" + }, + { + blankLine: "any", + prev: ["const", "let", "var"], + next: ["const", "let", "var"] + } + ], + "prefer-arrow-callback": "error", + "prefer-const": "error", + "prefer-exponentiation-operator": "error", + "prefer-numeric-literals": "error", + "prefer-promise-reject-errors": "error", + "prefer-regex-literals": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + "prefer-template": "error", + quotes: ["error", "double", { avoidEscape: true }], + "quote-props": ["error", "as-needed"], + radix: "error", + "require-unicode-regexp": "error", + "rest-spread-spacing": "error", + semi: "error", + "semi-spacing": ["error", + { + before: false, + after: true + } + ], + "semi-style": "error", + "space-before-blocks": "error", + "space-before-function-paren": ["error", + { + anonymous: "never", + named: "never", + asyncArrow: "always" + } + ], + "space-in-parens": "error", + "space-infix-ops": "error", + "space-unary-ops": ["error", + { + words: true, + nonwords: false + } + ], + "spaced-comment": ["error", + "always", + { + exceptions: ["-"] + } + ], + strict: ["error", "global"], + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": ["error", "never"], + "template-tag-spacing": "error", + "unicode-bom": "error", + "wrap-iife": "error", + "yield-star-spacing": "error", + yoda: ["error", "never", { exceptRange: true }] + } +}]; + +// extends eslint-plugin-jsdoc's recommended config +const jsdocConfigs = [jsdoc.configs.recommended, { + settings: { + jsdoc: { + mode: "typescript", + tagNamePreference: { + file: "fileoverview", + augments: "extends", + class: "constructor" + }, + preferredTypes: { + "*": { + message: "Use a more precise type or if necessary use `any` or `ArbitraryCallbackResult`", + replacement: "any" + }, + Any: { + message: "Use a more precise type or if necessary use `any` or `ArbitraryCallbackResult`", + replacement: "any" + }, + function: { + message: "Point to a `@callback` namepath or `Function` if truly arbitrary in form", + replacement: "Function" + }, + Promise: { + message: "Specify the specific Promise type, including, if necessary, the type `any`" + }, + ".<>": { + message: "Prefer type form without dot", + replacement: "<>" + }, + object: { + message: "Use the specific object type or `Object` if truly arbitrary", + replacement: "Object" + }, + array: "Array" + } + } + }, + rules: { + "jsdoc/check-syntax": "error", + "jsdoc/check-values": ["error", { allowedLicenses: true }], + "jsdoc/no-bad-blocks": "error", + "jsdoc/no-defaults": "off", + "jsdoc/require-asterisk-prefix": "error", + "jsdoc/require-description": ["error", { checkConstructors: false }], + "jsdoc/require-hyphen-before-param-description": ["error", "never"], + "jsdoc/require-returns": ["error", + { + forceRequireReturn: true, + forceReturnsWithAsync: true + } + ], + "jsdoc/require-throws": "error", + "jsdoc/tag-lines": ["error", "never", + { + tags: { + example: { lines: "always" }, + fileoverview: { lines: "any" } + }, + startLines: 0 + } + ], + "jsdoc/no-undefined-types": "off", + "jsdoc/require-yields": "off", + "jsdoc/check-access": "error", + "jsdoc/check-alignment": "error", + "jsdoc/check-param-names": "error", + "jsdoc/check-property-names": "error", + "jsdoc/check-tag-names": "error", + "jsdoc/check-types": "error", + "jsdoc/empty-tags": "error", + "jsdoc/implements-on-classes": "error", + "jsdoc/multiline-blocks": "error", + "jsdoc/no-multi-asterisks": "error", + "jsdoc/require-jsdoc": ["error", { require: { ClassDeclaration: true } }], + "jsdoc/require-param": "error", + "jsdoc/require-param-description": "error", + "jsdoc/require-param-name": "error", + "jsdoc/require-param-type": "error", + "jsdoc/require-property": "error", + "jsdoc/require-property-description": "error", + "jsdoc/require-property-name": "error", + "jsdoc/require-property-type": "error", + "jsdoc/require-returns-check": "error", + "jsdoc/require-returns-description": "error", + "jsdoc/require-returns-type": "error", + "jsdoc/require-yields-check": "error", + "jsdoc/valid-types": "error" + } +}]; + +// extends eslint-plugin-unicorn's config +const unicornConfigs = [{ + plugins: { unicorn }, + rules: { + "unicorn/prefer-array-find": "error", + "unicorn/prefer-array-flat-map": "error", + "unicorn/prefer-array-flat": "error", + "unicorn/prefer-array-index-of": "error", + "unicorn/prefer-array-some": "error", + "unicorn/prefer-includes": "error", + "unicorn/prefer-set-has": "error", + "unicorn/prefer-string-slice": "error", + "unicorn/prefer-string-starts-ends-with": "error", + "unicorn/prefer-string-trim-start-end": "error" + } +}]; + +// extends eslint-plugin-eslint-comments's recommended config +const eslintCommentsConfigs = [eslintComments.configs.recommended, { + rules: { + "eslint-comments/disable-enable-pair": ["error"], + "eslint-comments/no-unused-disable": "error", + "eslint-comments/require-description": "error" + } +}]; + +module.exports = [ + { linterOptions: { reportUnusedDisableDirectives: true } }, + ...jsConfigs, + ...unicornConfigs, + ...jsdocConfigs, + ...eslintCommentsConfigs +]; diff --git a/packages/eslint-config-eslint/cjs.js b/packages/eslint-config-eslint/cjs.js new file mode 100644 index 00000000000..61963a39bef --- /dev/null +++ b/packages/eslint-config-eslint/cjs.js @@ -0,0 +1,9 @@ +"use strict"; + +const baseConfigs = require("./base"); +const { cjsConfigs } = require("./nodejs"); + +module.exports = [ + ...baseConfigs, + ...cjsConfigs +]; diff --git a/packages/eslint-config-eslint/index.js b/packages/eslint-config-eslint/index.js index 4057d6d944c..8717218efe7 100644 --- a/packages/eslint-config-eslint/index.js +++ b/packages/eslint-config-eslint/index.js @@ -1,401 +1,16 @@ "use strict"; -const nodeRecommendedConfig = require("eslint-plugin-n/configs/recommended-script"); -const js = require("@eslint/js"); -const jsdoc = require("eslint-plugin-jsdoc"); -const eslintComments = require("eslint-plugin-eslint-comments"); -const unicorn = require("eslint-plugin-unicorn"); - -/* - * the plugins' configs are not updated to support the flat config, - * need to manually update the `plugins` property - */ -jsdoc.configs.recommended.plugins = { jsdoc }; -eslintComments.configs.recommended.plugins = { "eslint-comments": eslintComments }; - -// extends eslint-plugin-n's recommended config -const nodeConfigs = [nodeRecommendedConfig, { - rules: { - "n/callback-return": ["error", ["cb", "callback", "next"]], - "n/handle-callback-err": ["error", "err"], - "n/no-deprecated-api": "error", - "n/no-mixed-requires": "error", - "n/no-new-require": "error", - "n/no-path-concat": "error" - } -}]; - -// extends eslint recommended config -const jsConfigs = [js.configs.recommended, { - rules: { - "array-bracket-spacing": "error", - "array-callback-return": "error", - "arrow-body-style": ["error", "as-needed"], - "arrow-parens": ["error", "as-needed"], - "arrow-spacing": "error", - indent: ["error", 4, { SwitchCase: 1 }], - "block-spacing": "error", - "brace-style": ["error", "1tbs"], - camelcase: "error", - "class-methods-use-this": "error", - "comma-dangle": "error", - "comma-spacing": "error", - "comma-style": ["error", "last"], - "computed-property-spacing": "error", - "consistent-return": "error", - curly: ["error", "all"], - "default-case": "error", - "default-case-last": "error", - "default-param-last": "error", - "dot-location": ["error", "property"], - "dot-notation": [ - "error", - { allowKeywords: true } - ], - "eol-last": "error", - eqeqeq: "error", - "func-call-spacing": "error", - "func-style": ["error", "declaration"], - "function-call-argument-newline": ["error", "consistent"], - "function-paren-newline": ["error", "consistent"], - "generator-star-spacing": "error", - "grouped-accessor-pairs": "error", - "guard-for-in": "error", - "key-spacing": ["error", { beforeColon: false, afterColon: true }], - "keyword-spacing": "error", - "lines-around-comment": ["error", - { - beforeBlockComment: true, - afterBlockComment: false, - beforeLineComment: true, - afterLineComment: false - } - ], - "max-len": ["error", 160, - { - ignoreComments: true, - ignoreUrls: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - ignoreRegExpLiterals: true - } - ], - "max-statements-per-line": "error", - "new-cap": "error", - "new-parens": "error", - "no-alert": "error", - "no-array-constructor": "error", - "no-caller": "error", - "no-confusing-arrow": "error", - "no-console": "error", - "no-constant-binary-expression": "error", - "no-constructor-return": "error", - "no-else-return": ["error", { allowElseIf: false } - ], - "no-eval": "error", - "no-extend-native": "error", - "no-extra-bind": "error", - "no-floating-decimal": "error", - "no-implied-eval": "error", - "no-invalid-this": "error", - "no-iterator": "error", - "no-label-var": "error", - "no-labels": "error", - "no-lone-blocks": "error", - "no-loop-func": "error", - "no-mixed-spaces-and-tabs": ["error", false], - "no-multi-spaces": "error", - "no-multi-str": "error", - "no-multiple-empty-lines": [ - "error", - { - max: 2, - maxBOF: 0, - maxEOF: 0 - } - ], - "no-nested-ternary": "error", - "no-new": "error", - "no-new-func": "error", - "no-new-object": "error", - "no-new-wrappers": "error", - "no-octal-escape": "error", - "no-param-reassign": "error", - "no-proto": "error", - "no-process-exit": "off", - "no-restricted-properties": ["error", - { - property: "substring", - message: "Use .slice instead of .substring." - }, - { - property: "substr", - message: "Use .slice instead of .substr." - }, - { - object: "assert", - property: "equal", - message: "Use assert.strictEqual instead of assert.equal." - }, - { - object: "assert", - property: "notEqual", - message: "Use assert.notStrictEqual instead of assert.notEqual." - }, - { - object: "assert", - property: "deepEqual", - message: "Use assert.deepStrictEqual instead of assert.deepEqual." - }, - { - object: "assert", - property: "notDeepEqual", - message: "Use assert.notDeepStrictEqual instead of assert.notDeepEqual." - } - ], - "no-return-assign": "error", - "no-script-url": "error", - "no-self-compare": "error", - "no-sequences": "error", - "no-shadow": "error", - "no-tabs": "error", - "no-throw-literal": "error", - "no-trailing-spaces": "error", - "no-undef": ["error", { typeof: true }], - "no-undef-init": "error", - "no-undefined": "error", - "no-underscore-dangle": ["error", { allowAfterThis: true } - ], - "no-unmodified-loop-condition": "error", - "no-unneeded-ternary": "error", - "no-unreachable-loop": "error", - "no-unused-expressions": "error", - "no-unused-vars": ["error", { - vars: "all", - args: "after-used", - caughtErrors: "all" - } - ], - "no-use-before-define": "error", - "no-useless-call": "error", - "no-useless-computed-key": "error", - "no-useless-concat": "error", - "no-useless-constructor": "error", - "no-useless-rename": "error", - "no-useless-return": "error", - "no-whitespace-before-property": "error", - "no-var": "error", - "object-curly-newline": ["error", - { - consistent: true, - multiline: true - } - ], - "object-curly-spacing": ["error", "always"], - "object-property-newline": ["error", - { - allowAllPropertiesOnSameLine: true - } - ], - "object-shorthand": ["error", - "always", - { - avoidExplicitReturnArrows: true - } - ], - "one-var-declaration-per-line": "error", - "operator-assignment": "error", - "operator-linebreak": "error", - "padding-line-between-statements": ["error", - { - blankLine: "always", - prev: ["const", "let", "var"], - next: "*" - }, - { - blankLine: "any", - prev: ["const", "let", "var"], - next: ["const", "let", "var"] - } - ], - "prefer-arrow-callback": "error", - "prefer-const": "error", - "prefer-exponentiation-operator": "error", - "prefer-numeric-literals": "error", - "prefer-promise-reject-errors": "error", - "prefer-regex-literals": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "prefer-template": "error", - quotes: ["error", "double", { avoidEscape: true }], - "quote-props": ["error", "as-needed"], - radix: "error", - "require-unicode-regexp": "error", - "rest-spread-spacing": "error", - semi: "error", - "semi-spacing": ["error", - { - before: false, - after: true - } - ], - "semi-style": "error", - "space-before-blocks": "error", - "space-before-function-paren": ["error", - { - anonymous: "never", - named: "never", - asyncArrow: "always" - } - ], - "space-in-parens": "error", - "space-infix-ops": "error", - "space-unary-ops": ["error", - { - words: true, - nonwords: false - } - ], - "spaced-comment": ["error", - "always", - { - exceptions: ["-"] - } - ], - strict: ["error", "global"], - "switch-colon-spacing": "error", - "symbol-description": "error", - "template-curly-spacing": ["error", "never"], - "template-tag-spacing": "error", - "unicode-bom": "error", - "wrap-iife": "error", - "yield-star-spacing": "error", - yoda: ["error", "never", { exceptRange: true }] - } -}]; - -// extends eslint-plugin-jsdoc's recommended config -const jsdocConfigs = [jsdoc.configs.recommended, { - settings: { - jsdoc: { - mode: "typescript", - tagNamePreference: { - file: "fileoverview", - augments: "extends", - class: "constructor" - }, - preferredTypes: { - "*": { - message: "Use a more precise type or if necessary use `any` or `ArbitraryCallbackResult`", - replacement: "any" - }, - Any: { - message: "Use a more precise type or if necessary use `any` or `ArbitraryCallbackResult`", - replacement: "any" - }, - function: { - message: "Point to a `@callback` namepath or `Function` if truly arbitrary in form", - replacement: "Function" - }, - Promise: { - message: "Specify the specific Promise type, including, if necessary, the type `any`" - }, - ".<>": { - message: "Prefer type form without dot", - replacement: "<>" - }, - object: { - message: "Use the specific object type or `Object` if truly arbitrary", - replacement: "Object" - }, - array: "Array" - } - } - }, - rules: { - "jsdoc/check-syntax": "error", - "jsdoc/check-values": ["error", { allowedLicenses: true }], - "jsdoc/no-bad-blocks": "error", - "jsdoc/no-defaults": "off", - "jsdoc/require-asterisk-prefix": "error", - "jsdoc/require-description": ["error", { checkConstructors: false }], - "jsdoc/require-hyphen-before-param-description": ["error", "never"], - "jsdoc/require-returns": ["error", - { - forceRequireReturn: true, - forceReturnsWithAsync: true - } - ], - "jsdoc/require-throws": "error", - "jsdoc/tag-lines": ["error", "never", - { - tags: { - example: { lines: "always" }, - fileoverview: { lines: "any" } - }, - startLines: 0 - } - ], - "jsdoc/no-undefined-types": "off", - "jsdoc/require-yields": "off", - "jsdoc/check-access": "error", - "jsdoc/check-alignment": "error", - "jsdoc/check-param-names": "error", - "jsdoc/check-property-names": "error", - "jsdoc/check-tag-names": "error", - "jsdoc/check-types": "error", - "jsdoc/empty-tags": "error", - "jsdoc/implements-on-classes": "error", - "jsdoc/multiline-blocks": "error", - "jsdoc/no-multi-asterisks": "error", - "jsdoc/require-jsdoc": ["error", { require: { ClassDeclaration: true } }], - "jsdoc/require-param": "error", - "jsdoc/require-param-description": "error", - "jsdoc/require-param-name": "error", - "jsdoc/require-param-type": "error", - "jsdoc/require-property": "error", - "jsdoc/require-property-description": "error", - "jsdoc/require-property-name": "error", - "jsdoc/require-property-type": "error", - "jsdoc/require-returns-check": "error", - "jsdoc/require-returns-description": "error", - "jsdoc/require-returns-type": "error", - "jsdoc/require-yields-check": "error", - "jsdoc/valid-types": "error" - } -}]; - -// extends eslint-plugin-unicorn's config -const unicornConfigs = [{ - plugins: { unicorn }, - rules: { - "unicorn/prefer-array-find": "error", - "unicorn/prefer-array-flat-map": "error", - "unicorn/prefer-array-flat": "error", - "unicorn/prefer-array-index-of": "error", - "unicorn/prefer-array-some": "error", - "unicorn/prefer-includes": "error", - "unicorn/prefer-set-has": "error", - "unicorn/prefer-string-slice": "error", - "unicorn/prefer-string-starts-ends-with": "error", - "unicorn/prefer-string-trim-start-end": "error" - } -}]; - -// extends eslint-plugin-eslint-comments's recommended config -const eslintCommentsConfigs = [eslintComments.configs.recommended, { - rules: { - "eslint-comments/disable-enable-pair": ["error"], - "eslint-comments/no-unused-disable": "error", - "eslint-comments/require-description": "error" - } -}]; +const baseConfigs = require("./base"); +const { esmConfigs, cjsConfigs } = require("./nodejs"); module.exports = [ - { linterOptions: { reportUnusedDisableDirectives: true } }, - ...jsConfigs, - ...nodeConfigs, - ...unicornConfigs, - ...jsdocConfigs, - ...eslintCommentsConfigs + ...baseConfigs, + ...esmConfigs.map(config => ({ + files: ["**/*.js"], + ...config + })), + ...cjsConfigs.map(config => ({ + files: ["**/*.cjs"], + ...config + })) ]; diff --git a/packages/eslint-config-eslint/nodejs.js b/packages/eslint-config-eslint/nodejs.js new file mode 100644 index 00000000000..368c67dc86b --- /dev/null +++ b/packages/eslint-config-eslint/nodejs.js @@ -0,0 +1,33 @@ +"use strict"; + +const recommendedScriptConfig = require("eslint-plugin-n/configs/recommended-script"); +const recommendedModuleConfig = require("eslint-plugin-n/configs/recommended-module"); + +const sharedRules = { + "n/callback-return": ["error", ["cb", "callback", "next"]], + "n/handle-callback-err": ["error", "err"] +}; + +const cjsConfigs = [ + recommendedScriptConfig, + { + rules: { + ...sharedRules, + "n/no-mixed-requires": "error", + "n/no-new-require": "error", + "n/no-path-concat": "error" + } + } +]; + +const esmConfigs = [ + recommendedModuleConfig, + { + rules: sharedRules + } +]; + +module.exports = { + cjsConfigs, + esmConfigs +}; diff --git a/packages/eslint-config-eslint/package.json b/packages/eslint-config-eslint/package.json index 1a779c1a1ef..ffd1fbceb93 100644 --- a/packages/eslint-config-eslint/package.json +++ b/packages/eslint-config-eslint/package.json @@ -3,15 +3,23 @@ "version": "8.0.0", "author": "Nicholas C. Zakas ", "description": "Default ESLint configuration for ESLint projects.", + "exports": { + "./package.json": "./package.json", + ".": "./index.js", + "./cjs": "./cjs.js", + "./eslintrc": "./eslintrc.js" + }, "scripts": { - "test": "node ./index.js", + "test": "node ./index.js && node ./cjs.js", "prepublish": "npm test" }, "files": [ "LICENSE", "README.md", + "base.js", + "cjs.js", "index.js", - "default.yml" + "nodejs.js" ], "repository": { "type": "git", @@ -33,6 +41,6 @@ ], "license": "MIT", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }