UNPKG

@minko-fe/eslint-config

Version:
1,253 lines (1,229 loc) 38.8 kB
'use strict'; var _pluginAntfu = require('eslint-plugin-antfu'); var _pluginComments = require('eslint-plugin-eslint-comments'); var _pluginMarkdown = require('eslint-plugin-markdown'); var _pluginUnicorn = require('eslint-plugin-unicorn'); var _pluginVue = require('eslint-plugin-vue'); var _pluginReact = require('eslint-plugin-react'); var _pluginReactHooks = require('eslint-plugin-react-hooks'); var pluginImport = require('eslint-plugin-import-x'); var pluginJsonc = require('eslint-plugin-jsonc'); var _pluginPerfectionist = require('eslint-plugin-perfectionist'); var _pluginUnusedImports = require('eslint-plugin-unused-imports'); var pluginYml = require('eslint-plugin-yml'); var parserJsonc = require('jsonc-eslint-parser'); var parserVue = require('vue-eslint-parser'); var parserYml = require('yaml-eslint-parser'); var _pluginNode = require('eslint-plugin-n'); var _pluginPrettier = require('eslint-plugin-prettier'); var _configPrettier = require('eslint-config-prettier'); var tseslint = require('typescript-eslint'); var _pluginAstro = require('eslint-plugin-astro'); var _parserAstro = require('astro-eslint-parser'); var findUp = require('find-up'); var fs = require('fs'); var parseGitignore = require('parse-gitignore'); var globals = require('globals'); var localPkg = require('local-pkg'); var process2 = require('process'); var prettierConfig = require('@minko-fe/prettier-config'); var consola = require('consola'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var _pluginAntfu__namespace = /*#__PURE__*/_interopNamespace(_pluginAntfu); var _pluginComments__namespace = /*#__PURE__*/_interopNamespace(_pluginComments); var _pluginMarkdown__namespace = /*#__PURE__*/_interopNamespace(_pluginMarkdown); var _pluginUnicorn__namespace = /*#__PURE__*/_interopNamespace(_pluginUnicorn); var _pluginVue__namespace = /*#__PURE__*/_interopNamespace(_pluginVue); var _pluginReact__namespace = /*#__PURE__*/_interopNamespace(_pluginReact); var _pluginReactHooks__namespace = /*#__PURE__*/_interopNamespace(_pluginReactHooks); var pluginImport__namespace = /*#__PURE__*/_interopNamespace(pluginImport); var pluginJsonc__namespace = /*#__PURE__*/_interopNamespace(pluginJsonc); var _pluginPerfectionist__namespace = /*#__PURE__*/_interopNamespace(_pluginPerfectionist); var _pluginUnusedImports__namespace = /*#__PURE__*/_interopNamespace(_pluginUnusedImports); var pluginYml__namespace = /*#__PURE__*/_interopNamespace(pluginYml); var parserJsonc__namespace = /*#__PURE__*/_interopNamespace(parserJsonc); var parserVue__namespace = /*#__PURE__*/_interopNamespace(parserVue); var parserYml__namespace = /*#__PURE__*/_interopNamespace(parserYml); var _pluginNode__namespace = /*#__PURE__*/_interopNamespace(_pluginNode); var _pluginPrettier__namespace = /*#__PURE__*/_interopNamespace(_pluginPrettier); var _configPrettier__namespace = /*#__PURE__*/_interopNamespace(_configPrettier); var tseslint__default = /*#__PURE__*/_interopDefault(tseslint); var _pluginAstro__namespace = /*#__PURE__*/_interopNamespace(_pluginAstro); var _parserAstro__namespace = /*#__PURE__*/_interopNamespace(_parserAstro); var findUp__default = /*#__PURE__*/_interopDefault(findUp); var fs__default = /*#__PURE__*/_interopDefault(fs); var parseGitignore__default = /*#__PURE__*/_interopDefault(parseGitignore); var globals__default = /*#__PURE__*/_interopDefault(globals); var process2__default = /*#__PURE__*/_interopDefault(process2); var prettierConfig__default = /*#__PURE__*/_interopDefault(prettierConfig); // utils/index.ts function interopDefault(m) { return "default" in m ? interopDefault(m.default) : m; } // configs/astro.ts async function resolveAstro() { const eslintPluginAstro = interopDefault(await import('eslint-plugin-astro')); return [...eslintPluginAstro.configs["flat/recommended"]]; } var pluginAntfu = interopDefault(_pluginAntfu__namespace); var pluginComments = interopDefault(_pluginComments__namespace); var pluginMarkdown = interopDefault(_pluginMarkdown__namespace); var pluginUnicorn = interopDefault(_pluginUnicorn__namespace); var pluginVue = interopDefault(_pluginVue__namespace); var pluginReact = interopDefault(_pluginReact__namespace); var pluginReactHooks = interopDefault(_pluginReactHooks__namespace); var pluginPerfectionist = interopDefault(_pluginPerfectionist__namespace); var pluginUnusedImports = interopDefault(_pluginUnusedImports__namespace); var pluginNode = interopDefault(_pluginNode__namespace); var pluginPrettier = interopDefault(_pluginPrettier__namespace); var configPrettier = interopDefault(_configPrettier__namespace); var pluginAstro = interopDefault(_pluginAstro__namespace); var parserAstro = interopDefault(_parserAstro__namespace); // configs/comments.ts var comments = [ { plugins: { "eslint-comments": pluginComments }, rules: { ...pluginComments.configs.recommended.rules, "eslint-comments/disable-enable-pair": "off", "eslint-comments/no-aggregating-enable": "error", "eslint-comments/no-duplicate-disable": "error", "eslint-comments/no-unlimited-disable": "off", "eslint-comments/no-unused-enable": "error" } } ]; // globs.ts var GLOB_SRC_EXT = "?([cm])[jt]s?(x)"; var GLOB_SRC = "**/*.?([cm])[jt]s?(x)"; var GLOB_JS = "**/*.?([cm])js"; var GLOB_JSX = "**/*.?([cm])jsx"; var GLOB_TS = "**/*.?([cm])ts"; var GLOB_TSX = "**/*.?([cm])tsx"; var GLOB_ASTRO = "**/*.astro"; var GLOB_SVELTE = "**/*.svelte"; var GLOB_STYLE = "**/*.{c,le,sc}ss"; var GLOB_CSS = "**/*.css"; var GLOB_LESS = "**/*.less"; var GLOB_SCSS = "**/*.scss"; var GLOB_JSON = "**/*.json"; var GLOB_JSON5 = "**/*.json5"; var GLOB_JSONC = "**/*.jsonc"; var GLOB_MARKDOWN = "**/*.md"; var GLOB_VUE = "**/*.vue"; var GLOB_YAML = "**/*.y?(a)ml"; var GLOB_HTML = "**/*.htm?(l)"; var GLOB_ALL_SRC = ( /** @type {const} */ [ GLOB_SRC, GLOB_STYLE, GLOB_JSON, GLOB_JSON5, GLOB_MARKDOWN, GLOB_VUE, GLOB_YAML, GLOB_HTML ] ); var GLOB_TSCONFIG = ( /** @type {const} */ ["**/tsconfig.json", "**/tsconfig.*.json"] ); var GLOB_PACKAGEJSON = ( /** @type {const} */ "**/package.json" ); var GLOB_NODE_MODULES = ( /** @type {const} */ "**/node_modules" ); var GLOB_DIST = ( /** @type {const} */ "**/dist" ); var GLOB_LOCKFILE = ( /** @type {const} */ [ "**/package-lock.json", "**/yarn.lock", "**/pnpm-lock.yaml", "**/bun.lockb" ] ); var GLOB_EXCLUDE = ( /** @type {const} */ [ GLOB_NODE_MODULES, GLOB_DIST, ...GLOB_LOCKFILE, "**/public", "**/output", "**/coverage", "**/temp", "**/fixtures", "**/.vitepress/cache", "**/.next", "**/.nuxt", "**/.vercel", "**/.changeset", "**/.turbo", "**/.cache", "**/.tsup", "**/.idea", "**/.output", "**/.vite-inspect", "**/.astro", "**/.svelte-kit", "**/.react-router", "**/CHANGELOG*.md", "**/*.min.*", "**/LICENSE*", "**/__snapshots__", "**/auto-import?(s).d.ts", "**/components.d.ts" ] ); // configs/ignores.ts var parse = interopDefault(parseGitignore__default.default); function gitignore(options = {}) { const ignores2 = []; const { files: _files = ".gitignore" } = options; const files = Array.isArray(_files) ? _files : [_files]; for (const file of files) { const _file = findUp__default.default.sync(file); if (!_file) continue; const content = fs__default.default.readFileSync(_file, "utf8"); const parsed = parse(content); const globs = parsed.globs(); for (const glob of globs) { if (glob.type === "ignore") ignores2.push(...glob.patterns); else if (glob.type === "unignore") ignores2.push(...glob.patterns.map((pattern) => `!${pattern}`)); } } return { ignores: ignores2 }; } var ignores = [{ ignores: GLOB_EXCLUDE }]; var gitignores = [{ ignores: gitignore().ignores }]; // configs/imports.ts var imports = [ { plugins: { antfu: pluginAntfu, import: pluginImport__namespace }, rules: { "antfu/import-dedupe": "error", "import/first": "error", "import/namespace": "off", "import/no-absolute-path": "off", "import/no-default-export": "off", "import/no-duplicates": ["error"], "import/no-mutable-exports": "off", "import/no-named-default": "off", "import/no-self-import": "error", "import/no-unresolved": "off", "import/no-webpack-loader-syntax": "error", "import/order": "off" } }, { files: [ `**/src/${GLOB_SRC}`, `**/*config*.${GLOB_SRC_EXT}`, `**/{views,pages,routes,middleware,plugins,api}/${GLOB_SRC}`, `**/{index,vite,esbuild,rollup,rolldown,webpack,rspack}.ts`, "**/*.d.ts", `${GLOB_MARKDOWN}/**`, "**/.prettierrc*" ], plugins: { import: pluginImport__namespace }, rules: { "import/no-default-export": "off" } } ]; var isInEditor = !!((process2__default.default.env.VSCODE_PID || process2__default.default.env.VSCODE_CWD || process2__default.default.env.JETBRAINS_IDE || process2__default.default.env.VIM) && !process2__default.default.env.CI); var hasTypeScript = localPkg.isPackageExists("typescript"); var hasVue = ["vue", "nuxt", "vitepress", "@slidev/cli"].some((t) => localPkg.isPackageExists(t)); var hasReact = ["react", "next"].some((t) => localPkg.isPackageExists(t)); var hasSvelte = ["svelte", "svelte-kit", "@sveltejs/kit"].some((t) => localPkg.isPackageExists(t)); var hasSveltePrettier = localPkg.isPackageExists("prettier-plugin-svelte"); var hasAstro = ["astro", "@astrojs/check"].some((t) => localPkg.isPackageExists(t)); var hasAstroPrettier = localPkg.isPackageExists("prettier-plugin-astro"); var hasTailwindcss = localPkg.isPackageExists("tailwindcss"); var hasTailwindcssPrettire = localPkg.isPackageExists("prettier-plugin-tailwindcss"); // configs/javascript.ts var javascript = [ { languageOptions: { globals: { ...globals__default.default.browser, ...globals__default.default.es2021, ...globals__default.default.node }, parserOptions: { ecmaFeatures: { jsx: true }, sourceType: "module" }, sourceType: "module" }, plugins: { "unused-imports": pluginUnusedImports }, rules: { "array-callback-return": "error", "block-scoped-var": "error", "consistent-return": "off", "constructor-super": "error", "dot-notation": "off", "eqeqeq": ["error", "smart"], "for-direction": "error", "getter-return": "error", "no-alert": "warn", "no-async-promise-executor": "off", "no-case-declarations": "error", "no-class-assign": "error", "no-compare-neg-zero": "error", "no-cond-assign": "error", "no-console": "off", "no-const-assign": "error", "no-constant-condition": "off", "no-control-regex": "error", "no-debugger": "warn", "no-delete-var": "error", "no-dupe-args": "error", "no-dupe-class-members": "error", "no-dupe-else-if": "error", "no-dupe-keys": "error", "no-duplicate-case": "error", "no-duplicate-imports": "off", "no-empty": ["error", { allowEmptyCatch: true }], "no-empty-character-class": "error", "no-empty-pattern": "off", "no-ex-assign": "error", "no-extra-boolean-cast": "error", "no-fallthrough": ["warn", { commentPattern: "break[\\s\\w]*omitted" }], "no-func-assign": "error", "no-global-assign": "error", "no-import-assign": "error", "no-inner-declarations": "off", "no-invalid-regexp": "error", "no-irregular-whitespace": "error", "no-lonely-if": "off", "no-loss-of-precision": "error", "no-misleading-character-class": "error", "no-mixed-spaces-and-tabs": "error", "no-multi-str": "error", "no-new-symbol": "error", "no-nonoctal-decimal-escape": "error", "no-obj-calls": "error", "no-octal": "error", "no-prototype-builtins": "error", "no-redeclare": "error", "no-regex-spaces": "error", "no-restricted-syntax": "off", "no-return-assign": "off", "no-return-await": "off", "no-self-assign": "error", "no-setter-return": "error", "no-shadow-restricted-names": "error", "no-sparse-arrays": "error", "no-this-before-super": "error", "no-undef": "error", "no-unexpected-multiline": "error", "no-unreachable": "error", "no-unsafe-finally": "error", "no-unsafe-negation": "error", "no-unsafe-optional-chaining": "error", "no-unused-expressions": [ "error", { allowShortCircuit: true, allowTaggedTemplates: true, allowTernary: true } ], "no-unused-labels": "error", "no-unused-vars": "off", "no-useless-backreference": "error", "no-useless-catch": "error", "no-useless-escape": "off", "no-var": "off", "no-void": "error", "no-with": "error", "object-shorthand": ["error", "always", { avoidQuotes: true, ignoreConstructors: false }], "operator-linebreak": "off", "prefer-arrow-callback": ["error", { allowNamedFunctions: false, allowUnboundThis: true }], "prefer-const": ["warn", { destructuring: "all", ignoreReadBeforeAssign: true }], "prefer-exponentiation-operator": "error", "prefer-regex-literals": ["error", { disallowRedundantWrapping: true }], "prefer-rest-params": "error", "prefer-spread": "error", "prefer-template": "error", "require-await": "off", "require-yield": "error", "unicode-bom": ["error", "never"], "unused-imports/no-unused-imports": isInEditor ? "warn" : "error", "unused-imports/no-unused-vars": [ "warn", { args: "after-used", argsIgnorePattern: "^_", destructuredArrayIgnorePattern: "^_", ignoreRestSiblings: true, varsIgnorePattern: "^_" } ], "use-isnan": ["error", { enforceForIndexOf: true, enforceForSwitchCase: true }], "valid-typeof": ["error", { requireStringLiterals: true }], "vars-on-top": "off", "wrap-iife": ["error", "any", { functionPrototypeMethods: true }] } }, { files: ["**/scripts/*", "**/cli.*"], rules: { "no-console": "off" } }, { files: ["**/*.{test,spec}.js?(x)"], rules: { "no-unused-expressions": "off" } } ]; // configs/jsonc.ts var jsonc = [ { files: [GLOB_JSON, GLOB_JSON5, GLOB_JSONC], languageOptions: { parser: parserJsonc__namespace }, plugins: { jsonc: pluginJsonc__namespace }, rules: { ...pluginJsonc__namespace.configs["recommended-with-jsonc"].rules, "jsonc/quote-props": "off", "jsonc/quotes": "off" } } ]; // configs/markdown.ts var markdown = [ ...pluginMarkdown.configs.recommended, { files: [`${GLOB_MARKDOWN}/${GLOB_SRC}`, `${GLOB_MARKDOWN}/${GLOB_VUE}`], rules: { "@typescript-eslint/comma-dangle": "off", "@typescript-eslint/consistent-type-imports": "off", "@typescript-eslint/no-extraneous-class": "off", "@typescript-eslint/no-invalid-void-type": "off", "@typescript-eslint/no-namespace": "off", "@typescript-eslint/no-redeclare": "off", "@typescript-eslint/no-require-imports": "off", "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-use-before-define": "off", "@typescript-eslint/no-var-requires": "off", "no-alert": "off", "no-console": "off", "no-restricted-imports": "off", "no-undef": "off", "no-unused-expressions": "off", "no-unused-vars": "off", "react/jsx-no-comment-textnodes": "off", "react/jsx-no-undef": "off", "unused-imports/no-unused-imports": "off", "unused-imports/no-unused-vars": "off" } } ]; // configs/node.ts var node = [ { plugins: { node: pluginNode }, rules: { "node/handle-callback-err": ["error", "^(err|error)$"], "node/no-deprecated-api": "off", "node/no-exports-assign": "error", "node/no-new-require": "error", "node/no-path-concat": "error", "node/no-unsupported-features/es-builtins": "error", "node/process-exit-as-throw": "error" } } ]; // configs/perfectionist.ts var sortImports = [ { plugins: { perfectionist: pluginPerfectionist }, rules: { "perfectionist/sort-imports": [ "error", { customGroups: { type: { react: ["react", "react-*"] }, value: { react: ["react", "react-*"] } }, groups: [ "type", "react", ["builtin", "external"], "internal-type", "internal", ["parent-type", "sibling-type", "index-type"], ["parent", "sibling", "index"], "side-effect", "style", "object", "unknown" ], internalPattern: ["^[~@#]/.*"], newlinesBetween: "never", order: "asc", type: "natural" } ], "perfectionist/sort-named-imports": [ "error", { order: "asc", type: "natural" } ] } } ]; var sortObjects = [ { files: [GLOB_SRC], plugins: { perfectionist: pluginPerfectionist }, rules: { "perfectionist/sort-objects": "error" } } ]; var prettierConflictRules = { ...configPrettier.rules }; delete prettierConflictRules["vue/html-self-closing"]; var prettier = [ { plugins: { prettier: pluginPrettier }, rules: { ...prettierConflictRules, ...pluginPrettier.configs.recommended.rules, "prettier/prettier": ["warn", interopDefault(prettierConfig__default.default)] } } ]; // configs/react.ts var react = [ { files: [GLOB_JSX, GLOB_TSX], languageOptions: { ...pluginReact.configs.flat?.["jsx-runtime"].languageOptions, ecmaVersion: "latest", sourceType: "module" }, plugins: { ...pluginReact.configs.flat?.recommended.plugins }, rules: { ...pluginReact.configs.flat?.recommended.rules, ...pluginReact.configs.flat?.["jsx-runtime"].rules, "react/display-name": "off", "react/jsx-child-element-spacing": "off", "react/jsx-closing-tag-location": "off", "react/jsx-key": "off", "react/jsx-no-target-blank": "off", "react/no-danger": "off", "react/no-unescaped-entities": "off", "react/prop-types": "off", "react/react-in-jsx-scope": "off" }, settings: { react: { version: "detect" } } }, { files: [GLOB_JSX, GLOB_TSX], plugins: { "react-hooks": pluginReactHooks }, rules: { ...pluginReactHooks.configs.recommended.rules, "react-hooks/exhaustive-deps": "off" } } ]; // configs/sort.ts var sortPackageJson = [ { files: [GLOB_PACKAGEJSON], rules: { "jsonc/sort-array-values": [ "error", { order: { type: "asc" }, pathPattern: "^files$" } ], "jsonc/sort-keys": [ "error", { order: [ "name", "version", "private", "packageManager", "description", "type", "keywords", "license", "homepage", "bugs", "repository", "author", "contributors", "funding", "files", "main", "module", "types", "exports", "typesVersions", "sideEffects", "unpkg", "jsdelivr", "browser", "bin", "man", "directories", "publishConfig", "scripts", "peerDependencies", "peerDependenciesMeta", "optionalDependencies", "dependencies", "devDependencies", "engines", "config", "overrides", "pnpm", "husky", "lint-staged", "eslintConfig", "prettier" ], pathPattern: "^$" }, { order: { type: "asc" }, pathPattern: "^(?:dev|peer|optional|bundled)?[Dd]ependencies$" }, { order: ["types", "require", "import", "default"], pathPattern: "^exports.*$" }, { order: { type: "asc" }, pathPattern: "^resolutions$" }, { order: { type: "asc" }, pathPattern: "^pnpm.overrides$" } ] } } ]; var sortTsconfig = [ { files: GLOB_TSCONFIG, rules: { "jsonc/sort-keys": [ "error", { order: ["extends", "compilerOptions", "references", "files", "include", "exclude"], pathPattern: "^$" }, { order: [ /* Projects */ "incremental", "composite", "tsBuildInfoFile", "disableSourceOfProjectReferenceRedirect", "disableSolutionSearching", "disableReferencedProjectLoad", /* Language and Environment */ "target", "lib", "jsx", "experimentalDecorators", "emitDecoratorMetadata", "jsxFactory", "jsxFragmentFactory", "jsxImportSource", "reactNamespace", "noLib", "useDefineForClassFields", "moduleDetection", /* Modules */ "module", "rootDir", "moduleResolution", "baseUrl", "paths", "rootDirs", "typeRoots", "types", "allowUmdGlobalAccess", "moduleSuffixes", "allowImportingTsExtensions", "resolvePackageJsonExports", "resolvePackageJsonImports", "customConditions", "resolveJsonModule", "allowArbitraryExtensions", "noResolve", /* JavaScript Support */ "allowJs", "checkJs", "maxNodeModuleJsDepth", /* Emit */ "declaration", "declarationMap", "emitDeclarationOnly", "sourceMap", "inlineSourceMap", "outFile", "outDir", "removeComments", "noEmit", "importHelpers", "importsNotUsedAsValues", "downlevelIteration", "sourceRoot", "mapRoot", "inlineSources", "emitBOM", "newLine", "stripInternal", "noEmitHelpers", "noEmitOnError", "preserveConstEnums", "declarationDir", "preserveValueImports", /* Interop Constraints */ "isolatedModules", "verbatimModuleSyntax", "allowSyntheticDefaultImports", "esModuleInterop", "preserveSymlinks", "forceConsistentCasingInFileNames", /* Type Checking */ "strict", "strictBindCallApply", "strictFunctionTypes", "strictNullChecks", "strictPropertyInitialization", "allowUnreachableCode", "allowUnusedLabels", "alwaysStrict", "exactOptionalPropertyTypes", "noFallthroughCasesInSwitch", "noImplicitAny", "noImplicitOverride", "noImplicitReturns", "noImplicitThis", "noPropertyAccessFromIndexSignature", "noUncheckedIndexedAccess", "noUnusedLocals", "noUnusedParameters", "useUnknownInCatchVariables", /* Completeness */ "skipDefaultLibCheck", "skipLibCheck" ], pathPattern: "^compilerOptions$" } ] } } ]; // configs/svelte.ts async function asyncSvelte() { const eslintPluginSvelte = interopDefault(await import('eslint-plugin-svelte')); return [...eslintPluginSvelte.configs["flat/recommended"]]; } // configs/typescript.ts var typescriptCore = tseslint__default.default.config({ extends: [...tseslint__default.default.configs.recommended], files: [GLOB_TS, GLOB_TSX], languageOptions: { parser: tseslint__default.default.parser, parserOptions: { sourceType: "module" } }, rules: { "@typescript-eslint/ban-ts-comment": "off", "@typescript-eslint/ban-ts-ignore": "off", "@typescript-eslint/ban-types": "off", "@typescript-eslint/brace-style": "off", "@typescript-eslint/comma-dangle": "off", "@typescript-eslint/consistent-indexed-object-style": "off", "@typescript-eslint/consistent-type-assertions": "off", "@typescript-eslint/consistent-type-definitions": "off", "@typescript-eslint/consistent-type-imports": [ "error", { disallowTypeAnnotations: false, fixStyle: "inline-type-imports" } ], "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/explicit-member-accessibility": "off", "@typescript-eslint/explicit-module-boundary-types": "off", "@typescript-eslint/method-signature-style": ["error", "property"], // https://www.totaltypescript.com/method-shorthand-syntax-considered-harmful "@typescript-eslint/naming-convention": [ "error", { custom: { match: false, // no $ prefix regex: "^\\$[a-zA-Z][\\w\\d]*$" }, format: null, selector: ["variable", "variableLike"] } ], "@typescript-eslint/no-dynamic-delete": "off", "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-extra-semi": "off", "@typescript-eslint/no-extraneous-class": "off", "@typescript-eslint/no-floating-promises": "off", "@typescript-eslint/no-import-type-side-effects": "off", "@typescript-eslint/no-invalid-void-type": "off", "@typescript-eslint/no-namespace": "off", "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-redeclare": "error", "@typescript-eslint/no-require-imports": "off", "@typescript-eslint/no-unsafe-function-type": "off", "@typescript-eslint/no-unused-expressions": "off", // handled by unused-imports/no-unused-imports "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-use-before-define": "off", "@typescript-eslint/no-var-requires": "off", "@typescript-eslint/parameter-properties": "off", "@typescript-eslint/prefer-as-const": "warn", "@typescript-eslint/prefer-literal-enum-member": ["error", { allowBitwiseExpressions: true }], "@typescript-eslint/quotes": "off", "@typescript-eslint/semi": "off", "@typescript-eslint/triple-slash-reference": "off", "no-restricted-syntax": "off", "no-var": "off", "prefer-const": ["warn", { destructuring: "all", ignoreReadBeforeAssign: true }] } }); var typescript = [ ...typescriptCore, { files: ["**/*.d.ts"], rules: { "eslint-comments/no-unlimited-disable": "off", "import/no-duplicates": "off", "no-restricted-syntax": "off", "no-var": "off", "unused-imports/no-unused-vars": "off", "vars-on-top": "off" } }, { files: ["**/*.{test,spec}.ts?(x)"], rules: { "no-unused-expressions": "off" } }, { files: [GLOB_JS, "**/*.cjs"], rules: {} } ]; // configs/unicorn.ts var unicorn = [ { plugins: { unicorn: pluginUnicorn }, rules: { // Pass error message when throwing errors "unicorn/error-message": "error", // Uppercase regex escapes "unicorn/escape-case": "error", // Prevent deprecated `new Buffer()` "unicorn/no-new-buffer": "error", // Lowercase number formatting for octal, hex, binary (0x1'error' instead of 0X1'error') "unicorn/number-literal-case": "error", // Prefer using the node: protocol "unicorn/prefer-node-protocol": "error", // Prefer using number properties like `Number.isNaN` rather than `isNaN` "unicorn/prefer-number-properties": "error", // String methods startsWith/endsWith instead of more complicated stuff "unicorn/prefer-string-starts-ends-with": "error", // Enforce throwing type error when throwing error while checking typeof "unicorn/prefer-type-error": "error", // Use new when throwing error "unicorn/throw-new-error": "error" } } ]; function getVueVersion() { const pkg = localPkg.getPackageInfoSync("vue", { paths: [process2__default.default.cwd()] }); if (pkg && typeof pkg.version === "string" && !Number.isNaN(+pkg.version[0])) { return +pkg.version[0]; } return 3; } var isVue3 = getVueVersion() === 3; var reactivityTransform = [ { languageOptions: { globals: { $: "readonly", $$: "readonly", $computed: "readonly", $customRef: "readonly", $ref: "readonly", $shallowRef: "readonly", $toRef: "readonly" } }, plugins: { vue: pluginVue }, rules: { "vue/no-setup-props-reactivity-loss": "off" } } ]; var vueCustomRules = { "vue/block-order": ["error", { order: ["script", "template", "style"] }], "vue/custom-event-name-casing": ["error", "camelCase"], "vue/eqeqeq": ["error", "smart"], "vue/html-self-closing": [ "error", { html: { component: "always", normal: "always", void: "any" }, math: "always", svg: "always" } ], "vue/max-attributes-per-line": "off", "vue/multi-word-component-names": "off", "vue/no-constant-condition": "warn", "vue/no-empty-pattern": "off", "vue/no-loss-of-precision": "error", "vue/no-unused-refs": "error", "vue/no-useless-v-bind": "error", "vue/no-v-html": "off", "vue/object-shorthand": [ "error", "always", { avoidQuotes: true, ignoreConstructors: false } ], "vue/one-component-per-file": "off", "vue/padding-line-between-blocks": ["error", "always"], "vue/prefer-template": "error", "vue/require-default-prop": "off", "vue/require-prop-types": "off", "vue/singleline-html-element-content-newline": "off" }; var vue3Rules = { ...pluginVue.configs.base.rules, ...pluginVue.configs["vue3-essential"].rules, ...pluginVue.configs["vue3-strongly-recommended"].rules, ...pluginVue.configs["vue3-recommended"].rules }; var vue2Rules = { ...pluginVue.configs.base.rules, ...pluginVue.configs.essential.rules, ...pluginVue.configs["strongly-recommended"].rules, ...pluginVue.configs.recommended.rules }; var vue = [ ...tseslint__default.default.config({ extends: typescriptCore, files: [GLOB_VUE] }), { files: [GLOB_VUE], languageOptions: { parser: parserVue__namespace, parserOptions: { ecmaFeatures: { jsx: true }, extraFileExtensions: [".vue"], parser: "@typescript-eslint/parser", sourceType: "module" } }, plugins: { "@typescript-eslint": tseslint__default.default.plugin, "vue": pluginVue }, processor: pluginVue.processors[".vue"], rules: { ...isVue3 ? vue3Rules : vue2Rules, ...vueCustomRules } }, ...reactivityTransform ]; // configs/yml.ts var yml = [ { files: [GLOB_YAML], languageOptions: { parser: parserYml__namespace }, plugins: { yml: pluginYml__namespace }, rules: { ...pluginYml__namespace.configs.standard.rules, ...pluginYml__namespace.configs.prettier.rules, "yml/no-empty-document": "off", "yml/no-empty-mapping-value": "off", "yml/quotes": "off" } } ]; var logger = consola.createConsola({ level: process.env.ESLINT_DEBUG ? consola.LogLevels.debug : consola.LogLevels.box }); var logger_default = logger; // presets.ts var presetJavaScript = [...javascript, ...comments, ...imports, ...unicorn, ...node, ...ignores]; var presetJsonc = [...jsonc, ...sortPackageJson]; var presetTypescript = [...typescript, ...sortTsconfig]; async function defineConfig(config = [], { astro: enableAstro = hasAstro, gitignore: enableGitignore = true, jsonc: enableJsonc = true, markdown: enableMarkdown = true, prettier: enablePrettier = true, react: enableReact = hasReact, sortImports: enableSortImports = true, sortObjects: enableSortObjects = false, svelte: enableSvelte = hasSvelte, typescript: enableTypescript = hasTypeScript, vue: enableVue = hasVue, yml: enableYml = true } = {}) { const configs = []; configs.push(...presetJavaScript); if (enablePrettier && hasTailwindcss) { logger_default.debug("Tailwindcss enabled"); if (!hasTailwindcssPrettire) { logger_default.warn( '[@minko-fe/eslint-config] Tailwindcss detected but "prettier-plugin-tailwindcss" not found, please install it to enable Tailwindcss support.' ); } } if (enableGitignore) { logger_default.debug("Gitignore enabled"); configs.push(...gitignores); } if (enableTypescript) { logger_default.debug("TypeScript enabled"); configs.push(...presetTypescript); } if (enablePrettier) { logger_default.debug("Prettier enabled"); configs.push(...prettier); } if (enableSortObjects) { logger_default.debug("Sort objects enabled"); configs.push(...sortObjects); } if (enableSortImports) { logger_default.debug("Sort imports enabled"); configs.push(...sortImports); } if (enableMarkdown) { logger_default.debug("Markdown enabled"); configs.push(...markdown); } if (enableJsonc) { logger_default.debug("Jsonc enabled"); configs.push(...presetJsonc); } if (enableYml) { logger_default.debug("Yml enabled"); configs.push(...yml); } if (enableReact) { logger_default.debug("React enabled"); configs.push(...react); } if (enableVue) { logger_default.debug("Vue enabled"); configs.push(...vue); } if (enableAstro) { logger_default.debug("Astro enabled"); if (!hasAstroPrettier) { logger_default.warn( '[@minko-fe/eslint-config] Astro detected but "prettier-plugin-astro" not found, please install it to enable Astro support.' ); } configs.push(...await resolveAstro()); } if (enableSvelte) { logger_default.debug("Svelte enabled"); if (!hasSveltePrettier) { logger_default.warn( '[@minko-fe/eslint-config] Svelte detected but "prettier-plugin-svelte" not found, please install it to enable Svelte support.' ); } configs.push(...await asyncSvelte()); } if (Object.keys(config).length > 0) { configs.push(...Array.isArray(config) ? config : [config]); } return configs; } exports.pluginImport = pluginImport__namespace; exports.pluginJsonc = pluginJsonc__namespace; exports.pluginYml = pluginYml__namespace; exports.parserJsonc = parserJsonc__namespace; exports.parserVue = parserVue__namespace; exports.parserYml = parserYml__namespace; Object.defineProperty(exports, "tseslint", { enumerable: true, get: function () { return tseslint__default.default; } }); exports.GLOB_ALL_SRC = GLOB_ALL_SRC; exports.GLOB_ASTRO = GLOB_ASTRO; exports.GLOB_CSS = GLOB_CSS; exports.GLOB_DIST = GLOB_DIST; exports.GLOB_EXCLUDE = GLOB_EXCLUDE; exports.GLOB_HTML = GLOB_HTML; exports.GLOB_JS = GLOB_JS; exports.GLOB_JSON = GLOB_JSON; exports.GLOB_JSON5 = GLOB_JSON5; exports.GLOB_JSONC = GLOB_JSONC; exports.GLOB_JSX = GLOB_JSX; exports.GLOB_LESS = GLOB_LESS; exports.GLOB_LOCKFILE = GLOB_LOCKFILE; exports.GLOB_MARKDOWN = GLOB_MARKDOWN; exports.GLOB_NODE_MODULES = GLOB_NODE_MODULES; exports.GLOB_PACKAGEJSON = GLOB_PACKAGEJSON; exports.GLOB_SCSS = GLOB_SCSS; exports.GLOB_SRC = GLOB_SRC; exports.GLOB_SRC_EXT = GLOB_SRC_EXT; exports.GLOB_STYLE = GLOB_STYLE; exports.GLOB_SVELTE = GLOB_SVELTE; exports.GLOB_TS = GLOB_TS; exports.GLOB_TSCONFIG = GLOB_TSCONFIG; exports.GLOB_TSX = GLOB_TSX; exports.GLOB_VUE = GLOB_VUE; exports.GLOB_YAML = GLOB_YAML; exports.asyncSvelte = asyncSvelte; exports.comments = comments; exports.configPrettier = configPrettier; exports.defineConfig = defineConfig; exports.getVueVersion = getVueVersion; exports.gitignores = gitignores; exports.hasAstro = hasAstro; exports.hasAstroPrettier = hasAstroPrettier; exports.hasReact = hasReact; exports.hasSvelte = hasSvelte; exports.hasSveltePrettier = hasSveltePrettier; exports.hasTailwindcss = hasTailwindcss; exports.hasTailwindcssPrettire = hasTailwindcssPrettire; exports.hasTypeScript = hasTypeScript; exports.hasVue = hasVue; exports.ignores = ignores; exports.imports = imports; exports.isInEditor = isInEditor; exports.javascript = javascript; exports.jsonc = jsonc; exports.markdown = markdown; exports.node = node; exports.parserAstro = parserAstro; exports.pluginAntfu = pluginAntfu; exports.pluginAstro = pluginAstro; exports.pluginComments = pluginComments; exports.pluginMarkdown = pluginMarkdown; exports.pluginNode = pluginNode; exports.pluginPerfectionist = pluginPerfectionist; exports.pluginPrettier = pluginPrettier; exports.pluginReact = pluginReact; exports.pluginReactHooks = pluginReactHooks; exports.pluginUnicorn = pluginUnicorn; exports.pluginUnusedImports = pluginUnusedImports; exports.pluginVue = pluginVue; exports.prettier = prettier; exports.react = react; exports.reactivityTransform = reactivityTransform; exports.resolveAstro = resolveAstro; exports.sortImports = sortImports; exports.sortObjects = sortObjects; exports.sortPackageJson = sortPackageJson; exports.sortTsconfig = sortTsconfig; exports.typescript = typescript; exports.typescriptCore = typescriptCore; exports.unicorn = unicorn; exports.vue = vue; exports.yml = yml;