diff --git a/lib/configs/recommended-env.js b/lib/configs/recommended-env.js new file mode 100644 index 00000000..82577013 --- /dev/null +++ b/lib/configs/recommended-env.js @@ -0,0 +1,46 @@ +"use strict" + +const globals = require("globals") +const { getPackageJson } = require("../util/get-package-json") + +const packageJson = getPackageJson() + +const isModule = + packageJson != null && + typeof packageJson === "object" && + "type" in packageJson && + packageJson.type === "module" + +const moduleEnv = { + name: "node/env/module", + languageOptions: { + globals: { + ...globals.nodeBuiltin, + }, + }, +} + +const scriptEnv = { + name: "node/env/script", + languageOptions: { + globals: { + ...globals.node, + }, + }, +} + +const recommendedEnv = [ + { + ...(isModule ? { ignores: ["**/*.cjs"] } : { files: ["**/*.mjs"] }), + ...moduleEnv, + }, + { + ...(isModule ? { files: ["**/*.cjs"] } : { ignores: ["**/*.mjs"] }), + ...scriptEnv, + }, +] + +module.exports = { + isModule, + recommendedEnv, +} diff --git a/lib/configs/recommended-mixed.js b/lib/configs/recommended-mixed.js new file mode 100644 index 00000000..75e12aa9 --- /dev/null +++ b/lib/configs/recommended-mixed.js @@ -0,0 +1,16 @@ +"use strict" + +const { commonRules } = require("./_commons") +const { recommendedEnv } = require("./recommended-env") + +/** + * https://eslint.org/docs/latest/use/configure/configuration-files-new + * @type {import('eslint').Linter.FlatConfig[]} + */ +module.exports = [ + ...recommendedEnv, + { + name: "node/recommended", + rules: commonRules, + }, +] diff --git a/lib/configs/recommended.js b/lib/configs/recommended.js index 073c9102..e3e52c09 100644 --- a/lib/configs/recommended.js +++ b/lib/configs/recommended.js @@ -1,16 +1,9 @@ "use strict" -const { getPackageJson } = require("../util/get-package-json") +const { isModule } = require("./recommended-env") const moduleConfig = require("./recommended-module") const scriptConfig = require("./recommended-script") -const packageJson = getPackageJson() - -const isModule = - packageJson != null && - typeof packageJson === "object" && - "type" in packageJson && - packageJson.type === "module" const recommendedConfig = isModule ? moduleConfig : scriptConfig /** diff --git a/lib/index.js b/lib/index.js index 49fd4c71..5f938097 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,15 +1,21 @@ "use strict" const pkg = require("../package.json") +const { recommendedEnv } = require("./configs/recommended-env") +const mixedConfig = require("./configs/recommended-mixed") const esmConfig = require("./configs/recommended-module") const cjsConfig = require("./configs/recommended-script") const recommendedConfig = require("./configs/recommended") +const recommendedMixed = structuredClone(mixedConfig) + /** * @typedef {{ 'recommended-module': import('eslint').ESLint.ConfigData; 'recommended-script': import('eslint').ESLint.ConfigData; 'recommended': import('eslint').ESLint.ConfigData; + 'flat/recommended-env': import('eslint').Linter.FlatConfig[]; + 'flat/recommended-mixed': import('eslint').Linter.FlatConfig[]; 'flat/recommended-module': import('eslint').Linter.FlatConfig; 'flat/recommended-script': import('eslint').Linter.FlatConfig; 'flat/recommended': import('eslint').Linter.FlatConfig; @@ -71,23 +77,18 @@ const plugin = { "recommended-module": { plugins: ["n"], ...esmConfig.eslintrc }, "recommended-script": { plugins: ["n"], ...cjsConfig.eslintrc }, recommended: { plugins: ["n"], ...recommendedConfig.eslintrc }, + "flat/recommended-env": structuredClone(recommendedEnv), + "flat/recommended-mixed": recommendedMixed, "flat/recommended-module": { ...esmConfig.flat }, "flat/recommended-script": { ...cjsConfig.flat }, "flat/recommended": { ...recommendedConfig.flat }, - "flat/mixed-esm-and-cjs": [ - { files: ["**/*.js"], ...recommendedConfig.flat }, - { files: ["**/*.mjs"], ...esmConfig.flat }, - { files: ["**/*.cjs"], ...cjsConfig.flat }, - ], + "flat/mixed-esm-and-cjs": recommendedMixed, }, } plugin.configs["flat/recommended-module"].plugins = { n: plugin } plugin.configs["flat/recommended-script"].plugins = { n: plugin } plugin.configs["flat/recommended"].plugins = { n: plugin } - -for (const config of plugin.configs["flat/mixed-esm-and-cjs"]) { - config.plugins = { n: plugin } -} +recommendedMixed[recommendedMixed.length - 1].plugins = { n: plugin } module.exports = plugin