eslint-config-xaxa
Version:
The ultimate ESLint config - successor to Airbnb Config. Built on Anthony Fu's ESLint config, Airbnb, ESLint Stylistic, Perfectionist, React, TypeScript, Astro, JSDocs, Prettier, Node.js, Unicorns, Promises, and more.
132 lines (131 loc) • 6.33 kB
JavaScript
import { astro as antfuAstro, defaultPluginRenaming as antfuPluginRenaming, comments, disables, formatters, ignores, interopDefault, isInEditorEnv, jsonc, jsx, markdown, pnpm, react, regexp, resolveSubOptions, sortPackageJson, sortTsconfig, toml, typescript, yaml } from "@antfu/eslint-config";
import js from "@eslint/js";
import { FlatConfigComposer } from "eslint-flat-config-utils";
import { isPackageExists } from "local-pkg";
import * as config from "./configs/index.js";
import { isPnpm, isUnoCSS } from "./utils.js";
const renaming = antfuPluginRenaming;
export * from "./configs/index.js";
export * from "./plugins.js";
export * from "./types.js";
export * from "./vscode.js";
export const defaultPluginRenaming = {
...renaming,
"@next/next": "nextjs"
};
export { FlatConfigComposer, interopDefault, isInEditorEnv, isPackageExists, isPnpm, isUnoCSS, js, antfuAstro as astro, comments, disables, formatters, ignores, jsonc, jsx, markdown, pnpm, react, regexp, resolveSubOptions, sortPackageJson, sortTsconfig, toml, typescript, yaml };
export default function xaxa(options, ...userConfigs) {
const settings = { ...options };
const isTypescript = isPackageExists("typescript");
const isReact = isPackageExists("preact") || isPackageExists("react");
const { astro: enableAstro = false, autoRenamePlugins = true, componentExts = [], eslintJsRecommended = true, gitignore: enableGitignore = true, ignores: userIgnores = [], jsonc: enableJsonc = true, jsx: enableJsx = isReact, markdown: enableMarkdown = true, nextjs: enableNextjs = false, node: enableNode = true, perfectionist: enablePerfectionist = true, pnpm: enableCatalogs = isPnpm(settings.cwd), promise: enablePromise = true, react: enableReact = isReact, regexp: enableRegexp = true, semi: enableSemi = true, tailwind: enableTailwind = false, toml: enableToml = true, type: packageType = "lib", typescript: enableTypeScript = isTypescript, unicorn: enableUnicorn = true, unocss: enableUnoCSS = isUnoCSS(settings.cwd), wgw: enableWgw = true, yaml: enableYaml = true,...opts } = { ...settings };
if ("files" in settings && "name" in settings && "plugins" in settings) {
throw new Error("[eslint-xaxa-config] The first argument should not contain the \"files\" property as the \"options\" are supposed to be global.");
}
const disableFixForRules = opts.disableFixForRules || [
"unused-imports/no-unused-imports",
"test/no-only-tests",
"prefer-const"
];
let isInEditor = opts.isInEditor;
if (isInEditor == null) {
isInEditor = isInEditorEnv();
if (isInEditor) {
console.log(`[eslint-config-xaxa] Detected running in editor, fix disabled for: ${disableFixForRules.join(", ")}`.trim());
}
}
const stylisticOptions = opts.stylistic === false ? false : typeof opts.stylistic === "object" ? opts.stylistic : {};
stylisticOptions.jsx = enableJsx;
stylisticOptions.semi = enableSemi;
const configs = [];
if (enableGitignore) {
if (typeof enableGitignore !== "boolean") {
configs.push(interopDefault(import("eslint-config-flat-gitignore")).then((r) => [r({
name: "antfu/gitignore",
...enableGitignore
})]));
} else {
configs.push(interopDefault(import("eslint-config-flat-gitignore")).then((r) => [r({
name: "antfu/gitignore",
strict: false
})]));
}
}
const typescriptOptions = resolveSubOptions(opts, "typescript");
const tsconfigPath = "tsconfigPath" in typescriptOptions ? typescriptOptions.tsconfigPath : undefined;
configs.push(ignores(userIgnores), comments(), eslintJsRecommended && {
name: "@eslint/js/recommended",
...js.configs.recommended
}, config.airbnb({
typescript: isTypescript,
...opts.airbnb || {}
}), enableNode && config.node(enableNode === true ? {} : enableNode), enablePromise && config.promise(enablePromise === true ? {} : enablePromise), enablePerfectionist && config.perfectionist(enablePerfectionist === true ? {} : enablePerfectionist), enableUnicorn && config.unicorn(enableUnicorn === true ? {} : enableUnicorn), enableRegexp && regexp(enableRegexp === true ? {} : enableRegexp), enableJsx && jsx(), enableTailwind && config.tailwindcss(enableTailwind === true ? {} : enableTailwind), enableUnoCSS && config.unocss(enableUnoCSS === true ? {} : enableUnoCSS), enableTypeScript && typescript({
...typescriptOptions,
componentExts,
type: packageType
}), enableNextjs && config.nextjs(enableNextjs === true ? {} : enableNextjs), enableReact && react({
...typescriptOptions,
overrides: enableReact === true ? {} : enableReact,
tsconfigPath
}), enableMarkdown && markdown({
componentExts,
overrides: enableMarkdown === true ? {} : enableMarkdown
}));
if (stylisticOptions) {
configs.push(config.stylistic(stylisticOptions));
}
if (enableCatalogs) {
configs.push(pnpm());
}
if (enableJsonc) {
configs.push(jsonc({
overrides: enableJsonc === true ? { "style/comma-dangle": ["error", "never"] } : enableJsonc,
stylistic: stylisticOptions
}), sortPackageJson(), sortTsconfig());
}
if (enableYaml) {
configs.push(yaml({
overrides: enableYaml === true ? {} : enableYaml,
stylistic: stylisticOptions
}));
}
if (enableToml) {
configs.push(toml({
overrides: enableToml === true ? {} : enableToml,
stylistic: stylisticOptions
}));
}
configs.push(enableAstro && antfuAstro({
overrides: enableAstro === true ? {} : enableAstro,
stylistic: stylisticOptions
}), enableWgw && config.wgw({
isAstro: Boolean(enableAstro),
isInEditor,
isTypescript,
overrides: enableWgw === true ? {} : enableWgw
}));
configs.push(disables());
if (enableMarkdown) {
opts.formatters = opts.formatters || {};
opts.formatters = {
markdown: "prettier",
...opts.formatters
};
}
if (opts.formatters) {
configs.push(formatters(opts.formatters, typeof stylisticOptions === "boolean" ? {} : stylisticOptions));
}
let composer = new FlatConfigComposer();
composer = composer.append(...configs.flat().filter(Boolean), ...userConfigs.flat().filter(Boolean));
if (autoRenamePlugins) {
composer = composer.renamePlugins(defaultPluginRenaming);
}
if (isInEditor) {
composer = composer.disableRulesFix(disableFixForRules, { builtinRules: () => {
const imported = import(["eslint", "use-at-your-own-risk"].join("/"));
return imported.then((r) => r.builtinRules);
} });
}
return composer;
}
export { xaxa };