UNPKG

@hyperse/eslint-config-hyperse

Version:

🛠 These are settings for TypeScript / ESLint / Prettier in a project

304 lines (303 loc) • 10.9 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); //#region \0rolldown/runtime.js var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) { key = keys[i]; if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: ((k) => from[k]).bind(null, key), enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); //#endregion let eslint_config = require("eslint/config"); let app_root_path = require("app-root-path"); app_root_path = __toESM(app_root_path, 1); let eslint_plugin_simple_import_sort = require("eslint-plugin-simple-import-sort"); eslint_plugin_simple_import_sort = __toESM(eslint_plugin_simple_import_sort, 1); let get_tsconfig = require("get-tsconfig"); let eslint_plugin_jsonc = require("eslint-plugin-jsonc"); eslint_plugin_jsonc = __toESM(eslint_plugin_jsonc, 1); let eslint_plugin_mdx = require("eslint-plugin-mdx"); eslint_plugin_mdx = __toESM(eslint_plugin_mdx, 1); let _next_eslint_plugin_next = require("@next/eslint-plugin-next"); _next_eslint_plugin_next = __toESM(_next_eslint_plugin_next, 1); let eslint_plugin_prettier_recommended = require("eslint-plugin-prettier/recommended"); eslint_plugin_prettier_recommended = __toESM(eslint_plugin_prettier_recommended, 1); let typescript_eslint = require("typescript-eslint"); typescript_eslint = __toESM(typescript_eslint, 1); let _eslint_js = require("@eslint/js"); _eslint_js = __toESM(_eslint_js, 1); let _eslint_react_eslint_plugin = require("@eslint-react/eslint-plugin"); _eslint_react_eslint_plugin = __toESM(_eslint_react_eslint_plugin, 1); let eslint_plugin_regexp = require("eslint-plugin-regexp"); eslint_plugin_regexp = __toESM(eslint_plugin_regexp, 1); let eslint_plugin_sonarjs = require("eslint-plugin-sonarjs"); eslint_plugin_sonarjs = __toESM(eslint_plugin_sonarjs, 1); let globals = require("globals"); globals = __toESM(globals, 1); let _vitest_eslint_plugin = require("@vitest/eslint-plugin"); _vitest_eslint_plugin = __toESM(_vitest_eslint_plugin, 1); //#region src/getDefaultIgnorePatterns.ts const getDefaultIgnorePatterns = (ignores = []) => { return [ `**/node_modules`, "**/node_modules", "**/.turbo", "**/.docusaurus", "**/.cache", "**/.changeset", "**/.github", "**/.husky", "**/.yarn", "**/.out", "**/.next", "**/_release", "**/.cache", "**/build", "**/dist", "**/public", "**/fixtures", "**/hps.manifest.json", "**/.storybook", "**/.vscode-test", "**/storybook-static", "**/miniprogram", "**/.husky", "**/.contentlayer", "**/.mini", "**/*.d.ts", ...ignores ]; }; //#endregion //#region src/define-config.ts /** * Define a config. * @param config - The config to define. * @param ignores - An array of glob patterns indicating the files that the configuration object should not apply to. * @see {@link https://eslint.org/docs/latest/use/configure/configuration-files-new#ignores} * @returns The config. */ const defineConfig = (config, ignores = []) => { return (0, eslint_config.defineConfig)(config.concat({ ignores: getDefaultIgnorePatterns(ignores) })); }; //#endregion //#region src/prettierShared.ts const TAILWIND_PLUGIN = "prettier-plugin-tailwindcss"; const prettierBaseOptions = { semi: true, singleQuote: true, trailingComma: "es5" }; /** * Ensures `prettier-plugin-tailwindcss` is present exactly once and last, per * https://github.com/tailwindlabs/prettier-plugin-tailwindcss#compatibility-with-other-prettier-plugins */ function finalizePrettierPlugins(plugins) { return [...normalizePlugins(plugins).filter((p) => p !== TAILWIND_PLUGIN), TAILWIND_PLUGIN]; } function normalizePlugins(plugins) { if (plugins === void 0) return []; return Array.isArray(plugins) ? [...plugins] : [plugins]; } //#endregion //#region src/definePrettierConfig.ts const definePrettierConfig = (config = {}) => { const { plugins, ...rest } = config; return { ...prettierBaseOptions, ...rest, plugins: finalizePrettierPlugins(plugins) }; }; //#endregion //#region src/rules/imports.ts function extractPaths(paths) { return Object.keys(paths).map((key) => { return key.split("/")[0]; }); } const tsConfig = (0, get_tsconfig.getTsconfig)(app_root_path.default.path, "tsconfig.json"); const jsConfig = (0, get_tsconfig.getTsconfig)(app_root_path.default.path, "jsconfig.json"); let pathsNames = []; if (tsConfig && tsConfig.config.compilerOptions?.paths) pathsNames = extractPaths(tsConfig.config.compilerOptions.paths); else if (jsConfig && jsConfig.config.compilerOptions?.paths) pathsNames = extractPaths(jsConfig.config.compilerOptions.paths); const imports = (0, eslint_config.defineConfig)([{ plugins: { "simple-import-sort": eslint_plugin_simple_import_sort.default }, rules: { "simple-import-sort/exports": "error", "simple-import-sort/imports": ["error", { groups: [[ "^react", "^next", "^[a-z]", `^(${pathsNames.join("|")})(/.*|$)`, "^@", "^\\.", "^\\u0000", "^\\u0000\\." ]] }] } }]); //#endregion //#region src/rules/jsonc.ts const jsonc = (0, eslint_config.defineConfig)([...eslint_plugin_jsonc.default.configs["flat/recommended-with-jsonc"], { rules: {} }]); //#endregion //#region src/rules/mdx.ts const mdx = (0, eslint_config.defineConfig)([{ ...eslint_plugin_mdx.flat }]); //#endregion //#region src/rules/next.ts const next = (0, eslint_config.defineConfig)([{ plugins: { "@next/next": _next_eslint_plugin_next.default }, rules: { ..._next_eslint_plugin_next.default.configs.recommended.rules, ..._next_eslint_plugin_next.default.configs["core-web-vitals"].rules } }, { ignores: [".next/*"] }]); //#endregion //#region src/rules/prettier.ts const { ...prettierConfig } = definePrettierConfig(); const prettier = (0, eslint_config.defineConfig)([{ ...eslint_plugin_prettier_recommended.default, rules: { ...eslint_plugin_prettier_recommended.default.rules, "prettier/prettier": ["error", prettierConfig] } }]); const react = (0, eslint_config.defineConfig)([{ files: { files: ["**/*.{jsx,tsx}"] }.files, extends: [ _eslint_js.default.configs.recommended, typescript_eslint.default.configs.recommended, _eslint_react_eslint_plugin.default.configs["recommended-typescript"] ], languageOptions: { parser: typescript_eslint.default.parser, parserOptions: { projectService: true, tsconfigRootDir: __dirname } }, rules: {}, settings: { react: { version: "detect" } } }]); const regexp = (0, eslint_config.defineConfig)([{ files: { files: ["**/*.{js,jsx,jsx,tsx,mts,cts,mjs,cjs}"] }.files, plugins: { regexp: eslint_plugin_regexp.default }, rules: { ...eslint_plugin_regexp.default.configs.recommended.rules, "regexp/prefer-result-array-groups": "off" } }]); //#endregion //#region src/rules/sonar.ts const sonarPatterns = { files: ["**/*.{js,jsx,ts,tsx,mts,cts,mjs,cjs}"], excludedFiles: [ "**/?(*.)+(test).{js,jsx,ts,tsx,mts,cts,mjs,cjs}", "**/?(*.)+(spec).{js,jsx,ts,tsx,mts,cts,mjs,cjs}", "*.stories.{js,ts,jsx,tsx,mts,cts,mjs,cjs}" ] }; const sonar = (0, eslint_config.defineConfig)([{ files: sonarPatterns.files, ignores: sonarPatterns.excludedFiles, plugins: { sonarjs: eslint_plugin_sonarjs.default }, rules: { ...eslint_plugin_sonarjs.default.configs.recommended.rules, "sonarjs/cognitive-complexity": ["error", 20], "sonarjs/max-switch-cases": ["error", 20], "sonarjs/no-all-duplicated-branches": "error", "sonarjs/no-element-overwrite": "error", "sonarjs/no-identical-functions": "error", "sonarjs/no-identical-expressions": "error", "sonarjs/no-hook-setter-in-body": "off", "sonarjs/public-static-readonly": "off", "sonarjs/no-nested-conditional": "off", "sonarjs/fixme-tag": "warn", "sonarjs/todo-tag": "warn", "sonarjs/no-commented-code": "off", "sonarjs/deprecation": "off" } }]); //#endregion //#region src/rules/typescript.ts const typescript = (0, eslint_config.defineConfig)({ languageOptions: { globals: { ...globals.default.node } } }, _eslint_js.default.configs.recommended, ...typescript_eslint.default.configs.recommended); const vitest = (0, eslint_config.defineConfig)([{ files: { files: ["**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"] }.files, plugins: { vitest: _vitest_eslint_plugin.default }, rules: { ..._vitest_eslint_plugin.default.configs.recommended.rules, "vitest/max-nested-describe": ["error", { max: 3 }], "vitest/no-disabled-tests": 2, "vitest/valid-title": "off", "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-object-literal-type-assertion": "off", "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/ban-ts-comment": "off" }, settings: { vitest: { typecheck: true } }, languageOptions: { globals: { ..._vitest_eslint_plugin.default.environments.env.globals } } }]); //#endregion //#region src/main/overrides.ts const overrides = (0, eslint_config.defineConfig)([{ ...typescript_eslint.default.configs.base, languageOptions: { parserOptions: { projectService: true, tsconfigRootDir: __dirname, emitDecoratorMetadata: true } }, files: ["**/*.ts", "**/*.tsx"], rules: { "@typescript-eslint/no-unused-vars": ["warn", { args: "all", argsIgnorePattern: "^_", varsIgnorePattern: "^_", caughtErrorsIgnorePattern: "^_" }], "@typescript-eslint/consistent-type-imports": ["error", { disallowTypeAnnotations: false }], "@typescript-eslint/no-deprecated": "warn" } }]); //#endregion //#region src/main/base.ts const base = (0, eslint_config.defineConfig)([ ...typescript, ...vitest, ...imports, ...prettier, ...regexp, ...jsonc, ...mdx, ...overrides ]); //#endregion //#region src/main/reactjs.ts const reactjs = (0, eslint_config.defineConfig)([...base, ...react]); //#endregion //#region src/main/nextjs.ts const nextjs = (0, eslint_config.defineConfig)([...reactjs, ...next]); //#endregion //#region src/main/sonarjs.ts const sonarjs = (0, eslint_config.defineConfig)([...sonar]); //#endregion exports.base = base; exports.defineConfig = defineConfig; exports.definePrettierConfig = definePrettierConfig; exports.getDefaultIgnorePatterns = getDefaultIgnorePatterns; exports.nextjs = nextjs; exports.reactjs = reactjs; exports.sonarjs = sonarjs;