From 7e00e7379f524d6c26946a7fb76d0e8a86a14dd5 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Mon, 3 Jul 2023 20:25:17 +0200 Subject: [PATCH 1/8] chore: update eslint-config-eslint export --- eslint.config.js | 3 +- packages/eslint-config-eslint/README.md | 16 +++++++-- packages/eslint-config-eslint/index.js | 45 ++++++++++++++++--------- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 09497a915b64..547776eb463f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -75,7 +75,8 @@ function createInternalFilesPatterns(pattern = null) { } module.exports = [ - ...baseConfig, + ...baseConfig.base, + baseConfig.commonjs, { ignores: [ "build/**", diff --git a/packages/eslint-config-eslint/README.md b/packages/eslint-config-eslint/README.md index 6be0d1c91f10..2dbdc289c0d9 100644 --- a/packages/eslint-config-eslint/README.md +++ b/packages/eslint-config-eslint/README.md @@ -25,8 +25,20 @@ npm install eslint-config-eslint --save-dev In your `eslint.config.js` file, add: ```js -const eslintConfig = require("eslint-config-eslint"); -module.exports = eslintConfig; +// ESM project +import eslintConfigEslint from "eslint-config-eslint"; + +export default [ + ...eslintConfigEslint.base, + { + files: ["**/*.js"], + ...eslintConfigEslint.esm + }, + { + files: ["**/*.cjs"], + ...eslintConfigEslint.commonjs + } +]; ``` ### Where to ask for help? diff --git a/packages/eslint-config-eslint/index.js b/packages/eslint-config-eslint/index.js index 4057d6d944cf..b753a46fbcef 100644 --- a/packages/eslint-config-eslint/index.js +++ b/packages/eslint-config-eslint/index.js @@ -1,6 +1,7 @@ "use strict"; -const nodeRecommendedConfig = require("eslint-plugin-n/configs/recommended-script"); +const nodeRecommendedScriptConfig = require("eslint-plugin-n/configs/recommended-script"); +const nodeRecommendedModuleConfig = require("eslint-plugin-n/configs/recommended-module"); const js = require("@eslint/js"); const jsdoc = require("eslint-plugin-jsdoc"); const eslintComments = require("eslint-plugin-eslint-comments"); @@ -13,17 +14,28 @@ const unicorn = require("eslint-plugin-unicorn"); jsdoc.configs.recommended.plugins = { jsdoc }; eslintComments.configs.recommended.plugins = { "eslint-comments": eslintComments }; -// extends eslint-plugin-n's recommended config -const nodeConfigs = [nodeRecommendedConfig, { +// extends eslint-plugin-n's config +const nodeSharedRules = { + "n/callback-return": ["error", ["cb", "callback", "next"]], + "n/handle-callback-err": ["error", "err"] +}; +const nodeCommonJSConfig = { + ...nodeRecommendedScriptConfig, rules: { - "n/callback-return": ["error", ["cb", "callback", "next"]], - "n/handle-callback-err": ["error", "err"], - "n/no-deprecated-api": "error", + ...nodeRecommendedScriptConfig.rules, + ...nodeSharedRules, "n/no-mixed-requires": "error", "n/no-new-require": "error", "n/no-path-concat": "error" } -}]; +}; +const nodeESMConfig = { + ...nodeRecommendedModuleConfig, + rules: { + ...nodeRecommendedModuleConfig.rules, + ...nodeSharedRules + } +}; // extends eslint recommended config const jsConfigs = [js.configs.recommended, { @@ -391,11 +403,14 @@ const eslintCommentsConfigs = [eslintComments.configs.recommended, { } }]; -module.exports = [ - { linterOptions: { reportUnusedDisableDirectives: true } }, - ...jsConfigs, - ...nodeConfigs, - ...unicornConfigs, - ...jsdocConfigs, - ...eslintCommentsConfigs -]; +module.exports = { + base: [ + { linterOptions: { reportUnusedDisableDirectives: true } }, + ...jsConfigs, + ...unicornConfigs, + ...jsdocConfigs, + ...eslintCommentsConfigs + ], + commonjs: nodeCommonJSConfig, + esm: nodeESMConfig +}; From 7a63ccbf52c98030ef0a8f9f11c6b2f60e618c96 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Tue, 4 Jul 2023 16:05:11 +0200 Subject: [PATCH 2/8] update naming in README --- packages/eslint-config-eslint/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/eslint-config-eslint/README.md b/packages/eslint-config-eslint/README.md index 2dbdc289c0d9..96694d2623cb 100644 --- a/packages/eslint-config-eslint/README.md +++ b/packages/eslint-config-eslint/README.md @@ -26,17 +26,17 @@ In your `eslint.config.js` file, add: ```js // ESM project -import eslintConfigEslint from "eslint-config-eslint"; +import eslintConfigESLint from "eslint-config-eslint"; export default [ - ...eslintConfigEslint.base, + ...eslintConfigESLint.base, { files: ["**/*.js"], - ...eslintConfigEslint.esm + ...eslintConfigESLint.esm }, { files: ["**/*.cjs"], - ...eslintConfigEslint.commonjs + ...eslintConfigESLint.commonjs } ]; ``` From 7eb9b453b21d1c9e11ab8769b67a001a59958b06 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Wed, 5 Jul 2023 13:04:23 +0200 Subject: [PATCH 3/8] main export for ESM, additional for CJS --- eslint.config.js | 5 +- packages/eslint-config-eslint/base.js | 387 +++++++++++++++++++ packages/eslint-config-eslint/cjs.js | 9 + packages/eslint-config-eslint/index.js | 419 +-------------------- packages/eslint-config-eslint/node.js | 33 ++ packages/eslint-config-eslint/package.json | 11 +- 6 files changed, 446 insertions(+), 418 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/node.js diff --git a/eslint.config.js b/eslint.config.js index 547776eb463f..214be713d4c9 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,8 +75,7 @@ function createInternalFilesPatterns(pattern = null) { } module.exports = [ - ...baseConfig.base, - baseConfig.commonjs, + ...eslintConfigESLintCJS, { ignores: [ "build/**", diff --git a/packages/eslint-config-eslint/base.js b/packages/eslint-config-eslint/base.js new file mode 100644 index 000000000000..1365108390d5 --- /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 000000000000..82569745062e --- /dev/null +++ b/packages/eslint-config-eslint/cjs.js @@ -0,0 +1,9 @@ +"use strict"; + +const baseConfigs = require("./base"); +const { cjsConfigs } = require("./node"); + +module.exports = [ + ...baseConfigs, + ...cjsConfigs +]; diff --git a/packages/eslint-config-eslint/index.js b/packages/eslint-config-eslint/index.js index b753a46fbcef..118421f1edfe 100644 --- a/packages/eslint-config-eslint/index.js +++ b/packages/eslint-config-eslint/index.js @@ -1,416 +1,9 @@ "use strict"; -const nodeRecommendedScriptConfig = require("eslint-plugin-n/configs/recommended-script"); -const nodeRecommendedModuleConfig = require("eslint-plugin-n/configs/recommended-module"); -const js = require("@eslint/js"); -const jsdoc = require("eslint-plugin-jsdoc"); -const eslintComments = require("eslint-plugin-eslint-comments"); -const unicorn = require("eslint-plugin-unicorn"); +const baseConfigs = require("./base"); +const { esmConfigs } = require("./node"); -/* - * 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 config -const nodeSharedRules = { - "n/callback-return": ["error", ["cb", "callback", "next"]], - "n/handle-callback-err": ["error", "err"] -}; -const nodeCommonJSConfig = { - ...nodeRecommendedScriptConfig, - rules: { - ...nodeRecommendedScriptConfig.rules, - ...nodeSharedRules, - "n/no-mixed-requires": "error", - "n/no-new-require": "error", - "n/no-path-concat": "error" - } -}; -const nodeESMConfig = { - ...nodeRecommendedModuleConfig, - rules: { - ...nodeRecommendedModuleConfig.rules, - ...nodeSharedRules - } -}; - -// 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 = { - base: [ - { linterOptions: { reportUnusedDisableDirectives: true } }, - ...jsConfigs, - ...unicornConfigs, - ...jsdocConfigs, - ...eslintCommentsConfigs - ], - commonjs: nodeCommonJSConfig, - esm: nodeESMConfig -}; +module.exports = [ + ...baseConfigs, + ...esmConfigs +]; diff --git a/packages/eslint-config-eslint/node.js b/packages/eslint-config-eslint/node.js new file mode 100644 index 000000000000..368c67dc86b4 --- /dev/null +++ b/packages/eslint-config-eslint/node.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 1a779c1a1ef4..c4a3653d95d3 100644 --- a/packages/eslint-config-eslint/package.json +++ b/packages/eslint-config-eslint/package.json @@ -3,6 +3,11 @@ "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" + }, "scripts": { "test": "node ./index.js", "prepublish": "npm test" @@ -10,8 +15,10 @@ "files": [ "LICENSE", "README.md", + "base.js", + "cjs.js", "index.js", - "default.yml" + "node.js" ], "repository": { "type": "git", @@ -33,6 +40,6 @@ ], "license": "MIT", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } } From 2c767d6441ff56106bfa34dd3b772d31aa68c1c8 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Wed, 5 Jul 2023 13:38:54 +0200 Subject: [PATCH 4/8] update usage in README --- packages/eslint-config-eslint/README.md | 32 +++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/eslint-config-eslint/README.md b/packages/eslint-config-eslint/README.md index 96694d2623cb..5919f4a32cf2 100644 --- a/packages/eslint-config-eslint/README.md +++ b/packages/eslint-config-eslint/README.md @@ -29,15 +29,33 @@ In your `eslint.config.js` file, add: import eslintConfigESLint from "eslint-config-eslint"; export default [ - ...eslintConfigESLint.base, - { + ...eslintConfigESLint +]; +``` + +```js +// ESM project containing .cjs files +import eslintConfigESLint from "eslint-config-eslint"; +import eslintConfigESLintCJS from "eslint-config-eslint/cjs"; + +export default [ + ...eslintConfigESLint.map(config => ({ files: ["**/*.js"], - ...eslintConfigESLint.esm - }, - { + ...config + })), + ...eslintConfigESLintCJS.map(config => ({ files: ["**/*.cjs"], - ...eslintConfigESLint.commonjs - } + ...config + })) +]; +``` + +```js +// CommonJS project +const eslintConfigESLintCJS = require("eslint-config-eslint/cjs"); + +module.exports = [ + ...eslintConfigESLintCJS ]; ``` From b75b9602188824199c246a901e7f683177bd570a Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Wed, 5 Jul 2023 13:59:44 +0200 Subject: [PATCH 5/8] update package.exports --- packages/eslint-config-eslint/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-config-eslint/package.json b/packages/eslint-config-eslint/package.json index c4a3653d95d3..e4b047bdea19 100644 --- a/packages/eslint-config-eslint/package.json +++ b/packages/eslint-config-eslint/package.json @@ -40,6 +40,6 @@ ], "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=16.0.0" } } From 4a411839ad7229d286a589503057053d80abacff Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Wed, 5 Jul 2023 14:58:31 +0200 Subject: [PATCH 6/8] rename file --- packages/eslint-config-eslint/cjs.js | 2 +- packages/eslint-config-eslint/index.js | 2 +- packages/eslint-config-eslint/{node.js => nodejs.js} | 0 packages/eslint-config-eslint/package.json | 4 ++-- 4 files changed, 4 insertions(+), 4 deletions(-) rename packages/eslint-config-eslint/{node.js => nodejs.js} (100%) diff --git a/packages/eslint-config-eslint/cjs.js b/packages/eslint-config-eslint/cjs.js index 82569745062e..61963a39bef8 100644 --- a/packages/eslint-config-eslint/cjs.js +++ b/packages/eslint-config-eslint/cjs.js @@ -1,7 +1,7 @@ "use strict"; const baseConfigs = require("./base"); -const { cjsConfigs } = require("./node"); +const { cjsConfigs } = require("./nodejs"); module.exports = [ ...baseConfigs, diff --git a/packages/eslint-config-eslint/index.js b/packages/eslint-config-eslint/index.js index 118421f1edfe..7ae1d1ef4630 100644 --- a/packages/eslint-config-eslint/index.js +++ b/packages/eslint-config-eslint/index.js @@ -1,7 +1,7 @@ "use strict"; const baseConfigs = require("./base"); -const { esmConfigs } = require("./node"); +const { esmConfigs } = require("./nodejs"); module.exports = [ ...baseConfigs, diff --git a/packages/eslint-config-eslint/node.js b/packages/eslint-config-eslint/nodejs.js similarity index 100% rename from packages/eslint-config-eslint/node.js rename to packages/eslint-config-eslint/nodejs.js diff --git a/packages/eslint-config-eslint/package.json b/packages/eslint-config-eslint/package.json index e4b047bdea19..e685fa99f3d2 100644 --- a/packages/eslint-config-eslint/package.json +++ b/packages/eslint-config-eslint/package.json @@ -9,7 +9,7 @@ "./cjs": "./cjs.js" }, "scripts": { - "test": "node ./index.js", + "test": "node ./index.js && node ./cjs.js", "prepublish": "npm test" }, "files": [ @@ -18,7 +18,7 @@ "base.js", "cjs.js", "index.js", - "node.js" + "nodejs.js" ], "repository": { "type": "git", From 6f71c8efe1f66aff9ad43eaf135bd33b1e8f4be8 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Thu, 6 Jul 2023 13:25:52 +0200 Subject: [PATCH 7/8] add eslintrc export --- packages/eslint-config-eslint/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/eslint-config-eslint/package.json b/packages/eslint-config-eslint/package.json index e685fa99f3d2..ffd1fbceb93a 100644 --- a/packages/eslint-config-eslint/package.json +++ b/packages/eslint-config-eslint/package.json @@ -6,7 +6,8 @@ "exports": { "./package.json": "./package.json", ".": "./index.js", - "./cjs": "./cjs.js" + "./cjs": "./cjs.js", + "./eslintrc": "./eslintrc.js" }, "scripts": { "test": "node ./index.js && node ./cjs.js", From 42ba8dea49d8b02482ada3833eb6a7556f63e4a6 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Fri, 7 Jul 2023 21:19:27 +0200 Subject: [PATCH 8/8] add `files` to simplify usage --- packages/eslint-config-eslint/README.md | 26 +++++++++---------------- packages/eslint-config-eslint/index.js | 11 +++++++++-- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/eslint-config-eslint/README.md b/packages/eslint-config-eslint/README.md index 5919f4a32cf2..645a1938260a 100644 --- a/packages/eslint-config-eslint/README.md +++ b/packages/eslint-config-eslint/README.md @@ -22,10 +22,11 @@ npm install eslint-config-eslint --save-dev ## Usage +### ESM (`"type":"module"`) projects + In your `eslint.config.js` file, add: ```js -// ESM project import eslintConfigESLint from "eslint-config-eslint"; export default [ @@ -33,25 +34,16 @@ export default [ ]; ``` -```js -// ESM project containing .cjs files -import eslintConfigESLint from "eslint-config-eslint"; -import eslintConfigESLintCJS from "eslint-config-eslint/cjs"; +**Note**: This configuration array contains configuration objects with the `files` property. -export default [ - ...eslintConfigESLint.map(config => ({ - files: ["**/*.js"], - ...config - })), - ...eslintConfigESLintCJS.map(config => ({ - files: ["**/*.cjs"], - ...config - })) -]; -``` +* `files: ["**/*.js"]`: ESM-specific configurations. +* `files: ["**/*.cjs"]`: CommonJS-specific configurations. + +### CommonJS projects + +In your `eslint.config.js` file, add: ```js -// CommonJS project const eslintConfigESLintCJS = require("eslint-config-eslint/cjs"); module.exports = [ diff --git a/packages/eslint-config-eslint/index.js b/packages/eslint-config-eslint/index.js index 7ae1d1ef4630..8717218efe7d 100644 --- a/packages/eslint-config-eslint/index.js +++ b/packages/eslint-config-eslint/index.js @@ -1,9 +1,16 @@ "use strict"; const baseConfigs = require("./base"); -const { esmConfigs } = require("./nodejs"); +const { esmConfigs, cjsConfigs } = require("./nodejs"); module.exports = [ ...baseConfigs, - ...esmConfigs + ...esmConfigs.map(config => ({ + files: ["**/*.js"], + ...config + })), + ...cjsConfigs.map(config => ({ + files: ["**/*.cjs"], + ...config + })) ];