UNPKG

eslint-config-webpack

Version:

Provides Webpack's eslint rules as an extensible shared config

298 lines (242 loc) 5.78 kB
import globals from "globals"; import importPlugin from "eslint-plugin-import"; const commonRules = { // No need // "n/callback-return": "error", // Depends on `sourceType` and enabled below only for commonjs // "n/exports-style": "error", // We have the `import/extensions` rule "n/file-extension-in-import": "off", // There is no need, as in some cases we want to load a module lazily. // "n/global-require": "error", // No need // "n/handle-callback-err": "error" // From recommended // "n/hashbang": "error", // No need // "n/no-callback-literal": "error", // From recommended // "n/no-deprecated-api": "error", // From recommended // "n/no-exports-assign": "error", // From recommended // "n/no-extraneous-import": "error", // From recommended // "n/no-extraneous-require": "error", // Deprecated // "n/no-hide-core-modules": "error", // From recommended // "n/no-missing-import": "error", // From recommended // "n/no-missing-require": "error", // No need // "n/no-mixed-requires": "error", // No need // "n/no-new-require": "error", // Depends on `sourceType` and enabled below only for commonjs // "n/no-path-concat": "error", // No need // "n/no-process-env": "error", // From recommended // "n/no-process-exit": "error", // No need // "n/no-restricted-import": ["error", []], // No need // "n/no-restricted-require": ["error", []] // No need // "n/no-sync": "error", // No need // "n/no-top-level-await": "error", // From recommended // "n/no-unpublished-bin": "error", // From recommended // "n/no-unpublished-import": "error", // From recommended // "n/no-unpublished-require": "error", // From recommended // "n/no-unsupported-features/es-builtins": "error", // From recommended // "n/no-unsupported-features/es-syntax": "error", // From recommended // "n/no-unsupported-features/node-builtins": "error", "n/prefer-global/buffer": ["error", "always"], "n/prefer-global/console": ["error", "always"], "n/prefer-global/process": ["error", "always"], "n/prefer-global/text-decoder": ["error", "always"], "n/prefer-global/text-encoder": ["error", "always"], "n/prefer-global/url": ["error", "always"], "n/prefer-global/url-search-params": ["error", "always"], "n/prefer-node-protocol": "error", // No need // "n/prefer-promises/dns": "error", // No need // "n/prefer-promises/fs": "error", // From recommended // "n/process-exit-as-throw": "error", }; let nodePlugin; /** * @returns {Promise<Record<string, string>>} config */ async function getCommonJSConfig() { if (!nodePlugin) { try { nodePlugin = (await import("eslint-plugin-n")).default; // eslint-disable-next-line unicorn/prefer-optional-catch-binding } catch (_err) { // Nothing } } const nodeConfig = (nodePlugin && nodePlugin.configs["flat/recommended-script"]) || {}; return { ...nodeConfig, name: "node/commonjs", plugins: { ...nodeConfig.plugins, import: importPlugin, }, rules: { ...commonRules, "n/exports-style": "error", "n/no-path-concat": "error", "import/extensions": [ "error", "never", { ignorePackages: true, pattern: { ts: "always", cts: "always", mts: "always", tsx: "always", }, }, ], }, }; } /** * @returns {Promise<Record<string, string>>} config */ async function getModuleConfig() { let nodePlugin; if (!nodePlugin) { try { nodePlugin = (await import("eslint-plugin-n")).default; // eslint-disable-next-line unicorn/prefer-optional-catch-binding } catch (_err) { // Nothing } } const nodeConfig = (nodePlugin && nodePlugin.configs["flat/recommended-module"]) || {}; return { ...nodeConfig, name: "node/module", plugins: { ...nodeConfig.plugins, import: importPlugin, }, rules: { ...commonRules, "import/extensions": [ "error", "always", { ignorePackages: true, checkTypeImports: true }, ], }, }; } const commonjsConfig = await getCommonJSConfig(); const moduleConfig = await getModuleConfig(); /** * @returns {Promise<Record<string, string>>} config */ async function getDirtyConfig() { let nodePlugin; if (!nodePlugin) { try { nodePlugin = (await import("eslint-plugin-n")).default; // eslint-disable-next-line unicorn/prefer-optional-catch-binding } catch (_err) { // Nothing } } return { name: "node/dirty", plugins: { n: nodePlugin, import: importPlugin, }, languageOptions: { sourceType: "module", parserOptions: { ecmaFeatures: { globalReturn: true }, }, globals: { ...globals.node, __dirname: "readonly", __filename: "readonly", exports: "writable", module: "readonly", require: "readonly", }, }, rules: { ...commonjsConfig.rules, ...moduleConfig.rules, // Disable for dirty modules "import/extensions": ["off"], }, }; } const dirtyConfig = await getDirtyConfig(); export default { "node/dirty": dirtyConfig, "node/commonjs": commonjsConfig, "node/module": moduleConfig, "node/recommended": moduleConfig, "node/mixed-dirty": [ { files: ["**/*.{js,jsx,ts,tsx}"], ...dirtyConfig, }, { files: ["**/*.{cjs,cts}"], ...commonjsConfig, }, { files: ["**/*.{mjs,mts}"], ...moduleConfig, }, ], "node/mixed-module-and-commonjs": [ { files: ["**/*.{js,jsx,ts,tsx}"], ...moduleConfig, }, { files: ["**/*.{cjs,cts}"], ...commonjsConfig, }, { files: ["**/*.{mjs,mts}"], ...moduleConfig, }, ], "node/mixed-commonjs-and-module": [ { files: ["**/*.{js,jsx,ts,tsx}"], ...commonjsConfig, }, { files: ["**/*.{cjs,cts}"], ...commonjsConfig, }, { files: ["**/*.{mjs,mts}"], ...moduleConfig, }, ], };