@santi020k/eslint-config-basic 3.5.0 → 3.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/cli-preset.js +10 -2
- package/dist/cli-preset.js.map +1 -1
- package/dist/cli-workflows.js +20 -10
- package/dist/cli-workflows.js.map +1 -1
- package/dist/tailwind.js +6 -2
- package/dist/tailwind.js.map +1 -1
- package/package.json +52 -52
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @santi020k/eslint-config-basic
|
|
2
2
|
|
|
3
|
+
## 3.5.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#126](https://github.com/santi020k/eslint-config-basic/pull/126) [`2bf02c3`](https://github.com/santi020k/eslint-config-basic/commit/2bf02c349c8b99671ac069a26ec7065a8233d4f2) Thanks [@santi020k](https://github.com/santi020k)! - Upgrade the supported dependency ecosystem, adopt Lumen Astro 2, and resolve all known audit findings with patched transitive versions.
|
|
8
|
+
- Updated dependencies [[`2bf02c3`](https://github.com/santi020k/eslint-config-basic/commit/2bf02c349c8b99671ac069a26ec7065a8233d4f2)]:
|
|
9
|
+
- @santi020k/eslint-config-core@3.1.2
|
|
10
|
+
- @santi020k/eslint-config-typescript@3.1.4
|
|
11
|
+
|
|
12
|
+
## 3.5.1
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- [#118](https://github.com/santi020k/eslint-config-basic/pull/118) [`355dfcd`](https://github.com/santi020k/eslint-config-basic/commit/355dfcd5c6b3baaf472178953d836b9e1e417476) Thanks [@santi020k](https://github.com/santi020k)! - Preserve Bun ambient types in config declaration checks, classify semantic-only
|
|
17
|
+
autofixes with ESLint rule metadata while excluding sorting fixes, and follow
|
|
18
|
+
local CSS imports declared inside Astro component style blocks.
|
|
19
|
+
|
|
3
20
|
## 3.5.0
|
|
4
21
|
|
|
5
22
|
### Minor Changes
|
package/dist/cli-preset.js
CHANGED
|
@@ -97,6 +97,7 @@ const FORMAT_PREFIXES = /* @__PURE__ */ new Set([
|
|
|
97
97
|
]);
|
|
98
98
|
const FORMAT_RULES = /* @__PURE__ */ new Set([
|
|
99
99
|
"import/first",
|
|
100
|
+
"sort-imports",
|
|
100
101
|
"simple-import-sort/exports",
|
|
101
102
|
"simple-import-sort/imports"
|
|
102
103
|
]);
|
|
@@ -346,8 +347,15 @@ ${result.stderr}`
|
|
|
346
347
|
};
|
|
347
348
|
const analyzePresetSource = async (cwd, selectedConfig, sourceFiles, configuredProjects, typescriptRunner, semanticOnly = false, write = false) => {
|
|
348
349
|
const lintTargets = sourceFiles.length > 0 ? sourceFiles : ["."];
|
|
349
|
-
const
|
|
350
|
-
const
|
|
350
|
+
const analysisEslint = loadProjectEslint(cwd, selectedConfig);
|
|
351
|
+
const lintResults = await analysisEslint.lintFiles(lintTargets);
|
|
352
|
+
const rulesMeta = analysisEslint.getRulesMetaForResults(lintResults);
|
|
353
|
+
const fix = semanticOnly ? (message) => {
|
|
354
|
+
if (message.ruleId === null) return false;
|
|
355
|
+
const metadata = rulesMeta[message.ruleId];
|
|
356
|
+
if (metadata?.type === "layout" || metadata?.fixable === "whitespace") return false;
|
|
357
|
+
return getRuleGroup(message.ruleId) !== "formatting";
|
|
358
|
+
} : true;
|
|
351
359
|
const previewResults = await loadProjectEslint(cwd, selectedConfig, fix).lintFiles(lintTargets);
|
|
352
360
|
const byCategory = {};
|
|
353
361
|
const byFileType = {};
|
package/dist/cli-preset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-preset.ts"],"sourcesContent":["/* eslint-disable no-console -- CLI handlers own user-facing terminal output */\n/* eslint-disable complexity -- report comparison and formatting intentionally cover multiple result branches */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire, findPackageJSON } from 'node:module'\nimport { dirname, extname, join, relative } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nimport {\n type DetectedFrameworkName,\n detectProjectOptions,\n type EslintConfigOptions,\n Preset\n} from '@santi020k/eslint-config-core'\n\nimport { type CommandRunner, defaultCommandRunner } from './cli-workflows.js'\nimport { type DefineConfigMetadata, getDefineConfigMetadata } from './define-config-metadata.js'\nimport { defineConfig } from './index.js'\nimport { isMissingRequestedPackage } from './optional-package-errors.js'\nimport { resolvePreset } from './resolvers.js'\n\ninterface EffectiveConfig {\n rules?: Partial<Record<string, unknown>>\n}\n\ninterface ProjectLintMessage {\n fatal?: boolean\n fix?: unknown\n ruleId: null | string\n severity: number\n}\n\ninterface ProjectLintResult {\n errorCount: number\n filePath: string\n messages: ProjectLintMessage[]\n output?: string\n warningCount: number\n}\n\ninterface ProjectEslint {\n calculateConfigForFile: (filePath: string) => Promise<EffectiveConfig | null>\n lintFiles: (patterns: string[]) => Promise<ProjectLintResult[]>\n}\n\ntype ProjectEslintConstructor = new(options: {\n cwd: string\n fix?: boolean | ((message: ProjectLintMessage) => boolean)\n overrideConfig?: unknown\n overrideConfigFile?: boolean\n}) => ProjectEslint\n\nexport interface ExplainPresetOptions {\n analyzeSource?: boolean\n compatibility?: boolean\n file?: string\n files?: string[]\n json?: boolean\n output?: string\n semanticOnly?: boolean\n write?: boolean\n}\n\ninterface CreatePresetReportOptions {\n analyzeSource?: boolean\n semanticOnly?: boolean\n sourceFiles?: string[]\n typescriptRunner?: CommandRunner\n write?: boolean\n}\n\nconst PRESETS = new Set<string>(Object.values(Preset))\n\nconst CONFIG_FILENAMES = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts'\n]\n\nconst loadDefineConfigMetadata = async (cwd: string): Promise<DefineConfigMetadata | undefined> => {\n const configPath = CONFIG_FILENAMES.map(name => join(cwd, name)).find(path => existsSync(path))\n\n if (!configPath) return undefined\n\n try {\n const loaded = await import(`${pathToFileURL(configPath).href}?basic-eslint-preset=${Date.now()}`) as {\n default?: unknown\n }\n\n return getDefineConfigMetadata(await loaded.default)\n } catch {\n return undefined\n }\n}\n\nconst PRESET_FEATURE_PACKAGES = {\n extensions: '@santi020k/eslint-config-extensions',\n formats: '@santi020k/eslint-config-formats',\n libraries: '@santi020k/eslint-config-libraries',\n testing: '@santi020k/eslint-config-testing',\n tools: '@santi020k/eslint-config-tools'\n} as const\n\nconst FRAMEWORK_PACKAGES: Record<DetectedFrameworkName, string> = {\n angular: '@santi020k/eslint-config-angular',\n astro: '@santi020k/eslint-config-astro',\n expo: '@santi020k/eslint-config-expo',\n hono: '@santi020k/eslint-config-hono',\n lit: '@santi020k/eslint-config-lit',\n nest: '@santi020k/eslint-config-nest',\n next: '@santi020k/eslint-config-next',\n nuxt: '@santi020k/eslint-config-nuxt',\n preact: '@santi020k/eslint-config-preact',\n qwik: '@santi020k/eslint-config-qwik',\n react: '@santi020k/eslint-config-react',\n 'react-router': '@santi020k/eslint-config-react-router',\n slidev: '@santi020k/eslint-config-slidev',\n solid: '@santi020k/eslint-config-solid',\n svelte: '@santi020k/eslint-config-svelte',\n 'tanstack-start': '@santi020k/eslint-config-tanstack-start',\n vite: '@santi020k/eslint-config-vite',\n vue: '@santi020k/eslint-config-vue'\n}\n\nconst FRAMEWORK_PREFIXES = new Set([\n '@angular-eslint',\n '@eslint-react',\n '@next/next',\n 'astro',\n 'lit',\n 'qwik',\n 'react',\n 'react-hooks',\n 'react-refresh',\n 'solid',\n 'svelte',\n 'vue'\n])\n\nconst DOMAIN_PREFIXES = new Set([\n 'better-tailwindcss',\n 'drizzle',\n 'graphql-eslint',\n 'i18next',\n 'prisma',\n 'storybook',\n 'tailwindcss',\n 'tanstack-query',\n 'turbo',\n 'zod'\n])\n\nconst FORMAT_PREFIXES = new Set([\n '@stylistic',\n 'css',\n 'html',\n 'jsonc',\n 'markdown',\n 'mdx',\n 'perfectionist',\n 'prettier',\n 'toml',\n 'yaml'\n])\n\nconst FORMAT_RULES = new Set([\n 'import/first',\n 'simple-import-sort/exports',\n 'simple-import-sort/imports'\n])\n\nconst MULTI_SEGMENT_RULE_PREFIXES = new Set(['@next/next'])\n\nconst getRulePrefix = (rule: string): string => {\n const segments = rule.split('/')\n\n if (!rule.startsWith('@')) return segments[0]\n\n const multiSegmentPrefix = segments.slice(0, 2).join('/')\n\n return MULTI_SEGMENT_RULE_PREFIXES.has(multiSegmentPrefix) ? multiSegmentPrefix : segments[0]\n}\n\nconst getRuleGroup = (rule: string): 'correctness' | 'domain' | 'formatting' | 'framework' | 'security' => {\n const prefix = getRulePrefix(rule)\n\n if (\n prefix === 'security' ||\n prefix === 'no-secrets' ||\n rule.includes('security') ||\n rule.includes('no-unsanitized')\n ) return 'security'\n\n if (FRAMEWORK_PREFIXES.has(prefix)) return 'framework'\n\n if (DOMAIN_PREFIXES.has(prefix)) return 'domain'\n\n if (\n FORMAT_PREFIXES.has(prefix) ||\n FORMAT_RULES.has(rule) ||\n rule.includes('format') ||\n rule.includes('spacing')\n ) return 'formatting'\n\n return 'correctness'\n}\n\nconst getSeverity = (value: unknown): unknown => Array.isArray(value) ? value[0] : value\n\nconst isEnabled = (value: unknown): boolean => {\n const severity = getSeverity(value)\n\n return severity !== 0 && severity !== 'off' && severity !== undefined\n}\n\nconst normalizeRule = (value: unknown): string => JSON.stringify(value)\n\nconst loadProjectEslint = (\n cwd: string,\n overrideConfig?: unknown,\n fix: boolean | ((message: ProjectLintMessage) => boolean) = false\n): ProjectEslint => {\n const projectRequire = createRequire(join(cwd, 'package.json'))\n const eslintModule = projectRequire('eslint') as { ESLint?: ProjectEslintConstructor }\n\n if (!eslintModule.ESLint) throw new Error('The installed eslint package does not expose the ESLint API.')\n\n return new eslintModule.ESLint({\n cwd,\n ...(fix ? { fix } : {}),\n ...(overrideConfig ? { overrideConfig, overrideConfigFile: true } : {})\n })\n}\n\nconst getResolvablePresetOptions = (\n cwd: string,\n presetOptions: Partial<EslintConfigOptions>\n): { missingPackages: string[], options: Partial<EslintConfigOptions> } => {\n const projectPackageUrl = pathToFileURL(join(cwd, 'package.json'))\n const options = { ...presetOptions }\n const detectedOptions = detectProjectOptions(cwd)\n const missingPackages = new Set<string>()\n const detection = options.detection\n const detectionControls = typeof detection === 'object' ? detection : {}\n\n const detectionEnabled = (category: keyof typeof PRESET_FEATURE_PACKAGES): boolean => (\n detection !== false && detectionControls[category] !== false\n )\n\n for (const [category, specifier] of Object.entries(PRESET_FEATURE_PACKAGES)) {\n const categoryKey = category as keyof typeof PRESET_FEATURE_PACKAGES\n const explicit = options[categoryKey]\n const detected = detectionEnabled(categoryKey) ? detectedOptions[categoryKey] : []\n\n const selected = [...new Set([\n ...(Array.isArray(explicit) ? explicit : []),\n ...(Array.isArray(detected) ? detected : [])\n ])]\n\n if (selected.length === 0) continue\n\n try {\n findPackageJSON(specifier, projectPackageUrl)\n } catch (error) {\n if (!isMissingRequestedPackage(error, specifier)) throw error\n\n Object.assign(options, {\n [category]: [],\n detection: {\n ...(typeof options.detection === 'object' ? options.detection : detectionControls),\n [category]: false\n },\n features: {\n ...options.features,\n ...Object.fromEntries(selected.map(feature => [feature, false]))\n }\n })\n\n missingPackages.add(specifier)\n }\n }\n\n const frameworkDetectionEnabled = detection !== false && detectionControls.frameworks !== false\n const detectedFrameworks = frameworkDetectionEnabled ? detectedOptions.detectedFrameworks ?? [] : []\n\n const configuredFrameworks = Object.entries(options.frameworks ?? {})\n .filter((entry): entry is [DetectedFrameworkName, true] => entry[1] === true)\n .map(([framework]) => framework)\n\n const selectedFrameworks = [...new Set([...detectedFrameworks, ...configuredFrameworks])]\n\n const resolvableFrameworks: NonNullable<EslintConfigOptions['frameworks']> = {\n ...options.frameworks\n }\n\n for (const framework of selectedFrameworks) {\n const specifier = FRAMEWORK_PACKAGES[framework]\n\n try {\n findPackageJSON(specifier, projectPackageUrl)\n\n resolvableFrameworks[framework] = true\n } catch (error) {\n if (!isMissingRequestedPackage(error, specifier)) throw error\n\n Reflect.deleteProperty(resolvableFrameworks, framework)\n\n missingPackages.add(specifier)\n }\n }\n\n if (!resolvableFrameworks.react) {\n delete resolvableFrameworks.expo\n\n delete resolvableFrameworks.next\n\n delete resolvableFrameworks['react-router']\n\n if (!resolvableFrameworks.solid) delete resolvableFrameworks['tanstack-start']\n }\n\n if (!resolvableFrameworks.vue) {\n delete resolvableFrameworks.nuxt\n\n delete resolvableFrameworks.slidev\n }\n\n if (selectedFrameworks.length > 0) {\n options.autoFrameworks = false\n\n options.frameworks = resolvableFrameworks\n }\n\n return { missingPackages: [...missingPackages], options }\n}\n\nconst createCompatibilityConfig = (\n preset: string,\n addedRules: Record<string, unknown>,\n changedRules: Record<string, { from: unknown, to: unknown }>\n): string => [\n `// Temporary compatibility override generated for Preset.${preset.charAt(0).toUpperCase()}${preset.slice(1)}.`,\n '// Remove entries as the project adopts the preset findings.',\n 'export default {',\n ` name: 'eslint-config-basic/preset-${preset}-compatibility',`,\n ' rules: {',\n ...Object.keys(addedRules).sort().map(rule => ` ${JSON.stringify(rule)}: 'off',`),\n ...Object.keys(changedRules).sort().map(rule => (\n ` ${JSON.stringify(rule)}: ${JSON.stringify(changedRules[rule].from)},`\n )),\n ' },',\n '}',\n ''\n].join('\\n')\n\ninterface FindingSummary {\n errors: number\n fixable: number\n total: number\n warnings: number\n}\n\nconst createFindingSummary = (): FindingSummary => ({\n errors: 0,\n fixable: 0,\n total: 0,\n warnings: 0\n})\n\nconst addFinding = (\n summaries: Record<string, FindingSummary>,\n key: string,\n message: ProjectLintMessage\n): void => {\n const summary = summaries[key] ?? createFindingSummary()\n\n summary.total++\n\n if (message.severity === 2) summary.errors++\n else summary.warnings++\n\n if (message.fix !== undefined) summary.fixable++\n\n summaries[key] = summary\n}\n\nconst estimateChangedLines = (before: string, after: string): number => {\n const beforeLines = before.split('\\n')\n const afterLines = after.split('\\n')\n const comparableLines = Math.min(beforeLines.length, afterLines.length)\n let changed = Math.abs(beforeLines.length - afterLines.length)\n\n for (let index = 0; index < comparableLines; index++) {\n if (beforeLines[index] !== afterLines[index]) changed++\n }\n\n return changed\n}\n\nconst readOriginalSource = (filePath: string): string | undefined => {\n try {\n return readFileSync(filePath, 'utf8')\n } catch {\n return undefined\n }\n}\n\ninterface SourceFormatParserCandidate {\n file: string\n lines: number[]\n}\n\nconst SOURCE_FILE_READ_PATTERN = /\\b(?:Bun\\.file|Deno\\.readTextFile|readFile|readFileSync|readTextFile)\\b/\n\nconst SOURCE_REGEXP_PATTERN = new RegExp([\n String.raw`\\.match(?:All)?\\s*\\(`,\n String.raw`\\.replace(?:All)?\\s*\\(`,\n String.raw`\\.search\\s*\\(`,\n String.raw`\\bRegExp\\s*\\(`,\n String.raw`\\.(?:exec|test)\\s*\\(`\n].join('|'))\n\nconst findSourceFormatParserCandidates = (\n cwd: string,\n filePaths: string[]\n): SourceFormatParserCandidate[] => filePaths.flatMap(filePath => {\n const content = readOriginalSource(filePath)\n\n if (!content || !SOURCE_FILE_READ_PATTERN.test(content)) return []\n\n const lines = content.split('\\n')\n .flatMap((line, index) => SOURCE_REGEXP_PATTERN.test(line) ? [index + 1] : [])\n\n return lines.length > 0 ? [{ file: relative(cwd, filePath), lines }] : []\n})\n\nconst TYPESCRIPT_CONFIG_FILENAMES = [\n 'tsconfig.json',\n 'tsconfig.base.json',\n 'tsconfig.app.json',\n 'tsconfig.node.json',\n 'tsconfig.eslint.json'\n]\n\nconst TYPESCRIPT_ROOT_DIAGNOSTIC_CODES = new Set([\n 'TS2307',\n 'TS2688',\n 'TS2792',\n 'TS6053'\n])\n\nconst resolveTypeScriptCli = (cwd: string): null | string => {\n try {\n const projectRequire = createRequire(join(cwd, 'package.json'))\n const packagePath = projectRequire.resolve('typescript/package.json')\n\n const manifest = JSON.parse(readFileSync(packagePath, 'utf8')) as {\n bin?: Record<string, string> | string\n }\n\n const bin = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.tsc\n\n return bin ? join(dirname(packagePath), bin) : null\n } catch {\n return null\n }\n}\n\nconst getTypeScriptConfigs = (\n cwd: string,\n configuredProjects: string[]\n): string[] => {\n const detectedProjects = Object.keys(detectProjectOptions(cwd).projects ?? {})\n const projectRoots = [...new Set([...detectedProjects, ...configuredProjects])]\n\n const roots = [\n cwd,\n ...projectRoots.map(project => join(cwd, project))\n ]\n\n return [...new Set(roots.flatMap(root => {\n const config = TYPESCRIPT_CONFIG_FILENAMES.find(file => existsSync(join(root, file)))\n\n return config ? [join(root, config)] : []\n }))]\n}\n\ninterface TypeScriptDiagnostic {\n code: string\n config: string\n message: string\n}\n\nconst parseTypeScriptDiagnostics = (\n cwd: string,\n config: string,\n output: string\n): TypeScriptDiagnostic[] => output\n .split(/\\r?\\n/)\n .flatMap(line => {\n const match = /\\berror (TS\\d+):\\s*(.+)$/.exec(line)\n\n if (!match) return []\n\n return [{\n code: match[1],\n config: relative(cwd, config),\n message: match[2]\n }]\n })\n\nexport const createTypeScriptPreflight = (\n cwd: string,\n configuredProjects: string[] = [],\n runner: CommandRunner = defaultCommandRunner\n) => {\n const executable = resolveTypeScriptCli(cwd)\n const configs = getTypeScriptConfigs(cwd, configuredProjects)\n\n if (!executable || configs.length === 0) {\n return {\n configs: [],\n diagnosticCount: 0,\n rootDiagnostics: [] as TypeScriptDiagnostic[],\n status: 'skipped' as const\n }\n }\n\n const diagnostics: TypeScriptDiagnostic[] = []\n\n const results = configs.map(config => {\n const result = runner(process.execPath, [\n executable,\n '--noEmit',\n '--pretty',\n 'false',\n '--project',\n config\n ], cwd)\n\n diagnostics.push(...parseTypeScriptDiagnostics(\n cwd,\n config,\n `${result.stdout}\\n${result.stderr}`\n ))\n\n return {\n config: relative(cwd, config),\n status: result.status\n }\n })\n\n const rootDiagnostics = diagnostics.filter(\n diagnostic => TYPESCRIPT_ROOT_DIAGNOSTIC_CODES.has(diagnostic.code)\n )\n\n return {\n configs: results,\n diagnosticCount: diagnostics.length,\n rootDiagnostics: (rootDiagnostics.length > 0 ? rootDiagnostics : diagnostics).slice(0, 20),\n status: results.some(result => result.status !== 0) ? 'failed' as const : 'passed' as const\n }\n}\n\nconst analyzePresetSource = async (\n cwd: string,\n selectedConfig: unknown,\n sourceFiles: string[],\n configuredProjects: string[],\n typescriptRunner: CommandRunner,\n semanticOnly = false,\n write = false\n) => {\n const lintTargets = sourceFiles.length > 0 ? sourceFiles : ['.']\n const lintResults = await loadProjectEslint(cwd, selectedConfig).lintFiles(lintTargets)\n\n const fix = semanticOnly ?\n (message: ProjectLintMessage): boolean => (\n message.ruleId === null || getRuleGroup(message.ruleId) !== 'formatting'\n ) :\n true\n\n const previewResults = await loadProjectEslint(cwd, selectedConfig, fix).lintFiles(lintTargets)\n const byCategory: Record<string, FindingSummary> = {}\n const byFileType: Record<string, FindingSummary> = {}\n const byRule: Record<string, FindingSummary> = {}\n const nonFormattingErrorRules = new Set<string>()\n let nonFormattingErrors = 0\n\n for (const result of lintResults) {\n const fileType = extname(result.filePath) || '[no extension]'\n\n for (const message of result.messages) {\n const rule = message.ruleId ?? (message.fatal ? '[fatal]' : '[unknown]')\n const category = message.ruleId ? getRuleGroup(message.ruleId) : 'correctness'\n\n addFinding(byCategory, category, message)\n\n addFinding(byFileType, fileType, message)\n\n addFinding(byRule, rule, message)\n\n if (message.severity === 2 && category !== 'formatting') {\n nonFormattingErrors++\n\n nonFormattingErrorRules.add(rule)\n }\n }\n }\n\n const changedFiles: string[] = []\n const remainingFixableRules = new Set<string>()\n let estimatedChangedLines = 0\n let remainingErrors = 0\n let remainingWarnings = 0\n let writtenFileCount = 0\n\n for (const result of previewResults) {\n remainingErrors += result.errorCount\n\n remainingWarnings += result.warningCount\n\n for (const message of result.messages) {\n if (message.fix !== undefined) remainingFixableRules.add(message.ruleId ?? '[fatal]')\n }\n\n if (result.output === undefined) continue\n\n changedFiles.push(relative(cwd, result.filePath))\n\n const original = readOriginalSource(result.filePath)\n\n if (original !== undefined) estimatedChangedLines += estimateChangedLines(original, result.output)\n\n if (write) {\n writeFileSync(result.filePath, result.output)\n\n writtenFileCount++\n }\n }\n\n return {\n autofixPreview: {\n changedFileCount: changedFiles.length,\n changedFiles: changedFiles.sort(),\n estimatedChangedLines,\n remainingErrors,\n remainingFixableRules: [...remainingFixableRules].sort(),\n remainingWarnings,\n scope: semanticOnly ? 'semantic' as const : 'all' as const,\n writtenFileCount\n },\n byCategory,\n byFileType,\n byRule,\n lintTargets,\n nonFormattingErrors: {\n count: nonFormattingErrors,\n rules: [...nonFormattingErrorRules].sort()\n },\n sourceFormatParserCandidates: findSourceFormatParserCandidates(\n cwd,\n [...new Set(lintResults.map(result => result.filePath))]\n ),\n typescriptPreflight: createTypeScriptPreflight(cwd, configuredProjects, typescriptRunner),\n totals: {\n errors: lintResults.reduce((total, result) => total + result.errorCount, 0),\n files: lintResults.length,\n findings: lintResults.reduce(\n (total, result) => total + result.errorCount + result.warningCount,\n 0\n ),\n warnings: lintResults.reduce((total, result) => total + result.warningCount, 0)\n }\n }\n}\n\ntype PresetSourceAnalysis = Awaited<ReturnType<typeof analyzePresetSource>>\n\nconst formatSourceAnalysis = (\n analysis: null | PresetSourceAnalysis\n): string[] => {\n if (!analysis) {\n return [\n '',\n 'Pass --analyze-source to lint with the selected preset and preview autofix without writing files.'\n ]\n }\n\n const nonFormattingRuleSuffix = analysis.nonFormattingErrors.rules.length > 0 ?\n ` (${analysis.nonFormattingErrors.rules.join(', ')})` :\n ''\n\n const remainingFixableRules = analysis.autofixPreview.remainingFixableRules.length > 0 ?\n analysis.autofixPreview.remainingFixableRules.join(', ') :\n 'none'\n\n const parserCandidates = analysis.sourceFormatParserCandidates.length > 0 ?\n analysis.sourceFormatParserCandidates.map(candidate => (\n ` - ${candidate.file}:${candidate.lines.join(',')}`\n )) :\n [' - none']\n\n const previewLabel = analysis.autofixPreview.scope === 'semantic' ? 'Semantic autofix' : 'Autofix'\n\n const typescriptLines = analysis.typescriptPreflight.status === 'failed' ?\n [\n `- TypeScript preflight: failed with ${analysis.typescriptPreflight.diagnosticCount} diagnostics`,\n ...analysis.typescriptPreflight.rootDiagnostics.map(diagnostic => (\n ` - ${diagnostic.config} ${diagnostic.code}: ${diagnostic.message}`\n )),\n '- Fix TypeScript compiler errors before reviewing cascading type-aware unsafe-rule findings.'\n ] :\n [\n `- TypeScript preflight: ${analysis.typescriptPreflight.status}` +\n (analysis.typescriptPreflight.status === 'passed' ?\n ` (${analysis.typescriptPreflight.configs.length} configs)` :\n ' (TypeScript or a supported tsconfig was not found)')\n ]\n\n return [\n '',\n `Source analysis (selected preset, ${analysis.autofixPreview.writtenFileCount > 0 ?\n `${analysis.autofixPreview.writtenFileCount} files written` :\n 'no files written'}):`,\n `- Lint targets: ${analysis.lintTargets.join(', ')}`,\n `- Files analyzed: ${analysis.totals.files}`,\n `- Findings: ${analysis.totals.findings} ` +\n `(${analysis.totals.errors} errors, ${analysis.totals.warnings} warnings)`,\n `- Non-formatting errors to resolve first: ${analysis.nonFormattingErrors.count}${nonFormattingRuleSuffix}`,\n `- ${previewLabel} preview: ${analysis.autofixPreview.changedFileCount} files, ` +\n `about ${analysis.autofixPreview.estimatedChangedLines} changed lines`,\n `- Findings remaining after preview: ${analysis.autofixPreview.remainingErrors} errors, ` +\n `${analysis.autofixPreview.remainingWarnings} warnings`,\n `- Fixable rules still remaining: ${remainingFixableRules}`,\n '- Formatting-sensitive source-parser candidates:',\n ...parserCandidates,\n ...typescriptLines\n ]\n}\n\nconst formatCompatibilityGuidance = (\n compatibilityFile: null | string\n): string[] => {\n if (compatibilityFile) {\n return [\n '',\n `Compatibility override written to ${compatibilityFile}. Import it after the preset config.`,\n 'It preserves the current effective configuration, not existing source violations.'\n ]\n }\n\n return [\n '',\n 'Pass --compatibility to write a temporary override that disables newly enabled rules.',\n 'Compatibility output preserves effective configuration, not current source behavior.'\n ]\n}\n\nexport const createPresetReport = async (\n cwd: string,\n presetName: string,\n file = 'eslint.config.js',\n options: CreatePresetReportOptions = {}\n) => {\n if (options.write && !options.semanticOnly) {\n throw new Error('Writing preset fixes requires semanticOnly to avoid an unchecked formatting rewrite.')\n }\n\n const normalizedPreset = presetName.toLowerCase()\n\n if (!PRESETS.has(normalizedPreset)) {\n throw new Error(\n `Unknown preset \"${presetName}\". Use one of: ${[...PRESETS].sort().join(', ')}.`\n )\n }\n\n const preset = normalizedPreset as Preset\n const presetOptions = resolvePreset(preset)\n const current = await loadProjectEslint(cwd).calculateConfigForFile(file)\n const currentMetadata = await loadDefineConfigMetadata(cwd)\n const currentOptions = currentMetadata?.options ?? {}\n\n const targetOptions = {\n ...presetOptions,\n ...currentOptions,\n features: {\n ...presetOptions.features,\n ...currentOptions.features\n },\n frameworks: {\n ...presetOptions.frameworks,\n ...currentOptions.frameworks\n },\n preset,\n root: currentOptions.root ?? cwd\n }\n\n const { missingPackages, options: resolvablePresetOptions } = getResolvablePresetOptions(cwd, targetOptions)\n\n if (!current) {\n throw new Error(`ESLint did not calculate a current configuration for ${file}. Check that the file is not ignored.`)\n }\n\n const selectedConfig = await defineConfig(\n resolvablePresetOptions,\n ...(currentMetadata?.extraConfigs ?? [])\n )\n\n const selected = await loadProjectEslint(cwd, selectedConfig).calculateConfigForFile(file)\n\n if (!selected) {\n throw new Error(`The ${normalizedPreset} preset did not produce a configuration for ${file}.`)\n }\n\n const currentRules = current.rules ?? {}\n const selectedRules = selected.rules ?? {}\n const added: Record<string, unknown> = {}\n const changed: Record<string, { from: unknown, to: unknown }> = {}\n const removed: Record<string, unknown> = {}\n\n for (const [rule, value] of Object.entries(selectedRules)) {\n const currentValue = currentRules[rule]\n\n if (isEnabled(value) && !isEnabled(currentValue)) {\n added[rule] = value\n } else if (\n isEnabled(value) &&\n isEnabled(currentValue) &&\n normalizeRule(value) !== normalizeRule(currentValue)\n ) {\n changed[rule] = { from: currentValue, to: value }\n }\n }\n\n for (const [rule, value] of Object.entries(currentRules)) {\n if (isEnabled(value) && !isEnabled(selectedRules[rule])) removed[rule] = value\n }\n\n const groups = Object.fromEntries(\n ['formatting', 'correctness', 'security', 'framework', 'domain'].map(group => [\n group,\n Object.keys(added).filter(rule => getRuleGroup(rule) === group).sort()\n ])\n )\n\n const sourceAnalysis = options.analyzeSource ?\n await analyzePresetSource(\n cwd,\n selectedConfig,\n options.sourceFiles ?? [],\n Object.keys(resolvablePresetOptions.projects ?? {}),\n options.typescriptRunner ?? defaultCommandRunner,\n options.semanticOnly,\n options.write\n ) :\n null\n\n return {\n added,\n changed,\n compatibilityScope: 'effective-config',\n file,\n groups,\n missingPackages,\n preset: normalizedPreset,\n presetOptions,\n removed,\n sourceAnalysis,\n totals: {\n added: Object.keys(added).length,\n changed: Object.keys(changed).length,\n removed: Object.keys(removed).length\n }\n }\n}\n\nexport const handleExplainPreset = async (\n cwd: string = process.cwd(),\n preset: string,\n options: ExplainPresetOptions = {}\n): Promise<void> => {\n if (options.write && !options.semanticOnly) {\n throw new Error('explain-preset --write requires --semantic-only to avoid an unchecked formatting rewrite.')\n }\n\n if (options.semanticOnly && !options.analyzeSource) {\n throw new Error('explain-preset --semantic-only requires --analyze-source.')\n }\n\n const report = await createPresetReport(cwd, preset, options.file, {\n analyzeSource: options.analyzeSource,\n semanticOnly: options.semanticOnly,\n sourceFiles: options.files,\n write: options.write\n })\n\n let compatibilityFile: null | string = null\n\n if (options.compatibility) {\n const output = options.output ?? `.eslint-preset-${report.preset}-compat.mjs`\n const outputPath = join(cwd, output)\n\n if (existsSync(outputPath)) {\n throw new Error(`${output} already exists; remove it or choose another path with --output.`)\n }\n\n writeFileSync(outputPath, createCompatibilityConfig(report.preset, report.added, report.changed))\n\n compatibilityFile = relative(cwd, outputPath)\n }\n\n const payload = { ...report, compatibilityFile }\n\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2))\n\n return\n }\n\n console.log([\n `Preset adoption report: ${report.preset}`,\n `- Representative file: ${report.file}`,\n '- Config comparison: effective rules and options',\n `- Newly enabled rules: ${report.totals.added}`,\n `- Changed rule options: ${report.totals.changed}`,\n `- Rules no longer enabled: ${report.totals.removed}`,\n `- Optional packs not installed (excluded from comparison): ${report.missingPackages.length > 0 ? report.missingPackages.join(', ') : 'none'}`,\n '',\n ...Object.entries(report.groups).map(([group, rules]) => (\n `- ${group}: ${rules.length}${rules.length > 0 ? ` (${rules.join(', ')})` : ''}`\n )),\n ...formatSourceAnalysis(report.sourceAnalysis),\n ...formatCompatibilityGuidance(compatibilityFile)\n ].join('\\n'))\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli-preset.ts"],"sourcesContent":["/* eslint-disable no-console -- CLI handlers own user-facing terminal output */\n/* eslint-disable complexity -- report comparison and formatting intentionally cover multiple result branches */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire, findPackageJSON } from 'node:module'\nimport { dirname, extname, join, relative } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nimport {\n type DetectedFrameworkName,\n detectProjectOptions,\n type EslintConfigOptions,\n Preset\n} from '@santi020k/eslint-config-core'\n\nimport { type CommandRunner, defaultCommandRunner } from './cli-workflows.js'\nimport { type DefineConfigMetadata, getDefineConfigMetadata } from './define-config-metadata.js'\nimport { defineConfig } from './index.js'\nimport { isMissingRequestedPackage } from './optional-package-errors.js'\nimport { resolvePreset } from './resolvers.js'\n\ninterface EffectiveConfig {\n rules?: Partial<Record<string, unknown>>\n}\n\ninterface ProjectLintMessage {\n fatal?: boolean\n fix?: unknown\n ruleId: null | string\n severity: number\n}\n\ninterface ProjectRuleMetadata {\n fixable?: 'code' | 'whitespace'\n type?: 'layout' | 'problem' | 'suggestion'\n}\n\ninterface ProjectLintResult {\n errorCount: number\n filePath: string\n messages: ProjectLintMessage[]\n output?: string\n warningCount: number\n}\n\ninterface ProjectEslint {\n calculateConfigForFile: (filePath: string) => Promise<EffectiveConfig | null>\n getRulesMetaForResults: (results: ProjectLintResult[]) => Record<string, ProjectRuleMetadata | undefined>\n lintFiles: (patterns: string[]) => Promise<ProjectLintResult[]>\n}\n\ntype ProjectEslintConstructor = new(options: {\n cwd: string\n fix?: boolean | ((message: ProjectLintMessage) => boolean)\n overrideConfig?: unknown\n overrideConfigFile?: boolean\n}) => ProjectEslint\n\nexport interface ExplainPresetOptions {\n analyzeSource?: boolean\n compatibility?: boolean\n file?: string\n files?: string[]\n json?: boolean\n output?: string\n semanticOnly?: boolean\n write?: boolean\n}\n\ninterface CreatePresetReportOptions {\n analyzeSource?: boolean\n semanticOnly?: boolean\n sourceFiles?: string[]\n typescriptRunner?: CommandRunner\n write?: boolean\n}\n\nconst PRESETS = new Set<string>(Object.values(Preset))\n\nconst CONFIG_FILENAMES = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts'\n]\n\nconst loadDefineConfigMetadata = async (cwd: string): Promise<DefineConfigMetadata | undefined> => {\n const configPath = CONFIG_FILENAMES.map(name => join(cwd, name)).find(path => existsSync(path))\n\n if (!configPath) return undefined\n\n try {\n const loaded = await import(`${pathToFileURL(configPath).href}?basic-eslint-preset=${Date.now()}`) as {\n default?: unknown\n }\n\n return getDefineConfigMetadata(await loaded.default)\n } catch {\n return undefined\n }\n}\n\nconst PRESET_FEATURE_PACKAGES = {\n extensions: '@santi020k/eslint-config-extensions',\n formats: '@santi020k/eslint-config-formats',\n libraries: '@santi020k/eslint-config-libraries',\n testing: '@santi020k/eslint-config-testing',\n tools: '@santi020k/eslint-config-tools'\n} as const\n\nconst FRAMEWORK_PACKAGES: Record<DetectedFrameworkName, string> = {\n angular: '@santi020k/eslint-config-angular',\n astro: '@santi020k/eslint-config-astro',\n expo: '@santi020k/eslint-config-expo',\n hono: '@santi020k/eslint-config-hono',\n lit: '@santi020k/eslint-config-lit',\n nest: '@santi020k/eslint-config-nest',\n next: '@santi020k/eslint-config-next',\n nuxt: '@santi020k/eslint-config-nuxt',\n preact: '@santi020k/eslint-config-preact',\n qwik: '@santi020k/eslint-config-qwik',\n react: '@santi020k/eslint-config-react',\n 'react-router': '@santi020k/eslint-config-react-router',\n slidev: '@santi020k/eslint-config-slidev',\n solid: '@santi020k/eslint-config-solid',\n svelte: '@santi020k/eslint-config-svelte',\n 'tanstack-start': '@santi020k/eslint-config-tanstack-start',\n vite: '@santi020k/eslint-config-vite',\n vue: '@santi020k/eslint-config-vue'\n}\n\nconst FRAMEWORK_PREFIXES = new Set([\n '@angular-eslint',\n '@eslint-react',\n '@next/next',\n 'astro',\n 'lit',\n 'qwik',\n 'react',\n 'react-hooks',\n 'react-refresh',\n 'solid',\n 'svelte',\n 'vue'\n])\n\nconst DOMAIN_PREFIXES = new Set([\n 'better-tailwindcss',\n 'drizzle',\n 'graphql-eslint',\n 'i18next',\n 'prisma',\n 'storybook',\n 'tailwindcss',\n 'tanstack-query',\n 'turbo',\n 'zod'\n])\n\nconst FORMAT_PREFIXES = new Set([\n '@stylistic',\n 'css',\n 'html',\n 'jsonc',\n 'markdown',\n 'mdx',\n 'perfectionist',\n 'prettier',\n 'toml',\n 'yaml'\n])\n\nconst FORMAT_RULES = new Set([\n 'import/first',\n 'sort-imports',\n 'simple-import-sort/exports',\n 'simple-import-sort/imports'\n])\n\nconst MULTI_SEGMENT_RULE_PREFIXES = new Set(['@next/next'])\n\nconst getRulePrefix = (rule: string): string => {\n const segments = rule.split('/')\n\n if (!rule.startsWith('@')) return segments[0]\n\n const multiSegmentPrefix = segments.slice(0, 2).join('/')\n\n return MULTI_SEGMENT_RULE_PREFIXES.has(multiSegmentPrefix) ? multiSegmentPrefix : segments[0]\n}\n\nconst getRuleGroup = (rule: string): 'correctness' | 'domain' | 'formatting' | 'framework' | 'security' => {\n const prefix = getRulePrefix(rule)\n\n if (\n prefix === 'security' ||\n prefix === 'no-secrets' ||\n rule.includes('security') ||\n rule.includes('no-unsanitized')\n ) return 'security'\n\n if (FRAMEWORK_PREFIXES.has(prefix)) return 'framework'\n\n if (DOMAIN_PREFIXES.has(prefix)) return 'domain'\n\n if (\n FORMAT_PREFIXES.has(prefix) ||\n FORMAT_RULES.has(rule) ||\n rule.includes('format') ||\n rule.includes('spacing')\n ) return 'formatting'\n\n return 'correctness'\n}\n\nconst getSeverity = (value: unknown): unknown => Array.isArray(value) ? value[0] : value\n\nconst isEnabled = (value: unknown): boolean => {\n const severity = getSeverity(value)\n\n return severity !== 0 && severity !== 'off' && severity !== undefined\n}\n\nconst normalizeRule = (value: unknown): string => JSON.stringify(value)\n\nconst loadProjectEslint = (\n cwd: string,\n overrideConfig?: unknown,\n fix: boolean | ((message: ProjectLintMessage) => boolean) = false\n): ProjectEslint => {\n const projectRequire = createRequire(join(cwd, 'package.json'))\n const eslintModule = projectRequire('eslint') as { ESLint?: ProjectEslintConstructor }\n\n if (!eslintModule.ESLint) throw new Error('The installed eslint package does not expose the ESLint API.')\n\n return new eslintModule.ESLint({\n cwd,\n ...(fix ? { fix } : {}),\n ...(overrideConfig ? { overrideConfig, overrideConfigFile: true } : {})\n })\n}\n\nconst getResolvablePresetOptions = (\n cwd: string,\n presetOptions: Partial<EslintConfigOptions>\n): { missingPackages: string[], options: Partial<EslintConfigOptions> } => {\n const projectPackageUrl = pathToFileURL(join(cwd, 'package.json'))\n const options = { ...presetOptions }\n const detectedOptions = detectProjectOptions(cwd)\n const missingPackages = new Set<string>()\n const detection = options.detection\n const detectionControls = typeof detection === 'object' ? detection : {}\n\n const detectionEnabled = (category: keyof typeof PRESET_FEATURE_PACKAGES): boolean => (\n detection !== false && detectionControls[category] !== false\n )\n\n for (const [category, specifier] of Object.entries(PRESET_FEATURE_PACKAGES)) {\n const categoryKey = category as keyof typeof PRESET_FEATURE_PACKAGES\n const explicit = options[categoryKey]\n const detected = detectionEnabled(categoryKey) ? detectedOptions[categoryKey] : []\n\n const selected = [...new Set([\n ...(Array.isArray(explicit) ? explicit : []),\n ...(Array.isArray(detected) ? detected : [])\n ])]\n\n if (selected.length === 0) continue\n\n try {\n findPackageJSON(specifier, projectPackageUrl)\n } catch (error) {\n if (!isMissingRequestedPackage(error, specifier)) throw error\n\n Object.assign(options, {\n [category]: [],\n detection: {\n ...(typeof options.detection === 'object' ? options.detection : detectionControls),\n [category]: false\n },\n features: {\n ...options.features,\n ...Object.fromEntries(selected.map(feature => [feature, false]))\n }\n })\n\n missingPackages.add(specifier)\n }\n }\n\n const frameworkDetectionEnabled = detection !== false && detectionControls.frameworks !== false\n const detectedFrameworks = frameworkDetectionEnabled ? detectedOptions.detectedFrameworks ?? [] : []\n\n const configuredFrameworks = Object.entries(options.frameworks ?? {})\n .filter((entry): entry is [DetectedFrameworkName, true] => entry[1] === true)\n .map(([framework]) => framework)\n\n const selectedFrameworks = [...new Set([...detectedFrameworks, ...configuredFrameworks])]\n\n const resolvableFrameworks: NonNullable<EslintConfigOptions['frameworks']> = {\n ...options.frameworks\n }\n\n for (const framework of selectedFrameworks) {\n const specifier = FRAMEWORK_PACKAGES[framework]\n\n try {\n findPackageJSON(specifier, projectPackageUrl)\n\n resolvableFrameworks[framework] = true\n } catch (error) {\n if (!isMissingRequestedPackage(error, specifier)) throw error\n\n Reflect.deleteProperty(resolvableFrameworks, framework)\n\n missingPackages.add(specifier)\n }\n }\n\n if (!resolvableFrameworks.react) {\n delete resolvableFrameworks.expo\n\n delete resolvableFrameworks.next\n\n delete resolvableFrameworks['react-router']\n\n if (!resolvableFrameworks.solid) delete resolvableFrameworks['tanstack-start']\n }\n\n if (!resolvableFrameworks.vue) {\n delete resolvableFrameworks.nuxt\n\n delete resolvableFrameworks.slidev\n }\n\n if (selectedFrameworks.length > 0) {\n options.autoFrameworks = false\n\n options.frameworks = resolvableFrameworks\n }\n\n return { missingPackages: [...missingPackages], options }\n}\n\nconst createCompatibilityConfig = (\n preset: string,\n addedRules: Record<string, unknown>,\n changedRules: Record<string, { from: unknown, to: unknown }>\n): string => [\n `// Temporary compatibility override generated for Preset.${preset.charAt(0).toUpperCase()}${preset.slice(1)}.`,\n '// Remove entries as the project adopts the preset findings.',\n 'export default {',\n ` name: 'eslint-config-basic/preset-${preset}-compatibility',`,\n ' rules: {',\n ...Object.keys(addedRules).sort().map(rule => ` ${JSON.stringify(rule)}: 'off',`),\n ...Object.keys(changedRules).sort().map(rule => (\n ` ${JSON.stringify(rule)}: ${JSON.stringify(changedRules[rule].from)},`\n )),\n ' },',\n '}',\n ''\n].join('\\n')\n\ninterface FindingSummary {\n errors: number\n fixable: number\n total: number\n warnings: number\n}\n\nconst createFindingSummary = (): FindingSummary => ({\n errors: 0,\n fixable: 0,\n total: 0,\n warnings: 0\n})\n\nconst addFinding = (\n summaries: Record<string, FindingSummary>,\n key: string,\n message: ProjectLintMessage\n): void => {\n const summary = summaries[key] ?? createFindingSummary()\n\n summary.total++\n\n if (message.severity === 2) summary.errors++\n else summary.warnings++\n\n if (message.fix !== undefined) summary.fixable++\n\n summaries[key] = summary\n}\n\nconst estimateChangedLines = (before: string, after: string): number => {\n const beforeLines = before.split('\\n')\n const afterLines = after.split('\\n')\n const comparableLines = Math.min(beforeLines.length, afterLines.length)\n let changed = Math.abs(beforeLines.length - afterLines.length)\n\n for (let index = 0; index < comparableLines; index++) {\n if (beforeLines[index] !== afterLines[index]) changed++\n }\n\n return changed\n}\n\nconst readOriginalSource = (filePath: string): string | undefined => {\n try {\n return readFileSync(filePath, 'utf8')\n } catch {\n return undefined\n }\n}\n\ninterface SourceFormatParserCandidate {\n file: string\n lines: number[]\n}\n\nconst SOURCE_FILE_READ_PATTERN = /\\b(?:Bun\\.file|Deno\\.readTextFile|readFile|readFileSync|readTextFile)\\b/\n\nconst SOURCE_REGEXP_PATTERN = new RegExp([\n String.raw`\\.match(?:All)?\\s*\\(`,\n String.raw`\\.replace(?:All)?\\s*\\(`,\n String.raw`\\.search\\s*\\(`,\n String.raw`\\bRegExp\\s*\\(`,\n String.raw`\\.(?:exec|test)\\s*\\(`\n].join('|'))\n\nconst findSourceFormatParserCandidates = (\n cwd: string,\n filePaths: string[]\n): SourceFormatParserCandidate[] => filePaths.flatMap(filePath => {\n const content = readOriginalSource(filePath)\n\n if (!content || !SOURCE_FILE_READ_PATTERN.test(content)) return []\n\n const lines = content.split('\\n')\n .flatMap((line, index) => SOURCE_REGEXP_PATTERN.test(line) ? [index + 1] : [])\n\n return lines.length > 0 ? [{ file: relative(cwd, filePath), lines }] : []\n})\n\nconst TYPESCRIPT_CONFIG_FILENAMES = [\n 'tsconfig.json',\n 'tsconfig.base.json',\n 'tsconfig.app.json',\n 'tsconfig.node.json',\n 'tsconfig.eslint.json'\n]\n\nconst TYPESCRIPT_ROOT_DIAGNOSTIC_CODES = new Set([\n 'TS2307',\n 'TS2688',\n 'TS2792',\n 'TS6053'\n])\n\nconst resolveTypeScriptCli = (cwd: string): null | string => {\n try {\n const projectRequire = createRequire(join(cwd, 'package.json'))\n const packagePath = projectRequire.resolve('typescript/package.json')\n\n const manifest = JSON.parse(readFileSync(packagePath, 'utf8')) as {\n bin?: Record<string, string> | string\n }\n\n const bin = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.tsc\n\n return bin ? join(dirname(packagePath), bin) : null\n } catch {\n return null\n }\n}\n\nconst getTypeScriptConfigs = (\n cwd: string,\n configuredProjects: string[]\n): string[] => {\n const detectedProjects = Object.keys(detectProjectOptions(cwd).projects ?? {})\n const projectRoots = [...new Set([...detectedProjects, ...configuredProjects])]\n\n const roots = [\n cwd,\n ...projectRoots.map(project => join(cwd, project))\n ]\n\n return [...new Set(roots.flatMap(root => {\n const config = TYPESCRIPT_CONFIG_FILENAMES.find(file => existsSync(join(root, file)))\n\n return config ? [join(root, config)] : []\n }))]\n}\n\ninterface TypeScriptDiagnostic {\n code: string\n config: string\n message: string\n}\n\nconst parseTypeScriptDiagnostics = (\n cwd: string,\n config: string,\n output: string\n): TypeScriptDiagnostic[] => output\n .split(/\\r?\\n/)\n .flatMap(line => {\n const match = /\\berror (TS\\d+):\\s*(.+)$/.exec(line)\n\n if (!match) return []\n\n return [{\n code: match[1],\n config: relative(cwd, config),\n message: match[2]\n }]\n })\n\nexport const createTypeScriptPreflight = (\n cwd: string,\n configuredProjects: string[] = [],\n runner: CommandRunner = defaultCommandRunner\n) => {\n const executable = resolveTypeScriptCli(cwd)\n const configs = getTypeScriptConfigs(cwd, configuredProjects)\n\n if (!executable || configs.length === 0) {\n return {\n configs: [],\n diagnosticCount: 0,\n rootDiagnostics: [] as TypeScriptDiagnostic[],\n status: 'skipped' as const\n }\n }\n\n const diagnostics: TypeScriptDiagnostic[] = []\n\n const results = configs.map(config => {\n const result = runner(process.execPath, [\n executable,\n '--noEmit',\n '--pretty',\n 'false',\n '--project',\n config\n ], cwd)\n\n diagnostics.push(...parseTypeScriptDiagnostics(\n cwd,\n config,\n `${result.stdout}\\n${result.stderr}`\n ))\n\n return {\n config: relative(cwd, config),\n status: result.status\n }\n })\n\n const rootDiagnostics = diagnostics.filter(\n diagnostic => TYPESCRIPT_ROOT_DIAGNOSTIC_CODES.has(diagnostic.code)\n )\n\n return {\n configs: results,\n diagnosticCount: diagnostics.length,\n rootDiagnostics: (rootDiagnostics.length > 0 ? rootDiagnostics : diagnostics).slice(0, 20),\n status: results.some(result => result.status !== 0) ? 'failed' as const : 'passed' as const\n }\n}\n\nconst analyzePresetSource = async (\n cwd: string,\n selectedConfig: unknown,\n sourceFiles: string[],\n configuredProjects: string[],\n typescriptRunner: CommandRunner,\n semanticOnly = false,\n write = false\n) => {\n const lintTargets = sourceFiles.length > 0 ? sourceFiles : ['.']\n const analysisEslint = loadProjectEslint(cwd, selectedConfig)\n const lintResults = await analysisEslint.lintFiles(lintTargets)\n const rulesMeta = analysisEslint.getRulesMetaForResults(lintResults)\n\n const fix = semanticOnly ?\n (message: ProjectLintMessage): boolean => {\n if (message.ruleId === null) return false\n\n const metadata = rulesMeta[message.ruleId]\n\n if (metadata?.type === 'layout' || metadata?.fixable === 'whitespace') return false\n\n return getRuleGroup(message.ruleId) !== 'formatting'\n } :\n true\n\n const previewResults = await loadProjectEslint(cwd, selectedConfig, fix).lintFiles(lintTargets)\n const byCategory: Record<string, FindingSummary> = {}\n const byFileType: Record<string, FindingSummary> = {}\n const byRule: Record<string, FindingSummary> = {}\n const nonFormattingErrorRules = new Set<string>()\n let nonFormattingErrors = 0\n\n for (const result of lintResults) {\n const fileType = extname(result.filePath) || '[no extension]'\n\n for (const message of result.messages) {\n const rule = message.ruleId ?? (message.fatal ? '[fatal]' : '[unknown]')\n const category = message.ruleId ? getRuleGroup(message.ruleId) : 'correctness'\n\n addFinding(byCategory, category, message)\n\n addFinding(byFileType, fileType, message)\n\n addFinding(byRule, rule, message)\n\n if (message.severity === 2 && category !== 'formatting') {\n nonFormattingErrors++\n\n nonFormattingErrorRules.add(rule)\n }\n }\n }\n\n const changedFiles: string[] = []\n const remainingFixableRules = new Set<string>()\n let estimatedChangedLines = 0\n let remainingErrors = 0\n let remainingWarnings = 0\n let writtenFileCount = 0\n\n for (const result of previewResults) {\n remainingErrors += result.errorCount\n\n remainingWarnings += result.warningCount\n\n for (const message of result.messages) {\n if (message.fix !== undefined) remainingFixableRules.add(message.ruleId ?? '[fatal]')\n }\n\n if (result.output === undefined) continue\n\n changedFiles.push(relative(cwd, result.filePath))\n\n const original = readOriginalSource(result.filePath)\n\n if (original !== undefined) estimatedChangedLines += estimateChangedLines(original, result.output)\n\n if (write) {\n writeFileSync(result.filePath, result.output)\n\n writtenFileCount++\n }\n }\n\n return {\n autofixPreview: {\n changedFileCount: changedFiles.length,\n changedFiles: changedFiles.sort(),\n estimatedChangedLines,\n remainingErrors,\n remainingFixableRules: [...remainingFixableRules].sort(),\n remainingWarnings,\n scope: semanticOnly ? 'semantic' as const : 'all' as const,\n writtenFileCount\n },\n byCategory,\n byFileType,\n byRule,\n lintTargets,\n nonFormattingErrors: {\n count: nonFormattingErrors,\n rules: [...nonFormattingErrorRules].sort()\n },\n sourceFormatParserCandidates: findSourceFormatParserCandidates(\n cwd,\n [...new Set(lintResults.map(result => result.filePath))]\n ),\n typescriptPreflight: createTypeScriptPreflight(cwd, configuredProjects, typescriptRunner),\n totals: {\n errors: lintResults.reduce((total, result) => total + result.errorCount, 0),\n files: lintResults.length,\n findings: lintResults.reduce(\n (total, result) => total + result.errorCount + result.warningCount,\n 0\n ),\n warnings: lintResults.reduce((total, result) => total + result.warningCount, 0)\n }\n }\n}\n\ntype PresetSourceAnalysis = Awaited<ReturnType<typeof analyzePresetSource>>\n\nconst formatSourceAnalysis = (\n analysis: null | PresetSourceAnalysis\n): string[] => {\n if (!analysis) {\n return [\n '',\n 'Pass --analyze-source to lint with the selected preset and preview autofix without writing files.'\n ]\n }\n\n const nonFormattingRuleSuffix = analysis.nonFormattingErrors.rules.length > 0 ?\n ` (${analysis.nonFormattingErrors.rules.join(', ')})` :\n ''\n\n const remainingFixableRules = analysis.autofixPreview.remainingFixableRules.length > 0 ?\n analysis.autofixPreview.remainingFixableRules.join(', ') :\n 'none'\n\n const parserCandidates = analysis.sourceFormatParserCandidates.length > 0 ?\n analysis.sourceFormatParserCandidates.map(candidate => (\n ` - ${candidate.file}:${candidate.lines.join(',')}`\n )) :\n [' - none']\n\n const previewLabel = analysis.autofixPreview.scope === 'semantic' ? 'Semantic autofix' : 'Autofix'\n\n const typescriptLines = analysis.typescriptPreflight.status === 'failed' ?\n [\n `- TypeScript preflight: failed with ${analysis.typescriptPreflight.diagnosticCount} diagnostics`,\n ...analysis.typescriptPreflight.rootDiagnostics.map(diagnostic => (\n ` - ${diagnostic.config} ${diagnostic.code}: ${diagnostic.message}`\n )),\n '- Fix TypeScript compiler errors before reviewing cascading type-aware unsafe-rule findings.'\n ] :\n [\n `- TypeScript preflight: ${analysis.typescriptPreflight.status}` +\n (analysis.typescriptPreflight.status === 'passed' ?\n ` (${analysis.typescriptPreflight.configs.length} configs)` :\n ' (TypeScript or a supported tsconfig was not found)')\n ]\n\n return [\n '',\n `Source analysis (selected preset, ${analysis.autofixPreview.writtenFileCount > 0 ?\n `${analysis.autofixPreview.writtenFileCount} files written` :\n 'no files written'}):`,\n `- Lint targets: ${analysis.lintTargets.join(', ')}`,\n `- Files analyzed: ${analysis.totals.files}`,\n `- Findings: ${analysis.totals.findings} ` +\n `(${analysis.totals.errors} errors, ${analysis.totals.warnings} warnings)`,\n `- Non-formatting errors to resolve first: ${analysis.nonFormattingErrors.count}${nonFormattingRuleSuffix}`,\n `- ${previewLabel} preview: ${analysis.autofixPreview.changedFileCount} files, ` +\n `about ${analysis.autofixPreview.estimatedChangedLines} changed lines`,\n `- Findings remaining after preview: ${analysis.autofixPreview.remainingErrors} errors, ` +\n `${analysis.autofixPreview.remainingWarnings} warnings`,\n `- Fixable rules still remaining: ${remainingFixableRules}`,\n '- Formatting-sensitive source-parser candidates:',\n ...parserCandidates,\n ...typescriptLines\n ]\n}\n\nconst formatCompatibilityGuidance = (\n compatibilityFile: null | string\n): string[] => {\n if (compatibilityFile) {\n return [\n '',\n `Compatibility override written to ${compatibilityFile}. Import it after the preset config.`,\n 'It preserves the current effective configuration, not existing source violations.'\n ]\n }\n\n return [\n '',\n 'Pass --compatibility to write a temporary override that disables newly enabled rules.',\n 'Compatibility output preserves effective configuration, not current source behavior.'\n ]\n}\n\nexport const createPresetReport = async (\n cwd: string,\n presetName: string,\n file = 'eslint.config.js',\n options: CreatePresetReportOptions = {}\n) => {\n if (options.write && !options.semanticOnly) {\n throw new Error('Writing preset fixes requires semanticOnly to avoid an unchecked formatting rewrite.')\n }\n\n const normalizedPreset = presetName.toLowerCase()\n\n if (!PRESETS.has(normalizedPreset)) {\n throw new Error(\n `Unknown preset \"${presetName}\". Use one of: ${[...PRESETS].sort().join(', ')}.`\n )\n }\n\n const preset = normalizedPreset as Preset\n const presetOptions = resolvePreset(preset)\n const current = await loadProjectEslint(cwd).calculateConfigForFile(file)\n const currentMetadata = await loadDefineConfigMetadata(cwd)\n const currentOptions = currentMetadata?.options ?? {}\n\n const targetOptions = {\n ...presetOptions,\n ...currentOptions,\n features: {\n ...presetOptions.features,\n ...currentOptions.features\n },\n frameworks: {\n ...presetOptions.frameworks,\n ...currentOptions.frameworks\n },\n preset,\n root: currentOptions.root ?? cwd\n }\n\n const { missingPackages, options: resolvablePresetOptions } = getResolvablePresetOptions(cwd, targetOptions)\n\n if (!current) {\n throw new Error(`ESLint did not calculate a current configuration for ${file}. Check that the file is not ignored.`)\n }\n\n const selectedConfig = await defineConfig(\n resolvablePresetOptions,\n ...(currentMetadata?.extraConfigs ?? [])\n )\n\n const selected = await loadProjectEslint(cwd, selectedConfig).calculateConfigForFile(file)\n\n if (!selected) {\n throw new Error(`The ${normalizedPreset} preset did not produce a configuration for ${file}.`)\n }\n\n const currentRules = current.rules ?? {}\n const selectedRules = selected.rules ?? {}\n const added: Record<string, unknown> = {}\n const changed: Record<string, { from: unknown, to: unknown }> = {}\n const removed: Record<string, unknown> = {}\n\n for (const [rule, value] of Object.entries(selectedRules)) {\n const currentValue = currentRules[rule]\n\n if (isEnabled(value) && !isEnabled(currentValue)) {\n added[rule] = value\n } else if (\n isEnabled(value) &&\n isEnabled(currentValue) &&\n normalizeRule(value) !== normalizeRule(currentValue)\n ) {\n changed[rule] = { from: currentValue, to: value }\n }\n }\n\n for (const [rule, value] of Object.entries(currentRules)) {\n if (isEnabled(value) && !isEnabled(selectedRules[rule])) removed[rule] = value\n }\n\n const groups = Object.fromEntries(\n ['formatting', 'correctness', 'security', 'framework', 'domain'].map(group => [\n group,\n Object.keys(added).filter(rule => getRuleGroup(rule) === group).sort()\n ])\n )\n\n const sourceAnalysis = options.analyzeSource ?\n await analyzePresetSource(\n cwd,\n selectedConfig,\n options.sourceFiles ?? [],\n Object.keys(resolvablePresetOptions.projects ?? {}),\n options.typescriptRunner ?? defaultCommandRunner,\n options.semanticOnly,\n options.write\n ) :\n null\n\n return {\n added,\n changed,\n compatibilityScope: 'effective-config',\n file,\n groups,\n missingPackages,\n preset: normalizedPreset,\n presetOptions,\n removed,\n sourceAnalysis,\n totals: {\n added: Object.keys(added).length,\n changed: Object.keys(changed).length,\n removed: Object.keys(removed).length\n }\n }\n}\n\nexport const handleExplainPreset = async (\n cwd: string = process.cwd(),\n preset: string,\n options: ExplainPresetOptions = {}\n): Promise<void> => {\n if (options.write && !options.semanticOnly) {\n throw new Error('explain-preset --write requires --semantic-only to avoid an unchecked formatting rewrite.')\n }\n\n if (options.semanticOnly && !options.analyzeSource) {\n throw new Error('explain-preset --semantic-only requires --analyze-source.')\n }\n\n const report = await createPresetReport(cwd, preset, options.file, {\n analyzeSource: options.analyzeSource,\n semanticOnly: options.semanticOnly,\n sourceFiles: options.files,\n write: options.write\n })\n\n let compatibilityFile: null | string = null\n\n if (options.compatibility) {\n const output = options.output ?? `.eslint-preset-${report.preset}-compat.mjs`\n const outputPath = join(cwd, output)\n\n if (existsSync(outputPath)) {\n throw new Error(`${output} already exists; remove it or choose another path with --output.`)\n }\n\n writeFileSync(outputPath, createCompatibilityConfig(report.preset, report.added, report.changed))\n\n compatibilityFile = relative(cwd, outputPath)\n }\n\n const payload = { ...report, compatibilityFile }\n\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2))\n\n return\n }\n\n console.log([\n `Preset adoption report: ${report.preset}`,\n `- Representative file: ${report.file}`,\n '- Config comparison: effective rules and options',\n `- Newly enabled rules: ${report.totals.added}`,\n `- Changed rule options: ${report.totals.changed}`,\n `- Rules no longer enabled: ${report.totals.removed}`,\n `- Optional packs not installed (excluded from comparison): ${report.missingPackages.length > 0 ? report.missingPackages.join(', ') : 'none'}`,\n '',\n ...Object.entries(report.groups).map(([group, rules]) => (\n `- ${group}: ${rules.length}${rules.length > 0 ? ` (${rules.join(', ')})` : ''}`\n )),\n ...formatSourceAnalysis(report.sourceAnalysis),\n ...formatCompatibilityGuidance(compatibilityFile)\n ].join('\\n'))\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli-workflows.js
CHANGED
|
@@ -73,17 +73,27 @@ const formatTypeScriptDiagnostic = (typescript, diagnostic, cwd) => {
|
|
|
73
73
|
};
|
|
74
74
|
const getConfigAmbientOptions = (configPath) => {
|
|
75
75
|
const content = readFileSync(configPath, "utf8");
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
76
|
+
const projectRequire = createRequire(configPath);
|
|
77
|
+
const typeRoots = /* @__PURE__ */ new Set();
|
|
78
|
+
const types = /* @__PURE__ */ new Set();
|
|
79
|
+
const addAmbientTypes = (packageName, typeName) => {
|
|
80
|
+
try {
|
|
81
|
+
const manifest = projectRequire.resolve(`${packageName}/package.json`);
|
|
82
|
+
typeRoots.add(dirname(dirname(manifest)));
|
|
83
|
+
types.add(typeName);
|
|
84
|
+
return true;
|
|
85
|
+
} catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
if (/\b(?:Buffer|NodeJS|process|require|module|__dirname|__filename)\b/.test(content) || /\bimport\.meta\.(?:dirname|filename)\b/.test(content)) addAmbientTypes("@types/node", "node");
|
|
90
|
+
if (/\bBun\b|["']bun(?::[^"']+)?["']/.test(content)) {
|
|
91
|
+
if (!addAmbientTypes("@types/bun", "bun")) addAmbientTypes("bun-types", "bun-types");
|
|
86
92
|
}
|
|
93
|
+
return {
|
|
94
|
+
...typeRoots.size > 0 ? { typeRoots: [...typeRoots] } : {},
|
|
95
|
+
types: [...types]
|
|
96
|
+
};
|
|
87
97
|
};
|
|
88
98
|
const getConfigCompilerOptions = (typescript, configPath) => {
|
|
89
99
|
const tsconfig = typescript.findConfigFile(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-workflows.ts"],"sourcesContent":["/* eslint-disable complexity -- workflow handlers intentionally cover CLI output and compatibility branches */\n/* eslint-disable no-console -- CLI handlers own user-facing terminal output */\nimport { spawnSync } from 'node:child_process'\nimport { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path'\n\nimport type * as TypeScript from 'typescript'\nimport type { CompilerOptions, Diagnostic, Program } from 'typescript'\n\ntype TypeScriptApi = typeof TypeScript\n\nexport interface CommandResult {\n status: number\n stderr: string\n stdout: string\n}\n\nexport type CommandRunner = (\n executable: string,\n args: string[],\n cwd: string\n) => CommandResult\n\nexport interface BaselineOptions {\n json?: boolean\n preset?: string\n prune?: boolean\n}\n\nexport interface ProfileOptions {\n concurrency?: string\n files?: string[]\n json?: boolean\n maxDurationMs?: number\n maxRuleTimeMs?: number\n maxWarnings?: number\n}\n\nexport interface SnapshotOptions {\n check?: boolean\n files?: string[]\n json?: boolean\n rulesOnly?: boolean\n snapshotPath?: string\n}\n\nexport interface ConfigTypesOptions {\n files?: string[]\n json?: boolean\n}\n\ninterface ConfigTypeFileResult {\n declarations: string[]\n file: string\n issues: string[]\n portable: boolean\n tsconfig: null | string\n}\n\ninterface ConfigTypesReport {\n files: ConfigTypeFileResult[]\n portable: boolean\n typescriptVersion: string\n}\n\nexport interface SnapshotDiff {\n added: string[]\n changed: { after: unknown, before: unknown, rule: string }[]\n file: string\n removed: string[]\n}\n\ninterface EslintSnapshotFile {\n globals: Record<string, unknown>\n languageOptions: {\n ecmaVersion?: unknown\n sourceType?: unknown\n }\n plugins: string[]\n rules: Record<string, unknown>\n}\n\ninterface EslintSnapshot {\n files: Record<string, EslintSnapshotFile>\n scope?: 'rules'\n version: 1 | 2\n}\n\ninterface EslintStats {\n times?: {\n passes?: {\n fix?: { total?: number }\n parse?: { total?: number }\n rules?: Record<string, { total?: number }>\n total?: number\n }[]\n }\n}\n\ninterface EslintResult {\n errorCount?: number\n filePath?: string\n fatalErrorCount?: number\n stats?: EslintStats\n warningCount?: number\n}\n\ninterface ProfileRun {\n concurrency: string\n durationMs: number\n errorCount: number\n fatalErrorCount: number\n fileCount: number\n parseMs: number\n ruleMs: number\n slowestRules: { rule: string, timeMs: number }[]\n status: number\n warningCount: number\n}\n\ninterface ProjectEslint {\n calculateConfigForFile: (filePath: string) => Promise<unknown>\n isPathIgnored?: (filePath: string) => Promise<boolean>\n}\n\ntype ProjectEslintConstructor = new(options: { cwd: string }) => ProjectEslint\n\nconst SNAPSHOT_FILENAME = '.eslint-config-snapshot.json'\n\nconst ESLINT_CONFIG_FILENAMES = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts'\n]\n\nconst NON_PORTABLE_DECLARATION_PATTERNS = [\n { label: 'a pnpm-internal installation path', pattern: /(?:^|[\\\\/])\\.pnpm(?:[\\\\/]|$)/m },\n { label: 'the transitive typescript-eslint package', pattern: /[\"']typescript-eslint[\"']/m }\n]\n\nconst SOURCE_EXTENSIONS = new Set([\n '.astro',\n '.cjs',\n '.css',\n '.cts',\n '.gql',\n '.graphql',\n '.html',\n '.js',\n '.json',\n '.json5',\n '.jsonc',\n '.jsx',\n '.md',\n '.mdx',\n '.mjs',\n '.mts',\n '.svelte',\n '.toml',\n '.ts',\n '.tsx',\n '.vue',\n '.yaml',\n '.yml'\n])\n\nconst IGNORED_DIRECTORIES = new Set([\n '.git',\n '.next',\n '.nuxt',\n '.output',\n '.turbo',\n 'build',\n 'coverage',\n 'dist',\n 'node_modules'\n])\n\nexport const defaultCommandRunner: CommandRunner = (executable, args, cwd) => {\n const result = spawnSync(executable, args, {\n cwd,\n encoding: 'utf8',\n env: process.env,\n maxBuffer: 50 * 1024 * 1024\n })\n\n return {\n status: result.status ?? 1,\n stderr: result.stderr,\n stdout: result.stdout\n }\n}\n\nconst resolveProjectRequire = (cwd: string) => createRequire(join(cwd, 'package.json'))\n\nconst formatTypeScriptDiagnostic = (\n typescript: TypeScriptApi,\n diagnostic: Diagnostic,\n cwd: string\n): string => {\n const message = typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')\n\n if (!diagnostic.file || diagnostic.start === undefined) return `TS${diagnostic.code}: ${message}`\n\n const position = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start)\n\n return `${relative(cwd, diagnostic.file.fileName)}:${position.line + 1}:${position.character + 1} ` +\n `TS${diagnostic.code}: ${message}`\n}\n\nconst getConfigAmbientOptions = (\n configPath: string\n): Pick<CompilerOptions, 'typeRoots' | 'types'> => {\n const content = readFileSync(configPath, 'utf8')\n\n const usesNodeGlobals = (\n /\\b(?:Buffer|NodeJS|process|require|module|__dirname|__filename)\\b/.test(content) ||\n /\\bimport\\.meta\\.(?:dirname|filename)\\b/.test(content)\n )\n\n if (!usesNodeGlobals) return { types: [] }\n\n try {\n const nodeManifest = createRequire(configPath).resolve('@types/node/package.json')\n\n return {\n typeRoots: [dirname(dirname(nodeManifest))],\n types: ['node']\n }\n } catch {\n return { types: [] }\n }\n}\n\nconst getConfigCompilerOptions = (\n typescript: TypeScriptApi,\n configPath: string\n): { diagnostics: Diagnostic[], options: CompilerOptions, tsconfig: null | string } => {\n const tsconfig = typescript.findConfigFile(\n dirname(configPath),\n fileName => typescript.sys.fileExists(fileName)\n )\n\n const diagnostics: Diagnostic[] = []\n let options: CompilerOptions = {}\n\n if (tsconfig) {\n const readResult = typescript.readConfigFile(\n tsconfig,\n fileName => typescript.sys.readFile(fileName)\n )\n\n if (readResult.error) {\n diagnostics.push(readResult.error)\n } else {\n const parsed = typescript.parseJsonConfigFileContent(\n readResult.config,\n typescript.sys,\n dirname(tsconfig)\n )\n\n diagnostics.push(...parsed.errors.filter(diagnostic => ![18002, 18003].includes(diagnostic.code)))\n\n options = parsed.options\n }\n }\n\n return {\n diagnostics,\n options: {\n ...options,\n ...getConfigAmbientOptions(configPath),\n allowJs: true,\n checkJs: false,\n composite: false,\n declaration: true,\n declarationDir: undefined,\n emitDeclarationOnly: true,\n incremental: false,\n ...(Number(typescript.versionMajorMinor.split('.')[0]) >= 6 ? { ignoreDeprecations: '6.0' } : {}),\n module: options.module ?? typescript.ModuleKind.NodeNext,\n moduleResolution: options.moduleResolution ?? typescript.ModuleResolutionKind.NodeNext,\n noEmit: false,\n noEmitOnError: false,\n outDir: undefined,\n rootDir: undefined,\n skipLibCheck: true,\n target: options.target ?? typescript.ScriptTarget.ES2022,\n tsBuildInfoFile: undefined\n },\n tsconfig: tsconfig ?? null\n }\n}\n\nconst emitConfigDeclarations = (\n typescript: TypeScriptApi,\n cwd: string,\n configPath: string\n): ConfigTypeFileResult => {\n const setup = getConfigCompilerOptions(typescript, configPath)\n const program: Program = typescript.createProgram([configPath], setup.options)\n const outputs = new Map<string, string>()\n\n const emitResult = program.emit(\n undefined,\n (fileName, content) => outputs.set(fileName, content),\n undefined,\n true\n )\n\n const diagnostics = [\n ...setup.diagnostics,\n ...typescript.getPreEmitDiagnostics(program),\n ...emitResult.diagnostics\n ].filter(diagnostic => diagnostic.category === typescript.DiagnosticCategory.Error)\n\n const declarationStem = `${basename(configPath, extname(configPath))}.d.`\n\n const declarations = [...outputs.entries()]\n .filter(([fileName]) => (\n basename(fileName).startsWith(declarationStem) && /\\.d\\.(?:cts|mts|ts)$/.test(fileName)\n ))\n\n const issues = [...new Set(\n diagnostics.map(diagnostic => formatTypeScriptDiagnostic(typescript, diagnostic, cwd))\n )]\n\n if (declarations.length === 0) issues.push('TypeScript did not emit a declaration for this config.')\n\n for (const [fileName, content] of declarations) {\n for (const { label, pattern } of NON_PORTABLE_DECLARATION_PATTERNS) {\n if (pattern.test(content)) issues.push(`${relative(cwd, fileName)} references ${label}.`)\n }\n }\n\n return {\n declarations: declarations.map(([fileName]) => relative(cwd, fileName)).sort(),\n file: relative(cwd, configPath),\n issues,\n portable: issues.length === 0,\n tsconfig: setup.tsconfig ? relative(cwd, setup.tsconfig) : null\n }\n}\n\nexport const createConfigTypesReport = (\n cwd: string = process.cwd(),\n options: ConfigTypesOptions = {}\n): ConfigTypesReport => {\n const projectRequire = resolveProjectRequire(cwd)\n let typescript: TypeScriptApi\n\n try {\n typescript = projectRequire('typescript') as TypeScriptApi\n } catch {\n throw new Error('TypeScript is required for config-types. Install it in the consumer project first.')\n }\n\n const configPaths = (options.files && options.files.length > 0 ?\n options.files.map(file => resolve(cwd, file)) :\n ESLINT_CONFIG_FILENAMES.map(file => join(cwd, file)).filter(file => existsSync(file)))\n\n if (configPaths.length === 0) {\n throw new Error('No eslint.config.* file was found. Pass --file for a project-scoped config.')\n }\n\n for (const configPath of configPaths) {\n if (!existsSync(configPath)) throw new Error(`Config file does not exist: ${relative(cwd, configPath)}`)\n }\n\n const files = configPaths.map(configPath => emitConfigDeclarations(typescript, cwd, configPath))\n\n return {\n files,\n portable: files.every(file => file.portable),\n typescriptVersion: typescript.version\n }\n}\n\nexport const handleConfigTypes = (\n cwd: string = process.cwd(),\n options: ConfigTypesOptions = {}\n): void => {\n const report = createConfigTypesReport(cwd, options)\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2))\n } else {\n console.log([\n `ESLint config declaration portability: ${report.portable ? 'passed' : 'failed'}`,\n `- TypeScript: ${report.typescriptVersion}`,\n ...report.files.flatMap(file => [\n `- ${file.file}: ${file.portable ? 'portable' : 'not portable'} ` +\n `(tsconfig: ${file.tsconfig ?? 'compiler defaults'})`,\n ...file.issues.map(issue => ` - ${issue}`)\n ])\n ].join('\\n'))\n }\n\n if (!report.portable) process.exitCode = 1\n}\n\nconst readJson = (filePath: string): unknown => {\n if (!existsSync(filePath)) return null\n\n try {\n return JSON.parse(readFileSync(filePath, 'utf8')) as unknown\n } catch {\n return null\n }\n}\n\nconst resolveEslintCli = (cwd: string): string => {\n const projectRequire = resolveProjectRequire(cwd)\n const packagePath = projectRequire.resolve('eslint/package.json')\n const metadata = readJson(packagePath) as null | { bin?: string | Record<string, string> }\n const bin = typeof metadata?.bin === 'string' ? metadata.bin : metadata?.bin?.eslint\n\n if (!bin) throw new Error('The project ESLint CLI could not be resolved. Install eslint before running this command.')\n\n return resolve(dirname(packagePath), bin)\n}\n\nconst runEslint = (\n cwd: string,\n args: string[],\n runner: CommandRunner\n): CommandResult => runner(process.execPath, [resolveEslintCli(cwd), ...args], cwd)\n\nconst outputCommandFailure = (label: string, result: CommandResult): never => {\n const details = result.stderr.trim() || result.stdout.trim() || `exit code ${result.status}`\n\n throw new Error(`${label} failed: ${details}`)\n}\n\nconst createBackupPath = (filePath: string, suffix: string): string => {\n const preferred = `${filePath}.${suffix}.bak`\n\n if (!existsSync(preferred)) return preferred\n\n let index = 2\n\n while (existsSync(`${preferred}.${index}`)) index++\n\n return `${preferred}.${index}`\n}\n\nconst updateConfigStrictPreset = (cwd: string, preset: string): null | string => {\n if (!['ci', 'pedantic'].includes(preset)) {\n throw new Error(`Unsupported baseline preset \"${preset}\". Use \"ci\" or \"pedantic\".`)\n }\n\n const configPath = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts'\n ].map(name => join(cwd, name)).find(path => existsSync(path))\n\n if (!configPath) throw new Error('No eslint.config.* file was found. Run basic-eslint init first.')\n\n const content = readFileSync(configPath, 'utf8')\n\n if (new RegExp(`strict\\\\s*:\\\\s*['\"]${preset}['\"]`).test(content)) return null\n\n const zeroArgumentPattern = /\\bdefineConfig\\(\\s*\\)/\n\n if (!zeroArgumentPattern.test(content)) {\n throw new Error(\n `Cannot safely add strict: \"${preset}\" to a customized config. ` +\n 'Add it manually, then run basic-eslint baseline without --preset.'\n )\n }\n\n const backupPath = createBackupPath(configPath, 'baseline')\n\n writeFileSync(backupPath, content)\n\n writeFileSync(configPath, content.replace(zeroArgumentPattern, `defineConfig({ strict: '${preset}' })`))\n\n return basename(backupPath)\n}\n\nexport const handleBaseline = (\n cwd: string = process.cwd(),\n options: BaselineOptions = {},\n runner: CommandRunner = defaultCommandRunner\n): void => {\n const backup = options.preset ? updateConfigStrictPreset(cwd, options.preset) : null\n\n const args = options.prune ?\n ['.', '--prune-suppressions'] :\n ['.', '--fix', '--suppress-all']\n\n const result = runEslint(cwd, args, runner)\n\n if (result.status !== 0) outputCommandFailure('ESLint baseline', result)\n\n const payload = {\n action: options.prune ? 'pruned' : 'created',\n backup,\n preset: options.preset ?? null,\n suppressionsFile: join(cwd, 'eslint-suppressions.json')\n }\n\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2))\n\n return\n }\n\n console.log(options.prune ?\n '✅ Pruned unused ESLint suppressions.' :\n '✅ Created or refreshed eslint-suppressions.json for existing violations.')\n\n if (backup) console.log(`📦 Backed up the previous config to ${backup}.`)\n}\n\nconst getStatsPasses = (result: EslintResult) => result.stats?.times?.passes ?? []\n\nconst summarizeProfileResults = (\n concurrency: string,\n results: EslintResult[],\n durationMs: number,\n status: number\n): ProfileRun => {\n const ruleTimes = new Map<string, number>()\n let parseMs = 0\n let ruleMs = 0\n\n for (const result of results) {\n for (const pass of getStatsPasses(result)) {\n parseMs += pass.parse?.total ?? 0\n\n for (const [rule, timing] of Object.entries(pass.rules ?? {})) {\n const time = timing.total ?? 0\n\n ruleMs += time\n\n ruleTimes.set(rule, (ruleTimes.get(rule) ?? 0) + time)\n }\n }\n }\n\n return {\n concurrency,\n durationMs,\n errorCount: results.reduce((total, result) => total + (result.errorCount ?? 0), 0),\n fatalErrorCount: results.reduce((total, result) => total + (result.fatalErrorCount ?? 0), 0),\n fileCount: results.length,\n parseMs,\n ruleMs,\n slowestRules: [...ruleTimes.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15)\n .map(([rule, timeMs]) => ({ rule, timeMs })),\n status,\n warningCount: results.reduce((total, result) => total + (result.warningCount ?? 0), 0)\n }\n}\n\nconst runProfile = (\n cwd: string,\n files: string[],\n concurrency: string,\n runner: CommandRunner\n): ProfileRun => {\n const startedAt = performance.now()\n\n const result = runEslint(\n cwd,\n [...files, '--stats', '--format', 'json', '--concurrency', concurrency],\n runner\n )\n\n const durationMs = performance.now() - startedAt\n let parsed: EslintResult[] = []\n\n try {\n parsed = JSON.parse(result.stdout) as EslintResult[]\n } catch {\n outputCommandFailure('ESLint profile', result)\n }\n\n return summarizeProfileResults(concurrency, parsed, durationMs, result.status)\n}\n\nconst round = (value: number): number => Math.round(value * 100) / 100\n\nexport const handleProfile = (\n cwd: string = process.cwd(),\n options: ProfileOptions = {},\n runner: CommandRunner = defaultCommandRunner\n): void => {\n for (const [name, value] of [\n ['max-duration', options.maxDurationMs],\n ['max-rule-time', options.maxRuleTimeMs],\n ['max-warnings', options.maxWarnings]\n ] as const) {\n if (value !== undefined && (!Number.isFinite(value) || value < 0)) {\n throw new Error(`--${name} must be a non-negative number.`)\n }\n }\n\n const files = options.files?.length ? options.files : ['.']\n const concurrencyModes = options.concurrency ? [options.concurrency] : ['off', 'auto']\n const runs = concurrencyModes.map(concurrency => runProfile(cwd, files, concurrency, runner))\n const successfulRuns = runs.filter(run => run.fatalErrorCount === 0 && run.status < 2)\n\n const recommendation = successfulRuns.length > 0 ?\n successfulRuns.toSorted((a, b) => a.durationMs - b.durationMs)[0].concurrency :\n null\n\n const budgetRun = successfulRuns.toSorted((a, b) => a.durationMs - b.durationMs)[0] ?? runs[0]\n\n const violations: string[] = successfulRuns.length === 0 ?\n ['ESLint profiling did not produce a successful run.'] :\n []\n\n if (options.maxDurationMs !== undefined && budgetRun.durationMs > options.maxDurationMs) {\n violations.push(\n `Duration ${round(budgetRun.durationMs)}ms exceeds the ${options.maxDurationMs}ms budget.`\n )\n }\n\n if (options.maxWarnings !== undefined && budgetRun.warningCount > options.maxWarnings) {\n violations.push(\n `Warnings ${budgetRun.warningCount} exceed the ${options.maxWarnings} warning budget.`\n )\n }\n\n const slowestRule = budgetRun.slowestRules.at(0)\n\n if (options.maxRuleTimeMs !== undefined && slowestRule && slowestRule.timeMs > options.maxRuleTimeMs) {\n violations.push(\n `${slowestRule.rule} took ${round(slowestRule.timeMs)}ms, exceeding the ${options.maxRuleTimeMs}ms rule budget.`\n )\n }\n\n const payload = {\n budget: {\n limits: {\n maxDurationMs: options.maxDurationMs ?? null,\n maxRuleTimeMs: options.maxRuleTimeMs ?? null,\n maxWarnings: options.maxWarnings ?? null\n },\n passed: violations.length === 0,\n violations\n },\n recommendation,\n runs: runs.map(run => ({\n ...run,\n durationMs: round(run.durationMs),\n parseMs: round(run.parseMs),\n ruleMs: round(run.ruleMs),\n slowestRules: run.slowestRules.map(item => ({ ...item, timeMs: round(item.timeMs) }))\n }))\n }\n\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2))\n\n if (!payload.budget.passed) process.exitCode = 1\n\n return\n }\n\n console.log('ESLint performance profile:')\n\n for (const run of payload.runs) {\n console.log(\n `- concurrency=${run.concurrency}: ${run.durationMs}ms, ${run.fileCount} files, ` +\n `${run.errorCount} errors, ${run.warningCount} warnings`\n )\n }\n\n if (payload.recommendation) console.log(`- Recommended concurrency: ${payload.recommendation}`)\n\n if (!payload.budget.passed) {\n console.log('Budget violations:')\n\n for (const violation of payload.budget.violations) console.log(`- ${violation}`)\n\n process.exitCode = 1\n }\n\n const slowestRules = payload.runs[0]?.slowestRules ?? []\n\n if (slowestRules.length > 0) {\n console.log('Slowest rules:')\n\n for (const item of slowestRules.slice(0, 10)) {\n console.log(`- ${item.rule}: ${item.timeMs}ms`)\n }\n }\n}\n\nconst walkSourceFiles = (cwd: string, directory = cwd, output: string[] = []): string[] => {\n if (output.length >= 5000) return output\n\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (output.length >= 5000) break\n\n if (entry.isDirectory()) {\n if (!IGNORED_DIRECTORIES.has(entry.name)) {\n walkSourceFiles(cwd, join(directory, entry.name), output)\n }\n\n continue\n }\n\n if (SOURCE_EXTENSIONS.has(extname(entry.name))) {\n output.push(relative(cwd, join(directory, entry.name)))\n }\n }\n\n return output\n}\n\nconst classifyRepresentativeFile = (filePath: string): string => {\n if (/eslint\\.config\\.[cm]?[jt]s$/.test(filePath)) return 'config'\n\n if (/\\.(test|spec)\\.[cm]?[jt]sx?$/.test(filePath)) return 'test'\n\n return extname(filePath)\n}\n\nexport const findRepresentativeFiles = (cwd: string): string[] => {\n const selected = new Map<string, string>()\n\n for (const filePath of walkSourceFiles(cwd)) {\n const category = classifyRepresentativeFile(filePath)\n\n if (!selected.has(category)) selected.set(category, filePath)\n }\n\n return [...selected.values()].sort()\n}\n\nconst findUnignoredRepresentativeFiles = async (\n cwd: string,\n eslint: ProjectEslint\n): Promise<string[]> => {\n const selected = new Map<string, string>()\n\n for (const filePath of walkSourceFiles(cwd)) {\n const category = classifyRepresentativeFile(filePath)\n\n if (selected.has(category)) continue\n\n const config = eslint.isPathIgnored ?\n undefined :\n await eslint.calculateConfigForFile(filePath)\n\n const ignored = eslint.isPathIgnored ?\n await eslint.isPathIgnored(filePath) :\n config === null || config === undefined\n\n if (!ignored) selected.set(category, filePath)\n }\n\n return [...selected.values()].sort()\n}\n\nconst loadProjectEslint = (cwd: string): ProjectEslint => {\n const projectRequire = resolveProjectRequire(cwd)\n const eslintModule = projectRequire('eslint') as { ESLint?: ProjectEslintConstructor }\n\n if (!eslintModule.ESLint) throw new Error('The installed eslint package does not expose the ESLint API.')\n\n return new eslintModule.ESLint({ cwd })\n}\n\nconst normalizeSerializableObject = (value: unknown): Record<string, unknown> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entry]) => {\n try {\n JSON.stringify(entry)\n\n return true\n } catch {\n return false\n }\n })\n .sort(([a], [b]) => a.localeCompare(b))\n )\n}\n\nconst getObjectKeys = (value: unknown): string[] => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return []\n\n return Object.keys(value).sort()\n}\n\nconst normalizeConfig = (\n config: unknown,\n scope: 'all' | 'rules'\n): EslintSnapshotFile => {\n const resolved = config && typeof config === 'object' ?\n config as {\n languageOptions?: {\n ecmaVersion?: unknown\n globals?: unknown\n sourceType?: unknown\n }\n plugins?: unknown\n rules?: unknown\n } :\n {}\n\n return {\n globals: scope === 'rules' ? {} : normalizeSerializableObject(resolved.languageOptions?.globals),\n languageOptions: scope === 'rules' ?\n {} :\n {\n ecmaVersion: resolved.languageOptions?.ecmaVersion,\n sourceType: resolved.languageOptions?.sourceType\n },\n plugins: scope === 'rules' ? [] : getObjectKeys(resolved.plugins),\n rules: normalizeSerializableObject(resolved.rules)\n }\n}\n\nexport const createConfigSnapshot = async (\n cwd: string,\n files?: string[],\n eslint: ProjectEslint = loadProjectEslint(cwd),\n scope: 'all' | 'rules' = 'all'\n): Promise<EslintSnapshot> => {\n const representativeFiles = files?.length ?\n files :\n await findUnignoredRepresentativeFiles(cwd, eslint)\n\n if (representativeFiles.length === 0) {\n throw new Error('No representative source files were found. Pass one or more --file paths.')\n }\n\n const entries = await Promise.all(representativeFiles.map(async filePath => {\n const config = await eslint.calculateConfigForFile(filePath)\n\n return [filePath, normalizeConfig(config, scope)] as const\n }))\n\n return {\n files: Object.fromEntries(entries),\n ...(scope === 'rules' ? { scope } : {}),\n version: scope === 'rules' ? 2 : 1\n }\n}\n\nconst sameValue = (left: unknown, right: unknown): boolean => JSON.stringify(left) === JSON.stringify(right)\n\nconst getSnapshotValues = (snapshot?: EslintSnapshotFile): Record<string, unknown> => {\n if (!snapshot) return {}\n\n return {\n ...snapshot.rules,\n ...Object.fromEntries(\n Object.entries(snapshot.globals).map(([name, value]) => [`globals:${name}`, value])\n ),\n ...Object.fromEntries(\n Object.entries(snapshot.languageOptions)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => [`languageOptions:${name}`, value])\n ),\n ...Object.fromEntries(snapshot.plugins.map(name => [`plugins:${name}`, true]))\n }\n}\n\nexport const diffConfigSnapshots = (\n previous: EslintSnapshot,\n current: EslintSnapshot\n): SnapshotDiff[] => {\n const files = new Set([...Object.keys(previous.files), ...Object.keys(current.files)])\n const diffs: SnapshotDiff[] = []\n\n for (const file of [...files].sort()) {\n const before = getSnapshotValues(previous.files[file])\n const after = getSnapshotValues(current.files[file])\n const added = Object.keys(after).filter(rule => !(rule in before)).sort()\n const removed = Object.keys(before).filter(rule => !(rule in after)).sort()\n\n const changed = Object.keys(after)\n .filter(rule => rule in before && !sameValue(before[rule], after[rule]))\n .sort()\n .map(rule => ({ after: after[rule], before: before[rule], rule }))\n\n if (added.length > 0 || removed.length > 0 || changed.length > 0) {\n diffs.push({ added, changed, file, removed })\n }\n }\n\n return diffs\n}\n\nconst outputSnapshotDiff = (diffs: SnapshotDiff[]): void => {\n if (diffs.length === 0) {\n console.log('✅ Effective ESLint configuration matches the saved snapshot.')\n\n return\n }\n\n console.log(`ESLint configuration changed for ${diffs.length} representative file(s):`)\n\n for (const diff of diffs) {\n console.log(`- ${diff.file}`)\n\n if (diff.added.length > 0) console.log(` Added: ${diff.added.join(', ')}`)\n\n if (diff.removed.length > 0) console.log(` Removed: ${diff.removed.join(', ')}`)\n\n for (const change of diff.changed) {\n console.log(` Changed ${change.rule}: ${JSON.stringify(change.before)} → ${JSON.stringify(change.after)}`)\n }\n }\n}\n\nexport const handleSnapshot = async (\n cwd: string = process.cwd(),\n options: SnapshotOptions = {},\n eslint?: ProjectEslint\n): Promise<void> => {\n const snapshotPath = resolve(cwd, options.snapshotPath ?? SNAPSHOT_FILENAME)\n const previous = readJson(snapshotPath) as EslintSnapshot | null\n\n if (options.check) {\n if (!previous) {\n if (options.json) {\n console.log(JSON.stringify({ exists: false, snapshotPath }, null, 2))\n } else {\n console.error(`❌ Snapshot is missing: ${relative(cwd, snapshotPath)}`)\n }\n\n process.exitCode = 1\n\n return\n }\n\n const files = options.files?.length ? options.files : Object.keys(previous.files)\n const current = await createConfigSnapshot(cwd, files, eslint, previous.scope ?? 'all')\n const diffs = diffConfigSnapshots(previous, current)\n\n if (options.json) console.log(JSON.stringify({ diffs, snapshotPath }, null, 2))\n else outputSnapshotDiff(diffs)\n\n if (diffs.length > 0) process.exitCode = 1\n\n return\n }\n\n const current = await createConfigSnapshot(\n cwd,\n options.files,\n eslint,\n options.rulesOnly ? 'rules' : 'all'\n )\n\n writeFileSync(snapshotPath, `${JSON.stringify(current, null, 2)}\\n`)\n\n if (options.json) {\n console.log(JSON.stringify({\n files: Object.keys(current.files),\n snapshotPath\n }, null, 2))\n } else {\n console.log(`✅ Saved effective ESLint configuration to ${relative(cwd, snapshotPath)}.`)\n }\n}\n\nexport const handleSnapshotDiff = async (\n cwd: string = process.cwd(),\n options: SnapshotOptions = {},\n eslint?: ProjectEslint\n): Promise<void> => {\n const snapshotPath = resolve(cwd, options.snapshotPath ?? SNAPSHOT_FILENAME)\n const previous = readJson(snapshotPath) as EslintSnapshot | null\n\n if (!previous) throw new Error(`Snapshot is missing: ${relative(cwd, snapshotPath)}. Run basic-eslint snapshot first.`)\n\n const files = options.files?.length ? options.files : Object.keys(previous.files)\n const current = await createConfigSnapshot(cwd, files, eslint, previous.scope ?? 'all')\n const diffs = diffConfigSnapshots(previous, current)\n\n if (options.json) console.log(JSON.stringify({ diffs, snapshotPath }, null, 2))\n else outputSnapshotDiff(diffs)\n\n if (diffs.length > 0) process.exitCode = 1\n}\n\nexport const isDirectory = (path: string): boolean => {\n try {\n return statSync(path).isDirectory()\n } catch {\n return false\n }\n}\n"],"mappings":"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","names":["current"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli-workflows.ts"],"sourcesContent":["/* eslint-disable complexity -- workflow handlers intentionally cover CLI output and compatibility branches */\n/* eslint-disable no-console -- CLI handlers own user-facing terminal output */\nimport { spawnSync } from 'node:child_process'\nimport { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path'\n\nimport type * as TypeScript from 'typescript'\nimport type { CompilerOptions, Diagnostic, Program } from 'typescript'\n\ntype TypeScriptApi = typeof TypeScript\n\nexport interface CommandResult {\n status: number\n stderr: string\n stdout: string\n}\n\nexport type CommandRunner = (\n executable: string,\n args: string[],\n cwd: string\n) => CommandResult\n\nexport interface BaselineOptions {\n json?: boolean\n preset?: string\n prune?: boolean\n}\n\nexport interface ProfileOptions {\n concurrency?: string\n files?: string[]\n json?: boolean\n maxDurationMs?: number\n maxRuleTimeMs?: number\n maxWarnings?: number\n}\n\nexport interface SnapshotOptions {\n check?: boolean\n files?: string[]\n json?: boolean\n rulesOnly?: boolean\n snapshotPath?: string\n}\n\nexport interface ConfigTypesOptions {\n files?: string[]\n json?: boolean\n}\n\ninterface ConfigTypeFileResult {\n declarations: string[]\n file: string\n issues: string[]\n portable: boolean\n tsconfig: null | string\n}\n\ninterface ConfigTypesReport {\n files: ConfigTypeFileResult[]\n portable: boolean\n typescriptVersion: string\n}\n\nexport interface SnapshotDiff {\n added: string[]\n changed: { after: unknown, before: unknown, rule: string }[]\n file: string\n removed: string[]\n}\n\ninterface EslintSnapshotFile {\n globals: Record<string, unknown>\n languageOptions: {\n ecmaVersion?: unknown\n sourceType?: unknown\n }\n plugins: string[]\n rules: Record<string, unknown>\n}\n\ninterface EslintSnapshot {\n files: Record<string, EslintSnapshotFile>\n scope?: 'rules'\n version: 1 | 2\n}\n\ninterface EslintStats {\n times?: {\n passes?: {\n fix?: { total?: number }\n parse?: { total?: number }\n rules?: Record<string, { total?: number }>\n total?: number\n }[]\n }\n}\n\ninterface EslintResult {\n errorCount?: number\n filePath?: string\n fatalErrorCount?: number\n stats?: EslintStats\n warningCount?: number\n}\n\ninterface ProfileRun {\n concurrency: string\n durationMs: number\n errorCount: number\n fatalErrorCount: number\n fileCount: number\n parseMs: number\n ruleMs: number\n slowestRules: { rule: string, timeMs: number }[]\n status: number\n warningCount: number\n}\n\ninterface ProjectEslint {\n calculateConfigForFile: (filePath: string) => Promise<unknown>\n isPathIgnored?: (filePath: string) => Promise<boolean>\n}\n\ntype ProjectEslintConstructor = new(options: { cwd: string }) => ProjectEslint\n\nconst SNAPSHOT_FILENAME = '.eslint-config-snapshot.json'\n\nconst ESLINT_CONFIG_FILENAMES = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts'\n]\n\nconst NON_PORTABLE_DECLARATION_PATTERNS = [\n { label: 'a pnpm-internal installation path', pattern: /(?:^|[\\\\/])\\.pnpm(?:[\\\\/]|$)/m },\n { label: 'the transitive typescript-eslint package', pattern: /[\"']typescript-eslint[\"']/m }\n]\n\nconst SOURCE_EXTENSIONS = new Set([\n '.astro',\n '.cjs',\n '.css',\n '.cts',\n '.gql',\n '.graphql',\n '.html',\n '.js',\n '.json',\n '.json5',\n '.jsonc',\n '.jsx',\n '.md',\n '.mdx',\n '.mjs',\n '.mts',\n '.svelte',\n '.toml',\n '.ts',\n '.tsx',\n '.vue',\n '.yaml',\n '.yml'\n])\n\nconst IGNORED_DIRECTORIES = new Set([\n '.git',\n '.next',\n '.nuxt',\n '.output',\n '.turbo',\n 'build',\n 'coverage',\n 'dist',\n 'node_modules'\n])\n\nexport const defaultCommandRunner: CommandRunner = (executable, args, cwd) => {\n const result = spawnSync(executable, args, {\n cwd,\n encoding: 'utf8',\n env: process.env,\n maxBuffer: 50 * 1024 * 1024\n })\n\n return {\n status: result.status ?? 1,\n stderr: result.stderr,\n stdout: result.stdout\n }\n}\n\nconst resolveProjectRequire = (cwd: string) => createRequire(join(cwd, 'package.json'))\n\nconst formatTypeScriptDiagnostic = (\n typescript: TypeScriptApi,\n diagnostic: Diagnostic,\n cwd: string\n): string => {\n const message = typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')\n\n if (!diagnostic.file || diagnostic.start === undefined) return `TS${diagnostic.code}: ${message}`\n\n const position = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start)\n\n return `${relative(cwd, diagnostic.file.fileName)}:${position.line + 1}:${position.character + 1} ` +\n `TS${diagnostic.code}: ${message}`\n}\n\nconst getConfigAmbientOptions = (\n configPath: string\n): Pick<CompilerOptions, 'typeRoots' | 'types'> => {\n const content = readFileSync(configPath, 'utf8')\n const projectRequire = createRequire(configPath)\n const typeRoots = new Set<string>()\n const types = new Set<string>()\n\n const addAmbientTypes = (packageName: string, typeName: string): boolean => {\n try {\n const manifest = projectRequire.resolve(`${packageName}/package.json`)\n\n typeRoots.add(dirname(dirname(manifest)))\n\n types.add(typeName)\n\n return true\n } catch {\n return false\n }\n }\n\n if (\n /\\b(?:Buffer|NodeJS|process|require|module|__dirname|__filename)\\b/.test(content) ||\n /\\bimport\\.meta\\.(?:dirname|filename)\\b/.test(content)\n ) addAmbientTypes('@types/node', 'node')\n\n if (/\\bBun\\b|[\"']bun(?::[^\"']+)?[\"']/.test(content)) {\n if (!addAmbientTypes('@types/bun', 'bun')) addAmbientTypes('bun-types', 'bun-types')\n }\n\n return {\n ...(typeRoots.size > 0 ? { typeRoots: [...typeRoots] } : {}),\n types: [...types]\n }\n}\n\nconst getConfigCompilerOptions = (\n typescript: TypeScriptApi,\n configPath: string\n): { diagnostics: Diagnostic[], options: CompilerOptions, tsconfig: null | string } => {\n const tsconfig = typescript.findConfigFile(\n dirname(configPath),\n fileName => typescript.sys.fileExists(fileName)\n )\n\n const diagnostics: Diagnostic[] = []\n let options: CompilerOptions = {}\n\n if (tsconfig) {\n const readResult = typescript.readConfigFile(\n tsconfig,\n fileName => typescript.sys.readFile(fileName)\n )\n\n if (readResult.error) {\n diagnostics.push(readResult.error)\n } else {\n const parsed = typescript.parseJsonConfigFileContent(\n readResult.config,\n typescript.sys,\n dirname(tsconfig)\n )\n\n diagnostics.push(...parsed.errors.filter(diagnostic => ![18002, 18003].includes(diagnostic.code)))\n\n options = parsed.options\n }\n }\n\n return {\n diagnostics,\n options: {\n ...options,\n ...getConfigAmbientOptions(configPath),\n allowJs: true,\n checkJs: false,\n composite: false,\n declaration: true,\n declarationDir: undefined,\n emitDeclarationOnly: true,\n incremental: false,\n ...(Number(typescript.versionMajorMinor.split('.')[0]) >= 6 ? { ignoreDeprecations: '6.0' } : {}),\n module: options.module ?? typescript.ModuleKind.NodeNext,\n moduleResolution: options.moduleResolution ?? typescript.ModuleResolutionKind.NodeNext,\n noEmit: false,\n noEmitOnError: false,\n outDir: undefined,\n rootDir: undefined,\n skipLibCheck: true,\n target: options.target ?? typescript.ScriptTarget.ES2022,\n tsBuildInfoFile: undefined\n },\n tsconfig: tsconfig ?? null\n }\n}\n\nconst emitConfigDeclarations = (\n typescript: TypeScriptApi,\n cwd: string,\n configPath: string\n): ConfigTypeFileResult => {\n const setup = getConfigCompilerOptions(typescript, configPath)\n const program: Program = typescript.createProgram([configPath], setup.options)\n const outputs = new Map<string, string>()\n\n const emitResult = program.emit(\n undefined,\n (fileName, content) => outputs.set(fileName, content),\n undefined,\n true\n )\n\n const diagnostics = [\n ...setup.diagnostics,\n ...typescript.getPreEmitDiagnostics(program),\n ...emitResult.diagnostics\n ].filter(diagnostic => diagnostic.category === typescript.DiagnosticCategory.Error)\n\n const declarationStem = `${basename(configPath, extname(configPath))}.d.`\n\n const declarations = [...outputs.entries()]\n .filter(([fileName]) => (\n basename(fileName).startsWith(declarationStem) && /\\.d\\.(?:cts|mts|ts)$/.test(fileName)\n ))\n\n const issues = [...new Set(\n diagnostics.map(diagnostic => formatTypeScriptDiagnostic(typescript, diagnostic, cwd))\n )]\n\n if (declarations.length === 0) issues.push('TypeScript did not emit a declaration for this config.')\n\n for (const [fileName, content] of declarations) {\n for (const { label, pattern } of NON_PORTABLE_DECLARATION_PATTERNS) {\n if (pattern.test(content)) issues.push(`${relative(cwd, fileName)} references ${label}.`)\n }\n }\n\n return {\n declarations: declarations.map(([fileName]) => relative(cwd, fileName)).sort(),\n file: relative(cwd, configPath),\n issues,\n portable: issues.length === 0,\n tsconfig: setup.tsconfig ? relative(cwd, setup.tsconfig) : null\n }\n}\n\nexport const createConfigTypesReport = (\n cwd: string = process.cwd(),\n options: ConfigTypesOptions = {}\n): ConfigTypesReport => {\n const projectRequire = resolveProjectRequire(cwd)\n let typescript: TypeScriptApi\n\n try {\n typescript = projectRequire('typescript') as TypeScriptApi\n } catch {\n throw new Error('TypeScript is required for config-types. Install it in the consumer project first.')\n }\n\n const configPaths = (options.files && options.files.length > 0 ?\n options.files.map(file => resolve(cwd, file)) :\n ESLINT_CONFIG_FILENAMES.map(file => join(cwd, file)).filter(file => existsSync(file)))\n\n if (configPaths.length === 0) {\n throw new Error('No eslint.config.* file was found. Pass --file for a project-scoped config.')\n }\n\n for (const configPath of configPaths) {\n if (!existsSync(configPath)) throw new Error(`Config file does not exist: ${relative(cwd, configPath)}`)\n }\n\n const files = configPaths.map(configPath => emitConfigDeclarations(typescript, cwd, configPath))\n\n return {\n files,\n portable: files.every(file => file.portable),\n typescriptVersion: typescript.version\n }\n}\n\nexport const handleConfigTypes = (\n cwd: string = process.cwd(),\n options: ConfigTypesOptions = {}\n): void => {\n const report = createConfigTypesReport(cwd, options)\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2))\n } else {\n console.log([\n `ESLint config declaration portability: ${report.portable ? 'passed' : 'failed'}`,\n `- TypeScript: ${report.typescriptVersion}`,\n ...report.files.flatMap(file => [\n `- ${file.file}: ${file.portable ? 'portable' : 'not portable'} ` +\n `(tsconfig: ${file.tsconfig ?? 'compiler defaults'})`,\n ...file.issues.map(issue => ` - ${issue}`)\n ])\n ].join('\\n'))\n }\n\n if (!report.portable) process.exitCode = 1\n}\n\nconst readJson = (filePath: string): unknown => {\n if (!existsSync(filePath)) return null\n\n try {\n return JSON.parse(readFileSync(filePath, 'utf8')) as unknown\n } catch {\n return null\n }\n}\n\nconst resolveEslintCli = (cwd: string): string => {\n const projectRequire = resolveProjectRequire(cwd)\n const packagePath = projectRequire.resolve('eslint/package.json')\n const metadata = readJson(packagePath) as null | { bin?: string | Record<string, string> }\n const bin = typeof metadata?.bin === 'string' ? metadata.bin : metadata?.bin?.eslint\n\n if (!bin) throw new Error('The project ESLint CLI could not be resolved. Install eslint before running this command.')\n\n return resolve(dirname(packagePath), bin)\n}\n\nconst runEslint = (\n cwd: string,\n args: string[],\n runner: CommandRunner\n): CommandResult => runner(process.execPath, [resolveEslintCli(cwd), ...args], cwd)\n\nconst outputCommandFailure = (label: string, result: CommandResult): never => {\n const details = result.stderr.trim() || result.stdout.trim() || `exit code ${result.status}`\n\n throw new Error(`${label} failed: ${details}`)\n}\n\nconst createBackupPath = (filePath: string, suffix: string): string => {\n const preferred = `${filePath}.${suffix}.bak`\n\n if (!existsSync(preferred)) return preferred\n\n let index = 2\n\n while (existsSync(`${preferred}.${index}`)) index++\n\n return `${preferred}.${index}`\n}\n\nconst updateConfigStrictPreset = (cwd: string, preset: string): null | string => {\n if (!['ci', 'pedantic'].includes(preset)) {\n throw new Error(`Unsupported baseline preset \"${preset}\". Use \"ci\" or \"pedantic\".`)\n }\n\n const configPath = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts'\n ].map(name => join(cwd, name)).find(path => existsSync(path))\n\n if (!configPath) throw new Error('No eslint.config.* file was found. Run basic-eslint init first.')\n\n const content = readFileSync(configPath, 'utf8')\n\n if (new RegExp(`strict\\\\s*:\\\\s*['\"]${preset}['\"]`).test(content)) return null\n\n const zeroArgumentPattern = /\\bdefineConfig\\(\\s*\\)/\n\n if (!zeroArgumentPattern.test(content)) {\n throw new Error(\n `Cannot safely add strict: \"${preset}\" to a customized config. ` +\n 'Add it manually, then run basic-eslint baseline without --preset.'\n )\n }\n\n const backupPath = createBackupPath(configPath, 'baseline')\n\n writeFileSync(backupPath, content)\n\n writeFileSync(configPath, content.replace(zeroArgumentPattern, `defineConfig({ strict: '${preset}' })`))\n\n return basename(backupPath)\n}\n\nexport const handleBaseline = (\n cwd: string = process.cwd(),\n options: BaselineOptions = {},\n runner: CommandRunner = defaultCommandRunner\n): void => {\n const backup = options.preset ? updateConfigStrictPreset(cwd, options.preset) : null\n\n const args = options.prune ?\n ['.', '--prune-suppressions'] :\n ['.', '--fix', '--suppress-all']\n\n const result = runEslint(cwd, args, runner)\n\n if (result.status !== 0) outputCommandFailure('ESLint baseline', result)\n\n const payload = {\n action: options.prune ? 'pruned' : 'created',\n backup,\n preset: options.preset ?? null,\n suppressionsFile: join(cwd, 'eslint-suppressions.json')\n }\n\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2))\n\n return\n }\n\n console.log(options.prune ?\n '✅ Pruned unused ESLint suppressions.' :\n '✅ Created or refreshed eslint-suppressions.json for existing violations.')\n\n if (backup) console.log(`📦 Backed up the previous config to ${backup}.`)\n}\n\nconst getStatsPasses = (result: EslintResult) => result.stats?.times?.passes ?? []\n\nconst summarizeProfileResults = (\n concurrency: string,\n results: EslintResult[],\n durationMs: number,\n status: number\n): ProfileRun => {\n const ruleTimes = new Map<string, number>()\n let parseMs = 0\n let ruleMs = 0\n\n for (const result of results) {\n for (const pass of getStatsPasses(result)) {\n parseMs += pass.parse?.total ?? 0\n\n for (const [rule, timing] of Object.entries(pass.rules ?? {})) {\n const time = timing.total ?? 0\n\n ruleMs += time\n\n ruleTimes.set(rule, (ruleTimes.get(rule) ?? 0) + time)\n }\n }\n }\n\n return {\n concurrency,\n durationMs,\n errorCount: results.reduce((total, result) => total + (result.errorCount ?? 0), 0),\n fatalErrorCount: results.reduce((total, result) => total + (result.fatalErrorCount ?? 0), 0),\n fileCount: results.length,\n parseMs,\n ruleMs,\n slowestRules: [...ruleTimes.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15)\n .map(([rule, timeMs]) => ({ rule, timeMs })),\n status,\n warningCount: results.reduce((total, result) => total + (result.warningCount ?? 0), 0)\n }\n}\n\nconst runProfile = (\n cwd: string,\n files: string[],\n concurrency: string,\n runner: CommandRunner\n): ProfileRun => {\n const startedAt = performance.now()\n\n const result = runEslint(\n cwd,\n [...files, '--stats', '--format', 'json', '--concurrency', concurrency],\n runner\n )\n\n const durationMs = performance.now() - startedAt\n let parsed: EslintResult[] = []\n\n try {\n parsed = JSON.parse(result.stdout) as EslintResult[]\n } catch {\n outputCommandFailure('ESLint profile', result)\n }\n\n return summarizeProfileResults(concurrency, parsed, durationMs, result.status)\n}\n\nconst round = (value: number): number => Math.round(value * 100) / 100\n\nexport const handleProfile = (\n cwd: string = process.cwd(),\n options: ProfileOptions = {},\n runner: CommandRunner = defaultCommandRunner\n): void => {\n for (const [name, value] of [\n ['max-duration', options.maxDurationMs],\n ['max-rule-time', options.maxRuleTimeMs],\n ['max-warnings', options.maxWarnings]\n ] as const) {\n if (value !== undefined && (!Number.isFinite(value) || value < 0)) {\n throw new Error(`--${name} must be a non-negative number.`)\n }\n }\n\n const files = options.files?.length ? options.files : ['.']\n const concurrencyModes = options.concurrency ? [options.concurrency] : ['off', 'auto']\n const runs = concurrencyModes.map(concurrency => runProfile(cwd, files, concurrency, runner))\n const successfulRuns = runs.filter(run => run.fatalErrorCount === 0 && run.status < 2)\n\n const recommendation = successfulRuns.length > 0 ?\n successfulRuns.toSorted((a, b) => a.durationMs - b.durationMs)[0].concurrency :\n null\n\n const budgetRun = successfulRuns.toSorted((a, b) => a.durationMs - b.durationMs)[0] ?? runs[0]\n\n const violations: string[] = successfulRuns.length === 0 ?\n ['ESLint profiling did not produce a successful run.'] :\n []\n\n if (options.maxDurationMs !== undefined && budgetRun.durationMs > options.maxDurationMs) {\n violations.push(\n `Duration ${round(budgetRun.durationMs)}ms exceeds the ${options.maxDurationMs}ms budget.`\n )\n }\n\n if (options.maxWarnings !== undefined && budgetRun.warningCount > options.maxWarnings) {\n violations.push(\n `Warnings ${budgetRun.warningCount} exceed the ${options.maxWarnings} warning budget.`\n )\n }\n\n const slowestRule = budgetRun.slowestRules.at(0)\n\n if (options.maxRuleTimeMs !== undefined && slowestRule && slowestRule.timeMs > options.maxRuleTimeMs) {\n violations.push(\n `${slowestRule.rule} took ${round(slowestRule.timeMs)}ms, exceeding the ${options.maxRuleTimeMs}ms rule budget.`\n )\n }\n\n const payload = {\n budget: {\n limits: {\n maxDurationMs: options.maxDurationMs ?? null,\n maxRuleTimeMs: options.maxRuleTimeMs ?? null,\n maxWarnings: options.maxWarnings ?? null\n },\n passed: violations.length === 0,\n violations\n },\n recommendation,\n runs: runs.map(run => ({\n ...run,\n durationMs: round(run.durationMs),\n parseMs: round(run.parseMs),\n ruleMs: round(run.ruleMs),\n slowestRules: run.slowestRules.map(item => ({ ...item, timeMs: round(item.timeMs) }))\n }))\n }\n\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2))\n\n if (!payload.budget.passed) process.exitCode = 1\n\n return\n }\n\n console.log('ESLint performance profile:')\n\n for (const run of payload.runs) {\n console.log(\n `- concurrency=${run.concurrency}: ${run.durationMs}ms, ${run.fileCount} files, ` +\n `${run.errorCount} errors, ${run.warningCount} warnings`\n )\n }\n\n if (payload.recommendation) console.log(`- Recommended concurrency: ${payload.recommendation}`)\n\n if (!payload.budget.passed) {\n console.log('Budget violations:')\n\n for (const violation of payload.budget.violations) console.log(`- ${violation}`)\n\n process.exitCode = 1\n }\n\n const slowestRules = payload.runs[0]?.slowestRules ?? []\n\n if (slowestRules.length > 0) {\n console.log('Slowest rules:')\n\n for (const item of slowestRules.slice(0, 10)) {\n console.log(`- ${item.rule}: ${item.timeMs}ms`)\n }\n }\n}\n\nconst walkSourceFiles = (cwd: string, directory = cwd, output: string[] = []): string[] => {\n if (output.length >= 5000) return output\n\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (output.length >= 5000) break\n\n if (entry.isDirectory()) {\n if (!IGNORED_DIRECTORIES.has(entry.name)) {\n walkSourceFiles(cwd, join(directory, entry.name), output)\n }\n\n continue\n }\n\n if (SOURCE_EXTENSIONS.has(extname(entry.name))) {\n output.push(relative(cwd, join(directory, entry.name)))\n }\n }\n\n return output\n}\n\nconst classifyRepresentativeFile = (filePath: string): string => {\n if (/eslint\\.config\\.[cm]?[jt]s$/.test(filePath)) return 'config'\n\n if (/\\.(test|spec)\\.[cm]?[jt]sx?$/.test(filePath)) return 'test'\n\n return extname(filePath)\n}\n\nexport const findRepresentativeFiles = (cwd: string): string[] => {\n const selected = new Map<string, string>()\n\n for (const filePath of walkSourceFiles(cwd)) {\n const category = classifyRepresentativeFile(filePath)\n\n if (!selected.has(category)) selected.set(category, filePath)\n }\n\n return [...selected.values()].sort()\n}\n\nconst findUnignoredRepresentativeFiles = async (\n cwd: string,\n eslint: ProjectEslint\n): Promise<string[]> => {\n const selected = new Map<string, string>()\n\n for (const filePath of walkSourceFiles(cwd)) {\n const category = classifyRepresentativeFile(filePath)\n\n if (selected.has(category)) continue\n\n const config = eslint.isPathIgnored ?\n undefined :\n await eslint.calculateConfigForFile(filePath)\n\n const ignored = eslint.isPathIgnored ?\n await eslint.isPathIgnored(filePath) :\n config === null || config === undefined\n\n if (!ignored) selected.set(category, filePath)\n }\n\n return [...selected.values()].sort()\n}\n\nconst loadProjectEslint = (cwd: string): ProjectEslint => {\n const projectRequire = resolveProjectRequire(cwd)\n const eslintModule = projectRequire('eslint') as { ESLint?: ProjectEslintConstructor }\n\n if (!eslintModule.ESLint) throw new Error('The installed eslint package does not expose the ESLint API.')\n\n return new eslintModule.ESLint({ cwd })\n}\n\nconst normalizeSerializableObject = (value: unknown): Record<string, unknown> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entry]) => {\n try {\n JSON.stringify(entry)\n\n return true\n } catch {\n return false\n }\n })\n .sort(([a], [b]) => a.localeCompare(b))\n )\n}\n\nconst getObjectKeys = (value: unknown): string[] => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return []\n\n return Object.keys(value).sort()\n}\n\nconst normalizeConfig = (\n config: unknown,\n scope: 'all' | 'rules'\n): EslintSnapshotFile => {\n const resolved = config && typeof config === 'object' ?\n config as {\n languageOptions?: {\n ecmaVersion?: unknown\n globals?: unknown\n sourceType?: unknown\n }\n plugins?: unknown\n rules?: unknown\n } :\n {}\n\n return {\n globals: scope === 'rules' ? {} : normalizeSerializableObject(resolved.languageOptions?.globals),\n languageOptions: scope === 'rules' ?\n {} :\n {\n ecmaVersion: resolved.languageOptions?.ecmaVersion,\n sourceType: resolved.languageOptions?.sourceType\n },\n plugins: scope === 'rules' ? [] : getObjectKeys(resolved.plugins),\n rules: normalizeSerializableObject(resolved.rules)\n }\n}\n\nexport const createConfigSnapshot = async (\n cwd: string,\n files?: string[],\n eslint: ProjectEslint = loadProjectEslint(cwd),\n scope: 'all' | 'rules' = 'all'\n): Promise<EslintSnapshot> => {\n const representativeFiles = files?.length ?\n files :\n await findUnignoredRepresentativeFiles(cwd, eslint)\n\n if (representativeFiles.length === 0) {\n throw new Error('No representative source files were found. Pass one or more --file paths.')\n }\n\n const entries = await Promise.all(representativeFiles.map(async filePath => {\n const config = await eslint.calculateConfigForFile(filePath)\n\n return [filePath, normalizeConfig(config, scope)] as const\n }))\n\n return {\n files: Object.fromEntries(entries),\n ...(scope === 'rules' ? { scope } : {}),\n version: scope === 'rules' ? 2 : 1\n }\n}\n\nconst sameValue = (left: unknown, right: unknown): boolean => JSON.stringify(left) === JSON.stringify(right)\n\nconst getSnapshotValues = (snapshot?: EslintSnapshotFile): Record<string, unknown> => {\n if (!snapshot) return {}\n\n return {\n ...snapshot.rules,\n ...Object.fromEntries(\n Object.entries(snapshot.globals).map(([name, value]) => [`globals:${name}`, value])\n ),\n ...Object.fromEntries(\n Object.entries(snapshot.languageOptions)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => [`languageOptions:${name}`, value])\n ),\n ...Object.fromEntries(snapshot.plugins.map(name => [`plugins:${name}`, true]))\n }\n}\n\nexport const diffConfigSnapshots = (\n previous: EslintSnapshot,\n current: EslintSnapshot\n): SnapshotDiff[] => {\n const files = new Set([...Object.keys(previous.files), ...Object.keys(current.files)])\n const diffs: SnapshotDiff[] = []\n\n for (const file of [...files].sort()) {\n const before = getSnapshotValues(previous.files[file])\n const after = getSnapshotValues(current.files[file])\n const added = Object.keys(after).filter(rule => !(rule in before)).sort()\n const removed = Object.keys(before).filter(rule => !(rule in after)).sort()\n\n const changed = Object.keys(after)\n .filter(rule => rule in before && !sameValue(before[rule], after[rule]))\n .sort()\n .map(rule => ({ after: after[rule], before: before[rule], rule }))\n\n if (added.length > 0 || removed.length > 0 || changed.length > 0) {\n diffs.push({ added, changed, file, removed })\n }\n }\n\n return diffs\n}\n\nconst outputSnapshotDiff = (diffs: SnapshotDiff[]): void => {\n if (diffs.length === 0) {\n console.log('✅ Effective ESLint configuration matches the saved snapshot.')\n\n return\n }\n\n console.log(`ESLint configuration changed for ${diffs.length} representative file(s):`)\n\n for (const diff of diffs) {\n console.log(`- ${diff.file}`)\n\n if (diff.added.length > 0) console.log(` Added: ${diff.added.join(', ')}`)\n\n if (diff.removed.length > 0) console.log(` Removed: ${diff.removed.join(', ')}`)\n\n for (const change of diff.changed) {\n console.log(` Changed ${change.rule}: ${JSON.stringify(change.before)} → ${JSON.stringify(change.after)}`)\n }\n }\n}\n\nexport const handleSnapshot = async (\n cwd: string = process.cwd(),\n options: SnapshotOptions = {},\n eslint?: ProjectEslint\n): Promise<void> => {\n const snapshotPath = resolve(cwd, options.snapshotPath ?? SNAPSHOT_FILENAME)\n const previous = readJson(snapshotPath) as EslintSnapshot | null\n\n if (options.check) {\n if (!previous) {\n if (options.json) {\n console.log(JSON.stringify({ exists: false, snapshotPath }, null, 2))\n } else {\n console.error(`❌ Snapshot is missing: ${relative(cwd, snapshotPath)}`)\n }\n\n process.exitCode = 1\n\n return\n }\n\n const files = options.files?.length ? options.files : Object.keys(previous.files)\n const current = await createConfigSnapshot(cwd, files, eslint, previous.scope ?? 'all')\n const diffs = diffConfigSnapshots(previous, current)\n\n if (options.json) console.log(JSON.stringify({ diffs, snapshotPath }, null, 2))\n else outputSnapshotDiff(diffs)\n\n if (diffs.length > 0) process.exitCode = 1\n\n return\n }\n\n const current = await createConfigSnapshot(\n cwd,\n options.files,\n eslint,\n options.rulesOnly ? 'rules' : 'all'\n )\n\n writeFileSync(snapshotPath, `${JSON.stringify(current, null, 2)}\\n`)\n\n if (options.json) {\n console.log(JSON.stringify({\n files: Object.keys(current.files),\n snapshotPath\n }, null, 2))\n } else {\n console.log(`✅ Saved effective ESLint configuration to ${relative(cwd, snapshotPath)}.`)\n }\n}\n\nexport const handleSnapshotDiff = async (\n cwd: string = process.cwd(),\n options: SnapshotOptions = {},\n eslint?: ProjectEslint\n): Promise<void> => {\n const snapshotPath = resolve(cwd, options.snapshotPath ?? SNAPSHOT_FILENAME)\n const previous = readJson(snapshotPath) as EslintSnapshot | null\n\n if (!previous) throw new Error(`Snapshot is missing: ${relative(cwd, snapshotPath)}. Run basic-eslint snapshot first.`)\n\n const files = options.files?.length ? options.files : Object.keys(previous.files)\n const current = await createConfigSnapshot(cwd, files, eslint, previous.scope ?? 'all')\n const diffs = diffConfigSnapshots(previous, current)\n\n if (options.json) console.log(JSON.stringify({ diffs, snapshotPath }, null, 2))\n else outputSnapshotDiff(diffs)\n\n if (diffs.length > 0) process.exitCode = 1\n}\n\nexport const isDirectory = (path: string): boolean => {\n try {\n return statSync(path).isDirectory()\n } catch {\n return false\n }\n}\n"],"mappings":"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","names":["current"]}
|
package/dist/tailwind.js
CHANGED
|
@@ -41,7 +41,7 @@ const resolveLocalCssImport = (filePath, specifier) => {
|
|
|
41
41
|
const candidates = extname(candidate) ? [candidate] : [candidate, `${candidate}.css`, join(candidate, "index.css")];
|
|
42
42
|
return candidates.find((path) => existsSync(path));
|
|
43
43
|
};
|
|
44
|
-
const getImportedCssFiles = (filePath, content) => [...content.matchAll(CSS_IMPORT_PATTERN)].flatMap((match) => {
|
|
44
|
+
const getImportedCssFiles = (filePath, content) => [...content.replaceAll(CSS_COMMENT_PATTERN, "").matchAll(CSS_IMPORT_PATTERN)].flatMap((match) => {
|
|
45
45
|
const importedFile = match[1] ? resolveLocalCssImport(filePath, match[1]) : void 0;
|
|
46
46
|
return importedFile ? [importedFile] : [];
|
|
47
47
|
});
|
|
@@ -96,13 +96,17 @@ const collectAstroComponentClasses = (cwd, classes) => {
|
|
|
96
96
|
const entries = readDirectory(directory);
|
|
97
97
|
for (const entry of entries.filter((entry2) => entry2.isDirectory() && !IGNORED_COMPONENT_DIRECTORIES.has(entry2.name))) visit(join(directory, entry.name));
|
|
98
98
|
for (const entry of entries.filter((entry2) => entry2.isFile() && entry2.name.endsWith(".astro"))) {
|
|
99
|
-
const
|
|
99
|
+
const astroPath = join(directory, entry.name);
|
|
100
|
+
const content = readTextFile(astroPath);
|
|
100
101
|
if (content === void 0) continue;
|
|
101
102
|
for (const style of content.matchAll(ASTRO_STYLE_PATTERN)) {
|
|
102
103
|
const stylesheet = style[1];
|
|
103
104
|
if (!stylesheet) continue;
|
|
104
105
|
for (const className of getCssSelectorClasses(stylesheet)) classes.add(className);
|
|
105
106
|
for (const className of getCssUtilityClasses(stylesheet)) classes.add(className);
|
|
107
|
+
for (const importedFile of getImportedCssFiles(astroPath, stylesheet)) {
|
|
108
|
+
collectCssComponentClasses(importedFile, /* @__PURE__ */ new Set(), classes, /* @__PURE__ */ new Set());
|
|
109
|
+
}
|
|
106
110
|
}
|
|
107
111
|
}
|
|
108
112
|
};
|
package/dist/tailwind.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tailwind.ts"],"sourcesContent":["import type { Dirent } from 'node:fs'\nimport { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path'\n\nimport type { TailwindOptions } from '@santi020k/eslint-config-core'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nconst CSS_ESCAPE_PATTERN = String.raw`\\\\(?:[\\dA-Fa-f]{1,6}\\s?|[^\\f\\n\\r])`\n\nconst CSS_CLASS_PATTERN = new RegExp(\n String.raw`\\.((?:${CSS_ESCAPE_PATTERN}|[A-Za-z_])(?:${CSS_ESCAPE_PATTERN}|[\\w-])*)`,\n 'g'\n)\n\nconst CSS_UTILITY_PATTERN = /@utility\\s+([A-Za-z_][\\w-]*)\\s*\\{/g\nconst CSS_IMPORT_PATTERN = /@import\\s+(?:url\\(\\s*)?[\"']([^\"']+)[\"']/g\nconst CSS_PLUGIN_PATTERN = /@plugin\\s+[\"']([^\"']+)[\"']/g\nconst CSS_COMMENT_PATTERN = /\\/\\*[\\s\\S]*?\\*\\//g\nconst CSS_STRING_PATTERN = /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*')/g\nconst ASTRO_STYLE_PATTERN = /<style(?:\\s[^>]*)?>([\\s\\S]*?)<\\/style\\s*>/gi\nconst TAILWIND_CONFIG_PATTERN = /^tailwind\\.config\\.(?:cjs|cts|js|mjs|mts|ts)$/\nconst MAX_COMPONENT_PATTERN_LENGTH = 3000\n\nconst IGNORED_COMPONENT_DIRECTORIES = new Set([\n '.astro',\n '.git',\n '.next',\n '.nuxt',\n '.output',\n '.svelte-kit',\n 'build',\n 'coverage',\n 'dist',\n 'node_modules'\n])\n\nconst PLUGIN_CLASS_PATTERNS: Readonly<Record<string, readonly string[]>> = {\n '@tailwindcss/aspect-ratio': ['^aspect-(?:h|w)-\\\\d+$'],\n '@tailwindcss/forms': [\n '^form-(?:checkbox|input|multiselect|radio|select|textarea)$'\n ],\n '@tailwindcss/typography': ['^not-prose$']\n}\n\nconst decodeCssIdentifier = (value: string): string => value\n .replaceAll(/\\\\([\\dA-Fa-f]{1,6})\\s?/g, (_, codePoint: string) => String.fromCodePoint(Number.parseInt(codePoint, 16)))\n .replaceAll(/\\\\([^\\f\\n\\r])/g, '$1')\n\nconst resolveLocalCssImport = (filePath: string, specifier: string): string | undefined => {\n if (!specifier.startsWith('.') && !isAbsolute(specifier)) return undefined\n\n const cleanSpecifier = specifier.split(/[?#]/, 1)[0]\n\n if (!cleanSpecifier) return undefined\n\n const candidate = isAbsolute(cleanSpecifier) ? cleanSpecifier : resolve(dirname(filePath), cleanSpecifier)\n const candidates = extname(candidate) ? [candidate] : [candidate, `${candidate}.css`, join(candidate, 'index.css')]\n\n return candidates.find(path => existsSync(path))\n}\n\nconst getImportedCssFiles = (filePath: string, content: string): string[] => (\n [...content.matchAll(CSS_IMPORT_PATTERN)].flatMap(match => {\n const importedFile = match[1] ? resolveLocalCssImport(filePath, match[1]) : undefined\n\n return importedFile ? [importedFile] : []\n })\n)\n\nconst getCssSelectorClasses = (content: string): string[] => {\n const classes = new Set<string>()\n const source = content.replaceAll(CSS_COMMENT_PATTERN, '')\n\n for (const blockStart of source.matchAll(/\\{/g)) {\n const index = blockStart.index\n\n const boundary = Math.max(\n source.lastIndexOf(';', index - 1),\n source.lastIndexOf('{', index - 1),\n source.lastIndexOf('}', index - 1)\n )\n\n const selector = source.slice(boundary + 1, index).trim()\n\n if (!selector || selector.startsWith('@')) continue\n\n for (const match of selector.replaceAll(CSS_STRING_PATTERN, '').matchAll(CSS_CLASS_PATTERN)) {\n if (match[1]) classes.add(decodeCssIdentifier(match[1]))\n }\n }\n\n return [...classes]\n}\n\nconst getCssUtilityClasses = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_UTILITY_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst getCssPlugins = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_PLUGIN_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst readDirectory = (directory: string): Dirent[] => {\n try {\n return readdirSync(directory, { withFileTypes: true, encoding: 'utf8' })\n } catch {\n return []\n }\n}\n\nconst readTextFile = (path: string): string | undefined => {\n try {\n return readFileSync(path, 'utf8')\n } catch {\n return undefined\n }\n}\n\nconst collectCssComponentClasses = (\n filePath: string,\n visited: Set<string>,\n classes: Set<string>,\n plugins: Set<string>\n): void => {\n if (visited.has(filePath)) return\n\n visited.add(filePath)\n\n const content = readTextFile(filePath)\n\n if (content === undefined) return\n\n for (const className of getCssSelectorClasses(content)) classes.add(className)\n\n for (const className of getCssUtilityClasses(content)) classes.add(className)\n\n for (const plugin of getCssPlugins(content)) plugins.add(plugin)\n\n for (const importedFile of getImportedCssFiles(filePath, content)) {\n collectCssComponentClasses(importedFile, visited, classes, plugins)\n }\n}\n\nconst collectAstroComponentClasses = (cwd: string, classes: Set<string>): void => {\n const visit = (directory: string): void => {\n const entries = readDirectory(directory)\n\n for (const entry of entries.filter(entry => (\n entry.isDirectory() && !IGNORED_COMPONENT_DIRECTORIES.has(entry.name)\n ))) visit(join(directory, entry.name))\n\n for (const entry of entries.filter(entry => entry.isFile() && entry.name.endsWith('.astro'))) {\n const content = readTextFile(join(directory, entry.name))\n\n if (content === undefined) continue\n\n for (const style of content.matchAll(ASTRO_STYLE_PATTERN)) {\n const stylesheet = style[1]\n\n if (!stylesheet) continue\n\n for (const className of getCssSelectorClasses(stylesheet)) classes.add(className)\n\n for (const className of getCssUtilityClasses(stylesheet)) classes.add(className)\n }\n }\n }\n\n visit(cwd)\n}\n\nconst getConfiguredTailwindPlugins = (cwd: string): string[] => {\n const plugins = new Set<string>()\n\n for (const entry of readDirectory(cwd)) {\n if (!entry.isFile() || !TAILWIND_CONFIG_PATTERN.test(entry.name)) continue\n\n const content = readTextFile(join(cwd, entry.name))\n\n if (content === undefined) continue\n\n const uncommentedContent = content\n .replaceAll(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replaceAll(/^\\s*\\/\\/.*$/gm, '')\n\n for (const plugin of Object.keys(PLUGIN_CLASS_PATTERNS)) {\n if (uncommentedContent.includes(plugin)) plugins.add(plugin)\n }\n }\n\n return [...plugins]\n}\n\nconst escapeRegex = (value: string): string => value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst createExactClassPatterns = (classes: string[]): string[] => {\n const patterns: string[] = []\n let alternatives: string[] = []\n\n const flush = (): void => {\n if (alternatives.length === 0) return\n\n patterns.push(`^(?:${alternatives.join('|')})$`)\n\n alternatives = []\n }\n\n for (const className of classes.toSorted()) {\n const escapedClass = escapeRegex(className)\n const nextLength = alternatives.join('|').length + escapedClass.length + 6\n\n if (nextLength > MAX_COMPONENT_PATTERN_LENGTH) flush()\n\n alternatives.push(escapedClass)\n }\n\n flush()\n\n return patterns\n}\n\nexport const findCssComponentClasses = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const classes = new Set<string>()\n\n collectCssComponentClasses(entryPath, new Set(), classes, new Set())\n\n collectAstroComponentClasses(cwd, classes)\n\n return [...classes].toSorted()\n}\n\nexport const findTailwindPluginClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const plugins = new Set(getConfiguredTailwindPlugins(cwd))\n\n collectCssComponentClasses(entryPath, new Set(), new Set(), plugins)\n\n return [...plugins]\n .flatMap(plugin => PLUGIN_CLASS_PATTERNS[plugin] ?? [])\n .filter((pattern, index, patterns) => patterns.indexOf(pattern) === index)\n .toSorted()\n}\n\nexport const findCssComponentClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint))\n\nconst getIgnoredClasses = (tailwindOptions: TailwindOptions): string[] => {\n const configuredClasses = tailwindOptions.ignore ?? []\n\n if (!tailwindOptions.entryPoint || tailwindOptions.detectComponentClasses === false) {\n return configuredClasses\n }\n\n const detectedClasses = findCssComponentClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n const pluginClasses = findTailwindPluginClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n return [...new Set([...configuredClasses, ...detectedClasses, ...pluginClasses])]\n}\n\nconst getUnknownClassRule = (\n tailwindOptions: TailwindOptions,\n ignoredClasses: string[]\n): TSESLint.FlatConfig.RuleEntry | undefined => {\n const options = {\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(ignoredClasses.length ? { ignore: ignoredClasses } : {})\n }\n\n const hasOptions = Object.keys(options).length > 0\n const severity = tailwindOptions.noUnknownClasses ?? 'error'\n\n if (!hasOptions && tailwindOptions.noUnknownClasses === undefined) return undefined\n\n if (severity === false) return 'off'\n\n return hasOptions ? [severity, options] : severity\n}\n\nexport const buildTailwindSettingsConfig = (\n tailwindOptions: TailwindOptions\n): TSESLint.FlatConfig.Config => {\n const ignoredClasses = getIgnoredClasses(tailwindOptions)\n const noUnknownClassesRule = getUnknownClassRule(tailwindOptions, ignoredClasses)\n\n const settingsOptions = {\n ...(tailwindOptions.cwd ? { cwd: tailwindOptions.cwd } : {}),\n ...(tailwindOptions.detectComponentClasses === undefined ?\n {} :\n { detectComponentClasses: tailwindOptions.detectComponentClasses }),\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(tailwindOptions.ignore?.length ? { ignore: tailwindOptions.ignore } : {})\n }\n\n return {\n name: 'eslint-config-basic/tailwind-settings',\n ...(noUnknownClassesRule === undefined ?\n {} :\n { rules: { 'better-tailwindcss/no-unknown-classes': noUnknownClassesRule } }),\n settings: { 'better-tailwindcss': settingsOptions }\n }\n}\n"],"mappings":"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","names":["entry"]}
|
|
1
|
+
{"version":3,"sources":["../src/tailwind.ts"],"sourcesContent":["import type { Dirent } from 'node:fs'\nimport { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path'\n\nimport type { TailwindOptions } from '@santi020k/eslint-config-core'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nconst CSS_ESCAPE_PATTERN = String.raw`\\\\(?:[\\dA-Fa-f]{1,6}\\s?|[^\\f\\n\\r])`\n\nconst CSS_CLASS_PATTERN = new RegExp(\n String.raw`\\.((?:${CSS_ESCAPE_PATTERN}|[A-Za-z_])(?:${CSS_ESCAPE_PATTERN}|[\\w-])*)`,\n 'g'\n)\n\nconst CSS_UTILITY_PATTERN = /@utility\\s+([A-Za-z_][\\w-]*)\\s*\\{/g\nconst CSS_IMPORT_PATTERN = /@import\\s+(?:url\\(\\s*)?[\"']([^\"']+)[\"']/g\nconst CSS_PLUGIN_PATTERN = /@plugin\\s+[\"']([^\"']+)[\"']/g\nconst CSS_COMMENT_PATTERN = /\\/\\*[\\s\\S]*?\\*\\//g\nconst CSS_STRING_PATTERN = /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*')/g\nconst ASTRO_STYLE_PATTERN = /<style(?:\\s[^>]*)?>([\\s\\S]*?)<\\/style\\s*>/gi\nconst TAILWIND_CONFIG_PATTERN = /^tailwind\\.config\\.(?:cjs|cts|js|mjs|mts|ts)$/\nconst MAX_COMPONENT_PATTERN_LENGTH = 3000\n\nconst IGNORED_COMPONENT_DIRECTORIES = new Set([\n '.astro',\n '.git',\n '.next',\n '.nuxt',\n '.output',\n '.svelte-kit',\n 'build',\n 'coverage',\n 'dist',\n 'node_modules'\n])\n\nconst PLUGIN_CLASS_PATTERNS: Readonly<Record<string, readonly string[]>> = {\n '@tailwindcss/aspect-ratio': ['^aspect-(?:h|w)-\\\\d+$'],\n '@tailwindcss/forms': [\n '^form-(?:checkbox|input|multiselect|radio|select|textarea)$'\n ],\n '@tailwindcss/typography': ['^not-prose$']\n}\n\nconst decodeCssIdentifier = (value: string): string => value\n .replaceAll(/\\\\([\\dA-Fa-f]{1,6})\\s?/g, (_, codePoint: string) => String.fromCodePoint(Number.parseInt(codePoint, 16)))\n .replaceAll(/\\\\([^\\f\\n\\r])/g, '$1')\n\nconst resolveLocalCssImport = (filePath: string, specifier: string): string | undefined => {\n if (!specifier.startsWith('.') && !isAbsolute(specifier)) return undefined\n\n const cleanSpecifier = specifier.split(/[?#]/, 1)[0]\n\n if (!cleanSpecifier) return undefined\n\n const candidate = isAbsolute(cleanSpecifier) ? cleanSpecifier : resolve(dirname(filePath), cleanSpecifier)\n const candidates = extname(candidate) ? [candidate] : [candidate, `${candidate}.css`, join(candidate, 'index.css')]\n\n return candidates.find(path => existsSync(path))\n}\n\nconst getImportedCssFiles = (filePath: string, content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_IMPORT_PATTERN)].flatMap(match => {\n const importedFile = match[1] ? resolveLocalCssImport(filePath, match[1]) : undefined\n\n return importedFile ? [importedFile] : []\n })\n)\n\nconst getCssSelectorClasses = (content: string): string[] => {\n const classes = new Set<string>()\n const source = content.replaceAll(CSS_COMMENT_PATTERN, '')\n\n for (const blockStart of source.matchAll(/\\{/g)) {\n const index = blockStart.index\n\n const boundary = Math.max(\n source.lastIndexOf(';', index - 1),\n source.lastIndexOf('{', index - 1),\n source.lastIndexOf('}', index - 1)\n )\n\n const selector = source.slice(boundary + 1, index).trim()\n\n if (!selector || selector.startsWith('@')) continue\n\n for (const match of selector.replaceAll(CSS_STRING_PATTERN, '').matchAll(CSS_CLASS_PATTERN)) {\n if (match[1]) classes.add(decodeCssIdentifier(match[1]))\n }\n }\n\n return [...classes]\n}\n\nconst getCssUtilityClasses = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_UTILITY_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst getCssPlugins = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_PLUGIN_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst readDirectory = (directory: string): Dirent[] => {\n try {\n return readdirSync(directory, { withFileTypes: true, encoding: 'utf8' })\n } catch {\n return []\n }\n}\n\nconst readTextFile = (path: string): string | undefined => {\n try {\n return readFileSync(path, 'utf8')\n } catch {\n return undefined\n }\n}\n\nconst collectCssComponentClasses = (\n filePath: string,\n visited: Set<string>,\n classes: Set<string>,\n plugins: Set<string>\n): void => {\n if (visited.has(filePath)) return\n\n visited.add(filePath)\n\n const content = readTextFile(filePath)\n\n if (content === undefined) return\n\n for (const className of getCssSelectorClasses(content)) classes.add(className)\n\n for (const className of getCssUtilityClasses(content)) classes.add(className)\n\n for (const plugin of getCssPlugins(content)) plugins.add(plugin)\n\n for (const importedFile of getImportedCssFiles(filePath, content)) {\n collectCssComponentClasses(importedFile, visited, classes, plugins)\n }\n}\n\nconst collectAstroComponentClasses = (cwd: string, classes: Set<string>): void => {\n const visit = (directory: string): void => {\n const entries = readDirectory(directory)\n\n for (const entry of entries.filter(entry => (\n entry.isDirectory() && !IGNORED_COMPONENT_DIRECTORIES.has(entry.name)\n ))) visit(join(directory, entry.name))\n\n for (const entry of entries.filter(entry => entry.isFile() && entry.name.endsWith('.astro'))) {\n const astroPath = join(directory, entry.name)\n const content = readTextFile(astroPath)\n\n if (content === undefined) continue\n\n for (const style of content.matchAll(ASTRO_STYLE_PATTERN)) {\n const stylesheet = style[1]\n\n if (!stylesheet) continue\n\n for (const className of getCssSelectorClasses(stylesheet)) classes.add(className)\n\n for (const className of getCssUtilityClasses(stylesheet)) classes.add(className)\n\n for (const importedFile of getImportedCssFiles(astroPath, stylesheet)) {\n collectCssComponentClasses(importedFile, new Set(), classes, new Set())\n }\n }\n }\n }\n\n visit(cwd)\n}\n\nconst getConfiguredTailwindPlugins = (cwd: string): string[] => {\n const plugins = new Set<string>()\n\n for (const entry of readDirectory(cwd)) {\n if (!entry.isFile() || !TAILWIND_CONFIG_PATTERN.test(entry.name)) continue\n\n const content = readTextFile(join(cwd, entry.name))\n\n if (content === undefined) continue\n\n const uncommentedContent = content\n .replaceAll(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replaceAll(/^\\s*\\/\\/.*$/gm, '')\n\n for (const plugin of Object.keys(PLUGIN_CLASS_PATTERNS)) {\n if (uncommentedContent.includes(plugin)) plugins.add(plugin)\n }\n }\n\n return [...plugins]\n}\n\nconst escapeRegex = (value: string): string => value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst createExactClassPatterns = (classes: string[]): string[] => {\n const patterns: string[] = []\n let alternatives: string[] = []\n\n const flush = (): void => {\n if (alternatives.length === 0) return\n\n patterns.push(`^(?:${alternatives.join('|')})$`)\n\n alternatives = []\n }\n\n for (const className of classes.toSorted()) {\n const escapedClass = escapeRegex(className)\n const nextLength = alternatives.join('|').length + escapedClass.length + 6\n\n if (nextLength > MAX_COMPONENT_PATTERN_LENGTH) flush()\n\n alternatives.push(escapedClass)\n }\n\n flush()\n\n return patterns\n}\n\nexport const findCssComponentClasses = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const classes = new Set<string>()\n\n collectCssComponentClasses(entryPath, new Set(), classes, new Set())\n\n collectAstroComponentClasses(cwd, classes)\n\n return [...classes].toSorted()\n}\n\nexport const findTailwindPluginClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const plugins = new Set(getConfiguredTailwindPlugins(cwd))\n\n collectCssComponentClasses(entryPath, new Set(), new Set(), plugins)\n\n return [...plugins]\n .flatMap(plugin => PLUGIN_CLASS_PATTERNS[plugin] ?? [])\n .filter((pattern, index, patterns) => patterns.indexOf(pattern) === index)\n .toSorted()\n}\n\nexport const findCssComponentClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint))\n\nconst getIgnoredClasses = (tailwindOptions: TailwindOptions): string[] => {\n const configuredClasses = tailwindOptions.ignore ?? []\n\n if (!tailwindOptions.entryPoint || tailwindOptions.detectComponentClasses === false) {\n return configuredClasses\n }\n\n const detectedClasses = findCssComponentClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n const pluginClasses = findTailwindPluginClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n return [...new Set([...configuredClasses, ...detectedClasses, ...pluginClasses])]\n}\n\nconst getUnknownClassRule = (\n tailwindOptions: TailwindOptions,\n ignoredClasses: string[]\n): TSESLint.FlatConfig.RuleEntry | undefined => {\n const options = {\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(ignoredClasses.length ? { ignore: ignoredClasses } : {})\n }\n\n const hasOptions = Object.keys(options).length > 0\n const severity = tailwindOptions.noUnknownClasses ?? 'error'\n\n if (!hasOptions && tailwindOptions.noUnknownClasses === undefined) return undefined\n\n if (severity === false) return 'off'\n\n return hasOptions ? [severity, options] : severity\n}\n\nexport const buildTailwindSettingsConfig = (\n tailwindOptions: TailwindOptions\n): TSESLint.FlatConfig.Config => {\n const ignoredClasses = getIgnoredClasses(tailwindOptions)\n const noUnknownClassesRule = getUnknownClassRule(tailwindOptions, ignoredClasses)\n\n const settingsOptions = {\n ...(tailwindOptions.cwd ? { cwd: tailwindOptions.cwd } : {}),\n ...(tailwindOptions.detectComponentClasses === undefined ?\n {} :\n { detectComponentClasses: tailwindOptions.detectComponentClasses }),\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(tailwindOptions.ignore?.length ? { ignore: tailwindOptions.ignore } : {})\n }\n\n return {\n name: 'eslint-config-basic/tailwind-settings',\n ...(noUnknownClassesRule === undefined ?\n {} :\n { rules: { 'better-tailwindcss/no-unknown-classes': noUnknownClassesRule } }),\n settings: { 'better-tailwindcss': settingsOptions }\n }\n}\n"],"mappings":"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","names":["entry"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@santi020k/eslint-config-basic",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"provenance": true
|
|
@@ -37,66 +37,66 @@
|
|
|
37
37
|
"basic-eslint": "./dist/cli.js"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@typescript-eslint/utils": "^8.
|
|
40
|
+
"@typescript-eslint/utils": "^8.70.1",
|
|
41
41
|
"semver": "^7.8.5",
|
|
42
|
-
"@santi020k/eslint-config-core": "^3.1.
|
|
43
|
-
"@santi020k/eslint-config-typescript": "^3.1.
|
|
42
|
+
"@santi020k/eslint-config-core": "^3.1.2",
|
|
43
|
+
"@santi020k/eslint-config-typescript": "^3.1.4"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@types/node": "^26.
|
|
47
|
-
"publint": "^0.3.
|
|
46
|
+
"@types/node": "^26.6.2",
|
|
47
|
+
"publint": "^0.3.24",
|
|
48
48
|
"tsup": "^8.5.1",
|
|
49
49
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
50
|
-
"@santi020k/eslint-config-angular": "^3.1.
|
|
51
|
-
"@santi020k/eslint-config-astro": "^3.1.
|
|
52
|
-
"@santi020k/eslint-config-
|
|
53
|
-
"@santi020k/eslint-config-
|
|
54
|
-
"@santi020k/eslint-config-formats": "^3.1.
|
|
55
|
-
"@santi020k/eslint-config-
|
|
56
|
-
"@santi020k/eslint-config-
|
|
57
|
-
"@santi020k/eslint-config-libraries": "^3.1.
|
|
58
|
-
"@santi020k/eslint-config-nest": "^3.1.
|
|
59
|
-
"@santi020k/eslint-config-next": "^3.1.
|
|
60
|
-
"@santi020k/eslint-config-nuxt": "^3.1.
|
|
61
|
-
"@santi020k/eslint-config-
|
|
62
|
-
"@santi020k/eslint-config-
|
|
63
|
-
"@santi020k/eslint-config-
|
|
64
|
-
"@santi020k/eslint-config-react-router": "^3.1.
|
|
65
|
-
"@santi020k/eslint-config-slidev": "^3.1.
|
|
66
|
-
"@santi020k/eslint-config-solid": "^3.1.
|
|
67
|
-
"@santi020k/eslint-config-svelte": "^3.1.
|
|
68
|
-
"@santi020k/eslint-config-tanstack-start": "^3.1.
|
|
69
|
-
"@santi020k/eslint-config-testing": "^3.1.
|
|
70
|
-
"@santi020k/eslint-config-tools": "^3.1.
|
|
71
|
-
"@santi020k/eslint-config-vite": "^3.1.
|
|
72
|
-
"@santi020k/eslint-config-vue": "^3.1.
|
|
50
|
+
"@santi020k/eslint-config-angular": "^3.1.1",
|
|
51
|
+
"@santi020k/eslint-config-astro": "^3.1.3",
|
|
52
|
+
"@santi020k/eslint-config-extensions": "^3.1.2",
|
|
53
|
+
"@santi020k/eslint-config-expo": "^3.1.1",
|
|
54
|
+
"@santi020k/eslint-config-formats": "^3.1.2",
|
|
55
|
+
"@santi020k/eslint-config-lit": "^3.1.1",
|
|
56
|
+
"@santi020k/eslint-config-hono": "^3.1.1",
|
|
57
|
+
"@santi020k/eslint-config-libraries": "^3.1.2",
|
|
58
|
+
"@santi020k/eslint-config-nest": "^3.1.1",
|
|
59
|
+
"@santi020k/eslint-config-next": "^3.1.1",
|
|
60
|
+
"@santi020k/eslint-config-nuxt": "^3.1.1",
|
|
61
|
+
"@santi020k/eslint-config-qwik": "^3.1.1",
|
|
62
|
+
"@santi020k/eslint-config-react": "^3.1.1",
|
|
63
|
+
"@santi020k/eslint-config-preact": "^3.1.1",
|
|
64
|
+
"@santi020k/eslint-config-react-router": "^3.1.1",
|
|
65
|
+
"@santi020k/eslint-config-slidev": "^3.1.1",
|
|
66
|
+
"@santi020k/eslint-config-solid": "^3.1.1",
|
|
67
|
+
"@santi020k/eslint-config-svelte": "^3.1.1",
|
|
68
|
+
"@santi020k/eslint-config-tanstack-start": "^3.1.1",
|
|
69
|
+
"@santi020k/eslint-config-testing": "^3.1.2",
|
|
70
|
+
"@santi020k/eslint-config-tools": "^3.1.2",
|
|
71
|
+
"@santi020k/eslint-config-vite": "^3.1.1",
|
|
72
|
+
"@santi020k/eslint-config-vue": "^3.1.1"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
75
75
|
"eslint": "^10.0.0",
|
|
76
76
|
"typescript": ">=5.0.0 <7.0.0",
|
|
77
|
-
"@santi020k/eslint-config-angular": "^3.1.
|
|
78
|
-
"@santi020k/eslint-config-astro": "^3.1.
|
|
79
|
-
"@santi020k/eslint-config-expo": "^3.1.
|
|
80
|
-
"@santi020k/eslint-config-
|
|
81
|
-
"@santi020k/eslint-config-
|
|
82
|
-
"@santi020k/eslint-config-hono": "^3.1.
|
|
83
|
-
"@santi020k/eslint-config-lit": "^3.1.
|
|
84
|
-
"@santi020k/eslint-config-libraries": "^3.1.
|
|
85
|
-
"@santi020k/eslint-config-
|
|
86
|
-
"@santi020k/eslint-config-
|
|
87
|
-
"@santi020k/eslint-config-nuxt": "^3.1.
|
|
88
|
-
"@santi020k/eslint-config-preact": "^3.1.
|
|
89
|
-
"@santi020k/eslint-config-qwik": "^3.1.
|
|
90
|
-
"@santi020k/eslint-config-react": "^3.1.
|
|
91
|
-
"@santi020k/eslint-config-react-router": "^3.1.
|
|
92
|
-
"@santi020k/eslint-config-slidev": "^3.1.
|
|
93
|
-
"@santi020k/eslint-config-solid": "^3.1.
|
|
94
|
-
"@santi020k/eslint-config-
|
|
95
|
-
"@santi020k/eslint-config-
|
|
96
|
-
"@santi020k/eslint-config-
|
|
97
|
-
"@santi020k/eslint-config-
|
|
98
|
-
"@santi020k/eslint-config-
|
|
99
|
-
"@santi020k/eslint-config-
|
|
77
|
+
"@santi020k/eslint-config-angular": "^3.1.1",
|
|
78
|
+
"@santi020k/eslint-config-astro": "^3.1.3",
|
|
79
|
+
"@santi020k/eslint-config-expo": "^3.1.1",
|
|
80
|
+
"@santi020k/eslint-config-formats": "^3.1.2",
|
|
81
|
+
"@santi020k/eslint-config-extensions": "^3.1.2",
|
|
82
|
+
"@santi020k/eslint-config-hono": "^3.1.1",
|
|
83
|
+
"@santi020k/eslint-config-lit": "^3.1.1",
|
|
84
|
+
"@santi020k/eslint-config-libraries": "^3.1.2",
|
|
85
|
+
"@santi020k/eslint-config-nest": "^3.1.1",
|
|
86
|
+
"@santi020k/eslint-config-next": "^3.1.1",
|
|
87
|
+
"@santi020k/eslint-config-nuxt": "^3.1.1",
|
|
88
|
+
"@santi020k/eslint-config-preact": "^3.1.1",
|
|
89
|
+
"@santi020k/eslint-config-qwik": "^3.1.1",
|
|
90
|
+
"@santi020k/eslint-config-react": "^3.1.1",
|
|
91
|
+
"@santi020k/eslint-config-react-router": "^3.1.1",
|
|
92
|
+
"@santi020k/eslint-config-slidev": "^3.1.1",
|
|
93
|
+
"@santi020k/eslint-config-solid": "^3.1.1",
|
|
94
|
+
"@santi020k/eslint-config-tanstack-start": "^3.1.1",
|
|
95
|
+
"@santi020k/eslint-config-svelte": "^3.1.1",
|
|
96
|
+
"@santi020k/eslint-config-testing": "^3.1.2",
|
|
97
|
+
"@santi020k/eslint-config-tools": "^3.1.2",
|
|
98
|
+
"@santi020k/eslint-config-vite": "^3.1.1",
|
|
99
|
+
"@santi020k/eslint-config-vue": "^3.1.1"
|
|
100
100
|
},
|
|
101
101
|
"peerDependenciesMeta": {
|
|
102
102
|
"@santi020k/eslint-config-angular": {
|