@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.
Files changed (41) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/agent-skill-generator.d.ts +7 -18
  3. package/dist/agent-skill-generator.js +54 -18
  4. package/dist/agent-skill-generator.js.map +1 -0
  5. package/dist/cli-advanced.d.ts +7 -0
  6. package/dist/cli-advanced.js +74 -15
  7. package/dist/cli-advanced.js.map +1 -0
  8. package/dist/cli-migration.js +22 -20
  9. package/dist/cli-migration.js.map +1 -0
  10. package/dist/cli-package-manager.d.ts +10 -0
  11. package/dist/cli-package-manager.js +135 -0
  12. package/dist/cli-package-manager.js.map +1 -0
  13. package/dist/cli-preset.d.ts +74 -2
  14. package/dist/cli-preset.js +253 -6
  15. package/dist/cli-preset.js.map +1 -0
  16. package/dist/cli-workflows.js +1 -0
  17. package/dist/cli-workflows.js.map +1 -0
  18. package/dist/cli.d.ts +1 -1
  19. package/dist/cli.js +461 -176
  20. package/dist/cli.js.map +1 -0
  21. package/dist/define-config-metadata.js +2 -4
  22. package/dist/define-config-metadata.js.map +1 -0
  23. package/dist/frameworks.d.ts +1 -0
  24. package/dist/frameworks.js +2 -1
  25. package/dist/frameworks.js.map +1 -0
  26. package/dist/index.d.ts +2 -1
  27. package/dist/index.js +83 -22
  28. package/dist/index.js.map +1 -0
  29. package/dist/integrations.js +1 -0
  30. package/dist/integrations.js.map +1 -0
  31. package/dist/optional-package-errors.js +1 -0
  32. package/dist/optional-package-errors.js.map +1 -0
  33. package/dist/recommended.js +1 -0
  34. package/dist/recommended.js.map +1 -0
  35. package/dist/resolvers.js +1 -0
  36. package/dist/resolvers.js.map +1 -0
  37. package/dist/tailwind.d.ts +3 -1
  38. package/dist/tailwind.js +115 -13
  39. package/dist/tailwind.js.map +1 -0
  40. package/package.json +21 -21
  41. package/IMPROVEMENTS.md +0 -270
@@ -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":[]}
@@ -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>;
@@ -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: (options?: EslintConfigOptions, ...extraConfigs: ConfigInput[]) => Promise<FlatConfigArray>;
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
- if (!entryPoint && options.cwd === void 0 && options.detectComponentClasses === void 0 && !options.ignore?.length && options.noUnknownClasses === void 0) return void 0;
90
- return buildTailwindResult(options, entryPoint, rootDir);
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: _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(uniqueLibraries, uniqueTools, uniqueTesting, uniqueFormats, uniqueExtensions),
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: ["**/scripts/**/*.{js,mjs,cjs,ts,mts,cts}"],
371
+ files: getCliEntryFiles(rootDir),
333
372
  name: "eslint-config-basic/scripts-overrides",
334
373
  rules: {
335
374
  "n/no-unpublished-import": "off",
336
- ...uniqueExtensions.includes(Extension.Security) ? { "security/detect-non-literal-fs-filename": "off" } : {}
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 defineConfig({
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 { detectedExtensions, detectedFormats, detectedLibraries, detectedTesting, detectedTools } = resolveBucketDefaults(detected);
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(frameworkDefaults, presetDefaults.frameworks, optFrameworks, optionMergeStrategy);
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: params.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 = [...configs, ...projectConfigs.flat(), ...flattenConfigInputs(extraConfigs)];
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