@hyperse/eslint-config-hyperse
Version:
🛠These are settings for TypeScript / ESLint / Prettier in a project
304 lines (303 loc) • 10.9 kB
JavaScript
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;