@santi020k/eslint-config-basic 3.2.0 → 3.3.0
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 +28 -0
- package/dist/agent-skill-generator.d.ts +7 -18
- package/dist/agent-skill-generator.js +54 -18
- package/dist/agent-skill-generator.js.map +1 -0
- package/dist/cli-advanced.d.ts +7 -0
- package/dist/cli-advanced.js +74 -15
- package/dist/cli-advanced.js.map +1 -0
- package/dist/cli-migration.js +22 -20
- package/dist/cli-migration.js.map +1 -0
- package/dist/cli-package-manager.d.ts +10 -0
- package/dist/cli-package-manager.js +135 -0
- package/dist/cli-package-manager.js.map +1 -0
- package/dist/cli-preset.d.ts +74 -2
- package/dist/cli-preset.js +253 -6
- package/dist/cli-preset.js.map +1 -0
- package/dist/cli-workflows.js +1 -0
- package/dist/cli-workflows.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +461 -176
- package/dist/cli.js.map +1 -0
- package/dist/define-config-metadata.js +2 -4
- package/dist/define-config-metadata.js.map +1 -0
- package/dist/frameworks.d.ts +1 -0
- package/dist/frameworks.js +2 -1
- package/dist/frameworks.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +83 -22
- package/dist/index.js.map +1 -0
- package/dist/integrations.js +1 -0
- package/dist/integrations.js.map +1 -0
- package/dist/optional-package-errors.js +1 -0
- package/dist/optional-package-errors.js.map +1 -0
- package/dist/recommended.js +1 -0
- package/dist/recommended.js.map +1 -0
- package/dist/resolvers.js +1 -0
- package/dist/resolvers.js.map +1 -0
- package/dist/tailwind.d.ts +3 -1
- package/dist/tailwind.js +115 -13
- package/dist/tailwind.js.map +1 -0
- package/package.json +21 -21
- package/IMPROVEMENTS.md +0 -270
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["/* eslint-disable complexity -- CLI planners and dispatchers intentionally cover many validated command branches */\n/* eslint-disable no-console -- CLI handlers own user-facing terminal output */\nimport { spawnSync } from 'node:child_process'\nimport { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire, findPackageJSON } from 'node:module'\nimport { basename, dirname, join } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\n\nimport { findTailwindEntryPoint } from '@santi020k/eslint-config-core'\n\nimport {\n analyzeEslintConfig,\n ESLINT_CONFIG_FILENAMES,\n handleGenerateSkill\n} from './agent-skill-generator.js'\nimport { handleCompatibility, handleExplainRule } from './cli-advanced.js'\nimport { getExplicitConfigFeaturePackages, handleMigrateV3 } from './cli-migration.js'\nimport {\n addCompatibleConfigVersions,\n createInstallCommand,\n createInstallInvocation,\n detectPackageManager,\n findPnpmWorkspaceRoot,\n getCatalogPreference,\n getCompatibleConfigVersion } from './cli-package-manager.js'\nimport { handleExplainPreset } from './cli-preset.js'\nimport {\n handleBaseline,\n handleProfile,\n handleSnapshot,\n handleSnapshotDiff\n} from './cli-workflows.js'\nimport { detectProjectOptions } from './index.js'\nimport { findCssComponentClasses } from './tailwind.js'\n\ninterface InstallResult {\n error?: Error\n status: null | number\n stderr?: Buffer | string\n stdout?: Buffer | string\n}\n\ntype InstallRunner = (\n command: string,\n args: string[],\n options: { cwd: string, encoding: 'utf8', maxBuffer: number, stdio: 'pipe' }\n) => InstallResult\n\nconst getDefaultConfigFilename = (cwd: string): string => {\n const packageJsonPath = join(cwd, 'package.json')\n\n if (!existsSync(packageJsonPath)) return 'eslint.config.mjs'\n\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as { type?: string }\n\n return packageJson.type === 'module' ? 'eslint.config.js' : 'eslint.config.mjs'\n } catch {\n return 'eslint.config.mjs'\n }\n}\n\nconst resolveConfigPath = (cwd: string): string => {\n const existingConfigPath = ESLINT_CONFIG_FILENAMES\n .map(filename => join(cwd, filename))\n .find(p => existsSync(p))\n\n return existingConfigPath ?? join(cwd, getDefaultConfigFilename(cwd))\n}\n\nconst getFrameworkKeys = (detectedFrameworks?: string[]): string[] => {\n const frameworkKeys = new Set(detectedFrameworks ?? [])\n\n if (\n frameworkKeys.has('next') ||\n frameworkKeys.has('expo') ||\n frameworkKeys.has('react-router') ||\n (frameworkKeys.has('tanstack-start') && !frameworkKeys.has('solid'))\n ) {\n frameworkKeys.add('react')\n }\n\n return [...frameworkKeys].sort()\n}\n\nconst toPropertyKey = (key: string): string => /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) ? key : `'${key}'`\n\nconst FRAMEWORK_PACKAGE_TO_KEY: Record<string, string> = {\n '@santi020k/eslint-config-angular': 'angular',\n '@santi020k/eslint-config-astro': 'astro',\n '@santi020k/eslint-config-expo': 'expo',\n '@santi020k/eslint-config-hono': 'hono',\n '@santi020k/eslint-config-lit': 'lit',\n '@santi020k/eslint-config-nest': 'nest',\n '@santi020k/eslint-config-next': 'next',\n '@santi020k/eslint-config-nuxt': 'nuxt',\n '@santi020k/eslint-config-preact': 'preact',\n '@santi020k/eslint-config-qwik': 'qwik',\n '@santi020k/eslint-config-react': 'react',\n '@santi020k/eslint-config-react-router': 'react-router',\n '@santi020k/eslint-config-remix': 'react-router',\n '@santi020k/eslint-config-slidev': 'slidev',\n '@santi020k/eslint-config-solid': 'solid',\n '@santi020k/eslint-config-svelte': 'svelte',\n '@santi020k/eslint-config-tanstack-start': 'tanstack-start',\n '@santi020k/eslint-config-vite': 'vite',\n '@santi020k/eslint-config-vue': 'vue'\n}\n\nconst FRAMEWORK_KEY_TO_PACKAGE = {\n ...Object.fromEntries(\n Object.entries(FRAMEWORK_PACKAGE_TO_KEY)\n .filter(([packageName]) => packageName !== '@santi020k/eslint-config-remix')\n .map(([packageName, framework]) => [framework, packageName])\n ),\n 'react-router': '@santi020k/eslint-config-react-router'\n} as Record<string, string>\n\nconst LITE_PACKAGE_NAME = '@santi020k/eslint-config-lite'\nconst INTEGRATIONS_PACKAGE_NAME = '@santi020k/eslint-config-integrations'\nconst ASTRO_DOCTOR_PACKAGE_NAME = '@santi020k/eslint-plugin-astro-doctor'\nconst BASIC_PACKAGE_NAME = '@santi020k/eslint-config-basic'\nconst FULL_PACKAGE_NAME = '@santi020k/eslint-config-full'\nconst TYPESCRIPT_PACKAGE_NAME = 'typescript'\n\nconst CATEGORY_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 PRESET_INSTALL_PACKAGES: Record<string, string[]> = {\n all: Object.values(CATEGORY_PACKAGES),\n app: [CATEGORY_PACKAGES.testing, CATEGORY_PACKAGES.tools],\n ci: [CATEGORY_PACKAGES.extensions, CATEGORY_PACKAGES.tools],\n library: [CATEGORY_PACKAGES.extensions, CATEGORY_PACKAGES.tools],\n monorepo: [CATEGORY_PACKAGES.extensions, CATEGORY_PACKAGES.tools]\n}\n\ntype DoctorFeatureCategory = keyof typeof CATEGORY_PACKAGES | 'frameworks'\n\ninterface DoctorFeatureActivation {\n detected: boolean\n enabled: boolean\n installed: boolean\n name: string\n package: string\n reason?: string\n}\n\ninterface DoctorProjectActivation {\n extensions: DoctorFeatureActivation[]\n formats: DoctorFeatureActivation[]\n frameworks: DoctorFeatureActivation[]\n ignores: string[]\n inactivePackages: { package: string, reason: string }[]\n libraries: DoctorFeatureActivation[]\n path: string\n runtime: string\n tailwind: {\n componentClasses: number\n detected: boolean\n entryPoint: null | string\n unknownClassPolicy: 'fallback-off' | 'off' | 'strict' | 'strict-with-css-components'\n }\n testing: DoctorFeatureActivation[]\n tools: DoctorFeatureActivation[]\n typescript: {\n detected: boolean\n enabled: boolean\n installed: boolean\n mode: 'off' | 'syntax' | 'type-aware'\n package: string\n reason?: string\n tsconfig: null | string\n }\n}\n\nconst getConfigPathIfPresent = (cwd: string): null | string => {\n const configPath = ESLINT_CONFIG_FILENAMES\n .map(filename => join(cwd, filename))\n .find(p => existsSync(p))\n\n return configPath ?? null\n}\n\nconst readPackageJson = (cwd: string): null | Record<string, unknown> => {\n const packageJsonPath = join(cwd, 'package.json')\n\n if (!existsSync(packageJsonPath)) return null\n\n try {\n return JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nconst getDeclaredDependencyNames = (packageJson: null | Record<string, unknown>): Set<string> => {\n const dependencyFields = [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies'\n ]\n\n const names = new Set<string>()\n\n for (const field of dependencyFields) {\n const dependencies = packageJson?.[field]\n\n if (!dependencies || typeof dependencies !== 'object' || Array.isArray(dependencies)) continue\n\n for (const name of Object.keys(dependencies)) {\n names.add(name)\n }\n }\n\n return names\n}\n\nconst needsIntegrationPackage = (summary: ReturnType<typeof getProjectSummary>): boolean => (\n summary.libraries.length > 0 ||\n summary.testing.length > 0 ||\n summary.formats.length > 0 ||\n summary.tools.length > 0 ||\n summary.extensions.some(extension => extension !== 'boundaries')\n)\n\nconst hasPresetAll = (configContent: null | string): boolean => Boolean(\n configContent && (\n /\\bPreset\\.All\\b/.test(configContent) ||\n /preset\\s*:\\s*['\"]all['\"]/.test(configContent)\n )\n)\n\nconst getLiteInstallPackages = (\n summary: ReturnType<typeof getProjectSummary>,\n declaredDependencies: Set<string>\n): string[] => {\n const packages = new Set<string>([\n 'eslint',\n LITE_PACKAGE_NAME\n ])\n\n for (const framework of summary.frameworks) {\n const packageName = FRAMEWORK_KEY_TO_PACKAGE[framework]\n\n if (packageName) packages.add(packageName)\n }\n\n if (needsIntegrationPackage(summary)) {\n packages.add(INTEGRATIONS_PACKAGE_NAME)\n }\n\n if (summary.typescript && !declaredDependencies.has(TYPESCRIPT_PACKAGE_NAME)) {\n packages.add(TYPESCRIPT_PACKAGE_NAME)\n }\n\n return [...packages]\n}\n\nconst getInstallPackages = (\n summary: ReturnType<typeof getProjectSummary>,\n declaredDependencies: Set<string>,\n explicitFeaturePackages: string[] = []\n): string[] => {\n const usesFullPackage = declaredDependencies.has(FULL_PACKAGE_NAME)\n const packages = new Set<string>(['eslint'])\n\n if (!usesFullPackage) packages.add(BASIC_PACKAGE_NAME)\n\n if (!usesFullPackage) {\n for (const framework of summary.frameworks) {\n const packageName = FRAMEWORK_KEY_TO_PACKAGE[framework]\n\n if (packageName) packages.add(packageName)\n }\n\n const categorySelections = [\n [summary.extensions, CATEGORY_PACKAGES.extensions],\n [summary.formats, CATEGORY_PACKAGES.formats],\n [summary.libraries, CATEGORY_PACKAGES.libraries],\n [summary.testing, CATEGORY_PACKAGES.testing],\n [summary.tools, CATEGORY_PACKAGES.tools]\n ] as const\n\n for (const [features, packageName] of categorySelections) {\n if (features.length > 0) packages.add(packageName)\n }\n\n for (const packageName of explicitFeaturePackages) {\n packages.add(packageName)\n }\n\n for (const packageName of PRESET_INSTALL_PACKAGES[summary.preset] ?? []) {\n packages.add(packageName)\n }\n }\n\n if (summary.typescript) packages.add(TYPESCRIPT_PACKAGE_NAME)\n\n return [...packages].filter(packageName => !declaredDependencies.has(packageName))\n}\n\nconst hasLintScript = (cwd: string): boolean => {\n const packageJson = readPackageJson(cwd) as null | { scripts?: Record<string, string> }\n\n return Boolean(packageJson?.scripts?.lint)\n}\n\nconst getWorkspacePatternsFromPackageJson = (packageJson: null | Record<string, unknown>): string[] => {\n const workspaces = packageJson?.workspaces\n\n if (Array.isArray(workspaces)) {\n return workspaces.filter((value): value is string => typeof value === 'string')\n }\n\n if (workspaces && typeof workspaces === 'object' && Array.isArray((workspaces as { packages?: unknown }).packages)) {\n return (workspaces as { packages: unknown[] }).packages.filter((value): value is string => typeof value === 'string')\n }\n\n return []\n}\n\nconst getWorkspacePatternsFromPnpm = (cwd: string): string[] => {\n const workspacePath = join(cwd, 'pnpm-workspace.yaml')\n\n if (!existsSync(workspacePath)) return []\n\n const content = readFileSync(workspacePath, 'utf8')\n const patterns: string[] = []\n let inPackages = false\n\n for (const line of content.split(/\\r?\\n/)) {\n if (/^packages:\\s*$/.test(line)) {\n inPackages = true\n\n continue\n }\n\n if (inPackages && /^\\S/.test(line)) break\n\n const match = inPackages ? /^\\s*-\\s*['\"]?([^'\"]+)['\"]?\\s*$/.exec(line) : null\n\n if (match?.[1] && !match[1].startsWith('!')) patterns.push(match[1])\n }\n\n return patterns\n}\n\nconst expandWorkspacePattern = (cwd: string, pattern: string): string[] => {\n const normalized = pattern.replace(/\\/$/, '')\n\n if (!normalized.endsWith('/*')) return []\n\n const base = normalized.slice(0, -2)\n const basePath = join(cwd, base)\n\n if (!existsSync(basePath)) return []\n\n return readdirSync(basePath, { withFileTypes: true })\n .filter(entry => entry.isDirectory())\n .map(entry => `${base}/${entry.name}`)\n .filter(projectPath => existsSync(join(cwd, projectPath, 'package.json')))\n}\n\nconst detectWorkspaceProjects = (cwd: string): string[] => {\n const patterns = [\n ...getWorkspacePatternsFromPackageJson(readPackageJson(cwd)),\n ...getWorkspacePatternsFromPnpm(cwd)\n ]\n\n return [...new Set(patterns.flatMap(pattern => expandWorkspacePattern(cwd, pattern)))].sort()\n}\n\nconst createExplicitOptions = (cwd: string): string[] => {\n // Project summarization is declared later beside the doctor workflow that also consumes it.\n // eslint-disable-next-line no-use-before-define\n const summary = getProjectSummary(cwd)\n const options: string[] = []\n\n const features = [...new Set([\n ...summary.extensions,\n ...summary.formats,\n ...summary.libraries,\n ...summary.testing,\n ...summary.tools\n ])].sort()\n\n if (summary.typescript) options.push(' typescript: true,')\n\n if (summary.frameworks.length > 0) {\n options.push(\n ' frameworks: {',\n ...summary.frameworks.map(framework => ` ${toPropertyKey(framework)}: true,`),\n ' },'\n )\n }\n\n if (features.length > 0) {\n options.push(\n ' features: {',\n ...features.map(feature => ` ${toPropertyKey(feature)}: true,`),\n ' },'\n )\n }\n\n return options\n}\n\nconst createConfigContent = (cwd: string, explicit = false): { configContent: string, configPath: string } => {\n const explicitOptions = explicit ? createExplicitOptions(cwd) : []\n\n const invocation = explicitOptions.length > 0 ?\n ['export default defineConfig({', ...explicitOptions, '})'] :\n ['export default defineConfig()']\n\n const configContent = [\n 'import { defineConfig } from \\'@santi020k/eslint-config-basic\\'',\n '',\n ...invocation,\n ''\n ].join('\\n')\n\n return {\n configContent,\n configPath: resolveConfigPath(cwd)\n }\n}\n\nconst formatList = (values: undefined | unknown[]): string => {\n if (!values?.length) return 'none'\n\n return values.join(', ')\n}\n\nconst getProjectSummary = (cwd: string) => {\n const options = detectProjectOptions(cwd)\n const workspaceProjects = detectWorkspaceProjects(cwd)\n let typescriptMode: DoctorProjectActivation['typescript']['mode'] = 'off'\n\n if (options.typescript) {\n typescriptMode = options.typescript === 'syntax' ? 'syntax' : 'type-aware'\n }\n\n return {\n detectedProjects: Object.keys(options.projects ?? {}).sort(),\n extensions: options.extensions ?? [],\n formats: options.formats ?? [],\n frameworks: getFrameworkKeys(options.detectedFrameworks),\n libraries: options.libraries ?? [],\n nextMode: options.nextMode ?? 'n/a',\n preset: options.preset ?? 'basic',\n runtime: options.runtime ?? 'universal',\n testing: options.testing ?? [],\n tools: options.tools ?? [],\n typescript: Boolean(options.typescript),\n typescriptMode,\n workspaceProjects\n }\n}\n\nconst getDetectedProjectPaths = (cwd: string): string[] => {\n const summary = getProjectSummary(cwd)\n\n return summary.workspaceProjects.length > 0 ?\n [...new Set([...summary.detectedProjects, ...summary.workspaceProjects])] :\n ['.']\n}\n\nconst getTailwindUnknownClassPolicy = (\n detected: boolean,\n entryPoint: null | string,\n componentClasses = 0\n): DoctorProjectActivation['tailwind']['unknownClassPolicy'] => {\n if (!detected) return 'off'\n\n if (!entryPoint) return 'fallback-off'\n\n return componentClasses > 0 ? 'strict-with-css-components' : 'strict'\n}\n\nconst getTailwindEntryPoints = (cwd: string) => getDetectedProjectPaths(cwd).flatMap(projectPath => {\n const projectRoot = projectPath === '.' ? cwd : join(cwd, projectPath)\n const summary = getProjectSummary(projectRoot)\n\n if (!summary.libraries.includes('tailwind')) return []\n\n const entryPoint = findTailwindEntryPoint(projectRoot) ?? null\n const componentClasses = entryPoint ? findCssComponentClasses(projectRoot, entryPoint).length : 0\n\n return [{\n componentClasses,\n entryPoint,\n path: projectPath,\n unknownClassPolicy: getTailwindUnknownClassPolicy(true, entryPoint, componentClasses)\n }]\n})\n\nconst getDeclarationProjectWarnings = (cwd: string): string[] => (\n getDetectedProjectPaths(cwd).flatMap(projectPath => {\n const projectRoot = projectPath === '.' ? cwd : join(cwd, projectPath)\n const summary = getProjectSummary(projectRoot)\n\n if (summary.typescriptMode !== 'syntax') return []\n\n const packageName = readPackageJson(projectRoot)?.name\n const packageLabel = typeof packageName === 'string' ? `${projectPath} (${packageName})` : projectPath\n\n return [\n `TypeScript declarations were detected in ${packageLabel}, but no supported package-local tsconfig was found. ` +\n 'The package uses syntax-only linting to avoid a project-service parse failure. Add a tsconfig.json that includes ' +\n 'the declarations for type-aware linting, or add their patterns to `typescript.untypedFiles` when a parent ' +\n 'type-aware project intentionally owns them.'\n ]\n })\n)\n\nconst getInstallProjectSummary = (cwd: string): ReturnType<typeof getProjectSummary> => {\n const rootSummary = getProjectSummary(cwd)\n\n const projectPaths = [...new Set([\n ...rootSummary.detectedProjects,\n ...rootSummary.workspaceProjects\n ])]\n\n const projectSummaries = projectPaths.map(projectPath => (\n getProjectSummary(join(cwd, projectPath))\n ))\n\n const summaries = [rootSummary, ...projectSummaries]\n let typescriptMode: DoctorProjectActivation['typescript']['mode'] = 'off'\n\n if (summaries.some(summary => summary.typescriptMode === 'type-aware')) {\n typescriptMode = 'type-aware'\n } else if (summaries.some(summary => summary.typescriptMode === 'syntax')) {\n typescriptMode = 'syntax'\n }\n\n return {\n ...rootSummary,\n extensions: [...new Set(summaries.flatMap(summary => summary.extensions))],\n formats: [...new Set(summaries.flatMap(summary => summary.formats))],\n frameworks: [...new Set(summaries.flatMap(summary => summary.frameworks))].sort(),\n libraries: [...new Set(summaries.flatMap(summary => summary.libraries))],\n testing: [...new Set(summaries.flatMap(summary => summary.testing))],\n tools: [...new Set(summaries.flatMap(summary => summary.tools))],\n typescript: summaries.some(summary => summary.typescript),\n typescriptMode\n }\n}\n\nconst getWorkspaceDeclaredConfigPackages = (\n cwd: string,\n summary: ReturnType<typeof getProjectSummary>\n): string[] => {\n const packages = new Set<string>()\n\n for (const projectPath of summary.detectedProjects) {\n for (const packageName of getDeclaredDependencyNames(readPackageJson(join(cwd, projectPath)))) {\n if (packageName.startsWith('@santi020k/eslint-config-')) packages.add(packageName)\n }\n }\n\n return [...packages]\n}\n\nconst createStandardsContent = (cwd: string): string => {\n const summary = getProjectSummary(cwd)\n\n return [\n '# ESLint Standards',\n '',\n 'This document was generated from the active project dependencies detected by `@santi020k/eslint-config-basic`.',\n '',\n '## Active Profile',\n '',\n `- TypeScript: ${summary.typescript ? 'enabled' : 'disabled'}`,\n `- Preset: ${summary.preset}`,\n `- Runtime: ${summary.runtime}`,\n `- Next.js mode: ${summary.nextMode}`,\n `- Frameworks: ${formatList(summary.frameworks)}`,\n `- Libraries: ${formatList(summary.libraries)}`,\n `- Testing: ${formatList(summary.testing)}`,\n `- Formats: ${formatList(summary.formats)}`,\n `- Tools: ${formatList(summary.tools)}`,\n `- Extensions: ${formatList(summary.extensions)}`,\n '',\n '## Recommended Config',\n '',\n '```js',\n 'import { defineConfig } from \\'@santi020k/eslint-config-basic\\'',\n '',\n 'export default await defineConfig()',\n '```',\n '',\n 'Use `basic-eslint explain` when you want to inspect what the zero-config setup detects.'\n ].join('\\n')\n}\n\nconst getCliVersion = (): string => {\n const cliDir = dirname(fileURLToPath(import.meta.url))\n const packageJsonPath = join(cliDir, '..', 'package.json')\n\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as { version?: string }\n\n return packageJson.version ?? 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nconst printUsage = () => {\n console.log([\n 'Usage: basic-eslint <command> [options]',\n '',\n 'Commands:',\n ' init Create eslint.config.js/mjs if missing',\n ' update Regenerate eslint.config.js/mjs from detection',\n ' explain Print detected v3 config inputs',\n ' explain-preset Compare the current config with a preset',\n ' inspect Print detected inputs and active config features',\n ' install Install missing packages for detected v3 features',\n ' doctor Check project setup for common v3 adoption issues',\n ' compatibility Check runtime and config package compatibility',\n ' docs Generate ESLINT_STANDARDS.md from detection',\n ' migrate Plan or apply v1-to-v2 and v2-to-v3 migrations',\n ' baseline Suppress existing violations for incremental adoption',\n ' profile Compare ESLint performance and report slow rules',\n ' snapshot Save the effective rules for representative files',\n ' diff Compare effective rules with the saved snapshot',\n ' generate-skill Generate AI agent standards files',\n '',\n 'Options:',\n ' --analyze-source explain-preset: lint source and preview autofix without writing',\n ' --force Overwrite existing generated skill sections/files',\n ' --check Verify generated files, migrations, or snapshots without writing',\n ' --concurrency profile: off, auto, or a worker count',\n ' --create generate-skill: scaffold a root AGENTS.md when missing',\n ' --dry-run install: print the detected install command without running it',\n ' --explicit init: write detected settings explicitly',\n ' --file explain/explain-preset/profile/snapshot/diff: file or lint target (repeatable)',\n ' --fix doctor: safely repair generated config and package metadata',\n ' --full migrate --to v3: choose the batteries-included package',\n ' --json Print JSON for commands that support it',\n ' --lite-install doctor: print the deprecated v2 Lite install command (removed in v4)',\n ' --max-duration profile: maximum duration in milliseconds',\n ' --max-rule-time profile: maximum time for the slowest rule in milliseconds',\n ' --max-warnings profile: maximum warning count',\n ' --compatibility explain-preset: write a temporary compatibility override',\n ' --output explain-preset: compatibility override path',\n ' --preset baseline: enable ci or pedantic strict mode before suppressing',\n ' --prune baseline: remove suppressions for resolved violations',\n ' --snapshot-path snapshot/diff: override .eslint-config-snapshot.json',\n ' --to migrate: target version (v2 or v3)',\n ' --verbose doctor: print per-project activation details',\n ' --with-eslint-mcp generate-skill: scaffold the official ESLint MCP server',\n ' --write Apply safe migrations for commands that support it',\n ' --help, -h Show this help message',\n ' --version, -v Show CLI version'\n ].join('\\n'))\n}\n\nconst COMMAND_OPTIONS: Partial<Record<string, string[]>> = {\n baseline: ['--json', '--preset', '--prune'],\n compatibility: ['--json'],\n diff: ['--file', '--json', '--snapshot-path'],\n docs: [],\n doctor: ['--fix', '--json', '--lite-install', '--verbose'],\n explain: ['--file', '--json'],\n 'explain-preset': ['--analyze-source', '--compatibility', '--file', '--json', '--output'],\n 'generate-skill': ['--check', '--create', '--force', '--with-eslint-mcp'],\n init: ['--check', '--explicit'],\n inspect: ['--json'],\n install: ['--dry-run'],\n migrate: ['--check', '--full', '--json', '--to', '--write'],\n profile: ['--concurrency', '--file', '--json', '--max-duration', '--max-rule-time', '--max-warnings'],\n snapshot: ['--check', '--file', '--json', '--snapshot-path'],\n update: []\n}\n\nconst VALUE_OPTIONS = new Set([\n '--concurrency',\n '--file',\n '--max-duration',\n '--max-rule-time',\n '--max-warnings',\n '--output',\n '--preset',\n '--snapshot-path',\n '--to'\n])\n\nconst printCommandUsage = (command: string): void => {\n let positional = ''\n\n if (command === 'explain') positional = ' [rule]'\n else if (command === 'explain-preset') positional = ' <preset>'\n\n const options = COMMAND_OPTIONS[command] ?? []\n\n console.log([\n 'Usage: basic-eslint <command> [options]',\n '',\n `Usage: basic-eslint ${command}${positional}${options.length > 0 ? ' [options]' : ''}`,\n ...(options.length > 0 ? ['', 'Options:', ...options.map(option => ` ${option}`)] : [])\n ].join('\\n'))\n}\n\nconst validateCommandArguments = (\n command: string,\n args: string[]\n): { ok: boolean, positional?: string } => {\n const allowed = COMMAND_OPTIONS[command]\n\n if (!allowed) return { ok: true }\n\n const allowedOptions = new Set(allowed)\n const positionals: string[] = []\n\n for (let index = 0; index < args.length; index++) {\n const argument = args[index]\n\n if (!argument.startsWith('-')) {\n positionals.push(argument)\n\n continue\n }\n\n const option = argument.includes('=') ? argument.slice(0, argument.indexOf('=')) : argument\n\n if (!allowedOptions.has(option)) {\n console.error(`Unknown option for ${command}: ${option}`)\n\n process.exitCode = 1\n\n return { ok: false }\n }\n\n if (argument.includes('=') && !VALUE_OPTIONS.has(option)) {\n console.error(`Option ${option} does not accept a value.`)\n\n process.exitCode = 1\n\n return { ok: false }\n }\n\n if (VALUE_OPTIONS.has(option) && !argument.includes('=')) {\n const value = args[index + 1]\n\n if (!value || value.startsWith('-')) {\n console.error(\n ['--max-duration', '--max-rule-time', '--max-warnings'].includes(option) ?\n `${option} must be a non-negative number.` :\n `Option ${option} requires a value.`\n )\n\n process.exitCode = 1\n\n return { ok: false }\n }\n\n index++\n } else if (VALUE_OPTIONS.has(option) && argument.endsWith('=')) {\n console.error(\n ['--max-duration', '--max-rule-time', '--max-warnings'].includes(option) ?\n `${option} must be a non-negative number.` :\n `Option ${option} requires a value.`\n )\n\n process.exitCode = 1\n\n return { ok: false }\n }\n }\n\n const maximumPositionals = command === 'explain' || command === 'explain-preset' ? 1 : 0\n\n if (positionals.length > maximumPositionals) {\n console.error(`Unexpected argument for ${command}: ${positionals[maximumPositionals]}`)\n\n process.exitCode = 1\n\n return { ok: false }\n }\n\n return { ok: true, positional: positionals[0] }\n}\n\nexport const handleInit = (cwd: string = process.cwd(), check = false, explicit = false) => {\n const configPath = resolveConfigPath(cwd)\n\n if (check) {\n const exists = existsSync(configPath)\n\n console.log(JSON.stringify({\n configFile: exists ? basename(configPath) : null,\n exists,\n ok: exists\n }, null, 2))\n\n if (!exists) process.exitCode = 1\n\n return\n }\n\n if (existsSync(configPath)) {\n console.error(`⚠️ ${basename(configPath)} already exists. Skipping...`)\n\n return\n }\n\n console.log('🔍 Detecting project settings...')\n\n const { configContent } = createConfigContent(cwd, explicit)\n\n writeFileSync(configPath, configContent)\n\n console.log(`✅ Created ${basename(configPath)} with auto-detected settings!`)\n\n console.log('🚀 Ready to lint!')\n}\n\nexport const handleUpdate = (cwd: string = process.cwd()) => {\n console.log('🔍 Detecting project settings...')\n\n const { configContent, configPath } = createConfigContent(cwd)\n\n if (existsSync(configPath)) {\n const backupPath = `${configPath}.bak`\n const existing = readFileSync(configPath, 'utf8')\n\n writeFileSync(backupPath, existing)\n\n console.log(`📦 Backed up existing config to ${basename(backupPath)}`)\n }\n\n writeFileSync(configPath, configContent)\n\n console.log(`✅ Updated ${basename(configPath)} with auto-detected settings!`)\n\n console.log('🚀 Ready to lint!')\n}\n\nexport const handleExplain = (cwd: string = process.cwd(), json = false) => {\n const summary = getProjectSummary(cwd)\n\n if (json) {\n console.log(JSON.stringify(summary, null, 2))\n\n return\n }\n\n console.log([\n 'ESLint Basic detected configuration:',\n `- TypeScript: ${summary.typescript ? 'enabled' : 'disabled'}`,\n `- Preset: ${summary.preset}`,\n `- Runtime: ${summary.runtime}`,\n `- Next.js mode: ${summary.nextMode}`,\n `- Frameworks: ${formatList(summary.frameworks)}`,\n `- Libraries: ${formatList(summary.libraries)}`,\n `- Testing: ${formatList(summary.testing)}`,\n `- Formats: ${formatList(summary.formats)}`,\n `- Tools: ${formatList(summary.tools)}`,\n `- Extensions: ${formatList(summary.extensions)}`\n ].join('\\n'))\n}\n\nexport const handleInspect = async (cwd: string = process.cwd(), json = false) => {\n const summary = getProjectSummary(cwd)\n const activeConfig = await analyzeEslintConfig(cwd)\n\n const payload = {\n activeConfig,\n detected: summary,\n packageManager: detectPackageManager(cwd),\n tailwindEntryPoints: getTailwindEntryPoints(cwd)\n }\n\n if (json) {\n console.log(JSON.stringify(payload, null, 2))\n\n return\n }\n\n console.log([\n 'ESLint Basic inspection:',\n `- Package manager: ${payload.packageManager}`,\n `- Config source: ${activeConfig?.source ?? 'not found'}`,\n `- Config file: ${activeConfig?.configFile ?? 'none'}`,\n `- TypeScript: ${summary.typescript ? 'enabled' : 'disabled'}`,\n `- Preset: ${summary.preset}`,\n `- Runtime: ${summary.runtime}`,\n `- Frameworks: ${formatList(summary.frameworks)}`,\n `- Libraries: ${formatList(summary.libraries)}`,\n `- Testing: ${formatList(summary.testing)}`,\n `- Formats: ${formatList(summary.formats)}`,\n `- Tools: ${formatList(summary.tools)}`,\n `- Extensions: ${formatList(summary.extensions)}`,\n `- Workspace projects: ${formatList(summary.workspaceProjects)}`\n ].join('\\n'))\n}\n\ninterface DuplicateEslintInfo {\n configVersion: string\n projectVersion: string\n}\n\ninterface PackageMetadata {\n engines?: { node?: string }\n name?: string\n peerDependencies?: { eslint?: string }\n version?: string\n}\n\ninterface SemverApi {\n Range: new(range: string) => {\n range: string\n set: { value: string }[][]\n }\n minVersion: (range: string) => null | { version: string }\n satisfies: (version: string, range: string) => boolean\n subset: (subRange: string, superRange: string) => boolean\n validRange: (range: string) => null | string\n}\n\nconst semver = createRequire(import.meta.url)('semver') as SemverApi\n\nconst intersectTwoSemverRanges = (left: string, right: string): null | string => {\n if (semver.subset(left, right)) return left\n\n if (semver.subset(right, left)) return right\n\n const intersections = new Set<string>()\n const leftRange = new semver.Range(left)\n const rightRange = new semver.Range(right)\n\n for (const leftComparators of leftRange.set) {\n for (const rightComparators of rightRange.set) {\n const candidate = [...leftComparators, ...rightComparators]\n .map(comparator => comparator.value)\n .filter(Boolean)\n .join(' ')\n\n const normalized = new semver.Range(candidate || '*').range || '*'\n\n if (semver.minVersion(normalized)) intersections.add(normalized)\n }\n }\n\n return intersections.size > 0 ? [...intersections].join(' || ') : null\n}\n\nconst intersectSemverRanges = (ranges: string[]): null | string => {\n const validRanges = ranges.filter(range => semver.validRange(range) !== null)\n\n if (validRanges.length !== ranges.length || validRanges.length === 0) return null\n\n let intersection = validRanges[0]\n\n for (const range of validRanges.slice(1)) {\n intersection = intersectTwoSemverRanges(intersection, range) ?? ''\n\n if (!intersection) return null\n }\n\n return intersection\n}\n\nconst readPackageMetadataFromMain = (mainPath: string): null | PackageMetadata => {\n let directory = dirname(mainPath)\n\n for (let depth = 0; depth < 4; depth++) {\n const packagePath = join(directory, 'package.json')\n\n if (existsSync(packagePath)) {\n const metadata = JSON.parse(readFileSync(packagePath, 'utf8')) as PackageMetadata\n\n // Resolution by the requested specifier is authoritative. npm aliases\n // such as `typescript: npm:@typescript/typescript6@...` intentionally\n // expose a manifest whose real name differs from the installed key.\n if (metadata.name && metadata.version) return metadata\n }\n\n directory = dirname(directory)\n }\n\n return null\n}\n\nconst resolvePackageMetadata = (cwd: string, packageName: string): null | PackageMetadata => {\n const candidateRoots = [...new Set([\n cwd,\n findPnpmWorkspaceRoot(cwd)\n ].filter((root): root is string => Boolean(root)))]\n\n for (const candidateRoot of candidateRoots) {\n try {\n const manifestPath = findPackageJSON(\n packageName,\n pathToFileURL(join(candidateRoot, 'package.json'))\n )\n\n if (manifestPath) {\n const metadata = JSON.parse(readFileSync(manifestPath, 'utf8')) as PackageMetadata\n\n return metadata\n }\n } catch {\n // Fall through to main-entry and aggregate-package resolution.\n }\n\n try {\n const projectRequire = createRequire(join(candidateRoot, 'package.json'))\n\n try {\n const metadata = readPackageMetadataFromMain(projectRequire.resolve(packageName))\n\n if (metadata) return metadata\n } catch {\n const integrationsMain = projectRequire.resolve(INTEGRATIONS_PACKAGE_NAME)\n const integrationsRequire = createRequire(integrationsMain)\n const metadata = readPackageMetadataFromMain(integrationsRequire.resolve(packageName))\n\n if (metadata) return metadata\n }\n } catch {\n // Try a sibling workspace package below.\n }\n\n for (const projectPath of detectWorkspaceProjects(candidateRoot)) {\n const metadata = readPackageJson(join(candidateRoot, projectPath)) as null | PackageMetadata\n\n if (metadata?.name === packageName) return metadata\n }\n }\n\n return null\n}\n\ninterface NodeEngineAssessment {\n compatible: boolean\n consumerRange: null | string\n requiredRange: null | string\n targetRange: null | string\n}\n\nconst assessConsumerNodeEngine = (\n cwd: string,\n packageJson: null | Record<string, unknown>\n): NodeEngineAssessment => {\n const declaredConfigPackages = [...getDeclaredDependencyNames(packageJson)]\n .filter(packageName => packageName.startsWith('@santi020k/eslint-config-'))\n\n const requiredRanges = declaredConfigPackages.flatMap(packageName => {\n const range = resolvePackageMetadata(cwd, packageName)?.engines?.node\n\n return range ? [range] : []\n })\n\n const requiredRange = intersectSemverRanges(requiredRanges)\n const engines = packageJson?.engines\n\n const consumerRange = engines && typeof engines === 'object' && !Array.isArray(engines) ?\n (engines as Record<string, unknown>).node :\n null\n\n const normalizedConsumerRange = typeof consumerRange === 'string' ? consumerRange : null\n\n if (requiredRanges.length === 0) {\n return {\n compatible: true,\n consumerRange: normalizedConsumerRange,\n requiredRange: null,\n targetRange: null\n }\n }\n\n if (!requiredRange) {\n return {\n compatible: false,\n consumerRange: normalizedConsumerRange,\n requiredRange: null,\n targetRange: null\n }\n }\n\n if (!normalizedConsumerRange || !semver.validRange(normalizedConsumerRange)) {\n return {\n compatible: false,\n consumerRange: normalizedConsumerRange,\n requiredRange,\n targetRange: requiredRange\n }\n }\n\n const compatible = requiredRanges.every(range => semver.subset(normalizedConsumerRange, range))\n\n return {\n compatible,\n consumerRange: normalizedConsumerRange,\n requiredRange,\n targetRange: compatible ?\n null :\n intersectSemverRanges([normalizedConsumerRange, ...requiredRanges])\n }\n}\n\nconst getConsumerNodeEngineWarning = (\n cwd: string,\n packageJson: null | Record<string, unknown>\n): null | string => {\n const assessment = assessConsumerNodeEngine(cwd, packageJson)\n\n if (assessment.compatible) return null\n\n if (!assessment.requiredRange) {\n return 'Installed config packages do not share a compatible Node engine range.'\n }\n\n if (!assessment.consumerRange) {\n return `package.json does not declare engines.node; installed config packages require ${assessment.requiredRange}.`\n }\n\n if (!semver.validRange(assessment.consumerRange)) {\n return `package.json engines.node ${assessment.consumerRange} is invalid; ` +\n `installed config packages require ${assessment.requiredRange}.`\n }\n\n return `package.json engines.node ${assessment.consumerRange} permits unsupported runtimes; ` +\n `installed config packages require ${assessment.requiredRange}.`\n}\n\nconst getAstroDoctorNodeWarning = (metadata: PackageMetadata): null | string => {\n const nodeRange = metadata.engines?.node\n\n if (!nodeRange || semver.satisfies(process.versions.node, nodeRange)) return null\n\n return `Astro Doctor ${metadata.version ?? ''} requires Node ${nodeRange}, ` +\n `but the current runtime is ${process.versions.node}.`\n}\n\nconst getAstroDoctorEslintWarning = (\n metadata: PackageMetadata,\n eslintMetadata: null | PackageMetadata\n): null | string => {\n const eslintRange = metadata.peerDependencies?.eslint\n const eslintVersion = eslintMetadata?.version\n\n if (!eslintRange || !eslintVersion || semver.satisfies(eslintVersion, eslintRange)) return null\n\n return `Astro Doctor ${metadata.version ?? ''} requires ESLint ${eslintRange}, ` +\n `but this project resolves ${eslintVersion}.`\n}\n\nconst getAstroDoctorCompatibilityWarnings = (cwd: string, enabled: boolean): string[] => {\n if (!enabled) return []\n\n const pluginMetadata = resolvePackageMetadata(cwd, ASTRO_DOCTOR_PACKAGE_NAME)\n\n if (!pluginMetadata) {\n return [\n `Astro Doctor is enabled, but ${ASTRO_DOCTOR_PACKAGE_NAME} could not be resolved. ` +\n 'Reinstall dependencies or disable the `astro-doctor` feature.'\n ]\n }\n\n const eslintMetadata = resolvePackageMetadata(cwd, 'eslint')\n\n return [\n getAstroDoctorNodeWarning(pluginMetadata),\n getAstroDoctorEslintWarning(pluginMetadata, eslintMetadata)\n ].filter((warning): warning is string => warning !== null)\n}\n\n/**\n * Detects whether the project and the config packages resolve two different\n * physical copies of ESLint (e.g. a project pinning an older ESLint while the\n * config packages resolve their own ESLint 10 dependency). Only ESLint 10 is\n * supported; two parallel copies can also apply subtly different rule behavior\n * between editor and CLI.\n */\nexport const findDuplicateEslint = (cwd: string = process.cwd()): DuplicateEslintInfo | null => {\n try {\n const projectRequire = createRequire(join(cwd, 'package.json'))\n const projectEslintPkgPath = projectRequire.resolve('eslint/package.json')\n const coreMainPath = projectRequire.resolve('@santi020k/eslint-config-core')\n const coreRequire = createRequire(coreMainPath)\n const coreEslintPkgPath = coreRequire.resolve('eslint/package.json')\n\n if (projectEslintPkgPath === coreEslintPkgPath) return null\n\n const projectVersion = (JSON.parse(readFileSync(projectEslintPkgPath, 'utf8')) as { version?: string }).version ?? 'unknown'\n const configVersion = (JSON.parse(readFileSync(coreEslintPkgPath, 'utf8')) as { version?: string }).version ?? 'unknown'\n\n if (projectVersion === configVersion) return null\n\n return { configVersion, projectVersion }\n } catch {\n return null\n }\n}\n\nconst validateConfigContent = (\n configContent: string,\n hasV1FrameworkImports: boolean,\n declaredDependencies: Set<string>,\n summary: ReturnType<typeof getProjectSummary>\n): string[] => {\n const warnings: string[] = []\n\n if (hasV1FrameworkImports) {\n warnings.push('Config still imports v1 framework packages. Run `basic-eslint migrate --write` or switch to framework booleans.')\n }\n\n const usesComposerCall = /from\\s*['\"]@santi020k\\/eslint-config-(?:basic|full|lite)['\"]/.test(configContent) &&\n /\\b(?:defineConfig|eslintConfig)\\s*\\(/.test(configContent)\n\n const usesRecommendedComposer = /from\\s*['\"]@santi020k\\/eslint-config-(?:basic|full)\\/recommended['\"]/.test(\n configContent\n )\n\n const usesBasicComposer = usesComposerCall || usesRecommendedComposer\n\n const hasDetectedProjectScopes = summary.workspaceProjects.every(project => (\n summary.detectedProjects.includes(project)\n ))\n\n if (\n summary.workspaceProjects.length > 0 &&\n !configContent.includes('projects:') &&\n !(usesBasicComposer && hasDetectedProjectScopes)\n ) {\n warnings.push('Workspace packages were detected, but the root config does not use `projects` scoping.')\n }\n\n if (configContent.includes(LITE_PACKAGE_NAME)) {\n const missingFrameworkPackages = summary.frameworks\n .map(framework => FRAMEWORK_KEY_TO_PACKAGE[framework])\n .filter((packageName): packageName is string => Boolean(packageName))\n .filter(packageName => !declaredDependencies.has(packageName))\n\n if (missingFrameworkPackages.length > 0) {\n warnings.push(\n `Lite config detected ${formatList(summary.frameworks)}, but these framework config packages are not declared: ` +\n `${missingFrameworkPackages.join(', ')}. Install them or disable those frameworks.`\n )\n }\n\n if (needsIntegrationPackage(summary) && !declaredDependencies.has(INTEGRATIONS_PACKAGE_NAME)) {\n warnings.push(\n `Lite config detected optional integrations, but ${INTEGRATIONS_PACKAGE_NAME} is not declared. ` +\n 'Install it or remove the selected libraries, testing tools, formats, tools, and extension integrations.'\n )\n }\n\n if (hasPresetAll(configContent)) {\n warnings.push(\n 'Lite config uses Preset.All, which enables every optional integration and reduces the dependency benefits of lite. ' +\n 'Prefer enabling only the integrations this project uses.'\n )\n }\n }\n\n const missingPackages = getInstallPackages(\n summary,\n declaredDependencies,\n getExplicitConfigFeaturePackages(configContent)\n )\n\n if (missingPackages.length > 0) {\n warnings.push(\n `The active configuration requires undeclared packages: ${missingPackages.join(', ')}. ` +\n 'Run `basic-eslint install` to add the modular v3 dependency set.'\n )\n }\n\n return warnings\n}\n\nconst validateProjectSetup = (\n cwd: string,\n configPath: null | string,\n activeConfig: Awaited<ReturnType<typeof analyzeEslintConfig>>,\n hasV1FrameworkImports: boolean\n) => {\n const issues: string[] = []\n const warnings: string[] = []\n\n if (!readPackageJson(cwd)) {\n issues.push('package.json is missing or invalid.')\n }\n\n if (!configPath) {\n warnings.push('No eslint.config.js/mjs/cjs file found. Run `basic-eslint init` to create one.')\n } else if (!activeConfig && !hasV1FrameworkImports) {\n issues.push(`${basename(configPath)} could not be loaded. Run ESLint directly to see the import error.`)\n }\n\n if (!hasLintScript(cwd)) {\n warnings.push('No `lint` script found in package.json.')\n }\n\n return { issues, warnings }\n}\n\nconst isAstroDoctorConfigured = (\n activeConfig: Awaited<ReturnType<typeof analyzeEslintConfig>>,\n configContent: null | string\n): boolean => [\n activeConfig?.extensions.includes('Astro Doctor') ?? false,\n configContent?.includes('astro-doctor') ?? false,\n configContent?.includes('AstroDoctor') ?? false\n].includes(true)\n\nconst isAstroConfigured = (\n activeConfig: Awaited<ReturnType<typeof analyzeEslintConfig>>,\n summary: ReturnType<typeof getProjectSummary>\n): boolean => [\n activeConfig?.frameworks.includes('Astro') ?? false,\n summary.frameworks.includes('astro')\n].some(Boolean)\n\nconst checkAstroDoctorStatus = (\n activeConfig: Awaited<ReturnType<typeof analyzeEslintConfig>>,\n configContent: null | string,\n summary: ReturnType<typeof getProjectSummary>,\n warnings: string[]\n): boolean => {\n const astroDoctorEnabled = isAstroDoctorConfigured(activeConfig, configContent)\n const astroEnabled = isAstroConfigured(activeConfig, summary)\n\n if (astroDoctorEnabled && !astroEnabled) {\n warnings.push(\n 'Astro Doctor is enabled without Astro. Enable `frameworks: { astro: true }` or remove the `astro-doctor` feature.'\n )\n } else if (astroEnabled && !astroDoctorEnabled) {\n warnings.push(\n 'Astro was detected without Astro Doctor. Enable `features: { \"astro-doctor\": true }` for additional Astro diagnostics.'\n )\n }\n\n return astroDoctorEnabled\n}\n\nconst checkDuplicateEslint = (cwd: string, warnings: string[]) => {\n const duplicateEslint = findDuplicateEslint(cwd)\n\n if (duplicateEslint) {\n warnings.push(\n `Two ESLint copies are installed: the project resolves ${duplicateEslint.projectVersion} while the config packages resolve ${duplicateEslint.configVersion}. ` +\n 'Only ESLint 10 is supported, and parallel copies can apply different rule behavior between your editor and CLI. ' +\n 'Align the project\\'s eslint version with the config\\'s (or dedupe via your package manager).'\n )\n }\n}\n\nconst getTailwindEntryPointWarnings = (cwd: string): string[] => (\n getTailwindEntryPoints(cwd).flatMap(({ entryPoint, path: projectPath }) => {\n if (entryPoint) return []\n\n return [\n `Tailwind CSS was detected in ${projectPath}, but no conventional CSS entry point was found. ` +\n '`better-tailwindcss/no-unknown-classes` falls back to off; set `tailwind.entryPoint` ' +\n 'to enable strict validation or `tailwind.noUnknownClasses: false` to document a mixed CSS system.'\n ]\n })\n)\n\nconst buildDoctorDiagnosis = (\n cwd: string,\n packageJson: null | Record<string, unknown>,\n configPath: null | string,\n configContent: null | string,\n hasV1FrameworkImports: boolean,\n activeConfig: Awaited<ReturnType<typeof analyzeEslintConfig>>,\n declaredDependencies: Set<string>,\n summary: ReturnType<typeof getProjectSummary>\n): { issues: string[], warnings: string[] } => {\n const { issues, warnings } = validateProjectSetup(cwd, configPath, activeConfig, hasV1FrameworkImports)\n\n if (configContent) {\n warnings.push(...validateConfigContent(configContent, hasV1FrameworkImports, declaredDependencies, summary))\n }\n\n const astroDoctorEnabled = checkAstroDoctorStatus(activeConfig, configContent, summary, warnings)\n\n warnings.push(...getAstroDoctorCompatibilityWarnings(cwd, astroDoctorEnabled))\n\n checkDuplicateEslint(cwd, warnings)\n\n warnings.push(...getDeclarationProjectWarnings(cwd))\n\n warnings.push(...getTailwindEntryPointWarnings(cwd))\n\n const nodeEngineWarning = getConsumerNodeEngineWarning(cwd, packageJson)\n\n if (nodeEngineWarning) warnings.push(nodeEngineWarning)\n\n return { issues, warnings }\n}\n\nconst DOCTOR_FEATURE_ALIASES: Record<string, string> = {\n 'astro-doctor': 'Astro Doctor',\n 'best-practices': 'Best Practices',\n compat: 'Browser Compat',\n nest: 'NestJS',\n next: 'Next.js',\n node: 'Node.js',\n solid: 'SolidJS',\n 'tanstack-start': 'TanStack Start',\n tailwind: 'Tailwind CSS'\n}\n\nconst normalizeDoctorFeature = (value: string): string => {\n const comparableValue = DOCTOR_FEATURE_ALIASES[value] ?? value\n\n return comparableValue.toLowerCase().replaceAll(/[^a-z0-9]/g, '')\n}\n\nconst isDoctorFeatureEnabled = (name: string, enabled: string[]): boolean => {\n const normalizedName = normalizeDoctorFeature(name)\n\n return enabled.some(value => normalizeDoctorFeature(value) === normalizedName)\n}\n\nconst getTypeScriptConfig = (cwd: string): null | string => [\n 'tsconfig.json',\n 'tsconfig.base.json',\n 'tsconfig.app.json',\n 'tsconfig.node.json',\n 'tsconfig.eslint.json'\n].find(fileName => existsSync(join(cwd, fileName))) ?? null\n\nconst getCategoryPackageInstalled = (\n cwd: string,\n packageName: string\n): boolean => [\n packageName,\n INTEGRATIONS_PACKAGE_NAME,\n FULL_PACKAGE_NAME\n].some(candidate => resolvePackageMetadata(cwd, candidate) !== null)\n\nconst createDoctorFeatureActivations = (\n cwd: string,\n category: DoctorFeatureCategory,\n detected: string[],\n enabled: string[],\n includeEnabled = false\n): DoctorFeatureActivation[] => {\n const names = [...detected]\n\n if (includeEnabled) {\n for (const enabledName of enabled) {\n if (!isDoctorFeatureEnabled(enabledName, names)) names.push(enabledName)\n }\n }\n\n return names.map(name => {\n const packageName = category === 'frameworks' ?\n Object.entries(FRAMEWORK_KEY_TO_PACKAGE)\n .find(([framework]) => isDoctorFeatureEnabled(name, [framework]))?.[1] :\n CATEGORY_PACKAGES[category]\n\n if (!packageName) throw new Error(`Unknown doctor ${category} feature: ${name}`)\n\n const installed = getCategoryPackageInstalled(cwd, packageName)\n const isDetected = isDoctorFeatureEnabled(name, detected)\n const isEnabled = installed && isDoctorFeatureEnabled(name, enabled)\n let reason: string | undefined\n\n if (!installed) {\n reason = isDetected ?\n `Detected, but ${packageName} is not installed.` :\n `Enabled in the active config, but ${packageName} is not installed.`\n } else if (!isEnabled) {\n reason = 'Detected and installed, but the active config did not load this pack.'\n }\n\n return {\n detected: isDetected,\n enabled: isEnabled,\n installed,\n name,\n package: packageName,\n ...(reason ? { reason } : {})\n }\n })\n}\n\nconst getInactiveDoctorPackages = (\n cwd: string,\n detectedFrameworks: string[],\n summary: ReturnType<typeof getProjectSummary>,\n activeConfig?: NonNullable<Awaited<ReturnType<typeof analyzeEslintConfig>>>\n): DoctorProjectActivation['inactivePackages'] => {\n const inactivePackages = Object.entries(FRAMEWORK_KEY_TO_PACKAGE)\n .filter(([framework, packageName]) => (\n !detectedFrameworks.includes(framework) &&\n !isDoctorFeatureEnabled(framework, activeConfig?.frameworks ?? []) &&\n resolvePackageMetadata(cwd, packageName) !== null\n ))\n .map(([, packageName]) => ({\n package: packageName,\n reason: 'Installed, but no matching framework signal was detected in this project.'\n }))\n\n for (const [category, packageName] of Object.entries(CATEGORY_PACKAGES)) {\n if (\n summary[category as keyof typeof CATEGORY_PACKAGES].length === 0 &&\n (activeConfig?.[category as keyof typeof CATEGORY_PACKAGES]?.length ?? 0) === 0 &&\n resolvePackageMetadata(cwd, packageName) !== null\n ) {\n inactivePackages.push({\n package: packageName,\n reason: `Installed, but no ${category} signals were detected in this project.`\n })\n }\n }\n\n return inactivePackages\n}\n\nconst getDoctorProjectActivations = async (cwd: string): Promise<DoctorProjectActivation[]> => {\n const rootSummary = getProjectSummary(cwd)\n\n const projectPaths = [...new Set([\n '.',\n ...rootSummary.detectedProjects,\n ...rootSummary.workspaceProjects\n ])].sort((left, right) => {\n if (left === '.') return -1\n\n if (right === '.') return 1\n\n return left.localeCompare(right)\n })\n\n return Promise.all(projectPaths.map(async projectPath => {\n const projectRoot = projectPath === '.' ? cwd : join(cwd, projectPath)\n const summary = getProjectSummary(projectRoot)\n const projectActiveConfig = await analyzeEslintConfig(cwd, { projectPath, projectPaths }) ?? undefined\n const tsconfig = getTypeScriptConfig(projectRoot)\n const typescriptInstalled = resolvePackageMetadata(projectRoot, TYPESCRIPT_PACKAGE_NAME) !== null\n const typescriptEnabled = summary.typescript && Boolean(projectActiveConfig?.typescript)\n const tailwindDetected = summary.libraries.includes('tailwind')\n const tailwindEntryPoint = tailwindDetected ? findTailwindEntryPoint(projectRoot) ?? null : null\n\n const tailwindComponentClasses = tailwindEntryPoint ?\n findCssComponentClasses(projectRoot, tailwindEntryPoint).length :\n 0\n\n let typescriptMode: DoctorProjectActivation['typescript']['mode'] = 'off'\n let typescriptReason: string | undefined\n\n if (typescriptEnabled) {\n typescriptMode = summary.typescriptMode\n }\n\n if (!typescriptInstalled && summary.typescript) {\n typescriptReason = summary.typescriptMode === 'syntax' ?\n 'TypeScript declarations were detected, but TypeScript is not installed.' :\n 'A tsconfig was detected, but TypeScript is not installed.'\n } else if (typescriptInstalled && !summary.typescript) {\n typescriptReason = 'Installed, but no supported tsconfig was detected in this project.'\n } else if (typescriptInstalled && summary.typescript && !typescriptEnabled) {\n typescriptReason = 'Detected and installed, but the active config did not enable TypeScript.'\n }\n\n return {\n extensions: createDoctorFeatureActivations(\n projectRoot,\n 'extensions',\n summary.extensions,\n projectActiveConfig?.extensions ?? [],\n true\n ),\n formats: createDoctorFeatureActivations(\n projectRoot,\n 'formats',\n summary.formats,\n projectActiveConfig?.formats ?? [],\n true\n ),\n frameworks: createDoctorFeatureActivations(\n projectRoot,\n 'frameworks',\n summary.frameworks,\n projectActiveConfig?.frameworks ?? [],\n true\n ),\n ignores: projectActiveConfig?.ignores ?? [],\n inactivePackages: getInactiveDoctorPackages(projectRoot, summary.frameworks, summary, projectActiveConfig),\n libraries: createDoctorFeatureActivations(\n projectRoot,\n 'libraries',\n summary.libraries,\n projectActiveConfig?.libraries ?? [],\n true\n ),\n path: projectPath,\n runtime: summary.runtime,\n tailwind: {\n componentClasses: tailwindComponentClasses,\n detected: tailwindDetected,\n entryPoint: tailwindEntryPoint,\n unknownClassPolicy: getTailwindUnknownClassPolicy(\n tailwindDetected,\n tailwindEntryPoint,\n tailwindComponentClasses\n )\n },\n testing: createDoctorFeatureActivations(\n projectRoot,\n 'testing',\n summary.testing,\n projectActiveConfig?.testing ?? [],\n true\n ),\n tools: createDoctorFeatureActivations(\n projectRoot,\n 'tools',\n summary.tools,\n projectActiveConfig?.tools ?? [],\n true\n ),\n typescript: {\n detected: summary.typescript,\n enabled: typescriptEnabled,\n installed: typescriptInstalled,\n mode: typescriptMode,\n package: TYPESCRIPT_PACKAGE_NAME,\n ...(typescriptReason ? { reason: typescriptReason } : {}),\n tsconfig\n }\n }\n }))\n}\n\nconst formatDoctorActivation = (features: DoctorFeatureActivation[]): string => (\n features.length === 0 ?\n 'none' :\n features.map(feature => {\n const states = [\n feature.installed ? 'I' : '-',\n feature.detected ? 'D' : '-',\n feature.enabled ? 'E' : '-'\n ].join('')\n\n return `${feature.name}[${states}]`\n }).join(',')\n)\n\nconst formatDoctorProjectTable = (projects: DoctorProjectActivation[]): string[] => [\n '',\n 'Per-project activation (I=installed, D=detected, E=enabled):',\n 'Project | Runtime | TypeScript | Tailwind entry | Frameworks | Formats | Libraries | Extensions | Testing | Tools | Ignores',\n '--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---',\n ...projects.flatMap(project => {\n const typescriptStates = [\n project.typescript.installed ? 'I' : '-',\n project.typescript.detected ? 'D' : '-',\n project.typescript.enabled ? 'E' : '-'\n ].join('')\n\n const row = [\n project.path,\n project.runtime,\n `${project.typescript.mode}:${project.typescript.tsconfig ?? 'none'}[${typescriptStates}]`,\n project.tailwind.componentClasses > 0 ?\n `${project.tailwind.entryPoint ?? 'none'} (${project.tailwind.componentClasses} CSS classes)` :\n project.tailwind.entryPoint ?? 'none',\n formatDoctorActivation(project.frameworks),\n formatDoctorActivation(project.formats),\n formatDoctorActivation(project.libraries),\n formatDoctorActivation(project.extensions),\n formatDoctorActivation(project.testing),\n formatDoctorActivation(project.tools),\n formatList(project.ignores)\n ].join(' | ')\n\n const explanations = [\n project.typescript.reason,\n ...project.frameworks.map(feature => feature.reason),\n ...project.formats.map(feature => feature.reason),\n ...project.libraries.map(feature => feature.reason),\n ...project.extensions.map(feature => feature.reason),\n ...project.testing.map(feature => feature.reason),\n ...project.tools.map(feature => feature.reason),\n ...project.inactivePackages.map(item => `${item.package}: ${item.reason}`)\n ].filter((reason): reason is string => Boolean(reason))\n\n return [\n row,\n ...explanations.map(reason => ` ${project.path}: ${reason}`)\n ]\n })\n]\n\nconst outputDoctorResult = (\n json: boolean,\n verbose: boolean,\n configPath: null | string,\n packageManager: string,\n summary: ReturnType<typeof getProjectSummary>,\n installCommand: string | undefined,\n requiredPackages: string[],\n issues: string[],\n warnings: string[],\n projects: DoctorProjectActivation[],\n fixes: string[] = []\n): void => {\n let status = 'passed'\n\n if (issues.length > 0) {\n status = 'failed'\n } else if (warnings.length > 0) {\n status = 'passed with warnings'\n }\n\n const payload = {\n configFile: configPath ? basename(configPath) : null,\n fixes,\n ...(installCommand ? { installCommand } : {}),\n issues,\n packageManager,\n projects,\n requiredPackages,\n status,\n warnings,\n workspaceProjects: summary.workspaceProjects\n }\n\n if (json) {\n console.log(JSON.stringify(payload, null, 2))\n\n if (issues.length > 0) process.exitCode = 1\n\n return\n }\n\n console.log([\n `ESLint Basic doctor: ${status}`,\n `- Package manager: ${payload.packageManager}`,\n `- Config file: ${payload.configFile ?? 'none'}`,\n `- Workspace projects: ${formatList(summary.workspaceProjects)}`,\n `- Required packages: ${formatList(requiredPackages)}`,\n ...(installCommand ? [`- Install command: ${installCommand}`] : []),\n ...(verbose ? formatDoctorProjectTable(projects) : []),\n ...(fixes.length > 0 ? ['', 'Fixes applied:', ...fixes.map(fix => `- ${fix}`)] : []),\n ...(issues.length > 0 ? ['', 'Issues:', ...issues.map(issue => `- ${issue}`)] : []),\n ...(warnings.length > 0 ? ['', 'Warnings:', ...warnings.map(warning => `- ${warning}`)] : [])\n ].join('\\n'))\n\n if (issues.length > 0) process.exitCode = 1\n}\n\nconst createDoctorBackupPath = (filePath: string): string => {\n const preferred = `${filePath}.doctor.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 getDoctorDependencyVersion = (packageName: string): string => {\n if (packageName === 'eslint') return '^10.0.0'\n\n if (packageName === TYPESCRIPT_PACKAGE_NAME) return '^5.0.0'\n\n return '^3.0.0'\n}\n\nconst applyDoctorFixes = (\n cwd: string,\n packageJson: null | Record<string, unknown>,\n configPath: null | string,\n configContent: null | string,\n summary: ReturnType<typeof getProjectSummary>\n): string[] => {\n const fixes: string[] = []\n\n if (packageJson) {\n const updated = structuredClone(packageJson) as {\n devDependencies?: Record<string, string>\n engines?: Record<string, string>\n scripts?: Record<string, string>\n }\n\n let packageChanged = false\n\n updated.scripts ??= {}\n\n if (!updated.scripts.lint) {\n updated.scripts.lint = 'eslint .'\n\n packageChanged = true\n\n fixes.push('Added the `lint` script.')\n }\n\n updated.devDependencies ??= {}\n\n const declared = getDeclaredDependencyNames(packageJson)\n\n const explicitFeaturePackages = configContent ?\n getExplicitConfigFeaturePackages(configContent) :\n []\n\n const missingPackages = getInstallPackages(summary, declared, explicitFeaturePackages)\n\n const missingDependencies = Object.fromEntries(\n missingPackages.map(packageName => [packageName, getDoctorDependencyVersion(packageName)])\n )\n\n updated.devDependencies = {\n ...updated.devDependencies,\n ...missingDependencies\n }\n\n for (const packageName of missingPackages) {\n fixes.push(`Declared ${packageName}.`)\n\n packageChanged = true\n }\n\n const nodeEngine = assessConsumerNodeEngine(cwd, packageJson)\n\n if (!nodeEngine.compatible && nodeEngine.targetRange) {\n updated.engines ??= {}\n\n updated.engines.node = nodeEngine.targetRange\n\n packageChanged = true\n\n fixes.push(\n nodeEngine.consumerRange ?\n `Changed engines.node from ${nodeEngine.consumerRange} to ${nodeEngine.targetRange}.` :\n `Declared engines.node as ${nodeEngine.targetRange}.`\n )\n }\n\n if (packageChanged) {\n const packagePath = join(cwd, 'package.json')\n const backupPath = createDoctorBackupPath(packagePath)\n\n writeFileSync(backupPath, `${JSON.stringify(packageJson, null, 2)}\\n`)\n\n writeFileSync(packagePath, `${JSON.stringify(updated, null, 2)}\\n`)\n\n fixes.push(`Backed up package.json to ${basename(backupPath)}.`)\n }\n }\n\n if (!configPath) {\n const generated = createConfigContent(cwd)\n\n writeFileSync(generated.configPath, generated.configContent)\n\n fixes.push(`Created ${basename(generated.configPath)}.`)\n } else if (\n configContent &&\n Object.keys(FRAMEWORK_PACKAGE_TO_KEY).some(packageName => configContent.includes(packageName))\n ) {\n // The migration parser is declared later as a public helper and is safe to call after module initialization.\n // eslint-disable-next-line no-use-before-define\n const result = migrateConfigContent(configContent)\n\n if (result.changed) {\n const backupPath = createDoctorBackupPath(configPath)\n\n writeFileSync(backupPath, configContent)\n\n writeFileSync(configPath, result.content)\n\n fixes.push(`Migrated v1 framework imports and backed up the config to ${basename(backupPath)}.`)\n }\n }\n\n return fixes\n}\n\nconst hasV1FrameworkPackageImports = (configContent: null | string): boolean => (\n configContent !== null &&\n Object.keys(FRAMEWORK_PACKAGE_TO_KEY).some(packageName => configContent.includes(packageName))\n)\n\nexport const handleDoctor = async (\n cwd: string = process.cwd(),\n json = false,\n liteInstall = false,\n fix = false,\n verbose = false\n) => {\n const pnpmWorkspaceRoot = findPnpmWorkspaceRoot(cwd)\n const projectRoot = pnpmWorkspaceRoot ?? cwd\n const packageManager = detectPackageManager(projectRoot)\n const workspaceRoot = packageManager === 'pnpm' && pnpmWorkspaceRoot !== undefined\n const catalog = workspaceRoot ? getCatalogPreference(readPackageJson(projectRoot)) : false\n let configPath = getConfigPathIfPresent(projectRoot)\n let packageJson = readPackageJson(projectRoot)\n let declaredDependencies = getDeclaredDependencyNames(packageJson)\n let summary = getInstallProjectSummary(projectRoot)\n let activeConfig = await analyzeEslintConfig(projectRoot)\n let configContent = configPath ? readFileSync(configPath, 'utf8') : null\n let hasV1FrameworkImports = hasV1FrameworkPackageImports(configContent)\n\n if (liteInstall) {\n const liteInstallPackages = getLiteInstallPackages(summary, declaredDependencies)\n\n const liteInstallCommand = createInstallCommand(\n packageManager,\n addCompatibleConfigVersions(\n liteInstallPackages,\n getCompatibleConfigVersion(packageJson, getCliVersion(), pnpmWorkspaceRoot)\n ),\n workspaceRoot,\n catalog\n )\n\n if (json) {\n console.log(JSON.stringify({\n command: liteInstallCommand,\n packageManager,\n packages: liteInstallPackages\n }, null, 2))\n } else {\n console.log(liteInstallCommand)\n }\n\n return\n }\n\n const fixes = fix ? applyDoctorFixes(projectRoot, packageJson, configPath, configContent, summary) : []\n\n if (fixes.length > 0) {\n configPath = getConfigPathIfPresent(projectRoot)\n\n packageJson = readPackageJson(projectRoot)\n\n declaredDependencies = getDeclaredDependencyNames(packageJson)\n\n summary = getInstallProjectSummary(projectRoot)\n\n activeConfig = await analyzeEslintConfig(projectRoot)\n\n configContent = configPath ? readFileSync(configPath, 'utf8') : null\n\n hasV1FrameworkImports = hasV1FrameworkPackageImports(configContent)\n }\n\n const explicitFeaturePackages = configContent ?\n getExplicitConfigFeaturePackages(configContent) :\n []\n\n const requiredPackages = getInstallPackages(summary, declaredDependencies, explicitFeaturePackages)\n\n const installCommand = requiredPackages.length > 0 ?\n createInstallCommand(\n packageManager,\n addCompatibleConfigVersions(\n requiredPackages,\n getCompatibleConfigVersion(packageJson, getCliVersion(), pnpmWorkspaceRoot)\n ),\n workspaceRoot,\n catalog\n ) :\n undefined\n\n const { issues, warnings } = buildDoctorDiagnosis(\n projectRoot,\n packageJson,\n configPath,\n configContent,\n hasV1FrameworkImports,\n activeConfig,\n declaredDependencies,\n summary\n )\n\n const projects = await getDoctorProjectActivations(projectRoot)\n\n outputDoctorResult(\n json,\n verbose,\n configPath,\n packageManager,\n summary,\n installCommand,\n requiredPackages,\n issues,\n warnings,\n projects,\n fixes\n )\n}\n\nconst isMinimumReleaseAgeFailure = (output: string): boolean => (\n /minimum[\\s_-]*release[\\s_-]*age/i.test(output) ||\n /release (?:is )?(?:too young|not old enough)/i.test(output) ||\n /blocked by (?:the )?minimum age/i.test(output)\n)\n\nexport const handleInstall = (\n cwd: string = process.cwd(),\n dryRun = false,\n runner: InstallRunner = spawnSync\n) => {\n const pnpmWorkspaceRoot = findPnpmWorkspaceRoot(cwd)\n const projectRoot = pnpmWorkspaceRoot ?? cwd\n const packageJson = readPackageJson(projectRoot)\n\n if (!packageJson) {\n console.error('❌ package.json is missing or invalid.')\n\n process.exitCode = 1\n\n return\n }\n\n const packageManager = detectPackageManager(projectRoot)\n const configPath = getConfigPathIfPresent(projectRoot)\n\n const explicitFeaturePackages = configPath ?\n getExplicitConfigFeaturePackages(readFileSync(configPath, 'utf8')) :\n []\n\n const packages = getInstallPackages(\n getInstallProjectSummary(projectRoot),\n getDeclaredDependencyNames(packageJson),\n explicitFeaturePackages\n )\n\n const workspaceRoot = packageManager === 'pnpm' && pnpmWorkspaceRoot !== undefined\n const catalog = workspaceRoot ? getCatalogPreference(packageJson) : false\n\n const installPackages = addCompatibleConfigVersions(\n packages,\n getCompatibleConfigVersion(packageJson, getCliVersion(), pnpmWorkspaceRoot)\n )\n\n if (packages.length === 0) {\n console.log('✅ All packages required by the detected ESLint configuration are already declared.')\n\n return\n }\n\n const installCommand = createInstallCommand(packageManager, installPackages, workspaceRoot, catalog)\n\n if (dryRun) {\n console.log(installCommand)\n\n return\n }\n\n console.log(`Installing detected ESLint dependencies:\\n${installCommand}`)\n\n const [command, args] = createInstallInvocation(packageManager, installPackages, workspaceRoot, catalog)\n\n const result = runner(command, args, {\n cwd: projectRoot,\n encoding: 'utf8',\n maxBuffer: 16 * 1024 * 1024,\n stdio: 'pipe'\n })\n\n const stdout = String(result.stdout ?? '')\n const stderr = String(result.stderr ?? '')\n\n if (stdout) process.stdout.write(stdout)\n\n if (stderr) process.stderr.write(stderr)\n\n if (result.error) {\n console.error(`❌ Failed to run ${packageManager}: ${result.error.message}`)\n\n process.exitCode = 1\n } else if (result.status !== 0) {\n if (packageManager === 'pnpm' && isMinimumReleaseAgeFailure(`${stdout}\\n${stderr}`)) {\n console.error(\n '❌ pnpm minimumReleaseAge temporarily blocks the compatible ESLint config release ' +\n `(${installPackages.join(', ')}). Keep the generated compatible range and either wait for the policy window ` +\n 'or add the exact release to minimumReleaseAgeExclude in pnpm-workspace.yaml.'\n )\n }\n\n process.exitCode = result.status ?? 1\n }\n}\n\nexport const handleDocs = (cwd: string = process.cwd()) => {\n const outputPath = join(cwd, 'ESLINT_STANDARDS.md')\n\n writeFileSync(outputPath, createStandardsContent(cwd))\n\n console.log('✅ Generated ESLINT_STANDARDS.md')\n}\n\nconst migrateConfigContent = (content: string): { changed: boolean, content: string, frameworks: string[] } => {\n const importedFrameworks = Object.entries(FRAMEWORK_PACKAGE_TO_KEY)\n .filter(([packageName]) => content.includes(packageName))\n .map(([, framework]) => framework)\n\n if (importedFrameworks.length === 0) {\n return { changed: false, content, frameworks: [] }\n }\n\n const frameworks = getFrameworkKeys(importedFrameworks)\n\n const migrated = [\n 'import { defineConfig } from \\'@santi020k/eslint-config-basic\\'',\n '',\n 'export default await defineConfig({',\n ' frameworks: {',\n ` ${frameworks.map(key => `${toPropertyKey(key)}: true`).join(',\\n ')}`,\n ' }',\n '})',\n ''\n ].join('\\n')\n\n return { changed: true, content: migrated, frameworks }\n}\n\nconst processConfigMigration = (configPath: string, write: boolean, suggestions: string[]): string[] => {\n const applied: string[] = []\n\n if (!existsSync(configPath)) {\n if (write) suggestions.push('- No ESLint config file was found to rewrite.')\n\n return applied\n }\n\n const configContent = readFileSync(configPath, 'utf8')\n\n if (configContent.includes('@santi020k/eslint-config-') && !configContent.includes('frameworks:')) {\n suggestions.push('- This config appears to import v1 framework packages; replace those imports with framework booleans.')\n }\n\n if (!write) return applied\n\n const result = migrateConfigContent(configContent)\n\n if (result.changed) {\n const backupPath = `${configPath}.bak`\n\n writeFileSync(backupPath, configContent)\n\n writeFileSync(configPath, result.content)\n\n const message = `Rewrote ${basename(configPath)} with framework booleans: ${result.frameworks.join(', ')}. Original backed up to ${basename(backupPath)}.`\n\n applied.push(message)\n\n suggestions.push(`- ${message}`)\n } else {\n suggestions.push('- No v1 framework imports were found to rewrite.')\n }\n\n return applied\n}\n\nexport const handleMigrate = (\n cwd: string = process.cwd(),\n write = false,\n json = false,\n target = 'v2',\n check = false,\n full = false\n) => {\n if (target === 'v3' || target === '3') {\n const summary = getInstallProjectSummary(cwd)\n\n handleMigrateV3(cwd, {\n declaredConfigPackages: getWorkspaceDeclaredConfigPackages(cwd, summary),\n extensions: summary.extensions,\n formats: summary.formats,\n frameworks: summary.frameworks,\n libraries: summary.libraries,\n packageManager: detectPackageManager(cwd),\n testing: summary.testing,\n tools: summary.tools,\n typescript: summary.typescript\n }, { check, full, json, write })\n\n return\n }\n\n if (target !== 'v2' && target !== '2') {\n throw new Error(`Unsupported migration target \"${target}\". Use --to v2 or --to v3.`)\n }\n\n const configPath = getConfigPathIfPresent(cwd) ?? join(cwd, getDefaultConfigFilename(cwd))\n\n const suggestions = [\n 'v1 to v2 migration suggestions:',\n '- Install only @santi020k/eslint-config-basic for the public config API.',\n '- Replace framework imports with bundled booleans such as frameworks: { react: true, next: true }.',\n '- Remove app-level @santi020k/eslint-config-react/next/vue/etc. config package imports.',\n '- Try defineConfig() first; v3 auto-detects supported frameworks and integrations.',\n '- Use basic-eslint explain to review what v3 detects before committing the migration.'\n ]\n\n const applied = processConfigMigration(configPath, write, suggestions)\n\n if (json) {\n console.log(JSON.stringify({\n applied,\n configFile: existsSync(configPath) ? basename(configPath) : null,\n suggestions: suggestions.slice(1),\n title: suggestions[0],\n write\n }, null, 2))\n\n return\n }\n\n console.log(suggestions.join('\\n'))\n}\n\nconst dispatchCommand = (\n command: string,\n cwd: string,\n flags: {\n concurrency?: string\n files: string[]\n hasAnalyzeSource: boolean\n hasCheck: boolean\n hasCompatibility: boolean\n hasCreate: boolean\n hasDryRun: boolean\n hasExplicit: boolean\n hasFix: boolean\n hasForce: boolean\n hasFull: boolean\n hasJson: boolean\n hasLiteInstall: boolean\n hasPrune: boolean\n hasVerbose: boolean\n hasWrite: boolean\n hasWithEslintMcp: boolean\n maxDurationMs?: number\n maxRuleTimeMs?: number\n maxWarnings?: number\n output?: string\n preset?: string\n positional?: string\n rule?: string\n snapshotPath?: string\n target?: string\n }\n) => {\n switch (command) {\n case 'baseline': {\n try {\n handleBaseline(cwd, {\n json: flags.hasJson,\n preset: flags.preset,\n prune: flags.hasPrune\n })\n } catch (error) {\n console.error(`❌ Failed to create ESLint baseline: ${String(error)}`)\n\n process.exitCode = 1\n }\n\n break\n }\n\n case 'compatibility': {\n handleCompatibility(cwd, flags.hasJson)\n\n break\n }\n\n case 'diff': {\n handleSnapshotDiff(cwd, {\n files: flags.files,\n json: flags.hasJson,\n snapshotPath: flags.snapshotPath\n }).catch((error: unknown) => {\n console.error(`❌ Failed to diff ESLint configuration: ${String(error)}`)\n\n process.exitCode = 1\n })\n\n break\n }\n\n case 'docs': {\n handleDocs(cwd)\n\n break\n }\n\n case 'doctor': {\n handleDoctor(cwd, flags.hasJson, flags.hasLiteInstall, flags.hasFix, flags.hasVerbose)\n .catch((error: unknown) => {\n console.error(`❌ Failed to run doctor: ${String(error)}`)\n\n process.exitCode = 1\n })\n\n break\n }\n\n case 'explain': {\n if (flags.rule) {\n handleExplainRule(cwd, {\n file: flags.files[0],\n json: flags.hasJson,\n rule: flags.rule\n }).catch((error: unknown) => {\n console.error(`❌ Failed to explain ESLint rule: ${String(error)}`)\n\n process.exitCode = 1\n })\n } else {\n handleExplain(cwd, flags.hasJson)\n }\n\n break\n }\n\n case 'explain-preset': {\n if (!flags.positional) {\n console.error('Missing preset. Usage: basic-eslint explain-preset <preset> [options]')\n\n process.exitCode = 1\n\n break\n }\n\n handleExplainPreset(cwd, flags.positional, {\n analyzeSource: flags.hasAnalyzeSource,\n compatibility: flags.hasCompatibility,\n file: flags.files[0],\n files: flags.files,\n json: flags.hasJson,\n output: flags.output\n }).catch((error: unknown) => {\n console.error(`❌ Failed to explain preset: ${String(error)}`)\n\n process.exitCode = 1\n })\n\n break\n }\n\n case 'generate-skill': {\n handleGenerateSkill(cwd, flags.hasForce, {\n check: flags.hasCheck,\n createAgentsMd: flags.hasCreate,\n withEslintMcp: flags.hasWithEslintMcp\n }).catch((error: unknown) => {\n console.error(`❌ Failed to generate skill files: ${String(error)}`)\n\n process.exitCode = 1\n })\n\n break\n }\n\n case 'init': {\n handleInit(cwd, flags.hasCheck, flags.hasExplicit)\n\n break\n }\n\n case 'inspect': {\n handleInspect(cwd, flags.hasJson).catch((error: unknown) => {\n console.error(`❌ Failed to inspect project: ${String(error)}`)\n\n process.exitCode = 1\n })\n\n break\n }\n\n case 'install': {\n handleInstall(cwd, flags.hasDryRun)\n\n break\n }\n\n case 'migrate': {\n try {\n handleMigrate(\n cwd,\n flags.hasWrite,\n flags.hasJson,\n flags.target ?? 'v2',\n flags.hasCheck,\n flags.hasFull\n )\n } catch (error) {\n console.error(`❌ Failed to migrate ESLint configuration: ${String(error)}`)\n\n process.exitCode = 1\n }\n\n break\n }\n\n case 'profile': {\n try {\n handleProfile(cwd, {\n concurrency: flags.concurrency,\n files: flags.files,\n json: flags.hasJson,\n maxDurationMs: flags.maxDurationMs,\n maxRuleTimeMs: flags.maxRuleTimeMs,\n maxWarnings: flags.maxWarnings\n })\n } catch (error) {\n console.error(`❌ Failed to profile ESLint: ${String(error)}`)\n\n process.exitCode = 1\n }\n\n break\n }\n\n case 'snapshot': {\n handleSnapshot(cwd, {\n check: flags.hasCheck,\n files: flags.files,\n json: flags.hasJson,\n snapshotPath: flags.snapshotPath\n }).catch((error: unknown) => {\n console.error(`❌ Failed to snapshot ESLint configuration: ${String(error)}`)\n\n process.exitCode = 1\n })\n\n break\n }\n\n case 'update': {\n handleUpdate(cwd)\n\n break\n }\n\n default: {\n console.error(`Unknown command: ${command}`)\n\n printUsage()\n\n process.exitCode = 1\n }\n }\n}\n\nconst getFlagValue = (argv: string[], flag: string): string | undefined => {\n const inline = argv.find(argument => argument.startsWith(`${flag}=`))\n\n if (inline) return inline.slice(flag.length + 1)\n\n const index = argv.indexOf(flag)\n\n return index >= 0 ? argv[index + 1] : undefined\n}\n\nconst getFlagValues = (argv: string[], flag: string): string[] => argv.flatMap((argument, index) => {\n if (argument.startsWith(`${flag}=`)) return [argument.slice(flag.length + 1)]\n\n if (argument === flag && argv[index + 1]) return [argv[index + 1]]\n\n return []\n})\n\nconst getNumericFlagValue = (argv: string[], flag: string): number | undefined => {\n const value = getFlagValue(argv, flag)\n const present = argv.includes(flag) || argv.some(argument => argument.startsWith(`${flag}=`))\n\n if (!present) return undefined\n\n if (value === undefined || value.trim() === '' || value.startsWith('--')) return Number.NaN\n\n return Number(value)\n}\n\nexport const runCli = (argv: string[] = process.argv, cwd: string = process.cwd()) => {\n const command = argv[2]\n const isHelp = argv.slice(3).some(argument => argument === '--help' || argument === '-h')\n const isVersion = command === '--version' || command === '-v'\n\n if (!command || command === '--help' || command === '-h') {\n printUsage()\n\n return\n }\n\n if (isVersion) {\n console.log(getCliVersion())\n\n return\n }\n\n if (isHelp) {\n if (COMMAND_OPTIONS[command]) printCommandUsage(command)\n else printUsage()\n\n return\n }\n\n const validation = validateCommandArguments(command, argv.slice(3))\n\n if (!validation.ok) return\n\n dispatchCommand(command, cwd, {\n concurrency: getFlagValue(argv, '--concurrency'),\n files: getFlagValues(argv, '--file'),\n hasAnalyzeSource: argv.includes('--analyze-source'),\n hasCheck: argv.includes('--check'),\n hasCompatibility: argv.includes('--compatibility'),\n hasCreate: argv.includes('--create'),\n hasDryRun: argv.includes('--dry-run'),\n hasExplicit: argv.includes('--explicit'),\n hasFix: argv.includes('--fix'),\n hasForce: argv.includes('--force'),\n hasFull: argv.includes('--full'),\n hasJson: argv.includes('--json'),\n hasLiteInstall: argv.includes('--lite-install'),\n hasPrune: argv.includes('--prune'),\n hasVerbose: argv.includes('--verbose'),\n hasWithEslintMcp: argv.includes('--with-eslint-mcp'),\n hasWrite: argv.includes('--write'),\n maxDurationMs: getNumericFlagValue(argv, '--max-duration'),\n maxRuleTimeMs: getNumericFlagValue(argv, '--max-rule-time'),\n maxWarnings: getNumericFlagValue(argv, '--max-warnings'),\n output: getFlagValue(argv, '--output'),\n positional: validation.positional,\n preset: getFlagValue(argv, '--preset'),\n rule: command === 'explain' ? validation.positional : undefined,\n snapshotPath: getFlagValue(argv, '--snapshot-path'),\n target: getFlagValue(argv, '--to')\n })\n}\n\n// Only run if this is the entry point\nif (process.argv[1] && (\n process.argv[1] === fileURLToPath(import.meta.url) ||\n process.argv[1].endsWith('cli.js') ||\n process.argv[1].endsWith('cli.ts')\n)) {\n runCli()\n}\n"],"mappings":"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","names":[]}
|
|
@@ -8,11 +8,9 @@ const attachDefineConfigMetadata = (config, metadata) => {
|
|
|
8
8
|
});
|
|
9
9
|
return config;
|
|
10
10
|
};
|
|
11
|
-
const getDefineConfigMetadata = (config) => (
|
|
12
|
-
// eslint-disable-next-line security/detect-object-injection -- shared symbol is an internal fixed metadata key
|
|
13
|
-
Array.isArray(config) ? config[DEFINE_CONFIG_METADATA] : void 0
|
|
14
|
-
);
|
|
11
|
+
const getDefineConfigMetadata = (config) => Array.isArray(config) ? config[DEFINE_CONFIG_METADATA] : void 0;
|
|
15
12
|
export {
|
|
16
13
|
attachDefineConfigMetadata,
|
|
17
14
|
getDefineConfigMetadata
|
|
18
15
|
};
|
|
16
|
+
//# sourceMappingURL=define-config-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/define-config-metadata.ts"],"sourcesContent":["import type { ConfigInput, EslintConfigOptions, FlatConfigArray } from '@santi020k/eslint-config-core'\n\nconst DEFINE_CONFIG_METADATA = Symbol.for('@santi020k/eslint-config-basic/define-config-metadata')\n\nexport interface DefineConfigMetadata {\n extraConfigs: ConfigInput[]\n options?: EslintConfigOptions\n}\n\ntype ConfigWithMetadata = FlatConfigArray & {\n [DEFINE_CONFIG_METADATA]?: DefineConfigMetadata\n}\n\nexport const attachDefineConfigMetadata = (\n config: FlatConfigArray,\n metadata: DefineConfigMetadata\n): FlatConfigArray => {\n Object.defineProperty(config, DEFINE_CONFIG_METADATA, {\n configurable: false,\n enumerable: false,\n value: metadata,\n writable: false\n })\n\n return config\n}\n\nexport const getDefineConfigMetadata = (config: unknown): DefineConfigMetadata | undefined => (\n Array.isArray(config) ? (config as ConfigWithMetadata)[DEFINE_CONFIG_METADATA] : undefined\n)\n"],"mappings":"AAEA,MAAM,yBAAyB,uBAAO,IAAI,uDAAuD;AAW1F,MAAM,6BAA6B,CACxC,QACA,aACoB;AACpB,SAAO,eAAe,QAAQ,wBAAwB;AAAA,IACpD,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AAED,SAAO;AACT;AAEO,MAAM,0BAA0B,CAAC,WACtC,MAAM,QAAQ,MAAM,IAAK,OAA8B,sBAAsB,IAAI;","names":[]}
|
package/dist/frameworks.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ interface FrameworkOptions {
|
|
|
9
9
|
hasSvelte?: boolean;
|
|
10
10
|
hasVue?: boolean;
|
|
11
11
|
runtime?: Runtime;
|
|
12
|
+
typeChecked?: boolean;
|
|
12
13
|
}
|
|
13
14
|
declare const createDetectedFrameworkFlags: (detectedFrameworks?: DetectedFrameworkName[]) => FrameworkFlags;
|
|
14
15
|
declare const getBundledFrameworkConfig: (frameworkName: FrameworkName, options?: FrameworkOptions) => Promise<FlatConfigArray>;
|
package/dist/frameworks.js
CHANGED
|
@@ -48,7 +48,7 @@ const getBundledFrameworkConfig = async (frameworkName, options) => {
|
|
|
48
48
|
const input = await loadFrameworkConfigInput(frameworkName);
|
|
49
49
|
return typeof input === "function" ? input(options) : input;
|
|
50
50
|
};
|
|
51
|
-
const createBundledFramework = (frameworkName) => async (options) => getBundledFrameworkConfig(frameworkName, options);
|
|
51
|
+
const createBundledFramework = (frameworkName) => (async (options) => getBundledFrameworkConfig(frameworkName, options));
|
|
52
52
|
const angular = createBundledFramework("angular");
|
|
53
53
|
const astro = createBundledFramework("astro");
|
|
54
54
|
const expo = createBundledFramework("expo");
|
|
@@ -89,3 +89,4 @@ export {
|
|
|
89
89
|
vite,
|
|
90
90
|
vue
|
|
91
91
|
};
|
|
92
|
+
//# sourceMappingURL=frameworks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/frameworks.ts"],"sourcesContent":["import {\n createModuleLoader,\n type DetectedFrameworkName,\n type FlatConfigArray,\n type Runtime\n} from '@santi020k/eslint-config-core'\n\nimport { isMissingRequestedPackage } from './optional-package-errors.js'\n\nconst loadModule = createModuleLoader(specifier => import.meta.resolve(specifier, import.meta.url))\n\nexport type FrameworkFlags = Partial<Record<FrameworkName, true>>\n\nexport type FrameworkName = DetectedFrameworkName\n\nexport interface FrameworkOptions {\n [key: string]: unknown\n hasReact?: boolean\n hasSolid?: boolean\n hasSvelte?: boolean\n hasVue?: boolean\n runtime?: Runtime\n typeChecked?: boolean\n}\n\n/**\n * A loaded framework config: either a ready flat-config array or a factory\n * that produces one from framework options.\n */\ntype FrameworkConfigInput =\n ((options?: FrameworkOptions) => FlatConfigArray) |\n FlatConfigArray\n\ntype FrameworkLoader = () => Promise<FrameworkConfigInput>\n\nexport const createDetectedFrameworkFlags = (\n detectedFrameworks: DetectedFrameworkName[] = []\n): FrameworkFlags => Object.fromEntries(\n detectedFrameworks.map(framework => [framework, true])\n)\n\n/**\n * Lazy loaders for every bundled framework package. Framework plugin\n * packages (angular-eslint, vue-eslint-parser, eslint-plugin-svelte, …) are\n * only imported when their framework is actually enabled, keeping config\n * startup cheap for projects that use none or few of them.\n */\nconst frameworkLoaders = new Map<FrameworkName, FrameworkLoader>([\n ['angular', async () => (await loadModule<{ angularConfig: FlatConfigArray }>('@santi020k/eslint-config-angular')).angularConfig],\n ['astro', async () => (await loadModule<{ default: (options?: FrameworkOptions) => FlatConfigArray }>('@santi020k/eslint-config-astro')).default],\n ['expo', async () => (await loadModule<{ expoConfig: FlatConfigArray }>('@santi020k/eslint-config-expo')).expoConfig],\n ['hono', async () => (await loadModule<{ hono: (options?: FrameworkOptions) => FlatConfigArray }>('@santi020k/eslint-config-hono')).hono],\n ['lit', async () => (await loadModule<{ lit: FlatConfigArray }>('@santi020k/eslint-config-lit')).lit],\n ['nest', async () => (await loadModule<{ nestConfig: FlatConfigArray }>('@santi020k/eslint-config-nest')).nestConfig],\n ['next', async () => (await loadModule<{ nextConfig: FlatConfigArray }>('@santi020k/eslint-config-next')).nextConfig],\n ['nuxt', async () => (await loadModule<{ nuxt: FlatConfigArray }>('@santi020k/eslint-config-nuxt')).nuxt],\n ['preact', async () => (await loadModule<{ preactConfig: FlatConfigArray }>('@santi020k/eslint-config-preact')).preactConfig],\n ['qwik', async () => (await loadModule<{ qwik: FlatConfigArray }>('@santi020k/eslint-config-qwik')).qwik],\n ['react', async () => (await loadModule<{ reactConfig: FlatConfigArray }>('@santi020k/eslint-config-react')).reactConfig],\n ['react-router', async () => (await loadModule<{ reactRouter: FlatConfigArray }>('@santi020k/eslint-config-react-router')).reactRouter],\n ['slidev', async () => (await loadModule<{ slidev: (options?: FrameworkOptions) => FlatConfigArray }>('@santi020k/eslint-config-slidev')).slidev],\n ['solid', async () => (await loadModule<{ solidConfig: FlatConfigArray }>('@santi020k/eslint-config-solid')).solidConfig],\n ['svelte', async () => (await loadModule<{ svelteConfig: FlatConfigArray }>('@santi020k/eslint-config-svelte')).svelteConfig],\n ['tanstack-start', async () => (await loadModule<{ tanstackStart: FlatConfigArray }>('@santi020k/eslint-config-tanstack-start')).tanstackStart],\n ['vite', async () => (await loadModule<{ vite: (options?: FrameworkOptions) => FlatConfigArray }>('@santi020k/eslint-config-vite')).vite],\n ['vue', async () => (await loadModule<{ vueConfig: FlatConfigArray }>('@santi020k/eslint-config-vue')).vueConfig]\n])\n\nconst frameworkConfigCache = new Map<FrameworkName, Promise<FrameworkConfigInput>>()\n\nconst loadFrameworkConfigInput = (frameworkName: FrameworkName): Promise<FrameworkConfigInput> => {\n const cached = frameworkConfigCache.get(frameworkName)\n\n if (cached) return cached\n\n const loader = frameworkLoaders.get(frameworkName)\n\n if (!loader) return Promise.resolve([])\n\n const pending = loader().catch((error: unknown) => {\n frameworkConfigCache.delete(frameworkName)\n\n const specifier = `@santi020k/eslint-config-${frameworkName}`\n\n const remediation = isMissingRequestedPackage(error, specifier) ?\n `Install \"${specifier}\" or remove that framework from your defineConfig options.` :\n `The installed package \"${specifier}\" failed while evaluating. Inspect this error's cause for the original dependency or runtime failure.`\n\n throw new Error(\n `Unable to load optional framework config \"${frameworkName}\". ` +\n remediation,\n { cause: error }\n )\n })\n\n frameworkConfigCache.set(frameworkName, pending)\n\n return pending\n}\n\nexport const getBundledFrameworkConfig = async (\n frameworkName: FrameworkName,\n options?: FrameworkOptions\n): Promise<FlatConfigArray> => {\n const input = await loadFrameworkConfigInput(frameworkName)\n\n return typeof input === 'function' ? input(options) : input\n}\n\nconst createBundledFramework = (\n frameworkName: FrameworkName\n): ((options?: FrameworkOptions) => Promise<FlatConfigArray>) => (\n async (options?: FrameworkOptions): Promise<FlatConfigArray> => (\n getBundledFrameworkConfig(frameworkName, options)\n )\n)\n\n// Public framework factories (bare framework names).\n// Each lazily imports its framework package on first call.\nexport const angular = createBundledFramework('angular')\nexport const astro = createBundledFramework('astro')\nexport const expo = createBundledFramework('expo')\nexport const hono = createBundledFramework('hono')\nexport const lit = createBundledFramework('lit')\nexport const nest = createBundledFramework('nest')\nexport const next = createBundledFramework('next')\nexport const nuxt = createBundledFramework('nuxt')\nexport const preact = createBundledFramework('preact')\nexport const qwik = createBundledFramework('qwik')\nexport const react = createBundledFramework('react')\nexport const reactRouter = createBundledFramework('react-router')\nexport const slidev = createBundledFramework('slidev')\nexport const solid = createBundledFramework('solid')\nexport const svelte = createBundledFramework('svelte')\nexport const tanstackStart = createBundledFramework('tanstack-start')\nexport const vite = createBundledFramework('vite')\nexport const vue = createBundledFramework('vue')\n"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { DetectedFrameworkName, DetectionOptions, EslintConfigOptions, Extension
|
|
|
3
3
|
export { angular, astro, expo, hono, lit, nest, next, nuxt, preact, qwik, react, reactRouter, slidev, solid, svelte, tanstackStart, vite, vue } from './frameworks.js';
|
|
4
4
|
export { typescriptConfig } from '@santi020k/eslint-config-typescript';
|
|
5
5
|
|
|
6
|
+
type ConfigComposer = (options?: EslintConfigOptions, ...extraConfigs: ConfigInput[]) => Promise<FlatConfigArray>;
|
|
6
7
|
/**
|
|
7
8
|
* Copies already-loaded plugin objects onto rule blocks that reference them.
|
|
8
9
|
* ESLint 10 validates plugin availability per effective config object, while
|
|
@@ -17,6 +18,6 @@ declare const attachReferencedPlugins: (configs: FlatConfigArray) => FlatConfigA
|
|
|
17
18
|
* @param {ConfigInput[]} extraConfigs - Local flat-config overrides appended after generated config
|
|
18
19
|
* @returns {FlatConfigArray} The final ESLint configuration array
|
|
19
20
|
*/
|
|
20
|
-
declare const defineConfig:
|
|
21
|
+
declare const defineConfig: ConfigComposer;
|
|
21
22
|
|
|
22
23
|
export { attachReferencedPlugins, defineConfig };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
1
2
|
import { dirname, join } from "node:path";
|
|
2
3
|
import { fileURLToPath } from "node:url";
|
|
3
4
|
import {
|
|
@@ -34,6 +35,21 @@ import { createDetectedFrameworkFlags } from "./frameworks.js";
|
|
|
34
35
|
import { getIntegrationConfigs, getPrettierConfig } from "./integrations.js";
|
|
35
36
|
import { resolveFramework, resolvePreset } from "./resolvers.js";
|
|
36
37
|
import { buildTailwindSettingsConfig } from "./tailwind.js";
|
|
38
|
+
const SCRIPT_FILE_GLOBS = ["**/scripts/**/*.{js,mjs,cjs,ts,mts,cts}"];
|
|
39
|
+
const getCliEntryFiles = (rootDir) => {
|
|
40
|
+
const manifestPath = join(rootDir, "package.json");
|
|
41
|
+
if (!existsSync(manifestPath)) return SCRIPT_FILE_GLOBS;
|
|
42
|
+
try {
|
|
43
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
44
|
+
const binFiles = typeof manifest.bin === "string" ? [manifest.bin] : Object.values(manifest.bin ?? {});
|
|
45
|
+
return [.../* @__PURE__ */ new Set([
|
|
46
|
+
...SCRIPT_FILE_GLOBS,
|
|
47
|
+
...binFiles.map((file) => file.replace(/^\.\//, ""))
|
|
48
|
+
])];
|
|
49
|
+
} catch {
|
|
50
|
+
return SCRIPT_FILE_GLOBS;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
37
53
|
import {
|
|
38
54
|
angular,
|
|
39
55
|
astro,
|
|
@@ -86,8 +102,8 @@ const resolveTailwindOptions = (rootDir, tailwind) => {
|
|
|
86
102
|
if (tailwind === false) return void 0;
|
|
87
103
|
const options = tailwind ?? {};
|
|
88
104
|
const entryPoint = options.entryPoint ?? findTailwindEntryPoint(rootDir);
|
|
89
|
-
|
|
90
|
-
return buildTailwindResult(
|
|
105
|
+
const resolvedOptions = !entryPoint && options.noUnknownClasses === void 0 ? { ...options, noUnknownClasses: false } : options;
|
|
106
|
+
return buildTailwindResult(resolvedOptions, entryPoint, rootDir);
|
|
91
107
|
};
|
|
92
108
|
const TESTING_CONFIG_NAMES = {
|
|
93
109
|
[Testing.Cypress]: ["integrations/cypress"],
|
|
@@ -225,7 +241,8 @@ const FRAMEWORK_EXTRA_OPTS = {
|
|
|
225
241
|
hasSolid: ctx.hasSolid,
|
|
226
242
|
hasSvelte: ctx.hasSvelte,
|
|
227
243
|
hasVue: ctx.hasVue,
|
|
228
|
-
tsconfigRootDir: ctx.tsconfigRootDir
|
|
244
|
+
tsconfigRootDir: ctx.tsconfigRootDir,
|
|
245
|
+
typeChecked: ctx.typeChecked
|
|
229
246
|
}),
|
|
230
247
|
hono: (ctx) => ({ runtime: ctx.runtime }),
|
|
231
248
|
slidev: (ctx) => ({ runtime: ctx.runtime }),
|
|
@@ -233,10 +250,7 @@ const FRAMEWORK_EXTRA_OPTS = {
|
|
|
233
250
|
};
|
|
234
251
|
const resolveEnabledFrameworks = async (frameworks, ctx) => {
|
|
235
252
|
const entries = await Promise.all(
|
|
236
|
-
Object.entries(frameworks).filter((entry) => Boolean(entry[1])).map(([name, value]) => (
|
|
237
|
-
// eslint-disable-next-line security/detect-object-injection
|
|
238
|
-
resolveFramework(name, value, FRAMEWORK_EXTRA_OPTS[name]?.(ctx)).then((config) => [name, config])
|
|
239
|
-
))
|
|
253
|
+
Object.entries(frameworks).filter((entry) => Boolean(entry[1])).map(([name, value]) => resolveFramework(name, value, FRAMEWORK_EXTRA_OPTS[name]?.(ctx)).then((config) => [name, config]))
|
|
240
254
|
);
|
|
241
255
|
return Object.fromEntries(entries);
|
|
242
256
|
};
|
|
@@ -248,7 +262,7 @@ const buildEslintConfigs = async (params) => {
|
|
|
248
262
|
nextMode,
|
|
249
263
|
resolvedFrameworks,
|
|
250
264
|
resolvedTypescript,
|
|
251
|
-
rootDir
|
|
265
|
+
rootDir,
|
|
252
266
|
runtime,
|
|
253
267
|
runtimeCoreConfig,
|
|
254
268
|
tailwindOptions,
|
|
@@ -261,10 +275,10 @@ const buildEslintConfigs = async (params) => {
|
|
|
261
275
|
uniqueTools,
|
|
262
276
|
userIgnores
|
|
263
277
|
} = params;
|
|
264
|
-
const { hasReact, hasSolid, hasSvelte, hasVue } = astroOptions;
|
|
278
|
+
const { hasReact, hasSolid, hasSvelte, hasVue, typeChecked } = astroOptions;
|
|
265
279
|
const fw = await resolveEnabledFrameworks(
|
|
266
280
|
resolvedFrameworks,
|
|
267
|
-
{ hasReact, hasSolid, hasSvelte, hasVue, runtime, tsconfigRootDir }
|
|
281
|
+
{ hasReact, hasSolid, hasSvelte, hasVue, runtime, tsconfigRootDir, typeChecked }
|
|
268
282
|
);
|
|
269
283
|
const get = (name) => fw[name] ?? [];
|
|
270
284
|
const typescriptConfigs = resolvedTypescript ? createTypescriptConfig({
|
|
@@ -325,15 +339,41 @@ const buildEslintConfigs = async (params) => {
|
|
|
325
339
|
rules: { "@next/next/no-html-link-for-pages": "off" }
|
|
326
340
|
}] : [],
|
|
327
341
|
...applyTestingFileOverrides(
|
|
328
|
-
await getIntegrationConfigs(
|
|
342
|
+
await getIntegrationConfigs(
|
|
343
|
+
uniqueLibraries,
|
|
344
|
+
uniqueTools,
|
|
345
|
+
uniqueTesting,
|
|
346
|
+
uniqueFormats,
|
|
347
|
+
uniqueExtensions
|
|
348
|
+
),
|
|
329
349
|
testingFiles
|
|
330
350
|
),
|
|
351
|
+
...resolvedFrameworks.next ? [{
|
|
352
|
+
files: ["next-env.d.ts"],
|
|
353
|
+
name: "eslint-config-next/generated-declaration",
|
|
354
|
+
rules: {
|
|
355
|
+
"@stylistic/quotes": "off",
|
|
356
|
+
"@stylistic/semi": "off"
|
|
357
|
+
}
|
|
358
|
+
}] : [],
|
|
359
|
+
{
|
|
360
|
+
files: [
|
|
361
|
+
"**/*.{test,spec}.{js,mjs,cjs,jsx,ts,mts,cts,tsx}",
|
|
362
|
+
"**/{test,tests,__tests__}/**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}"
|
|
363
|
+
],
|
|
364
|
+
name: "eslint-config-basic/test-file-overrides",
|
|
365
|
+
rules: {
|
|
366
|
+
"@typescript-eslint/no-empty-function": "off",
|
|
367
|
+
"no-use-before-define": "off"
|
|
368
|
+
}
|
|
369
|
+
},
|
|
331
370
|
{
|
|
332
|
-
files:
|
|
371
|
+
files: getCliEntryFiles(rootDir),
|
|
333
372
|
name: "eslint-config-basic/scripts-overrides",
|
|
334
373
|
rules: {
|
|
335
374
|
"n/no-unpublished-import": "off",
|
|
336
|
-
|
|
375
|
+
"n/no-process-exit": "off",
|
|
376
|
+
"no-console": "off"
|
|
337
377
|
}
|
|
338
378
|
},
|
|
339
379
|
...tailwindOptions ? [buildTailwindSettingsConfig(tailwindOptions)] : [],
|
|
@@ -382,11 +422,11 @@ const emitAstroDoctorWarning = (extensions, frameworks) => {
|
|
|
382
422
|
"[eslint-config-basic] Warning: Astro Doctor is enabled without the Astro framework config. Enable `frameworks: { astro: true }` or remove the `astro-doctor` feature."
|
|
383
423
|
);
|
|
384
424
|
};
|
|
385
|
-
const resolveProjectConfigs = async (configuredProjects, projectDefaults, detectRootDir, autoFrameworks) => Promise.all(
|
|
425
|
+
const resolveProjectConfigs = async (configuredProjects, projectDefaults, detectRootDir, autoFrameworks, composeConfig) => Promise.all(
|
|
386
426
|
Object.entries(configuredProjects).map(async ([projectPath, projectOptions]) => {
|
|
387
427
|
const projectRoot = join(detectRootDir ?? process.cwd(), projectPath);
|
|
388
428
|
const inheritedOptions = mergeProjectOptions(projectDefaults ?? {}, projectOptions);
|
|
389
|
-
const scopedConfigs = await
|
|
429
|
+
const scopedConfigs = await composeConfig({
|
|
390
430
|
autoFrameworks,
|
|
391
431
|
...inheritedOptions,
|
|
392
432
|
projectDefaults: void 0,
|
|
@@ -399,7 +439,8 @@ const resolveProjectConfigs = async (configuredProjects, projectDefaults, detect
|
|
|
399
439
|
const resolveInheritedProjectDefaults = (options) => mergeProjectOptions(
|
|
400
440
|
{
|
|
401
441
|
...options?.detection === void 0 ? {} : { detection: options.detection },
|
|
402
|
-
...options?.tailwind === void 0 ? {} : { tailwind: options.tailwind }
|
|
442
|
+
...options?.tailwind === void 0 ? {} : { tailwind: options.tailwind },
|
|
443
|
+
...typeof options?.typescript === "object" && options.typescript.untypedFiles !== void 0 ? { typescript: { untypedFiles: options.typescript.untypedFiles } } : {}
|
|
403
444
|
},
|
|
404
445
|
options?.projectDefaults ?? {}
|
|
405
446
|
);
|
|
@@ -468,7 +509,7 @@ const getConfigsParams = (options, rootDir, runtime, uniqueLibraries, uniqueSett
|
|
|
468
509
|
userIgnores
|
|
469
510
|
};
|
|
470
511
|
};
|
|
471
|
-
const defineConfig = async (options, ...extraConfigs)
|
|
512
|
+
const defineConfig = async function defineConfig2(options, ...extraConfigs) {
|
|
472
513
|
const {
|
|
473
514
|
detection,
|
|
474
515
|
extensions: optExtensions,
|
|
@@ -485,7 +526,13 @@ const defineConfig = async (options, ...extraConfigs) => {
|
|
|
485
526
|
const detected = resolveDetectedOptions(detectRootDir, detection, requestedPreset);
|
|
486
527
|
const { frameworkDefaults, preset, presetDefaults } = resolvePresetMeta(requestedPreset, detected, autoFrameworks);
|
|
487
528
|
const configuredProjects = resolveConfiguredProjects(detected, options);
|
|
488
|
-
const {
|
|
529
|
+
const {
|
|
530
|
+
detectedExtensions,
|
|
531
|
+
detectedFormats,
|
|
532
|
+
detectedLibraries,
|
|
533
|
+
detectedTesting,
|
|
534
|
+
detectedTools
|
|
535
|
+
} = resolveBucketDefaults(detected);
|
|
489
536
|
const configuredExtensions = mergeOptionalBucket(
|
|
490
537
|
"extensions",
|
|
491
538
|
detectedExtensions,
|
|
@@ -502,7 +549,12 @@ const defineConfig = async (options, ...extraConfigs) => {
|
|
|
502
549
|
options,
|
|
503
550
|
optionMergeStrategy
|
|
504
551
|
);
|
|
505
|
-
const frameworks = mergeFrameworkOption(
|
|
552
|
+
const frameworks = mergeFrameworkOption(
|
|
553
|
+
frameworkDefaults,
|
|
554
|
+
presetDefaults.frameworks,
|
|
555
|
+
optFrameworks,
|
|
556
|
+
optionMergeStrategy
|
|
557
|
+
);
|
|
506
558
|
const libraries = mergeOptionalBucket(
|
|
507
559
|
"libraries",
|
|
508
560
|
detectedLibraries,
|
|
@@ -546,7 +598,10 @@ const defineConfig = async (options, ...extraConfigs) => {
|
|
|
546
598
|
emitAstroDoctorWarning(uniqueExtensions, resolvedFrameworks);
|
|
547
599
|
const params = getConfigsParams(options, rootDir, runtime, uniqueLibraries, uniqueSettings, resolvedFrameworks);
|
|
548
600
|
const configs = await buildEslintConfigs({
|
|
549
|
-
astroOptions:
|
|
601
|
+
astroOptions: {
|
|
602
|
+
...params.astroOptions,
|
|
603
|
+
typeChecked: resolvedTypescript ? resolvedTypescript.mode !== "syntax" : false
|
|
604
|
+
},
|
|
550
605
|
defaultIgnores: params.defaultIgnores,
|
|
551
606
|
gitignoreConfig: params.gitignoreConfig,
|
|
552
607
|
nextMode,
|
|
@@ -585,9 +640,14 @@ const defineConfig = async (options, ...extraConfigs) => {
|
|
|
585
640
|
configuredProjects,
|
|
586
641
|
resolveInheritedProjectDefaults(options),
|
|
587
642
|
detectRootDir,
|
|
588
|
-
options?.autoFrameworks
|
|
643
|
+
options?.autoFrameworks,
|
|
644
|
+
defineConfig2
|
|
589
645
|
);
|
|
590
|
-
const allConfigs = [
|
|
646
|
+
const allConfigs = [
|
|
647
|
+
...configs,
|
|
648
|
+
...projectConfigs.flat(),
|
|
649
|
+
...flattenConfigInputs(extraConfigs)
|
|
650
|
+
];
|
|
591
651
|
const patchedConfigs = workspacePrefixes?.length ? patchImportGroups(allConfigs, workspacePrefixes) : allConfigs;
|
|
592
652
|
const finalConfig = attachReferencedPlugins(applyStrictMode(patchedConfigs, strict));
|
|
593
653
|
return attachDefineConfigMetadata(finalConfig, { extraConfigs, options });
|
|
@@ -633,3 +693,4 @@ export {
|
|
|
633
693
|
vite,
|
|
634
694
|
vue
|
|
635
695
|
};
|
|
696
|
+
//# sourceMappingURL=index.js.map
|