@useinsider/eslint-config 4.0.0-beta.4 → 4.0.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +9 -2
- package/dist/cli.cjs.map +1 -1
- package/dist/configs/dependencies.d.ts +1 -0
- package/package.json +2 -1
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":[],"sources":["../src/cli/detect.ts","../src/cli/detectVueApiPattern.ts","../src/cli/dispatch.ts","../src/configs/dependencies.ts","../src/configs/jest/dependencies.ts","../src/configs/typescript/dependencies.ts","../src/configs/vitest/dependencies.ts","../src/configs/vue2/dependencies.ts","../src/configs/vue2-typescript/dependencies.ts","../src/configs/vue3/dependencies.ts","../src/configs/vue3-typescript/dependencies.ts","../src/cli/resolveEslintConfigManifest.ts","../src/cli/install.ts","../src/cli/installWithRetry.ts","../src/cli/detectIndent.ts","../src/cli/lintLayout.ts","../src/cli/quote.ts","../src/cli/template.ts","../src/cli/questions.ts","../src/cli/sessionStore.ts","../src/configs/javascript/dependencies.ts","../src/configs/javascript-dom/dependencies.ts","../src/configs/javascript-node/dependencies.ts","../src/configs/jsdoc-based-ts/dependencies.ts","../src/configs/strict/dependencies.ts","../src/configs/typescript-dom/dependencies.ts","../src/configs/typescript-node/dependencies.ts","../src/cli/migrate/dependencies.ts","../src/cli/prunePackageJson.ts","../src/cli/tsconfigFlag.ts","../src/cli/migrate/disableDirectives.ts","../src/cli/migrate/stringEntry.ts","../src/cli/migrate/eslintrc/parse.ts","../src/cli/migrate/globalsFolding.ts","../src/cli/migrate/eslintrc/transform.ts","../src/cli/migrate/parse.ts","../src/cli/migrate/rehouseV3.ts","../src/cli/migrate/pruneUnusedImports.ts","../src/cli/migrate/render.ts","../src/cli/migrate/transform.ts","../src/cli/migrate/warnings.ts","../src/cli/migrate/writer.ts","../src/cli/migrate/index.ts","../src/cli/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport const FLAT_CONFIG_FILENAMES: readonly string[] = [\n 'eslint.config.mjs',\n 'eslint.config.js',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts',\n];\n\nexport const LEGACY_CONFIG_FILENAMES: readonly string[] = [\n '.eslintrc.cjs',\n '.eslintrc.js',\n '.eslintrc.mjs',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n '.eslintrc',\n];\n\nexport function findConfigFile (cwd: string, filenames: readonly string[]): string | null {\n return filenames\n .map(name => join(cwd, name))\n .find(candidate => existsSync(candidate)) ?? null;\n}\n\nexport type ExistingConfigKind = 'flat' | 'legacy';\n\nexport interface ExistingConfigDetection {\n path: string;\n kind: ExistingConfigKind;\n}\n\nexport interface TsconfigReference {\n path: string;\n}\n\nexport interface TsconfigContents {\n compilerOptions?: Record<string, unknown>;\n files?: string[];\n include?: string[];\n exclude?: string[];\n references?: TsconfigReference[];\n [key: string]: unknown;\n}\n\nexport function findExistingConfig (cwd: string): string | null {\n return findConfigFile(cwd, FLAT_CONFIG_FILENAMES);\n}\n\nexport function detectExistingEslintConfig (cwd: string): ExistingConfigDetection | null {\n const flatHit = findConfigFile(cwd, FLAT_CONFIG_FILENAMES);\n\n if (flatHit) {\n return { path: flatHit, kind: 'flat' };\n }\n\n const legacyHit = findConfigFile(cwd, LEGACY_CONFIG_FILENAMES);\n\n if (legacyHit) {\n return { path: legacyHit, kind: 'legacy' };\n }\n\n const pkgPath = join(cwd, 'package.json');\n\n if (!existsSync(pkgPath)) {\n return null;\n }\n\n try {\n const raw = readFileSync(pkgPath, 'utf8');\n const parsed = JSON.parse(raw) as { eslintConfig?: unknown };\n\n if (parsed.eslintConfig && typeof parsed.eslintConfig === 'object') {\n return { path: pkgPath, kind: 'legacy' };\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nconst stringTokenPattern = /\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'/gu;\nconst lineCommentPattern = /\\/\\/[^\\n]*/gu;\nconst blockCommentPattern = /\\/\\*[\\s\\S]*?\\*\\//gu;\nconst placeholderPattern = /__JSONC_TOKEN_(\\d+)__/gu;\n\nfunction stripJsonComments (source: string): string {\n const tokens: string[] = [];\n const protectedSource = source.replace(stringTokenPattern, match => {\n const index = tokens.length;\n\n tokens.push(match);\n\n return `__JSONC_TOKEN_${index}__`;\n });\n const withoutBlocks = protectedSource.replace(blockCommentPattern, '');\n const withoutLines = withoutBlocks.replace(lineCommentPattern, '');\n\n return withoutLines.replace(placeholderPattern, (_match, indexValue: string) => tokens[Number(indexValue)]);\n}\n\nfunction stripTrailingCommas (source: string): string {\n return source.replace(/,(\\s*[}\\]])/g, '$1');\n}\n\nexport function readTsconfig (absPath: string): TsconfigContents {\n const raw = readFileSync(absPath, 'utf8');\n const stripped = stripTrailingCommas(stripJsonComments(raw));\n\n return JSON.parse(stripped) as TsconfigContents;\n}\n\nexport interface ResolvedReferences {\n rootPath: string;\n refs: string[];\n}\n\nexport function resolveTsconfigReferences (cwd: string): ResolvedReferences | null {\n const rootPath = join(cwd, 'tsconfig.json');\n\n if (!existsSync(rootPath)) {\n return null;\n }\n\n const parsed = readTsconfig(rootPath);\n const refs = parsed.references;\n\n if (!refs || refs.length === 0) {\n return null;\n }\n\n const hasFiles = Array.isArray(parsed.files) && parsed.files.length > 0;\n const hasInclude = Array.isArray(parsed.include) && parsed.include.length > 0;\n\n if (hasFiles || hasInclude) {\n return null;\n }\n\n return {\n rootPath,\n refs: refs.map(ref => ref.path),\n };\n}\n","import { type Dirent, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, relative, sep } from 'node:path';\n\nconst SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n '.svn',\n '.hg',\n 'dist',\n 'build',\n 'out',\n 'coverage',\n '.next',\n '.nuxt',\n '.output',\n '.cache',\n '.turbo',\n '.parcel-cache',\n '.vite',\n]);\n\nconst MAX_FILES = 5_000;\nconst MATCH_THRESHOLD = 0.95;\nconst MIN_SAMPLES_PER_BUCKET = 2;\nconst SUFFIX_CANDIDATES = ['.options', '.classic', '.legacy', '.opts', '.setup', '.composition', '.modern'] as const;\nconst DIRECTORY_CANDIDATES = [\n { options: 'options', composition: 'composition' },\n { options: 'Options', composition: 'Composition' },\n { options: 'options-api', composition: 'composition-api' },\n { options: 'classic', composition: 'modern' },\n { options: 'legacy', composition: 'next' },\n] as const;\n\nexport type VueComponentApi = 'options' | 'composition' | 'mixed';\n\nexport interface VueFileClassification {\n relativePath: string;\n api: VueComponentApi;\n}\n\nexport interface VueHybridPatternSamples {\n composition: string[];\n options: string[];\n}\n\nexport type VueHybridSuffixTargetApi = 'composition' | 'options';\n\nexport type VueHybridPatternDetection = | {\n kind: 'none';\n compositionFiles: string[];\n optionsFiles: string[];\n}\n | {\n kind: 'suffix';\n compositionPattern: string;\n optionsPattern: string;\n suffix: string;\n targetApi: VueHybridSuffixTargetApi;\n samples: VueHybridPatternSamples;\n }\n | {\n kind: 'directory';\n compositionPattern: string;\n optionsPattern: string;\n compositionDir: string;\n optionsDir: string;\n samples: VueHybridPatternSamples;\n }\n | {\n kind: 'ambiguous';\n reason: string;\n compositionFiles: string[];\n optionsFiles: string[];\n };\n\ninterface ScanOptions {\n cwd: string;\n maxFiles?: number;\n skipDirs?: Set<string>;\n}\n\ninterface ScanResult {\n files: string[];\n truncated: boolean;\n}\n\nfunction safeReaddir (path: string): Dirent[] {\n try {\n return readdirSync(path, { withFileTypes: true, encoding: 'utf8' });\n } catch {\n return [];\n }\n}\n\nfunction walkDir (\n dir: string,\n skipDirs: Set<string>,\n limit: number,\n accumulator: { files: string[]; truncated: boolean }\n): void {\n if (accumulator.truncated || accumulator.files.length >= limit) {\n return;\n }\n\n const entries = safeReaddir(dir);\n\n entries.forEach(entry => {\n if (accumulator.files.length >= limit) {\n accumulator.truncated = true;\n\n return;\n }\n\n const full = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) {\n walkDir(full, skipDirs, limit, accumulator);\n }\n\n return;\n }\n\n if (entry.isFile() && entry.name.endsWith('.vue')) {\n accumulator.files.push(full);\n }\n });\n}\n\nfunction scanVueFiles (options: ScanOptions): ScanResult {\n const limit = options.maxFiles ?? MAX_FILES;\n const skipDirs = options.skipDirs ?? SKIP_DIRS;\n const accumulator = { files: [] as string[], truncated: false };\n\n walkDir(options.cwd, skipDirs, limit, accumulator);\n\n return { files: accumulator.files, truncated: accumulator.truncated };\n}\n\nfunction classifyVueContent (content: string): VueComponentApi {\n const hasSetupScript = /<script[^>]*\\bsetup\\b/i.test(content);\n const hasPlainScript = /<script(?:(?!\\bsetup\\b)[^>])*>/i.test(content);\n\n if (hasSetupScript && hasPlainScript) {\n return 'mixed';\n }\n\n if (hasSetupScript) {\n return 'composition';\n }\n\n return 'options';\n}\n\nexport function classifyVueFiles (absolutePaths: readonly string[], cwd: string): VueFileClassification[] {\n return absolutePaths.reduce<VueFileClassification[]>((classifications, absolutePath) => {\n let content: string;\n\n try {\n const stat = statSync(absolutePath);\n\n if (stat.size > 2_000_000) {\n return classifications;\n }\n\n content = readFileSync(absolutePath, 'utf8');\n } catch {\n return classifications;\n }\n\n const api = classifyVueContent(content);\n const relativePath = relative(cwd, absolutePath);\n\n classifications.push({\n relativePath: relativePath.split(sep).join('/'),\n api: api === 'mixed' ? 'composition' : api,\n });\n\n return classifications;\n }, []);\n}\n\nfunction basenameOf (relativePath: string): string {\n const lastSlash = relativePath.lastIndexOf('/');\n\n return lastSlash === -1 ? relativePath : relativePath.slice(lastSlash + 1);\n}\n\nfunction ratio (matched: number, total: number): number {\n return total === 0 ? 0 : matched / total;\n}\n\nfunction suffixIsViable (\n targetMatches: readonly string[],\n otherMatches: readonly string[],\n targetTotal: number,\n otherTotal: number\n): boolean {\n const targetRatio = ratio(targetMatches.length, targetTotal);\n const otherRatio = ratio(otherMatches.length, otherTotal);\n\n if (targetRatio < MATCH_THRESHOLD || otherRatio < MATCH_THRESHOLD) {\n return false;\n }\n\n return targetMatches.length >= MIN_SAMPLES_PER_BUCKET && otherMatches.length >= MIN_SAMPLES_PER_BUCKET;\n}\n\nfunction suffixMatchesTargetingApi (\n suffix: string,\n targetApi: VueHybridSuffixTargetApi,\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n const fullSuffix = `${suffix}.vue`;\n const targetIsOptions = targetApi === 'options';\n const targetFiles = targetIsOptions ? optionsFiles : compositionFiles;\n const otherFiles = targetIsOptions ? compositionFiles : optionsFiles;\n const targetMatches = targetFiles.filter(path => basenameOf(path).endsWith(fullSuffix));\n const otherMatches = otherFiles.filter(path => !basenameOf(path).endsWith(fullSuffix));\n\n if (!suffixIsViable(targetMatches, otherMatches, targetFiles.length, otherFiles.length)) {\n return null;\n }\n\n const optionsMatches = targetIsOptions ? targetMatches : otherMatches;\n const compositionMatches = targetIsOptions ? otherMatches : targetMatches;\n const optionsPattern = targetIsOptions ? `**/*${fullSuffix}` : '**/*.vue';\n const compositionPattern = targetIsOptions ? '**/*.vue' : `**/*${fullSuffix}`;\n\n return {\n kind: 'suffix',\n compositionPattern,\n optionsPattern,\n suffix: fullSuffix,\n targetApi,\n samples: {\n composition: compositionMatches.slice(0, 5),\n options: optionsMatches.slice(0, 5),\n },\n };\n}\n\nfunction suffixMatches (\n suffix: string,\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n return suffixMatchesTargetingApi(suffix, 'options', optionsFiles, compositionFiles)\n ?? suffixMatchesTargetingApi(suffix, 'composition', optionsFiles, compositionFiles);\n}\n\nfunction detectSuffix (\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n return SUFFIX_CANDIDATES.reduce<VueHybridPatternDetection | null>((found, suffix) => {\n if (found) {\n return found;\n }\n\n return suffixMatches(suffix, optionsFiles, compositionFiles);\n }, null);\n}\n\nfunction directoryMatches (\n options: string,\n composition: string,\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n const optionsToken = `/${options}/`;\n const optionsPrefix = `${options}/`;\n const inOptionsDir = (path: string): boolean => path.includes(optionsToken) || path.startsWith(optionsPrefix);\n const optionsMatches = optionsFiles.filter(inOptionsDir);\n const compositionMatches = compositionFiles.filter(path => !inOptionsDir(path));\n const optionsRatio = ratio(optionsMatches.length, optionsFiles.length);\n const compositionRatio = ratio(compositionMatches.length, compositionFiles.length);\n\n if (optionsRatio < MATCH_THRESHOLD || compositionRatio < MATCH_THRESHOLD) {\n return null;\n }\n\n if (optionsMatches.length < MIN_SAMPLES_PER_BUCKET || compositionMatches.length < MIN_SAMPLES_PER_BUCKET) {\n return null;\n }\n\n return {\n kind: 'directory',\n compositionPattern: `**/${composition}/**/*.vue`,\n optionsPattern: `**/${options}/**/*.vue`,\n compositionDir: composition,\n optionsDir: options,\n samples: {\n composition: compositionMatches.slice(0, 5),\n options: optionsMatches.slice(0, 5),\n },\n };\n}\n\nfunction detectDirectory (\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n return DIRECTORY_CANDIDATES.reduce<VueHybridPatternDetection | null>((found, candidate) => {\n if (found) {\n return found;\n }\n\n return directoryMatches(candidate.options, candidate.composition, optionsFiles, compositionFiles);\n }, null);\n}\n\nexport interface DetectVueApiPatternInput {\n cwd: string;\n maxFiles?: number;\n skipDirs?: Set<string>;\n classifications?: readonly VueFileClassification[];\n}\n\nexport function detectVueApiPattern (input: DetectVueApiPatternInput): VueHybridPatternDetection {\n const classifications = input.classifications\n ?? classifyVueFiles(scanVueFiles(input).files, input.cwd);\n\n if (classifications.length === 0) {\n return {\n kind: 'none',\n compositionFiles: [],\n optionsFiles: [],\n };\n }\n\n const optionsFiles = classifications.filter(item => item.api === 'options').map(item => item.relativePath);\n const compositionFiles = classifications\n .filter(item => item.api === 'composition')\n .map(item => item.relativePath);\n\n if (optionsFiles.length === 0 || compositionFiles.length === 0) {\n return {\n kind: 'none',\n compositionFiles,\n optionsFiles,\n };\n }\n\n const suffixHit = detectSuffix(optionsFiles, compositionFiles);\n\n if (suffixHit) {\n return suffixHit;\n }\n\n const directoryHit = detectDirectory(optionsFiles, compositionFiles);\n\n if (directoryHit) {\n return directoryHit;\n }\n\n return {\n kind: 'ambiguous',\n reason: 'Options and Composition files do not share a consistent suffix or directory split.',\n compositionFiles: compositionFiles.slice(0, 5),\n optionsFiles: optionsFiles.slice(0, 5),\n };\n}\n","export interface MigrateInput {\n cwd: string;\n target?: string;\n yes?: boolean;\n noInstall?: boolean;\n fromLint?: boolean;\n}\n\nexport interface ScaffoldInput {\n cwd: string;\n yes?: boolean;\n}\n\nexport interface DispatchDeps {\n scaffold: (input: ScaffoldInput) => Promise<number>;\n migrate: (input: MigrateInput) => Promise<number>;\n stderr: (line: string) => void;\n}\n\nconst yesFlags = new Set(['--yes', '-y']);\nconst noInstallFlags = new Set(['--no-install']);\nconst fromLintFlags = new Set(['--from-lint']);\n\nfunction isYesFlag (arg: string): boolean {\n return yesFlags.has(arg);\n}\n\nfunction isNoInstallFlag (arg: string): boolean {\n return noInstallFlags.has(arg);\n}\n\nfunction isFromLintFlag (arg: string): boolean {\n return fromLintFlags.has(arg);\n}\n\ninterface MigrateArgs {\n target: string | undefined;\n yes: boolean;\n noInstall: boolean;\n fromLint: boolean;\n}\n\nfunction parseMigrateArgs (rest: readonly string[]): MigrateArgs {\n const yes = rest.some(isYesFlag);\n const noInstall = rest.some(isNoInstallFlag);\n const fromLint = rest.some(isFromLintFlag);\n const positional = rest.filter(\n arg => !isYesFlag(arg) && !isNoInstallFlag(arg) && !isFromLintFlag(arg)\n );\n const target = positional.length > 0 ? positional[positional.length - 1] : undefined;\n\n return { target, yes, noInstall, fromLint };\n}\n\nfunction parseScaffoldArgs (argv: readonly string[]): { yes: boolean } {\n return { yes: argv.some(isYesFlag) };\n}\n\nfunction printUsage (stderr: (line: string) => void, unknown: string): void {\n stderr(`[useinsider/eslint-config] Unknown subcommand: ${unknown}`);\n stderr('Usage:');\n stderr(' npx @useinsider/eslint-config [--yes|-y]');\n stderr(' Scaffold insider.lint.*, eslint.config.* and oxlint.config.*');\n stderr(' npx @useinsider/eslint-config migrate [path] [--yes|-y] [--no-install] [--from-lint]');\n stderr(' Split an existing useInsider() or .eslintrc* config into the three-file layout');\n stderr(' --from-lint: started by a failing lint run — confirm first, exit non-zero if declined');\n}\n\nfunction isScaffoldArgv (argv: readonly string[]): boolean {\n return argv.every(arg => isYesFlag(arg));\n}\n\nexport async function dispatch (\n argv: readonly string[],\n cwd: string,\n deps: DispatchDeps\n): Promise<number> {\n if (isScaffoldArgv(argv)) {\n const { yes } = parseScaffoldArgs(argv);\n\n return deps.scaffold({ cwd, yes });\n }\n\n const [subcommand, ...rest] = argv;\n\n if (subcommand === 'migrate') {\n const { target, yes, noInstall, fromLint } = parseMigrateArgs(rest);\n\n return deps.migrate({ cwd, target, yes, noInstall, fromLint });\n }\n\n printUsage(deps.stderr, subcommand);\n\n return 1;\n}\n","export const dependencies = {\n oxlint: true,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-jest': true,\n} as const;\n","export const dependencies = {\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","export const dependencies = {\n '@vitest/eslint-plugin': true,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-vue': true,\n 'eslint-plugin-vue-scoped-css': true,\n 'vue-eslint-parser': true,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-vue': true,\n 'eslint-plugin-vue-scoped-css': true,\n 'vue-eslint-parser': true,\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-vue': true,\n 'eslint-plugin-vue-scoped-css': true,\n 'vue-eslint-parser': true,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-vue': true,\n 'eslint-plugin-vue-scoped-css': true,\n 'vue-eslint-parser': true,\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport type OverrideValue = string | Record<string, string>;\n\nexport type OverridesRecord = Record<string, OverrideValue>;\n\nexport const ESLINT_CONFIG_PACKAGE_NAME = '@useinsider/eslint-config';\n\nexport interface PackageManifestLike {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n overrides?: OverridesRecord;\n pnpm?: { overrides?: OverridesRecord; [key: string]: unknown };\n resolutions?: Record<string, string>;\n [key: string]: unknown;\n}\n\nfunction tryReadManifest (candidate: string): PackageManifestLike | null {\n try {\n const raw = readFileSync(candidate, 'utf8');\n const parsed = JSON.parse(raw) as PackageManifestLike;\n\n return parsed.name === ESLINT_CONFIG_PACKAGE_NAME ? parsed : null;\n } catch {\n return null;\n }\n}\n\ndeclare const __dirname: string | undefined;\n\nexport function resolveRuntimeDir (): string {\n const meta: { url?: unknown } = import.meta;\n const { url } = meta;\n\n if (typeof url === 'string' && url.startsWith('file:')) {\n return dirname(fileURLToPath(url));\n }\n\n if (typeof __dirname === 'string') {\n return __dirname;\n }\n\n return resolve(process.cwd(), 'node_modules/@useinsider/eslint-config/dist');\n}\n\nexport function readOwnEslintConfigManifestFrom (runtimeDir: string): PackageManifestLike {\n const candidates = [\n resolve(runtimeDir, '../../package.json'),\n resolve(runtimeDir, '../../../package.json'),\n resolve(runtimeDir, '../package.json'),\n resolve(process.cwd(), 'node_modules/@useinsider/eslint-config/package.json'),\n ];\n const found = candidates\n .map(tryReadManifest)\n .find(manifest => manifest !== null);\n\n if (!found) {\n throw new Error('Unable to locate @useinsider/eslint-config package.json from CLI runtime');\n }\n\n return found;\n}\n\nexport function readOwnEslintConfigManifest (): PackageManifestLike {\n return readOwnEslintConfigManifestFrom(resolveRuntimeDir());\n}\n\n/**\n * Install spec for the copy of `@useinsider/eslint-config` that is running right now, pinned to its\n * own version. A dist-tag can never stand in for it: `latest` points at the previous major for as\n * long as the current one ships on a prerelease tag, so resolving it downgrades the very consumer\n * being scaffolded or migrated.\n * @example\n * ownEslintConfigSpec({ name: '@useinsider/eslint-config', version: '4.0.0-beta.3' });\n * // '@useinsider/eslint-config@4.0.0-beta.3'\n */\nexport function ownEslintConfigSpec (manifest: PackageManifestLike): string {\n const version = manifest.version?.trim();\n\n if (!version) {\n throw new Error(\n `Unable to read the running ${ESLINT_CONFIG_PACKAGE_NAME} version from its package.json.`\n + ' Refusing to install it from a dist-tag, which would downgrade this project.'\n );\n }\n\n return `${ESLINT_CONFIG_PACKAGE_NAME}@${version}`;\n}\n","import type { CliAnswers, VueMajor } from './template';\nimport { dependencies as baseDeps } from '~/configs/dependencies';\nimport { dependencies as jestDeps } from '~/configs/jest/dependencies';\nimport { dependencies as typescriptDeps } from '~/configs/typescript/dependencies';\nimport { dependencies as vitestDeps } from '~/configs/vitest/dependencies';\nimport { dependencies as vue2Deps } from '~/configs/vue2/dependencies';\nimport { dependencies as vue2TypescriptDeps } from '~/configs/vue2-typescript/dependencies';\nimport { dependencies as vue3Deps } from '~/configs/vue3/dependencies';\nimport { dependencies as vue3TypescriptDeps } from '~/configs/vue3-typescript/dependencies';\nimport {\n ownEslintConfigSpec,\n readOwnEslintConfigManifest,\n type PackageManifestLike,\n} from './resolveEslintConfigManifest';\n\ninterface RequiredManifest {\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n optionalDependencies: Record<string, string>;\n}\n\ntype DependencyRecord = Readonly<Record<string, boolean>>;\n\nfunction toRequiredManifest (manifest: PackageManifestLike): RequiredManifest {\n return {\n dependencies: manifest.dependencies ?? {},\n devDependencies: manifest.devDependencies ?? {},\n peerDependencies: manifest.peerDependencies ?? {},\n optionalDependencies: manifest.optionalDependencies ?? {},\n };\n}\n\nfunction lookup (manifest: RequiredManifest, name: string): string | undefined {\n return manifest.dependencies[name]\n ?? manifest.devDependencies[name]\n ?? manifest.peerDependencies[name]\n ?? manifest.optionalDependencies[name];\n}\n\nfunction pinned (manifest: RequiredManifest, name: string): string {\n const version = lookup(manifest, name);\n\n if (!version) {\n throw new Error(`Unable to resolve pinned version for ${name} from @useinsider/eslint-config manifest`);\n }\n\n const cleanVersion = version.replace(/^(?:\\^|~|>=|<=|>|<|=)/u, '');\n\n return `${name}@${cleanVersion}`;\n}\n\nfunction vueDepsFor (major: VueMajor, wantsTypescript: boolean): DependencyRecord {\n if (wantsTypescript) {\n return major === 2 ? vue2TypescriptDeps : vue3TypescriptDeps;\n }\n\n return major === 2 ? vue2Deps : vue3Deps;\n}\n\nfunction applyRecord (\n deps: Set<string>,\n manifest: RequiredManifest,\n record: DependencyRecord\n): void {\n Object.entries(record).forEach(([name, install]) => {\n if (install) {\n deps.add(pinned(manifest, name));\n }\n });\n}\n\nexport function buildDependencyList (\n answers: CliAnswers,\n rawManifest: PackageManifestLike = readOwnEslintConfigManifest()\n): string[] {\n const manifest = toRequiredManifest(rawManifest);\n const deps = new Set<string>();\n\n deps.add(ownEslintConfigSpec(rawManifest));\n deps.add(pinned(manifest, 'eslint'));\n deps.add(pinned(manifest, 'globals'));\n applyRecord(deps, manifest, baseDeps);\n\n const wantsTypescript = answers.languages.includes('typescript');\n const wantsVue = answers.framework === 'vue';\n\n if (wantsVue) {\n const major: VueMajor = answers.vueMajor ?? 3;\n\n applyRecord(deps, manifest, vueDepsFor(major, wantsTypescript));\n } else if (wantsTypescript) {\n applyRecord(deps, manifest, typescriptDeps);\n }\n\n if (answers.testFramework === 'jest') {\n applyRecord(deps, manifest, jestDeps);\n }\n\n if (answers.testFramework === 'vitest') {\n applyRecord(deps, manifest, vitestDeps);\n }\n\n return [...deps];\n}\n\nexport async function installDependencies (deps: readonly string[]): Promise<void> {\n const { installPackage } = await import('@antfu/install-pkg');\n\n await installPackage([...deps], { dev: true, additionalArgs: ['-E'] });\n}\n","import { existsSync, rmSync, unlinkSync } from 'node:fs';\nimport { basename, join } from 'node:path';\nimport type { ClackLike } from './questions';\n\nexport type DependencyInstaller = (specs: readonly string[]) => Promise<void>;\n\nexport interface WipeFsOps {\n rmDir: (path: string) => void;\n rmFile: (path: string) => void;\n exists: (path: string) => boolean;\n}\n\n/**\n * Whether the dependencies really landed. `installWithRetry` handles its own retry and reporting, so\n * the failure is otherwise invisible to the caller — and a CLI that writes a lint layout over an\n * empty `node_modules` reports success for a repo that cannot lint.\n * @example\n * (await installWithRetry(options)).installed; // false when the retry failed too\n */\nexport interface InstallOutcome {\n installed: boolean;\n reason?: string;\n}\n\nexport interface InstallWithRetryOptions {\n deps: readonly string[];\n cwd: string;\n autoConfirm: boolean;\n clack: ClackLike;\n fsOps?: WipeFsOps;\n installer?: DependencyInstaller;\n}\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\ninterface DetectedLockfile {\n manager: PackageManager;\n lockfilePath: string;\n}\n\nconst lockfileMap: { file: string; manager: PackageManager }[] = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'package-lock.json', manager: 'npm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'bun.lockb', manager: 'bun' },\n];\n\nconst knownErrorCodes = [\n 'ENOSPC',\n 'EACCES',\n 'EPERM',\n 'ENOTFOUND',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ECONNRESET',\n 'EAI_AGAIN',\n 'E404',\n 'ERR_PNPM_FETCH_404',\n 'ERR_PNPM_NO_MATCHING_VERSION',\n] as const;\n\nfunction defaultWipeFs (): WipeFsOps {\n return {\n rmDir: path => {\n rmSync(path, { recursive: true, force: true });\n },\n rmFile: path => {\n unlinkSync(path);\n },\n exists: path => existsSync(path),\n };\n}\n\nasync function defaultInstaller (specs: readonly string[]): Promise<void> {\n const { installPackage } = await import('@antfu/install-pkg');\n\n await installPackage([...specs], { dev: true, additionalArgs: ['-E'] });\n}\n\nfunction detectLockfile (dir: string, exists: (path: string) => boolean): DetectedLockfile | null {\n const found = lockfileMap\n .map(entry => ({ manager: entry.manager, lockfilePath: join(dir, entry.file) }))\n .find(candidate => exists(candidate.lockfilePath));\n\n return found ?? null;\n}\n\nconst addCommandMap: Record<PackageManager, string> = {\n pnpm: 'pnpm add -D -E',\n npm: 'npm install -D -E',\n yarn: 'yarn add -D -E',\n bun: 'bun add -d -E',\n};\n\nconst removeCommandMap: Record<PackageManager, string> = {\n pnpm: 'pnpm remove',\n npm: 'npm uninstall',\n yarn: 'yarn remove',\n bun: 'bun remove',\n};\n\nexport function detectPackageManager (dir: string, fsOps?: WipeFsOps): PackageManager {\n const fs = fsOps ?? defaultWipeFs();\n const detected = detectLockfile(dir, fs.exists);\n\n return detected?.manager ?? 'pnpm';\n}\n\nexport function buildAddCommand (manager: PackageManager, specs: readonly string[]): string {\n return `${addCommandMap[manager]} ${specs.join(' ')}`;\n}\n\nexport function buildRemoveCommand (manager: PackageManager, names: readonly string[]): string {\n return `${removeCommandMap[manager]} ${names.join(' ')}`;\n}\n\nfunction sortPackagesCaseInsensitive (packages: readonly string[]): string[] {\n return [...packages].sort((left, right) => left.toLowerCase().localeCompare(right.toLowerCase()));\n}\n\nfunction formatMultilineCommand (\n header: string,\n packages: readonly string[],\n blockIndent: string,\n packageIndent: string\n): string {\n if (packages.length === 0) {\n return '';\n }\n\n const sorted = sortPackagesCaseInsensitive(packages);\n const lastIndex = sorted.length - 1;\n const lines = [`${blockIndent}${header} \\\\`];\n\n sorted.forEach((pkg, index) => {\n const suffix = index === lastIndex ? '' : ' \\\\';\n\n lines.push(`${packageIndent}${pkg}${suffix}`);\n });\n\n return lines.join('\\n');\n}\n\nexport function formatNextStepsAddCommand (\n manager: PackageManager,\n specs: readonly string[],\n blockIndent = ' ',\n packageIndent = ' '\n): string {\n return formatMultilineCommand(addCommandMap[manager], specs, blockIndent, packageIndent);\n}\n\nexport function formatNextStepsRemoveCommand (\n manager: PackageManager,\n names: readonly string[],\n blockIndent = ' ',\n packageIndent = ' '\n): string {\n return formatMultilineCommand(removeCommandMap[manager], names, blockIndent, packageIndent);\n}\n\nfunction manualRecoveryCommand (dir: string, detected: DetectedLockfile | null): string {\n const lockTarget = detected ? basename(detected.lockfilePath) : 'package-lock.json';\n const manager = detected?.manager ?? 'npm';\n\n return `cd ${dir} && rm -rf node_modules ${lockTarget} && ${manager} install`;\n}\n\nfunction buildManualHint (specs: readonly string[], dir: string, detected: DetectedLockfile | null): string {\n const recoveryAdd = specs.join(' ');\n const recovery = manualRecoveryCommand(dir, detected);\n\n return `Manually add: ${recoveryAdd}\\nRecover with: ${recovery}`;\n}\n\nfunction isPeerDepFailure (reason: string): boolean {\n return reason.toLowerCase().includes('--legacy-peer-deps');\n}\n\nfunction firstNonEmptyLine (reason: string): string {\n const line = reason.split(/\\r?\\n/u).map(segment => segment.trim()).find(segment => segment.length > 0);\n\n return line ?? reason.trim();\n}\n\nfunction detectErrorCode (reason: string): string | null {\n return knownErrorCodes.find(code => new RegExp(`\\\\b${code}\\\\b`, 'u').test(reason)) ?? null;\n}\n\nfunction buildGenericSummary (reason: string): string {\n const code = detectErrorCode(reason);\n const snippet = firstNonEmptyLine(reason);\n\n if (code && !snippet.includes(code)) {\n return `Dependency install failed (${code}): ${snippet}`;\n }\n\n return `Dependency install failed: ${snippet}`;\n}\n\nasync function confirmPeerDepWipe (clack: ClackLike, autoConfirm: boolean): Promise<boolean> {\n if (autoConfirm) {\n return true;\n }\n\n const message = 'Install failed.\\n\\n'\n + 'This usually means stale dependencies in node_modules conflict with the new ESLint plugin versions.\\n\\n'\n + 'Wipe `node_modules` and the lockfile, then retry install?';\n const result = await clack.confirm({ message, initialValue: false });\n\n return !clack.isCancel(result) && result === true;\n}\n\nasync function confirmCleanReinstall (\n clack: ClackLike,\n autoConfirm: boolean,\n summary: string\n): Promise<boolean> {\n if (autoConfirm) {\n return true;\n }\n\n const message = `${summary}\\n\\n`\n + 'Would you like to try a clean reinstall? '\n + '(removes `node_modules` and the lockfile, then re-runs install)';\n const result = await clack.confirm({ message, initialValue: true });\n\n return !clack.isCancel(result) && result === true;\n}\n\nfunction noteWipeFailure (clack: ClackLike, label: string, path: string, reason: string): void {\n if (clack.note) {\n clack.note(`Could not remove ${label} at ${path}: ${reason}`, 'Warning');\n }\n}\n\nfunction safeRemoveDir (clack: ClackLike, fs: WipeFsOps, path: string): void {\n if (!fs.exists(path)) {\n return;\n }\n\n try {\n fs.rmDir(path);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n noteWipeFailure(clack, 'node_modules', path, reason);\n }\n}\n\nfunction safeRemoveFile (clack: ClackLike, fs: WipeFsOps, path: string): void {\n if (!fs.exists(path)) {\n return;\n }\n\n try {\n fs.rmFile(path);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n noteWipeFailure(clack, 'lockfile', path, reason);\n }\n}\n\ninterface WipeContext {\n dir: string;\n fs: WipeFsOps;\n detected: DetectedLockfile | null;\n}\n\nfunction performFullWipe (clack: ClackLike, context: WipeContext): void {\n safeRemoveDir(clack, context.fs, join(context.dir, 'node_modules'));\n\n if (context.detected) {\n safeRemoveFile(clack, context.fs, context.detected.lockfilePath);\n }\n}\n\nfunction noteError (\n clack: ClackLike,\n prefix: string,\n reason: string,\n context: WipeContext,\n specs: readonly string[]\n): void {\n if (!clack.note) {\n return;\n }\n\n const hint = buildManualHint(specs, context.dir, context.detected);\n\n clack.note(`${prefix}${reason}\\n${hint}`, 'Error');\n}\n\nfunction noteGenericError (\n clack: ClackLike,\n summary: string,\n context: WipeContext,\n specs: readonly string[]\n): void {\n if (!clack.note) {\n return;\n }\n\n const hint = buildManualHint(specs, context.dir, context.detected);\n\n clack.note(`${summary}\\n${hint}`, 'Error');\n}\n\nasync function tryRetryInstall (\n clack: ClackLike,\n installer: DependencyInstaller,\n deps: readonly string[],\n context: WipeContext\n): Promise<InstallOutcome> {\n try {\n await installer(deps);\n\n return { installed: true };\n } catch (retryError) {\n const retryReason = retryError instanceof Error ? retryError.message : String(retryError);\n\n noteError(clack, 'Retry install failed after wipe: ', retryReason, context, deps);\n\n return { installed: false, reason: retryReason };\n }\n}\n\nasync function tryGenericRetryInstall (\n clack: ClackLike,\n installer: DependencyInstaller,\n deps: readonly string[],\n context: WipeContext\n): Promise<InstallOutcome> {\n try {\n await installer(deps);\n\n return { installed: true };\n } catch (retryError) {\n const retryReason = retryError instanceof Error ? retryError.message : String(retryError);\n const summary = buildGenericSummary(`Clean reinstall failed: ${retryReason}`);\n\n noteGenericError(clack, summary, context, deps);\n\n return { installed: false, reason: summary };\n }\n}\n\nasync function handlePeerDepFailure (\n clack: ClackLike,\n deps: readonly string[],\n autoConfirm: boolean,\n installer: DependencyInstaller,\n reason: string,\n context: WipeContext\n): Promise<InstallOutcome> {\n const confirmed = await confirmPeerDepWipe(clack, autoConfirm);\n\n if (!confirmed) {\n noteError(clack, 'Install failed: ', reason, context, deps);\n\n return { installed: false, reason };\n }\n\n performFullWipe(clack, context);\n\n return tryRetryInstall(clack, installer, deps, context);\n}\n\nasync function handleGenericFailure (\n clack: ClackLike,\n deps: readonly string[],\n autoConfirm: boolean,\n installer: DependencyInstaller,\n reason: string,\n context: WipeContext\n): Promise<InstallOutcome> {\n const summary = buildGenericSummary(reason);\n const confirmed = await confirmCleanReinstall(clack, autoConfirm, summary);\n\n if (!confirmed) {\n if (clack.note) {\n clack.note(\n `${summary}\\nSkipping clean reinstall. Please resolve the issue manually and re-run.`,\n 'Error'\n );\n }\n\n return { installed: false, reason: summary };\n }\n\n performFullWipe(clack, context);\n\n return tryGenericRetryInstall(clack, installer, deps, context);\n}\n\n/**\n * Installs the dependencies, offering one wipe-and-retry when the first attempt fails, and reports\n * whether they ended up installed. Every failure path is already explained to the consumer through\n * `clack`, so the outcome exists for the caller's exit code rather than for a second message.\n * @example\n * const outcome = await installWithRetry(options);\n * if (!outcome.installed) { return 1; }\n */\nexport async function installWithRetry (opts: InstallWithRetryOptions): Promise<InstallOutcome> {\n const installer = opts.installer ?? defaultInstaller;\n const fs = opts.fsOps ?? defaultWipeFs();\n\n try {\n await installer(opts.deps);\n\n return { installed: true };\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n const context: WipeContext = {\n dir: opts.cwd,\n fs,\n detected: detectLockfile(opts.cwd, fs.exists),\n };\n\n if (isPeerDepFailure(reason)) {\n return handlePeerDepFailure(opts.clack, opts.deps, opts.autoConfirm, installer, reason, context);\n }\n\n return handleGenericFailure(opts.clack, opts.deps, opts.autoConfirm, installer, reason, context);\n }\n}\n","const DEFAULT_INDENT = ' ';\n\n/**\n * The indentation a JSON source already uses, as the string `JSON.stringify` takes for its third\n * argument. A width would be wrong: `JSON.stringify` emits that many *spaces*, so a tab-indented\n * manifest comes back re-indented with spaces and every line of it shows up in the diff.\n * @example\n * detectIndent('{\\n\\t\"name\": \"app\"\\n}'); // '\\t'\n * @example\n * detectIndent('{\"name\":\"app\"}', ' '); // ' '\n */\nexport function detectIndent (raw: string, fallback: string = DEFAULT_INDENT): string {\n const match = /\\n([\\t ]+)\\S/u.exec(raw);\n\n return match ? match[1] : fallback;\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('detectIndent', () => {\n test('returns the tab a tab-indented manifest uses', () => {\n expect(detectIndent('{\\n\\t\"name\": \"app\"\\n}\\n')).toBe('\\t');\n });\n\n test('returns the two spaces a two-space manifest uses', () => {\n expect(detectIndent('{\\n \"name\": \"app\"\\n}\\n')).toBe(' ');\n });\n\n // A width read as \"characters between the first newline and the first non-space\" counts the\n // blank line itself, so this source measured 3 and re-indented the whole file.\n test('measures the first indented line, not the blank line before it', () => {\n expect(detectIndent('{\\n\\n \"name\": \"app\"\\n}\\n')).toBe(' ');\n });\n\n // A tsconfig is JSON with comments, so the first indented line need not open with a quote.\n test('measures an indented comment line', () => {\n expect(detectIndent('{\\n // why\\n\"compilerOptions\": {}\\n}\\n')).toBe(' ');\n });\n\n test('falls back when nothing in the source is indented', () => {\n expect(detectIndent('{\"name\":\"app\"}')).toBe(' ');\n });\n\n test('uses the caller fallback instead of the default', () => {\n expect(detectIndent('{\"name\":\"app\"}', ' ')).toBe(' ');\n });\n });\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { detectIndent } from './detectIndent';\n\nexport type LayoutExtension = 'mts' | 'ts';\n\nexport interface LintLayoutFile {\n filename: string;\n source: string;\n}\n\nexport interface LintLayout {\n extension: LayoutExtension;\n lintModule: string;\n oxlintConfig: string;\n eslintConfig: string;\n replacedEslintConfigs: string[];\n}\n\n// `--disable-nested-config` is not a preference. The emitted oxlint config carries root-only\n// `options` keys, and oxlint aborts the whole run when it discovers them in a config below the\n// invocation directory — which is exactly what a monorepo whose packages each ran this CLI looks\n// like. Disabling nested discovery also makes the config's own `ignorePatterns` authoritative;\n// without it a nested config resurrects a directory the parent ignored.\nexport const OXLINT_COMMAND = 'oxlint --disable-nested-config';\n\nexport const OXLINT_LINT_SCRIPT = `${OXLINT_COMMAND} && eslint .`;\n\n/**\n * Extension for the lint module and the oxlint config. oxlint only discovers `oxlint.config.ts` and\n * `oxlint.config.mts`, and Node warns on a bare `.ts` file inside a package that declares no\n * `\"type\"`, so such a consumer gets the unambiguous `.mts` form.\n * @example\n * resolveLayoutExtension('/repo'); // 'ts' when /repo/package.json declares \"type\": \"module\"\n */\nexport function resolveLayoutExtension (cwd: string): LayoutExtension {\n try {\n const raw = readFileSync(join(cwd, 'package.json'), 'utf8');\n const manifest = JSON.parse(raw) as { type?: string };\n\n return manifest.type === 'module' ? 'ts' : 'mts';\n } catch {\n return 'mts';\n }\n}\n\n// ESLint routes a `.ts`/`.mts`/`.cts` config through jiti, which resolves the lint module's\n// TypeScript extension on every Node version. A `.js`/`.mjs`/`.cjs` config is loaded by Node\n// directly, so importing `./insider.lint.ts` from one depends on Node's type stripping being\n// unflagged (>=22.18) and fails outright on Node 20 with ERR_UNKNOWN_FILE_EXTENSION. Verified\n// against ESLint 9.39.5 on Node 20.20 / 22.13 / 22.23 / 24.20 by tests/lintLayoutLoading.spec.ts.\nconst ESLINT_CONFIG_EXTENSIONS: readonly string[] = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];\nconst TYPESCRIPT_CONFIG_EXTENSIONS: ReadonlySet<string> = new Set(['cts', 'mts', 'ts']);\n\nfunction extensionOf (filename: string): string {\n return filename.slice(filename.lastIndexOf('.') + 1);\n}\n\nfunction existingEslintConfigs (cwd: string): string[] {\n return ESLINT_CONFIG_EXTENSIONS\n .map(extension => `eslint.config.${extension}`)\n .filter(filename => existsSync(join(cwd, filename)));\n}\n\n/**\n * The three filenames `useInsider()` requires, resolved against a consumer directory. A JavaScript\n * flat config is renamed to the TypeScript extension — it cannot import the lint module on every\n * supported Node version — and every other `eslint.config.*` in the directory is reported through\n * `replacedEslintConfigs` so the caller deletes it. ESLint resolves `.js`/`.mjs`/`.cjs` before the\n * TypeScript extensions, so a leftover JavaScript config keeps winning over the one just written.\n * @example\n * resolveLintLayout('/repo');\n * // { eslintConfig: 'eslint.config.ts', replacedEslintConfigs: ['eslint.config.js'], ... }\n */\nexport function resolveLintLayout (cwd: string): LintLayout {\n const extension = resolveLayoutExtension(cwd);\n const existing = existingEslintConfigs(cwd);\n const loadable = existing.find(filename => TYPESCRIPT_CONFIG_EXTENSIONS.has(extensionOf(filename)));\n const eslintConfig = loadable ?? `eslint.config.${extension}`;\n\n return {\n extension,\n lintModule: `insider.lint.${extension}`,\n oxlintConfig: `oxlint.config.${extension}`,\n eslintConfig,\n replacedEslintConfigs: existing.filter(filename => filename !== eslintConfig),\n };\n}\n\n/**\n * Body of the generated `eslint.config.*`. The import names the lint module's real extension\n * because neither linter's loader applies TypeScript's `.js` → `.ts` specifier rewriting.\n * @example\n * renderEslintConfigFile('insider.lint.ts'); // \"import { useInsiderESLint } from './insider.lint.ts';\\n…\"\n */\nexport function renderEslintConfigFile (lintModule: string): string {\n return [\n `import { useInsiderESLint } from './${lintModule}';`,\n '',\n 'export default useInsiderESLint();',\n '',\n ].join('\\n');\n}\n\n/**\n * Body of the generated `oxlint.config.*`.\n * @example\n * renderOxlintConfigFile('insider.lint.mts'); // \"…export default await useInsiderOXC();\\n\"\n */\nexport function renderOxlintConfigFile (lintModule: string): string {\n return [\n `import { useInsiderOXC } from './${lintModule}';`,\n '',\n 'export default await useInsiderOXC();',\n '',\n ].join('\\n');\n}\n\n/**\n * The two thin files that sit beside a lint module, ready to write.\n * @example\n * renderLintLayoutFiles(resolveLintLayout('/repo')).map(file => file.filename);\n * // ['eslint.config.mts', 'oxlint.config.mts']\n */\nexport function renderLintLayoutFiles (layout: LintLayout): LintLayoutFile[] {\n return [\n { filename: layout.eslintConfig, source: renderEslintConfigFile(layout.lintModule) },\n { filename: layout.oxlintConfig, source: renderOxlintConfigFile(layout.lintModule) },\n ];\n}\n\ninterface ScriptedManifest {\n scripts?: Record<string, string>;\n}\n\nexport interface LintScriptChange {\n script: string;\n previous: string;\n next: string;\n}\n\nexport type LintScriptUnresolvedReason = 'lint-script-runs-neither';\n\nexport interface LintScriptCandidate {\n script: string;\n previous: string;\n}\n\nexport interface LintScriptResult {\n manifest: string;\n changed: boolean;\n changes: LintScriptChange[];\n alreadyRunsOxlint: string[];\n skipped: LintScriptCandidate[];\n unresolved?: { reason: LintScriptUnresolvedReason; script: string; previous: string };\n}\n\nconst DEFAULT_MANIFEST_INDENT = ' ';\nconst SEGMENT_SEPARATOR = /&&|\\|\\||[;|]/u;\nconst ASSIGNMENT = /^[A-Za-z_]\\w*=/u;\nconst WRAPPER_COMMANDS: ReadonlySet<string> = new Set([\n 'bunx',\n 'cross-env',\n 'dotenv',\n 'exec',\n 'npx',\n 'pnpm',\n 'run',\n 'yarn',\n]);\nconst AGGREGATE_COMMANDS: ReadonlySet<string> = new Set([\n 'concurrently',\n 'npm-run-all',\n 'npm-run-all2',\n 'run-p',\n 'run-s',\n]);\nconst SCRIPT_RUNNERS: ReadonlySet<string> = new Set(['bun', 'npm', 'pnpm', 'yarn']);\n\nfunction baseName (token: string): string {\n const withoutDirectory = token.slice(token.lastIndexOf('/') + 1);\n\n return withoutDirectory.replace(/\\.[mc]?js$/u, '');\n}\n\nfunction segmentsOf (command: string): string[] {\n return command\n .split(SEGMENT_SEPARATOR)\n .map(segment => segment.trim())\n .filter(segment => segment.length > 0);\n}\n\nfunction tokensOf (segment: string): string[] {\n return segment.split(/\\s+/u).filter(token => token.length > 0 && !ASSIGNMENT.test(token));\n}\n\n// A lint script is usually a small pipeline of wrappers (`cross-env`, `npx`, `pnpm exec`) in front of\n// the binary that matters, so the command word is the first token that is not one of those.\nfunction commandWordOf (segment: string): string | null {\n const words = tokensOf(segment).map(baseName);\n const found = words.find(word => !word.startsWith('-') && !WRAPPER_COMMANDS.has(word));\n\n return found ?? null;\n}\n\n/**\n * Whether a package script really invokes the `eslint` binary, as opposed to delegating to another\n * script that does. `npm run lint:es` is not an ESLint invocation; `NODE_OPTIONS=… eslint .` is.\n * @example\n * invokesBinary('npm run lint:es-ci -- --cache', 'eslint'); // false\n */\nexport function invokesBinary (command: string, binary: string): boolean {\n return segmentsOf(command).some(segment => commandWordOf(segment) === binary);\n}\n\n/**\n * Whether a script only fans out to other package scripts (`run-p`, `npm-run-all`, `npm run …`).\n * Such a script is never the place to add oxlint — the leaf that runs ESLint is.\n * @example\n * isAggregateScript('run-p lint:type lint:es lint:style'); // true\n */\nexport function isAggregateScript (command: string): boolean {\n return segmentsOf(command).some(segment => {\n const words = tokensOf(segment).map(baseName);\n const [first, second] = words;\n\n if (first && AGGREGATE_COMMANDS.has(first)) {\n return true;\n }\n\n return Boolean(first && SCRIPT_RUNNERS.has(first) && second === 'run');\n });\n}\n\nfunction oxlintPrefixFor (command: string): string {\n return tokensOf(command).includes('--fix') ? `${OXLINT_COMMAND} --fix` : OXLINT_COMMAND;\n}\n\nconst CANONICAL_LINT_SCRIPT = 'lint';\n\nfunction referencedScripts (command: string, names: ReadonlySet<string>): string[] {\n return tokensOf(command)\n .map(token => token.replace(/^[\"']|[\"']$/gu, '').replace(/^npm:/u, ''))\n .filter(token => names.has(token));\n}\n\nfunction collectReachable (\n scripts: Record<string, string>,\n names: ReadonlySet<string>,\n script: string,\n seen: Set<string>\n): void {\n if (seen.has(script)) {\n return;\n }\n\n seen.add(script);\n\n referencedScripts(scripts[script] ?? '', names).forEach(next => {\n collectReachable(scripts, names, next, seen);\n });\n}\n\n// The entry point a repo designates by naming it `lint`, plus everything that entry point delegates\n// to. It is what keeps a composed `run-p lint:type lint:es lint:style` resolving to its `lint:es-ci`\n// leaf while leaving sibling entry points such as `lint:fix` and `lint:ci` out of the running.\nfunction reachableFromLint (scripts: Record<string, string>): Set<string> {\n const names = new Set(Object.keys(scripts));\n const seen = new Set<string>();\n\n if (names.has(CANONICAL_LINT_SCRIPT)) {\n collectReachable(scripts, names, CANONICAL_LINT_SCRIPT, seen);\n }\n\n return seen;\n}\n\nfunction fixingRank (candidate: LintScriptCandidate): number {\n return tokensOf(candidate.previous).includes('--fix') ? 1 : 0;\n}\n\nfunction compareCandidates (left: LintScriptCandidate, right: LintScriptCandidate): number {\n return fixingRank(left) - fixingRank(right)\n || left.script.length - right.script.length\n || left.script.localeCompare(right.script);\n}\n\n// oxlint belongs in front of ESLint once, not in front of every script that happens to run it: a\n// repo whose `lint`, `lint:fix` and `lint:ci` each invoke `eslint` would otherwise run oxlint three\n// times over the same tree. The scripts left out are reported so nothing is dropped silently.\nfunction selectTarget (\n scripts: Record<string, string>,\n candidates: readonly LintScriptCandidate[]\n): LintScriptCandidate | null {\n if (candidates.length === 0) {\n return null;\n }\n\n const reachable = reachableFromLint(scripts);\n const preferred = candidates.filter(candidate => reachable.has(candidate.script));\n const pool = preferred.length > 0 ? preferred : candidates;\n\n return [...pool].sort(compareCandidates)[0];\n}\n\nfunction planChanges (scripts: Record<string, string>): {\n changes: LintScriptChange[];\n alreadyRunsOxlint: string[];\n skipped: LintScriptCandidate[];\n} {\n const alreadyRunsOxlint: string[] = [];\n const candidates: LintScriptCandidate[] = [];\n\n Object.entries(scripts).forEach(([script, previous]) => {\n if (!invokesBinary(previous, 'eslint')) {\n return;\n }\n\n if (invokesBinary(previous, 'oxlint')) {\n alreadyRunsOxlint.push(script);\n\n return;\n }\n\n candidates.push({ script, previous });\n });\n\n const target = selectTarget(scripts, candidates);\n\n if (!target) {\n return { changes: [], alreadyRunsOxlint, skipped: [] };\n }\n\n return {\n changes: [{\n script: target.script,\n previous: target.previous,\n next: `${oxlintPrefixFor(target.previous)} && ${target.previous}`,\n }],\n alreadyRunsOxlint,\n skipped: candidates.filter(candidate => candidate.script !== target.script),\n };\n}\n\n/**\n * Adds oxlint beside the one script that actually runs ESLint, by prepending to it rather than\n * replacing it — so a composed `lint` such as `run-p lint:type lint:es lint:style` keeps its\n * type-check and stylelint passes and only its `lint:es-ci` leaf is rewritten. Sibling entry points\n * that also run ESLint (`lint:fix`, `lint:ci`) are reported through `skipped` rather than rewritten,\n * so oxlint runs once per lint pass. Never rewrites a script it did not author: when nothing invokes\n * `eslint` and a `lint` script already exists, the manifest is left alone and the conflict reported.\n * @example\n * setLintScript('{\"scripts\":{\"lint\":\"eslint .\"}}').changes;\n * // [{ script: 'lint', previous: 'eslint .', next: 'oxlint --disable-nested-config && eslint .' }]\n */\nexport function setLintScript (rawManifest: string): LintScriptResult {\n let parsed: ScriptedManifest;\n\n try {\n parsed = JSON.parse(rawManifest) as ScriptedManifest;\n } catch {\n return { manifest: rawManifest, changed: false, changes: [], alreadyRunsOxlint: [], skipped: [] };\n }\n\n const scripts = parsed.scripts ?? {};\n const { changes, alreadyRunsOxlint, skipped } = planChanges(scripts);\n const existingLint = scripts.lint as string | undefined;\n\n if (changes.length === 0 && alreadyRunsOxlint.length === 0) {\n if (existingLint !== undefined) {\n return {\n manifest: rawManifest,\n changed: false,\n changes: [],\n alreadyRunsOxlint: [],\n skipped: [],\n unresolved: { reason: 'lint-script-runs-neither', script: 'lint', previous: existingLint },\n };\n }\n\n changes.push({ script: 'lint', previous: '', next: OXLINT_LINT_SCRIPT });\n }\n\n if (changes.length === 0) {\n return { manifest: rawManifest, changed: false, changes: [], alreadyRunsOxlint, skipped };\n }\n\n parsed.scripts = { ...scripts };\n\n changes.forEach(change => {\n (parsed.scripts as Record<string, string>)[change.script] = change.next;\n });\n\n return {\n manifest: `${JSON.stringify(parsed, null, detectIndent(rawManifest, DEFAULT_MANIFEST_INDENT))}\\n`,\n changed: true,\n changes,\n alreadyRunsOxlint,\n skipped,\n };\n}\n\n/**\n * The scripts that still run ESLint alone, for the CLI to print. Each line carries the oxlint prefix\n * that script would need, so a consumer who wants oxlint on a second entry point can paste it.\n * @example\n * formatSkippedLintScripts([{ script: 'lint:fix', previous: 'eslint . --fix' }]);\n * // 'lint:fix\\n prefix with: oxlint --disable-nested-config --fix && '\n */\nexport function formatSkippedLintScripts (skipped: readonly LintScriptCandidate[]): string {\n return skipped\n .map(candidate => `${candidate.script}\\n prefix with: ${oxlintPrefixFor(candidate.previous)} && `)\n .join('\\n\\n');\n}\n\n/**\n * One line per rewritten script, for the CLI to print. The previous command survives verbatim inside\n * the new one, so the report doubles as the recovery instructions.\n * @example\n * formatLintScriptChanges([{ script: 'lint:es-ci', previous: 'eslint .', next: 'oxlint && eslint .' }]);\n * // 'lint:es-ci\\n before: eslint .\\n after: oxlint && eslint .'\n */\nexport function formatLintScriptChanges (changes: readonly LintScriptChange[]): string {\n return changes\n .map(change => [\n change.script,\n ` before: ${change.previous === '' ? '(no such script)' : change.previous}`,\n ` after: ${change.next}`,\n ].join('\\n'))\n .join('\\n\\n');\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n const { mkdtempSync, writeFileSync } = await import('node:fs');\n const { tmpdir } = await import('node:os');\n\n function parseScripts (raw: string): Record<string, string> {\n return (JSON.parse(raw) as ScriptedManifest).scripts ?? {};\n }\n\n function makeDir (manifest?: string, files: Record<string, string> = {}): string {\n const directory = mkdtempSync(join(tmpdir(), 'insider-layout-'));\n\n if (manifest !== undefined) {\n writeFileSync(join(directory, 'package.json'), manifest);\n }\n\n Object.entries(files).forEach(([name, content]) => {\n writeFileSync(join(directory, name), content, 'utf8');\n });\n\n return directory;\n }\n\n // The script set of a real v3 consumer: `lint` fans out, and the only script that actually runs\n // ESLint is two hops down. Overwriting `lint` here would drop vue-tsc and stylelint silently.\n const COMPOSED_SCRIPTS = {\n lint: 'run-p lint:type lint:es lint:style',\n 'lint:es': 'npm run lint:es-ci -- --cache',\n 'lint:es-ci': 'NODE_OPTIONS=--max-old-space-size=6144 eslint .',\n 'lint:style': 'npm run lint:style-ci -- --cache',\n 'lint:style-ci': 'stylelint \"src/**/*.{css,scss,vue}\"',\n 'lint:type': 'run-p lint:type:app lint:type:test lint:type:node',\n 'lint:type:app': 'vue-tsc -p tsconfig.app.json --noEmit',\n };\n\n describe('resolveLayoutExtension', () => {\n test('uses .ts inside an ESM package', () => {\n expect(resolveLayoutExtension(makeDir('{\"type\":\"module\"}'))).toBe('ts');\n });\n\n test('uses .mts when the manifest declares no type', () => {\n expect(resolveLayoutExtension(makeDir('{\"name\":\"app\"}'))).toBe('mts');\n });\n\n test('uses .mts when there is no manifest at all', () => {\n expect(resolveLayoutExtension(makeDir())).toBe('mts');\n });\n\n test('uses .mts when the manifest is unparseable', () => {\n expect(resolveLayoutExtension(makeDir('{'))).toBe('mts');\n });\n });\n\n describe('resolveLintLayout', () => {\n test('derives all three filenames from the package type', () => {\n const layout = resolveLintLayout(makeDir('{\"type\":\"module\"}'));\n\n expect(layout.lintModule).toBe('insider.lint.ts');\n expect(layout.oxlintConfig).toBe('oxlint.config.ts');\n expect(layout.eslintConfig).toBe('eslint.config.ts');\n expect(layout.replacedEslintConfigs).toStrictEqual([]);\n });\n\n test.each(['js', 'mjs', 'cjs'])(\n 'renames an existing eslint.config.%s, which cannot import the lint module on Node 20',\n extension => {\n const directory = makeDir('{\"type\":\"module\"}', {\n [`eslint.config.${extension}`]: 'export default [];\\n',\n });\n const layout = resolveLintLayout(directory);\n\n expect(layout.eslintConfig).toBe('eslint.config.ts');\n expect(layout.replacedEslintConfigs).toStrictEqual([`eslint.config.${extension}`]);\n }\n );\n\n test.each(['ts', 'mts', 'cts'])('keeps an existing eslint.config.%s, which jiti loads', extension => {\n const directory = makeDir('{\"type\":\"module\"}', {\n [`eslint.config.${extension}`]: 'export default [];\\n',\n });\n const layout = resolveLintLayout(directory);\n\n expect(layout.eslintConfig).toBe(`eslint.config.${extension}`);\n expect(layout.replacedEslintConfigs).toStrictEqual([]);\n });\n\n test('supersedes a JavaScript config that survived beside a TypeScript one', () => {\n const directory = makeDir('{\"type\":\"module\"}', {\n 'eslint.config.mjs': 'export default [];\\n',\n 'eslint.config.mts': 'export default [];\\n',\n });\n const layout = resolveLintLayout(directory);\n\n expect(layout.eslintConfig).toBe('eslint.config.mts');\n expect(layout.replacedEslintConfigs).toStrictEqual(['eslint.config.mjs']);\n });\n\n test('supersedes every JavaScript config in the directory, not just the first one', () => {\n const directory = makeDir('{\"type\":\"module\"}', {\n 'eslint.config.cjs': 'module.exports = [];\\n',\n 'eslint.config.js': 'module.exports = [];\\n',\n 'eslint.config.mjs': 'export default [];\\n',\n });\n const layout = resolveLintLayout(directory);\n\n expect(layout.eslintConfig).toBe('eslint.config.ts');\n expect([...layout.replacedEslintConfigs].sort((a, b) => a.localeCompare(b))).toStrictEqual([\n 'eslint.config.cjs',\n 'eslint.config.js',\n 'eslint.config.mjs',\n ]);\n });\n\n test('uses the .mts config name in a package that declares no type', () => {\n expect(resolveLintLayout(makeDir('{\"name\":\"app\"}')).eslintConfig).toBe('eslint.config.mts');\n });\n });\n\n describe('renderLintLayoutFiles', () => {\n test('imports the lint module by its real extension', () => {\n const layout = resolveLintLayout(makeDir('{\"name\":\"app\"}'));\n const [eslintFile, oxlintFile] = renderLintLayoutFiles(layout);\n\n expect(eslintFile.source).toContain(\"from './insider.lint.mts'\");\n expect(oxlintFile.source).toContain(\"from './insider.lint.mts'\");\n });\n\n test('awaits the oxlint renderer and calls the ESLint one directly', () => {\n const [eslintFile, oxlintFile] = renderLintLayoutFiles(resolveLintLayout(makeDir()));\n\n expect(eslintFile.source).toContain('export default useInsiderESLint();');\n expect(oxlintFile.source).toContain('export default await useInsiderOXC();');\n });\n });\n\n describe('invokesBinary', () => {\n test.each([\n 'eslint .',\n 'NODE_OPTIONS=--max-old-space-size=6144 eslint .',\n 'npx eslint .',\n 'pnpm exec eslint .',\n 'cross-env NODE_ENV=test eslint src',\n './node_modules/.bin/eslint .',\n 'tsc --noEmit && eslint .',\n ])('sees the eslint invocation in %j', command => {\n expect(invokesBinary(command, 'eslint')).toBe(true);\n });\n\n test.each([\n 'npm run lint:es-ci -- --cache',\n 'run-p lint:type lint:es lint:style',\n 'vue-tsc -p tsconfig.app.json --noEmit',\n 'stylelint \"src/**/*.css\"',\n 'echo eslint-config',\n ])('does not see an eslint invocation in %j', command => {\n expect(invokesBinary(command, 'eslint')).toBe(false);\n });\n\n test('distinguishes oxlint from eslint', () => {\n expect(invokesBinary(OXLINT_LINT_SCRIPT, 'oxlint')).toBe(true);\n expect(invokesBinary('eslint .', 'oxlint')).toBe(false);\n });\n\n test('returns false for a segment made only of assignments', () => {\n expect(invokesBinary('FOO=1', 'eslint')).toBe(false);\n });\n });\n\n describe('isAggregateScript', () => {\n test.each([\n 'run-p lint:type lint:es lint:style',\n 'run-s a b',\n 'npm-run-all --parallel a b',\n 'npm run lint:es-ci -- --cache',\n 'pnpm run build',\n 'concurrently \"npm:a\" \"npm:b\"',\n ])('recognizes %j as an aggregate', command => {\n expect(isAggregateScript(command)).toBe(true);\n });\n\n test.each(['eslint .', 'oxlint --disable-nested-config && eslint .'])(\n 'does not treat %j as an aggregate',\n command => {\n expect(isAggregateScript(command)).toBe(false);\n }\n );\n });\n\n describe('setLintScript', () => {\n test('passes --disable-nested-config so a nested consumer config cannot abort the run', () => {\n expect(OXLINT_LINT_SCRIPT).toContain('--disable-nested-config');\n });\n\n test('prepends to an ESLint-only lint script', () => {\n const result = setLintScript('{\\n \"scripts\": {\\n \"lint\": \"eslint .\"\\n }\\n}');\n\n expect(result.changed).toBe(true);\n expect(result.changes).toStrictEqual([\n { script: 'lint', previous: 'eslint .', next: OXLINT_LINT_SCRIPT },\n ]);\n expect(parseScripts(result.manifest).lint).toBe(OXLINT_LINT_SCRIPT);\n });\n\n test('leaves a composed lint script alone and targets the script that runs eslint', () => {\n const result = setLintScript(JSON.stringify({ scripts: COMPOSED_SCRIPTS }, null, 2));\n const scripts = parseScripts(result.manifest);\n\n expect(result.changes).toStrictEqual([{\n script: 'lint:es-ci',\n previous: 'NODE_OPTIONS=--max-old-space-size=6144 eslint .',\n next: `${OXLINT_COMMAND} && NODE_OPTIONS=--max-old-space-size=6144 eslint .`,\n }]);\n expect(scripts.lint).toBe('run-p lint:type lint:es lint:style');\n expect(scripts['lint:style']).toBe('npm run lint:style-ci -- --cache');\n expect(scripts['lint:type']).toBe('run-p lint:type:app lint:type:test lint:type:node');\n });\n\n test('keeps a `--` passthrough landing on eslint by prepending rather than appending', () => {\n const result = setLintScript(JSON.stringify({ scripts: COMPOSED_SCRIPTS }));\n const rewritten = parseScripts(result.manifest)['lint:es-ci'];\n\n expect(`${rewritten} --cache`.endsWith('eslint . --cache')).toBe(true);\n });\n\n test('preserves the previous command verbatim inside the new one', () => {\n const result = setLintScript('{\"scripts\":{\"lint:es\":\"eslint . --max-warnings 0\"}}');\n\n expect(parseScripts(result.manifest)['lint:es'])\n .toBe(`${OXLINT_COMMAND} && eslint . --max-warnings 0`);\n });\n\n test('passes --fix through to oxlint for a fixing script', () => {\n const result = setLintScript('{\"scripts\":{\"lint:fix\":\"eslint . --fix\"}}');\n\n expect(parseScripts(result.manifest)['lint:fix'])\n .toBe(`${OXLINT_COMMAND} --fix && eslint . --fix`);\n });\n\n // Prepending to every script that runs ESLint made oxlint run once per entry point — three\n // times over the same tree for a repo with `lint`, `lint:fix` and `lint:ci`.\n test('rewrites one script only, and reports the siblings it left alone', () => {\n const result = setLintScript(JSON.stringify({\n scripts: {\n lint: 'eslint .',\n 'lint:fix': 'eslint . --fix',\n 'lint:ci': 'eslint . -f json -o report.json',\n },\n }));\n const scripts = parseScripts(result.manifest);\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint']);\n expect(scripts.lint).toBe(OXLINT_LINT_SCRIPT);\n expect(scripts['lint:fix']).toBe('eslint . --fix');\n expect(scripts['lint:ci']).toBe('eslint . -f json -o report.json');\n expect(result.skipped.map(candidate => candidate.script))\n .toStrictEqual(['lint:fix', 'lint:ci']);\n });\n\n test('prefers the entry point named `lint` over a shorter sibling', () => {\n const result = setLintScript('{\"scripts\":{\"es\":\"eslint .\",\"lint\":\"eslint .\"}}');\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint']);\n expect(result.skipped.map(candidate => candidate.script)).toStrictEqual(['es']);\n });\n\n test('prefers what `lint` delegates to over an unrelated entry point', () => {\n const result = setLintScript(JSON.stringify({\n scripts: {\n check: 'eslint src',\n lint: 'run-p lint:style lint:es',\n 'lint:es': 'eslint .',\n 'lint:style': 'stylelint \"src/**/*.css\"',\n },\n }));\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:es']);\n });\n\n test('prefers the non-fixing script when no entry point is named `lint`', () => {\n const result = setLintScript('{\"scripts\":{\"fix\":\"eslint . --fix\",\"lint:es\":\"eslint .\"}}');\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:es']);\n expect(result.skipped.map(candidate => candidate.script)).toStrictEqual(['fix']);\n });\n\n test('breaks a tie on the script name, so the pick does not depend on key order', () => {\n const result = setLintScript('{\"scripts\":{\"lint:b\":\"eslint .\",\"lint:a\":\"eslint .\"}}');\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:a']);\n });\n\n test('still targets the composed leaf rather than the `lint` entry point itself', () => {\n const result = setLintScript(JSON.stringify({\n scripts: { ...COMPOSED_SCRIPTS, 'lint:fix': 'eslint . --fix' },\n }));\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:es-ci']);\n expect(result.skipped.map(candidate => candidate.script)).toStrictEqual(['lint:fix']);\n });\n\n test('follows a `concurrently` fan-out to the leaf it names', () => {\n const result = setLintScript(JSON.stringify({\n scripts: {\n lint: 'concurrently \"npm:lint:es\" \"npm:lint:style\"',\n 'lint:es': 'eslint .',\n 'lint:style': 'stylelint \"src/**/*.css\"',\n 'lint:fix': 'eslint . --fix',\n },\n }));\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:es']);\n });\n\n test('reports nothing skipped when a single script runs eslint', () => {\n expect(setLintScript('{\"scripts\":{\"lint\":\"eslint .\"}}').skipped).toStrictEqual([]);\n });\n\n test('adds a lint script when the manifest has none', () => {\n const result = setLintScript('{\"name\":\"app\"}');\n\n expect(parseScripts(result.manifest).lint).toBe(OXLINT_LINT_SCRIPT);\n expect(result.changes[0].previous).toBe('');\n });\n\n test('leaves a script that already runs oxlint alone', () => {\n const raw = '{\"scripts\":{\"lint\":\"oxlint && eslint . --max-warnings 0\"}}';\n\n expect(setLintScript(raw)).toStrictEqual({\n manifest: raw,\n changed: false,\n changes: [],\n alreadyRunsOxlint: ['lint'],\n skipped: [],\n });\n });\n\n test('never replaces a lint script that runs neither linter; reports the conflict instead', () => {\n const raw = '{\"scripts\":{\"lint\":\"biome check .\"}}';\n const result = setLintScript(raw);\n\n expect(result.changed).toBe(false);\n expect(result.manifest).toBe(raw);\n expect(result.unresolved).toStrictEqual({\n reason: 'lint-script-runs-neither',\n script: 'lint',\n previous: 'biome check .',\n });\n });\n\n test('never replaces a composed lint script whose leaves do not run eslint', () => {\n const raw = '{\"scripts\":{\"lint\":\"run-p lint:type lint:style\",\"lint:type\":\"vue-tsc --noEmit\"}}';\n\n expect(setLintScript(raw).unresolved?.previous).toBe('run-p lint:type lint:style');\n });\n\n test('leaves an unparseable manifest untouched', () => {\n expect(setLintScript('{').changed).toBe(false);\n });\n\n test('preserves the manifest indentation', () => {\n const result = setLintScript('{\\n \"scripts\": {\\n \"lint\": \"eslint .\"\\n }\\n}');\n\n expect(result.manifest).toContain('\\n \"scripts\"');\n });\n\n test('falls back to two spaces when the manifest indents nothing', () => {\n const result = setLintScript('{\\n\"scripts\":{\"lint\":\"eslint .\"}\\n}');\n\n expect(result.manifest).toContain('{\\n \"scripts\": {\\n \"lint\": \"');\n });\n\n test('keeps the original script order', () => {\n const result = setLintScript(JSON.stringify({ scripts: COMPOSED_SCRIPTS }));\n\n expect(Object.keys(parseScripts(result.manifest))).toStrictEqual(Object.keys(COMPOSED_SCRIPTS));\n });\n });\n\n describe('formatSkippedLintScripts', () => {\n test('names each untouched script with the prefix it would need', () => {\n const report = formatSkippedLintScripts(setLintScript(JSON.stringify({\n scripts: { lint: 'eslint .', 'lint:fix': 'eslint . --fix' },\n })).skipped);\n\n expect(report).toBe(`lint:fix\\n prefix with: ${OXLINT_COMMAND} --fix && `);\n });\n\n test('renders nothing when every ESLint script was handled', () => {\n expect(formatSkippedLintScripts([])).toBe('');\n });\n });\n\n describe('formatLintScriptChanges', () => {\n test('reports both sides of every rewrite', () => {\n const report = formatLintScriptChanges(setLintScript(\n JSON.stringify({ scripts: COMPOSED_SCRIPTS })\n ).changes);\n\n expect(report).toContain('lint:es-ci');\n expect(report).toContain('before: NODE_OPTIONS=--max-old-space-size=6144 eslint .');\n expect(report).toContain(`after: ${OXLINT_COMMAND} && NODE_OPTIONS=`);\n });\n\n test('names an added script explicitly instead of showing an empty before', () => {\n expect(formatLintScriptChanges(setLintScript('{}').changes)).toContain('before: (no such script)');\n });\n });\n}\n","export function quote (value: string): string {\n // JSON.stringify already escapes backslashes and control characters; only the quoting style\n // has to be converted from double to single so the result is a valid JS string literal.\n const escaped = JSON.stringify(value)\n .slice(1, -1)\n .replace(/\\\\\"/g, '\"')\n .replace(/'/g, \"\\\\'\");\n\n return `'${escaped}'`;\n}\n","import { quote } from './quote';\n\nexport type ProjectType = 'backend' | 'browser' | 'hybrid';\n\nexport type Language = 'javascript' | 'typescript';\n\nexport type Languages = Language[];\n\nexport type Framework = 'vanilla' | 'vue';\n\nexport type VueMajor = 2 | 3;\n\nexport type VueApiStyle = 'options' | 'composition' | 'hybrid';\n\nexport type TestFramework = 'vitest' | 'jest' | 'none';\n\nexport type TsconfigRole = 'app' | 'test' | 'config';\n\nexport interface TsconfigRoleEntry {\n path: string;\n role: TsconfigRole;\n}\n\nexport interface TsconfigPlan {\n referencesOnly: boolean;\n entries: TsconfigRoleEntry[];\n}\n\nexport type VueHybridDefaultApi = 'composition' | 'options';\n\nexport interface VueHybridSuffixPlan {\n defaultApi: VueHybridDefaultApi;\n suffix: string;\n}\n\nexport interface VueHybridSuffixChoice {\n value: string;\n label: string;\n}\n\nconst COMPOSITION_DEFAULT_SUFFIX_CHOICES: readonly VueHybridSuffixChoice[] = [\n { value: '.options.vue', label: '*.options.vue' },\n { value: '.classic.vue', label: '*.classic.vue' },\n { value: '.legacy.vue', label: '*.legacy.vue' },\n];\n\nconst OPTIONS_DEFAULT_SUFFIX_CHOICES: readonly VueHybridSuffixChoice[] = [\n { value: '.composition.vue', label: '*.composition.vue' },\n { value: '.setup.vue', label: '*.setup.vue' },\n { value: '.modern.vue', label: '*.modern.vue' },\n];\n\nexport function getHybridSuffixChoices (defaultApi: VueHybridDefaultApi): readonly VueHybridSuffixChoice[] {\n return defaultApi === 'composition'\n ? COMPOSITION_DEFAULT_SUFFIX_CHOICES\n : OPTIONS_DEFAULT_SUFFIX_CHOICES;\n}\n\nexport function getHybridDefaultSuffix (defaultApi: VueHybridDefaultApi): string {\n return getHybridSuffixChoices(defaultApi)[0].value;\n}\n\nexport interface CliAnswers {\n projectType: ProjectType;\n languages: Languages;\n framework?: Framework;\n vueMajor?: VueMajor;\n vueApiStyle?: VueApiStyle;\n vueHybridSuffix?: VueHybridSuffixPlan;\n testFramework: TestFramework;\n extras: { jquery: boolean };\n tsconfig?: TsconfigPlan;\n}\n\ntype AppScope = | 'javascript'\n | 'javascriptDom'\n | 'javascriptNode'\n | 'typescript'\n | 'typescriptDom'\n | 'typescriptNode'\n | 'vue2'\n | 'vue3'\n | 'vue2Typescript'\n | 'vue3Typescript'\n | 'vue2OptionsApi'\n | 'vue3OptionsApi'\n | 'vue2TypescriptOptionsApi'\n | 'vue3TypescriptOptionsApi';\n\ntype TestScope = 'jest' | 'vitest';\n\ntype ExtraScope = 'jquery';\n\ninterface ScopeEntry {\n files: string[];\n ignores?: string[];\n tsconfigPaths?: string[];\n}\n\ninterface ScopedConfig {\n scope: AppScope | TestScope | ExtraScope | 'typescriptNode';\n entry: ScopeEntry;\n}\n\nconst indent = ' ';\n\nfunction hasJavascript (languages: Languages): boolean {\n return languages.includes('javascript');\n}\n\nfunction hasTypescript (languages: Languages): boolean {\n return languages.includes('typescript');\n}\n\nfunction isVueBrowserLike (answers: CliAnswers): boolean {\n return answers.framework === 'vue' && answers.projectType !== 'backend';\n}\n\nfunction isVueOptionsApi (answers: CliAnswers): boolean {\n return answers.vueApiStyle === 'options';\n}\n\nfunction isVueHybridApi (answers: CliAnswers): boolean {\n return answers.vueApiStyle === 'hybrid';\n}\n\nfunction vueJsScope (major: VueMajor, api: 'composition' | 'options'): AppScope {\n if (major === 2) {\n return api === 'options' ? 'vue2OptionsApi' : 'vue2';\n }\n\n return api === 'options' ? 'vue3OptionsApi' : 'vue3';\n}\n\nfunction vueTsScope (major: VueMajor, api: 'composition' | 'options'): AppScope {\n if (major === 2) {\n return api === 'options' ? 'vue2TypescriptOptionsApi' : 'vue2Typescript';\n }\n\n return api === 'options' ? 'vue3TypescriptOptionsApi' : 'vue3Typescript';\n}\n\nfunction jsAppScopes (answers: CliAnswers): AppScope[] {\n if (isVueBrowserLike(answers) && !hasTypescript(answers.languages)) {\n const major = answers.vueMajor ?? 3;\n\n return [vueJsScope(major, isVueOptionsApi(answers) ? 'options' : 'composition')];\n }\n\n if (answers.projectType === 'backend') {\n return ['javascriptNode'];\n }\n\n if (answers.projectType === 'hybrid') {\n return ['javascriptNode', 'javascriptDom'];\n }\n\n return ['javascriptDom'];\n}\n\nfunction tsAppScopes (answers: CliAnswers): AppScope[] {\n if (isVueBrowserLike(answers)) {\n const major = answers.vueMajor ?? 3;\n\n return [vueTsScope(major, isVueOptionsApi(answers) ? 'options' : 'composition')];\n }\n\n if (answers.projectType === 'backend') {\n return ['typescriptNode'];\n }\n\n if (answers.projectType === 'hybrid') {\n return ['typescriptNode', 'typescriptDom'];\n }\n\n return ['typescriptDom'];\n}\n\nfunction jsAppFiles (answers: CliAnswers): string[] {\n const vue = isVueBrowserLike(answers);\n\n if (vue && !hasTypescript(answers.languages)) {\n return ['**/*.{js,jsx,cjs,mjs,vue}'];\n }\n\n return ['**/*.{js,jsx,cjs,mjs}'];\n}\n\nexport function normalizeHybridSuffix (raw: string): string {\n const trimmed = raw.trim();\n const withDot = trimmed.startsWith('.') ? trimmed : `.${trimmed}`;\n\n return withDot.endsWith('.vue') ? withDot : `${withDot}.vue`;\n}\n\nfunction tsAppFiles (answers: CliAnswers, scoped: 'app' | 'all'): string[] {\n const vue = isVueBrowserLike(answers);\n const prefix = scoped === 'app' ? 'src/**/*' : '**/*';\n\n if (vue) {\n return [`${prefix}.{ts,tsx,vue}`];\n }\n\n return [`${prefix}.{ts,tsx}`];\n}\n\nfunction testFilesGlob (languages: Languages): string[] {\n const ts = hasTypescript(languages);\n const js = hasJavascript(languages);\n\n if (ts && js) {\n return ['**/*.{test,spec}.{ts,tsx,js,jsx}'];\n }\n\n if (ts) {\n return ['**/*.{test,spec}.{ts,tsx}'];\n }\n\n return ['**/*.{test,spec}.{js,jsx}'];\n}\n\nfunction jqueryFilesGlob (answers: CliAnswers): string[] {\n const vue = isVueBrowserLike(answers);\n const ts = hasTypescript(answers.languages);\n const js = hasJavascript(answers.languages);\n\n if (vue) {\n if (ts && js) {\n return ['**/*.{ts,tsx,js,jsx,cjs,mjs,vue}'];\n }\n\n if (ts) {\n return ['**/*.{ts,tsx,vue}'];\n }\n\n return ['**/*.{js,jsx,cjs,mjs,vue}'];\n }\n\n if (ts && js) {\n return ['**/*.{ts,tsx,js,jsx,cjs,mjs}'];\n }\n\n if (ts) {\n return ['**/*.{ts,tsx}'];\n }\n\n return ['**/*.{js,jsx,cjs,mjs}'];\n}\n\nfunction jsRootConfigFiles (): string[] {\n return ['*.js', '*.cjs', '*.mjs'];\n}\n\nfunction tsRootConfigFiles (): string[] {\n return ['*.ts', '*.cts', '*.mts'];\n}\n\nfunction findRole (plan: TsconfigPlan, role: TsconfigRole): TsconfigRoleEntry | undefined {\n return plan.entries.find(entry => entry.role === role);\n}\n\nfunction isHybridVueJsContext (answers: CliAnswers): boolean {\n return isVueBrowserLike(answers)\n && isVueHybridApi(answers)\n && !hasTypescript(answers.languages)\n && Boolean(answers.vueHybridSuffix);\n}\n\nfunction isHybridVueTsContext (answers: CliAnswers): boolean {\n return isVueBrowserLike(answers)\n && isVueHybridApi(answers)\n && hasTypescript(answers.languages)\n && Boolean(answers.vueHybridSuffix);\n}\n\nfunction buildHybridVueJsBlocks (answers: CliAnswers): ScopedConfig[] | null {\n if (!isHybridVueJsContext(answers) || !answers.vueHybridSuffix) {\n return null;\n }\n\n const major = answers.vueMajor ?? 3;\n const { defaultApi, suffix: rawSuffix } = answers.vueHybridSuffix;\n const suffix = normalizeHybridSuffix(rawSuffix);\n const targetGlob = `**/*${suffix}`;\n const nonDefaultApi: VueHybridDefaultApi = defaultApi === 'composition' ? 'options' : 'composition';\n const defaultEntry: ScopeEntry = {\n files: ['**/*.{js,jsx,cjs,mjs,vue}'],\n ignores: [targetGlob],\n };\n\n return [\n { scope: vueJsScope(major, defaultApi), entry: defaultEntry },\n { scope: vueJsScope(major, nonDefaultApi), entry: { files: [targetGlob] } },\n ];\n}\n\nfunction makeHybridTsEntries (\n answers: CliAnswers,\n suffix: string,\n appEntry: TsconfigRoleEntry | undefined\n): { defaultEntry: ScopeEntry; targetEntry: ScopeEntry } {\n const targetGlob = `**/*${suffix}`;\n const useAppGlob = answers.tsconfig?.referencesOnly === true && Boolean(appEntry);\n const baseFiles = tsAppFiles(answers, useAppGlob ? 'app' : 'all');\n const tsconfigPaths = appEntry ? [appEntry.path] : undefined;\n const defaultEntry: ScopeEntry = { files: baseFiles, ignores: [targetGlob] };\n const targetEntry: ScopeEntry = { files: [targetGlob] };\n\n if (tsconfigPaths) {\n defaultEntry.tsconfigPaths = tsconfigPaths;\n targetEntry.tsconfigPaths = tsconfigPaths;\n }\n\n return { defaultEntry, targetEntry };\n}\n\nfunction buildHybridVueTsBlocks (\n answers: CliAnswers,\n appEntry: TsconfigRoleEntry | undefined\n): ScopedConfig[] | null {\n if (!isHybridVueTsContext(answers) || !answers.vueHybridSuffix) {\n return null;\n }\n\n const major = answers.vueMajor ?? 3;\n const { defaultApi, suffix: rawSuffix } = answers.vueHybridSuffix;\n const suffix = normalizeHybridSuffix(rawSuffix);\n const nonDefaultApi: VueHybridDefaultApi = defaultApi === 'composition' ? 'options' : 'composition';\n const { defaultEntry, targetEntry } = makeHybridTsEntries(answers, suffix, appEntry);\n\n return [\n { scope: vueTsScope(major, defaultApi), entry: defaultEntry },\n { scope: vueTsScope(major, nonDefaultApi), entry: targetEntry },\n ];\n}\n\nfunction buildJsAppBlocks (answers: CliAnswers): ScopedConfig[] {\n if (!hasJavascript(answers.languages)) {\n return [];\n }\n\n const hybridBlocks = buildHybridVueJsBlocks(answers);\n\n if (hybridBlocks) {\n return hybridBlocks;\n }\n\n const files = jsAppFiles(answers);\n\n return jsAppScopes(answers).map(scope => ({ scope, entry: { files } }));\n}\n\nfunction buildTsAppBlocks (answers: CliAnswers, appEntry: TsconfigRoleEntry | undefined): ScopedConfig[] {\n if (!hasTypescript(answers.languages)) {\n return [];\n }\n\n const hybridBlocks = buildHybridVueTsBlocks(answers, appEntry);\n\n if (hybridBlocks) {\n return hybridBlocks;\n }\n\n const useAppGlob = answers.tsconfig?.referencesOnly === true && Boolean(appEntry);\n const files = tsAppFiles(answers, useAppGlob ? 'app' : 'all');\n\n return tsAppScopes(answers).map(scope => {\n const entry: ScopeEntry = { files };\n\n if (appEntry) {\n entry.tsconfigPaths = [appEntry.path];\n }\n\n return { scope, entry };\n });\n}\n\nfunction tsConfigPathsForRoot (\n appEntry: TsconfigRoleEntry | undefined,\n configEntry: TsconfigRoleEntry | undefined\n): string[] | undefined {\n if (configEntry) {\n return [configEntry.path];\n }\n\n if (appEntry) {\n return [appEntry.path];\n }\n\n return undefined;\n}\n\nfunction buildRootConfigBlocks (\n answers: CliAnswers,\n appEntry: TsconfigRoleEntry | undefined,\n configEntry: TsconfigRoleEntry | undefined\n): ScopedConfig[] {\n const blocks: ScopedConfig[] = [\n { scope: 'javascriptNode', entry: { files: jsRootConfigFiles() } },\n ];\n\n if (hasTypescript(answers.languages)) {\n const entry: ScopeEntry = { files: tsRootConfigFiles() };\n const tsconfigPaths = tsConfigPathsForRoot(appEntry, configEntry);\n\n if (tsconfigPaths) {\n entry.tsconfigPaths = tsconfigPaths;\n }\n\n blocks.push({ scope: 'typescriptNode', entry });\n }\n\n return blocks;\n}\n\nfunction buildTestBlock (answers: CliAnswers, testEntry: TsconfigRoleEntry | undefined): ScopedConfig | null {\n if (answers.testFramework === 'none') {\n return null;\n }\n\n const entry: ScopeEntry = {\n files: testFilesGlob(answers.languages),\n };\n\n if (hasTypescript(answers.languages) && testEntry) {\n entry.tsconfigPaths = [testEntry.path];\n }\n\n return { scope: answers.testFramework, entry };\n}\n\nfunction buildJqueryBlock (answers: CliAnswers): ScopedConfig | null {\n if (!answers.extras.jquery) {\n return null;\n }\n\n return {\n scope: 'jquery',\n entry: { files: jqueryFilesGlob(answers) },\n };\n}\n\nfunction buildScopedConfigs (answers: CliAnswers): ScopedConfig[] {\n const plan = answers.tsconfig;\n const referencesOnly = plan?.referencesOnly === true;\n const appEntry = plan ? findRole(plan, 'app') : undefined;\n const configEntry = referencesOnly ? findRole(plan, 'config') : undefined;\n const testEntry = referencesOnly ? findRole(plan, 'test') : appEntry;\n const testBlock = buildTestBlock(answers, testEntry);\n const jqueryBlock = buildJqueryBlock(answers);\n const tail: (ScopedConfig | null)[] = [testBlock, jqueryBlock];\n\n return [\n ...buildRootConfigBlocks(answers, appEntry, configEntry),\n ...buildJsAppBlocks(answers),\n ...buildTsAppBlocks(answers, appEntry),\n ...tail.filter((block): block is ScopedConfig => block !== null),\n ];\n}\n\nfunction mergeByScope (blocks: ScopedConfig[]): Map<string, ScopeEntry[]> {\n return blocks.reduce<Map<string, ScopeEntry[]>>((merged, { scope, entry }) => {\n const existing = merged.get(scope);\n\n if (existing) {\n existing.push(entry);\n } else {\n merged.set(scope, [entry]);\n }\n\n return merged;\n }, new Map());\n}\n\nfunction formatStringArray (values: string[]): string {\n const joined = values.map(quote).join(', ');\n\n return `[${joined}]`;\n}\n\nfunction formatEntry (entry: ScopeEntry, baseIndent: string): string {\n const filesLine = `files: ${formatStringArray(entry.files)}`;\n const ignoresLine = entry.ignores ? `ignores: ${formatStringArray(entry.ignores)}` : null;\n const tsconfigLine = entry.tsconfigPaths\n ? `tsconfigPaths: ${formatStringArray(entry.tsconfigPaths)}`\n : null;\n\n if (!ignoresLine && !tsconfigLine) {\n return `${baseIndent}{ ${filesLine} },`;\n }\n\n const childIndent = `${baseIndent}${indent}`;\n const lines: string[] = [`${baseIndent}{`, `${childIndent}${filesLine},`];\n\n if (ignoresLine) {\n lines.push(`${childIndent}${ignoresLine},`);\n }\n\n if (tsconfigLine) {\n lines.push(`${childIndent}${tsconfigLine},`);\n }\n\n lines.push(`${baseIndent}},`);\n\n return lines.join('\\n');\n}\n\nfunction formatScope (scope: string, entries: ScopeEntry[], baseIndent: string): string {\n const childIndent = `${baseIndent}${indent}`;\n const entryLines = entries.map(entry => formatEntry(entry, childIndent));\n\n return [\n `${baseIndent}${scope}: [`,\n ...entryLines,\n `${baseIndent}],`,\n ].join('\\n');\n}\n\nfunction renderUseInsiderBody (merged: Map<string, ScopeEntry[]>): string {\n return [...merged.entries()]\n .map(([scope, entries]) => formatScope(scope, entries, indent))\n .join('\\n');\n}\n\n/**\n * Body of the generated `insider.lint.*` module — the one file that calls `useInsider()` and the\n * only one both linter configs import.\n * @example\n * renderLintModuleFile(answers); // \"…export const { useInsiderESLint, useInsiderOXC } = useInsider({…\"\n */\nexport function renderLintModuleFile (answers: CliAnswers): string {\n const blocks = buildScopedConfigs(answers);\n const merged = mergeByScope(blocks);\n const useInsiderBody = renderUseInsiderBody(merged);\n\n const lines: string[] = [\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export const { useInsiderESLint, useInsiderOXC } = useInsider({',\n useInsiderBody,\n '});',\n '',\n ];\n\n return lines.join('\\n');\n}\n","import type {\n CliAnswers,\n Framework,\n Language,\n Languages,\n ProjectType,\n TestFramework,\n TsconfigPlan,\n TsconfigRole,\n TsconfigRoleEntry,\n VueApiStyle,\n VueHybridDefaultApi,\n VueMajor,\n} from './template';\nimport { getHybridDefaultSuffix, getHybridSuffixChoices } from './template';\n\ninterface SelectOption<Item> {\n value: Item;\n label: string;\n hint?: string;\n}\n\ninterface SelectOpts<Item> {\n message: string;\n options: SelectOption<Item>[];\n initialValue?: Item;\n}\n\ninterface ConfirmOpts {\n message: string;\n initialValue?: boolean;\n}\n\ninterface MultiselectOpts<Item> {\n message: string;\n options: SelectOption<Item>[];\n required: boolean;\n initialValues?: Item[];\n}\n\nexport interface ClackLike {\n intro: (message: string) => void;\n outro: (message: string) => void;\n cancel: (message: string) => void;\n isCancel: (value: unknown) => boolean;\n select: <Item>(opts: SelectOpts<Item>) => Promise<Item | symbol>;\n confirm: (opts: ConfirmOpts) => Promise<boolean | symbol>;\n multiselect: <Item>(opts: MultiselectOpts<Item>) => Promise<Item[] | symbol>;\n note?: (message: string, title?: string) => void;\n}\n\nclass CliCancelledError extends Error {\n constructor (message: string) {\n super(message);\n this.name = 'CliCancelledError';\n }\n}\n\nasync function loadClack (): Promise<ClackLike> {\n const mod = await import('@clack/prompts');\n\n return mod as unknown as ClackLike;\n}\n\nfunction bail (clack: ClackLike, message: string): never {\n clack.cancel(message);\n\n throw new CliCancelledError(message);\n}\n\nfunction ensure<Item> (clack: ClackLike, value: Item | symbol): Item {\n if (clack.isCancel(value)) {\n bail(clack, 'Cancelled.');\n }\n\n return value as Item;\n}\n\nasync function askProjectType (clack: ClackLike, initial: ProjectType = 'backend'): Promise<ProjectType> {\n const result = await clack.select<ProjectType>({\n message: 'What kind of project are you setting up?',\n options: [\n { value: 'backend', label: 'Backend / Node.js' },\n { value: 'browser', label: 'Browser / frontend' },\n { value: 'hybrid', label: 'Hybrid', hint: 'Node + browser (isomorphic, SSR, full-stack)' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nasync function askLanguages (clack: ClackLike, initial: Languages = ['typescript']): Promise<Languages> {\n const selection = await clack.multiselect<Language>({\n message: 'Which languages will the project use? (press space to toggle, enter to confirm)',\n options: [\n { value: 'javascript', label: 'JavaScript' },\n { value: 'typescript', label: 'TypeScript' },\n ],\n required: true,\n initialValues: initial,\n });\n const picked = ensure(clack, selection);\n\n if (picked.length === 0) {\n bail(clack, 'At least one language must be selected.');\n }\n\n return picked;\n}\n\nasync function askFramework (clack: ClackLike, initial: Framework = 'vanilla'): Promise<Framework> {\n const result = await clack.select<Framework>({\n message: 'Which frontend framework?',\n options: [\n { value: 'vanilla', label: 'None / Vanilla' },\n { value: 'vue', label: 'Vue' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nasync function askVueMajor (clack: ClackLike, initial: VueMajor = 3): Promise<VueMajor> {\n const result = await clack.select<VueMajor>({\n message: 'Which Vue major version?',\n options: [\n { value: 3, label: 'Vue 3' },\n { value: 2, label: 'Vue 2' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nasync function askVueApiStyle (\n clack: ClackLike,\n initial: VueApiStyle = 'composition'\n): Promise<VueApiStyle> {\n const result = await clack.select<VueApiStyle>({\n message: 'What API style does your Vue codebase use?',\n options: [\n { value: 'composition', label: 'Composition API (setup)' },\n { value: 'options', label: 'Options API' },\n { value: 'hybrid', label: 'Hybrid (both)' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport async function askHybridProceedWithSuffix (\n clack: ClackLike,\n initial = true\n): Promise<boolean> {\n const result = await clack.confirm({\n message: 'Want me to scaffold both Options + Composition blocks using a filename suffix convention?',\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport async function askVueHybridDefaultApi (\n clack: ClackLike,\n initial: VueHybridDefaultApi = 'composition'\n): Promise<VueHybridDefaultApi> {\n const result = await clack.select<VueHybridDefaultApi>({\n message: 'Which API style is the default in your codebase?',\n options: [\n { value: 'composition', label: 'Composition API (setup)' },\n { value: 'options', label: 'Options API' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport async function askHybridSuffix (\n clack: ClackLike,\n defaultApi: VueHybridDefaultApi,\n initial?: string\n): Promise<string> {\n const choices = getHybridSuffixChoices(defaultApi);\n const message = defaultApi === 'composition'\n ? 'Pick a suffix for Options-API components:'\n : 'Pick a suffix for Composition-API components:';\n const fallback = getHybridDefaultSuffix(defaultApi);\n const initialValue = initial && choices.some(choice => choice.value === initial) ? initial : fallback;\n\n const result = await clack.select<string>({\n message,\n options: choices.map(choice => ({ value: choice.value, label: choice.label })),\n initialValue,\n });\n\n return ensure(clack, result);\n}\n\nasync function askTestFramework (clack: ClackLike, initial: TestFramework = 'vitest'): Promise<TestFramework> {\n const result = await clack.select<TestFramework>({\n message: 'Which testing framework?',\n options: [\n { value: 'vitest', label: 'Vitest' },\n { value: 'jest', label: 'Jest' },\n { value: 'none', label: 'None' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nasync function askExtras (\n clack: ClackLike,\n initial: { jquery: boolean } = { jquery: false }\n): Promise<{ jquery: boolean }> {\n const initialValues: 'jquery'[] = initial.jquery ? ['jquery'] : [];\n const result = await clack.multiselect<'jquery'>({\n message: 'Which extra libraries do you use?',\n options: [\n { value: 'jquery', label: 'jQuery (adds globals)' },\n ],\n required: false,\n initialValues,\n });\n\n const selection = ensure(clack, result);\n\n return { jquery: selection.includes('jquery') };\n}\n\nasync function askTsconfigRole (\n clack: ClackLike,\n refPath: string,\n initial: TsconfigRole = 'app'\n): Promise<TsconfigRole> {\n const result = await clack.select<TsconfigRole>({\n message: `Map ${refPath} to a role:`,\n options: [\n { value: 'app', label: 'App / source code' },\n { value: 'test', label: 'Test code' },\n { value: 'config', label: 'Config / root files' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport interface TsconfigPromptInput {\n referencesOnly: boolean;\n rootPath: string;\n refs: string[];\n}\n\nasync function collectRoleEntries (\n clack: ClackLike,\n refs: string[],\n previous?: TsconfigRoleEntry[]\n): Promise<TsconfigRoleEntry[]> {\n const previousByPath = new Map(previous?.map(entry => [entry.path, entry.role]) ?? []);\n\n return refs.reduce<Promise<TsconfigRoleEntry[]>>(async (accumulator, ref) => {\n const entries = await accumulator;\n const role = await askTsconfigRole(clack, ref, previousByPath.get(ref));\n\n return [...entries, { path: ref, role }];\n }, Promise.resolve([]));\n}\n\nexport async function askTsconfigPlan (\n clack: ClackLike,\n input: TsconfigPromptInput,\n previous?: TsconfigPlan\n): Promise<TsconfigPlan> {\n if (!input.referencesOnly) {\n return {\n referencesOnly: false,\n entries: [{ path: './tsconfig.json', role: 'app' }],\n };\n }\n\n const entries = await collectRoleEntries(clack, input.refs, previous?.entries);\n\n return { referencesOnly: true, entries };\n}\n\nexport type ExistingConfigDecision = 'override' | 'migrate' | 'exit';\n\nexport async function askExistingConfigDecision (\n clack: ClackLike,\n configPath: string,\n initial: ExistingConfigDecision = 'migrate'\n): Promise<ExistingConfigDecision> {\n const result = await clack.select<ExistingConfigDecision>({\n message: `Found existing config at ${configPath}. How should we proceed?`,\n options: [\n { value: 'migrate', label: 'Migrate', hint: 'preserve current base config, port them to the v2 shape' },\n { value: 'override', label: 'Override', hint: 'discard the existing config and scaffold a new one' },\n { value: 'exit', label: 'Exit', hint: 'leave the project untouched' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport interface RunQuestionsContext {\n tsconfigInput: TsconfigPromptInput | null;\n tsconfigMissing: boolean;\n previousAnswers?: CliAnswers;\n}\n\ninterface BrowserBranch {\n framework: Framework | undefined;\n vueMajor: VueMajor | undefined;\n vueApiStyle: VueApiStyle | undefined;\n}\n\nasync function askBrowserBranch (clack: ClackLike, previous?: CliAnswers): Promise<BrowserBranch> {\n const framework = await askFramework(clack, previous?.framework);\n\n if (framework !== 'vue') {\n return { framework, vueMajor: undefined, vueApiStyle: undefined };\n }\n\n const vueMajor = await askVueMajor(clack, previous?.vueMajor);\n const vueApiStyle = await askVueApiStyle(clack, previous?.vueApiStyle);\n\n return { framework, vueMajor, vueApiStyle };\n}\n\nfunction noteResumed (clack: ClackLike, previous: CliAnswers | undefined): void {\n if (!previous || !clack.note) {\n return;\n }\n\n clack.note(\n 'Restored your previous choices. Press Enter on each prompt to confirm, or arrow keys to change.',\n 'Resuming previous session'\n );\n}\n\nfunction guardTsconfig (clack: ClackLike, wantsTypescript: boolean, context: RunQuestionsContext): void {\n if (wantsTypescript && context.tsconfigMissing) {\n bail(clack, 'No tsconfig.json found in current directory. Create one and re-run.');\n }\n}\n\nasync function resolveBrowserBranch (\n clack: ClackLike,\n projectType: ProjectType,\n previous: CliAnswers | undefined\n): Promise<BrowserBranch> {\n if (projectType !== 'browser' && projectType !== 'hybrid') {\n return { framework: undefined, vueMajor: undefined, vueApiStyle: undefined };\n }\n\n return askBrowserBranch(clack, previous);\n}\n\nasync function resolveTsconfigPlan (\n clack: ClackLike,\n wantsTypescript: boolean,\n context: RunQuestionsContext,\n previous: CliAnswers | undefined\n): Promise<TsconfigPlan | undefined> {\n if (!wantsTypescript || !context.tsconfigInput) {\n return undefined;\n }\n\n return askTsconfigPlan(clack, context.tsconfigInput, previous?.tsconfig);\n}\n\nexport async function runQuestions (\n context: RunQuestionsContext,\n clackOverride?: ClackLike\n): Promise<CliAnswers> {\n const clack = clackOverride ?? await loadClack();\n\n clack.intro('useinsider eslint-config setup');\n noteResumed(clack, context.previousAnswers);\n\n const previous = context.previousAnswers;\n const projectType = await askProjectType(clack, previous?.projectType);\n const languages = await askLanguages(clack, previous?.languages);\n const wantsTypescript = languages.includes('typescript');\n\n guardTsconfig(clack, wantsTypescript, context);\n\n const browserBranch = await resolveBrowserBranch(clack, projectType, previous);\n const testFramework = await askTestFramework(clack, previous?.testFramework);\n const extras = await askExtras(clack, previous?.extras);\n const tsconfig = await resolveTsconfigPlan(clack, wantsTypescript, context, previous);\n\n return {\n projectType,\n languages,\n framework: browserBranch.framework,\n vueMajor: browserBranch.vueMajor,\n vueApiStyle: browserBranch.vueApiStyle,\n testFramework,\n extras,\n tsconfig,\n };\n}\n\nexport { loadClack, CliCancelledError };\n","import { createHash } from 'node:crypto';\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport type { CliAnswers } from './template';\n\nexport type SessionCommand = 'scaffold' | 'migrate';\n\nexport type ScaffoldExistingConfigChoice = 'override' | 'migrate' | 'exit';\n\nexport interface ScaffoldSessionAnswers {\n answers?: CliAnswers;\n existingConfigChoice?: ScaffoldExistingConfigChoice;\n}\n\nexport interface MigrateSessionAnswers {\n target?: string;\n yes?: boolean;\n noInstall?: boolean;\n overwriteExisting?: boolean;\n proceed?: boolean;\n}\n\nexport interface PersistedSession {\n v: 4;\n savedAt: number;\n cwd: string;\n command: SessionCommand;\n scaffold?: ScaffoldSessionAnswers;\n migrate?: MigrateSessionAnswers;\n}\n\nexport interface SessionStoreOptions {\n cwd: string;\n now?: () => number;\n tmpDir?: string;\n ttlMs?: number;\n}\n\nconst SCHEMA_VERSION = 4 as const;\nconst DEFAULT_TTL_MS = 60 * 60 * 1000;\nconst FILE_PREFIX = 'useinsider-eslint-config-session-';\n\nfunction hashCwd (cwd: string): string {\n return createHash('sha1').update(cwd).digest('hex').slice(0, 16);\n}\n\nexport function getSessionFilePath (cwd: string, tmpDirOverride?: string): string {\n const dir = tmpDirOverride ?? tmpdir();\n\n return join(dir, `${FILE_PREFIX}${hashCwd(cwd)}.json`);\n}\n\nfunction safeUnlink (path: string): void {\n try {\n unlinkSync(path);\n } catch {\n // file missing or already unlinked — silent by design\n }\n}\n\nfunction ensureDir (path: string): void {\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n}\n\nfunction isSessionShape (value: unknown): value is PersistedSession {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Partial<PersistedSession>;\n\n return candidate.v === SCHEMA_VERSION\n && typeof candidate.savedAt === 'number'\n && typeof candidate.cwd === 'string'\n && (candidate.command === 'scaffold' || candidate.command === 'migrate');\n}\n\nexport function saveSession (\n session: Omit<PersistedSession, 'v' | 'savedAt' | 'cwd'>,\n options: SessionStoreOptions\n): string {\n const now = options.now ?? Date.now;\n const dir = options.tmpDir ?? tmpdir();\n\n ensureDir(dir);\n\n const path = getSessionFilePath(options.cwd, dir);\n const payload: PersistedSession = {\n v: SCHEMA_VERSION,\n savedAt: now(),\n cwd: options.cwd,\n ...session,\n };\n\n writeFileSync(path, JSON.stringify(payload), { encoding: 'utf8', mode: 0o600 });\n\n try {\n chmodSync(path, 0o600);\n } catch {\n // chmod can fail on Windows / restricted FS — perms are best-effort\n }\n\n return path;\n}\n\nexport function loadSession (options: SessionStoreOptions): PersistedSession | null {\n const now = options.now ?? Date.now;\n const ttl = options.ttlMs ?? DEFAULT_TTL_MS;\n const path = getSessionFilePath(options.cwd, options.tmpDir);\n\n if (!existsSync(path)) {\n return null;\n }\n\n let parsed: unknown;\n\n try {\n const raw = readFileSync(path, 'utf8');\n\n parsed = JSON.parse(raw);\n } catch {\n safeUnlink(path);\n\n return null;\n }\n\n if (!isSessionShape(parsed)) {\n safeUnlink(path);\n\n return null;\n }\n\n if (parsed.cwd !== options.cwd) {\n safeUnlink(path);\n\n return null;\n }\n\n if (now() - parsed.savedAt > ttl) {\n safeUnlink(path);\n\n return null;\n }\n\n return parsed;\n}\n\nexport function clearSession (options: SessionStoreOptions): void {\n const path = getSessionFilePath(options.cwd, options.tmpDir);\n\n safeUnlink(path);\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { afterEach, beforeEach, describe, expect, test } = import.meta.vitest;\n const { mkdtempSync, rmSync, statSync } = await import('node:fs');\n const os = await import('node:os');\n let scratch = '';\n let counter = 0;\n\n function fakeCwd (): string {\n counter += 1;\n\n return `/fake/cwd-${counter}`;\n }\n\n beforeEach(() => {\n scratch = mkdtempSync(join(os.tmpdir(), 'session-store-inline-'));\n });\n\n afterEach(() => {\n if (scratch) {\n rmSync(scratch, { recursive: true, force: true });\n scratch = '';\n }\n });\n\n describe('getSessionFilePath', () => {\n test('returns the same path for the same working directory', () => {\n const cwd = fakeCwd();\n\n expect(getSessionFilePath(cwd, scratch)).toBe(getSessionFilePath(cwd, scratch));\n });\n\n test('returns different paths for different working directories', () => {\n const a = fakeCwd();\n const b = fakeCwd();\n\n expect(getSessionFilePath(a, scratch)).not.toBe(getSessionFilePath(b, scratch));\n });\n });\n\n describe('saveSession + loadSession round-trip', () => {\n test('persists scaffold answers and reloads them verbatim', () => {\n const cwd = fakeCwd();\n const answers: CliAnswers = {\n projectType: 'browser',\n languages: ['typescript'],\n framework: 'vue',\n vueMajor: 3,\n testFramework: 'vitest',\n extras: { jquery: false },\n };\n\n saveSession(\n { command: 'scaffold', scaffold: { answers } },\n { cwd, tmpDir: scratch }\n );\n\n const loaded = loadSession({ cwd, tmpDir: scratch });\n\n expect(loaded?.scaffold).toStrictEqual({ answers });\n expect(loaded?.command).toBe('scaffold');\n });\n\n test('persists existingConfigChoice on the scaffold payload', () => {\n const cwd = fakeCwd();\n\n saveSession(\n { command: 'scaffold', scaffold: { existingConfigChoice: 'migrate' } },\n { cwd, tmpDir: scratch }\n );\n\n const loaded = loadSession({ cwd, tmpDir: scratch });\n\n expect(loaded?.scaffold?.existingConfigChoice).toBe('migrate');\n });\n\n test('returns null when no session exists', () => {\n expect(loadSession({ cwd: fakeCwd(), tmpDir: scratch })).toBeNull();\n });\n\n test('returns null and removes file when TTL has elapsed', () => {\n const cwd = fakeCwd();\n const answers: CliAnswers = {\n projectType: 'backend',\n languages: ['javascript'],\n testFramework: 'none',\n extras: { jquery: false },\n };\n\n saveSession(\n { command: 'scaffold', scaffold: { answers } },\n { cwd, tmpDir: scratch, now: () => 1000 }\n );\n\n const filePath = getSessionFilePath(cwd, scratch);\n const futureNow = 1000 + 60 * 60 * 1000 + 1;\n\n expect(existsSync(filePath)).toBe(true);\n expect(loadSession({\n cwd,\n tmpDir: scratch,\n now: () => futureNow,\n ttlMs: 60 * 60 * 1000,\n })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('returns null and removes file on working-directory mismatch (collision guard)', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n const payload = {\n v: 4,\n savedAt: Date.now(),\n cwd: '/different/cwd',\n command: 'scaffold',\n };\n\n writeFileSync(filePath, JSON.stringify(payload), 'utf8');\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('returns null and removes file when payload is not valid JSON', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(filePath, 'not-json', 'utf8');\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('returns null and removes file when schema version mismatches', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(\n filePath,\n JSON.stringify({ v: 99, savedAt: Date.now(), cwd, command: 'scaffold' }),\n 'utf8'\n );\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n });\n\n test('discards legacy v1 payloads so the next run starts fresh', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(\n filePath,\n JSON.stringify({ v: 1, savedAt: Date.now(), cwd, command: 'scaffold' }),\n 'utf8'\n );\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('discards legacy v2 payloads so the next run starts fresh', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(\n filePath,\n JSON.stringify({ v: 2, savedAt: Date.now(), cwd, command: 'scaffold' }),\n 'utf8'\n );\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('discards legacy v3 payloads so the next run starts fresh', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(\n filePath,\n JSON.stringify({ v: 3, savedAt: Date.now(), cwd, command: 'scaffold' }),\n 'utf8'\n );\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('writes file with owner-only permissions on POSIX', () => {\n const cwd = fakeCwd();\n\n saveSession({ command: 'scaffold' }, { cwd, tmpDir: scratch });\n\n if (process.platform === 'win32') {\n return;\n }\n\n const stat = statSync(getSessionFilePath(cwd, scratch));\n // oxlint-disable-next-line no-bitwise -- POSIX mode mask, standard idiom\n const mode = stat.mode & 0o777;\n\n expect(mode).toBe(0o600);\n });\n });\n\n describe('clearSession', () => {\n test('removes the file when present', () => {\n const cwd = fakeCwd();\n\n saveSession({ command: 'migrate', migrate: { yes: true } }, { cwd, tmpDir: scratch });\n\n const filePath = getSessionFilePath(cwd, scratch);\n\n expect(existsSync(filePath)).toBe(true);\n\n clearSession({ cwd, tmpDir: scratch });\n\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('is a no-op when no file is present', () => {\n expect(() => clearSession({ cwd: fakeCwd(), tmpDir: scratch })).not.toThrow();\n });\n });\n}\n/* v8 ignore stop */\n","export const dependencies = {} as const;\n","export const dependencies = {} as const;\n","export const dependencies = {} as const;\n","export const dependencies = {\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-sonarjs': false,\n} as const;\n","export const dependencies = {\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","export const dependencies = {\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","import type { V2ScopeName } from './types';\nimport {\n ownEslintConfigSpec,\n readOwnEslintConfigManifest as sharedReadOwnEslintConfigManifest,\n type OverridesRecord,\n type PackageManifestLike as SharedPackageManifestLike,\n} from '~/cli/resolveEslintConfigManifest';\nimport { dependencies as baseDeps } from '~/configs/dependencies';\nimport { dependencies as javascriptDeps } from '~/configs/javascript/dependencies';\nimport { dependencies as javascriptDomDeps } from '~/configs/javascript-dom/dependencies';\nimport { dependencies as javascriptNodeDeps } from '~/configs/javascript-node/dependencies';\nimport { dependencies as jestDeps } from '~/configs/jest/dependencies';\nimport { dependencies as jsdocBasedTsDeps } from '~/configs/jsdoc-based-ts/dependencies';\nimport { dependencies as strictDeps } from '~/configs/strict/dependencies';\nimport { dependencies as typescriptDeps } from '~/configs/typescript/dependencies';\nimport { dependencies as typescriptDomDeps } from '~/configs/typescript-dom/dependencies';\nimport { dependencies as typescriptNodeDeps } from '~/configs/typescript-node/dependencies';\nimport { dependencies as vitestDeps } from '~/configs/vitest/dependencies';\nimport { dependencies as vue2Deps } from '~/configs/vue2/dependencies';\nimport { dependencies as vue2TypescriptDeps } from '~/configs/vue2-typescript/dependencies';\nimport { dependencies as vue3Deps } from '~/configs/vue3/dependencies';\nimport { dependencies as vue3TypescriptDeps } from '~/configs/vue3-typescript/dependencies';\n\nexport type PackageManifestLike = SharedPackageManifestLike;\n\ntype DependencyRecord = Readonly<Record<string, boolean>>;\n\nconst EXACT_PATTERNS = new Set<string>([\n 'eslint',\n '@useinsider/eslint-config',\n 'globals',\n 'vue-eslint-parser',\n 'typescript-eslint',\n]);\n\nconst PREFIX_PATTERNS: readonly string[] = [\n 'eslint-plugin-',\n 'eslint-config-',\n 'eslint-import-resolver-',\n 'eslint-formatter-',\n 'eslint-',\n];\n\nconst SCOPED_ESLINT_PATTERNS: readonly RegExp[] = [\n /^@[^/]+\\/eslint-/u,\n /^@typescript-eslint\\//u,\n];\n\nconst SAFELIST: ReadonlySet<string> = new Set(['typescript', '@types/eslint']);\n\nconst SCOPE_TO_DEPS: Record<V2ScopeName, DependencyRecord> = {\n javascript: javascriptDeps,\n javascriptDom: javascriptDomDeps,\n javascriptNode: javascriptNodeDeps,\n typescript: typescriptDeps,\n typescriptDom: typescriptDomDeps,\n typescriptNode: typescriptNodeDeps,\n vue2: vue2Deps,\n vue3: vue3Deps,\n vue2Typescript: vue2TypescriptDeps,\n vue3Typescript: vue3TypescriptDeps,\n jest: jestDeps,\n vitest: vitestDeps,\n jsdocBasedTs: jsdocBasedTsDeps,\n};\n\nconst ALL_PRESET_DEPS: readonly DependencyRecord[] = [\n baseDeps,\n strictDeps,\n ...Object.values(SCOPE_TO_DEPS),\n];\n\nconst PRESET_DEPENDENCY_KEYS: ReadonlySet<string> = new Set(\n ALL_PRESET_DEPS.flatMap(record => Object.keys(record))\n);\n\nconst MIGRATABLE_SCOPES: ReadonlySet<string> = new Set(Object.keys(SCOPE_TO_DEPS));\n\n/**\n * Whether a `useInsider()` option key is a scope this migration can derive dependencies for. The\n * four `*OptionsApi` scopes are deliberately absent from the registry, so a config using one is\n * carried over untouched while its dependencies are reported as unresolved.\n * @example\n * isMigratableScope('vue3Typescript'); // true\n * isMigratableScope('vue3OptionsApi'); // false\n */\nexport function isMigratableScope (key: string): key is V2ScopeName {\n return MIGRATABLE_SCOPES.has(key);\n}\n\nexport function isEslintRelatedDependency (name: string): boolean {\n if (SAFELIST.has(name)) {\n return false;\n }\n\n if (EXACT_PATTERNS.has(name)) {\n return true;\n }\n\n if (PRESET_DEPENDENCY_KEYS.has(name)) {\n return true;\n }\n\n if (SCOPED_ESLINT_PATTERNS.some(pattern => pattern.test(name))) {\n return true;\n }\n\n return PREFIX_PATTERNS.some(prefix => name.startsWith(prefix));\n}\n\nfunction sortRecord (record: Record<string, string>): Record<string, string> {\n return Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .reduce<Record<string, string>>((accumulator, key) => {\n accumulator[key] = record[key];\n\n return accumulator;\n }, {});\n}\n\nfunction pruneSection (\n record: Record<string, string> | undefined,\n removed: string[]\n): Record<string, string> | undefined {\n if (!record) {\n return record;\n }\n\n const kept: Record<string, string> = {};\n\n Object.entries(record).forEach(([name, version]) => {\n if (isEslintRelatedDependency(name)) {\n if (!removed.includes(name)) {\n removed.push(name);\n }\n\n return;\n }\n\n kept[name] = version;\n });\n\n return sortRecord(kept);\n}\n\nexport interface ParsedOverrideKey {\n baseName: string;\n}\n\nexport function parseOverrideKey (key: string): ParsedOverrideKey {\n if (key.length === 0) {\n return { baseName: key };\n }\n\n const scoped = key.startsWith('@');\n const searchFrom = scoped ? 1 : 0;\n const atIndex = key.indexOf('@', searchFrom);\n\n if (atIndex === -1) {\n return { baseName: key };\n }\n\n return { baseName: key.slice(0, atIndex) };\n}\n\nfunction sortOverrides (record: OverridesRecord): OverridesRecord {\n return Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .reduce<OverridesRecord>((accumulator, key) => {\n accumulator[key] = record[key];\n\n return accumulator;\n }, {});\n}\n\nfunction pruneOverridesSection (\n record: OverridesRecord | undefined,\n removed: string[]\n): OverridesRecord | undefined {\n if (!record) {\n return record;\n }\n\n const kept: OverridesRecord = {};\n\n Object.entries(record).forEach(([key, value]) => {\n const isStringPin = typeof value === 'string';\n\n if (!isStringPin) {\n kept[key] = value;\n\n return;\n }\n\n const { baseName } = parseOverrideKey(key);\n\n if (isEslintRelatedDependency(baseName)) {\n if (!removed.includes(baseName)) {\n removed.push(baseName);\n }\n\n return;\n }\n\n kept[key] = value;\n });\n\n return sortOverrides(kept);\n}\n\nexport interface PruneResult {\n manifest: PackageManifestLike;\n removed: string[];\n}\n\nexport function pruneEslintDependencies (manifest: PackageManifestLike): PruneResult {\n const removed: string[] = [];\n const next: PackageManifestLike = { ...manifest };\n\n if (manifest.dependencies) {\n next.dependencies = pruneSection(manifest.dependencies, removed);\n }\n\n if (manifest.devDependencies) {\n next.devDependencies = pruneSection(manifest.devDependencies, removed);\n }\n\n if (manifest.peerDependencies) {\n next.peerDependencies = pruneSection(manifest.peerDependencies, removed);\n }\n\n if (manifest.optionalDependencies) {\n next.optionalDependencies = pruneSection(manifest.optionalDependencies, removed);\n }\n\n if (manifest.overrides) {\n next.overrides = pruneOverridesSection(manifest.overrides, removed);\n }\n\n if (manifest.pnpm && typeof manifest.pnpm === 'object') {\n const nextPnpm = { ...manifest.pnpm };\n\n if (manifest.pnpm.overrides) {\n nextPnpm.overrides = pruneOverridesSection(manifest.pnpm.overrides, removed);\n }\n\n next.pnpm = nextPnpm;\n }\n\n if (manifest.resolutions) {\n next.resolutions = pruneSection(manifest.resolutions, removed);\n }\n\n return { manifest: next, removed };\n}\n\nfunction lookupVersion (manifest: PackageManifestLike, name: string): string | undefined {\n return manifest.dependencies?.[name]\n ?? manifest.devDependencies?.[name]\n ?? manifest.peerDependencies?.[name]\n ?? manifest.optionalDependencies?.[name];\n}\n\nfunction stripRange (version: string): string {\n return version.replace(/^(?:\\^|~|>=|<=|>|<|=)/u, '');\n}\n\nexport interface InstallList {\n specs: string[];\n fallbacks: string[];\n}\n\nfunction appendSpec (specs: string[], spec: string): void {\n if (!specs.includes(spec)) {\n specs.push(spec);\n }\n}\n\nfunction resolveSpec (name: string, manifest: PackageManifestLike, fallbacks: string[]): string {\n const version = lookupVersion(manifest, name);\n\n if (!version) {\n if (!fallbacks.includes(name)) {\n fallbacks.push(name);\n }\n\n return `${name}@latest`;\n }\n\n return `${name}@${stripRange(version)}`;\n}\n\nexport function buildInstallList (\n scopes: ReadonlySet<V2ScopeName>,\n manifest: PackageManifestLike\n): InstallList {\n const specs: string[] = [];\n const fallbacks: string[] = [];\n\n appendSpec(specs, ownEslintConfigSpec(manifest));\n appendSpec(specs, resolveSpec('eslint', manifest, fallbacks));\n\n Object.entries(baseDeps).forEach(([packageName, shouldInstall]) => {\n if (shouldInstall) {\n appendSpec(specs, resolveSpec(packageName, manifest, fallbacks));\n }\n });\n\n const ordered: V2ScopeName[] = [...scopes];\n\n ordered.forEach(scope => {\n const record = SCOPE_TO_DEPS[scope];\n\n if (!record) {\n return;\n }\n\n Object.entries(record).forEach(([packageName, shouldInstall]) => {\n if (shouldInstall) {\n appendSpec(specs, resolveSpec(packageName, manifest, fallbacks));\n }\n });\n });\n\n return { specs, fallbacks };\n}\n\nexport const readOwnEslintConfigManifest = sharedReadOwnEslintConfigManifest;\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { detectIndent } from './detectIndent';\nimport {\n type PackageManifestLike,\n pruneEslintDependencies,\n} from './migrate/dependencies';\n\nexport type { PackageManifestLike };\n\nexport interface PrunePackageJsonResult {\n packageJsonPath: string | null;\n removed: string[];\n}\n\nfunction serializeManifest (manifest: PackageManifestLike, indent: string): string {\n return `${JSON.stringify(manifest, null, indent)}\\n`;\n}\n\nfunction tryReadConsumerManifest (path: string): { raw: string; manifest: PackageManifestLike } | null {\n try {\n const raw = readFileSync(path, 'utf8');\n const manifest = JSON.parse(raw) as PackageManifestLike;\n\n return { raw, manifest };\n } catch {\n return null;\n }\n}\n\nexport function pruneConsumerPackageJson (cwd: string): PrunePackageJsonResult {\n const packageJsonPath = join(cwd, 'package.json');\n\n if (!existsSync(packageJsonPath)) {\n return { packageJsonPath: null, removed: [] };\n }\n\n const read = tryReadConsumerManifest(packageJsonPath);\n\n if (!read) {\n return { packageJsonPath: null, removed: [] };\n }\n\n const { manifest, raw } = read;\n const outcome = pruneEslintDependencies(manifest);\n\n if (outcome.removed.length === 0) {\n return { packageJsonPath, removed: [] };\n }\n\n const indent = detectIndent(raw);\n\n writeFileSync(packageJsonPath, serializeManifest(outcome.manifest, indent), 'utf8');\n\n return { packageJsonPath, removed: outcome.removed };\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { ClackLike } from './questions';\nimport * as ts from 'typescript';\nimport { detectIndent } from './detectIndent';\n\nexport const TS_EXTENSIONS_FLAG = 'allowImportingTsExtensions';\n\nexport const TS_EXTENSIONS_SNIPPET = [\n '{',\n ' \"compilerOptions\": {',\n ` \"${TS_EXTENSIONS_FLAG}\": true`,\n ' }',\n '}',\n].join('\\n');\n\nexport interface TsconfigState {\n path: string;\n raw: string;\n enabled: boolean;\n governs: boolean;\n acceptsFlag: boolean;\n}\n\ninterface ParsedTsconfig {\n enabled: boolean;\n acceptsFlag: boolean;\n fileNames: readonly string[];\n references: readonly string[];\n}\n\n// `tsc` errors with TS5096 when `allowImportingTsExtensions` is set on a project that emits, so the\n// flag is only writable once the project is one of the three shapes TypeScript accepts it on.\nfunction acceptsTsExtensionsFlag (options: ts.CompilerOptions): boolean {\n return options.noEmit === true\n || options.emitDeclarationOnly === true\n || options.rewriteRelativeImportExtensions === true;\n}\n\nfunction parseTsconfig (path: string, raw: string): ParsedTsconfig | null {\n const { config } = ts.parseConfigFileTextToJson(path, raw) as { config?: unknown };\n\n if (!config) {\n return null;\n }\n\n const parsed = ts.parseJsonConfigFileContent(config, ts.sys, dirname(path), undefined, path);\n\n return {\n enabled: parsed.options.allowImportingTsExtensions === true,\n acceptsFlag: acceptsTsExtensionsFlag(parsed.options),\n fileNames: parsed.fileNames,\n references: (parsed.projectReferences ?? []).map(reference => reference.path),\n };\n}\n\nfunction readTsconfigAt (path: string, governedFiles: readonly string[]): {\n state: TsconfigState;\n references: readonly string[];\n} | null {\n if (!existsSync(path)) {\n return null;\n }\n\n try {\n const raw = readFileSync(path, 'utf8');\n const parsed = parseTsconfig(path, raw);\n\n if (!parsed) {\n return {\n state: { path, raw, enabled: false, governs: false, acceptsFlag: false },\n references: [],\n };\n }\n\n const owned = new Set(parsed.fileNames.map(name => ts.sys.resolvePath(name)));\n const governs = governedFiles.some(file => owned.has(ts.sys.resolvePath(file)));\n\n return {\n state: { path, raw, enabled: parsed.enabled, governs, acceptsFlag: parsed.acceptsFlag },\n references: parsed.references,\n };\n } catch {\n return null;\n }\n}\n\nfunction resolveReferencePath (reference: string): string {\n if (!existsSync(reference)) {\n return reference;\n }\n\n return ts.sys.directoryExists(reference) ? join(reference, 'tsconfig.json') : reference;\n}\n\n/**\n * The consumer's root `tsconfig.json` plus whether `allowImportingTsExtensions` already resolves to\n * `true` — including when it arrives through `extends`, which is followed the same way `tsc` does.\n * @example\n * readTsconfigState('/repo')?.enabled; // true when /repo/tsconfig.json extends a base that sets it\n */\nexport function readTsconfigState (cwd: string, governedFiles: readonly string[] = []): TsconfigState | null {\n return readTsconfigAt(join(cwd, 'tsconfig.json'), governedFiles)?.state ?? null;\n}\n\n/**\n * Every tsconfig in the consumer's solution — the root plus each project reference — annotated with\n * whether it actually type-checks the generated lint files. A solution-style root has an empty file\n * set, so the project that governs `insider.lint.ts` is usually a referenced `tsconfig.node.json`,\n * and that is the one `tsc` reports TS5097 from.\n * @example\n * collectTsconfigStates('/repo', ['/repo/insider.lint.ts']).filter(state => state.governs);\n * // [{ path: '/repo/tsconfig.node.json', enabled: true, governs: true, ... }]\n */\nexport function collectTsconfigStates (\n cwd: string,\n governedFiles: readonly string[] = []\n): TsconfigState[] {\n const root = readTsconfigAt(join(cwd, 'tsconfig.json'), governedFiles);\n\n if (!root) {\n return [];\n }\n\n const seen = new Set([root.state.path]);\n const states = [root.state];\n\n root.references.forEach(reference => {\n const path = resolveReferencePath(reference);\n\n if (seen.has(path)) {\n return;\n }\n\n seen.add(path);\n\n const referenced = readTsconfigAt(path, governedFiles);\n\n if (referenced) {\n states.push(referenced.state);\n }\n });\n\n return states;\n}\n\n/**\n * The tsconfigs that must gain `allowImportingTsExtensions`: the ones that type-check the generated\n * files and do not already resolve the flag to `true`. Empty when an applicable config already sets\n * it, and empty when no config type-checks the generated files at all — a tsconfig that never sees\n * them cannot raise TS5097, so editing it would only add a flag it has no use for.\n * @example\n * tsconfigsNeedingFlag('/repo', ['/repo/insider.lint.ts']).map(state => state.path); // []\n */\nexport function tsconfigsNeedingFlag (\n cwd: string,\n governedFiles: readonly string[]\n): TsconfigState[] {\n return collectTsconfigStates(cwd, governedFiles)\n .filter(state => state.governs && !state.enabled);\n}\n\nfunction rootObject (source: ts.JsonSourceFile): ts.ObjectLiteralExpression | null {\n const [statement] = source.statements;\n const expression = statement?.expression;\n\n return expression && ts.isObjectLiteralExpression(expression) ? expression : null;\n}\n\nfunction findProperty (\n object: ts.ObjectLiteralExpression,\n name: string\n): ts.PropertyAssignment | undefined {\n return object.properties.find((property): property is ts.PropertyAssignment => ts.isPropertyAssignment(property)\n && ts.isStringLiteral(property.name)\n && property.name.text === name);\n}\n\nfunction indentAt (raw: string, position: number): string {\n const lineStart = raw.lastIndexOf('\\n', position - 1) + 1;\n const prefix = raw.slice(lineStart, position);\n\n return prefix.trim().length === 0 ? prefix : '';\n}\n\nfunction splice (raw: string, start: number, end: number, text: string): string {\n return raw.slice(0, start) + text + raw.slice(end);\n}\n\nfunction setExistingFlag (\n raw: string,\n source: ts.JsonSourceFile,\n property: ts.PropertyAssignment\n): string {\n return splice(\n raw,\n property.initializer.getStart(source),\n property.initializer.getEnd(),\n 'true'\n );\n}\n\nfunction insertIntoCompilerOptions (\n raw: string,\n source: ts.JsonSourceFile,\n compilerOptions: ts.PropertyAssignment,\n object: ts.ObjectLiteralExpression\n): string {\n const openBrace = object.getStart(source) + 1;\n const [first] = object.properties;\n\n if (first) {\n const indent = indentAt(raw, first.getStart(source)) || detectIndent(raw).repeat(2);\n\n return splice(raw, openBrace, openBrace, `\\n${indent}\"${TS_EXTENSIONS_FLAG}\": true,`);\n }\n\n const outer = indentAt(raw, compilerOptions.getStart(source));\n const unit = detectIndent(raw);\n\n return splice(\n raw,\n openBrace,\n object.getEnd() - 1,\n `\\n${outer}${unit}\"${TS_EXTENSIONS_FLAG}\": true\\n${outer}`\n );\n}\n\nfunction insertCompilerOptions (\n raw: string,\n source: ts.JsonSourceFile,\n root: ts.ObjectLiteralExpression\n): string {\n const openBrace = root.getStart(source) + 1;\n const unit = detectIndent(raw);\n const [first] = root.properties;\n const indent = first ? indentAt(raw, first.getStart(source)) || unit : unit;\n const block = `\\n${indent}\"compilerOptions\": {\\n${indent}${unit}\"${TS_EXTENSIONS_FLAG}\": true\\n${indent}}`;\n\n if (first) {\n return splice(raw, openBrace, openBrace, `${block},`);\n }\n\n return splice(raw, openBrace, root.getEnd() - 1, `${block}\\n`);\n}\n\n/**\n * Turns `allowImportingTsExtensions` on in a `tsconfig.json` source without reformatting it. The\n * file is edited through its JSON syntax tree rather than re-serialized, so comments, key order and\n * indentation survive.\n * @example\n * enableTsExtensionsFlag('{\\n \"compilerOptions\": {\\n \"strict\": true\\n }\\n}').changed; // true\n */\nexport function enableTsExtensionsFlag (raw: string): { source: string; changed: boolean } {\n const source = ts.parseJsonText('tsconfig.json', raw);\n const root = rootObject(source);\n\n if (!root) {\n return { source: raw, changed: false };\n }\n\n const compilerOptions = findProperty(root, 'compilerOptions');\n\n if (!compilerOptions) {\n return { source: insertCompilerOptions(raw, source, root), changed: true };\n }\n\n if (!ts.isObjectLiteralExpression(compilerOptions.initializer)) {\n return { source: raw, changed: false };\n }\n\n const existing = findProperty(compilerOptions.initializer, TS_EXTENSIONS_FLAG);\n\n if (existing) {\n if (existing.initializer.kind === ts.SyntaxKind.TrueKeyword) {\n return { source: raw, changed: false };\n }\n\n return { source: setExistingFlag(raw, source, existing), changed: true };\n }\n\n return {\n source: insertIntoCompilerOptions(raw, source, compilerOptions, compilerOptions.initializer),\n changed: true,\n };\n}\n\nfunction noteManualStep (clack: ClackLike, lintModule: string): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n `\\`eslint.config.*\\` imports \\`./${lintModule}\\` by its real extension, which \\`tsc\\` rejects `\n + `with TS5097 unless \\`${TS_EXTENSIONS_FLAG}\\` is on. Add this to your tsconfig.json:`\n + `\\n\\n${TS_EXTENSIONS_SNIPPET}`,\n 'tsconfig.json not updated'\n );\n}\n\nfunction noteEmitConflict (clack: ClackLike, path: string, lintModule: string): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n `${path} type-checks \\`./${lintModule}\\`, so \\`tsc\\` needs \\`${TS_EXTENSIONS_FLAG}\\` there — but `\n + 'that project emits, and TypeScript rejects the pair with TS5096. Set `noEmit`, '\n + '`emitDeclarationOnly` or `rewriteRelativeImportExtensions` on it first, then add:'\n + `\\n\\n${TS_EXTENSIONS_SNIPPET}`,\n 'tsconfig.json not updated'\n );\n}\n\nasync function confirmFlag (clack: ClackLike, path: string): Promise<boolean> {\n const result = await clack.confirm({\n message: `Set \\`${TS_EXTENSIONS_FLAG}: true\\` in ${path}? `\n + 'Without it `tsc` fails with TS5097 on the generated config files.',\n initialValue: true,\n });\n\n return !clack.isCancel(result) && result === true;\n}\n\nexport interface TsExtensionsFlagInput {\n cwd: string;\n lintModule: string;\n eslintConfig?: string;\n autoConfirm?: boolean;\n}\n\nfunction governedFilesOf (input: TsExtensionsFlagInput): string[] {\n return [input.lintModule, input.eslintConfig]\n .filter((name): name is string => Boolean(name))\n .map(name => join(input.cwd, name));\n}\n\nasync function applyToOne (\n clack: ClackLike,\n state: TsconfigState,\n input: TsExtensionsFlagInput\n): Promise<void> {\n if (!state.acceptsFlag) {\n noteEmitConflict(clack, state.path, input.lintModule);\n\n return;\n }\n\n const confirmed = input.autoConfirm || await confirmFlag(clack, state.path);\n\n if (!confirmed) {\n noteManualStep(clack, input.lintModule);\n\n return;\n }\n\n const result = enableTsExtensionsFlag(state.raw);\n\n if (!result.changed) {\n noteManualStep(clack, input.lintModule);\n\n return;\n }\n\n writeFileSync(state.path, result.source, 'utf8');\n\n if (clack.note) {\n clack.note(`Set \\`${TS_EXTENSIONS_FLAG}: true\\` in ${state.path}.`, 'Updated tsconfig.json');\n }\n}\n\n/**\n * Offers to set `allowImportingTsExtensions` on every tsconfig that actually type-checks the\n * generated lint files, and prints the exact snippet when an offer is declined or when the project\n * emits — in which case writing the flag would trade TS5097 for TS5096. A no-op when there is no\n * `tsconfig.json`, when no config governs the generated files, or when an applicable config already\n * resolves the flag to `true` — through its own `compilerOptions`, through `extends`, or by being a\n * project reference that already sets it.\n * @example\n * await applyTsExtensionsFlag(clack, { cwd: '/repo', lintModule: 'insider.lint.ts' });\n */\nexport async function applyTsExtensionsFlag (\n clack: ClackLike,\n input: TsExtensionsFlagInput\n): Promise<void> {\n const pending = tsconfigsNeedingFlag(input.cwd, governedFilesOf(input));\n\n await pending.reduce<Promise<void>>(\n async (previous, state) => {\n await previous;\n\n return applyToOne(clack, state, input);\n },\n Promise.resolve()\n );\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect, vi } = import.meta.vitest;\n const { mkdirSync, mkdtempSync } = await import('node:fs');\n const { tmpdir } = await import('node:os');\n\n function makeDir (files: Record<string, string> = {}): string {\n const directory = mkdtempSync(join(tmpdir(), 'insider-tsconfig-'));\n\n Object.entries(files).forEach(([name, content]) => {\n writeFileSync(join(directory, name), content, 'utf8');\n });\n\n return directory;\n }\n\n function makeConsumer (files: Record<string, string>): string {\n return makeDir({ ...files, 'insider.lint.ts': 'export const a = 1;\\n' });\n }\n\n function stubClack (confirmValue: boolean | symbol = true) {\n const cancelSymbol = Symbol('cancel');\n\n return {\n intro: vi.fn(),\n outro: vi.fn(),\n cancel: vi.fn(),\n isCancel: (value: unknown) => value === cancelSymbol,\n select: vi.fn(),\n multiselect: vi.fn(),\n confirm: vi.fn().mockResolvedValue(confirmValue === false ? false : confirmValue),\n note: vi.fn(),\n cancelSymbol,\n };\n }\n\n function stubClackWithoutNote (confirmValue = true) {\n return {\n intro: vi.fn(),\n outro: vi.fn(),\n cancel: vi.fn(),\n isCancel: () => false,\n select: vi.fn(),\n multiselect: vi.fn(),\n confirm: vi.fn().mockResolvedValue(confirmValue),\n };\n }\n\n describe('enableTsExtensionsFlag', () => {\n test('adds the flag as the first compilerOptions entry, keeping comments and indentation', () => {\n const raw = '{\\n // project options\\n \"compilerOptions\": {\\n \"strict\": true\\n }\\n}\\n';\n const { source, changed } = enableTsExtensionsFlag(raw);\n\n expect(changed).toBe(true);\n expect(source).toBe(\n '{\\n // project options\\n \"compilerOptions\": {\\n'\n + ' \"allowImportingTsExtensions\": true,\\n \"strict\": true\\n }\\n}\\n'\n );\n });\n\n test('flips an explicit false instead of adding a duplicate key', () => {\n const { source } = enableTsExtensionsFlag(\n '{\"compilerOptions\":{\"allowImportingTsExtensions\":false,\"strict\":true}}'\n );\n\n expect(source).toBe('{\"compilerOptions\":{\"allowImportingTsExtensions\":true,\"strict\":true}}');\n });\n\n test('reports no change when the flag is already true', () => {\n const raw = '{\"compilerOptions\":{\"allowImportingTsExtensions\":true}}';\n\n expect(enableTsExtensionsFlag(raw)).toStrictEqual({ source: raw, changed: false });\n });\n\n test('fills an empty compilerOptions object', () => {\n const { source } = enableTsExtensionsFlag('{\\n \"compilerOptions\": {}\\n}\\n');\n\n expect(source).toBe('{\\n \"compilerOptions\": {\\n \"allowImportingTsExtensions\": true\\n }\\n}\\n');\n });\n\n test('creates compilerOptions when the file has none', () => {\n const { source } = enableTsExtensionsFlag('{\\n \"include\": [\"src\"]\\n}\\n');\n\n expect(source).toBe(\n '{\\n \"compilerOptions\": {\\n \"allowImportingTsExtensions\": true\\n },\\n'\n + ' \"include\": [\"src\"]\\n}\\n'\n );\n });\n\n test('creates compilerOptions in an empty config', () => {\n expect(enableTsExtensionsFlag('{}\\n').source).toBe(\n '{\\n \"compilerOptions\": {\\n \"allowImportingTsExtensions\": true\\n }\\n}\\n'\n );\n });\n\n test('preserves a two-space project style', () => {\n const { source } = enableTsExtensionsFlag('{\\n \"compilerOptions\": {\\n \"strict\": true\\n }\\n}\\n');\n\n expect(source).toContain('\\n \"allowImportingTsExtensions\": true,\\n \"strict\": true');\n });\n\n test('leaves a file whose root is not an object alone', () => {\n expect(enableTsExtensionsFlag('[]').changed).toBe(false);\n });\n\n test('leaves a non-object compilerOptions alone', () => {\n expect(enableTsExtensionsFlag('{\"compilerOptions\": null}').changed).toBe(false);\n });\n\n test('doubles the default unit when a single-line compilerOptions indents nothing', () => {\n const { source } = enableTsExtensionsFlag('{\"compilerOptions\":{\"strict\":true}}');\n\n expect(source).toBe(\n `{\"compilerOptions\":{\\n \"${TS_EXTENSIONS_FLAG}\": true,\"strict\":true}}`\n );\n });\n\n test('falls back to the default unit when creating compilerOptions in a single-line config', () => {\n const { source } = enableTsExtensionsFlag('{\"include\":[\"src\"]}');\n\n expect(source).toBe(\n `{\\n \"compilerOptions\": {\\n \"${TS_EXTENSIONS_FLAG}\": true\\n },\"include\":[\"src\"]}`\n );\n });\n });\n\n describe('readTsconfigState', () => {\n test('returns null when the consumer has no tsconfig.json', () => {\n expect(readTsconfigState(makeDir())).toBeNull();\n });\n\n test('reports the flag as off when nothing sets it', () => {\n const directory = makeDir({ 'tsconfig.json': '{\"compilerOptions\":{\"strict\":true}}' });\n\n expect(readTsconfigState(directory)?.enabled).toBe(false);\n });\n\n test('reports the flag as on when the file sets it directly', () => {\n const directory = makeDir({\n 'tsconfig.json': '{\"compilerOptions\":{\"allowImportingTsExtensions\":true,\"noEmit\":true}}',\n });\n\n expect(readTsconfigState(directory)?.enabled).toBe(true);\n });\n\n test('follows extends, so a shared base carrying the flag counts', () => {\n const directory = makeDir({\n 'base.json': '{\"compilerOptions\":{\"allowImportingTsExtensions\":true,\"noEmit\":true}}',\n 'tsconfig.json': '{\"extends\":\"./base.json\",\"compilerOptions\":{\"strict\":true}}',\n });\n\n expect(readTsconfigState(directory)?.enabled).toBe(true);\n });\n\n test('reports the flag as off for a file whose root is not a config object', () => {\n const directory = makeDir({ 'tsconfig.json': 'null' });\n\n expect(readTsconfigState(directory)?.enabled).toBe(false);\n });\n\n test('returns null when tsconfig.json exists but cannot be read', () => {\n const directory = makeDir();\n\n mkdirSync(join(directory, 'tsconfig.json'));\n\n expect(readTsconfigState(directory)).toBeNull();\n });\n\n test('tolerates comments in the consumer file', () => {\n const directory = makeDir({\n 'tsconfig.json': '{\\n // ours\\n \"compilerOptions\": { \"allowImportingTsExtensions\": true,'\n + ' \"noEmit\": true }\\n}\\n',\n });\n\n expect(readTsconfigState(directory)?.enabled).toBe(true);\n });\n });\n\n describe('applyTsExtensionsFlag', () => {\n test('does nothing when there is no tsconfig.json', async () => {\n const clack = stubClack();\n\n await applyTsExtensionsFlag(clack, { cwd: makeDir(), lintModule: 'insider.lint.ts' });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(clack.note).not.toHaveBeenCalled();\n });\n\n test('does nothing when an extended base already sets the flag', async () => {\n const clack = stubClack();\n const directory = makeConsumer({\n 'base.json': '{\"compilerOptions\":{\"allowImportingTsExtensions\":true,\"noEmit\":true}}',\n 'tsconfig.json': '{\"extends\":\"./base.json\"}',\n });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n });\n\n test('writes the flag once confirmed', async () => {\n const clack = stubClack();\n const directory = makeConsumer({\n 'tsconfig.json': '{\\n \"compilerOptions\": {\\n \"noEmit\": true\\n }\\n}\\n',\n });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8'))\n .toContain('\"allowImportingTsExtensions\": true');\n expect(clack.note).toHaveBeenCalledWith(expect.any(String), 'Updated tsconfig.json');\n });\n\n test('skips the prompt under --yes', async () => {\n const clack = stubClack();\n const directory = makeConsumer({ 'tsconfig.json': '{\"compilerOptions\":{\"noEmit\":true}}' });\n\n await applyTsExtensionsFlag(clack, {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n autoConfirm: true,\n });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8'))\n .toContain('\"allowImportingTsExtensions\": true');\n });\n\n test('leaves the file alone and prints the snippet when declined', async () => {\n const clack = stubClack(false);\n const raw = '{\"compilerOptions\":{\"strict\":true,\"noEmit\":true}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n expect(clack.note).toHaveBeenCalledWith(\n expect.stringContaining(TS_EXTENSIONS_SNIPPET),\n 'tsconfig.json not updated'\n );\n expect(clack.note).toHaveBeenCalledWith(\n expect.stringContaining('./insider.lint.ts'),\n 'tsconfig.json not updated'\n );\n });\n\n test('prints the snippet when the file cannot be edited surgically', async () => {\n const clack = stubClack();\n const directory = makeConsumer({\n 'tsconfig.json': '{\"compilerOptions\": null, \"extends\": \"./base.json\"}',\n 'base.json': '{\"compilerOptions\":{\"noEmit\":true}}',\n });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(clack.note).toHaveBeenCalledWith(expect.any(String), 'tsconfig.json not updated');\n });\n\n test('treats a cancelled prompt as a decline', async () => {\n const clack = stubClack();\n const raw = '{\"compilerOptions\":{\"strict\":true,\"noEmit\":true}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n clack.confirm.mockResolvedValue(clack.cancelSymbol);\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n expect(clack.note).toHaveBeenCalledWith(expect.any(String), 'tsconfig.json not updated');\n });\n\n test('leaves the file alone when a decline has no note channel to print into', async () => {\n const raw = '{\"compilerOptions\":{\"strict\":true,\"noEmit\":true}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(stubClackWithoutNote(false), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n });\n\n test('writes the flag when confirmed through a clack build carrying no note', async () => {\n const directory = makeConsumer({\n 'tsconfig.json': '{\\n \"compilerOptions\": {\\n \"noEmit\": true\\n }\\n}\\n',\n });\n\n await applyTsExtensionsFlag(stubClackWithoutNote(), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8'))\n .toContain(`\"${TS_EXTENSIONS_FLAG}\": true`);\n });\n });\n\n // TS5096: `allowImportingTsExtensions` is only legal on a project that does not emit, so writing\n // it into an emitting tsconfig trades one hard `tsc` failure for another. Verified against the\n // pinned typescript@5.9.3 for all four shapes below.\n describe('applyTsExtensionsFlag against an emitting project', () => {\n test('refuses to write the flag and explains TS5096 instead', async () => {\n const clack = stubClack();\n const raw = '{\"compilerOptions\":{\"outDir\":\"dist\",\"module\":\"esnext\"}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(clack.note).toHaveBeenCalledWith(\n expect.stringContaining('TS5096'),\n 'tsconfig.json not updated'\n );\n });\n\n test('refuses even under --yes, which cannot make the combination legal', async () => {\n const raw = '{\"compilerOptions\":{\"outDir\":\"dist\"}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(stubClack(), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n autoConfirm: true,\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n });\n\n test('leaves the file alone when there is no note channel to explain it', async () => {\n const raw = '{\"compilerOptions\":{\"outDir\":\"dist\"}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(stubClackWithoutNote(), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n autoConfirm: true,\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n });\n\n test.each([\n ['noEmit', '{\"compilerOptions\":{\"noEmit\":true}}'],\n ['emitDeclarationOnly', '{\"compilerOptions\":{\"declaration\":true,\"emitDeclarationOnly\":true}}'],\n ['rewriteRelativeImportExtensions',\n '{\"compilerOptions\":{\"outDir\":\"dist\",\"rewriteRelativeImportExtensions\":true}}'],\n ])('writes the flag into a project whose %s legitimizes it', async (_label, raw) => {\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(stubClack(), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n autoConfirm: true,\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8'))\n .toContain(`\"${TS_EXTENSIONS_FLAG}\": true`);\n });\n });\n\n describe('tsconfigsNeedingFlag', () => {\n test('nominates nothing when no tsconfig type-checks the generated files', () => {\n const directory = makeConsumer({\n 'tsconfig.json': '{\"compilerOptions\":{\"noEmit\":true},\"include\":[\"src\"]}',\n });\n\n expect(tsconfigsNeedingFlag(directory, [join(directory, 'insider.lint.ts')]))\n .toStrictEqual([]);\n });\n\n test('reports whether a nominated project can legally carry the flag', () => {\n const directory = makeConsumer({ 'tsconfig.json': '{\"compilerOptions\":{\"outDir\":\"dist\"}}' });\n const [state] = tsconfigsNeedingFlag(directory, [join(directory, 'insider.lint.ts')]);\n\n expect(state.governs).toBe(true);\n expect(state.acceptsFlag).toBe(false);\n });\n });\n}\n","import { type Dirent, readFileSync, readdirSync, realpathSync, writeFileSync } from 'node:fs';\nimport { extname, join } from 'node:path';\nimport { parse } from '@typescript-eslint/parser';\nimport { AST_TOKEN_TYPES, type TSESTree } from '@typescript-eslint/types';\nimport { isOxlintOwned, isVueUnsafeRule } from '~/builders/oxlintOwnership';\n\nconst DIRECTIVE_HEAD = /^\\s*eslint-disable(-next-line|-line)?(?![\\w-])/u;\nconst SCRIPT_BLOCK = /<script\\b[^>]*>([\\s\\S]*?)<\\/script>/giu;\nconst SFC_EXTENSIONS: readonly string[] = ['.astro', '.svelte', '.vue'];\nconst JSX_EXTENSIONS: readonly string[] = ['.cjs', '.js', '.jsx', '.mjs', '.tsx'];\n\nconst LINTED_EXTENSIONS: readonly string[] = [\n '.astro',\n '.cjs',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.mts',\n '.svelte',\n '.ts',\n '.tsx',\n '.vue',\n];\n\nconst SKIPPED_DIRECTORIES: ReadonlySet<string> = new Set([\n '.git',\n 'coverage',\n 'dist',\n 'build',\n 'node_modules',\n 'out',\n 'vendor',\n]);\n\ninterface ParsedDirective {\n rules: string[];\n reason: string;\n}\n\nfunction parseDirectiveBody (body: string): ParsedDirective {\n const [ruleList, ...reasonParts] = body.split('--');\n const rules = ruleList\n .split(',')\n .map(rule => rule.trim())\n .filter(rule => rule.length > 0);\n\n return { rules, reason: reasonParts.join('--').trim() };\n}\n\nfunction formatDirective (\n owner: 'eslint' | 'oxlint',\n block: boolean,\n kind: string,\n rules: readonly string[],\n reason: string\n): string {\n const body = reason ? `${rules.join(', ')} -- ${reason}` : rules.join(', ');\n const text = `${owner}-disable${kind} ${body}`;\n\n return block ? `/* ${text} */` : `// ${text}`;\n}\n\n/**\n * Whether the split hands this rule to oxlint for the given file, so an `eslint-disable` comment\n * naming it would read as an unused directive to ESLint.\n * @example\n * movesToOxlint('no-console', '.ts'); // true\n * movesToOxlint('@typescript-eslint/no-unused-vars', '.vue'); // false — ESLint still runs it in SFCs\n */\nexport function movesToOxlint (rule: string, fileExtension: string): boolean {\n if (!isOxlintOwned(rule)) {\n return false;\n }\n\n return !(SFC_EXTENSIONS.includes(fileExtension) && isVueUnsafeRule(rule));\n}\n\nexport interface CommentSpan {\n start: number;\n end: number;\n block: boolean;\n value: string;\n}\n\nfunction toSpans (comments: readonly TSESTree.Comment[], offset: number): CommentSpan[] {\n return comments.map(comment => ({\n start: comment.range[0] + offset,\n end: comment.range[1] + offset,\n block: comment.type === AST_TOKEN_TYPES.Block,\n value: comment.value,\n }));\n}\n\nfunction parseComments (source: string, jsx: boolean): TSESTree.Comment[] | null {\n try {\n const program = parse(source, { comment: true, jsx, range: true });\n\n return program.comments ?? [];\n } catch {\n return null;\n }\n}\n\n// Both parses are attempted because the JSX flag changes how `<T>value` is read, and neither the\n// file extension nor an SFC `lang` attribute is a reliable signal on its own.\nfunction collectFromScript (source: string, jsx: boolean, offset: number): CommentSpan[] {\n const comments = parseComments(source, jsx) ?? parseComments(source, !jsx);\n\n return comments ? toSpans(comments, offset) : [];\n}\n\nconst CLOSING_SCRIPT_TAG_LENGTH = '</script>'.length;\n\nfunction collectSfcComments (source: string, jsx: boolean): CommentSpan[] {\n return [...source.matchAll(SCRIPT_BLOCK)].flatMap(match => {\n const [whole, body] = match;\n const offset = (match.index ?? 0) + whole.length - body.length - CLOSING_SCRIPT_TAG_LENGTH;\n\n return collectFromScript(body, jsx, offset);\n });\n}\n\n/**\n * Every real comment node in the file, with ranges relative to the whole source. Only comments are\n * returned, so a string or template literal that happens to spell out a directive is invisible here.\n * @example\n * collectComments(\"const label = '// eslint-disable-next-line';\\n\", '.ts'); // []\n */\nexport function collectComments (source: string, fileExtension: string): CommentSpan[] {\n const jsx = JSX_EXTENSIONS.includes(fileExtension);\n\n if (SFC_EXTENSIONS.includes(fileExtension)) {\n return collectSfcComments(source, jsx);\n }\n\n return collectFromScript(source, jsx, 0);\n}\n\ninterface Replacement {\n start: number;\n end: number;\n text: string;\n}\n\nfunction startsItsOwnLine (source: string, start: number): boolean {\n const lineStart = source.lastIndexOf('\\n', start - 1) + 1;\n\n return source.slice(lineStart, start).trim().length === 0;\n}\n\n// A split has to leave both directives pointing at the same code. `-line` and `-next-line` each\n// target one exact physical line, so a newline between the halves would move the `-line` directive\n// off its own line and make the `-next-line` one target its sibling comment instead of the code.\n// Both therefore stay on a single line — as block comments, because a second `//` comment on the\n// same line would be swallowed by the first. Only a whole-file `eslint-disable` is line-agnostic\n// and can keep the newline separator.\nfunction splitLayout (source: string, span: CommentSpan, kind: string): { block: boolean; separator: string } {\n if (kind !== '' || !startsItsOwnLine(source, span.start)) {\n return { block: true, separator: ' ' };\n }\n\n const indent = ' '.repeat(span.start - (source.lastIndexOf('\\n', span.start - 1) + 1));\n\n return { block: span.block, separator: `\\n${indent}` };\n}\n\nfunction replacementFor (source: string, span: CommentSpan, fileExtension: string): Replacement | null {\n const head = DIRECTIVE_HEAD.exec(span.value);\n\n if (!head) {\n return null;\n }\n\n const kind = head[1] ?? '';\n const { rules, reason } = parseDirectiveBody(span.value.slice(head[0].length));\n\n if (rules.length === 0) {\n return null;\n }\n\n const moved = rules.filter(rule => movesToOxlint(rule, fileExtension));\n\n if (moved.length === 0) {\n return null;\n }\n\n const kept = rules.filter(rule => !moved.includes(rule));\n\n if (kept.length === 0) {\n return {\n start: span.start,\n end: span.end,\n text: formatDirective('oxlint', span.block, kind, moved, reason),\n };\n }\n\n const { block, separator } = splitLayout(source, span, kind);\n const text = formatDirective('oxlint', block, kind, moved, reason)\n + separator\n + formatDirective('eslint', block, kind, kept, reason);\n\n return { start: span.start, end: span.end, text };\n}\n\n/**\n * Re-points the rules oxlint now owns onto an `oxlint-disable` comment, leaving the ESLint-owned\n * ones behind. Only real comment nodes are rewritten, so a string or template literal spelling out\n * a directive is left alone.\n * @example\n * rewriteDirectives('// <eslint>-disable-next-line no-console\\nlog();', '.ts').source;\n * // '// oxlint-disable-next-line no-console\\nlog();'\n */\nexport function rewriteDirectives (source: string, fileExtension: string): { source: string; changed: boolean } {\n const replacements = collectComments(source, fileExtension)\n .map(span => replacementFor(source, span, fileExtension))\n .filter((replacement): replacement is Replacement => replacement !== null)\n .sort((left, right) => right.start - left.start);\n\n if (replacements.length === 0) {\n return { source, changed: false };\n }\n\n const next = replacements.reduce(\n (accumulator, replacement) => accumulator.slice(0, replacement.start)\n + replacement.text\n + accumulator.slice(replacement.end),\n source\n );\n\n return { source: next, changed: true };\n}\n\nfunction isLintedFile (filePath: string): boolean {\n return LINTED_EXTENSIONS.includes(extname(filePath));\n}\n\nfunction readEntries (directory: string): Dirent[] {\n try {\n return readdirSync(directory, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n\nfunction realPathOf (path: string): string | null {\n try {\n return realpathSync(path);\n } catch {\n return null;\n }\n}\n\n// A symlinked directory pointing at an ancestor — `public/assets -> ../assets`, or a link farm in a\n// monorepo — makes a naive walk recurse until the stack overflows. Directories are entered by their\n// real path, once, and an unreadable entry is skipped rather than aborting the whole migration.\nfunction collectFiles (directory: string, accumulator: string[], visited: Set<string>): void {\n const real = realPathOf(directory);\n\n if (real === null || visited.has(real)) {\n return;\n }\n\n visited.add(real);\n\n readEntries(directory).forEach(entry => {\n if (SKIPPED_DIRECTORIES.has(entry.name)) {\n return;\n }\n\n const full = join(directory, entry.name);\n\n if (entry.isDirectory()) {\n collectFiles(full, accumulator, visited);\n\n return;\n }\n\n if (entry.isFile() && isLintedFile(full)) {\n accumulator.push(full);\n }\n });\n}\n\nexport interface RewriteDirectivesResult {\n rewritten: string[];\n skipped: string[];\n}\n\nexport interface DirectiveRewriteCandidate {\n path: string;\n source: string;\n}\n\nexport interface DirectivePreview {\n candidates: DirectiveRewriteCandidate[];\n skipped: string[];\n}\n\n// Both passes run after the migration has already written the new layout and deleted the old config,\n// so a file the walk listed but cannot be read or written — EACCES on a root-owned path, or one a\n// watcher removed between the walk and the read — has to be reported and left alone. Throwing here\n// would abort a migration that is already half applied, with nothing saying the config write worked.\nfunction readSource (filePath: string): string | null {\n try {\n return readFileSync(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\n/**\n * Every file whose `eslint-disable` comments would be re-pointed, and the rewritten source, without\n * touching disk. The directive rewrite is the largest diff a migration produces, so the count is\n * reported — and confirmed — before anything is written. Files that could not be read come back in\n * `skipped` instead of aborting the walk.\n * @example\n * previewDisableDirectives('/repo').candidates.length; // 131\n */\nexport function previewDisableDirectives (cwd: string): DirectivePreview {\n const files: string[] = [];\n const candidates: DirectiveRewriteCandidate[] = [];\n const skipped: string[] = [];\n\n collectFiles(cwd, files, new Set());\n\n files.forEach(filePath => {\n const source = readSource(filePath);\n\n if (source === null) {\n skipped.push(filePath);\n\n return;\n }\n\n const result = rewriteDirectives(source, extname(filePath));\n\n if (result.changed) {\n candidates.push({ path: filePath, source: result.source });\n }\n });\n\n return { candidates, skipped };\n}\n\n/**\n * What the consumer is told about the files the rewrite could not touch: the paths, then why it\n * matters and how to finish the job. Nothing else in the migration is affected, and saying so is the\n * point — the layout was already written by the time the walk ran.\n * @example\n * formatUntouchedDirectiveFiles(['/repo/src/vendor.ts']); // '/repo/src/vendor.ts\\n\\nThese could not…'\n */\nexport function formatUntouchedDirectiveFiles (skipped: readonly string[]): string {\n return `${skipped.join('\\n')}\\n\\n`\n + 'These could not be read or written, so their `eslint-disable` comments still name rules oxlint'\n + ' now owns and ESLint will report each one as an unused directive. Everything else was migrated.'\n + ' Fix the access and re-run `npx @useinsider/eslint-config migrate` to pick them up.';\n}\n\n/**\n * Applies {@link rewriteDirectives} across a consumer tree, skipping build output and dependencies.\n * A candidate whose write fails comes back in `skipped`, so one failed write costs its own\n * directives rather than every later file's.\n * @example\n * rewriteDisableDirectives('/repo').rewritten; // ['/repo/src/logger.ts']\n */\nexport function rewriteDisableDirectives (\n cwd: string,\n candidates: readonly DirectiveRewriteCandidate[] = previewDisableDirectives(cwd).candidates\n): RewriteDirectivesResult {\n const rewritten: string[] = [];\n const skipped: string[] = [];\n\n candidates.forEach(candidate => {\n try {\n writeFileSync(candidate.path, candidate.source, 'utf8');\n rewritten.push(candidate.path);\n } catch {\n skipped.push(candidate.path);\n }\n });\n\n return { rewritten, skipped };\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('movesToOxlint', () => {\n test('claims a rule oxlint implements', () => {\n expect(movesToOxlint('no-console', '.ts')).toBe(true);\n });\n\n test('leaves a rule only ESLint implements', () => {\n expect(movesToOxlint('sonarjs/no-identical-functions', '.ts')).toBe(false);\n expect(movesToOxlint('@stylistic/indent', '.ts')).toBe(false);\n });\n\n test('leaves SFC-unsafe rules alone inside single-file components', () => {\n expect(movesToOxlint('@typescript-eslint/no-unused-vars', '.vue')).toBe(false);\n expect(movesToOxlint('@typescript-eslint/no-unused-vars', '.ts')).toBe(true);\n });\n });\n\n describe('rewriteDirectives', () => {\n test('re-points a line directive whose only rule moved', () => {\n const { source, changed } = rewriteDirectives(\n '// eslint-disable-next-line no-console\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(changed).toBe(true);\n expect(source).toBe('// oxlint-disable-next-line no-console\\nconsole.log(1);\\n');\n });\n\n test('preserves the justification tail', () => {\n const { source } = rewriteDirectives(\n '// eslint-disable-next-line no-console -- diagnostic surface\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(source).toContain('// oxlint-disable-next-line no-console -- diagnostic surface');\n });\n\n test('leaves a directive whose rules all stay with ESLint', () => {\n const input = '// eslint-disable-next-line sonarjs/no-identical-functions\\nconst a = 1;\\n';\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('keeps both halves of a split -next-line directive on one line above the code', () => {\n const { source } = rewriteDirectives(\n '// eslint-disable-next-line no-console, @stylistic/indent\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(source).toBe(\n '/* oxlint-disable-next-line no-console */'\n + ' /* eslint-disable-next-line @stylistic/indent */\\n'\n + 'console.log(1);\\n'\n );\n });\n\n test('keeps a split directive on its original indentation', () => {\n const { source } = rewriteDirectives(\n 'function run () {\\n // eslint-disable-next-line no-console, @stylistic/indent\\n'\n + ' console.log(1);\\n}\\n',\n '.ts'\n );\n\n expect(source).toContain(\n ' /* oxlint-disable-next-line no-console */'\n + ' /* eslint-disable-next-line @stylistic/indent */\\n console.log(1);\\n'\n );\n });\n\n test('splits a whole-file directive across two lines, where neither half targets a line', () => {\n const { source } = rewriteDirectives(\n '/* eslint-disable no-console, @stylistic/indent */\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(source).toBe(\n '/* oxlint-disable no-console */\\n'\n + '/* eslint-disable @stylistic/indent */\\n'\n + 'console.log(1);\\n'\n );\n });\n\n test('keeps a split -line directive on the same line, where both halves still apply', () => {\n const { source } = rewriteDirectives(\n 'console.log(1); // eslint-disable-line no-console, @stylistic/indent\\n',\n '.ts'\n );\n\n expect(source).toBe(\n 'console.log(1); /* oxlint-disable-line no-console */'\n + ' /* eslint-disable-line @stylistic/indent */\\n'\n );\n });\n\n test('rewrites a block-comment directive', () => {\n const { source } = rewriteDirectives('/* eslint-disable no-console */\\n', '.ts');\n\n expect(source).toBe('/* oxlint-disable no-console */\\n');\n });\n\n test('leaves a bare eslint-disable with no rule list alone', () => {\n const input = '/* eslint-disable */\\nconsole.log(1);\\n';\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('keeps SFC-unsafe rules on the ESLint side inside a .vue file', () => {\n const input = [\n '<script>',\n '// eslint-disable-next-line @typescript-eslint/no-unused-vars',\n 'const a = 1;',\n '</script>',\n '',\n ].join('\\n');\n\n expect(rewriteDirectives(input, '.vue').changed).toBe(false);\n });\n\n test('rewrites a directive inside a .vue script block without touching the template', () => {\n const { source } = rewriteDirectives(\n [\n '<template><div /></template>',\n '<script>',\n '// eslint-disable-next-line no-console',\n 'console.log(1);',\n '</script>',\n '',\n ].join('\\n'),\n '.vue'\n );\n\n expect(source).toContain('<template><div /></template>');\n expect(source).toContain('// oxlint-disable-next-line no-console');\n });\n\n test('rewrites an eslint-disable-line directive', () => {\n const { source } = rewriteDirectives('console.log(1); // eslint-disable-line no-console\\n', '.ts');\n\n expect(source).toBe('console.log(1); // oxlint-disable-line no-console\\n');\n });\n\n test('leaves a directive spelled out inside a string or template literal alone', () => {\n const input = [\n \"const single = '// eslint-disable-next-line no-console';\",\n 'const template = `// eslint-disable-next-line no-console`;',\n 'const multiline = `',\n '/* eslint-disable no-console */',\n '// eslint-disable-line no-console',\n '`;',\n 'export { single, template, multiline };',\n '',\n ].join('\\n');\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('rewrites a real directive in a file that also carries one inside a literal', () => {\n const { source } = rewriteDirectives(\n [\n \"const doc = 'write // eslint-disable-next-line no-console above the call';\",\n '// eslint-disable-next-line no-console',\n 'console.log(doc);',\n '',\n ].join('\\n'),\n '.ts'\n );\n\n expect(source).toContain(\"const doc = 'write // eslint-disable-next-line no-console above the call';\");\n expect(source).toContain('// oxlint-disable-next-line no-console\\nconsole.log(doc);');\n });\n\n test('keeps a reason that carries its own -- separator byte-identical', () => {\n const { source } = rewriteDirectives(\n '// eslint-disable-next-line no-console -- keep -- for now\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(source).toBe('// oxlint-disable-next-line no-console -- keep -- for now\\nconsole.log(1);\\n');\n });\n\n test.each([\n '// eslint-disable-next-liner no-console',\n '// eslint-disabled no-console',\n '// eslint-disable-lines no-console',\n ])('leaves %s alone, since it only starts with the directive text', comment => {\n const input = `${comment}\\nconsole.log(1);\\n`;\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('retries the other JSX setting, so a .js type assertion does not hide its directives', () => {\n const input = '// eslint-disable-next-line no-console\\nconsole.log(<string>value);\\n';\n\n expect(rewriteDirectives(input, '.js').source)\n .toBe('// oxlint-disable-next-line no-console\\nconsole.log(<string>value);\\n');\n });\n\n test('leaves an unparseable file untouched rather than guessing at its comments', () => {\n const input = '// eslint-disable-next-line no-console\\nconst = = =;\\n';\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('rewrites every directive in a file, not just the first', () => {\n const { source } = rewriteDirectives(\n [\n '// eslint-disable-next-line no-console',\n 'console.log(1);',\n '// eslint-disable-next-line no-var',\n 'var legacy = 2;',\n 'export { legacy };',\n '',\n ].join('\\n'),\n '.ts'\n );\n\n expect(source).toContain('// oxlint-disable-next-line no-console');\n expect(source).toContain('// oxlint-disable-next-line no-var');\n });\n });\n\n describe('collectComments', () => {\n test('finds no comment in a file whose only directive text is a string literal', () => {\n expect(collectComments(\"const a = '// eslint-disable-line no-console';\\n\", '.ts')).toStrictEqual([]);\n });\n\n test('reports ranges against the whole SFC, not the script block', () => {\n const source = '<template><p /></template>\\n<script>\\n// eslint-disable-line no-console\\n</script>\\n';\n const [span] = collectComments(source, '.vue');\n\n expect(source.slice(span.start, span.end)).toBe('// eslint-disable-line no-console');\n });\n });\n}\n","import type { StringEntry } from './types';\nimport * as ts from 'typescript';\n\nexport function toEntries (values: readonly string[]): StringEntry[] {\n return values.map(value => ({ value }));\n}\n\nexport function entryValues (entries: readonly StringEntry[]): string[] {\n return entries.map(entry => entry.value);\n}\n\nexport function cloneEntry (entry: StringEntry): StringEntry {\n return entry.leadingComment === undefined\n ? { value: entry.value }\n : { value: entry.value, leadingComment: entry.leadingComment };\n}\n\nexport function cloneEntries (entries: readonly StringEntry[]): StringEntry[] {\n return entries.map(cloneEntry);\n}\n\nexport function findEntry (entries: readonly StringEntry[], value: string): StringEntry | undefined {\n return entries.find(entry => entry.value === value);\n}\n\nexport function hasValue (entries: readonly StringEntry[], value: string): boolean {\n return entries.some(entry => entry.value === value);\n}\n\nexport function leadingCommentTextFor (sourceFile: ts.SourceFile, node: ts.Node): string | undefined {\n const ranges = ts.getLeadingCommentRanges(sourceFile.text, node.getFullStart());\n\n if (!ranges || ranges.length === 0) {\n return undefined;\n }\n\n return ranges\n .map(range => sourceFile.text.slice(range.pos, range.end))\n .join('\\n');\n}\n","import type { StringEntry, V1GlobalConf, V1GlobalToken } from '../types';\nimport type { MigrationWarning } from '../warnings';\nimport type {\n EslintrcEnv,\n EslintrcExtend,\n EslintrcExtendKind,\n EslintrcFieldComments,\n EslintrcOverride,\n EslintrcParseResult,\n EslintrcParserOptions,\n EslintrcRootBlock,\n EslintrcRulesBlock,\n} from './types';\nimport * as ts from 'typescript';\nimport { leadingCommentTextFor } from '../stringEntry';\n\ninterface ParseContext {\n sourceFile: ts.SourceFile;\n warnings: MigrationWarning[];\n constantRulesObjects: Map<string, ts.ObjectLiteralExpression>;\n}\n\nfunction lineOf (sourceFile: ts.SourceFile, node: ts.Node): number {\n const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));\n\n return line + 1;\n}\n\nfunction isStringLiteralLike (node: ts.Node): node is ts.StringLiteral | ts.NoSubstitutionTemplateLiteral {\n return ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node);\n}\n\nfunction propertyKeyName (property: ts.ObjectLiteralElementLike): string | null {\n if (!ts.isPropertyAssignment(property) && !ts.isShorthandPropertyAssignment(property)) {\n return null;\n }\n\n const key = property.name;\n\n if (ts.isIdentifier(key) || ts.isStringLiteral(key)) {\n return key.text;\n }\n\n return null;\n}\n\nfunction findProperty (\n object: ts.ObjectLiteralExpression,\n name: string\n): ts.PropertyAssignment | undefined {\n return object.properties\n .filter((property): property is ts.PropertyAssignment => ts.isPropertyAssignment(property))\n .find(property => propertyKeyName(property) === name);\n}\n\nfunction readStringArray (initializer: ts.Expression | undefined): string[] {\n if (!initializer || !ts.isArrayLiteralExpression(initializer)) {\n return [];\n }\n\n return initializer.elements\n .map(element => (isStringLiteralLike(element) ? element.text : null))\n .filter((value): value is string => value !== null);\n}\n\nfunction readStringEntries (\n initializer: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): StringEntry[] {\n if (!initializer || !ts.isArrayLiteralExpression(initializer)) {\n return [];\n }\n\n return initializer.elements\n .map(element => {\n if (!isStringLiteralLike(element)) {\n return null;\n }\n\n const leadingComment = leadingCommentTextFor(sourceFile, element);\n\n return leadingComment === undefined\n ? { value: element.text }\n : { value: element.text, leadingComment };\n })\n .filter((entry): entry is StringEntry => entry !== null);\n}\n\nfunction readStringOrArray (initializer: ts.Expression | undefined): string[] {\n if (!initializer) {\n return [];\n }\n\n if (isStringLiteralLike(initializer)) {\n return [initializer.text];\n }\n\n return readStringArray(initializer);\n}\n\nfunction readStringOrEntries (\n initializer: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): StringEntry[] {\n if (!initializer) {\n return [];\n }\n\n if (isStringLiteralLike(initializer)) {\n return [{ value: initializer.text }];\n }\n\n return readStringEntries(initializer, sourceFile);\n}\n\nfunction readGlobalValue (initializer: ts.Expression): { value: V1GlobalConf } | null {\n if (isStringLiteralLike(initializer)) {\n return { value: initializer.text };\n }\n\n if (initializer.kind === ts.SyntaxKind.TrueKeyword) {\n return { value: true };\n }\n\n if (initializer.kind === ts.SyntaxKind.FalseKeyword) {\n return { value: false };\n }\n\n if (ts.isNumericLiteral(initializer)) {\n return { value: Number(initializer.text) };\n }\n\n return null;\n}\n\nfunction readGlobalsObject (initializer: ts.Expression | undefined): Record<string, V1GlobalConf> | undefined {\n if (!initializer || !ts.isObjectLiteralExpression(initializer)) {\n return undefined;\n }\n\n const entries: [string, V1GlobalConf][] = [];\n\n initializer.properties.forEach(property => {\n if (!ts.isPropertyAssignment(property)) {\n return;\n }\n\n const name = propertyKeyName(property);\n\n if (name === null) {\n return;\n }\n\n const wrapper = readGlobalValue(property.initializer);\n\n if (wrapper === null) {\n return;\n }\n\n entries.push([name, wrapper.value]);\n });\n\n if (entries.length === 0) {\n return undefined;\n }\n\n return Object.fromEntries(entries);\n}\n\nfunction readGlobalsTokens (\n initializer: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): V1GlobalToken[] | undefined {\n if (!initializer || !ts.isObjectLiteralExpression(initializer)) {\n return undefined;\n }\n\n const tokens: V1GlobalToken[] = [];\n\n initializer.properties.forEach(property => {\n if (ts.isSpreadAssignment(property)) {\n tokens.push({ kind: 'spread', raw: property.expression.getText(sourceFile) });\n\n return;\n }\n\n if (!ts.isPropertyAssignment(property)) {\n return;\n }\n\n const name = propertyKeyName(property);\n\n if (name === null) {\n return;\n }\n\n const wrapper = readGlobalValue(property.initializer);\n\n if (wrapper === null) {\n return;\n }\n\n tokens.push({ kind: 'named', key: name, value: wrapper.value });\n });\n\n return tokens.length > 0 ? tokens : undefined;\n}\n\nfunction readPluginsArray (initializer: ts.Expression | undefined): string[] {\n if (!initializer) {\n return [];\n }\n\n if (ts.isArrayLiteralExpression(initializer)) {\n return readStringArray(initializer);\n }\n\n if (ts.isObjectLiteralExpression(initializer)) {\n return initializer.properties\n .map(propertyKeyName)\n .filter((name): name is string => name !== null);\n }\n\n return [];\n}\n\nfunction readEnvBoolean (value: ts.Expression): boolean {\n if (value.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n\n if (value.kind === ts.SyntaxKind.FalseKeyword) {\n return false;\n }\n\n if (ts.isNumericLiteral(value)) {\n return Number(value.text) !== 0;\n }\n\n if (isStringLiteralLike(value)) {\n return value.text.length > 0;\n }\n\n return false;\n}\n\nfunction readEnvFromInitializer (initializer: ts.Expression | undefined): EslintrcEnv {\n const env: EslintrcEnv = { browser: false, node: false, jest: false, jestGlobals: false };\n\n if (!initializer || !ts.isObjectLiteralExpression(initializer)) {\n return env;\n }\n\n initializer.properties.forEach(property => {\n if (!ts.isPropertyAssignment(property)) {\n return;\n }\n\n const name = propertyKeyName(property);\n const truthy = readEnvBoolean(property.initializer);\n\n if (!truthy) {\n return;\n }\n\n if (name === 'browser') {\n env.browser = true;\n } else if (name === 'node') {\n env.node = true;\n } else if (name === 'jest') {\n env.jest = true;\n } else if (name === 'jest/globals') {\n env.jestGlobals = true;\n }\n });\n\n return env;\n}\n\nfunction classifyExtendValue (raw: string): EslintrcExtend {\n if (raw.startsWith('@useinsider/eslint-config')) {\n const slashIndex = raw.indexOf('/', '@useinsider/eslint-config'.length);\n const preset = slashIndex >= 0 ? raw.slice(slashIndex + 1) : '';\n\n return { raw, kind: 'insider', insiderPreset: preset };\n }\n\n if (raw.startsWith('plugin:vue/')) {\n const rest = raw.slice('plugin:vue/'.length);\n const vueMajor: 2 | 3 = rest.startsWith('vue2-') ? 2 : 3;\n\n return { raw, kind: 'vue', vueMajor };\n }\n\n if (raw.startsWith('plugin:jest/')) {\n return { raw, kind: 'jest' };\n }\n\n if (raw.startsWith('plugin:jsdoc/')) {\n return { raw, kind: 'jsdoc' };\n }\n\n if (raw === 'airbnb' || raw === 'airbnb-base' || raw.startsWith('airbnb-')) {\n return { raw, kind: 'airbnb' };\n }\n\n const kind: EslintrcExtendKind = 'other';\n\n return { raw, kind };\n}\n\nfunction readExtends (initializer: ts.Expression | undefined): EslintrcExtend[] {\n if (!initializer) {\n return [];\n }\n\n if (isStringLiteralLike(initializer)) {\n return [classifyExtendValue(initializer.text)];\n }\n\n return readStringArray(initializer).map(classifyExtendValue);\n}\n\nfunction readParserMarker (initializer: ts.Expression | undefined): boolean {\n if (!initializer || !isStringLiteralLike(initializer)) {\n return false;\n }\n\n return initializer.text.includes('typescript-eslint');\n}\n\nfunction readParserOptions (initializer: ts.Expression | undefined, env: EslintrcEnv): {\n options: EslintrcParserOptions;\n parserMarker: boolean;\n} {\n const options: EslintrcParserOptions = {};\n let parserMarker = false;\n\n if (!initializer || !ts.isObjectLiteralExpression(initializer)) {\n return { options, parserMarker };\n }\n\n const projectProperty = findProperty(initializer, 'project');\n\n if (projectProperty) {\n const project = readStringOrArray(projectProperty.initializer);\n\n if (project.length > 0) {\n options.project = project;\n }\n }\n\n const parserProperty = findProperty(initializer, 'parser');\n\n if (parserProperty && readParserMarker(parserProperty.initializer)) {\n parserMarker = true;\n }\n\n void env;\n\n return { options, parserMarker };\n}\n\nfunction extractGlobalComponents (\n rulesNode: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile\n): StringEntry[] | undefined {\n const rule = findProperty(rulesNode, 'vue/no-undef-components');\n\n if (!rule || !ts.isArrayLiteralExpression(rule.initializer)) {\n return undefined;\n }\n\n const [, optionsNode] = rule.initializer.elements;\n\n if (!optionsNode || !ts.isObjectLiteralExpression(optionsNode)) {\n return undefined;\n }\n\n const ignorePatterns = findProperty(optionsNode, 'ignorePatterns');\n\n if (!ignorePatterns) {\n return undefined;\n }\n\n const values = readStringEntries(ignorePatterns.initializer, sourceFile);\n\n return values.length > 0 ? values : undefined;\n}\n\nfunction detectSpellCheckerOff (rulesNode: ts.ObjectLiteralExpression): boolean {\n const rule = findProperty(rulesNode, '@cspell/spellchecker');\n\n if (!rule) {\n return false;\n }\n\n return isStringLiteralLike(rule.initializer) && rule.initializer.text === 'off';\n}\n\nfunction resolveSpreadKeyCount (expression: ts.Expression, context: ParseContext): number | null {\n if (!ts.isIdentifier(expression)) {\n return null;\n }\n\n const target = context.constantRulesObjects.get(expression.text);\n\n if (!target) {\n return null;\n }\n\n const keys = new Set<string>();\n\n target.properties.forEach(property => {\n const name = propertyKeyName(property);\n\n if (name !== null && name !== 'vue/no-undef-components' && name !== '@cspell/spellchecker') {\n keys.add(name);\n }\n });\n\n return keys.size;\n}\n\nfunction readRulesBlock (\n rulesPropertyInitializer: ts.Expression | undefined,\n context: ParseContext\n): EslintrcRulesBlock {\n const block: EslintrcRulesBlock = {\n customRuleCount: 0,\n spellCheckerOff: false,\n unresolvedSpreads: [],\n };\n\n if (!rulesPropertyInitializer || !ts.isObjectLiteralExpression(rulesPropertyInitializer)) {\n return block;\n }\n\n block.globalComponents = extractGlobalComponents(rulesPropertyInitializer, context.sourceFile);\n block.spellCheckerOff = detectSpellCheckerOff(rulesPropertyInitializer);\n\n rulesPropertyInitializer.properties.forEach(property => {\n if (ts.isPropertyAssignment(property)) {\n const name = propertyKeyName(property);\n\n if (name === null || name === 'vue/no-undef-components' || name === '@cspell/spellchecker') {\n return;\n }\n\n block.customRuleCount += 1;\n\n return;\n }\n\n if (ts.isSpreadAssignment(property)) {\n const resolved = resolveSpreadKeyCount(property.expression, context);\n\n if (resolved === null) {\n const identifierName = ts.isIdentifier(property.expression) ? property.expression.text : '<expr>';\n\n block.unresolvedSpreads.push(identifierName);\n\n return;\n }\n\n block.customRuleCount += resolved;\n }\n });\n\n return block;\n}\n\nfunction collectConstantObjects (sourceFile: ts.SourceFile): Map<string, ts.ObjectLiteralExpression> {\n const map = new Map<string, ts.ObjectLiteralExpression>();\n\n sourceFile.statements.forEach(statement => {\n if (!ts.isVariableStatement(statement)) {\n return;\n }\n\n statement.declarationList.declarations.forEach(declaration => {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) {\n return;\n }\n\n if (ts.isObjectLiteralExpression(declaration.initializer)) {\n map.set(declaration.name.text, declaration.initializer);\n }\n });\n });\n\n return map;\n}\n\ninterface BlockReadInput {\n object: ts.ObjectLiteralExpression;\n line: number;\n context: ParseContext;\n}\n\nfunction assignCommentIfPresent (\n target: EslintrcFieldComments,\n key: keyof EslintrcFieldComments,\n comment: string | undefined\n): void {\n if (comment !== undefined) {\n target[key] = comment;\n }\n}\n\nfunction collectBlockFieldComments (\n object: ts.ObjectLiteralExpression,\n parserOptionsProperty: ts.PropertyAssignment | undefined,\n rulesProperty: ts.PropertyAssignment | undefined,\n rulesBlock: EslintrcRulesBlock,\n sourceFile: ts.SourceFile\n): EslintrcFieldComments | undefined {\n const fieldComments: EslintrcFieldComments = {};\n const filesProperty = findProperty(object, 'files');\n\n if (filesProperty) {\n assignCommentIfPresent(fieldComments, 'files', leadingCommentTextFor(sourceFile, filesProperty));\n }\n\n if (parserOptionsProperty && ts.isObjectLiteralExpression(parserOptionsProperty.initializer)) {\n const projectProperty = findProperty(parserOptionsProperty.initializer, 'project');\n\n if (projectProperty) {\n assignCommentIfPresent(fieldComments, 'project', leadingCommentTextFor(sourceFile, projectProperty));\n }\n }\n\n const globalsProperty = findProperty(object, 'globals');\n\n if (globalsProperty) {\n assignCommentIfPresent(fieldComments, 'globals', leadingCommentTextFor(sourceFile, globalsProperty));\n }\n\n if (rulesProperty && rulesBlock.globalComponents) {\n assignCommentIfPresent(fieldComments, 'globalComponents', leadingCommentTextFor(sourceFile, rulesProperty));\n }\n\n return Object.keys(fieldComments).length > 0 ? fieldComments : undefined;\n}\n\nfunction readSharedBlockFields (input: BlockReadInput): {\n extendsList: EslintrcExtend[];\n env: EslintrcEnv;\n parserOptions: EslintrcParserOptions;\n parserMarker: boolean;\n globals?: Record<string, V1GlobalConf>;\n globalsTokens?: V1GlobalToken[];\n customPluginNames?: string[];\n rulesBlock: EslintrcRulesBlock;\n fieldComments?: EslintrcFieldComments;\n} {\n const { object, line, context } = input;\n\n void line;\n\n const extendsProperty = findProperty(object, 'extends');\n const extendsList = readExtends(extendsProperty?.initializer);\n const env = readEnvFromInitializer(findProperty(object, 'env')?.initializer);\n const parserOptionsProperty = findProperty(object, 'parserOptions');\n const parserOptionsResult = readParserOptions(parserOptionsProperty?.initializer, env);\n const parserProperty = findProperty(object, 'parser');\n const parserMarker = parserOptionsResult.parserMarker || readParserMarker(parserProperty?.initializer);\n const globalsInit = findProperty(object, 'globals')?.initializer;\n const globalsTokens = readGlobalsTokens(globalsInit, context.sourceFile);\n const globals = readGlobalsObject(globalsInit);\n const rulesProperty = findProperty(object, 'rules');\n const rulesBlock = readRulesBlock(rulesProperty?.initializer, context);\n const insiderPluginNames = new Set<string>(['vue', '@typescript-eslint', 'jsdoc', 'import', 'jest', '@cspell']);\n const allPluginNames = readPluginsArray(findProperty(object, 'plugins')?.initializer);\n const customPluginNames = allPluginNames.filter(name => !insiderPluginNames.has(name));\n const fieldComments = collectBlockFieldComments(\n object,\n parserOptionsProperty,\n rulesProperty,\n rulesBlock,\n context.sourceFile\n );\n\n return {\n extendsList,\n env,\n parserOptions: parserOptionsResult.options,\n parserMarker,\n globals,\n globalsTokens,\n customPluginNames: customPluginNames.length > 0 ? customPluginNames : undefined,\n rulesBlock,\n fieldComments,\n };\n}\n\nfunction readOverride (\n object: ts.ObjectLiteralExpression,\n context: ParseContext,\n elementNode: ts.Node\n): EslintrcOverride | null {\n const line = lineOf(context.sourceFile, object);\n const filesProperty = findProperty(object, 'files');\n const files = filesProperty\n ? readStringOrEntries(filesProperty.initializer, context.sourceFile)\n : [];\n\n if (files.length === 0) {\n context.warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'overrides[] entry missing `files`; skipping',\n });\n\n return null;\n }\n\n const shared = readSharedBlockFields({ object, line, context });\n const leadingComment = leadingCommentTextFor(context.sourceFile, elementNode);\n const override: EslintrcOverride = {\n line,\n files,\n extends: shared.extendsList,\n env: shared.env,\n parserMarker: shared.parserMarker,\n parserOptions: shared.parserOptions,\n globals: shared.globals,\n globalsTokens: shared.globalsTokens,\n customPluginNames: shared.customPluginNames,\n rulesBlock: shared.rulesBlock,\n fieldComments: shared.fieldComments,\n };\n\n if (leadingComment !== undefined) {\n override.leadingComment = leadingComment;\n }\n\n return override;\n}\n\nfunction readOverrides (\n initializer: ts.Expression | undefined,\n context: ParseContext\n): EslintrcOverride[] {\n if (!initializer || !ts.isArrayLiteralExpression(initializer)) {\n return [];\n }\n\n return initializer.elements\n .map(element => (ts.isObjectLiteralExpression(element) ? readOverride(element, context, element) : null))\n .filter((value): value is EslintrcOverride => value !== null);\n}\n\nfunction matchesPropertyAccess (expression: ts.Expression, owner: string, member: string): boolean {\n if (!ts.isPropertyAccessExpression(expression)) {\n return false;\n }\n\n return ts.isIdentifier(expression.expression)\n && expression.expression.text === owner\n && expression.name.text === member;\n}\n\nfunction isExportsTarget (expression: ts.Expression): boolean {\n return matchesPropertyAccess(expression, 'module', 'exports')\n || matchesPropertyAccess(expression, 'exports', 'default');\n}\n\nfunction findExportObject (sourceFile: ts.SourceFile): ts.ObjectLiteralExpression | null {\n let result: ts.ObjectLiteralExpression | null = null;\n\n sourceFile.statements.forEach(statement => {\n if (result !== null) {\n return;\n }\n\n if (!ts.isExpressionStatement(statement)) {\n return;\n }\n\n const { expression } = statement;\n\n if (!ts.isBinaryExpression(expression) || expression.operatorToken.kind !== ts.SyntaxKind.EqualsToken) {\n return;\n }\n\n if (!isExportsTarget(expression.left)) {\n return;\n }\n\n if (ts.isObjectLiteralExpression(expression.right)) {\n result = expression.right;\n }\n });\n\n return result;\n}\n\nfunction buildRoot (object: ts.ObjectLiteralExpression, context: ParseContext): EslintrcRootBlock {\n const line = lineOf(context.sourceFile, object);\n const shared = readSharedBlockFields({ object, line, context });\n const overrides = readOverrides(findProperty(object, 'overrides')?.initializer, context);\n const ignorePatterns = readStringOrEntries(\n findProperty(object, 'ignorePatterns')?.initializer,\n context.sourceFile\n );\n const settingsProperty = findProperty(object, 'settings');\n\n return {\n line,\n extends: shared.extendsList,\n env: shared.env,\n parserMarker: shared.parserMarker,\n parserOptions: shared.parserOptions,\n globals: shared.globals,\n globalsTokens: shared.globalsTokens,\n customPluginNames: shared.customPluginNames,\n rulesBlock: shared.rulesBlock,\n overrides,\n ignorePatterns,\n hasSettings: Boolean(settingsProperty),\n fieldComments: shared.fieldComments,\n };\n}\n\nexport function parseEslintrc (source: string, filePath: string): EslintrcParseResult {\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const warnings: MigrationWarning[] = [];\n const constantRulesObjects = collectConstantObjects(sourceFile);\n const context: ParseContext = { sourceFile, warnings, constantRulesObjects };\n const exportObject = findExportObject(sourceFile);\n\n if (!exportObject) {\n return { found: false, root: null, warnings };\n }\n\n const root = buildRoot(exportObject, context);\n\n return { found: true, root, warnings };\n}\n","import type { V1GlobalConf, V1GlobalToken } from './types';\nimport globals from 'globals';\n\nexport const FOLDABLE_ENVS = [\n 'jest',\n 'vitest',\n 'jquery',\n 'serviceworker',\n 'worker',\n 'webextensions',\n 'node',\n 'browser',\n] as const;\n\nexport type FoldableEnv = typeof FOLDABLE_ENVS[number];\n\nconst HIGH_THRESHOLD_ENVS = new Set<FoldableEnv>(['node', 'browser']);\n\ntype TriState = 'writable' | 'readonly' | 'off';\n\nfunction normalizeGlobalValue (value: V1GlobalConf): TriState {\n if (value === true || value === 'writable' || value === 'writeable') {\n return 'writable';\n }\n\n if (value === 'off') {\n return 'off';\n }\n\n return 'readonly';\n}\n\ntype EnvEntries = Readonly<Record<string, boolean>>;\n\nfunction envEntries (env: FoldableEnv): EnvEntries {\n return globals[env];\n}\n\nfunction envHasName (env: FoldableEnv, name: string): boolean {\n return name in envEntries(env);\n}\n\nfunction envValueFor (env: FoldableEnv, name: string): TriState | null {\n const entries = envEntries(env);\n\n if (!(name in entries)) {\n return null;\n }\n\n return normalizeGlobalValue(entries[name]);\n}\n\nconst SPREAD_PATTERN = /^globals\\.([A-Za-z_$][\\w$]*)$/;\n\nfunction spreadEnvKey (raw: string): FoldableEnv | null {\n const match = SPREAD_PATTERN.exec(raw.trim());\n\n if (!match) {\n return null;\n }\n\n const [, key] = match;\n\n return (FOLDABLE_ENVS as readonly string[]).includes(key) ? (key as FoldableEnv) : null;\n}\n\nexport interface FoldResult {\n tokens: V1GlobalToken[];\n addedSpreadEnvs: FoldableEnv[];\n}\n\nexport function foldGlobalsTokens (input: readonly V1GlobalToken[]): FoldResult {\n const preservedSpreads: V1GlobalToken[] = [];\n const preservedSpreadEnvs = new Set<FoldableEnv>();\n const namedTokens: Extract<V1GlobalToken, { kind: 'named' }>[] = [];\n\n input.forEach(token => {\n if (token.kind === 'spread') {\n preservedSpreads.push({ ...token });\n\n const envKey = spreadEnvKey(token.raw);\n\n if (envKey) {\n preservedSpreadEnvs.add(envKey);\n }\n\n return;\n }\n\n namedTokens.push({ ...token });\n });\n\n const remaining = new Map<string, Extract<V1GlobalToken, { kind: 'named' }>>();\n const namedOrder: string[] = [];\n\n namedTokens.forEach(token => {\n if (!remaining.has(token.key)) {\n namedOrder.push(token.key);\n }\n\n remaining.set(token.key, token);\n });\n\n const syntheticSpreads: V1GlobalToken[] = [];\n const addedSpreadEnvs: FoldableEnv[] = [];\n\n FOLDABLE_ENVS.forEach(env => {\n if (preservedSpreadEnvs.has(env)) {\n namedOrder.forEach(name => {\n const named = remaining.get(name);\n\n if (!named) {\n return;\n }\n\n const envValue = envValueFor(env, name);\n\n if (envValue === null) {\n return;\n }\n\n if (envValue !== normalizeGlobalValue(named.value)) {\n return;\n }\n\n remaining.delete(name);\n });\n\n return;\n }\n\n const matches: string[] = [];\n\n namedOrder.forEach(name => {\n const named = remaining.get(name);\n\n if (!named) {\n return;\n }\n\n if (!envHasName(env, name)) {\n return;\n }\n\n const envValue = envValueFor(env, name);\n\n if (envValue === null) {\n return;\n }\n\n if (envValue !== normalizeGlobalValue(named.value)) {\n return;\n }\n\n matches.push(name);\n });\n\n const threshold = HIGH_THRESHOLD_ENVS.has(env) ? 3 : 1;\n\n if (matches.length < threshold) {\n return;\n }\n\n matches.forEach(name => remaining.delete(name));\n syntheticSpreads.push({ kind: 'spread', raw: `globals.${env}` });\n addedSpreadEnvs.push(env);\n });\n\n const finalNamed: V1GlobalToken[] = namedOrder\n .map(name => remaining.get(name))\n .filter((token): token is Extract<V1GlobalToken, { kind: 'named' }> => token !== undefined)\n .map(token => ({ ...token }));\n\n const tokens: V1GlobalToken[] = [...syntheticSpreads, ...preservedSpreads, ...finalNamed];\n\n return { tokens, addedSpreadEnvs };\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('foldGlobalsTokens', () => {\n test('folds exact jest globals set into a single spread', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'expect', value: 'readonly' },\n { kind: 'named', key: 'beforeEach', value: 'readonly' },\n { kind: 'named', key: 'afterEach', value: 'readonly' },\n { kind: 'named', key: 'jest', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([{ kind: 'spread', raw: 'globals.jest' }]);\n expect(addedSpreadEnvs).toStrictEqual(['jest']);\n });\n\n test('folds jest + vitest in deterministic priority order', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'jest', value: 'readonly' },\n { kind: 'named', key: 'vitest', value: 'readonly' },\n { kind: 'named', key: 'vi', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'spread', raw: 'globals.vitest' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual(['jest', 'vitest']);\n });\n\n test('keeps unmatched custom names as explicit entries after the spread', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual(['jest']);\n });\n\n test('skips node fold below the 3-name threshold', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'process', value: 'readonly' },\n { kind: 'named', key: 'Buffer', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'named', key: 'process', value: 'readonly' },\n { kind: 'named', key: 'Buffer', value: 'readonly' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual([]);\n });\n\n test('folds node when at least 3 node-exclusive names match', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'process', value: 'readonly' },\n { kind: 'named', key: 'Buffer', value: 'readonly' },\n { kind: 'named', key: 'global', value: 'readonly' },\n { kind: 'named', key: '__dirname', value: 'readonly' },\n { kind: 'named', key: '__filename', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual(['node']);\n expect(tokens).toStrictEqual([{ kind: 'spread', raw: 'globals.node' }]);\n });\n\n test('does not fold when consumer value disagrees with env value', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'jest', value: 'writable' },\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual(['jest']);\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'named', key: 'jest', value: 'writable' },\n ]);\n });\n\n test('preserves a pre-existing spread and drops named entries already covered', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual([]);\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n });\n\n test('keeps a pre-existing non-foldable spread verbatim with its order before explicit entries', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'spread', raw: 'customGlobals' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'customGlobals' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual([]);\n });\n\n test('returns explicit entries unchanged when no env matches', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n { kind: 'named', key: 'INSIDER_API_BASE_URL', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n { kind: 'named', key: 'INSIDER_API_BASE_URL', value: 'readonly' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual([]);\n });\n\n test('renders synthetic spreads before preserved spreads and explicit names', () => {\n const { tokens } = foldGlobalsTokens([\n { kind: 'spread', raw: 'customGlobals' },\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'spread', raw: 'customGlobals' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n });\n\n test('treats jest globals jest=false (readonly) as compatible with readonly', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'jest', value: false },\n { kind: 'named', key: 'describe', value: false },\n { kind: 'named', key: 'it', value: false },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual(['jest']);\n expect(tokens).toStrictEqual([{ kind: 'spread', raw: 'globals.jest' }]);\n });\n\n test('mocha-only names (before/after) stay explicit because mocha is not foldable', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'before', value: 'readonly' },\n { kind: 'named', key: 'after', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual([]);\n expect(tokens).toStrictEqual([\n { kind: 'named', key: 'before', value: 'readonly' },\n { kind: 'named', key: 'after', value: 'readonly' },\n ]);\n });\n\n test('jest+vitest fold but mocha-only before/after remain explicit (product-catalog scenario)', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'beforeEach', value: 'readonly' },\n { kind: 'named', key: 'afterEach', value: 'readonly' },\n { kind: 'named', key: 'before', value: 'readonly' },\n { kind: 'named', key: 'after', value: 'readonly' },\n { kind: 'named', key: 'jest', value: 'readonly' },\n { kind: 'named', key: 'expect', value: 'readonly' },\n { kind: 'named', key: 'vitest', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual(['jest', 'vitest']);\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'spread', raw: 'globals.vitest' },\n { kind: 'named', key: 'before', value: 'readonly' },\n { kind: 'named', key: 'after', value: 'readonly' },\n ]);\n });\n });\n}\n","import type {\n PreservedImport,\n StringEntry,\n V1GlobalConf,\n V1GlobalToken,\n V1PresetName,\n V2Config,\n V2EntryFieldComments,\n V2Plan,\n V2ScopeEntry,\n V2ScopeName,\n} from '../types';\nimport type { MigrationWarning } from '../warnings';\nimport type {\n EslintrcEnv,\n EslintrcExtend,\n EslintrcFieldComments,\n EslintrcOverride,\n EslintrcParseResult,\n EslintrcRootBlock,\n} from './types';\nimport { foldGlobalsTokens } from '../globalsFolding';\nimport { cloneEntries, toEntries } from '../stringEntry';\n\nconst presetToScope: Partial<Record<V1PresetName, V2ScopeName>> = {\n javascript: 'javascript',\n 'javascript-dom': 'javascriptDom',\n 'javascript-node': 'javascriptNode',\n typescript: 'typescript',\n 'typescript-dom': 'typescriptDom',\n 'typescript-node': 'typescriptNode',\n vue2: 'vue2',\n vue3: 'vue3',\n 'vue2-typescript': 'vue2Typescript',\n 'vue3-typescript': 'vue3Typescript',\n jest: 'jest',\n vitest: 'vitest',\n 'jsdoc-based-ts': 'jsdocBasedTs',\n};\n\nconst tsScopes = new Set<V2ScopeName>([\n 'typescript',\n 'typescriptDom',\n 'typescriptNode',\n 'vue2Typescript',\n 'vue3Typescript',\n 'jsdocBasedTs',\n]);\n\nconst vueScopes = new Set<V2ScopeName>([\n 'vue2',\n 'vue3',\n 'vue2Typescript',\n 'vue3Typescript',\n]);\n\nconst defaultJestGlob = '**/*.{test,spec}.{ts,tsx,js,jsx,vue}';\n\ninterface ScopeInferenceInput {\n env: EslintrcEnv;\n extendsList: EslintrcExtend[];\n parserMarker: boolean;\n line: number;\n warnings: MigrationWarning[];\n}\n\ninterface ScopeInferenceResult {\n primary: V2ScopeName | null;\n addJest: boolean;\n vueMajor?: 2 | 3;\n}\n\nfunction hasVueExtend (extendsList: EslintrcExtend[]): boolean {\n return extendsList.some(extend => extend.kind === 'vue');\n}\n\nfunction hasJestExtend (extendsList: EslintrcExtend[]): boolean {\n return extendsList.some(extend => extend.kind === 'jest');\n}\n\nfunction inferVueMajor (extendsList: EslintrcExtend[]): 2 | 3 {\n const vueExtend = extendsList.find(extend => extend.kind === 'vue');\n\n if (vueExtend?.vueMajor === 2) {\n return 2;\n }\n\n return 3;\n}\n\nfunction mapVueScope (vueMajor: 2 | 3, tsMarker: boolean): V2ScopeName {\n if (vueMajor === 2) {\n return tsMarker ? 'vue2Typescript' : 'vue2';\n }\n\n return tsMarker ? 'vue3Typescript' : 'vue3';\n}\n\nfunction warnEnvBothBrowserAndNode (env: EslintrcEnv, line: number, warnings: MigrationWarning[]): void {\n if (!(env.browser && env.node)) {\n return;\n }\n\n if (warnings.some(warning => warning.kind === 'env-both-browser-and-node')) {\n return;\n }\n\n warnings.push({\n kind: 'env-both-browser-and-node',\n line,\n message: 'env.browser and env.node both true — defaulting to Dom scope',\n });\n}\n\nfunction inferPrimaryScope (input: ScopeInferenceInput): ScopeInferenceResult {\n const { env, extendsList, parserMarker, line, warnings } = input;\n const jestMarker = env.jest || env.jestGlobals || hasJestExtend(extendsList);\n\n warnEnvBothBrowserAndNode(env, line, warnings);\n\n if (hasVueExtend(extendsList)) {\n const vueMajor = inferVueMajor(extendsList);\n const scope = mapVueScope(vueMajor, parserMarker);\n\n return { primary: scope, addJest: jestMarker, vueMajor };\n }\n\n if (env.browser) {\n return { primary: parserMarker ? 'typescriptDom' : 'javascriptDom', addJest: jestMarker };\n }\n\n if (env.node) {\n return { primary: parserMarker ? 'typescriptNode' : 'javascriptNode', addJest: jestMarker };\n }\n\n return { primary: null, addJest: jestMarker };\n}\n\nfunction freshConfig (): V2Config {\n return {\n ignores: [],\n scopes: new Map(),\n strictGlobs: [],\n strictWholeFile: false,\n spellChecker: { ignoredPaths: [] },\n configFiles: [],\n };\n}\n\nfunction appendScope (config: V2Config, scope: V2ScopeName, entry: V2ScopeEntry): void {\n const existing = config.scopes.get(scope);\n\n if (existing) {\n existing.push(entry);\n } else {\n config.scopes.set(scope, [entry]);\n }\n}\n\nfunction mergeGlobals (\n base: Record<string, V1GlobalConf> | undefined,\n extra: Record<string, V1GlobalConf> | undefined\n): Record<string, V1GlobalConf> | undefined {\n if (!base && !extra) {\n return undefined;\n }\n\n const merged: Record<string, V1GlobalConf> = { ...base };\n\n if (extra) {\n Object.entries(extra).forEach(([key, value]) => {\n if (!(key in merged)) {\n merged[key] = value;\n }\n });\n }\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction applyTsconfig (\n entry: V2ScopeEntry,\n scope: V2ScopeName,\n perBlockProject: string[] | undefined,\n fallbackProject: string[] | undefined\n): void {\n if (!tsScopes.has(scope)) {\n return;\n }\n\n const project = perBlockProject && perBlockProject.length > 0 ? perBlockProject : fallbackProject;\n\n if (project && project.length > 0) {\n entry.tsconfigPaths = toEntries(project);\n }\n}\n\nfunction applyGlobalComponents (\n entry: V2ScopeEntry,\n scope: V2ScopeName,\n globalComponents: StringEntry[] | undefined\n): void {\n if (!vueScopes.has(scope) || !globalComponents || globalComponents.length === 0) {\n return;\n }\n\n entry.globalComponents = cloneEntries(globalComponents);\n}\n\ninterface BlockEmitInput {\n files: StringEntry[];\n scope: V2ScopeName;\n perBlockProject?: string[];\n fallbackProject?: string[];\n globalComponents?: StringEntry[];\n blockGlobals?: Record<string, V1GlobalConf>;\n blockGlobalsTokens?: V1GlobalToken[];\n topLevelGlobals?: Record<string, V1GlobalConf>;\n topLevelGlobalsTokens?: V1GlobalToken[];\n fieldComments?: EslintrcFieldComments;\n}\n\nfunction mapEslintrcFieldComments (\n incoming: EslintrcFieldComments | undefined,\n scope: V2ScopeName\n): V2EntryFieldComments | undefined {\n if (!incoming) {\n return undefined;\n }\n\n const result: V2EntryFieldComments = {};\n\n if (incoming.files !== undefined) {\n result.files = incoming.files;\n }\n\n if (incoming.globals !== undefined) {\n result.globals = incoming.globals;\n }\n\n if (incoming.project !== undefined && tsScopes.has(scope)) {\n result.tsconfigPaths = incoming.project;\n }\n\n if (incoming.globalComponents !== undefined && vueScopes.has(scope)) {\n result.globalComponents = incoming.globalComponents;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction mergeGlobalsTokens (\n base: V1GlobalToken[] | undefined,\n extra: V1GlobalToken[] | undefined\n): V1GlobalToken[] | undefined {\n if (!base && !extra) {\n return undefined;\n }\n\n const merged: V1GlobalToken[] = [];\n const seenNamed = new Map<string, number>();\n\n const append = (tokens: V1GlobalToken[]) => {\n tokens.forEach(token => {\n if (token.kind === 'spread') {\n merged.push({ ...token });\n\n return;\n }\n\n const seenIndex = seenNamed.get(token.key);\n\n if (seenIndex === undefined) {\n seenNamed.set(token.key, merged.length);\n merged.push({ ...token });\n\n return;\n }\n\n merged[seenIndex] = { ...token };\n });\n };\n\n if (base) {\n append(base);\n }\n\n if (extra) {\n append(extra);\n }\n\n return merged.length > 0 ? merged : undefined;\n}\n\nfunction buildEntry (input: BlockEmitInput): V2ScopeEntry {\n const entry: V2ScopeEntry = { files: cloneEntries(input.files) };\n\n applyTsconfig(entry, input.scope, input.perBlockProject, input.fallbackProject);\n applyGlobalComponents(entry, input.scope, input.globalComponents);\n\n const globalsTokens = mergeGlobalsTokens(input.blockGlobalsTokens, input.topLevelGlobalsTokens);\n\n if (globalsTokens) {\n entry.globalsTokens = globalsTokens;\n }\n\n const globals = mergeGlobals(input.blockGlobals, input.topLevelGlobals);\n\n if (globals) {\n entry.globals = globals;\n }\n\n const fieldComments = mapEslintrcFieldComments(input.fieldComments, input.scope);\n\n if (fieldComments) {\n entry.fieldComments = fieldComments;\n }\n\n return entry;\n}\n\ninterface EmitContext {\n config: V2Config;\n warnings: MigrationWarning[];\n topLevelGlobals?: Record<string, V1GlobalConf>;\n topLevelGlobalsTokens?: V1GlobalToken[];\n topLevelProject?: string[];\n droppedRules: number;\n droppedBlocks: number;\n droppedPlugins: Set<string>;\n droppedPluginEntries: number;\n}\n\ninterface BlockProcessInput {\n line: number;\n files: StringEntry[];\n extendsList: EslintrcExtend[];\n env: EslintrcEnv;\n parserMarker: boolean;\n perBlockProject?: string[];\n globalComponents?: StringEntry[];\n spellCheckerOff: boolean;\n blockGlobals?: Record<string, V1GlobalConf>;\n blockGlobalsTokens?: V1GlobalToken[];\n customPluginNames?: string[];\n rulesCount: number;\n unresolvedSpreads: string[];\n leadingComment?: string;\n fieldComments?: EslintrcFieldComments;\n}\n\nfunction collectInsiderPresets (extendsList: EslintrcExtend[]): string[] {\n return extendsList\n .filter(extend => extend.kind === 'insider' && extend.insiderPreset)\n .map(extend => extend.insiderPreset ?? '');\n}\n\nfunction mapInsiderPreset (preset: string): V2ScopeName | 'config' | null {\n if (preset === 'config') {\n return 'config';\n }\n\n const scope = presetToScope[preset as V1PresetName];\n\n return scope ?? null;\n}\n\nfunction captureConfigPresetFiles (input: BlockProcessInput, context: EmitContext): void {\n input.files.forEach(file => {\n if (!context.config.configFiles.some(existing => existing.value === file.value)) {\n context.config.configFiles.push({ ...file });\n }\n });\n}\n\nfunction emitInsiderScopes (\n presets: string[],\n input: BlockProcessInput,\n context: EmitContext\n): V2ScopeEntry | null {\n let firstEntry: V2ScopeEntry | null = null;\n\n presets.forEach(preset => {\n const mapped = mapInsiderPreset(preset);\n\n if (mapped === null) {\n context.warnings.push({\n kind: 'unknown-preset',\n line: input.line,\n message: `Unknown @useinsider preset '${preset}' — dropped`,\n });\n\n return;\n }\n\n if (mapped === 'config') {\n captureConfigPresetFiles(input, context);\n\n return;\n }\n\n const entry = buildEntry({\n files: input.files,\n scope: mapped,\n perBlockProject: input.perBlockProject,\n fallbackProject: context.topLevelProject,\n globalComponents: input.globalComponents,\n blockGlobals: input.blockGlobals,\n blockGlobalsTokens: input.blockGlobalsTokens,\n topLevelGlobals: context.topLevelGlobals,\n topLevelGlobalsTokens: context.topLevelGlobalsTokens,\n fieldComments: input.fieldComments,\n });\n\n appendScope(context.config, mapped, entry);\n\n if (!firstEntry) {\n firstEntry = entry;\n }\n });\n\n return firstEntry;\n}\n\nfunction emitInferredScopes (input: BlockProcessInput, context: EmitContext): V2ScopeEntry | null {\n const inference = inferPrimaryScope({\n env: input.env,\n extendsList: input.extendsList,\n parserMarker: input.parserMarker,\n line: input.line,\n warnings: context.warnings,\n });\n\n let firstEntry: V2ScopeEntry | null = null;\n\n if (inference.primary) {\n const entry = buildEntry({\n files: input.files,\n scope: inference.primary,\n perBlockProject: input.perBlockProject,\n fallbackProject: context.topLevelProject,\n globalComponents: input.globalComponents,\n blockGlobals: input.blockGlobals,\n blockGlobalsTokens: input.blockGlobalsTokens,\n topLevelGlobals: context.topLevelGlobals,\n topLevelGlobalsTokens: context.topLevelGlobalsTokens,\n fieldComments: input.fieldComments,\n });\n\n appendScope(context.config, inference.primary, entry);\n firstEntry = entry;\n }\n\n if (inference.addJest) {\n const entry = buildEntry({\n files: [{ value: defaultJestGlob }],\n scope: 'jest',\n blockGlobals: input.blockGlobals,\n blockGlobalsTokens: input.blockGlobalsTokens,\n topLevelGlobals: context.topLevelGlobals,\n topLevelGlobalsTokens: context.topLevelGlobalsTokens,\n });\n\n appendScope(context.config, 'jest', entry);\n\n if (!firstEntry) {\n firstEntry = entry;\n }\n }\n\n return firstEntry;\n}\n\nfunction recordDroppedRules (input: BlockProcessInput, context: EmitContext): void {\n if (input.rulesCount > 0) {\n context.droppedRules += input.rulesCount;\n context.droppedBlocks += 1;\n }\n\n input.unresolvedSpreads.forEach(name => {\n context.warnings.push({\n kind: 'unresolved-rules-spread',\n line: input.line,\n message: `Could not resolve identifier '${name}' inside rules; dropping`,\n });\n });\n}\n\nfunction applySpellChecker (input: BlockProcessInput, context: EmitContext): void {\n if (!input.spellCheckerOff) {\n return;\n }\n\n input.files.forEach(file => {\n if (!context.config.spellChecker.ignoredPaths.some(existing => existing.value === file.value)) {\n context.config.spellChecker.ignoredPaths.push({ ...file });\n }\n });\n}\n\nfunction recordDroppedPlugins (input: BlockProcessInput, context: EmitContext): void {\n if (!input.customPluginNames || input.customPluginNames.length === 0) {\n return;\n }\n\n input.customPluginNames.forEach(name => context.droppedPlugins.add(name));\n context.droppedPluginEntries += 1;\n}\n\nfunction processBlock (input: BlockProcessInput, context: EmitContext): boolean {\n recordDroppedRules(input, context);\n recordDroppedPlugins(input, context);\n applySpellChecker(input, context);\n\n const insiderPresets = collectInsiderPresets(input.extendsList);\n const firstEntry = insiderPresets.length > 0\n ? emitInsiderScopes(insiderPresets, input, context)\n : emitInferredScopes(input, context);\n\n if (firstEntry && input.leadingComment !== undefined) {\n firstEntry.leadingComment = input.leadingComment;\n }\n\n return firstEntry !== null;\n}\n\nfunction blockInputFromRoot (root: EslintrcRootBlock, defaultFiles: StringEntry[]): BlockProcessInput {\n return {\n line: root.line,\n files: defaultFiles,\n extendsList: root.extends,\n env: root.env,\n parserMarker: root.parserMarker,\n perBlockProject: root.parserOptions.project,\n globalComponents: root.rulesBlock.globalComponents,\n spellCheckerOff: root.rulesBlock.spellCheckerOff,\n blockGlobals: undefined,\n blockGlobalsTokens: undefined,\n customPluginNames: root.customPluginNames,\n rulesCount: root.rulesBlock.customRuleCount,\n unresolvedSpreads: root.rulesBlock.unresolvedSpreads,\n fieldComments: root.fieldComments,\n };\n}\n\nfunction isBareOverride (override: EslintrcOverride): boolean {\n const noExtends = override.extends.length === 0;\n const noEnv = !override.env.browser && !override.env.node && !override.env.jest && !override.env.jestGlobals;\n const noParserMarker = !override.parserMarker;\n\n return noExtends && noEnv && noParserMarker;\n}\n\nfunction blockInputFromOverride (override: EslintrcOverride, root: EslintrcRootBlock): BlockProcessInput {\n const inherit = isBareOverride(override);\n\n return {\n line: override.line,\n files: override.files,\n extendsList: inherit ? root.extends : override.extends,\n env: inherit ? root.env : override.env,\n parserMarker: inherit ? root.parserMarker : override.parserMarker,\n perBlockProject: override.parserOptions.project,\n globalComponents: override.rulesBlock.globalComponents,\n spellCheckerOff: override.rulesBlock.spellCheckerOff,\n blockGlobals: override.globals,\n blockGlobalsTokens: override.globalsTokens,\n customPluginNames: override.customPluginNames,\n rulesCount: override.rulesBlock.customRuleCount,\n unresolvedSpreads: override.rulesBlock.unresolvedSpreads,\n leadingComment: override.leadingComment,\n fieldComments: override.fieldComments,\n };\n}\n\nfunction defaultRootFiles (root: EslintrcRootBlock): StringEntry[] {\n if (root.env.browser && hasVueExtend(root.extends)) {\n return toEntries(['**/*.{js,jsx,ts,tsx,vue}']);\n }\n\n if (root.parserMarker) {\n return toEntries(['**/*.{ts,tsx}']);\n }\n\n return toEntries(['**/*.{js,jsx,cjs,mjs}']);\n}\n\nfunction applyIgnorePatterns (root: EslintrcRootBlock, config: V2Config): void {\n root.ignorePatterns.forEach(ignore => {\n if (!config.ignores.some(existing => existing.value === ignore.value)) {\n config.ignores.push({ ...ignore });\n }\n });\n}\n\nfunction recordSettingsWarning (root: EslintrcRootBlock, warnings: MigrationWarning[]): void {\n if (root.hasSettings) {\n warnings.push({\n kind: 'dropped-settings',\n line: root.line,\n message: 'Dropped legacy `settings` block — flat config does not support this surface',\n });\n }\n}\n\nfunction consolidateExtendsWarning (\n extendKinds: Set<EslintrcExtend['kind']>,\n rawDropped: Set<string>,\n warnings: MigrationWarning[]\n): void {\n if (rawDropped.size === 0) {\n return;\n }\n\n const list = [...rawDropped].sort((left, right) => left.localeCompare(right)).join(', ');\n\n warnings.push({\n kind: 'dropped-extends',\n message: `Dropped non-@useinsider extends: ${list}`,\n });\n\n void extendKinds;\n}\n\nfunction recordNoInsiderWarning (hasInsiderExtend: boolean, warnings: MigrationWarning[]): void {\n if (hasInsiderExtend) {\n return;\n }\n\n warnings.push({\n kind: 'no-insider-extends',\n message:\n 'Source did not extend any @useinsider/eslint-config preset — output is a best-effort inference. '\n + 'Custom rules were dropped; review the generated config and adjust scopes as needed.',\n });\n}\n\nfunction collectExtendKinds (root: EslintrcRootBlock): {\n kinds: Set<EslintrcExtend['kind']>;\n rawDropped: Set<string>;\n hasInsider: boolean;\n} {\n const kinds = new Set<EslintrcExtend['kind']>();\n const rawDropped = new Set<string>();\n let hasInsider = false;\n\n const visit = (list: EslintrcExtend[]) => {\n list.forEach(extend => {\n kinds.add(extend.kind);\n\n if (extend.kind === 'insider') {\n hasInsider = true;\n\n return;\n }\n\n rawDropped.add(extend.raw);\n });\n };\n\n visit(root.extends);\n\n root.overrides.forEach(override => visit(override.extends));\n\n return { kinds, rawDropped, hasInsider };\n}\n\nfunction formatDroppedRulesMessage (count: number, blocks: number): string {\n const rulesLabel = count === 1 ? 'rule override' : 'rule overrides';\n const blocksLabel = blocks === 1 ? 'block' : 'blocks';\n\n return `Dropped ${count} custom ${rulesLabel} across ${blocks} ${blocksLabel}`;\n}\n\nfunction tokensFromRecord (globals: Record<string, V1GlobalConf>): V1GlobalToken[] {\n return Object.entries(globals).map(([key, value]) => ({ kind: 'named' as const, key, value }));\n}\n\nfunction resolveBaseTokens (entry: V2ScopeEntry): V1GlobalToken[] | undefined {\n if (entry.globalsTokens && entry.globalsTokens.length > 0) {\n return entry.globalsTokens;\n }\n\n if (entry.globals && Object.keys(entry.globals).length > 0) {\n return tokensFromRecord(entry.globals);\n }\n\n return undefined;\n}\n\nfunction applyGlobalsFolding (config: V2Config): boolean {\n let anySyntheticEmitted = false;\n\n config.scopes.forEach(entries => {\n entries.forEach(entry => {\n const baseTokens = resolveBaseTokens(entry);\n\n if (!baseTokens) {\n return;\n }\n\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens(baseTokens);\n\n if (addedSpreadEnvs.length > 0) {\n anySyntheticEmitted = true;\n }\n\n entry.globalsTokens = tokens;\n\n const namedRecord: Record<string, V1GlobalConf> = {};\n\n tokens.forEach(token => {\n if (token.kind === 'named') {\n namedRecord[token.key] = token.value;\n }\n });\n\n entry.globals = Object.keys(namedRecord).length > 0 ? namedRecord : undefined;\n });\n });\n\n return anySyntheticEmitted;\n}\n\nfunction buildPreservedImports (emittedSyntheticSpread: boolean): PreservedImport[] {\n if (!emittedSyntheticSpread) {\n return [];\n }\n\n return [{ raw: \"import globals from 'globals';\", moduleSpecifier: 'globals' }];\n}\n\nexport function transformEslintrcToV2 (parseResult: EslintrcParseResult): V2Plan {\n const config = freshConfig();\n const warnings: MigrationWarning[] = [...parseResult.warnings];\n\n if (!parseResult.root) {\n return {\n config,\n silenceRulesCalls: [],\n needsSilenceRulesImport: false,\n preservedImports: [],\n warnings,\n droppedRuleCount: 0,\n droppedRuleBlockCount: 0,\n };\n }\n\n const { root } = parseResult;\n const topLevelGlobals = root.globals;\n const topLevelGlobalsTokens = root.globalsTokens;\n const topLevelProject = root.parserOptions.project;\n const context: EmitContext = {\n config,\n warnings,\n topLevelGlobals,\n topLevelGlobalsTokens,\n topLevelProject,\n droppedRules: 0,\n droppedBlocks: 0,\n droppedPlugins: new Set<string>(),\n droppedPluginEntries: 0,\n };\n\n applyIgnorePatterns(root, config);\n recordSettingsWarning(root, warnings);\n\n const overridesEmittedAny = root.overrides.length > 0;\n\n if (overridesEmittedAny) {\n root.overrides.forEach(override => {\n processBlock(blockInputFromOverride(override, root), context);\n });\n\n if (root.rulesBlock.customRuleCount > 0 || root.rulesBlock.unresolvedSpreads.length > 0) {\n const rootFiles = defaultRootFiles(root);\n\n recordDroppedRules(blockInputFromRoot(root, rootFiles), context);\n }\n } else {\n const rootFiles = defaultRootFiles(root);\n\n processBlock(blockInputFromRoot(root, rootFiles), context);\n }\n\n if (context.droppedRules > 0) {\n warnings.push({\n kind: 'dropped-rules',\n message: formatDroppedRulesMessage(context.droppedRules, context.droppedBlocks),\n });\n }\n\n const { kinds, rawDropped, hasInsider } = collectExtendKinds(root);\n\n consolidateExtendsWarning(kinds, rawDropped, warnings);\n recordNoInsiderWarning(hasInsider, warnings);\n\n if (context.droppedPluginEntries > 0 && context.droppedPlugins.size > 0) {\n const sorted = [...context.droppedPlugins].sort((left, right) => left.localeCompare(right));\n\n warnings.push({\n kind: 'dropped-plugins',\n message: `Dropped custom plugins on ${context.droppedPluginEntries} entries: ${sorted.join(', ')}`,\n });\n }\n\n const emittedSyntheticSpread = applyGlobalsFolding(config);\n\n return {\n config,\n silenceRulesCalls: [],\n needsSilenceRulesImport: false,\n preservedImports: buildPreservedImports(emittedSyntheticSpread),\n warnings,\n droppedRuleCount: context.droppedRules,\n droppedRuleBlockCount: context.droppedBlocks,\n };\n}\n","import type {\n ParseResult,\n PreservedImport,\n SilenceRulesCall,\n StringEntry,\n V1ArrayElement,\n V1ConfigFieldComments,\n V1GlobalConf,\n V1GlobalToken,\n V1PresetName,\n V1StandaloneGlobals,\n V1UseInsiderCall,\n} from './types';\nimport type { MigrationWarning } from './warnings';\nimport * as ts from 'typescript';\nimport { leadingCommentTextFor } from './stringEntry';\n\nconst knownPresets = new Set<V1PresetName>([\n 'config',\n 'javascript',\n 'javascript-dom',\n 'javascript-node',\n 'typescript',\n 'typescript-dom',\n 'typescript-node',\n 'vue2',\n 'vue2-typescript',\n 'vue3',\n 'vue3-typescript',\n 'jest',\n 'vitest',\n 'jsdoc-based-ts',\n 'strict',\n 'dom',\n 'node',\n]);\n\nfunction lineOf (sourceFile: ts.SourceFile, node: ts.Node): number {\n const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));\n\n return line + 1;\n}\n\nfunction unwrapTypeCasts (expression: ts.Expression): ts.Expression {\n let current = expression;\n\n while (\n ts.isParenthesizedExpression(current)\n || ts.isAsExpression(current)\n || ts.isTypeAssertionExpression(current)\n || ts.isSatisfiesExpression(current)\n ) {\n current = current.expression;\n }\n\n return current;\n}\n\nfunction unwrapAwait (expression: ts.Expression): ts.Expression {\n const peeled = unwrapTypeCasts(expression);\n\n if (ts.isAwaitExpression(peeled)) {\n return unwrapTypeCasts(peeled.expression);\n }\n\n return peeled;\n}\n\nfunction isStringLiteral (node: ts.Node): node is ts.StringLiteral | ts.NoSubstitutionTemplateLiteral {\n return ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node);\n}\n\nfunction readStringLiteralArray (node: ts.Expression | undefined): string[] | undefined {\n if (!node || !ts.isArrayLiteralExpression(node)) {\n return undefined;\n }\n\n const items = node.elements.map(element => (isStringLiteral(element) ? element.text : null));\n\n if (items.some(item => item === null)) {\n return undefined;\n }\n\n return items as string[];\n}\n\nfunction readStringLiteralEntries (\n node: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): StringEntry[] | undefined {\n if (!node || !ts.isArrayLiteralExpression(node)) {\n return undefined;\n }\n\n const entries: (StringEntry | null)[] = node.elements.map(element => {\n if (!isStringLiteral(element)) {\n return null;\n }\n\n const leadingComment = leadingCommentTextFor(sourceFile, element);\n\n return leadingComment === undefined\n ? { value: element.text }\n : { value: element.text, leadingComment };\n });\n\n if (entries.some(entry => entry === null)) {\n return undefined;\n }\n\n return entries as StringEntry[];\n}\n\nfunction propertyKeyName (property: ts.ObjectLiteralElementLike): string | null {\n if (!ts.isPropertyAssignment(property)) {\n return null;\n }\n\n const key = property.name;\n\n if (ts.isIdentifier(key) || ts.isStringLiteral(key)) {\n return key.text;\n }\n\n return null;\n}\n\nfunction findProperty (\n object: ts.ObjectLiteralExpression,\n name: string\n): ts.PropertyAssignment | undefined {\n return object.properties\n .filter((property): property is ts.PropertyAssignment => ts.isPropertyAssignment(property))\n .find(property => propertyKeyName(property) === name);\n}\n\nfunction readGlobalValue (initializer: ts.Expression): { value: V1GlobalConf } | null {\n if (isStringLiteral(initializer)) {\n return { value: initializer.text };\n }\n\n if (initializer.kind === ts.SyntaxKind.TrueKeyword) {\n return { value: true };\n }\n\n if (initializer.kind === ts.SyntaxKind.FalseKeyword) {\n return { value: false };\n }\n\n if (ts.isNumericLiteral(initializer)) {\n return { value: Number(initializer.text) };\n }\n\n return null;\n}\n\nfunction readGlobalsObject (node: ts.Expression | undefined): Record<string, V1GlobalConf> | undefined {\n if (!node || !ts.isObjectLiteralExpression(node)) {\n return undefined;\n }\n\n const entries = node.properties.map(property => {\n if (!ts.isPropertyAssignment(property)) {\n return null;\n }\n\n const name = propertyKeyName(property);\n\n if (name === null) {\n return null;\n }\n\n const valueWrapper = readGlobalValue(property.initializer);\n\n if (valueWrapper === null) {\n return null;\n }\n\n return [name, valueWrapper.value] as [string, V1GlobalConf];\n });\n\n if (entries.some(entry => entry === null)) {\n return undefined;\n }\n\n return Object.fromEntries(entries as [string, V1GlobalConf][]);\n}\n\nfunction readGlobalsTokens (\n node: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): V1GlobalToken[] | undefined {\n if (!node || !ts.isObjectLiteralExpression(node)) {\n return undefined;\n }\n\n const tokens: V1GlobalToken[] = [];\n\n node.properties.forEach(property => {\n if (ts.isSpreadAssignment(property)) {\n tokens.push({ kind: 'spread', raw: property.expression.getText(sourceFile) });\n\n return;\n }\n\n if (!ts.isPropertyAssignment(property)) {\n return;\n }\n\n const name = propertyKeyName(property);\n\n if (name === null) {\n return;\n }\n\n const valueWrapper = readGlobalValue(property.initializer);\n\n if (valueWrapper === null) {\n return;\n }\n\n tokens.push({ kind: 'named', key: name, value: valueWrapper.value });\n });\n\n return tokens.length > 0 ? tokens : undefined;\n}\n\nfunction namedTokensToRecord (tokens: V1GlobalToken[] | undefined): Record<string, V1GlobalConf> | undefined {\n if (!tokens) {\n return undefined;\n }\n\n const entries = tokens\n .filter((token): token is Extract<V1GlobalToken, { kind: 'named' }> => token.kind === 'named')\n .map(token => [token.key, token.value] as [string, V1GlobalConf]);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction extractGlobalComponents (\n rulesNode: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile\n): StringEntry[] | undefined {\n const rule = findProperty(rulesNode, 'vue/no-undef-components');\n\n if (!rule || !ts.isArrayLiteralExpression(rule.initializer)) {\n return undefined;\n }\n\n const [, optionsNode] = rule.initializer.elements;\n\n if (!optionsNode || !ts.isObjectLiteralExpression(optionsNode)) {\n return undefined;\n }\n\n const ignorePatterns = findProperty(optionsNode, 'ignorePatterns');\n\n if (!ignorePatterns) {\n return undefined;\n }\n\n return readStringLiteralEntries(ignorePatterns.initializer, sourceFile);\n}\n\ninterface ConfigBlockData {\n files?: StringEntry[];\n ignores?: StringEntry[];\n parserProject?: StringEntry[];\n parserProjectService?: boolean;\n globals?: Record<string, V1GlobalConf>;\n globalsTokens?: V1GlobalToken[];\n globalComponents?: StringEntry[];\n parserIsTypescript?: boolean;\n customPluginNames?: string[];\n extraRuleCount: number;\n fieldComments?: V1ConfigFieldComments;\n}\n\nfunction assignFieldComment (\n data: ConfigBlockData,\n field: keyof V1ConfigFieldComments,\n comment: string | undefined\n): void {\n if (comment === undefined) {\n return;\n }\n\n data.fieldComments = { ...data.fieldComments, [field]: comment };\n}\n\nfunction countExtraRules (rulesNode: ts.ObjectLiteralExpression): number {\n return rulesNode.properties.filter(property => {\n const name = propertyKeyName(property);\n\n return name !== null && name !== 'vue/no-undef-components';\n }).length;\n}\n\nfunction readParserProject (\n parserOptions: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile\n): StringEntry[] | undefined {\n const projectProperty = findProperty(parserOptions, 'project');\n\n if (!projectProperty) {\n return undefined;\n }\n\n const { initializer } = projectProperty;\n\n if (isStringLiteral(initializer)) {\n return [{ value: initializer.text }];\n }\n\n return readStringLiteralEntries(initializer, sourceFile);\n}\n\nfunction readParserProjectService (parserOptions: ts.ObjectLiteralExpression): boolean | undefined {\n const projectServiceProperty = findProperty(parserOptions, 'projectService');\n\n if (projectServiceProperty?.initializer.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n\n return undefined;\n}\n\nfunction expressionMentionsTsParser (expression: ts.Expression, sourceFile: ts.SourceFile): boolean {\n return expression.getText(sourceFile).includes('@typescript-eslint/parser');\n}\n\nfunction readLanguageOptions (\n languageOptions: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const parserOptionsProperty = findProperty(languageOptions, 'parserOptions');\n\n if (parserOptionsProperty && ts.isObjectLiteralExpression(parserOptionsProperty.initializer)) {\n const parserOptions = parserOptionsProperty.initializer;\n\n data.parserProject = readParserProject(parserOptions, sourceFile);\n data.parserProjectService = readParserProjectService(parserOptions);\n }\n\n const parserProperty = findProperty(languageOptions, 'parser');\n\n if (parserProperty && expressionMentionsTsParser(parserProperty.initializer, sourceFile)) {\n data.parserIsTypescript = true;\n }\n\n const globalsProperty = findProperty(languageOptions, 'globals');\n\n if (globalsProperty) {\n data.globalsTokens = readGlobalsTokens(globalsProperty.initializer, sourceFile);\n data.globals = namedTokensToRecord(data.globalsTokens) ?? readGlobalsObject(globalsProperty.initializer);\n }\n}\n\nfunction readPluginNames (pluginsProperty: ts.PropertyAssignment): string[] {\n if (!ts.isObjectLiteralExpression(pluginsProperty.initializer)) {\n return [];\n }\n\n return pluginsProperty.initializer.properties\n .map(propertyKeyName)\n .filter((name): name is string => name !== null);\n}\n\nfunction readRulesBlock (\n rulesProperty: ts.PropertyAssignment,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n if (!ts.isObjectLiteralExpression(rulesProperty.initializer)) {\n return;\n }\n\n const rulesObject = rulesProperty.initializer;\n\n data.globalComponents = extractGlobalComponents(rulesObject, sourceFile);\n data.extraRuleCount = countExtraRules(rulesObject);\n}\n\nfunction captureLanguageOptionsComments (\n languageOptionsObject: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const parserOptionsProperty = findProperty(languageOptionsObject, 'parserOptions');\n\n if (parserOptionsProperty && ts.isObjectLiteralExpression(parserOptionsProperty.initializer)) {\n const projectProperty = findProperty(parserOptionsProperty.initializer, 'project');\n\n if (projectProperty) {\n assignFieldComment(data, 'parserProject', leadingCommentTextFor(sourceFile, projectProperty));\n }\n }\n\n const globalsProperty = findProperty(languageOptionsObject, 'globals');\n\n if (globalsProperty) {\n assignFieldComment(data, 'globals', leadingCommentTextFor(sourceFile, globalsProperty));\n }\n}\n\nfunction processFilesProperty (\n configNode: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const filesProperty = findProperty(configNode, 'files');\n\n if (!filesProperty) {\n return;\n }\n\n data.files = readStringLiteralEntries(filesProperty.initializer, sourceFile);\n assignFieldComment(data, 'files', leadingCommentTextFor(sourceFile, filesProperty));\n}\n\nfunction processIgnoresProperty (\n configNode: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const ignoresProperty = findProperty(configNode, 'ignores');\n\n if (!ignoresProperty) {\n return;\n }\n\n data.ignores = readStringLiteralEntries(ignoresProperty.initializer, sourceFile);\n assignFieldComment(data, 'ignores', leadingCommentTextFor(sourceFile, ignoresProperty));\n}\n\nfunction processPluginsProperty (configNode: ts.ObjectLiteralExpression, data: ConfigBlockData): void {\n const pluginsProperty = findProperty(configNode, 'plugins');\n\n if (!pluginsProperty) {\n return;\n }\n\n const pluginNames = readPluginNames(pluginsProperty);\n\n if (pluginNames.length > 0) {\n data.customPluginNames = pluginNames;\n }\n}\n\nfunction processRulesProperty (\n configNode: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const rulesProperty = findProperty(configNode, 'rules');\n\n if (!rulesProperty) {\n return;\n }\n\n readRulesBlock(rulesProperty, data, sourceFile);\n\n if (data.globalComponents !== undefined) {\n assignFieldComment(data, 'globalComponents', leadingCommentTextFor(sourceFile, rulesProperty));\n }\n}\n\nfunction parseConfigObject (configNode: ts.ObjectLiteralExpression, sourceFile: ts.SourceFile): ConfigBlockData {\n const data: ConfigBlockData = { extraRuleCount: 0 };\n\n processFilesProperty(configNode, data, sourceFile);\n processIgnoresProperty(configNode, data, sourceFile);\n\n const languageOptionsProperty = findProperty(configNode, 'languageOptions');\n\n if (languageOptionsProperty && ts.isObjectLiteralExpression(languageOptionsProperty.initializer)) {\n readLanguageOptions(languageOptionsProperty.initializer, data, sourceFile);\n captureLanguageOptionsComments(languageOptionsProperty.initializer, data, sourceFile);\n }\n\n processPluginsProperty(configNode, data);\n processRulesProperty(configNode, data, sourceFile);\n\n return data;\n}\n\nfunction mergeRescuedGlobalsTokens (\n innerTokens: V1GlobalToken[] | undefined,\n siblingTokens: V1GlobalToken[]\n): V1GlobalToken[] {\n if (!innerTokens || innerTokens.length === 0) {\n return siblingTokens.map(token => ({ ...token }));\n }\n\n const innerNamedKeys = new Set<string>();\n\n innerTokens.forEach(token => {\n if (token.kind === 'named') {\n innerNamedKeys.add(token.key);\n }\n });\n\n const merged: V1GlobalToken[] = innerTokens.map(token => ({ ...token }));\n\n siblingTokens.forEach(token => {\n if (token.kind === 'spread') {\n merged.push({ ...token });\n\n return;\n }\n\n if (innerNamedKeys.has(token.key)) {\n return;\n }\n\n merged.push({ ...token });\n innerNamedKeys.add(token.key);\n });\n\n return merged;\n}\n\nfunction applyRescuedGlobals (data: ConfigBlockData, rescued: ConfigBlockData): boolean {\n if (rescued.globalsTokens && rescued.globalsTokens.length > 0) {\n data.globalsTokens = mergeRescuedGlobalsTokens(data.globalsTokens, rescued.globalsTokens);\n data.globals = namedTokensToRecord(data.globalsTokens) ?? data.globals;\n\n return true;\n }\n\n if (rescued.globals && Object.keys(rescued.globals).length > 0) {\n const existingGlobals = data.globals ?? {};\n\n data.globals = { ...rescued.globals, ...existingGlobals };\n\n return true;\n }\n\n return false;\n}\n\nfunction applyRescuedParserProject (data: ConfigBlockData, rescued: ConfigBlockData): boolean {\n if (!rescued.parserProject || rescued.parserProject.length === 0) {\n return false;\n }\n\n if (data.parserProject && data.parserProject.length > 0) {\n return false;\n }\n\n data.parserProject = rescued.parserProject;\n\n return true;\n}\n\nfunction applyRescuedLanguageOptions (\n data: ConfigBlockData,\n rescued: ConfigBlockData\n): boolean {\n let rescuedAny = applyRescuedGlobals(data, rescued);\n\n rescuedAny = applyRescuedParserProject(data, rescued) || rescuedAny;\n\n if (rescued.parserIsTypescript && !data.parserIsTypescript) {\n data.parserIsTypescript = true;\n rescuedAny = true;\n }\n\n if (rescued.parserProjectService && data.parserProjectService === undefined) {\n data.parserProjectService = true;\n rescuedAny = true;\n }\n\n return rescuedAny;\n}\n\nfunction parseSiblingLanguageOptions (\n callArgument: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile\n): ConfigBlockData | null {\n const languageOptionsProperty = findProperty(callArgument, 'languageOptions');\n\n if (!languageOptionsProperty || !ts.isObjectLiteralExpression(languageOptionsProperty.initializer)) {\n return null;\n }\n\n const rescued: ConfigBlockData = { extraRuleCount: 0 };\n\n readLanguageOptions(languageOptionsProperty.initializer, rescued, sourceFile);\n\n return rescued;\n}\n\nfunction mergeSiblingIgnoresIntoData (\n callArgument: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): boolean {\n const ignoresProperty = findProperty(callArgument, 'ignores');\n\n if (!ignoresProperty) {\n return false;\n }\n\n const rescuedIgnores = readStringLiteralEntries(ignoresProperty.initializer, sourceFile);\n\n if (!rescuedIgnores || rescuedIgnores.length === 0) {\n return false;\n }\n\n const existing = data.ignores ?? [];\n const seen = new Set(existing.map(entry => entry.value));\n const additions: StringEntry[] = [];\n\n rescuedIgnores.forEach(entry => {\n if (seen.has(entry.value)) {\n return;\n }\n\n seen.add(entry.value);\n additions.push(entry);\n });\n\n if (additions.length === 0) {\n return false;\n }\n\n data.ignores = [...existing, ...additions];\n\n return true;\n}\n\nfunction applySiblingRescues (\n callArgument: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): boolean {\n const rescuedSibling = parseSiblingLanguageOptions(callArgument, sourceFile);\n const rescuedLanguageOptions = rescuedSibling\n ? applyRescuedLanguageOptions(data, rescuedSibling)\n : false;\n const rescuedIgnores = mergeSiblingIgnoresIntoData(callArgument, data, sourceFile);\n\n return rescuedLanguageOptions || rescuedIgnores;\n}\n\ninterface ClassifiedPresets {\n presets: V1PresetName[];\n unknownPresets: string[];\n}\n\nfunction classifyPresets (presetList: string[], line: number, warnings: MigrationWarning[]): ClassifiedPresets {\n const presets: V1PresetName[] = [];\n const unknownPresets: string[] = [];\n\n presetList.forEach(presetName => {\n if (knownPresets.has(presetName as V1PresetName)) {\n presets.push(presetName as V1PresetName);\n } else {\n unknownPresets.push(presetName);\n warnings.push({\n kind: 'unknown-preset',\n line,\n message: `Unknown v1 preset '${presetName}' — dropped`,\n });\n }\n });\n\n return { presets, unknownPresets };\n}\n\nfunction parseUseInsiderCall (\n callExpression: ts.CallExpression,\n sourceFile: ts.SourceFile,\n warnings: MigrationWarning[]\n): V1UseInsiderCall | null {\n const line = lineOf(sourceFile, callExpression);\n const [firstArgument] = callExpression.arguments;\n\n if (!firstArgument || !ts.isObjectLiteralExpression(firstArgument)) {\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'useInsider call without object literal argument; skipping',\n });\n\n return null;\n }\n\n const presetProperty = findProperty(firstArgument, 'preset');\n const configProperty = findProperty(firstArgument, 'config');\n\n if (!presetProperty) {\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'useInsider call missing preset; skipping',\n });\n\n return null;\n }\n\n const presetList = readStringLiteralArray(presetProperty.initializer);\n\n if (!presetList) {\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'useInsider preset is not a string-literal array; skipping',\n });\n\n return null;\n }\n\n const { presets, unknownPresets } = classifyPresets(presetList, line, warnings);\n const configData = configProperty && ts.isObjectLiteralExpression(configProperty.initializer)\n ? parseConfigObject(configProperty.initializer, sourceFile)\n : { extraRuleCount: 0 } as ConfigBlockData;\n const rescuedAny = applySiblingRescues(firstArgument, configData, sourceFile);\n\n const call: V1UseInsiderCall = {\n kind: 'useInsiderCall',\n line,\n presets,\n unknownPresets,\n files: configData.files,\n ignores: configData.ignores,\n parserProject: configData.parserProject,\n parserProjectService: configData.parserProjectService,\n globals: configData.globals,\n globalsTokens: configData.globalsTokens,\n globalComponents: configData.globalComponents,\n parserIsTypescript: configData.parserIsTypescript,\n customPluginNames: configData.customPluginNames,\n extraRuleCount: configData.extraRuleCount,\n fieldComments: configData.fieldComments,\n };\n\n if (rescuedAny) {\n call.rescuedSiblingLanguageOptions = true;\n }\n\n return call;\n}\n\nfunction tryClassifyIgnoresBlock (\n objectLiteral: ts.ObjectLiteralExpression,\n keys: string[],\n line: number,\n sourceFile: ts.SourceFile\n): V1ArrayElement | null {\n if (keys.length !== 1 || keys[0] !== 'ignores') {\n return null;\n }\n\n const ignoresProperty = findProperty(objectLiteral, 'ignores');\n const ignores = ignoresProperty\n ? readStringLiteralEntries(ignoresProperty.initializer, sourceFile)\n : undefined;\n\n if (!ignores) {\n return null;\n }\n\n return { kind: 'ignoresBlock', line, ignores };\n}\n\nfunction isSpellCheckerOffRule (rules: ts.NodeArray<ts.ObjectLiteralElementLike>): boolean {\n if (rules.length !== 1) {\n return false;\n }\n\n const [onlyRule] = rules;\n\n if (!ts.isPropertyAssignment(onlyRule) || propertyKeyName(onlyRule) !== '@cspell/spellchecker') {\n return false;\n }\n\n return isStringLiteral(onlyRule.initializer) && onlyRule.initializer.text === 'off';\n}\n\nfunction tryClassifySpellCheckerOff (\n objectLiteral: ts.ObjectLiteralExpression,\n keys: string[],\n line: number,\n sourceFile: ts.SourceFile\n): V1ArrayElement | null {\n if (keys.length !== 2 || !keys.includes('files') || !keys.includes('rules')) {\n return null;\n }\n\n const filesProperty = findProperty(objectLiteral, 'files');\n const rulesProperty = findProperty(objectLiteral, 'rules');\n const files = filesProperty\n ? readStringLiteralEntries(filesProperty.initializer, sourceFile)\n : undefined;\n\n if (!files || !rulesProperty || !ts.isObjectLiteralExpression(rulesProperty.initializer)) {\n return null;\n }\n\n if (!isSpellCheckerOffRule(rulesProperty.initializer.properties)) {\n return null;\n }\n\n return { kind: 'spellCheckerOff', line, files };\n}\n\nfunction tryClassifyStandaloneGlobals (\n objectLiteral: ts.ObjectLiteralExpression,\n keys: string[],\n line: number,\n sourceFile: ts.SourceFile\n): V1StandaloneGlobals | null {\n if (!keys.includes('files') || !keys.includes('languageOptions')) {\n return null;\n }\n\n const filesProperty = findProperty(objectLiteral, 'files');\n const languageOptionsProperty = findProperty(objectLiteral, 'languageOptions');\n const files = filesProperty\n ? readStringLiteralEntries(filesProperty.initializer, sourceFile)\n : undefined;\n\n if (!files || !languageOptionsProperty || !ts.isObjectLiteralExpression(languageOptionsProperty.initializer)) {\n return null;\n }\n\n const globalsProperty = findProperty(languageOptionsProperty.initializer, 'globals');\n\n if (!globalsProperty) {\n return null;\n }\n\n const tokens = readGlobalsTokens(globalsProperty.initializer, sourceFile);\n\n if (!tokens || tokens.length === 0) {\n return null;\n }\n\n return { kind: 'standaloneGlobals', line, files, globalsTokens: tokens };\n}\n\nfunction classifyObjectElement (\n objectLiteral: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile,\n warnings: MigrationWarning[]\n): V1ArrayElement {\n const line = lineOf(sourceFile, objectLiteral);\n const keys = objectLiteral.properties\n .map(propertyKeyName)\n .filter((name): name is string => name !== null);\n\n const ignoresBlock = tryClassifyIgnoresBlock(objectLiteral, keys, line, sourceFile);\n\n if (ignoresBlock) {\n return ignoresBlock;\n }\n\n const spellCheckerOff = tryClassifySpellCheckerOff(objectLiteral, keys, line, sourceFile);\n\n if (spellCheckerOff) {\n return spellCheckerOff;\n }\n\n const standaloneGlobals = tryClassifyStandaloneGlobals(objectLiteral, keys, line, sourceFile);\n\n if (standaloneGlobals) {\n return standaloneGlobals;\n }\n\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'Unrecognized array element; dropping',\n });\n\n return { kind: 'unrecognized', line, snippet: objectLiteral.getText(sourceFile) };\n}\n\nfunction tryClassifyUseInsider (\n unwrapped: ts.Expression,\n sourceFile: ts.SourceFile,\n warnings: MigrationWarning[],\n leadingComment: string | undefined\n): V1UseInsiderCall | null | undefined {\n if (!ts.isCallExpression(unwrapped)) {\n return undefined;\n }\n\n const callee = unwrapped.expression;\n\n if (!ts.isIdentifier(callee) || callee.text !== 'useInsider') {\n return undefined;\n }\n\n const parsed = parseUseInsiderCall(unwrapped, sourceFile, warnings);\n\n if (parsed && leadingComment !== undefined) {\n parsed.leadingComment = leadingComment;\n }\n\n return parsed;\n}\n\nfunction classifyArrayElement (\n element: ts.Expression,\n sourceFile: ts.SourceFile,\n warnings: MigrationWarning[]\n): V1ArrayElement | null {\n const leadingComment = leadingCommentTextFor(sourceFile, element);\n const unwrapped = unwrapAwait(element);\n const useInsiderResult = tryClassifyUseInsider(unwrapped, sourceFile, warnings, leadingComment);\n\n if (useInsiderResult !== undefined) {\n return useInsiderResult;\n }\n\n if (ts.isObjectLiteralExpression(unwrapped)) {\n const parsed = classifyObjectElement(unwrapped, sourceFile, warnings);\n\n if (leadingComment !== undefined) {\n parsed.leadingComment = leadingComment;\n }\n\n return parsed;\n }\n\n const line = lineOf(sourceFile, element);\n\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'Unrecognized array element; dropping',\n });\n\n const unrecognized: V1ArrayElement = { kind: 'unrecognized', line, snippet: element.getText(sourceFile) };\n\n if (leadingComment !== undefined) {\n unrecognized.leadingComment = leadingComment;\n }\n\n return unrecognized;\n}\n\nfunction isDefineConfigCall (expression: ts.Expression): expression is ts.CallExpression {\n return ts.isCallExpression(expression)\n && ts.isIdentifier(expression.expression)\n && expression.expression.text === 'defineConfig';\n}\n\nfunction defineConfigArray (\n exportExpressions: readonly ts.Expression[]\n): ts.ArrayLiteralExpression | null {\n const defineConfigCall = exportExpressions.find(isDefineConfigCall);\n const [first] = defineConfigCall?.arguments ?? [];\n\n if (!first) {\n return null;\n }\n\n const unwrappedFirst = unwrapTypeCasts(first);\n\n if (ts.isArrayLiteralExpression(unwrappedFirst)) {\n return unwrappedFirst;\n }\n\n return null;\n}\n\n// A v1 config normally exported an array of blocks, but exporting the single `useInsider()` call on\n// its own is also valid flat config, so that form is read as a one-element array rather than ignored.\nfunction findDefaultExportElements (sourceFile: ts.SourceFile): ts.Expression[] {\n const exportExpressions = sourceFile.statements\n .filter(ts.isExportAssignment)\n .map(statement => unwrapTypeCasts(statement.expression));\n const array = exportExpressions.find(ts.isArrayLiteralExpression)\n ?? defineConfigArray(exportExpressions);\n\n if (array) {\n return [...array.elements];\n }\n\n return exportExpressions;\n}\n\nfunction checkDefineConfigWrap (sourceFile: ts.SourceFile): boolean {\n return sourceFile.statements.some(statement => {\n if (!ts.isExportAssignment(statement)) {\n return false;\n }\n\n const expression = unwrapTypeCasts(statement.expression);\n\n return ts.isCallExpression(expression)\n && ts.isIdentifier(expression.expression)\n && expression.expression.text === 'defineConfig';\n });\n}\n\ninterface ImportFlags {\n hasUseInsider: boolean;\n hasSilenceRules: boolean;\n preserved: PreservedImport[];\n warnings: MigrationWarning[];\n}\n\nfunction getModuleSpecifierText (statement: ts.ImportDeclaration): string | null {\n const { moduleSpecifier } = statement;\n\n if (!isStringLiteral(moduleSpecifier)) {\n return null;\n }\n\n return moduleSpecifier.text;\n}\n\nfunction collectNamedImports (importDeclaration: ts.ImportDeclaration): string[] {\n const namedBindings = importDeclaration.importClause?.namedBindings;\n\n if (!namedBindings || !ts.isNamedImports(namedBindings)) {\n return [];\n }\n\n return namedBindings.elements.map(specifier => specifier.propertyName?.text ?? specifier.name.text);\n}\n\nfunction hasDefaultBinding (importDeclaration: ts.ImportDeclaration): boolean {\n return Boolean(importDeclaration.importClause?.name);\n}\n\nconst insiderDefaultRewriteTargets = new Set<string>(['useInsider', 'silenceRules', 'silenceDependencyWarning']);\n\nfunction classifyInsiderImport (\n statement: ts.ImportDeclaration,\n sourceFile: ts.SourceFile,\n flags: ImportFlags\n): void {\n const namedFromInsider = collectNamedImports(statement);\n\n namedFromInsider.forEach(name => {\n if (name === 'useInsider') {\n flags.hasUseInsider = true;\n }\n\n if (name === 'silenceRules') {\n flags.hasSilenceRules = true;\n }\n });\n\n if (hasDefaultBinding(statement)) {\n const defaultLocal = statement.importClause?.name?.text ?? '';\n\n if (insiderDefaultRewriteTargets.has(defaultLocal)) {\n if (defaultLocal === 'useInsider') {\n flags.hasUseInsider = true;\n }\n\n if (defaultLocal === 'silenceRules') {\n flags.hasSilenceRules = true;\n }\n\n return;\n }\n\n flags.hasUseInsider = true;\n\n const line = lineOf(sourceFile, statement);\n\n flags.preserved.push({\n raw: statement.getText(sourceFile),\n moduleSpecifier: '@useinsider/eslint-config',\n });\n flags.warnings.push({\n kind: 'unrecognized-block',\n line,\n message:\n `Unexpected default import '${defaultLocal}' from '@useinsider/eslint-config'; `\n + 'kept literally — review before committing',\n });\n }\n}\n\nfunction inspectImports (sourceFile: ts.SourceFile): ImportFlags {\n const flags: ImportFlags = {\n hasUseInsider: false,\n hasSilenceRules: false,\n preserved: [],\n warnings: [],\n };\n\n sourceFile.statements.forEach(statement => {\n if (!ts.isImportDeclaration(statement)) {\n return;\n }\n\n const moduleSpecifier = getModuleSpecifierText(statement);\n\n if (moduleSpecifier === null) {\n return;\n }\n\n if (moduleSpecifier === '@useinsider/eslint-config') {\n classifyInsiderImport(statement, sourceFile, flags);\n\n return;\n }\n\n if (moduleSpecifier === 'eslint/config') {\n return;\n }\n\n flags.preserved.push({\n raw: statement.getText(sourceFile),\n moduleSpecifier,\n });\n });\n\n return flags;\n}\n\nfunction collectSilenceRulesCalls (sourceFile: ts.SourceFile): SilenceRulesCall[] {\n return sourceFile.statements\n .filter(ts.isExpressionStatement)\n .map(statement => {\n const { expression } = statement;\n\n if (!ts.isCallExpression(expression) || !ts.isIdentifier(expression.expression)) {\n return null;\n }\n\n if (expression.expression.text !== 'silenceRules') {\n return null;\n }\n\n const [argument] = expression.arguments;\n const rules = readStringLiteralEntries(argument, sourceFile);\n\n if (!rules) {\n return null;\n }\n\n const leadingComment = leadingCommentTextFor(sourceFile, statement);\n const call: SilenceRulesCall = { line: lineOf(sourceFile, statement), rules };\n\n if (leadingComment !== undefined) {\n call.leadingComment = leadingComment;\n }\n\n return call;\n })\n .filter((call): call is SilenceRulesCall => call !== null);\n}\n\nexport function parseV1Config (source: string, filePath: string): ParseResult {\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const warnings: MigrationWarning[] = [];\n const imports = inspectImports(sourceFile);\n\n warnings.push(...imports.warnings);\n\n const silenceRulesCalls = collectSilenceRulesCalls(sourceFile);\n const arrayElements: V1ArrayElement[] = findDefaultExportElements(sourceFile)\n .map(element => classifyArrayElement(element, sourceFile, warnings))\n .filter((entry): entry is V1ArrayElement => entry !== null);\n\n return {\n hasUseInsiderImport: imports.hasUseInsider,\n hasSilenceRulesImport: imports.hasSilenceRules,\n hasDefineConfigWrap: checkDefineConfigWrap(sourceFile),\n silenceRulesCalls,\n arrayElements,\n preservedImports: imports.preserved,\n warnings,\n };\n}\n","import { basename } from 'node:path';\nimport type { V2ScopeName } from './types';\nimport type { MigrationWarning } from './warnings';\nimport * as ts from 'typescript';\nimport { describeRemovedOptions } from '~/utils/removedOptions';\nimport { isMigratableScope } from './dependencies';\n\nconst INSIDER_MODULE = '@useinsider/eslint-config';\nconst COMPOSER_NAME = 'useInsider';\nconst DEFINE_CONFIG_NAME = 'defineConfig';\nconst SILENCE_RULES_NAME = 'silenceRules';\nconst RENDERER_EXPORT = 'export const { useInsiderESLint, useInsiderOXC } = ';\n\nconst RESERVED_KEYS: ReadonlySet<string> = new Set([\n 'ignores',\n 'jquery',\n 'strict',\n 'spellChecker',\n 'silenceRules',\n 'configFiles',\n]);\n\nexport interface V3Rehouse {\n lintModule: string;\n scopes: V2ScopeName[];\n optionKeys: string[];\n unregisteredKeys: string[];\n silenceRulesCallCount: number;\n droppedAwait: boolean;\n droppedArrayWrapper: boolean;\n warnings: MigrationWarning[];\n}\n\nexport type RehouseOutcome = | { kind: 'not-v3' }\n | { kind: 'refused'; reason: string }\n | { kind: 'rehoused'; rehoused: V3Rehouse };\n\ninterface PeelState {\n awaited: boolean;\n arrayWrapped: boolean;\n droppedAnnotation: boolean;\n siblingElements: number;\n definedConfig: boolean;\n}\n\ninterface ArgumentReading {\n scopes: V2ScopeName[];\n optionKeys: string[];\n unregisteredKeys: string[];\n unreadable: string | null;\n}\n\nfunction isInsiderImport (statement: ts.ImportDeclaration): boolean {\n const { moduleSpecifier } = statement;\n\n return ts.isStringLiteral(moduleSpecifier) && moduleSpecifier.text === INSIDER_MODULE;\n}\n\n// The emitted export reuses the call's own text, so an aliased import (`useInsider as compose`) keeps\n// working without rewriting anything — but the alias still has to be known to find the call.\nfunction composerAliases (sourceFile: ts.SourceFile): Set<string> {\n const aliases = new Set<string>();\n\n sourceFile.statements.forEach(statement => {\n if (!ts.isImportDeclaration(statement) || !isInsiderImport(statement)) {\n return;\n }\n\n const bindings = statement.importClause?.namedBindings;\n\n if (!bindings || !ts.isNamedImports(bindings)) {\n return;\n }\n\n bindings.elements.forEach(element => {\n if ((element.propertyName?.text ?? element.name.text) === COMPOSER_NAME) {\n aliases.add(element.name.text);\n }\n });\n });\n\n return aliases;\n}\n\nfunction isCallOf (node: ts.Node, names: ReadonlySet<string>): node is ts.CallExpression {\n return ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && names.has(node.expression.text);\n}\n\nfunction collectCalls (sourceFile: ts.SourceFile, names: ReadonlySet<string>): ts.CallExpression[] {\n const found: ts.CallExpression[] = [];\n\n const visit = (node: ts.Node): void => {\n if (isCallOf(node, names)) {\n found.push(node);\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n\n return found;\n}\n\nfunction peel (expression: ts.Expression, state: PeelState): ts.Expression {\n if (ts.isParenthesizedExpression(expression) || ts.isSpreadElement(expression)) {\n return peel(expression.expression, state);\n }\n\n if (ts.isAsExpression(expression) || ts.isSatisfiesExpression(expression)) {\n state.droppedAnnotation = true;\n\n return peel(expression.expression, state);\n }\n\n if (ts.isAwaitExpression(expression)) {\n state.awaited = true;\n\n return peel(expression.expression, state);\n }\n\n return expression;\n}\n\n// v2 spelled the call `export default [...await useInsider({...})]`, and v3 tightened that to the bare\n// call. A wrapper holding nothing but the call is dropped; one holding sibling blocks is refused,\n// because those blocks have nowhere to go in a lint module that exports renderers.\nfunction peelArray (expression: ts.Expression, state: PeelState): ts.Expression {\n if (!ts.isArrayLiteralExpression(expression) || expression.elements.length === 0) {\n return expression;\n }\n\n state.arrayWrapped = true;\n state.siblingElements = expression.elements.length - 1;\n\n return peel(expression.elements[0], state);\n}\n\nfunction unwrapDefaultExport (expression: ts.Expression, state: PeelState): ts.Expression {\n const peeled = peel(expression, state);\n\n if (isCallOf(peeled, new Set([DEFINE_CONFIG_NAME]))) {\n state.definedConfig = true;\n\n return peeled;\n }\n\n return peelArray(peeled, state);\n}\n\nfunction argumentObject (call: ts.CallExpression): ts.ObjectLiteralExpression | null {\n const [first] = call.arguments;\n\n if (!first || !ts.isObjectLiteralExpression(first)) {\n return null;\n }\n\n return first;\n}\n\nfunction propertyKey (property: ts.ObjectLiteralElementLike): string | null {\n const { name } = property;\n\n if (name === undefined) {\n return null;\n }\n\n if (ts.isIdentifier(name) || ts.isStringLiteral(name)) {\n return name.text;\n }\n\n return null;\n}\n\n// Everything the migration says about scopes comes from these keys, so every way of failing to read\n// them has to surface as a warning — a silently short scope list means a short install list.\nfunction unreadableReason (argument: ts.ObjectLiteralExpression | null, keysRead: number): string | null {\n if (!argument) {\n return 'is not an object literal';\n }\n\n if (argument.properties.some(ts.isSpreadAssignment)) {\n return 'spreads another object';\n }\n\n return keysRead < argument.properties.length ? 'has a property whose key is not a literal name' : null;\n}\n\nfunction readArgument (call: ts.CallExpression): ArgumentReading {\n const argument = argumentObject(call);\n const optionKeys = (argument?.properties ?? [])\n .map(propertyKey)\n .filter((key): key is string => key !== null);\n const candidates = optionKeys.filter(key => !RESERVED_KEYS.has(key));\n\n return {\n optionKeys,\n scopes: candidates.filter(isMigratableScope),\n unregisteredKeys: candidates.filter(key => !isMigratableScope(key)),\n unreadable: unreadableReason(argument, optionKeys.length),\n };\n}\n\nfunction refuse (reason: string): RehouseOutcome {\n return { kind: 'refused', reason };\n}\n\nfunction multipleCallsReason (name: string): string {\n return `${name} calls ${COMPOSER_NAME}() more than once. v4 has exactly one call — in the lint module —`\n + ' and it returns the two renderers instead of a config array, so the results cannot be concatenated.'\n + ' Merge them into a single call, one entry per scope key, then re-run the migration.';\n}\n\nfunction mixedArrayReason (name: string, siblings: number): string {\n const blocks = siblings === 1 ? 'block' : 'blocks';\n\n return `${name}'s default export combines ${COMPOSER_NAME}() with ${siblings} other flat-config ${blocks},`\n + ' which have nowhere to go in a lint module. Fold them into the call first — directory ignores into'\n + ' `ignores`, per-file rule overrides into `configFiles` — then re-run the migration.';\n}\n\nfunction indirectCallReason (name: string): string {\n return `${name} calls ${COMPOSER_NAME}(), but its default export is not that call. The migration re-houses`\n + ' the call itself, so make it the default export'\n + ` (\\`export default ${COMPOSER_NAME}({ ... })\\`) and re-run the migration.`;\n}\n\nfunction defineConfigReason (name: string): string {\n return `${name} wraps ${COMPOSER_NAME}() in ${DEFINE_CONFIG_NAME}(). v4's lint module exports the two`\n + ' renderers rather than a flat-config array, so there is nothing left for'\n + ` ${DEFINE_CONFIG_NAME}() to validate — drop the wrapper and re-run the migration.`;\n}\n\nfunction presetReason (name: string): string {\n return `${name} still passes the v1 \\`preset\\` option, and this release could not read it — the preset list`\n + ' has to be an array of string literals. Restore the literal list and re-run the migration, or convert'\n + ' the call to the scope-keyed form by hand.';\n}\n\n// Driven by the shared registry rather than a hand-written list, so an option removed later is\n// refused here on the same commit that stops `useInsider()` accepting it.\nfunction removedOptionReason (name: string, details: string): string {\n return `${name} passes option(s) this release removed. The migration copies the call across`\n + ' unchanged, so carrying them over would produce a lint module that fails on the next lint'\n + ` run. Update the call, then re-run the migration:\\n${details}`;\n}\n\nfunction annotationWarning (line: number): MigrationWarning {\n return {\n kind: 'dropped-type-annotation',\n line,\n message: `The type annotation on the default export was dropped — ${COMPOSER_NAME}() now returns`\n + ' `{ useInsiderESLint, useInsiderOXC }` rather than a config array. Delete the type import if'\n + ' nothing else uses it.',\n };\n}\n\nfunction unregisteredScopeWarning (key: string, line: number): MigrationWarning {\n return {\n kind: 'unregistered-scope',\n line,\n message: `\\`${key}\\` has no dependency manifest in the migration, so nothing was added to the install`\n + ' list for it. The key itself was carried over untouched — check its plugins are installed.',\n };\n}\n\nfunction unreadableArgumentWarning (line: number, reason: string): MigrationWarning {\n return {\n kind: 'unrecognized-block',\n line,\n message: `The ${COMPOSER_NAME}() argument ${reason}, so its scope list could not be read in full.`\n + ' The call was carried over untouched; the dependency list may be incomplete.',\n };\n}\n\nfunction lineOf (sourceFile: ts.SourceFile, node: ts.Node): number {\n return sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n}\n\nfunction collectWarnings (line: number, reading: ArgumentReading, state: PeelState): MigrationWarning[] {\n const warnings: MigrationWarning[] = [];\n\n if (state.droppedAnnotation) {\n warnings.push(annotationWarning(line));\n }\n\n if (reading.unreadable) {\n warnings.push(unreadableArgumentWarning(line, reading.unreadable));\n }\n\n reading.unregisteredKeys.forEach(key => {\n warnings.push(unregisteredScopeWarning(key, line));\n });\n\n return warnings;\n}\n\ninterface ExportSplice {\n source: string;\n sourceFile: ts.SourceFile;\n statement: ts.ExportAssignment;\n callText: string;\n}\n\n// Only the export statement is rewritten. `getStart` stops after leading trivia, so a comment above\n// the export stays in the prefix, and the call's own text carries every comment, cast and computed\n// value inside the argument through byte-for-byte.\nfunction spliceExport (input: ExportSplice): string {\n const start = input.statement.getStart(input.sourceFile);\n const prefix = input.source.slice(0, start);\n const suffix = input.source.slice(input.statement.getEnd());\n const rehoused = `${prefix}${RENDERER_EXPORT}${input.callText};${suffix}`;\n\n return rehoused.endsWith('\\n') ? rehoused : `${rehoused}\\n`;\n}\n\nfunction defaultExports (sourceFile: ts.SourceFile): ts.ExportAssignment[] {\n return sourceFile.statements\n .filter(ts.isExportAssignment)\n .filter(statement => statement.isExportEquals !== true);\n}\n\nfunction emptyState (): PeelState {\n return {\n awaited: false,\n arrayWrapped: false,\n droppedAnnotation: false,\n siblingElements: 0,\n definedConfig: false,\n };\n}\n\n/**\n * Re-houses a v3 single-file config as a v4 lint module. Nothing about the configuration itself\n * changes between the two majors — only where the call lives — so the source is spliced rather than\n * re-rendered: every import, `silenceRules(...)` call, comment and blank line outside the export\n * statement survives byte-for-byte.\n * @example\n * rehouseV3Config(\"import { useInsider } from '@useinsider/eslint-config';\\nexport default useInsider({});\", 'eslint.config.js');\n * // { kind: 'rehoused', rehoused: { lintModule: '…export const { useInsiderESLint, useInsiderOXC } = useInsider({});\\n', … } }\n */\nexport function rehouseV3Config (source: string, filePath: string): RehouseOutcome {\n const name = basename(filePath);\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const aliases = composerAliases(sourceFile);\n const calls = collectCalls(sourceFile, aliases);\n const exportStatements = defaultExports(sourceFile);\n\n if (calls.length === 0) {\n return { kind: 'not-v3' };\n }\n\n if (exportStatements.length !== 1) {\n return refuse(indirectCallReason(name));\n }\n\n if (calls.length > 1) {\n return refuse(multipleCallsReason(name));\n }\n\n const [statement] = exportStatements;\n const state = emptyState();\n const unwrapped = unwrapDefaultExport(statement.expression, state);\n\n if (state.definedConfig) {\n return refuse(defineConfigReason(name));\n }\n\n // Order matters: `[{ ignores }, ...useInsider({...})]` peels to the object literal, so the\n // indirect-call check would fire first and tell a consumer to make the call the default export\n // when it already is. The sibling count is the accurate diagnosis for every mixed array.\n if (state.siblingElements > 0) {\n return refuse(mixedArrayReason(name, state.siblingElements));\n }\n\n if (!isCallOf(unwrapped, aliases)) {\n return refuse(indirectCallReason(name));\n }\n\n const reading = readArgument(unwrapped);\n\n if (reading.optionKeys.includes('preset')) {\n return refuse(presetReason(name));\n }\n\n const removed = describeRemovedOptions(reading.optionKeys);\n\n if (removed !== null) {\n return refuse(removedOptionReason(name, removed));\n }\n\n return {\n kind: 'rehoused',\n rehoused: {\n lintModule: spliceExport({\n source,\n sourceFile,\n statement,\n callText: unwrapped.getText(sourceFile),\n }),\n scopes: reading.scopes,\n optionKeys: reading.optionKeys,\n unregisteredKeys: reading.unregisteredKeys,\n silenceRulesCallCount: collectCalls(sourceFile, new Set([SILENCE_RULES_NAME])).length,\n droppedAwait: state.awaited,\n droppedArrayWrapper: state.arrayWrapped,\n warnings: collectWarnings(lineOf(sourceFile, unwrapped), reading, state),\n },\n };\n}\n","import * as ts from 'typescript';\n\nconst INSIDER_MODULE_SPECIFIER = '@useinsider/eslint-config';\n\ninterface ImportBindings {\n statement: ts.ImportDeclaration;\n moduleSpecifier: string;\n defaultBinding?: string;\n namespaceBinding?: string;\n namedBindings: { localName: string; importedName: string }[];\n isSideEffect: boolean;\n}\n\nfunction readModuleSpecifier (statement: ts.ImportDeclaration): string | null {\n const { moduleSpecifier } = statement;\n\n if (!ts.isStringLiteralLike(moduleSpecifier)) {\n return null;\n }\n\n return moduleSpecifier.text;\n}\n\nfunction readImportBindings (statement: ts.ImportDeclaration): ImportBindings | null {\n const moduleSpecifier = readModuleSpecifier(statement);\n\n if (moduleSpecifier === null) {\n return null;\n }\n\n const { importClause } = statement;\n\n if (!importClause) {\n return {\n statement,\n moduleSpecifier,\n namedBindings: [],\n isSideEffect: true,\n };\n }\n\n const bindings: ImportBindings = {\n statement,\n moduleSpecifier,\n namedBindings: [],\n isSideEffect: false,\n };\n\n if (importClause.name) {\n bindings.defaultBinding = importClause.name.text;\n }\n\n const { namedBindings } = importClause;\n\n if (namedBindings) {\n if (ts.isNamespaceImport(namedBindings)) {\n bindings.namespaceBinding = namedBindings.name.text;\n } else {\n namedBindings.elements.forEach(element => {\n bindings.namedBindings.push({\n localName: element.name.text,\n importedName: element.propertyName?.text ?? element.name.text,\n });\n });\n }\n }\n\n return bindings;\n}\n\nfunction isPropertyKeyPosition (node: ts.Identifier): boolean {\n const { parent } = node;\n\n if (!parent) {\n return false;\n }\n\n if (ts.isPropertyAssignment(parent) && parent.name === node) {\n return true;\n }\n\n if (ts.isPropertyAccessExpression(parent) && parent.name === node) {\n return true;\n }\n\n if (ts.isQualifiedName(parent) && parent.right === node) {\n return true;\n }\n\n return false;\n}\n\nfunction classifyIdentifier (node: ts.Identifier, referenced: Set<string>): void {\n const { parent } = node;\n\n if (parent && ts.isShorthandPropertyAssignment(parent) && parent.name === node) {\n referenced.add(node.text);\n\n return;\n }\n\n if (isPropertyKeyPosition(node)) {\n return;\n }\n\n referenced.add(node.text);\n}\n\nfunction collectReferencedIdentifiers (sourceFile: ts.SourceFile): Set<string> {\n const referenced = new Set<string>();\n\n function visit (node: ts.Node): void {\n if (ts.isImportDeclaration(node)) {\n return;\n }\n\n if (ts.isIdentifier(node)) {\n classifyIdentifier(node, referenced);\n }\n\n ts.forEachChild(node, visit);\n }\n\n sourceFile.statements.forEach(statement => {\n if (ts.isImportDeclaration(statement)) {\n return;\n }\n\n visit(statement);\n });\n\n return referenced;\n}\n\nfunction quoteModuleSpecifier (statement: ts.ImportDeclaration, sourceFile: ts.SourceFile): string {\n return statement.moduleSpecifier.getText(sourceFile);\n}\n\nfunction renderNamedSpecifier (binding: { localName: string; importedName: string }): string {\n if (binding.localName === binding.importedName) {\n return binding.localName;\n }\n\n return `${binding.importedName} as ${binding.localName}`;\n}\n\nfunction rebuildImportStatement (\n bindings: ImportBindings,\n keptNamed: { localName: string; importedName: string }[],\n sourceFile: ts.SourceFile\n): string {\n const clauseParts: string[] = [];\n\n if (bindings.defaultBinding) {\n clauseParts.push(bindings.defaultBinding);\n }\n\n if (bindings.namespaceBinding) {\n clauseParts.push(`* as ${bindings.namespaceBinding}`);\n } else if (keptNamed.length > 0) {\n const list = keptNamed.map(renderNamedSpecifier).join(', ');\n\n clauseParts.push(`{ ${list} }`);\n }\n\n const moduleSpecifier = quoteModuleSpecifier(bindings.statement, sourceFile);\n\n if (clauseParts.length === 0) {\n return `import ${moduleSpecifier};`;\n }\n\n return `import ${clauseParts.join(', ')} from ${moduleSpecifier};`;\n}\n\ninterface RewriteDecision {\n keep: boolean;\n replacement?: string;\n}\n\ninterface UsageSummary {\n hasDefault: boolean;\n hasNamespace: boolean;\n hasNamed: boolean;\n defaultStays: boolean;\n namespaceStays: boolean;\n keptNamed: { localName: string; importedName: string }[];\n}\n\nfunction summarizeUsage (bindings: ImportBindings, referenced: Set<string>): UsageSummary {\n const defaultStays = bindings.defaultBinding ? referenced.has(bindings.defaultBinding) : false;\n const namespaceStays = bindings.namespaceBinding ? referenced.has(bindings.namespaceBinding) : false;\n const keptNamed = bindings.namedBindings.filter(named => referenced.has(named.localName));\n\n return {\n hasDefault: Boolean(bindings.defaultBinding),\n hasNamespace: Boolean(bindings.namespaceBinding),\n hasNamed: bindings.namedBindings.length > 0,\n defaultStays,\n namespaceStays,\n keptNamed,\n };\n}\n\nfunction isFullyUnchanged (bindings: ImportBindings, usage: UsageSummary): boolean {\n if (usage.hasDefault && !usage.defaultStays) {\n return false;\n }\n\n if (usage.hasNamespace && !usage.namespaceStays) {\n return false;\n }\n\n if (usage.hasNamed && usage.keptNamed.length !== bindings.namedBindings.length) {\n return false;\n }\n\n return true;\n}\n\nfunction hasAnyBinding (usage: UsageSummary): boolean {\n return usage.hasDefault || usage.hasNamespace || usage.hasNamed;\n}\n\nfunction hasAnySurvivingBinding (usage: UsageSummary): boolean {\n const namedStays = usage.hasNamed && usage.keptNamed.length > 0;\n\n return usage.defaultStays || usage.namespaceStays || namedStays;\n}\n\nfunction buildRebuiltBindings (bindings: ImportBindings, usage: UsageSummary): ImportBindings {\n return {\n ...bindings,\n defaultBinding: usage.defaultStays ? bindings.defaultBinding : undefined,\n namespaceBinding: usage.namespaceStays ? bindings.namespaceBinding : undefined,\n namedBindings: usage.keptNamed,\n };\n}\n\nfunction decideRewrite (\n bindings: ImportBindings,\n referenced: Set<string>,\n sourceFile: ts.SourceFile\n): RewriteDecision {\n if (bindings.moduleSpecifier === INSIDER_MODULE_SPECIFIER || bindings.isSideEffect) {\n return { keep: true };\n }\n\n const usage = summarizeUsage(bindings, referenced);\n\n if (!hasAnyBinding(usage)) {\n return { keep: true };\n }\n\n if (!hasAnySurvivingBinding(usage)) {\n return { keep: false };\n }\n\n if (isFullyUnchanged(bindings, usage)) {\n return { keep: true };\n }\n\n const rebuilt = buildRebuiltBindings(bindings, usage);\n\n return { keep: true, replacement: rebuildImportStatement(rebuilt, usage.keptNamed, sourceFile) };\n}\n\ninterface LineReplacement {\n startLine: number;\n endLine: number;\n text: string | null;\n}\n\nfunction lineRangeForStatement (statement: ts.Node, sourceFile: ts.SourceFile): { start: number; end: number } {\n const start = sourceFile.getLineAndCharacterOfPosition(statement.getStart(sourceFile)).line;\n const end = sourceFile.getLineAndCharacterOfPosition(statement.getEnd()).line;\n\n return { start, end };\n}\n\nfunction applyReplacements (source: string, replacements: LineReplacement[]): string {\n if (replacements.length === 0) {\n return source;\n }\n\n const lines = source.split('\\n');\n const sorted = replacements.slice().sort((left, right) => right.startLine - left.startLine);\n\n sorted.forEach(replacement => {\n const removeCount = replacement.endLine - replacement.startLine + 1;\n\n if (replacement.text === null) {\n lines.splice(replacement.startLine, removeCount);\n } else {\n lines.splice(replacement.startLine, removeCount, replacement.text);\n }\n });\n\n return lines.join('\\n');\n}\n\nexport function pruneUnusedImports (source: string): string {\n const sourceFile = ts.createSourceFile('migrated.mjs', source, ts.ScriptTarget.Latest, true);\n const importStatements = sourceFile.statements.filter(ts.isImportDeclaration);\n\n if (importStatements.length === 0) {\n return source;\n }\n\n const referenced = collectReferencedIdentifiers(sourceFile);\n const replacements: LineReplacement[] = [];\n\n importStatements.forEach(statement => {\n const bindings = readImportBindings(statement);\n\n if (!bindings) {\n return;\n }\n\n const decision = decideRewrite(bindings, referenced, sourceFile);\n\n if (decision.keep && decision.replacement === undefined) {\n return;\n }\n\n const range = lineRangeForStatement(statement, sourceFile);\n\n if (!decision.keep) {\n replacements.push({ startLine: range.start, endLine: range.end, text: null });\n\n return;\n }\n\n if (decision.replacement !== undefined) {\n replacements.push({ startLine: range.start, endLine: range.end, text: decision.replacement });\n }\n });\n\n return applyReplacements(source, replacements);\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('pruneUnusedImports', () => {\n test('drops a default import whose binding is unreferenced', () => {\n const source = [\n \"import { createRequire } from 'module';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({});',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).not.toContain('createRequire');\n expect(output).toContain(\"import { useInsider } from '@useinsider/eslint-config';\");\n });\n\n test('keeps a default import whose binding is referenced', () => {\n const source = [\n \"import globals from 'globals';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ x: globals.browser });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import globals from 'globals';\");\n });\n\n test('drops a single unused named specifier while keeping the rest', () => {\n const source = [\n \"import { used, unused } from 'pkg';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ x: used });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import { used } from 'pkg';\");\n expect(output).not.toContain('unused');\n });\n\n test('preserves side-effect imports', () => {\n const source = [\n \"import 'reflect-metadata';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({});',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import 'reflect-metadata';\");\n });\n\n test('preserves useInsider import even if heuristics would drop it', () => {\n const source = [\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import { useInsider } from '@useinsider/eslint-config';\");\n });\n\n test('does not count string-literal contents as identifier references', () => {\n const source = [\n \"import { createRequire } from 'module';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n \"export default useInsider({ note: 'createRequire is referenced only in this string' });\",\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).not.toContain('import { createRequire }');\n });\n\n test('drops a namespace import that is unreferenced', () => {\n const source = [\n \"import * as path from 'node:path';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({});',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).not.toContain('node:path');\n });\n\n test('keeps the namespace import when its binding is used', () => {\n const source = [\n \"import * as path from 'node:path';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ root: path.resolve() });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import * as path from 'node:path';\");\n });\n\n test('drops the whole import when default and named are all unused', () => {\n const source = [\n \"import defaultX, { a, b } from 'pkg';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({});',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).not.toContain(\"from 'pkg'\");\n });\n\n test('keeps default and prunes only named specifiers when default is referenced', () => {\n const source = [\n \"import defaultX, { a, b } from 'pkg';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ x: defaultX });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import defaultX from 'pkg';\");\n expect(output).not.toContain('{ a');\n expect(output).not.toContain(', b }');\n });\n\n test('honors renamed named specifiers via `as`', () => {\n const source = [\n \"import { original as local } from 'pkg';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ x: local });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import { original as local } from 'pkg';\");\n });\n\n test('returns source unchanged when no imports are present', () => {\n const source = 'export default {};\\n';\n\n expect(pruneUnusedImports(source)).toBe(source);\n });\n });\n}\n/* v8 ignore stop */\n","import type {\n PreservedImport,\n StringEntry,\n V1GlobalConf,\n V1GlobalToken,\n V2Plan,\n V2ScopeEntry,\n V2ScopeName,\n} from './types';\nimport { quote } from '~/cli/quote';\nimport { pruneUnusedImports } from './pruneUnusedImports';\n\nconst indent = ' ';\nconst MAX_LINE_LENGTH = 120;\n\nfunction anyEntryHasComment (entries: readonly StringEntry[]): boolean {\n return entries.some(entry => entry.leadingComment !== undefined);\n}\n\nfunction indentCommentBlock (raw: string, baseIndent: string): string {\n return raw\n .split('\\n')\n .map(line => `${baseIndent}${line}`)\n .join('\\n');\n}\n\nfunction formatStringArrayInline (entries: readonly StringEntry[]): string {\n return `[${entries.map(entry => quote(entry.value)).join(', ')}]`;\n}\n\nfunction formatStringArrayMultiline (entries: readonly StringEntry[], baseIndent: string): string {\n const childIndent = `${baseIndent}${indent}`;\n const lines: string[] = ['['];\n\n entries.forEach(entry => {\n if (entry.leadingComment !== undefined) {\n lines.push(indentCommentBlock(entry.leadingComment, childIndent));\n }\n\n lines.push(`${childIndent}${quote(entry.value)},`);\n });\n\n lines.push(`${baseIndent}]`);\n\n return lines.join('\\n');\n}\n\nfunction renderStringArrayField (label: string, entries: readonly StringEntry[], baseIndent: string): string {\n if (!anyEntryHasComment(entries)) {\n const inline = `${baseIndent}${label}: ${formatStringArrayInline(entries)},`;\n\n if (inline.length <= MAX_LINE_LENGTH) {\n return inline;\n }\n }\n\n const multiline = formatStringArrayMultiline(entries, baseIndent);\n\n return `${baseIndent}${label}: ${multiline},`;\n}\n\nfunction formatGlobalValue (value: V1GlobalConf): string {\n if (typeof value === 'string') {\n return quote(value);\n }\n\n return String(value);\n}\n\nfunction tokensFromRecord (globals: Record<string, V1GlobalConf>): V1GlobalToken[] {\n return Object.entries(globals).map(([key, value]) => ({ kind: 'named' as const, key, value }));\n}\n\nfunction formatGlobalTokenInline (token: V1GlobalToken): string {\n if (token.kind === 'spread') {\n return `...${token.raw}`;\n }\n\n return `${token.key}: ${formatGlobalValue(token.value)}`;\n}\n\nfunction formatGlobalTokenLine (token: V1GlobalToken, childIndent: string): string {\n if (token.kind === 'spread') {\n return `${childIndent}...${token.raw},`;\n }\n\n return `${childIndent}${token.key}: ${formatGlobalValue(token.value)},`;\n}\n\nfunction formatGlobalsTokensInline (tokens: readonly V1GlobalToken[]): string {\n const pieces = tokens.map(formatGlobalTokenInline);\n\n return `{ ${pieces.join(', ')} }`;\n}\n\nfunction formatGlobalsTokensMultiline (tokens: readonly V1GlobalToken[], baseIndent: string): string {\n const childIndent = `${baseIndent}${indent}`;\n const lines = tokens.map(token => formatGlobalTokenLine(token, childIndent));\n\n return ['{', ...lines, `${baseIndent}}`].join('\\n');\n}\n\nfunction renderGlobalsField (tokens: readonly V1GlobalToken[], baseIndent: string): string {\n const inline = `${baseIndent}globals: ${formatGlobalsTokensInline(tokens)},`;\n\n if (inline.length <= MAX_LINE_LENGTH) {\n return inline;\n }\n\n const multiline = formatGlobalsTokensMultiline(tokens, baseIndent);\n\n return `${baseIndent}globals: ${multiline},`;\n}\n\nfunction resolveEntryGlobalsTokens (entry: V2ScopeEntry): V1GlobalToken[] | undefined {\n if (entry.globalsTokens && entry.globalsTokens.length > 0) {\n return entry.globalsTokens;\n }\n\n if (entry.globals && Object.keys(entry.globals).length > 0) {\n return tokensFromRecord(entry.globals);\n }\n\n return undefined;\n}\n\nfunction pushFieldComment (lines: string[], comment: string | undefined, fieldIndent: string): void {\n if (comment === undefined) {\n return;\n }\n\n lines.push(indentCommentBlock(comment, fieldIndent));\n}\n\nfunction pushArrayField (\n lines: string[],\n label: string,\n entries: StringEntry[] | undefined,\n fieldComment: string | undefined,\n fieldIndent: string\n): void {\n if (!entries || entries.length === 0) {\n return;\n }\n\n pushFieldComment(lines, fieldComment, fieldIndent);\n lines.push(renderStringArrayField(label, entries, fieldIndent));\n}\n\nfunction formatEntry (entry: V2ScopeEntry, baseIndent: string): string {\n const fieldIndent = `${baseIndent}${indent}`;\n const lines: string[] = [`${baseIndent}{`];\n\n pushFieldComment(lines, entry.fieldComments?.files, fieldIndent);\n lines.push(renderStringArrayField('files', entry.files, fieldIndent));\n\n pushArrayField(lines, 'tsconfigPaths', entry.tsconfigPaths, entry.fieldComments?.tsconfigPaths, fieldIndent);\n pushArrayField(\n lines,\n 'globalComponents',\n entry.globalComponents,\n entry.fieldComments?.globalComponents,\n fieldIndent\n );\n pushArrayField(lines, 'ignores', entry.ignores, entry.fieldComments?.ignores, fieldIndent);\n\n const tokens = resolveEntryGlobalsTokens(entry);\n\n if (tokens) {\n pushFieldComment(lines, entry.fieldComments?.globals, fieldIndent);\n lines.push(renderGlobalsField(tokens, fieldIndent));\n }\n\n lines.push(`${baseIndent}},`);\n\n return lines.join('\\n');\n}\n\nfunction formatScope (scope: V2ScopeName, entries: readonly V2ScopeEntry[], baseIndent: string): string {\n const childIndent = `${baseIndent}${indent}`;\n const renderedEntries: string[] = [];\n\n entries.forEach(entry => {\n if (entry.leadingComment !== undefined) {\n renderedEntries.push(indentCommentBlock(entry.leadingComment, childIndent));\n }\n\n renderedEntries.push(formatEntry(entry, childIndent));\n });\n\n return [\n `${baseIndent}${scope}: [`,\n ...renderedEntries,\n `${baseIndent}],`,\n ].join('\\n');\n}\n\nfunction renderInsiderImport (plan: V2Plan): string {\n const names = plan.needsSilenceRulesImport\n ? ['silenceRules', 'useInsider']\n : ['useInsider'];\n const sorted = names.slice().sort((left, right) => left.localeCompare(right));\n\n return `import { ${sorted.join(', ')} } from '@useinsider/eslint-config';`;\n}\n\nfunction renderPreservedImports (preserved: readonly PreservedImport[]): string[] {\n return preserved.map(item => item.raw);\n}\n\nfunction renderImports (plan: V2Plan): string {\n const preserved = renderPreservedImports(plan.preservedImports ?? []);\n\n return [...preserved, renderInsiderImport(plan)].join('\\n');\n}\n\nfunction renderSilenceRulesCall (rules: readonly StringEntry[], leadingComment: string | undefined): string {\n const hasComment = anyEntryHasComment(rules);\n const prefix = leadingComment === undefined ? '' : `${leadingComment}\\n`;\n\n if (!hasComment) {\n const inline = `${prefix}silenceRules(${formatStringArrayInline(rules)});`;\n\n if (inline.length - prefix.length <= MAX_LINE_LENGTH) {\n return inline;\n }\n }\n\n const lines: string[] = ['silenceRules(['];\n\n rules.forEach(rule => {\n if (rule.leadingComment !== undefined) {\n lines.push(indentCommentBlock(rule.leadingComment, indent));\n }\n\n lines.push(`${indent}${quote(rule.value)},`);\n });\n\n lines.push(']);');\n\n return `${prefix}${lines.join('\\n')}`;\n}\n\nfunction renderSilenceRulesCalls (plan: V2Plan): string {\n if (plan.silenceRulesCalls.length === 0) {\n return '';\n }\n\n return plan.silenceRulesCalls\n .map(call => renderSilenceRulesCall(call.rules, call.leadingComment))\n .join('\\n\\n');\n}\n\nfunction hasAnyContent (plan: V2Plan): boolean {\n const { config } = plan;\n\n return config.scopes.size > 0\n || config.ignores.length > 0\n || config.strictGlobs.length > 0\n || config.strictWholeFile\n || config.spellChecker.ignoredPaths.length > 0\n || config.configFiles.length > 0;\n}\n\nfunction renderStrict (plan: V2Plan): string | null {\n if (plan.config.strictWholeFile) {\n return `${indent}strict: true,`;\n }\n\n if (plan.config.strictGlobs.length > 0) {\n return renderStringArrayField('strict', plan.config.strictGlobs, indent);\n }\n\n return null;\n}\n\nfunction renderSpellChecker (plan: V2Plan): string | null {\n if (plan.config.spellChecker.ignoredPaths.length === 0) {\n return null;\n }\n\n const innerIndent = `${indent}${indent}`;\n\n return [\n `${indent}spellChecker: {`,\n renderStringArrayField('ignoredPaths', plan.config.spellChecker.ignoredPaths, innerIndent),\n `${indent}},`,\n ].join('\\n');\n}\n\nfunction renderScopes (plan: V2Plan): string[] {\n return [...plan.config.scopes.entries()].map(([scope, entries]) => formatScope(scope, entries, indent));\n}\n\nfunction renderConfigFiles (plan: V2Plan): string | null {\n if (plan.config.configFiles.length === 0) {\n return null;\n }\n\n return renderStringArrayField('configFiles', plan.config.configFiles, indent);\n}\n\nfunction renderConfigBody (plan: V2Plan): string {\n const lines: string[] = [];\n\n if (plan.config.ignores.length > 0) {\n lines.push(renderStringArrayField('ignores', plan.config.ignores, indent));\n }\n\n lines.push(...renderScopes(plan));\n\n const configFilesLine = renderConfigFiles(plan);\n\n if (configFilesLine) {\n lines.push(configFilesLine);\n }\n\n const strictLine = renderStrict(plan);\n\n if (strictLine) {\n lines.push(strictLine);\n }\n\n const spellCheckerSection = renderSpellChecker(plan);\n\n if (spellCheckerSection) {\n lines.push(spellCheckerSection);\n }\n\n return lines.join('\\n');\n}\n\nexport function renderV2 (plan: V2Plan): string {\n const parts: string[] = [renderImports(plan)];\n const silenceRulesSection = renderSilenceRulesCalls(plan);\n\n if (silenceRulesSection) {\n parts.push('');\n parts.push(silenceRulesSection);\n }\n\n parts.push('');\n\n if (plan.useInsiderLeadingComment !== undefined) {\n parts.push(plan.useInsiderLeadingComment);\n }\n\n if (!hasAnyContent(plan)) {\n parts.push('export const { useInsiderESLint, useInsiderOXC } = useInsider({});');\n parts.push('');\n\n return pruneUnusedImports(parts.join('\\n'));\n }\n\n parts.push('export const { useInsiderESLint, useInsiderOXC } = useInsider({');\n parts.push(renderConfigBody(plan));\n parts.push('});');\n parts.push('');\n\n return pruneUnusedImports(parts.join('\\n'));\n}\n","import type {\n ParseResult,\n PreservedImport,\n StringEntry,\n V1ArrayElement,\n V1ConfigFieldComments,\n V1GlobalConf,\n V1GlobalToken,\n V1IgnoresBlock,\n V1PresetName,\n V1SpellCheckerOffBlock,\n V1StandaloneGlobals,\n V1UseInsiderCall,\n V2Config,\n V2EntryFieldComments,\n V2Plan,\n V2ScopeEntry,\n V2ScopeName,\n} from './types';\nimport type { MigrationWarning } from './warnings';\nimport { foldGlobalsTokens } from './globalsFolding';\nimport { cloneEntries, cloneEntry, entryValues, hasValue } from './stringEntry';\n\nfunction appendUniqueEntry (target: StringEntry[], incoming: StringEntry): void {\n if (hasValue(target, incoming.value)) {\n return;\n }\n\n target.push(cloneEntry(incoming));\n}\n\nconst presetToScope: Partial<Record<V1PresetName, V2ScopeName>> = {\n javascript: 'javascript',\n 'javascript-dom': 'javascriptDom',\n 'javascript-node': 'javascriptNode',\n typescript: 'typescript',\n 'typescript-dom': 'typescriptDom',\n 'typescript-node': 'typescriptNode',\n vue2: 'vue2',\n vue3: 'vue3',\n 'vue2-typescript': 'vue2Typescript',\n 'vue3-typescript': 'vue3Typescript',\n jest: 'jest',\n vitest: 'vitest',\n 'jsdoc-based-ts': 'jsdocBasedTs',\n};\n\nfunction isTypescriptContext (call: V1UseInsiderCall): boolean {\n if (call.parserIsTypescript) {\n return true;\n }\n\n return Boolean(call.parserProject && call.parserProject.length > 0);\n}\n\nfunction resolveAliasPreset (preset: V1PresetName, call: V1UseInsiderCall): V1PresetName {\n if (preset === 'dom') {\n return isTypescriptContext(call) ? 'typescript-dom' : 'javascript-dom';\n }\n\n if (preset === 'node') {\n return isTypescriptContext(call) ? 'typescript-node' : 'javascript-node';\n }\n\n return preset;\n}\n\nfunction promoteScopeForParser (scope: V2ScopeName, call: V1UseInsiderCall): V2ScopeName {\n if (!call.parserIsTypescript) {\n return scope;\n }\n\n if (scope === 'javascript') {\n return 'typescript';\n }\n\n if (scope === 'javascriptDom') {\n return 'typescriptDom';\n }\n\n if (scope === 'javascriptNode') {\n return 'typescriptNode';\n }\n\n if (scope === 'vue2') {\n return 'vue2Typescript';\n }\n\n if (scope === 'vue3') {\n return 'vue3Typescript';\n }\n\n return scope;\n}\n\nconst tsScopes = new Set<V2ScopeName>([\n 'typescript',\n 'typescriptDom',\n 'typescriptNode',\n 'vue2Typescript',\n 'vue3Typescript',\n 'jsdocBasedTs',\n]);\n\nconst vueScopes = new Set<V2ScopeName>([\n 'vue2',\n 'vue3',\n 'vue2Typescript',\n 'vue3Typescript',\n]);\n\nfunction freshConfig (): V2Config {\n return {\n ignores: [],\n scopes: new Map(),\n strictGlobs: [],\n strictWholeFile: false,\n spellChecker: { ignoredPaths: [] },\n configFiles: [],\n };\n}\n\nfunction appendScope (config: V2Config, scope: V2ScopeName, entry: V2ScopeEntry): void {\n const existing = config.scopes.get(scope);\n\n if (existing) {\n existing.push(entry);\n } else {\n config.scopes.set(scope, [entry]);\n }\n}\n\nfunction applyTypescriptFields (\n entry: V2ScopeEntry,\n scope: V2ScopeName,\n call: V1UseInsiderCall,\n warnings: MigrationWarning[]\n): void {\n if (!tsScopes.has(scope)) {\n return;\n }\n\n if (call.parserProject && call.parserProject.length > 0) {\n entry.tsconfigPaths = cloneEntries(call.parserProject);\n\n return;\n }\n\n if (call.parserProjectService) {\n warnings.push({\n kind: 'project-service-dropped',\n line: call.line,\n message: '\\'projectService: true\\' is not supported in v2 — dropped',\n });\n }\n}\n\nfunction applyVueFields (entry: V2ScopeEntry, scope: V2ScopeName, call: V1UseInsiderCall): void {\n if (vueScopes.has(scope) && call.globalComponents && call.globalComponents.length > 0) {\n entry.globalComponents = cloneEntries(call.globalComponents);\n }\n}\n\nfunction mapV1FieldComments (\n call: V1UseInsiderCall,\n scope: V2ScopeName\n): V2EntryFieldComments | undefined {\n const incoming: V1ConfigFieldComments | undefined = call.fieldComments;\n\n if (!incoming) {\n return undefined;\n }\n\n const result: V2EntryFieldComments = {};\n\n if (incoming.files !== undefined) {\n result.files = incoming.files;\n }\n\n if (incoming.ignores !== undefined) {\n result.ignores = incoming.ignores;\n }\n\n if (incoming.globals !== undefined) {\n result.globals = incoming.globals;\n }\n\n if (incoming.parserProject !== undefined && tsScopes.has(scope)) {\n result.tsconfigPaths = incoming.parserProject;\n }\n\n if (incoming.globalComponents !== undefined && vueScopes.has(scope)) {\n result.globalComponents = incoming.globalComponents;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction buildEntry (\n call: V1UseInsiderCall,\n scope: V2ScopeName,\n warnings: MigrationWarning[]\n): V2ScopeEntry | null {\n if (!call.files || call.files.length === 0) {\n warnings.push({\n kind: 'unrecognized-block',\n line: call.line,\n message: `useInsider preset '${scope}' has no files glob; skipping`,\n });\n\n return null;\n }\n\n const entry: V2ScopeEntry = { files: cloneEntries(call.files) };\n\n if (call.ignores && call.ignores.length > 0) {\n entry.ignores = cloneEntries(call.ignores);\n }\n\n applyTypescriptFields(entry, scope, call, warnings);\n applyVueFields(entry, scope, call);\n\n if (call.globalsTokens && call.globalsTokens.length > 0) {\n entry.globalsTokens = call.globalsTokens.map(token => ({ ...token }));\n }\n\n if (call.globals && Object.keys(call.globals).length > 0) {\n entry.globals = { ...call.globals };\n }\n\n const fieldComments = mapV1FieldComments(call, scope);\n\n if (fieldComments) {\n entry.fieldComments = fieldComments;\n }\n\n return entry;\n}\n\nfunction handleStrictPreset (call: V1UseInsiderCall, config: V2Config): void {\n if (!call.files || call.files.length === 0) {\n config.strictWholeFile = true;\n\n return;\n }\n\n call.files.forEach(file => appendUniqueEntry(config.strictGlobs, file));\n}\n\nfunction handlePreset (\n preset: V1PresetName,\n call: V1UseInsiderCall,\n config: V2Config,\n warnings: MigrationWarning[]\n): V2ScopeEntry | null {\n if (preset === 'strict') {\n handleStrictPreset(call, config);\n\n return null;\n }\n\n const resolved = resolveAliasPreset(preset, call);\n const baseScope = presetToScope[resolved];\n\n if (!baseScope) {\n warnings.push({\n kind: 'unknown-preset',\n line: call.line,\n message: `Preset '${preset}' has no v2 mapping — dropped`,\n });\n\n return null;\n }\n\n const scope = promoteScopeForParser(baseScope, call);\n const entry = buildEntry(call, scope, warnings);\n\n if (entry) {\n appendScope(config, scope, entry);\n\n return entry;\n }\n\n return null;\n}\n\ninterface DroppedStats {\n droppedRules: number;\n droppedRuleBlocks: number;\n droppedPlugins: Set<string>;\n droppedPluginEntries: number;\n}\n\nfunction emptyStats (): DroppedStats {\n return {\n droppedRules: 0,\n droppedRuleBlocks: 0,\n droppedPlugins: new Set<string>(),\n droppedPluginEntries: 0,\n };\n}\n\nfunction captureConfigPresetFiles (call: V1UseInsiderCall, config: V2Config): void {\n if (!call.presets.includes('config') || !call.files) {\n return;\n }\n\n call.files.forEach(file => appendUniqueEntry(config.configFiles, file));\n}\n\nfunction processUseInsiderCall (\n call: V1UseInsiderCall,\n config: V2Config,\n warnings: MigrationWarning[]\n): DroppedStats {\n captureConfigPresetFiles(call, config);\n\n const filteredPresets = call.presets.filter(preset => preset !== 'config');\n const stats = emptyStats();\n\n stats.droppedRules = call.extraRuleCount > 0 ? call.extraRuleCount : 0;\n stats.droppedRuleBlocks = call.extraRuleCount > 0 ? 1 : 0;\n\n if (call.customPluginNames && call.customPluginNames.length > 0) {\n call.customPluginNames.forEach(name => stats.droppedPlugins.add(name));\n stats.droppedPluginEntries = 1;\n }\n\n let firstEmitted: V2ScopeEntry | null = null;\n\n filteredPresets.forEach(preset => {\n const emitted = handlePreset(preset, call, config, warnings);\n\n if (emitted && !firstEmitted) {\n firstEmitted = emitted;\n }\n });\n\n if (firstEmitted && call.leadingComment !== undefined) {\n (firstEmitted as V2ScopeEntry).leadingComment = call.leadingComment;\n }\n\n return stats;\n}\n\nfunction applyIgnoresBlock (element: V1IgnoresBlock, config: V2Config): void {\n if (element.leadingComment !== undefined\n && element.ignores.length > 0\n && config.ignores.length === 0\n && element.ignores[0].leadingComment === undefined) {\n const first = cloneEntry(element.ignores[0]);\n\n first.leadingComment = element.leadingComment;\n config.ignores.push(first);\n element.ignores.slice(1).forEach(ignore => appendUniqueEntry(config.ignores, ignore));\n\n return;\n }\n\n element.ignores.forEach(ignore => appendUniqueEntry(config.ignores, ignore));\n}\n\nfunction applySpellCheckerOff (element: V1SpellCheckerOffBlock, config: V2Config): void {\n element.files.forEach(file => appendUniqueEntry(config.spellChecker.ignoredPaths, file));\n}\n\nfunction filesOverlap (left: readonly StringEntry[], right: readonly StringEntry[]): boolean {\n const leftValues = entryValues(left);\n const rightValues = entryValues(right);\n\n if (leftValues.length === rightValues.length\n && leftValues.every((value, index) => value === rightValues[index])) {\n return true;\n }\n\n return leftValues.some(value => rightValues.includes(value));\n}\n\nfunction findEntryForStandalone (config: V2Config, files: StringEntry[]): V2ScopeEntry | null {\n const allEntries = [...config.scopes.values()].flat();\n const match = allEntries.find(entry => filesOverlap(entry.files, files));\n\n return match ?? null;\n}\n\nfunction mergeStandaloneTokensIntoEntry (entry: V2ScopeEntry, incoming: V1GlobalToken[]): void {\n const existing = entry.globalsTokens ?? [];\n const namedSeen = new Map<string, number>();\n\n existing.forEach((token, index) => {\n if (token.kind === 'named') {\n namedSeen.set(token.key, index);\n }\n });\n\n const merged = existing.slice();\n\n incoming.forEach(token => {\n if (token.kind === 'spread') {\n merged.push({ ...token });\n\n return;\n }\n\n const seenIndex = namedSeen.get(token.key);\n\n if (seenIndex === undefined) {\n namedSeen.set(token.key, merged.length);\n merged.push({ ...token });\n\n return;\n }\n\n merged[seenIndex] = { ...token };\n });\n\n entry.globalsTokens = merged;\n\n const namedRecord: Record<string, V1GlobalConf> = {};\n\n merged.forEach(token => {\n if (token.kind === 'named') {\n namedRecord[token.key] = token.value;\n }\n });\n\n entry.globals = Object.keys(namedRecord).length > 0 ? namedRecord : undefined;\n}\n\nfunction inferScopeForStandalone (files: StringEntry[]): V2ScopeName {\n const values = entryValues(files);\n const hasVue = values.some(file => file.includes('.vue'));\n\n if (hasVue) {\n return 'vue3';\n }\n\n const hasTs = values.some(file => file.includes('.ts') || file.includes('.tsx'));\n\n if (hasTs) {\n return 'typescript';\n }\n\n return 'javascript';\n}\n\nfunction applyStandaloneGlobals (element: V1StandaloneGlobals, config: V2Config): void {\n const existing = findEntryForStandalone(config, element.files);\n\n if (existing) {\n mergeStandaloneTokensIntoEntry(existing, element.globalsTokens);\n\n if (existing.leadingComment === undefined && element.leadingComment !== undefined) {\n existing.leadingComment = element.leadingComment;\n }\n\n return;\n }\n\n const scope = inferScopeForStandalone(element.files);\n const entry: V2ScopeEntry = { files: cloneEntries(element.files) };\n\n mergeStandaloneTokensIntoEntry(entry, element.globalsTokens);\n\n if (element.leadingComment !== undefined) {\n entry.leadingComment = element.leadingComment;\n }\n\n appendScope(config, scope, entry);\n}\n\nfunction processElement (\n element: V1ArrayElement,\n config: V2Config,\n warnings: MigrationWarning[]\n): DroppedStats {\n if (element.kind === 'ignoresBlock') {\n applyIgnoresBlock(element, config);\n\n return emptyStats();\n }\n\n if (element.kind === 'spellCheckerOff') {\n applySpellCheckerOff(element, config);\n\n return emptyStats();\n }\n\n if (element.kind === 'standaloneGlobals') {\n applyStandaloneGlobals(element, config);\n\n return emptyStats();\n }\n\n if (element.kind === 'useInsiderCall') {\n return processUseInsiderCall(element, config, warnings);\n }\n\n return emptyStats();\n}\n\nfunction formatDroppedRulesMessage (count: number, blocks: number): string {\n const rulesLabel = count === 1 ? 'rule override' : 'rule overrides';\n const blocksLabel = blocks === 1 ? 'block' : 'blocks';\n\n return `Dropped ${count} custom ${rulesLabel} across ${blocks} ${blocksLabel}`;\n}\n\nfunction formatDroppedPluginsMessage (pluginNames: string[], entries: number): string {\n const sorted = pluginNames.slice().sort((left, right) => left.localeCompare(right));\n\n return `Dropped custom plugins on ${entries} entries: ${sorted.join(', ')}`;\n}\n\nfunction mergeStats (left: DroppedStats, right: DroppedStats): DroppedStats {\n const merged = emptyStats();\n\n merged.droppedRules = left.droppedRules + right.droppedRules;\n merged.droppedRuleBlocks = left.droppedRuleBlocks + right.droppedRuleBlocks;\n merged.droppedPluginEntries = left.droppedPluginEntries + right.droppedPluginEntries;\n left.droppedPlugins.forEach(name => merged.droppedPlugins.add(name));\n right.droppedPlugins.forEach(name => merged.droppedPlugins.add(name));\n\n return merged;\n}\n\nfunction tokensFromRecord (globals: Record<string, V1GlobalConf>): V1GlobalToken[] {\n return Object.entries(globals).map(([key, value]) => ({ kind: 'named' as const, key, value }));\n}\n\nfunction resolveBaseTokens (entry: V2ScopeEntry): V1GlobalToken[] | undefined {\n if (entry.globalsTokens && entry.globalsTokens.length > 0) {\n return entry.globalsTokens;\n }\n\n if (entry.globals && Object.keys(entry.globals).length > 0) {\n return tokensFromRecord(entry.globals);\n }\n\n return undefined;\n}\n\nfunction applyGlobalsFolding (config: V2Config): boolean {\n let anySyntheticEmitted = false;\n\n config.scopes.forEach(entries => {\n entries.forEach(entry => {\n const baseTokens = resolveBaseTokens(entry);\n\n if (!baseTokens) {\n return;\n }\n\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens(baseTokens);\n\n if (addedSpreadEnvs.length > 0) {\n anySyntheticEmitted = true;\n }\n\n entry.globalsTokens = tokens;\n\n const namedRecord: Record<string, V1GlobalConf> = {};\n\n tokens.forEach(token => {\n if (token.kind === 'named') {\n namedRecord[token.key] = token.value;\n }\n });\n\n entry.globals = Object.keys(namedRecord).length > 0 ? namedRecord : undefined;\n });\n });\n\n return anySyntheticEmitted;\n}\n\nfunction ensureGlobalsImport (preserved: PreservedImport[]): PreservedImport[] {\n if (preserved.some(item => item.moduleSpecifier === 'globals')) {\n return preserved;\n }\n\n return [{ raw: \"import globals from 'globals';\", moduleSpecifier: 'globals' }, ...preserved];\n}\n\nfunction countRescuedSiblingCalls (parseResult: ParseResult): number {\n return parseResult.arrayElements.reduce((accumulator, element) => {\n if (element.kind === 'useInsiderCall' && element.rescuedSiblingLanguageOptions === true) {\n return accumulator + 1;\n }\n\n return accumulator;\n }, 0);\n}\n\nfunction formatRescuedSiblingMessage (count: number): string {\n const label = count === 1 ? 'call' : 'calls';\n\n return `Rescued misplaced \\`languageOptions\\` from ${count} \\`useInsider()\\` ${label} `\n + '— these were source-level mistakes that v1 ignored silently';\n}\n\nexport function transformToV2 (parseResult: ParseResult): V2Plan {\n const config = freshConfig();\n const warnings: MigrationWarning[] = [...parseResult.warnings];\n\n const stats = parseResult.arrayElements.reduce<DroppedStats>(\n (accumulator, element) => mergeStats(accumulator, processElement(element, config, warnings)),\n emptyStats()\n );\n\n if (stats.droppedRules > 0) {\n warnings.push({\n kind: 'dropped-rules',\n message: formatDroppedRulesMessage(stats.droppedRules, stats.droppedRuleBlocks),\n });\n }\n\n if (stats.droppedPluginEntries > 0 && stats.droppedPlugins.size > 0) {\n warnings.push({\n kind: 'dropped-plugins',\n message: formatDroppedPluginsMessage([...stats.droppedPlugins], stats.droppedPluginEntries),\n });\n }\n\n const rescuedSiblingCount = countRescuedSiblingCalls(parseResult);\n\n if (rescuedSiblingCount > 0) {\n warnings.push({\n kind: 'rescued-sibling-language-options',\n message: formatRescuedSiblingMessage(rescuedSiblingCount),\n });\n }\n\n const emittedSyntheticSpread = applyGlobalsFolding(config);\n const preservedImports = emittedSyntheticSpread\n ? ensureGlobalsImport(parseResult.preservedImports)\n : parseResult.preservedImports;\n\n return {\n config,\n silenceRulesCalls: parseResult.silenceRulesCalls,\n needsSilenceRulesImport: parseResult.silenceRulesCalls.length > 0,\n preservedImports,\n warnings,\n droppedRuleCount: stats.droppedRules,\n droppedRuleBlockCount: stats.droppedRuleBlocks,\n };\n}\n","export type MigrationWarningKind = | 'unrecognized-block'\n | 'dropped-rules'\n | 'dropped-globals'\n | 'dropped-plugins'\n | 'project-service-dropped'\n | 'unknown-preset'\n | 'parse-failure'\n | 'no-insider-extends'\n | 'dropped-extends'\n | 'dropped-settings'\n | 'unresolved-rules-spread'\n | 'extension-not-supported'\n | 'env-both-browser-and-node'\n | 'rescued-sibling-language-options'\n | 'dropped-type-annotation'\n | 'unregistered-scope';\n\nexport interface MigrationWarning {\n kind: MigrationWarningKind;\n line?: number;\n message: string;\n}\n\nexport function formatWarnings (warnings: readonly MigrationWarning[]): string {\n if (warnings.length === 0) {\n return '';\n }\n\n return warnings\n .map(warning => {\n const location = warning.line === undefined ? '' : `line ${warning.line}: `;\n\n return ` - ${location}${warning.message}`;\n })\n .join('\\n');\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('formatWarnings', () => {\n test('returns empty string when no warnings', () => {\n expect(formatWarnings([])).toBe('');\n });\n\n test('formats a warning without a line number', () => {\n expect(formatWarnings([\n { kind: 'dropped-rules', message: 'Dropped 5 rules across 2 blocks' },\n ])).toBe(' - Dropped 5 rules across 2 blocks');\n });\n\n test('formats a warning with a line number', () => {\n expect(formatWarnings([\n { kind: 'unrecognized-block', line: 12, message: 'Unrecognized block: dropping' },\n ])).toBe(' - line 12: Unrecognized block: dropping');\n });\n\n test('joins multiple warnings with newlines', () => {\n const output = formatWarnings([\n { kind: 'dropped-rules', message: 'a' },\n { kind: 'dropped-globals', line: 3, message: 'b' },\n ]);\n\n expect(output).toBe(' - a\\n - line 3: b');\n });\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { renderLintLayoutFiles, resolveLintLayout } from '~/cli/lintLayout';\n\nexport interface WriteMigrationResult {\n targetPath: string;\n lintModulePath: string;\n writtenPaths: string[];\n deletedSourceCandidates: string[];\n}\n\ninterface LayoutWriteResult {\n eslintConfigPath: string;\n lintModulePath: string;\n writtenPaths: string[];\n replacedEslintConfigPaths: string[];\n}\n\nfunction writeLayout (directory: string, lintModuleSource: string): LayoutWriteResult {\n const layout = resolveLintLayout(directory);\n const lintModulePath = join(directory, layout.lintModule);\n\n writeFileSync(lintModulePath, lintModuleSource, 'utf8');\n\n const writtenPaths = [lintModulePath];\n\n renderLintLayoutFiles(layout).forEach(file => {\n const path = join(directory, file.filename);\n\n writeFileSync(path, file.source, 'utf8');\n writtenPaths.push(path);\n });\n\n return {\n eslintConfigPath: join(directory, layout.eslintConfig),\n lintModulePath,\n writtenPaths,\n replacedEslintConfigPaths: layout.replacedEslintConfigs.map(name => join(directory, name)),\n };\n}\n\nfunction withoutDuplicates (paths: readonly string[], keep: string): string[] {\n return [...new Set(paths.filter(path => path !== keep))];\n}\n\n/**\n * Writes the three-file layout beside an existing flat config: the rendered `useInsider()` call\n * becomes `insider.lint.*`, and `eslint.config.*` / `oxlint.config.*` become thin re-exports. A\n * JavaScript-extension source config is superseded by the TypeScript one and nominated for deletion.\n * @example\n * writeMigration('/repo/eslint.config.js', source).deletedSourceCandidates; // ['/repo/eslint.config.js']\n */\nexport function writeMigration (targetPath: string, newSource: string): WriteMigrationResult {\n const result = writeLayout(dirname(targetPath), newSource);\n\n return {\n targetPath: result.eslintConfigPath,\n lintModulePath: result.lintModulePath,\n writtenPaths: result.writtenPaths,\n deletedSourceCandidates: withoutDuplicates(\n [...result.replacedEslintConfigPaths, targetPath],\n result.eslintConfigPath\n ),\n };\n}\n\n/**\n * Same as {@link writeMigration}, but for a legacy `.eslintrc*` source that has to be replaced by a\n * differently-named flat config.\n * @example\n * writeMigrationLegacy('/repo/.eslintrc.cjs', '/repo/eslint.config.mts', src).deletedSourceCandidates;\n * // ['/repo/.eslintrc.cjs']\n */\nexport function writeMigrationLegacy (\n sourcePath: string,\n writePath: string,\n newSource: string\n): WriteMigrationResult {\n const result = writeLayout(dirname(writePath), newSource);\n\n return {\n targetPath: result.eslintConfigPath,\n lintModulePath: result.lintModulePath,\n writtenPaths: result.writtenPaths,\n deletedSourceCandidates: withoutDuplicates(\n [...result.replacedEslintConfigPaths, sourcePath],\n result.eslintConfigPath\n ),\n };\n}\n","import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, isAbsolute, join, resolve } from 'node:path';\nimport type { ParseResult, V2Plan, V2ScopeName } from './types';\nimport { type ClackLike, loadClack } from '../questions';\nimport {\n clearSession,\n loadSession,\n type MigrateSessionAnswers,\n saveSession,\n} from '../sessionStore';\nimport {\n findConfigFile,\n FLAT_CONFIG_FILENAMES,\n LEGACY_CONFIG_FILENAMES,\n} from '~/cli/detect';\nimport {\n type DependencyInstaller,\n detectPackageManager,\n formatNextStepsAddCommand,\n formatNextStepsRemoveCommand,\n type InstallOutcome,\n installWithRetry,\n type PackageManager,\n type WipeFsOps,\n} from '~/cli/installWithRetry';\nimport {\n formatLintScriptChanges,\n formatSkippedLintScripts,\n type LintScriptResult,\n OXLINT_LINT_SCRIPT,\n resolveLintLayout,\n setLintScript,\n} from '~/cli/lintLayout';\nimport { pruneConsumerPackageJson } from '~/cli/prunePackageJson';\nimport { applyTsExtensionsFlag } from '~/cli/tsconfigFlag';\nimport {\n buildInstallList,\n type InstallList,\n type PackageManifestLike,\n pruneEslintDependencies,\n readOwnEslintConfigManifest,\n} from './dependencies';\nimport {\n formatUntouchedDirectiveFiles,\n previewDisableDirectives,\n rewriteDisableDirectives,\n} from './disableDirectives';\nimport { parseEslintrc } from './eslintrc/parse';\nimport { transformEslintrcToV2 } from './eslintrc/transform';\nimport { parseV1Config } from './parse';\nimport { rehouseV3Config, type V3Rehouse } from './rehouseV3';\nimport { renderV2 } from './render';\nimport { transformToV2 } from './transform';\nimport { formatWarnings, type MigrationWarning } from './warnings';\nimport { writeMigration, writeMigrationLegacy } from './writer';\n\nexport type { DependencyInstaller, WipeFsOps };\n\nexport interface MigrateOverrides {\n installer?: DependencyInstaller;\n readEslintConfigManifest?: () => PackageManifestLike;\n wipeFs?: WipeFsOps;\n}\n\nexport interface RunMigrateInput {\n cwd: string;\n target?: string;\n yes?: boolean;\n noInstall?: boolean;\n fromLint?: boolean;\n overrides?: MigrateOverrides;\n}\n\nconst unsupportedEslintrcExtensions = ['.json', '.yml', '.yaml'];\n\ntype SourceFormat = 'flat' | 'eslintrc' | 'eslintrc-unsupported';\n\nfunction flatLooksLikeV1 (filePath: string): boolean {\n try {\n const source = readFileSync(filePath, 'utf8');\n\n return source.includes('useInsider') && /\\b(import|require)\\b/.test(source);\n } catch {\n return false;\n }\n}\n\nfunction resolveTargetPath (input: RunMigrateInput): string | null {\n if (input.target) {\n const absolute = isAbsolute(input.target) ? input.target : resolve(input.cwd, input.target);\n\n if (existsSync(absolute)) {\n return absolute;\n }\n\n return null;\n }\n\n const flatFound = findConfigFile(input.cwd, FLAT_CONFIG_FILENAMES);\n const legacyFound = findConfigFile(input.cwd, LEGACY_CONFIG_FILENAMES);\n\n if (flatFound && legacyFound) {\n return flatLooksLikeV1(flatFound) ? flatFound : legacyFound;\n }\n\n return flatFound ?? legacyFound ?? null;\n}\n\nfunction detectFormatByName (filePath: string): SourceFormat | null {\n const name = basename(filePath);\n\n if (name.startsWith('eslint.config.')) {\n return 'flat';\n }\n\n if (!name.startsWith('.eslintrc')) {\n return null;\n }\n\n if (name === '.eslintrc') {\n return 'eslintrc-unsupported';\n }\n\n const unsupported = unsupportedEslintrcExtensions.find(extension => name.endsWith(extension));\n\n if (unsupported) {\n return 'eslintrc-unsupported';\n }\n\n return 'eslintrc';\n}\n\nfunction detectFormatByContent (source: string): SourceFormat {\n if (source.includes('export default') && source.includes('useInsider')) {\n return 'flat';\n }\n\n if (/\\bmodule\\.exports\\s*=/.test(source)) {\n return 'eslintrc';\n }\n\n return 'flat';\n}\n\nfunction detectFormat (filePath: string, source: string): SourceFormat {\n const byName = detectFormatByName(filePath);\n\n if (byName) {\n return byName;\n }\n\n return detectFormatByContent(source);\n}\n\nfunction isV1Shape (parseResult: ParseResult): boolean {\n if (!parseResult.hasUseInsiderImport) {\n return false;\n }\n\n return parseResult.arrayElements.some(element => element.kind === 'useInsiderCall');\n}\n\nfunction describeScopes (plan: V2Plan): string {\n if (plan.config.scopes.size === 0) {\n return 'Scopes detected: (none)';\n }\n\n const detected = [...plan.config.scopes.entries()]\n .map(([scope, entries]) => `${scope} (${entries.length})`)\n .join(', ');\n\n return `Scopes detected: ${detected}`;\n}\n\nfunction describeStrict (plan: V2Plan): string {\n if (plan.config.strictWholeFile) {\n return 'Strict scopes: global (true)';\n }\n\n if (plan.config.strictGlobs.length > 0) {\n return `Strict scopes: 1 (${plan.config.strictGlobs.length} globs)`;\n }\n\n return 'Strict scopes: 0';\n}\n\nfunction describeRehousedKeys (label: string, keys: readonly string[]): string {\n return keys.length === 0 ? `${label}: (none)` : `${label}: ${keys.join(', ')}`;\n}\n\n// The v3 → v4 change is where the call lives, not what it says, so the summary reports what was\n// carried over rather than what was understood — the two are the same file here.\nfunction rehouseSummary (rehoused: V3Rehouse): string {\n const lines = [\n 'Source: v3 single-file eslint.config.*',\n 'Re-housed as the lint module: only the export statement changed, every other line is byte-for-byte.',\n describeRehousedKeys('Options carried over', rehoused.optionKeys),\n describeRehousedKeys('Scopes with dependencies', rehoused.scopes),\n `silenceRules() calls kept: ${rehoused.silenceRulesCallCount}`,\n ];\n\n if (rehoused.droppedAwait) {\n lines.push('Dropped the `await` on the call — useInsider() is synchronous in v4.');\n }\n\n if (rehoused.droppedArrayWrapper) {\n lines.push('Dropped the array wrapper around the call — the lint module exports the renderers.');\n }\n\n lines.push(`Warnings: ${rehoused.warnings.length}`);\n\n return lines.join('\\n');\n}\n\nfunction summary (plan: V2Plan, format: SourceFormat): string {\n const lines: string[] = [];\n\n if (format === 'eslintrc') {\n lines.push('Source: legacy .eslintrc');\n } else {\n lines.push('Source: flat eslint.config.*');\n }\n\n lines.push(describeScopes(plan));\n lines.push(describeStrict(plan));\n lines.push(`spellChecker.ignoredPaths: ${plan.config.spellChecker.ignoredPaths.length}`);\n\n const blocksLabel = plan.droppedRuleBlockCount === 1 ? 'block' : 'blocks';\n\n lines.push(`Dropped custom rules: ${plan.droppedRuleCount} across ${plan.droppedRuleBlockCount} ${blocksLabel}`);\n lines.push(`Warnings: ${plan.warnings.length}`);\n\n return lines.join('\\n');\n}\n\nexport type PreparedSource = | { kind: 'plan'; plan: V2Plan }\n | { kind: 'rehouse'; rehoused: V3Rehouse };\n\ntype SourceModelResult = | { ok: false; reason: string | null }\n | { ok: true; model: PreparedSource };\n\n// Three source shapes reach here. A legacy `.eslintrc*` and a v1 `useInsider({ preset })` call are\n// re-rendered from a parsed plan; a v3 config carries the same options v4 takes, so it is re-housed\n// instead — re-rendering it could only lose comments and expressions it does not need to understand.\nfunction sourceModelFrom (resolved: ResolvedSource): SourceModelResult {\n if (resolved.format !== 'flat') {\n const parseResult = parseEslintrc(resolved.source, resolved.targetPath);\n\n return parseResult.found\n ? { ok: true, model: { kind: 'plan', plan: transformEslintrcToV2(parseResult) } }\n : { ok: false, reason: null };\n }\n\n const parseResult = parseV1Config(resolved.source, resolved.targetPath);\n\n if (isV1Shape(parseResult)) {\n return { ok: true, model: { kind: 'plan', plan: transformToV2(parseResult) } };\n }\n\n const outcome = rehouseV3Config(resolved.source, resolved.targetPath);\n\n if (outcome.kind === 'rehoused') {\n return { ok: true, model: { kind: 'rehouse', rehoused: outcome.rehoused } };\n }\n\n return { ok: false, reason: outcome.kind === 'refused' ? outcome.reason : null };\n}\n\nfunction scopesOf (model: PreparedSource): Set<V2ScopeName> {\n if (model.kind === 'plan') {\n return new Set<V2ScopeName>(model.plan.config.scopes.keys());\n }\n\n return new Set<V2ScopeName>(model.rehoused.scopes);\n}\n\nfunction warningsOf (model: PreparedSource): readonly MigrationWarning[] {\n return model.kind === 'plan' ? model.plan.warnings : model.rehoused.warnings;\n}\n\n// The flat config is written under the layout's own filename, not the source's. A JavaScript\n// extension is not a cosmetic difference here: ESLint loads `.js`/`.mjs`/`.cjs` configs through Node,\n// so importing `./insider.lint.ts` from one needs unflagged type stripping and dies on Node 20.\nfunction targetWritePath (cwd: string, sourcePath: string): string {\n const directory = dirname(sourcePath) || cwd;\n\n return join(directory, resolveLintLayout(directory).eslintConfig);\n}\n\nfunction parseEslintIgnoreContents (raw: string): string[] {\n return raw\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line.length > 0 && !line.startsWith('#'));\n}\n\ninterface EslintIgnoreLookup {\n path: string;\n patterns: string[];\n}\n\nfunction findEslintIgnore (sourcePath: string): EslintIgnoreLookup | null {\n const candidate = join(dirname(sourcePath), '.eslintignore');\n\n if (!existsSync(candidate)) {\n return null;\n }\n\n const raw = readFileSync(candidate, 'utf8');\n const patterns = parseEslintIgnoreContents(raw);\n\n return { path: candidate, patterns };\n}\n\nfunction mergeIgnorePatterns (plan: V2Plan, extra: readonly string[]): void {\n extra.forEach(pattern => {\n if (!plan.config.ignores.some(existing => existing.value === pattern)) {\n plan.config.ignores.push({ value: pattern });\n }\n });\n}\n\nfunction safeUnlink (filePath: string, clack: ClackLike, label: string): void {\n try {\n unlinkSync(filePath);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n if (clack.note) {\n clack.note(`Could not delete ${label} at ${filePath}: ${reason}`, 'Warning');\n }\n }\n}\n\ninterface DepChangeSummary {\n removed: string[];\n install: InstallList;\n packageJsonPath: string | null;\n}\n\nfunction describeDepChanges (depChanges: DepChangeSummary | null): string | null {\n if (!depChanges || !depChanges.packageJsonPath) {\n return null;\n }\n\n const lines: string[] = ['The following dependency changes will be applied to package.json:'];\n\n if (depChanges.removed.length > 0) {\n lines.push(`- Remove (${depChanges.removed.length}): ${depChanges.removed.join(', ')}`);\n } else {\n lines.push('- Remove (0): (none)');\n }\n\n lines.push(`- Install (${depChanges.install.specs.length}): ${depChanges.install.specs.join(', ')}`);\n\n return lines.join('\\n');\n}\n\n// Entered from a failing lint run rather than from a deliberate `migrate` invocation, so the very\n// first thing the consumer sees has to be an explicit yes/no before anything is inspected further.\nasync function confirmGuidedStart (clack: ClackLike, sourcePath: string): Promise<boolean> {\n const result = await clack.confirm({\n message: `${basename(sourcePath)} still uses the v3 single-file layout. Migrate it now?`,\n initialValue: true,\n });\n\n return !clack.isCancel(result) && result === true;\n}\n\nfunction noteConfigRename (clack: ClackLike, sourcePath: string, writePath: string): void {\n if (!clack.note || basename(sourcePath) === basename(writePath)) {\n return;\n }\n\n clack.note(\n `${basename(sourcePath)} -> ${basename(writePath)}\\n\\n`\n + 'ESLint loads a JavaScript config through Node, so importing the TypeScript lint module'\n + ' from one needs unflagged type stripping (Node >= 22.18) and fails on Node 20. A'\n + ' TypeScript config goes through jiti and loads on every supported version.',\n 'Renaming the flat config'\n );\n}\n\nasync function confirmWrite (\n clack: ClackLike,\n writePath: string,\n initial = true\n): Promise<boolean> {\n const message = `Write migrated config to ${writePath}?`;\n const result = await clack.confirm({ message, initialValue: initial });\n\n return !clack.isCancel(result) && result === true;\n}\n\nasync function confirmInstall (\n clack: ClackLike,\n depSummary: DepChangeSummary,\n initial = true\n): Promise<boolean> {\n const description = describeDepChanges(depSummary);\n const head = description ?? '';\n const message = head\n ? `${head}\\nInstall dependencies now?`\n : 'Install dependencies now?';\n const result = await clack.confirm({ message, initialValue: initial });\n\n return !clack.isCancel(result) && result === true;\n}\n\nexport interface NextStepsRenderInput {\n manager: PackageManager;\n removed: readonly string[];\n installSpecs: readonly string[];\n}\n\nexport function renderNextStepsMessage (input: NextStepsRenderInput): string | null {\n const hasRemove = input.removed.length > 0;\n const hasInstall = input.installSpecs.length > 0;\n\n if (!hasRemove && !hasInstall) {\n return null;\n }\n\n const blocks: string[] = ['Skipped dependency installation. Run these to apply manually:'];\n\n if (hasRemove) {\n blocks.push(formatNextStepsRemoveCommand(input.manager, input.removed));\n }\n\n if (hasInstall) {\n blocks.push(formatNextStepsAddCommand(input.manager, input.installSpecs));\n }\n\n return blocks.join('\\n\\n');\n}\n\nfunction emitInstallNextSteps (\n clack: ClackLike,\n depSummary: DepChangeSummary,\n cwd: string\n): void {\n if (!clack.note) {\n return;\n }\n\n const message = renderNextStepsMessage({\n manager: detectPackageManager(cwd),\n removed: depSummary.removed,\n installSpecs: depSummary.install.specs,\n });\n\n if (message === null) {\n return;\n }\n\n clack.note(message, 'Next steps');\n}\n\nfunction emitSummary (clack: ClackLike, model: PreparedSource, format: SourceFormat): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n model.kind === 'plan' ? summary(model.plan, format) : rehouseSummary(model.rehoused),\n 'Migration summary'\n );\n\n const warnings = warningsOf(model);\n\n if (warnings.length > 0) {\n clack.note(formatWarnings(warnings), 'Warnings');\n }\n}\n\ninterface WriteOutcome {\n deletedSourceCandidates: string[];\n}\n\nfunction writeAndAnnounce (\n clack: ClackLike,\n targetPath: string,\n writePath: string,\n rendered: string,\n format: SourceFormat\n): WriteOutcome {\n const result = format === 'eslintrc'\n ? writeMigrationLegacy(targetPath, writePath, rendered)\n : writeMigration(targetPath, rendered);\n\n clack.outro(`Wrote ${result.writtenPaths.join(', ')}`);\n\n return { deletedSourceCandidates: result.deletedSourceCandidates };\n}\n\n// Every flat config in the directory other than the migration source is about to be overwritten or\n// deleted. Renaming a `.js` config to `.ts` made this set bigger than \"the write path already\n// exists\", so it is computed from the layout rather than from the write path alone.\nfunction supersededFlatConfigs (sourcePath: string, writePath: string): string[] {\n const directory = dirname(writePath);\n const { replacedEslintConfigs } = resolveLintLayout(directory);\n const candidates = [\n ...replacedEslintConfigs.map(filename => join(directory, filename)),\n writePath,\n ];\n\n return [...new Set(candidates.filter(path => path !== sourcePath && existsSync(path)))];\n}\n\nasync function confirmOverwriteExistingOutput (\n clack: ClackLike,\n superseded: readonly string[],\n sourcePath: string,\n initial = false\n): Promise<boolean> {\n const names = superseded.map(path => basename(path));\n const subject = names.length === 1\n ? `An \\`${names[0]}\\` already exists`\n : `\\`${names.join('`, `')}\\` already exist`;\n const message = `${subject}. Overwrite + delete \\`${basename(sourcePath)}\\`?`;\n const result = await clack.confirm({ message, initialValue: initial });\n\n return !clack.isCancel(result) && result === true;\n}\n\ninterface ResolvedSource {\n targetPath: string;\n source: string;\n format: SourceFormat;\n}\n\ntype ResolveSourceResult = | { ok: true; resolved: ResolvedSource }\n | { ok: false; exitCode: number };\n\nfunction resolveSource (input: RunMigrateInput, clack: ClackLike): ResolveSourceResult {\n const targetPath = resolveTargetPath(input);\n\n if (!targetPath) {\n clack.cancel('No eslint.config.{mjs,js,cjs,ts,mts,cts} or .eslintrc.* found.');\n\n return { ok: false, exitCode: 1 };\n }\n\n const source = readFileSync(targetPath, 'utf8');\n const format = detectFormat(targetPath, source);\n\n if (format === 'eslintrc-unsupported') {\n const message = `Legacy ${basename(targetPath)} migration not supported in this release; `\n + 'convert manually first.';\n\n clack.cancel(message);\n\n return { ok: false, exitCode: 1 };\n }\n\n return { ok: true, resolved: { targetPath, source, format } };\n}\n\ninterface MigrationPreparation {\n model: PreparedSource;\n rendered: string;\n writePath: string;\n eslintIgnore: EslintIgnoreLookup | null;\n}\n\ntype PrepareResult = | { ok: false; reason: string | null }\n | { ok: true; prepared: MigrationPreparation };\n\nfunction renderModel (model: PreparedSource, eslintIgnore: EslintIgnoreLookup | null): string {\n if (model.kind === 'rehouse') {\n return model.rehoused.lintModule;\n }\n\n if (eslintIgnore && eslintIgnore.patterns.length > 0) {\n mergeIgnorePatterns(model.plan, eslintIgnore.patterns);\n }\n\n return renderV2(model.plan);\n}\n\nfunction prepareMigration (resolved: ResolvedSource, input: RunMigrateInput): PrepareResult {\n const outcome = sourceModelFrom(resolved);\n\n if (!outcome.ok) {\n return outcome;\n }\n\n const writePath = targetWritePath(input.cwd, resolved.targetPath);\n const eslintIgnore = findEslintIgnore(resolved.targetPath);\n\n return {\n ok: true,\n prepared: {\n model: outcome.model,\n rendered: renderModel(outcome.model, eslintIgnore),\n writePath,\n eslintIgnore,\n },\n };\n}\n\nasync function runConfirmations (\n clack: ClackLike,\n input: RunMigrateInput,\n targetPath: string,\n writePath: string,\n previous?: MigrateSessionAnswers\n): Promise<boolean> {\n const superseded = supersededFlatConfigs(targetPath, writePath);\n\n if (superseded.length > 0) {\n const overwrite = await confirmOverwriteExistingOutput(\n clack,\n superseded,\n targetPath,\n previous?.overwriteExisting ?? false\n );\n\n if (!overwrite) {\n clack.outro('Aborted: existing output kept.');\n\n return false;\n }\n }\n\n if (!input.yes) {\n const proceed = await confirmWrite(clack, writePath, previous?.proceed ?? true);\n\n if (!proceed) {\n clack.outro('Aborted: original config kept.');\n\n return false;\n }\n }\n\n return true;\n}\n\nfunction consumerPackageJsonPath (writePath: string): string {\n return join(dirname(writePath), 'package.json');\n}\n\nfunction tryReadConsumerManifest (path: string): PackageManifestLike | null {\n try {\n const raw = readFileSync(path, 'utf8');\n\n return JSON.parse(raw) as PackageManifestLike;\n } catch {\n return null;\n }\n}\n\nfunction computeDepSummary (\n model: PreparedSource,\n writePath: string,\n overrides: MigrateOverrides | undefined\n): DepChangeSummary | null {\n const pkgPath = consumerPackageJsonPath(writePath);\n const manifest = tryReadConsumerManifest(pkgPath);\n\n if (!manifest) {\n return { removed: [], install: { specs: [], fallbacks: [] }, packageJsonPath: null };\n }\n\n const pruneOutcome = pruneEslintDependencies(manifest);\n const readManifest = overrides?.readEslintConfigManifest ?? readOwnEslintConfigManifest;\n const ownManifest = readManifest();\n const install = buildInstallList(scopesOf(model), ownManifest);\n\n return { removed: pruneOutcome.removed, install, packageJsonPath: pkgPath };\n}\n\nfunction persistPrunedManifest (depSummary: DepChangeSummary): void {\n if (!depSummary.packageJsonPath) {\n return;\n }\n\n pruneConsumerPackageJson(dirname(depSummary.packageJsonPath));\n}\n\nfunction noteFallbacks (clack: ClackLike, depSummary: DepChangeSummary): void {\n if (depSummary.install.fallbacks.length === 0 || !clack.note) {\n return;\n }\n\n const list = depSummary.install.fallbacks.join(', ');\n\n clack.note(`Falling back to @latest for: ${list}`, 'Warning');\n}\n\nfunction resolveInstallCwd (depSummary: DepChangeSummary, input: RunMigrateInput): string {\n if (depSummary.packageJsonPath) {\n return dirname(depSummary.packageJsonPath);\n }\n\n return input.cwd;\n}\n\nasync function runInstaller (\n clack: ClackLike,\n depSummary: DepChangeSummary,\n input: RunMigrateInput\n): Promise<InstallOutcome> {\n return installWithRetry({\n deps: depSummary.install.specs,\n cwd: resolveInstallCwd(depSummary, input),\n autoConfirm: Boolean(input.yes),\n clack,\n fsOps: input.overrides?.wipeFs,\n installer: input.overrides?.installer,\n });\n}\n\nasync function applyDepChanges (\n clack: ClackLike,\n depSummary: DepChangeSummary,\n input: RunMigrateInput\n): Promise<boolean> {\n if (!depSummary.packageJsonPath) {\n if (clack.note) {\n clack.note('No package.json found alongside the migrated config — skipping dependency updates.', 'Notice');\n }\n\n return true;\n }\n\n persistPrunedManifest(depSummary);\n\n if (input.noInstall) {\n emitInstallNextSteps(clack, depSummary, input.cwd);\n\n return true;\n }\n\n if (!input.yes) {\n const proceed = await confirmInstall(clack, depSummary);\n\n if (!proceed) {\n emitInstallNextSteps(clack, depSummary, input.cwd);\n\n return true;\n }\n }\n\n noteFallbacks(clack, depSummary);\n\n const outcome = await runInstaller(clack, depSummary, input);\n\n if (!outcome.installed) {\n emitInstallNextSteps(clack, depSummary, input.cwd);\n\n return false;\n }\n\n return true;\n}\n\nfunction performWriteAndCleanup (\n clack: ClackLike,\n resolved: ResolvedSource,\n prepared: MigrationPreparation\n): void {\n const outcome = writeAndAnnounce(\n clack,\n resolved.targetPath,\n prepared.writePath,\n prepared.rendered,\n resolved.format\n );\n\n if (prepared.eslintIgnore && prepared.model.kind === 'plan') {\n safeUnlink(prepared.eslintIgnore.path, clack, '.eslintignore');\n }\n\n outcome.deletedSourceCandidates.forEach(path => {\n safeUnlink(path, clack, 'superseded config');\n });\n}\n\nfunction noteLintScriptOutcome (clack: ClackLike, result: LintScriptResult): void {\n if (!clack.note) {\n return;\n }\n\n if (result.unresolved) {\n clack.note(\n `Left \\`${result.unresolved.script}\\` untouched — it runs neither eslint nor oxlint:\\n\\n`\n + ` ${result.unresolved.previous}\\n\\n`\n + `Add \\`${OXLINT_LINT_SCRIPT}\\` yourself, next to whatever invokes ESLint.`,\n 'package.json script not changed'\n );\n\n return;\n }\n\n if (result.alreadyRunsOxlint.length > 0 && result.changes.length === 0) {\n clack.note(\n `\\`${result.alreadyRunsOxlint.join('`, `')}\\` already run oxlint — left alone.`,\n 'package.json scripts unchanged'\n );\n\n return;\n }\n\n if (result.skipped.length > 0) {\n clack.note(\n `${formatSkippedLintScripts(result.skipped)}\\n\\n`\n + 'oxlint was added to one entry point only, so it does not run twice over the same tree.',\n 'package.json scripts left alone'\n );\n }\n\n if (result.changes.length === 0) {\n return;\n }\n\n clack.note(\n `${formatLintScriptChanges(result.changes)}\\n\\n`\n + 'oxlint was prepended, never substituted, so every command that was there still runs.',\n 'Updated package.json scripts'\n );\n}\n\nfunction applyLintScript (clack: ClackLike, directory: string): void {\n const manifestPath = join(directory, 'package.json');\n\n if (!existsSync(manifestPath)) {\n return;\n }\n\n const result = setLintScript(readFileSync(manifestPath, 'utf8'));\n\n if (result.changed) {\n writeFileSync(manifestPath, result.manifest, 'utf8');\n }\n\n noteLintScriptOutcome(clack, result);\n}\n\n// Suppressed rules keep their `eslint-disable` comments working under oxlint, but ESLint now reads\n// them as unused directives. Re-pointing the moved rules onto `oxlint-disable` is what clears the\n// warning without dropping a suppression. It is also by far the largest diff a migration produces,\n// so the file count is shown and confirmed before anything is written.\nfunction noteUntouchedDirectiveFiles (clack: ClackLike, skipped: readonly string[]): void {\n if (skipped.length === 0 || !clack.note) {\n return;\n }\n\n clack.note(formatUntouchedDirectiveFiles(skipped), `${skipped.length} file(s) left untouched`);\n}\n\nasync function rewriteDirectivesWithNote (\n clack: ClackLike,\n directory: string,\n autoConfirm: boolean\n): Promise<void> {\n const { candidates, skipped } = previewDisableDirectives(directory);\n\n noteUntouchedDirectiveFiles(clack, skipped);\n\n if (candidates.length === 0) {\n return;\n }\n\n const count = candidates.length;\n\n if (clack.note) {\n clack.note(\n `${count} file(s) carry an \\`eslint-disable\\` naming a rule oxlint now owns. Left as they are,`\n + ' ESLint reports each one as an unused directive.\\n\\nThis is a separate, source-wide diff —'\n + ' review it on its own commit.',\n 'Disable directives'\n );\n }\n\n if (!autoConfirm) {\n const proceed = await clack.confirm({\n message: `Re-point \\`eslint-disable\\` onto \\`oxlint-disable\\` in ${count} file(s) now?`,\n initialValue: true,\n });\n\n if (clack.isCancel(proceed) || proceed !== true) {\n if (clack.note) {\n clack.note(\n 'Skipped. Re-run `npx @useinsider/eslint-config migrate` to apply it later.',\n 'Disable directives not rewritten'\n );\n }\n\n return;\n }\n }\n\n const { rewritten, skipped: unwritten } = rewriteDisableDirectives(directory, candidates);\n\n if (clack.note) {\n clack.note(`Re-pointed directives in ${rewritten.length} file(s).`, 'Disable directives');\n }\n\n noteUntouchedDirectiveFiles(clack, unwritten);\n}\n\nfunction loadPreviousMigrate (clack: ClackLike, cwd: string): MigrateSessionAnswers | undefined {\n const restored = loadSession({ cwd });\n const previousMigrate = restored?.command === 'migrate' ? restored.migrate : undefined;\n\n if (previousMigrate && clack.note) {\n clack.note(\n 'Restored your previous choices. Press Enter on each prompt to confirm, or arrow keys to change.',\n 'Resuming previous session'\n );\n }\n\n return previousMigrate;\n}\n\nfunction emitNothingToMigrate (clack: ClackLike, format: SourceFormat): void {\n clack.outro(format === 'eslintrc'\n ? 'No legacy `.eslintrc` shape found — nothing to migrate.'\n : 'No v1 or v3 useInsider patterns found — nothing to migrate.');\n}\n\n// A re-housed v3 config is copied verbatim, so an `.eslintignore` beside it cannot be folded into\n// `ignores` the way the re-rendering paths do. Flat config never read that file, so nothing changes\n// by leaving it — but saying so beats letting the consumer assume it was handled.\nfunction noteUnfoldedEslintIgnore (clack: ClackLike, prepared: MigrationPreparation): void {\n const patterns = prepared.eslintIgnore?.patterns ?? [];\n\n if (!clack.note || prepared.model.kind !== 'rehouse' || patterns.length === 0) {\n return;\n }\n\n clack.note(\n `${prepared.eslintIgnore?.path} still holds ${patterns.length} pattern(s). Flat config does not read it,`\n + ' and the v3 config was carried over verbatim, so they were not folded into `ignores`. Move the ones'\n + ' you still need into the `ignores` array and delete the file.',\n '.eslintignore left alone'\n );\n}\n\nfunction persistMigrateSession (\n input: RunMigrateInput,\n prepared: MigrationPreparation,\n resolved: ResolvedSource\n): void {\n const overwriteExisting = supersededFlatConfigs(resolved.targetPath, prepared.writePath).length > 0;\n\n saveSession({\n command: 'migrate',\n migrate: {\n target: input.target,\n yes: input.yes,\n noInstall: input.noInstall,\n overwriteExisting,\n proceed: true,\n },\n }, { cwd: input.cwd });\n}\n\n// The config was rewritten before the install, so a failed install cannot be undone here — but the\n// consumer cannot lint until the dependencies land, so the run must not report success. The session\n// is kept so a re-run picks the same answers back up.\nasync function finishMigrate (\n clack: ClackLike,\n depSummary: DepChangeSummary | null,\n input: RunMigrateInput\n): Promise<number> {\n if (depSummary && !await applyDepChanges(clack, depSummary, input)) {\n clack.cancel('Config migrated, but the dependencies did not install. Install them and re-run lint.');\n\n return 1;\n }\n\n clearSession({ cwd: input.cwd });\n\n return 0;\n}\n\nexport async function runMigrate (input: RunMigrateInput, clackOverride?: ClackLike): Promise<number> {\n const clack = clackOverride ?? await loadClack();\n const sourceResult = resolveSource(input, clack);\n\n if (!sourceResult.ok) {\n return sourceResult.exitCode;\n }\n\n const { resolved } = sourceResult;\n\n clack.intro(`Migrating ${resolved.targetPath}`);\n\n const declinedExitCode = input.fromLint ? 1 : 0;\n\n if (input.fromLint && !input.yes && !await confirmGuidedStart(clack, resolved.targetPath)) {\n clack.outro('Left the config as it is — nothing was written.');\n\n return declinedExitCode;\n }\n\n const previousMigrate = loadPreviousMigrate(clack, input.cwd);\n const outcome = prepareMigration(resolved, input);\n\n if (!outcome.ok) {\n if (outcome.reason === null) {\n emitNothingToMigrate(clack, resolved.format);\n\n return declinedExitCode;\n }\n\n clack.cancel(outcome.reason);\n\n return 1;\n }\n\n const { prepared } = outcome;\n\n emitSummary(clack, prepared.model, resolved.format);\n noteUnfoldedEslintIgnore(clack, prepared);\n noteConfigRename(clack, resolved.targetPath, prepared.writePath);\n\n const depSummary = computeDepSummary(prepared.model, prepared.writePath, input.overrides);\n const proceed = await runConfirmations(\n clack,\n input,\n resolved.targetPath,\n prepared.writePath,\n previousMigrate\n );\n\n if (!proceed) {\n return declinedExitCode;\n }\n\n persistMigrateSession(input, prepared, resolved);\n performWriteAndCleanup(clack, resolved, prepared);\n applyLintScript(clack, dirname(prepared.writePath));\n await rewriteDirectivesWithNote(clack, dirname(prepared.writePath), Boolean(input.yes));\n\n const consumerDir = dirname(prepared.writePath);\n const consumerLayout = resolveLintLayout(consumerDir);\n\n await applyTsExtensionsFlag(clack, {\n cwd: consumerDir,\n lintModule: consumerLayout.lintModule,\n eslintConfig: consumerLayout.eslintConfig,\n autoConfirm: input.yes,\n });\n\n return finishMigrate(clack, depSummary, input);\n}\n","import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n detectExistingEslintConfig,\n type ExistingConfigDetection,\n resolveTsconfigReferences,\n} from './detect';\nimport {\n detectVueApiPattern,\n type VueHybridPatternDetection,\n} from './detectVueApiPattern';\nimport { dispatch, type MigrateInput, type ScaffoldInput } from './dispatch';\nimport { buildDependencyList, installDependencies } from './install';\nimport { installWithRetry } from './installWithRetry';\nimport {\n formatLintScriptChanges,\n formatSkippedLintScripts,\n type LintScriptResult,\n OXLINT_LINT_SCRIPT,\n renderLintLayoutFiles,\n resolveLintLayout,\n setLintScript,\n} from './lintLayout';\nimport { runMigrate } from './migrate';\nimport { pruneConsumerPackageJson } from './prunePackageJson';\nimport {\n askExistingConfigDecision,\n askHybridProceedWithSuffix,\n askHybridSuffix,\n askVueHybridDefaultApi,\n type ClackLike,\n CliCancelledError,\n type ExistingConfigDecision,\n loadClack,\n runQuestions,\n type RunQuestionsContext,\n type TsconfigPromptInput,\n} from './questions';\nimport {\n clearSession,\n loadSession,\n saveSession,\n type ScaffoldExistingConfigChoice,\n} from './sessionStore';\nimport {\n type CliAnswers,\n renderLintModuleFile,\n type VueHybridDefaultApi,\n} from './template';\nimport { applyTsExtensionsFlag } from './tsconfigFlag';\n\nfunction resolveTsconfigInput (cwd: string): { input: TsconfigPromptInput | null; missing: boolean } {\n const referencesResult = resolveTsconfigReferences(cwd);\n\n if (referencesResult) {\n return {\n input: { referencesOnly: true, rootPath: referencesResult.rootPath, refs: referencesResult.refs },\n missing: false,\n };\n }\n\n const rootPath = join(cwd, 'tsconfig.json');\n\n if (existsSync(rootPath)) {\n return {\n input: { referencesOnly: false, rootPath, refs: [] },\n missing: false,\n };\n }\n\n return { input: null, missing: true };\n}\n\nexport interface RunScaffoldOverrides {\n installer?: (deps: readonly string[]) => Promise<void>;\n wipeFs?: Parameters<typeof installWithRetry>[0]['fsOps'];\n}\n\nexport interface RunScaffoldInput {\n cwd: string;\n yes?: boolean;\n overrides?: RunScaffoldOverrides;\n}\n\nfunction decisionToChoice (decision: ExistingConfigDecision): ScaffoldExistingConfigChoice {\n return decision;\n}\n\nfunction isPackageJsonSource (existing: ExistingConfigDetection): boolean {\n return existing.path.endsWith('package.json');\n}\n\ntype HandleExistingConfigOutcome = | { continueScaffold: true; viaOverride: boolean }\n | { continueScaffold: false; exitCode: number };\n\nasync function handleExistingConfig (\n clack: ClackLike,\n input: RunScaffoldInput,\n existing: ExistingConfigDetection,\n initial: ExistingConfigDecision\n): Promise<HandleExistingConfigOutcome> {\n const decision = await askExistingConfigDecision(clack, existing.path, initial);\n\n saveSession(\n { command: 'scaffold', scaffold: { existingConfigChoice: decisionToChoice(decision) } },\n { cwd: input.cwd }\n );\n\n if (decision === 'exit') {\n clearSession({ cwd: input.cwd });\n clack.outro('Exited: existing config kept.');\n\n return { continueScaffold: false, exitCode: 0 };\n }\n\n if (decision === 'migrate') {\n clearSession({ cwd: input.cwd });\n\n if (isPackageJsonSource(existing)) {\n clack.cancel('Migration from package.json `eslintConfig` is not supported; extract it to '\n + '.eslintrc.cjs first, or pick Override.');\n\n return { continueScaffold: false, exitCode: 1 };\n }\n\n const exitCode = await runMigrate({\n cwd: input.cwd,\n target: existing.path,\n yes: input.yes,\n }, clack);\n\n return { continueScaffold: false, exitCode };\n }\n\n return { continueScaffold: true, viaOverride: true };\n}\n\nfunction isScaffoldChoice (value: unknown): value is ScaffoldExistingConfigChoice {\n return value === 'override' || value === 'migrate' || value === 'exit';\n}\n\nfunction decisionInitial (\n persistedChoice: ScaffoldExistingConfigChoice | undefined\n): ExistingConfigDecision {\n if (persistedChoice && isScaffoldChoice(persistedChoice)) {\n return persistedChoice;\n }\n\n return 'migrate';\n}\n\nfunction buildQuestionsContext (\n input: RunScaffoldInput,\n restoredAnswers: CliAnswers | undefined\n): RunQuestionsContext {\n const { input: tsconfigInput, missing } = resolveTsconfigInput(input.cwd);\n\n return {\n tsconfigInput,\n tsconfigMissing: missing,\n previousAnswers: restoredAnswers,\n };\n}\n\nfunction noteOverridePrune (clack: ClackLike, removed: string[]): void {\n if (removed.length === 0 || !clack.note) {\n return;\n }\n\n const list = removed.join(', ');\n\n clack.note(\n `Removed stale ESLint-related entries from package.json: ${list}`,\n 'Override cleanup'\n );\n}\n\nfunction describeHybridPattern (detection: VueHybridPatternDetection): string {\n if (detection.kind === 'suffix') {\n return `Detected suffix convention: Options API files match \\`${detection.optionsPattern}\\`.`;\n }\n\n if (detection.kind === 'directory') {\n return `Detected directory convention: \\`${detection.optionsDir}/\\` vs \\`${detection.compositionDir}/\\`.`;\n }\n\n return '';\n}\n\nfunction noteHybridFound (clack: ClackLike, detection: VueHybridPatternDetection): void {\n if (!clack.note) {\n return;\n }\n\n if (detection.kind !== 'suffix' && detection.kind !== 'directory') {\n return;\n }\n\n clack.note(describeHybridPattern(detection), 'Hybrid Vue pattern detected');\n}\n\nfunction noteHybridMissing (clack: ClackLike): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n 'Hybrid Vue selected, but your `.vue` files do not follow a distinguishing naming pattern '\n + '(e.g. `*.options.vue` vs `*.vue`). The generated config will treat every `.vue` file '\n + 'with one preset (composition by default). To get proper per-file linting, rename your '\n + 'Options-API components to `*.options.vue` (or similar) and re-run this CLI.',\n 'No hybrid pattern detected'\n );\n}\n\nfunction noteHybridSuffixScaffold (clack: ClackLike, suffix: string): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n `Rename your Options-API files to end with \\`${suffix}\\` and they will be picked up by the `\n + 'Options preset automatically. Composition components keep the plain `.vue` extension.',\n 'Suffix convention scaffolded'\n );\n}\n\ninterface HybridPlanResult {\n suffix: string | undefined;\n defaultApi: VueHybridDefaultApi | undefined;\n fallbackToComposition: boolean;\n}\n\nasync function resolveVueHybridPlan (\n clack: ClackLike,\n cwd: string,\n yes: boolean,\n previous: CliAnswers['vueHybridSuffix']\n): Promise<HybridPlanResult> {\n const detection = detectVueApiPattern({ cwd });\n\n if (detection.kind === 'suffix') {\n noteHybridFound(clack, detection);\n\n const detectedDefault: VueHybridDefaultApi = detection.targetApi === 'options' ? 'composition' : 'options';\n\n return { suffix: detection.suffix, defaultApi: detectedDefault, fallbackToComposition: false };\n }\n\n if (detection.kind === 'directory') {\n noteHybridFound(clack, detection);\n\n return { suffix: undefined, defaultApi: undefined, fallbackToComposition: false };\n }\n\n noteHybridMissing(clack);\n\n if (yes) {\n return { suffix: undefined, defaultApi: undefined, fallbackToComposition: true };\n }\n\n const wantsSuffix = await askHybridProceedWithSuffix(clack);\n\n if (!wantsSuffix) {\n return { suffix: undefined, defaultApi: undefined, fallbackToComposition: true };\n }\n\n const defaultApi = await askVueHybridDefaultApi(clack, previous?.defaultApi);\n const suffix = await askHybridSuffix(clack, defaultApi, previous?.suffix);\n\n noteHybridSuffixScaffold(clack, suffix);\n\n return { suffix, defaultApi, fallbackToComposition: false };\n}\n\nasync function resolveHybridAnswers (\n clack: ClackLike,\n input: RunScaffoldInput,\n answers: CliAnswers\n): Promise<CliAnswers> {\n if (answers.framework !== 'vue' || answers.vueApiStyle !== 'hybrid') {\n return answers;\n }\n\n const plan = await resolveVueHybridPlan(\n clack,\n input.cwd,\n Boolean(input.yes),\n answers.vueHybridSuffix\n );\n\n if (plan.fallbackToComposition) {\n return { ...answers, vueApiStyle: 'composition', vueHybridSuffix: undefined };\n }\n\n if (plan.suffix && plan.defaultApi) {\n return {\n ...answers,\n vueHybridSuffix: { defaultApi: plan.defaultApi, suffix: plan.suffix },\n };\n }\n\n return answers;\n}\n\nfunction applyLintScript (cwd: string): LintScriptResult | null {\n const manifestPath = join(cwd, 'package.json');\n\n if (!existsSync(manifestPath)) {\n return null;\n }\n\n const result = setLintScript(readFileSync(manifestPath, 'utf8'));\n\n if (result.changed) {\n writeFileSync(manifestPath, result.manifest, 'utf8');\n }\n\n return result;\n}\n\nfunction noteLintScriptOutcome (clack: ClackLike, result: LintScriptResult | null): void {\n if (!clack.note || !result) {\n return;\n }\n\n if (result.unresolved) {\n clack.note(\n `Left \\`${result.unresolved.script}\\` untouched — it runs neither eslint nor oxlint:\\n\\n`\n + ` ${result.unresolved.previous}\\n\\n`\n + `Add \\`${OXLINT_LINT_SCRIPT}\\` yourself, next to whatever invokes ESLint.`,\n 'package.json script not changed'\n );\n\n return;\n }\n\n if (result.skipped.length > 0) {\n clack.note(\n `${formatSkippedLintScripts(result.skipped)}\\n\\n`\n + 'oxlint was added to one entry point only, so it does not run twice over the same tree.',\n 'package.json scripts left alone'\n );\n }\n\n if (result.changes.length > 0) {\n clack.note(formatLintScriptChanges(result.changes), 'Updated package.json scripts');\n }\n}\n\nexport interface LintLayoutWriteResult {\n lintModulePath: string;\n lintScript: LintScriptResult | null;\n}\n\nexport function writeLintLayout (cwd: string, lintModuleSource: string): LintLayoutWriteResult {\n const layout = resolveLintLayout(cwd);\n const lintModulePath = join(cwd, layout.lintModule);\n\n writeFileSync(lintModulePath, lintModuleSource, 'utf8');\n\n renderLintLayoutFiles(layout).forEach(file => {\n writeFileSync(join(cwd, file.filename), file.source, 'utf8');\n });\n\n // Two flat configs in one directory is not a warning: ESLint prefers the JavaScript one, so\n // leaving it behind would hand the consumer the config the scaffold just superseded.\n layout.replacedEslintConfigs.forEach(filename => {\n rmSync(join(cwd, filename), { force: true });\n });\n\n return { lintModulePath, lintScript: applyLintScript(cwd) };\n}\n\nasync function installAndWrite (\n clack: ClackLike,\n input: RunScaffoldInput,\n answers: CliAnswers,\n options: { pruneBeforeInstall: boolean }\n): Promise<LintLayoutWriteResult | null> {\n if (options.pruneBeforeInstall) {\n const pruneResult = pruneConsumerPackageJson(input.cwd);\n\n noteOverridePrune(clack, pruneResult.removed);\n }\n\n const deps = buildDependencyList(answers);\n\n if (clack.note) {\n clack.note(deps.map(dep => ` - ${dep}`).join('\\n'), 'Installing dev dependencies');\n }\n\n const outcome = await installWithRetry({\n deps,\n cwd: input.cwd,\n autoConfirm: Boolean(input.yes),\n clack,\n installer: input.overrides?.installer ?? installDependencies,\n fsOps: input.overrides?.wipeFs,\n });\n\n if (!outcome.installed) {\n return null;\n }\n\n return writeLintLayout(input.cwd, renderLintModuleFile(answers));\n}\n\nexport async function runScaffold (\n input: RunScaffoldInput,\n clackOverride?: ClackLike\n): Promise<number> {\n const clack = clackOverride ?? await loadClack();\n const existing = detectExistingEslintConfig(input.cwd);\n const restored = loadSession({ cwd: input.cwd });\n const restoredScaffold = restored?.command === 'scaffold' ? restored.scaffold : undefined;\n let viaOverride = false;\n\n if (existing) {\n const outcome = await handleExistingConfig(\n clack,\n input,\n existing,\n decisionInitial(restoredScaffold?.existingConfigChoice)\n );\n\n if (!outcome.continueScaffold) {\n return outcome.exitCode;\n }\n\n ({ viaOverride } = outcome);\n }\n\n const context = buildQuestionsContext(input, restoredScaffold?.answers);\n const answers = await runQuestions(context, clack);\n const resolvedAnswers = await resolveHybridAnswers(clack, input, answers);\n\n saveSession(\n { command: 'scaffold', scaffold: { answers: resolvedAnswers, existingConfigChoice: 'override' } },\n { cwd: input.cwd }\n );\n\n const written = await installAndWrite(\n clack,\n input,\n resolvedAnswers,\n { pruneBeforeInstall: viaOverride }\n );\n\n // The layout is deliberately not written over a failed install: the generated config imports\n // `@useinsider/eslint-config`, so writing it would leave a repo that cannot lint at all. The\n // session is kept so a re-run resumes from the answers already given.\n if (!written) {\n clack.cancel('Dependencies were not installed — nothing was written. Fix the install and re-run.');\n\n return 1;\n }\n\n noteLintScriptOutcome(clack, written.lintScript);\n\n const layout = resolveLintLayout(input.cwd);\n\n await applyTsExtensionsFlag(clack, {\n cwd: input.cwd,\n lintModule: layout.lintModule,\n eslintConfig: layout.eslintConfig,\n autoConfirm: input.yes,\n });\n\n clearSession({ cwd: input.cwd });\n clack.outro(`Wrote ${written.lintModulePath} and its sibling linter configs`);\n\n return 0;\n}\n\nasync function runScaffoldSubcommand (scaffoldInput: ScaffoldInput): Promise<number> {\n return runScaffold(scaffoldInput);\n}\n\nasync function runMigrateSubcommand (input: MigrateInput): Promise<number> {\n return runMigrate({\n cwd: input.cwd,\n target: input.target,\n yes: input.yes,\n noInstall: input.noInstall,\n fromLint: input.fromLint,\n });\n}\n\nfunction writeStderr (line: string): void {\n // oxlint-disable-next-line no-console -- CLI usage surface goes to stderr\n console.error(line);\n}\n\nasync function main (): Promise<number> {\n const argv = process.argv.slice(2);\n const cwd = process.cwd();\n\n return dispatch(argv, cwd, {\n scaffold: runScaffoldSubcommand,\n migrate: runMigrateSubcommand,\n stderr: writeStderr,\n });\n}\n\nfunction exitCleanly (code: number): void {\n // eslint-disable-next-line no-process-exit -- CLI entry point must propagate its exit code\n process.exit(code);\n}\n\nfunction isUnderTest (): boolean {\n return Boolean(process.env.VITEST) || process.env.NODE_ENV === 'test';\n}\n\nif (!isUnderTest()) {\n main()\n .then(exitCleanly)\n .catch((error: unknown) => {\n if (!(error instanceof CliCancelledError)) {\n const message = error instanceof Error ? error.message : String(error);\n\n // oxlint-disable-next-line no-console -- CLI error surface\n console.error(`[useinsider/eslint-config] ${message}`);\n }\n\n exitCleanly(1);\n });\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { afterEach, describe, expect, test, vi } = import.meta.vitest;\n const { mkdtempSync } = await import('node:fs');\n const { tmpdir } = await import('node:os');\n\n const MIGRATED_LINT_MODULE = 'import { useInsiderESLintFactory } from \\'@useinsider/eslint-config\\';\\n\\n'\n + 'export const { useInsiderESLint, useInsiderOXC } = useInsiderESLintFactory({});\\n';\n const MIGRATED_ESLINT_CONFIG = 'import { useInsiderESLint } from \\'./insider.lint.mts\\';\\n\\n'\n + 'export default useInsiderESLint();\\n';\n\n function makeMigratedDir (): string {\n const directory = mkdtempSync(join(tmpdir(), 'insider-cli-main-'));\n\n writeFileSync(join(directory, 'insider.lint.mts'), MIGRATED_LINT_MODULE, 'utf8');\n writeFileSync(join(directory, 'eslint.config.mts'), MIGRATED_ESLINT_CONFIG, 'utf8');\n writeFileSync(join(directory, 'package.json'), '{\\n \"name\": \"consumer\"\\n}\\n', 'utf8');\n\n return directory;\n }\n\n async function runMain (directory: string, argv: readonly string[]): Promise<number> {\n const originalArgv = process.argv;\n\n vi.spyOn(process, 'cwd').mockReturnValue(directory);\n vi.spyOn(process.stdout, 'write').mockReturnValue(true);\n process.argv = ['node', 'cli.cjs', ...argv];\n\n try {\n return await main();\n } finally {\n process.argv = originalArgv;\n }\n }\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe('main', () => {\n test.each([\n { argv: ['migrate', '--from-lint', '--yes', '--no-install'], code: 1 },\n { argv: ['migrate', '--yes', '--no-install'], code: 0 },\n ])('exits $code for $argv over an already-migrated directory', async ({ argv, code }) => {\n const directory = makeMigratedDir();\n\n try {\n expect(await runMain(directory, argv)).toBe(code);\n } finally {\n rmSync(directory, { recursive: true, force: true });\n }\n });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":[],"sources":["../src/cli/detect.ts","../src/cli/detectVueApiPattern.ts","../src/cli/dispatch.ts","../src/configs/dependencies.ts","../src/configs/jest/dependencies.ts","../src/configs/typescript/dependencies.ts","../src/configs/vitest/dependencies.ts","../src/configs/vue2/dependencies.ts","../src/configs/vue2-typescript/dependencies.ts","../src/configs/vue3/dependencies.ts","../src/configs/vue3-typescript/dependencies.ts","../src/cli/resolveEslintConfigManifest.ts","../src/cli/install.ts","../src/cli/installWithRetry.ts","../src/cli/detectIndent.ts","../src/cli/lintLayout.ts","../src/cli/quote.ts","../src/cli/template.ts","../src/cli/questions.ts","../src/cli/sessionStore.ts","../src/configs/javascript/dependencies.ts","../src/configs/javascript-dom/dependencies.ts","../src/configs/javascript-node/dependencies.ts","../src/configs/jsdoc-based-ts/dependencies.ts","../src/configs/strict/dependencies.ts","../src/configs/typescript-dom/dependencies.ts","../src/configs/typescript-node/dependencies.ts","../src/cli/migrate/dependencies.ts","../src/cli/prunePackageJson.ts","../src/cli/tsconfigFlag.ts","../src/cli/migrate/disableDirectives.ts","../src/cli/migrate/stringEntry.ts","../src/cli/migrate/eslintrc/parse.ts","../src/cli/migrate/globalsFolding.ts","../src/cli/migrate/eslintrc/transform.ts","../src/cli/migrate/parse.ts","../src/cli/migrate/rehouseV3.ts","../src/cli/migrate/pruneUnusedImports.ts","../src/cli/migrate/render.ts","../src/cli/migrate/transform.ts","../src/cli/migrate/warnings.ts","../src/cli/migrate/writer.ts","../src/cli/migrate/index.ts","../src/cli/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport const FLAT_CONFIG_FILENAMES: readonly string[] = [\n 'eslint.config.mjs',\n 'eslint.config.js',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts',\n];\n\nexport const LEGACY_CONFIG_FILENAMES: readonly string[] = [\n '.eslintrc.cjs',\n '.eslintrc.js',\n '.eslintrc.mjs',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n '.eslintrc',\n];\n\nexport function findConfigFile (cwd: string, filenames: readonly string[]): string | null {\n return filenames\n .map(name => join(cwd, name))\n .find(candidate => existsSync(candidate)) ?? null;\n}\n\nexport type ExistingConfigKind = 'flat' | 'legacy';\n\nexport interface ExistingConfigDetection {\n path: string;\n kind: ExistingConfigKind;\n}\n\nexport interface TsconfigReference {\n path: string;\n}\n\nexport interface TsconfigContents {\n compilerOptions?: Record<string, unknown>;\n files?: string[];\n include?: string[];\n exclude?: string[];\n references?: TsconfigReference[];\n [key: string]: unknown;\n}\n\nexport function findExistingConfig (cwd: string): string | null {\n return findConfigFile(cwd, FLAT_CONFIG_FILENAMES);\n}\n\nexport function detectExistingEslintConfig (cwd: string): ExistingConfigDetection | null {\n const flatHit = findConfigFile(cwd, FLAT_CONFIG_FILENAMES);\n\n if (flatHit) {\n return { path: flatHit, kind: 'flat' };\n }\n\n const legacyHit = findConfigFile(cwd, LEGACY_CONFIG_FILENAMES);\n\n if (legacyHit) {\n return { path: legacyHit, kind: 'legacy' };\n }\n\n const pkgPath = join(cwd, 'package.json');\n\n if (!existsSync(pkgPath)) {\n return null;\n }\n\n try {\n const raw = readFileSync(pkgPath, 'utf8');\n const parsed = JSON.parse(raw) as { eslintConfig?: unknown };\n\n if (parsed.eslintConfig && typeof parsed.eslintConfig === 'object') {\n return { path: pkgPath, kind: 'legacy' };\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nconst stringTokenPattern = /\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'/gu;\nconst lineCommentPattern = /\\/\\/[^\\n]*/gu;\nconst blockCommentPattern = /\\/\\*[\\s\\S]*?\\*\\//gu;\nconst placeholderPattern = /__JSONC_TOKEN_(\\d+)__/gu;\n\nfunction stripJsonComments (source: string): string {\n const tokens: string[] = [];\n const protectedSource = source.replace(stringTokenPattern, match => {\n const index = tokens.length;\n\n tokens.push(match);\n\n return `__JSONC_TOKEN_${index}__`;\n });\n const withoutBlocks = protectedSource.replace(blockCommentPattern, '');\n const withoutLines = withoutBlocks.replace(lineCommentPattern, '');\n\n return withoutLines.replace(placeholderPattern, (_match, indexValue: string) => tokens[Number(indexValue)]);\n}\n\nfunction stripTrailingCommas (source: string): string {\n return source.replace(/,(\\s*[}\\]])/g, '$1');\n}\n\nexport function readTsconfig (absPath: string): TsconfigContents {\n const raw = readFileSync(absPath, 'utf8');\n const stripped = stripTrailingCommas(stripJsonComments(raw));\n\n return JSON.parse(stripped) as TsconfigContents;\n}\n\nexport interface ResolvedReferences {\n rootPath: string;\n refs: string[];\n}\n\nexport function resolveTsconfigReferences (cwd: string): ResolvedReferences | null {\n const rootPath = join(cwd, 'tsconfig.json');\n\n if (!existsSync(rootPath)) {\n return null;\n }\n\n const parsed = readTsconfig(rootPath);\n const refs = parsed.references;\n\n if (!refs || refs.length === 0) {\n return null;\n }\n\n const hasFiles = Array.isArray(parsed.files) && parsed.files.length > 0;\n const hasInclude = Array.isArray(parsed.include) && parsed.include.length > 0;\n\n if (hasFiles || hasInclude) {\n return null;\n }\n\n return {\n rootPath,\n refs: refs.map(ref => ref.path),\n };\n}\n","import { type Dirent, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, relative, sep } from 'node:path';\n\nconst SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n '.svn',\n '.hg',\n 'dist',\n 'build',\n 'out',\n 'coverage',\n '.next',\n '.nuxt',\n '.output',\n '.cache',\n '.turbo',\n '.parcel-cache',\n '.vite',\n]);\n\nconst MAX_FILES = 5_000;\nconst MATCH_THRESHOLD = 0.95;\nconst MIN_SAMPLES_PER_BUCKET = 2;\nconst SUFFIX_CANDIDATES = ['.options', '.classic', '.legacy', '.opts', '.setup', '.composition', '.modern'] as const;\nconst DIRECTORY_CANDIDATES = [\n { options: 'options', composition: 'composition' },\n { options: 'Options', composition: 'Composition' },\n { options: 'options-api', composition: 'composition-api' },\n { options: 'classic', composition: 'modern' },\n { options: 'legacy', composition: 'next' },\n] as const;\n\nexport type VueComponentApi = 'options' | 'composition' | 'mixed';\n\nexport interface VueFileClassification {\n relativePath: string;\n api: VueComponentApi;\n}\n\nexport interface VueHybridPatternSamples {\n composition: string[];\n options: string[];\n}\n\nexport type VueHybridSuffixTargetApi = 'composition' | 'options';\n\nexport type VueHybridPatternDetection = | {\n kind: 'none';\n compositionFiles: string[];\n optionsFiles: string[];\n}\n | {\n kind: 'suffix';\n compositionPattern: string;\n optionsPattern: string;\n suffix: string;\n targetApi: VueHybridSuffixTargetApi;\n samples: VueHybridPatternSamples;\n }\n | {\n kind: 'directory';\n compositionPattern: string;\n optionsPattern: string;\n compositionDir: string;\n optionsDir: string;\n samples: VueHybridPatternSamples;\n }\n | {\n kind: 'ambiguous';\n reason: string;\n compositionFiles: string[];\n optionsFiles: string[];\n };\n\ninterface ScanOptions {\n cwd: string;\n maxFiles?: number;\n skipDirs?: Set<string>;\n}\n\ninterface ScanResult {\n files: string[];\n truncated: boolean;\n}\n\nfunction safeReaddir (path: string): Dirent[] {\n try {\n return readdirSync(path, { withFileTypes: true, encoding: 'utf8' });\n } catch {\n return [];\n }\n}\n\nfunction walkDir (\n dir: string,\n skipDirs: Set<string>,\n limit: number,\n accumulator: { files: string[]; truncated: boolean }\n): void {\n if (accumulator.truncated || accumulator.files.length >= limit) {\n return;\n }\n\n const entries = safeReaddir(dir);\n\n entries.forEach(entry => {\n if (accumulator.files.length >= limit) {\n accumulator.truncated = true;\n\n return;\n }\n\n const full = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) {\n walkDir(full, skipDirs, limit, accumulator);\n }\n\n return;\n }\n\n if (entry.isFile() && entry.name.endsWith('.vue')) {\n accumulator.files.push(full);\n }\n });\n}\n\nfunction scanVueFiles (options: ScanOptions): ScanResult {\n const limit = options.maxFiles ?? MAX_FILES;\n const skipDirs = options.skipDirs ?? SKIP_DIRS;\n const accumulator = { files: [] as string[], truncated: false };\n\n walkDir(options.cwd, skipDirs, limit, accumulator);\n\n return { files: accumulator.files, truncated: accumulator.truncated };\n}\n\nfunction classifyVueContent (content: string): VueComponentApi {\n const hasSetupScript = /<script[^>]*\\bsetup\\b/i.test(content);\n const hasPlainScript = /<script(?:(?!\\bsetup\\b)[^>])*>/i.test(content);\n\n if (hasSetupScript && hasPlainScript) {\n return 'mixed';\n }\n\n if (hasSetupScript) {\n return 'composition';\n }\n\n return 'options';\n}\n\nexport function classifyVueFiles (absolutePaths: readonly string[], cwd: string): VueFileClassification[] {\n return absolutePaths.reduce<VueFileClassification[]>((classifications, absolutePath) => {\n let content: string;\n\n try {\n const stat = statSync(absolutePath);\n\n if (stat.size > 2_000_000) {\n return classifications;\n }\n\n content = readFileSync(absolutePath, 'utf8');\n } catch {\n return classifications;\n }\n\n const api = classifyVueContent(content);\n const relativePath = relative(cwd, absolutePath);\n\n classifications.push({\n relativePath: relativePath.split(sep).join('/'),\n api: api === 'mixed' ? 'composition' : api,\n });\n\n return classifications;\n }, []);\n}\n\nfunction basenameOf (relativePath: string): string {\n const lastSlash = relativePath.lastIndexOf('/');\n\n return lastSlash === -1 ? relativePath : relativePath.slice(lastSlash + 1);\n}\n\nfunction ratio (matched: number, total: number): number {\n return total === 0 ? 0 : matched / total;\n}\n\nfunction suffixIsViable (\n targetMatches: readonly string[],\n otherMatches: readonly string[],\n targetTotal: number,\n otherTotal: number\n): boolean {\n const targetRatio = ratio(targetMatches.length, targetTotal);\n const otherRatio = ratio(otherMatches.length, otherTotal);\n\n if (targetRatio < MATCH_THRESHOLD || otherRatio < MATCH_THRESHOLD) {\n return false;\n }\n\n return targetMatches.length >= MIN_SAMPLES_PER_BUCKET && otherMatches.length >= MIN_SAMPLES_PER_BUCKET;\n}\n\nfunction suffixMatchesTargetingApi (\n suffix: string,\n targetApi: VueHybridSuffixTargetApi,\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n const fullSuffix = `${suffix}.vue`;\n const targetIsOptions = targetApi === 'options';\n const targetFiles = targetIsOptions ? optionsFiles : compositionFiles;\n const otherFiles = targetIsOptions ? compositionFiles : optionsFiles;\n const targetMatches = targetFiles.filter(path => basenameOf(path).endsWith(fullSuffix));\n const otherMatches = otherFiles.filter(path => !basenameOf(path).endsWith(fullSuffix));\n\n if (!suffixIsViable(targetMatches, otherMatches, targetFiles.length, otherFiles.length)) {\n return null;\n }\n\n const optionsMatches = targetIsOptions ? targetMatches : otherMatches;\n const compositionMatches = targetIsOptions ? otherMatches : targetMatches;\n const optionsPattern = targetIsOptions ? `**/*${fullSuffix}` : '**/*.vue';\n const compositionPattern = targetIsOptions ? '**/*.vue' : `**/*${fullSuffix}`;\n\n return {\n kind: 'suffix',\n compositionPattern,\n optionsPattern,\n suffix: fullSuffix,\n targetApi,\n samples: {\n composition: compositionMatches.slice(0, 5),\n options: optionsMatches.slice(0, 5),\n },\n };\n}\n\nfunction suffixMatches (\n suffix: string,\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n return suffixMatchesTargetingApi(suffix, 'options', optionsFiles, compositionFiles)\n ?? suffixMatchesTargetingApi(suffix, 'composition', optionsFiles, compositionFiles);\n}\n\nfunction detectSuffix (\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n return SUFFIX_CANDIDATES.reduce<VueHybridPatternDetection | null>((found, suffix) => {\n if (found) {\n return found;\n }\n\n return suffixMatches(suffix, optionsFiles, compositionFiles);\n }, null);\n}\n\nfunction directoryMatches (\n options: string,\n composition: string,\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n const optionsToken = `/${options}/`;\n const optionsPrefix = `${options}/`;\n const inOptionsDir = (path: string): boolean => path.includes(optionsToken) || path.startsWith(optionsPrefix);\n const optionsMatches = optionsFiles.filter(inOptionsDir);\n const compositionMatches = compositionFiles.filter(path => !inOptionsDir(path));\n const optionsRatio = ratio(optionsMatches.length, optionsFiles.length);\n const compositionRatio = ratio(compositionMatches.length, compositionFiles.length);\n\n if (optionsRatio < MATCH_THRESHOLD || compositionRatio < MATCH_THRESHOLD) {\n return null;\n }\n\n if (optionsMatches.length < MIN_SAMPLES_PER_BUCKET || compositionMatches.length < MIN_SAMPLES_PER_BUCKET) {\n return null;\n }\n\n return {\n kind: 'directory',\n compositionPattern: `**/${composition}/**/*.vue`,\n optionsPattern: `**/${options}/**/*.vue`,\n compositionDir: composition,\n optionsDir: options,\n samples: {\n composition: compositionMatches.slice(0, 5),\n options: optionsMatches.slice(0, 5),\n },\n };\n}\n\nfunction detectDirectory (\n optionsFiles: readonly string[],\n compositionFiles: readonly string[]\n): VueHybridPatternDetection | null {\n return DIRECTORY_CANDIDATES.reduce<VueHybridPatternDetection | null>((found, candidate) => {\n if (found) {\n return found;\n }\n\n return directoryMatches(candidate.options, candidate.composition, optionsFiles, compositionFiles);\n }, null);\n}\n\nexport interface DetectVueApiPatternInput {\n cwd: string;\n maxFiles?: number;\n skipDirs?: Set<string>;\n classifications?: readonly VueFileClassification[];\n}\n\nexport function detectVueApiPattern (input: DetectVueApiPatternInput): VueHybridPatternDetection {\n const classifications = input.classifications\n ?? classifyVueFiles(scanVueFiles(input).files, input.cwd);\n\n if (classifications.length === 0) {\n return {\n kind: 'none',\n compositionFiles: [],\n optionsFiles: [],\n };\n }\n\n const optionsFiles = classifications.filter(item => item.api === 'options').map(item => item.relativePath);\n const compositionFiles = classifications\n .filter(item => item.api === 'composition')\n .map(item => item.relativePath);\n\n if (optionsFiles.length === 0 || compositionFiles.length === 0) {\n return {\n kind: 'none',\n compositionFiles,\n optionsFiles,\n };\n }\n\n const suffixHit = detectSuffix(optionsFiles, compositionFiles);\n\n if (suffixHit) {\n return suffixHit;\n }\n\n const directoryHit = detectDirectory(optionsFiles, compositionFiles);\n\n if (directoryHit) {\n return directoryHit;\n }\n\n return {\n kind: 'ambiguous',\n reason: 'Options and Composition files do not share a consistent suffix or directory split.',\n compositionFiles: compositionFiles.slice(0, 5),\n optionsFiles: optionsFiles.slice(0, 5),\n };\n}\n","export interface MigrateInput {\n cwd: string;\n target?: string;\n yes?: boolean;\n noInstall?: boolean;\n fromLint?: boolean;\n}\n\nexport interface ScaffoldInput {\n cwd: string;\n yes?: boolean;\n}\n\nexport interface DispatchDeps {\n scaffold: (input: ScaffoldInput) => Promise<number>;\n migrate: (input: MigrateInput) => Promise<number>;\n stderr: (line: string) => void;\n}\n\nconst yesFlags = new Set(['--yes', '-y']);\nconst noInstallFlags = new Set(['--no-install']);\nconst fromLintFlags = new Set(['--from-lint']);\n\nfunction isYesFlag (arg: string): boolean {\n return yesFlags.has(arg);\n}\n\nfunction isNoInstallFlag (arg: string): boolean {\n return noInstallFlags.has(arg);\n}\n\nfunction isFromLintFlag (arg: string): boolean {\n return fromLintFlags.has(arg);\n}\n\ninterface MigrateArgs {\n target: string | undefined;\n yes: boolean;\n noInstall: boolean;\n fromLint: boolean;\n}\n\nfunction parseMigrateArgs (rest: readonly string[]): MigrateArgs {\n const yes = rest.some(isYesFlag);\n const noInstall = rest.some(isNoInstallFlag);\n const fromLint = rest.some(isFromLintFlag);\n const positional = rest.filter(\n arg => !isYesFlag(arg) && !isNoInstallFlag(arg) && !isFromLintFlag(arg)\n );\n const target = positional.length > 0 ? positional[positional.length - 1] : undefined;\n\n return { target, yes, noInstall, fromLint };\n}\n\nfunction parseScaffoldArgs (argv: readonly string[]): { yes: boolean } {\n return { yes: argv.some(isYesFlag) };\n}\n\nfunction printUsage (stderr: (line: string) => void, unknown: string): void {\n stderr(`[useinsider/eslint-config] Unknown subcommand: ${unknown}`);\n stderr('Usage:');\n stderr(' npx @useinsider/eslint-config [--yes|-y]');\n stderr(' Scaffold insider.lint.*, eslint.config.* and oxlint.config.*');\n stderr(' npx @useinsider/eslint-config migrate [path] [--yes|-y] [--no-install] [--from-lint]');\n stderr(' Split an existing useInsider() or .eslintrc* config into the three-file layout');\n stderr(' --from-lint: started by a failing lint run — confirm first, exit non-zero if declined');\n}\n\nfunction isScaffoldArgv (argv: readonly string[]): boolean {\n return argv.every(arg => isYesFlag(arg));\n}\n\nexport async function dispatch (\n argv: readonly string[],\n cwd: string,\n deps: DispatchDeps\n): Promise<number> {\n if (isScaffoldArgv(argv)) {\n const { yes } = parseScaffoldArgs(argv);\n\n return deps.scaffold({ cwd, yes });\n }\n\n const [subcommand, ...rest] = argv;\n\n if (subcommand === 'migrate') {\n const { target, yes, noInstall, fromLint } = parseMigrateArgs(rest);\n\n return deps.migrate({ cwd, target, yes, noInstall, fromLint });\n }\n\n printUsage(deps.stderr, subcommand);\n\n return 1;\n}\n","export const dependencies = {\n jiti: true,\n oxlint: true,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-jest': true,\n} as const;\n","export const dependencies = {\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","export const dependencies = {\n '@vitest/eslint-plugin': true,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-vue': true,\n 'eslint-plugin-vue-scoped-css': true,\n 'vue-eslint-parser': true,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-vue': true,\n 'eslint-plugin-vue-scoped-css': true,\n 'vue-eslint-parser': true,\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-vue': true,\n 'eslint-plugin-vue-scoped-css': true,\n 'vue-eslint-parser': true,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-vue': true,\n 'eslint-plugin-vue-scoped-css': true,\n 'vue-eslint-parser': true,\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport type OverrideValue = string | Record<string, string>;\n\nexport type OverridesRecord = Record<string, OverrideValue>;\n\nexport const ESLINT_CONFIG_PACKAGE_NAME = '@useinsider/eslint-config';\n\nexport interface PackageManifestLike {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n overrides?: OverridesRecord;\n pnpm?: { overrides?: OverridesRecord; [key: string]: unknown };\n resolutions?: Record<string, string>;\n [key: string]: unknown;\n}\n\nfunction tryReadManifest (candidate: string): PackageManifestLike | null {\n try {\n const raw = readFileSync(candidate, 'utf8');\n const parsed = JSON.parse(raw) as PackageManifestLike;\n\n return parsed.name === ESLINT_CONFIG_PACKAGE_NAME ? parsed : null;\n } catch {\n return null;\n }\n}\n\ndeclare const __dirname: string | undefined;\n\nexport function resolveRuntimeDir (): string {\n const meta: { url?: unknown } = import.meta;\n const { url } = meta;\n\n if (typeof url === 'string' && url.startsWith('file:')) {\n return dirname(fileURLToPath(url));\n }\n\n if (typeof __dirname === 'string') {\n return __dirname;\n }\n\n return resolve(process.cwd(), 'node_modules/@useinsider/eslint-config/dist');\n}\n\nexport function readOwnEslintConfigManifestFrom (runtimeDir: string): PackageManifestLike {\n const candidates = [\n resolve(runtimeDir, '../../package.json'),\n resolve(runtimeDir, '../../../package.json'),\n resolve(runtimeDir, '../package.json'),\n resolve(process.cwd(), 'node_modules/@useinsider/eslint-config/package.json'),\n ];\n const found = candidates\n .map(tryReadManifest)\n .find(manifest => manifest !== null);\n\n if (!found) {\n throw new Error('Unable to locate @useinsider/eslint-config package.json from CLI runtime');\n }\n\n return found;\n}\n\nexport function readOwnEslintConfigManifest (): PackageManifestLike {\n return readOwnEslintConfigManifestFrom(resolveRuntimeDir());\n}\n\n/**\n * Install spec for the copy of `@useinsider/eslint-config` that is running right now, pinned to its\n * own version. A dist-tag can never stand in for it: `latest` points at the previous major for as\n * long as the current one ships on a prerelease tag, so resolving it downgrades the very consumer\n * being scaffolded or migrated.\n * @example\n * ownEslintConfigSpec({ name: '@useinsider/eslint-config', version: '4.0.0-beta.3' });\n * // '@useinsider/eslint-config@4.0.0-beta.3'\n */\nexport function ownEslintConfigSpec (manifest: PackageManifestLike): string {\n const version = manifest.version?.trim();\n\n if (!version) {\n throw new Error(\n `Unable to read the running ${ESLINT_CONFIG_PACKAGE_NAME} version from its package.json.`\n + ' Refusing to install it from a dist-tag, which would downgrade this project.'\n );\n }\n\n return `${ESLINT_CONFIG_PACKAGE_NAME}@${version}`;\n}\n","import type { CliAnswers, VueMajor } from './template';\nimport { dependencies as baseDeps } from '~/configs/dependencies';\nimport { dependencies as jestDeps } from '~/configs/jest/dependencies';\nimport { dependencies as typescriptDeps } from '~/configs/typescript/dependencies';\nimport { dependencies as vitestDeps } from '~/configs/vitest/dependencies';\nimport { dependencies as vue2Deps } from '~/configs/vue2/dependencies';\nimport { dependencies as vue2TypescriptDeps } from '~/configs/vue2-typescript/dependencies';\nimport { dependencies as vue3Deps } from '~/configs/vue3/dependencies';\nimport { dependencies as vue3TypescriptDeps } from '~/configs/vue3-typescript/dependencies';\nimport {\n ownEslintConfigSpec,\n readOwnEslintConfigManifest,\n type PackageManifestLike,\n} from './resolveEslintConfigManifest';\n\ninterface RequiredManifest {\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n optionalDependencies: Record<string, string>;\n}\n\ntype DependencyRecord = Readonly<Record<string, boolean>>;\n\nfunction toRequiredManifest (manifest: PackageManifestLike): RequiredManifest {\n return {\n dependencies: manifest.dependencies ?? {},\n devDependencies: manifest.devDependencies ?? {},\n peerDependencies: manifest.peerDependencies ?? {},\n optionalDependencies: manifest.optionalDependencies ?? {},\n };\n}\n\nfunction lookup (manifest: RequiredManifest, name: string): string | undefined {\n return manifest.dependencies[name]\n ?? manifest.devDependencies[name]\n ?? manifest.peerDependencies[name]\n ?? manifest.optionalDependencies[name];\n}\n\nfunction pinned (manifest: RequiredManifest, name: string): string {\n const version = lookup(manifest, name);\n\n if (!version) {\n throw new Error(`Unable to resolve pinned version for ${name} from @useinsider/eslint-config manifest`);\n }\n\n const cleanVersion = version.replace(/^(?:\\^|~|>=|<=|>|<|=)/u, '');\n\n return `${name}@${cleanVersion}`;\n}\n\nfunction vueDepsFor (major: VueMajor, wantsTypescript: boolean): DependencyRecord {\n if (wantsTypescript) {\n return major === 2 ? vue2TypescriptDeps : vue3TypescriptDeps;\n }\n\n return major === 2 ? vue2Deps : vue3Deps;\n}\n\nfunction applyRecord (\n deps: Set<string>,\n manifest: RequiredManifest,\n record: DependencyRecord\n): void {\n Object.entries(record).forEach(([name, install]) => {\n if (install) {\n deps.add(pinned(manifest, name));\n }\n });\n}\n\nexport function buildDependencyList (\n answers: CliAnswers,\n rawManifest: PackageManifestLike = readOwnEslintConfigManifest()\n): string[] {\n const manifest = toRequiredManifest(rawManifest);\n const deps = new Set<string>();\n\n deps.add(ownEslintConfigSpec(rawManifest));\n deps.add(pinned(manifest, 'eslint'));\n deps.add(pinned(manifest, 'globals'));\n applyRecord(deps, manifest, baseDeps);\n\n const wantsTypescript = answers.languages.includes('typescript');\n const wantsVue = answers.framework === 'vue';\n\n if (wantsVue) {\n const major: VueMajor = answers.vueMajor ?? 3;\n\n applyRecord(deps, manifest, vueDepsFor(major, wantsTypescript));\n } else if (wantsTypescript) {\n applyRecord(deps, manifest, typescriptDeps);\n }\n\n if (answers.testFramework === 'jest') {\n applyRecord(deps, manifest, jestDeps);\n }\n\n if (answers.testFramework === 'vitest') {\n applyRecord(deps, manifest, vitestDeps);\n }\n\n return [...deps];\n}\n\nexport async function installDependencies (deps: readonly string[]): Promise<void> {\n const { installPackage } = await import('@antfu/install-pkg');\n\n await installPackage([...deps], { dev: true, additionalArgs: ['-E'] });\n}\n","import { existsSync, rmSync, unlinkSync } from 'node:fs';\nimport { basename, join } from 'node:path';\nimport type { ClackLike } from './questions';\n\nexport type DependencyInstaller = (specs: readonly string[]) => Promise<void>;\n\nexport interface WipeFsOps {\n rmDir: (path: string) => void;\n rmFile: (path: string) => void;\n exists: (path: string) => boolean;\n}\n\n/**\n * Whether the dependencies really landed. `installWithRetry` handles its own retry and reporting, so\n * the failure is otherwise invisible to the caller — and a CLI that writes a lint layout over an\n * empty `node_modules` reports success for a repo that cannot lint.\n * @example\n * (await installWithRetry(options)).installed; // false when the retry failed too\n */\nexport interface InstallOutcome {\n installed: boolean;\n reason?: string;\n}\n\nexport interface InstallWithRetryOptions {\n deps: readonly string[];\n cwd: string;\n autoConfirm: boolean;\n clack: ClackLike;\n fsOps?: WipeFsOps;\n installer?: DependencyInstaller;\n}\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\ninterface DetectedLockfile {\n manager: PackageManager;\n lockfilePath: string;\n}\n\nconst lockfileMap: { file: string; manager: PackageManager }[] = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'package-lock.json', manager: 'npm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'bun.lockb', manager: 'bun' },\n];\n\nconst knownErrorCodes = [\n 'ENOSPC',\n 'EACCES',\n 'EPERM',\n 'ENOTFOUND',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ECONNRESET',\n 'EAI_AGAIN',\n 'E404',\n 'ERR_PNPM_FETCH_404',\n 'ERR_PNPM_NO_MATCHING_VERSION',\n] as const;\n\nfunction defaultWipeFs (): WipeFsOps {\n return {\n rmDir: path => {\n rmSync(path, { recursive: true, force: true });\n },\n rmFile: path => {\n unlinkSync(path);\n },\n exists: path => existsSync(path),\n };\n}\n\nasync function defaultInstaller (specs: readonly string[]): Promise<void> {\n const { installPackage } = await import('@antfu/install-pkg');\n\n await installPackage([...specs], { dev: true, additionalArgs: ['-E'] });\n}\n\nfunction detectLockfile (dir: string, exists: (path: string) => boolean): DetectedLockfile | null {\n const found = lockfileMap\n .map(entry => ({ manager: entry.manager, lockfilePath: join(dir, entry.file) }))\n .find(candidate => exists(candidate.lockfilePath));\n\n return found ?? null;\n}\n\nconst addCommandMap: Record<PackageManager, string> = {\n pnpm: 'pnpm add -D -E',\n npm: 'npm install -D -E',\n yarn: 'yarn add -D -E',\n bun: 'bun add -d -E',\n};\n\nconst removeCommandMap: Record<PackageManager, string> = {\n pnpm: 'pnpm remove',\n npm: 'npm uninstall',\n yarn: 'yarn remove',\n bun: 'bun remove',\n};\n\nexport function detectPackageManager (dir: string, fsOps?: WipeFsOps): PackageManager {\n const fs = fsOps ?? defaultWipeFs();\n const detected = detectLockfile(dir, fs.exists);\n\n return detected?.manager ?? 'pnpm';\n}\n\nexport function buildAddCommand (manager: PackageManager, specs: readonly string[]): string {\n return `${addCommandMap[manager]} ${specs.join(' ')}`;\n}\n\nexport function buildRemoveCommand (manager: PackageManager, names: readonly string[]): string {\n return `${removeCommandMap[manager]} ${names.join(' ')}`;\n}\n\nfunction sortPackagesCaseInsensitive (packages: readonly string[]): string[] {\n return [...packages].sort((left, right) => left.toLowerCase().localeCompare(right.toLowerCase()));\n}\n\nfunction formatMultilineCommand (\n header: string,\n packages: readonly string[],\n blockIndent: string,\n packageIndent: string\n): string {\n if (packages.length === 0) {\n return '';\n }\n\n const sorted = sortPackagesCaseInsensitive(packages);\n const lastIndex = sorted.length - 1;\n const lines = [`${blockIndent}${header} \\\\`];\n\n sorted.forEach((pkg, index) => {\n const suffix = index === lastIndex ? '' : ' \\\\';\n\n lines.push(`${packageIndent}${pkg}${suffix}`);\n });\n\n return lines.join('\\n');\n}\n\nexport function formatNextStepsAddCommand (\n manager: PackageManager,\n specs: readonly string[],\n blockIndent = ' ',\n packageIndent = ' '\n): string {\n return formatMultilineCommand(addCommandMap[manager], specs, blockIndent, packageIndent);\n}\n\nexport function formatNextStepsRemoveCommand (\n manager: PackageManager,\n names: readonly string[],\n blockIndent = ' ',\n packageIndent = ' '\n): string {\n return formatMultilineCommand(removeCommandMap[manager], names, blockIndent, packageIndent);\n}\n\nfunction manualRecoveryCommand (dir: string, detected: DetectedLockfile | null): string {\n const lockTarget = detected ? basename(detected.lockfilePath) : 'package-lock.json';\n const manager = detected?.manager ?? 'npm';\n\n return `cd ${dir} && rm -rf node_modules ${lockTarget} && ${manager} install`;\n}\n\nfunction buildManualHint (specs: readonly string[], dir: string, detected: DetectedLockfile | null): string {\n const recoveryAdd = specs.join(' ');\n const recovery = manualRecoveryCommand(dir, detected);\n\n return `Manually add: ${recoveryAdd}\\nRecover with: ${recovery}`;\n}\n\nfunction isPeerDepFailure (reason: string): boolean {\n return reason.toLowerCase().includes('--legacy-peer-deps');\n}\n\nfunction firstNonEmptyLine (reason: string): string {\n const line = reason.split(/\\r?\\n/u).map(segment => segment.trim()).find(segment => segment.length > 0);\n\n return line ?? reason.trim();\n}\n\nfunction detectErrorCode (reason: string): string | null {\n return knownErrorCodes.find(code => new RegExp(`\\\\b${code}\\\\b`, 'u').test(reason)) ?? null;\n}\n\nfunction buildGenericSummary (reason: string): string {\n const code = detectErrorCode(reason);\n const snippet = firstNonEmptyLine(reason);\n\n if (code && !snippet.includes(code)) {\n return `Dependency install failed (${code}): ${snippet}`;\n }\n\n return `Dependency install failed: ${snippet}`;\n}\n\nasync function confirmPeerDepWipe (clack: ClackLike, autoConfirm: boolean): Promise<boolean> {\n if (autoConfirm) {\n return true;\n }\n\n const message = 'Install failed.\\n\\n'\n + 'This usually means stale dependencies in node_modules conflict with the new ESLint plugin versions.\\n\\n'\n + 'Wipe `node_modules` and the lockfile, then retry install?';\n const result = await clack.confirm({ message, initialValue: false });\n\n return !clack.isCancel(result) && result === true;\n}\n\nasync function confirmCleanReinstall (\n clack: ClackLike,\n autoConfirm: boolean,\n summary: string\n): Promise<boolean> {\n if (autoConfirm) {\n return true;\n }\n\n const message = `${summary}\\n\\n`\n + 'Would you like to try a clean reinstall? '\n + '(removes `node_modules` and the lockfile, then re-runs install)';\n const result = await clack.confirm({ message, initialValue: true });\n\n return !clack.isCancel(result) && result === true;\n}\n\nfunction noteWipeFailure (clack: ClackLike, label: string, path: string, reason: string): void {\n if (clack.note) {\n clack.note(`Could not remove ${label} at ${path}: ${reason}`, 'Warning');\n }\n}\n\nfunction safeRemoveDir (clack: ClackLike, fs: WipeFsOps, path: string): void {\n if (!fs.exists(path)) {\n return;\n }\n\n try {\n fs.rmDir(path);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n noteWipeFailure(clack, 'node_modules', path, reason);\n }\n}\n\nfunction safeRemoveFile (clack: ClackLike, fs: WipeFsOps, path: string): void {\n if (!fs.exists(path)) {\n return;\n }\n\n try {\n fs.rmFile(path);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n noteWipeFailure(clack, 'lockfile', path, reason);\n }\n}\n\ninterface WipeContext {\n dir: string;\n fs: WipeFsOps;\n detected: DetectedLockfile | null;\n}\n\nfunction performFullWipe (clack: ClackLike, context: WipeContext): void {\n safeRemoveDir(clack, context.fs, join(context.dir, 'node_modules'));\n\n if (context.detected) {\n safeRemoveFile(clack, context.fs, context.detected.lockfilePath);\n }\n}\n\nfunction noteError (\n clack: ClackLike,\n prefix: string,\n reason: string,\n context: WipeContext,\n specs: readonly string[]\n): void {\n if (!clack.note) {\n return;\n }\n\n const hint = buildManualHint(specs, context.dir, context.detected);\n\n clack.note(`${prefix}${reason}\\n${hint}`, 'Error');\n}\n\nfunction noteGenericError (\n clack: ClackLike,\n summary: string,\n context: WipeContext,\n specs: readonly string[]\n): void {\n if (!clack.note) {\n return;\n }\n\n const hint = buildManualHint(specs, context.dir, context.detected);\n\n clack.note(`${summary}\\n${hint}`, 'Error');\n}\n\nasync function tryRetryInstall (\n clack: ClackLike,\n installer: DependencyInstaller,\n deps: readonly string[],\n context: WipeContext\n): Promise<InstallOutcome> {\n try {\n await installer(deps);\n\n return { installed: true };\n } catch (retryError) {\n const retryReason = retryError instanceof Error ? retryError.message : String(retryError);\n\n noteError(clack, 'Retry install failed after wipe: ', retryReason, context, deps);\n\n return { installed: false, reason: retryReason };\n }\n}\n\nasync function tryGenericRetryInstall (\n clack: ClackLike,\n installer: DependencyInstaller,\n deps: readonly string[],\n context: WipeContext\n): Promise<InstallOutcome> {\n try {\n await installer(deps);\n\n return { installed: true };\n } catch (retryError) {\n const retryReason = retryError instanceof Error ? retryError.message : String(retryError);\n const summary = buildGenericSummary(`Clean reinstall failed: ${retryReason}`);\n\n noteGenericError(clack, summary, context, deps);\n\n return { installed: false, reason: summary };\n }\n}\n\nasync function handlePeerDepFailure (\n clack: ClackLike,\n deps: readonly string[],\n autoConfirm: boolean,\n installer: DependencyInstaller,\n reason: string,\n context: WipeContext\n): Promise<InstallOutcome> {\n const confirmed = await confirmPeerDepWipe(clack, autoConfirm);\n\n if (!confirmed) {\n noteError(clack, 'Install failed: ', reason, context, deps);\n\n return { installed: false, reason };\n }\n\n performFullWipe(clack, context);\n\n return tryRetryInstall(clack, installer, deps, context);\n}\n\nasync function handleGenericFailure (\n clack: ClackLike,\n deps: readonly string[],\n autoConfirm: boolean,\n installer: DependencyInstaller,\n reason: string,\n context: WipeContext\n): Promise<InstallOutcome> {\n const summary = buildGenericSummary(reason);\n const confirmed = await confirmCleanReinstall(clack, autoConfirm, summary);\n\n if (!confirmed) {\n if (clack.note) {\n clack.note(\n `${summary}\\nSkipping clean reinstall. Please resolve the issue manually and re-run.`,\n 'Error'\n );\n }\n\n return { installed: false, reason: summary };\n }\n\n performFullWipe(clack, context);\n\n return tryGenericRetryInstall(clack, installer, deps, context);\n}\n\n/**\n * Installs the dependencies, offering one wipe-and-retry when the first attempt fails, and reports\n * whether they ended up installed. Every failure path is already explained to the consumer through\n * `clack`, so the outcome exists for the caller's exit code rather than for a second message.\n * @example\n * const outcome = await installWithRetry(options);\n * if (!outcome.installed) { return 1; }\n */\nexport async function installWithRetry (opts: InstallWithRetryOptions): Promise<InstallOutcome> {\n const installer = opts.installer ?? defaultInstaller;\n const fs = opts.fsOps ?? defaultWipeFs();\n\n try {\n await installer(opts.deps);\n\n return { installed: true };\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n const context: WipeContext = {\n dir: opts.cwd,\n fs,\n detected: detectLockfile(opts.cwd, fs.exists),\n };\n\n if (isPeerDepFailure(reason)) {\n return handlePeerDepFailure(opts.clack, opts.deps, opts.autoConfirm, installer, reason, context);\n }\n\n return handleGenericFailure(opts.clack, opts.deps, opts.autoConfirm, installer, reason, context);\n }\n}\n","const DEFAULT_INDENT = ' ';\n\n/**\n * The indentation a JSON source already uses, as the string `JSON.stringify` takes for its third\n * argument. A width would be wrong: `JSON.stringify` emits that many *spaces*, so a tab-indented\n * manifest comes back re-indented with spaces and every line of it shows up in the diff.\n * @example\n * detectIndent('{\\n\\t\"name\": \"app\"\\n}'); // '\\t'\n * @example\n * detectIndent('{\"name\":\"app\"}', ' '); // ' '\n */\nexport function detectIndent (raw: string, fallback: string = DEFAULT_INDENT): string {\n const match = /\\n([\\t ]+)\\S/u.exec(raw);\n\n return match ? match[1] : fallback;\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('detectIndent', () => {\n test('returns the tab a tab-indented manifest uses', () => {\n expect(detectIndent('{\\n\\t\"name\": \"app\"\\n}\\n')).toBe('\\t');\n });\n\n test('returns the two spaces a two-space manifest uses', () => {\n expect(detectIndent('{\\n \"name\": \"app\"\\n}\\n')).toBe(' ');\n });\n\n // A width read as \"characters between the first newline and the first non-space\" counts the\n // blank line itself, so this source measured 3 and re-indented the whole file.\n test('measures the first indented line, not the blank line before it', () => {\n expect(detectIndent('{\\n\\n \"name\": \"app\"\\n}\\n')).toBe(' ');\n });\n\n // A tsconfig is JSON with comments, so the first indented line need not open with a quote.\n test('measures an indented comment line', () => {\n expect(detectIndent('{\\n // why\\n\"compilerOptions\": {}\\n}\\n')).toBe(' ');\n });\n\n test('falls back when nothing in the source is indented', () => {\n expect(detectIndent('{\"name\":\"app\"}')).toBe(' ');\n });\n\n test('uses the caller fallback instead of the default', () => {\n expect(detectIndent('{\"name\":\"app\"}', ' ')).toBe(' ');\n });\n });\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { detectIndent } from './detectIndent';\n\nexport type LayoutExtension = 'mts' | 'ts';\n\nexport interface LintLayoutFile {\n filename: string;\n source: string;\n}\n\nexport interface LintLayout {\n extension: LayoutExtension;\n lintModule: string;\n oxlintConfig: string;\n eslintConfig: string;\n replacedEslintConfigs: string[];\n}\n\n// `--disable-nested-config` is not a preference. The emitted oxlint config carries root-only\n// `options` keys, and oxlint aborts the whole run when it discovers them in a config below the\n// invocation directory — which is exactly what a monorepo whose packages each ran this CLI looks\n// like. Disabling nested discovery also makes the config's own `ignorePatterns` authoritative;\n// without it a nested config resurrects a directory the parent ignored.\nexport const OXLINT_COMMAND = 'oxlint --disable-nested-config';\n\nexport const OXLINT_LINT_SCRIPT = `${OXLINT_COMMAND} && eslint .`;\n\n/**\n * Extension for the lint module and the oxlint config. oxlint only discovers `oxlint.config.ts` and\n * `oxlint.config.mts`, and Node warns on a bare `.ts` file inside a package that declares no\n * `\"type\"`, so such a consumer gets the unambiguous `.mts` form.\n * @example\n * resolveLayoutExtension('/repo'); // 'ts' when /repo/package.json declares \"type\": \"module\"\n */\nexport function resolveLayoutExtension (cwd: string): LayoutExtension {\n try {\n const raw = readFileSync(join(cwd, 'package.json'), 'utf8');\n const manifest = JSON.parse(raw) as { type?: string };\n\n return manifest.type === 'module' ? 'ts' : 'mts';\n } catch {\n return 'mts';\n }\n}\n\n// ESLint routes a `.ts`/`.mts`/`.cts` config through jiti, which resolves the lint module's\n// TypeScript extension on every Node version. A `.js`/`.mjs`/`.cjs` config is loaded by Node\n// directly, so importing `./insider.lint.ts` from one depends on Node's type stripping being\n// unflagged (>=22.18) and fails outright on Node 20 with ERR_UNKNOWN_FILE_EXTENSION. Verified\n// against ESLint 9.39.5 on Node 20.20 / 22.13 / 22.23 / 24.20 by tests/lintLayoutLoading.spec.ts.\nconst ESLINT_CONFIG_EXTENSIONS: readonly string[] = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];\nconst TYPESCRIPT_CONFIG_EXTENSIONS: ReadonlySet<string> = new Set(['cts', 'mts', 'ts']);\n\nfunction extensionOf (filename: string): string {\n return filename.slice(filename.lastIndexOf('.') + 1);\n}\n\nfunction existingEslintConfigs (cwd: string): string[] {\n return ESLINT_CONFIG_EXTENSIONS\n .map(extension => `eslint.config.${extension}`)\n .filter(filename => existsSync(join(cwd, filename)));\n}\n\n/**\n * The three filenames `useInsider()` requires, resolved against a consumer directory. A JavaScript\n * flat config is renamed to the TypeScript extension — it cannot import the lint module on every\n * supported Node version — and every other `eslint.config.*` in the directory is reported through\n * `replacedEslintConfigs` so the caller deletes it. ESLint resolves `.js`/`.mjs`/`.cjs` before the\n * TypeScript extensions, so a leftover JavaScript config keeps winning over the one just written.\n * @example\n * resolveLintLayout('/repo');\n * // { eslintConfig: 'eslint.config.ts', replacedEslintConfigs: ['eslint.config.js'], ... }\n */\nexport function resolveLintLayout (cwd: string): LintLayout {\n const extension = resolveLayoutExtension(cwd);\n const existing = existingEslintConfigs(cwd);\n const loadable = existing.find(filename => TYPESCRIPT_CONFIG_EXTENSIONS.has(extensionOf(filename)));\n const eslintConfig = loadable ?? `eslint.config.${extension}`;\n\n return {\n extension,\n lintModule: `insider.lint.${extension}`,\n oxlintConfig: `oxlint.config.${extension}`,\n eslintConfig,\n replacedEslintConfigs: existing.filter(filename => filename !== eslintConfig),\n };\n}\n\n/**\n * Body of the generated `eslint.config.*`. The import names the lint module's real extension\n * because neither linter's loader applies TypeScript's `.js` → `.ts` specifier rewriting.\n * @example\n * renderEslintConfigFile('insider.lint.ts'); // \"import { useInsiderESLint } from './insider.lint.ts';\\n…\"\n */\nexport function renderEslintConfigFile (lintModule: string): string {\n return [\n `import { useInsiderESLint } from './${lintModule}';`,\n '',\n 'export default useInsiderESLint();',\n '',\n ].join('\\n');\n}\n\n/**\n * Body of the generated `oxlint.config.*`.\n * @example\n * renderOxlintConfigFile('insider.lint.mts'); // \"…export default await useInsiderOXC();\\n\"\n */\nexport function renderOxlintConfigFile (lintModule: string): string {\n return [\n `import { useInsiderOXC } from './${lintModule}';`,\n '',\n 'export default await useInsiderOXC();',\n '',\n ].join('\\n');\n}\n\n/**\n * The two thin files that sit beside a lint module, ready to write.\n * @example\n * renderLintLayoutFiles(resolveLintLayout('/repo')).map(file => file.filename);\n * // ['eslint.config.mts', 'oxlint.config.mts']\n */\nexport function renderLintLayoutFiles (layout: LintLayout): LintLayoutFile[] {\n return [\n { filename: layout.eslintConfig, source: renderEslintConfigFile(layout.lintModule) },\n { filename: layout.oxlintConfig, source: renderOxlintConfigFile(layout.lintModule) },\n ];\n}\n\ninterface ScriptedManifest {\n scripts?: Record<string, string>;\n}\n\nexport interface LintScriptChange {\n script: string;\n previous: string;\n next: string;\n}\n\nexport type LintScriptUnresolvedReason = 'lint-script-runs-neither';\n\nexport interface LintScriptCandidate {\n script: string;\n previous: string;\n}\n\nexport interface LintScriptResult {\n manifest: string;\n changed: boolean;\n changes: LintScriptChange[];\n alreadyRunsOxlint: string[];\n skipped: LintScriptCandidate[];\n unresolved?: { reason: LintScriptUnresolvedReason; script: string; previous: string };\n}\n\nconst DEFAULT_MANIFEST_INDENT = ' ';\nconst SEGMENT_SEPARATOR = /&&|\\|\\||[;|]/u;\nconst ASSIGNMENT = /^[A-Za-z_]\\w*=/u;\nconst WRAPPER_COMMANDS: ReadonlySet<string> = new Set([\n 'bunx',\n 'cross-env',\n 'dotenv',\n 'exec',\n 'npx',\n 'pnpm',\n 'run',\n 'yarn',\n]);\nconst AGGREGATE_COMMANDS: ReadonlySet<string> = new Set([\n 'concurrently',\n 'npm-run-all',\n 'npm-run-all2',\n 'run-p',\n 'run-s',\n]);\nconst SCRIPT_RUNNERS: ReadonlySet<string> = new Set(['bun', 'npm', 'pnpm', 'yarn']);\n\nfunction baseName (token: string): string {\n const withoutDirectory = token.slice(token.lastIndexOf('/') + 1);\n\n return withoutDirectory.replace(/\\.[mc]?js$/u, '');\n}\n\nfunction segmentsOf (command: string): string[] {\n return command\n .split(SEGMENT_SEPARATOR)\n .map(segment => segment.trim())\n .filter(segment => segment.length > 0);\n}\n\nfunction tokensOf (segment: string): string[] {\n return segment.split(/\\s+/u).filter(token => token.length > 0 && !ASSIGNMENT.test(token));\n}\n\n// A lint script is usually a small pipeline of wrappers (`cross-env`, `npx`, `pnpm exec`) in front of\n// the binary that matters, so the command word is the first token that is not one of those.\nfunction commandWordOf (segment: string): string | null {\n const words = tokensOf(segment).map(baseName);\n const found = words.find(word => !word.startsWith('-') && !WRAPPER_COMMANDS.has(word));\n\n return found ?? null;\n}\n\n/**\n * Whether a package script really invokes the `eslint` binary, as opposed to delegating to another\n * script that does. `npm run lint:es` is not an ESLint invocation; `NODE_OPTIONS=… eslint .` is.\n * @example\n * invokesBinary('npm run lint:es-ci -- --cache', 'eslint'); // false\n */\nexport function invokesBinary (command: string, binary: string): boolean {\n return segmentsOf(command).some(segment => commandWordOf(segment) === binary);\n}\n\n/**\n * Whether a script only fans out to other package scripts (`run-p`, `npm-run-all`, `npm run …`).\n * Such a script is never the place to add oxlint — the leaf that runs ESLint is.\n * @example\n * isAggregateScript('run-p lint:type lint:es lint:style'); // true\n */\nexport function isAggregateScript (command: string): boolean {\n return segmentsOf(command).some(segment => {\n const words = tokensOf(segment).map(baseName);\n const [first, second] = words;\n\n if (first && AGGREGATE_COMMANDS.has(first)) {\n return true;\n }\n\n return Boolean(first && SCRIPT_RUNNERS.has(first) && second === 'run');\n });\n}\n\nfunction oxlintPrefixFor (command: string): string {\n return tokensOf(command).includes('--fix') ? `${OXLINT_COMMAND} --fix` : OXLINT_COMMAND;\n}\n\nconst CANONICAL_LINT_SCRIPT = 'lint';\n\nfunction referencedScripts (command: string, names: ReadonlySet<string>): string[] {\n return tokensOf(command)\n .map(token => token.replace(/^[\"']|[\"']$/gu, '').replace(/^npm:/u, ''))\n .filter(token => names.has(token));\n}\n\nfunction collectReachable (\n scripts: Record<string, string>,\n names: ReadonlySet<string>,\n script: string,\n seen: Set<string>\n): void {\n if (seen.has(script)) {\n return;\n }\n\n seen.add(script);\n\n referencedScripts(scripts[script] ?? '', names).forEach(next => {\n collectReachable(scripts, names, next, seen);\n });\n}\n\n// The entry point a repo designates by naming it `lint`, plus everything that entry point delegates\n// to. It is what keeps a composed `run-p lint:type lint:es lint:style` resolving to its `lint:es-ci`\n// leaf while leaving sibling entry points such as `lint:fix` and `lint:ci` out of the running.\nfunction reachableFromLint (scripts: Record<string, string>): Set<string> {\n const names = new Set(Object.keys(scripts));\n const seen = new Set<string>();\n\n if (names.has(CANONICAL_LINT_SCRIPT)) {\n collectReachable(scripts, names, CANONICAL_LINT_SCRIPT, seen);\n }\n\n return seen;\n}\n\nfunction fixingRank (candidate: LintScriptCandidate): number {\n return tokensOf(candidate.previous).includes('--fix') ? 1 : 0;\n}\n\nfunction compareCandidates (left: LintScriptCandidate, right: LintScriptCandidate): number {\n return fixingRank(left) - fixingRank(right)\n || left.script.length - right.script.length\n || left.script.localeCompare(right.script);\n}\n\n// oxlint belongs in front of ESLint once, not in front of every script that happens to run it: a\n// repo whose `lint`, `lint:fix` and `lint:ci` each invoke `eslint` would otherwise run oxlint three\n// times over the same tree. The scripts left out are reported so nothing is dropped silently.\nfunction selectTarget (\n scripts: Record<string, string>,\n candidates: readonly LintScriptCandidate[]\n): LintScriptCandidate | null {\n if (candidates.length === 0) {\n return null;\n }\n\n const reachable = reachableFromLint(scripts);\n const preferred = candidates.filter(candidate => reachable.has(candidate.script));\n const pool = preferred.length > 0 ? preferred : candidates;\n\n return [...pool].sort(compareCandidates)[0];\n}\n\nfunction planChanges (scripts: Record<string, string>): {\n changes: LintScriptChange[];\n alreadyRunsOxlint: string[];\n skipped: LintScriptCandidate[];\n} {\n const alreadyRunsOxlint: string[] = [];\n const candidates: LintScriptCandidate[] = [];\n\n Object.entries(scripts).forEach(([script, previous]) => {\n if (!invokesBinary(previous, 'eslint')) {\n return;\n }\n\n if (invokesBinary(previous, 'oxlint')) {\n alreadyRunsOxlint.push(script);\n\n return;\n }\n\n candidates.push({ script, previous });\n });\n\n const target = selectTarget(scripts, candidates);\n\n if (!target) {\n return { changes: [], alreadyRunsOxlint, skipped: [] };\n }\n\n return {\n changes: [{\n script: target.script,\n previous: target.previous,\n next: `${oxlintPrefixFor(target.previous)} && ${target.previous}`,\n }],\n alreadyRunsOxlint,\n skipped: candidates.filter(candidate => candidate.script !== target.script),\n };\n}\n\n/**\n * Adds oxlint beside the one script that actually runs ESLint, by prepending to it rather than\n * replacing it — so a composed `lint` such as `run-p lint:type lint:es lint:style` keeps its\n * type-check and stylelint passes and only its `lint:es-ci` leaf is rewritten. Sibling entry points\n * that also run ESLint (`lint:fix`, `lint:ci`) are reported through `skipped` rather than rewritten,\n * so oxlint runs once per lint pass. Never rewrites a script it did not author: when nothing invokes\n * `eslint` and a `lint` script already exists, the manifest is left alone and the conflict reported.\n * @example\n * setLintScript('{\"scripts\":{\"lint\":\"eslint .\"}}').changes;\n * // [{ script: 'lint', previous: 'eslint .', next: 'oxlint --disable-nested-config && eslint .' }]\n */\nexport function setLintScript (rawManifest: string): LintScriptResult {\n let parsed: ScriptedManifest;\n\n try {\n parsed = JSON.parse(rawManifest) as ScriptedManifest;\n } catch {\n return { manifest: rawManifest, changed: false, changes: [], alreadyRunsOxlint: [], skipped: [] };\n }\n\n const scripts = parsed.scripts ?? {};\n const { changes, alreadyRunsOxlint, skipped } = planChanges(scripts);\n const existingLint = scripts.lint as string | undefined;\n\n if (changes.length === 0 && alreadyRunsOxlint.length === 0) {\n if (existingLint !== undefined) {\n return {\n manifest: rawManifest,\n changed: false,\n changes: [],\n alreadyRunsOxlint: [],\n skipped: [],\n unresolved: { reason: 'lint-script-runs-neither', script: 'lint', previous: existingLint },\n };\n }\n\n changes.push({ script: 'lint', previous: '', next: OXLINT_LINT_SCRIPT });\n }\n\n if (changes.length === 0) {\n return { manifest: rawManifest, changed: false, changes: [], alreadyRunsOxlint, skipped };\n }\n\n parsed.scripts = { ...scripts };\n\n changes.forEach(change => {\n (parsed.scripts as Record<string, string>)[change.script] = change.next;\n });\n\n return {\n manifest: `${JSON.stringify(parsed, null, detectIndent(rawManifest, DEFAULT_MANIFEST_INDENT))}\\n`,\n changed: true,\n changes,\n alreadyRunsOxlint,\n skipped,\n };\n}\n\n/**\n * The scripts that still run ESLint alone, for the CLI to print. Each line carries the oxlint prefix\n * that script would need, so a consumer who wants oxlint on a second entry point can paste it.\n * @example\n * formatSkippedLintScripts([{ script: 'lint:fix', previous: 'eslint . --fix' }]);\n * // 'lint:fix\\n prefix with: oxlint --disable-nested-config --fix && '\n */\nexport function formatSkippedLintScripts (skipped: readonly LintScriptCandidate[]): string {\n return skipped\n .map(candidate => `${candidate.script}\\n prefix with: ${oxlintPrefixFor(candidate.previous)} && `)\n .join('\\n\\n');\n}\n\n/**\n * One line per rewritten script, for the CLI to print. The previous command survives verbatim inside\n * the new one, so the report doubles as the recovery instructions.\n * @example\n * formatLintScriptChanges([{ script: 'lint:es-ci', previous: 'eslint .', next: 'oxlint && eslint .' }]);\n * // 'lint:es-ci\\n before: eslint .\\n after: oxlint && eslint .'\n */\nexport function formatLintScriptChanges (changes: readonly LintScriptChange[]): string {\n return changes\n .map(change => [\n change.script,\n ` before: ${change.previous === '' ? '(no such script)' : change.previous}`,\n ` after: ${change.next}`,\n ].join('\\n'))\n .join('\\n\\n');\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n const { mkdtempSync, writeFileSync } = await import('node:fs');\n const { tmpdir } = await import('node:os');\n\n function parseScripts (raw: string): Record<string, string> {\n return (JSON.parse(raw) as ScriptedManifest).scripts ?? {};\n }\n\n function makeDir (manifest?: string, files: Record<string, string> = {}): string {\n const directory = mkdtempSync(join(tmpdir(), 'insider-layout-'));\n\n if (manifest !== undefined) {\n writeFileSync(join(directory, 'package.json'), manifest);\n }\n\n Object.entries(files).forEach(([name, content]) => {\n writeFileSync(join(directory, name), content, 'utf8');\n });\n\n return directory;\n }\n\n // The script set of a real v3 consumer: `lint` fans out, and the only script that actually runs\n // ESLint is two hops down. Overwriting `lint` here would drop vue-tsc and stylelint silently.\n const COMPOSED_SCRIPTS = {\n lint: 'run-p lint:type lint:es lint:style',\n 'lint:es': 'npm run lint:es-ci -- --cache',\n 'lint:es-ci': 'NODE_OPTIONS=--max-old-space-size=6144 eslint .',\n 'lint:style': 'npm run lint:style-ci -- --cache',\n 'lint:style-ci': 'stylelint \"src/**/*.{css,scss,vue}\"',\n 'lint:type': 'run-p lint:type:app lint:type:test lint:type:node',\n 'lint:type:app': 'vue-tsc -p tsconfig.app.json --noEmit',\n };\n\n describe('resolveLayoutExtension', () => {\n test('uses .ts inside an ESM package', () => {\n expect(resolveLayoutExtension(makeDir('{\"type\":\"module\"}'))).toBe('ts');\n });\n\n test('uses .mts when the manifest declares no type', () => {\n expect(resolveLayoutExtension(makeDir('{\"name\":\"app\"}'))).toBe('mts');\n });\n\n test('uses .mts when there is no manifest at all', () => {\n expect(resolveLayoutExtension(makeDir())).toBe('mts');\n });\n\n test('uses .mts when the manifest is unparseable', () => {\n expect(resolveLayoutExtension(makeDir('{'))).toBe('mts');\n });\n });\n\n describe('resolveLintLayout', () => {\n test('derives all three filenames from the package type', () => {\n const layout = resolveLintLayout(makeDir('{\"type\":\"module\"}'));\n\n expect(layout.lintModule).toBe('insider.lint.ts');\n expect(layout.oxlintConfig).toBe('oxlint.config.ts');\n expect(layout.eslintConfig).toBe('eslint.config.ts');\n expect(layout.replacedEslintConfigs).toStrictEqual([]);\n });\n\n test.each(['js', 'mjs', 'cjs'])(\n 'renames an existing eslint.config.%s, which cannot import the lint module on Node 20',\n extension => {\n const directory = makeDir('{\"type\":\"module\"}', {\n [`eslint.config.${extension}`]: 'export default [];\\n',\n });\n const layout = resolveLintLayout(directory);\n\n expect(layout.eslintConfig).toBe('eslint.config.ts');\n expect(layout.replacedEslintConfigs).toStrictEqual([`eslint.config.${extension}`]);\n }\n );\n\n test.each(['ts', 'mts', 'cts'])('keeps an existing eslint.config.%s, which jiti loads', extension => {\n const directory = makeDir('{\"type\":\"module\"}', {\n [`eslint.config.${extension}`]: 'export default [];\\n',\n });\n const layout = resolveLintLayout(directory);\n\n expect(layout.eslintConfig).toBe(`eslint.config.${extension}`);\n expect(layout.replacedEslintConfigs).toStrictEqual([]);\n });\n\n test('supersedes a JavaScript config that survived beside a TypeScript one', () => {\n const directory = makeDir('{\"type\":\"module\"}', {\n 'eslint.config.mjs': 'export default [];\\n',\n 'eslint.config.mts': 'export default [];\\n',\n });\n const layout = resolveLintLayout(directory);\n\n expect(layout.eslintConfig).toBe('eslint.config.mts');\n expect(layout.replacedEslintConfigs).toStrictEqual(['eslint.config.mjs']);\n });\n\n test('supersedes every JavaScript config in the directory, not just the first one', () => {\n const directory = makeDir('{\"type\":\"module\"}', {\n 'eslint.config.cjs': 'module.exports = [];\\n',\n 'eslint.config.js': 'module.exports = [];\\n',\n 'eslint.config.mjs': 'export default [];\\n',\n });\n const layout = resolveLintLayout(directory);\n\n expect(layout.eslintConfig).toBe('eslint.config.ts');\n expect([...layout.replacedEslintConfigs].sort((a, b) => a.localeCompare(b))).toStrictEqual([\n 'eslint.config.cjs',\n 'eslint.config.js',\n 'eslint.config.mjs',\n ]);\n });\n\n test('uses the .mts config name in a package that declares no type', () => {\n expect(resolveLintLayout(makeDir('{\"name\":\"app\"}')).eslintConfig).toBe('eslint.config.mts');\n });\n });\n\n describe('renderLintLayoutFiles', () => {\n test('imports the lint module by its real extension', () => {\n const layout = resolveLintLayout(makeDir('{\"name\":\"app\"}'));\n const [eslintFile, oxlintFile] = renderLintLayoutFiles(layout);\n\n expect(eslintFile.source).toContain(\"from './insider.lint.mts'\");\n expect(oxlintFile.source).toContain(\"from './insider.lint.mts'\");\n });\n\n test('awaits the oxlint renderer and calls the ESLint one directly', () => {\n const [eslintFile, oxlintFile] = renderLintLayoutFiles(resolveLintLayout(makeDir()));\n\n expect(eslintFile.source).toContain('export default useInsiderESLint();');\n expect(oxlintFile.source).toContain('export default await useInsiderOXC();');\n });\n });\n\n describe('invokesBinary', () => {\n test.each([\n 'eslint .',\n 'NODE_OPTIONS=--max-old-space-size=6144 eslint .',\n 'npx eslint .',\n 'pnpm exec eslint .',\n 'cross-env NODE_ENV=test eslint src',\n './node_modules/.bin/eslint .',\n 'tsc --noEmit && eslint .',\n ])('sees the eslint invocation in %j', command => {\n expect(invokesBinary(command, 'eslint')).toBe(true);\n });\n\n test.each([\n 'npm run lint:es-ci -- --cache',\n 'run-p lint:type lint:es lint:style',\n 'vue-tsc -p tsconfig.app.json --noEmit',\n 'stylelint \"src/**/*.css\"',\n 'echo eslint-config',\n ])('does not see an eslint invocation in %j', command => {\n expect(invokesBinary(command, 'eslint')).toBe(false);\n });\n\n test('distinguishes oxlint from eslint', () => {\n expect(invokesBinary(OXLINT_LINT_SCRIPT, 'oxlint')).toBe(true);\n expect(invokesBinary('eslint .', 'oxlint')).toBe(false);\n });\n\n test('returns false for a segment made only of assignments', () => {\n expect(invokesBinary('FOO=1', 'eslint')).toBe(false);\n });\n });\n\n describe('isAggregateScript', () => {\n test.each([\n 'run-p lint:type lint:es lint:style',\n 'run-s a b',\n 'npm-run-all --parallel a b',\n 'npm run lint:es-ci -- --cache',\n 'pnpm run build',\n 'concurrently \"npm:a\" \"npm:b\"',\n ])('recognizes %j as an aggregate', command => {\n expect(isAggregateScript(command)).toBe(true);\n });\n\n test.each(['eslint .', 'oxlint --disable-nested-config && eslint .'])(\n 'does not treat %j as an aggregate',\n command => {\n expect(isAggregateScript(command)).toBe(false);\n }\n );\n });\n\n describe('setLintScript', () => {\n test('passes --disable-nested-config so a nested consumer config cannot abort the run', () => {\n expect(OXLINT_LINT_SCRIPT).toContain('--disable-nested-config');\n });\n\n test('prepends to an ESLint-only lint script', () => {\n const result = setLintScript('{\\n \"scripts\": {\\n \"lint\": \"eslint .\"\\n }\\n}');\n\n expect(result.changed).toBe(true);\n expect(result.changes).toStrictEqual([\n { script: 'lint', previous: 'eslint .', next: OXLINT_LINT_SCRIPT },\n ]);\n expect(parseScripts(result.manifest).lint).toBe(OXLINT_LINT_SCRIPT);\n });\n\n test('leaves a composed lint script alone and targets the script that runs eslint', () => {\n const result = setLintScript(JSON.stringify({ scripts: COMPOSED_SCRIPTS }, null, 2));\n const scripts = parseScripts(result.manifest);\n\n expect(result.changes).toStrictEqual([{\n script: 'lint:es-ci',\n previous: 'NODE_OPTIONS=--max-old-space-size=6144 eslint .',\n next: `${OXLINT_COMMAND} && NODE_OPTIONS=--max-old-space-size=6144 eslint .`,\n }]);\n expect(scripts.lint).toBe('run-p lint:type lint:es lint:style');\n expect(scripts['lint:style']).toBe('npm run lint:style-ci -- --cache');\n expect(scripts['lint:type']).toBe('run-p lint:type:app lint:type:test lint:type:node');\n });\n\n test('keeps a `--` passthrough landing on eslint by prepending rather than appending', () => {\n const result = setLintScript(JSON.stringify({ scripts: COMPOSED_SCRIPTS }));\n const rewritten = parseScripts(result.manifest)['lint:es-ci'];\n\n expect(`${rewritten} --cache`.endsWith('eslint . --cache')).toBe(true);\n });\n\n test('preserves the previous command verbatim inside the new one', () => {\n const result = setLintScript('{\"scripts\":{\"lint:es\":\"eslint . --max-warnings 0\"}}');\n\n expect(parseScripts(result.manifest)['lint:es'])\n .toBe(`${OXLINT_COMMAND} && eslint . --max-warnings 0`);\n });\n\n test('passes --fix through to oxlint for a fixing script', () => {\n const result = setLintScript('{\"scripts\":{\"lint:fix\":\"eslint . --fix\"}}');\n\n expect(parseScripts(result.manifest)['lint:fix'])\n .toBe(`${OXLINT_COMMAND} --fix && eslint . --fix`);\n });\n\n // Prepending to every script that runs ESLint made oxlint run once per entry point — three\n // times over the same tree for a repo with `lint`, `lint:fix` and `lint:ci`.\n test('rewrites one script only, and reports the siblings it left alone', () => {\n const result = setLintScript(JSON.stringify({\n scripts: {\n lint: 'eslint .',\n 'lint:fix': 'eslint . --fix',\n 'lint:ci': 'eslint . -f json -o report.json',\n },\n }));\n const scripts = parseScripts(result.manifest);\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint']);\n expect(scripts.lint).toBe(OXLINT_LINT_SCRIPT);\n expect(scripts['lint:fix']).toBe('eslint . --fix');\n expect(scripts['lint:ci']).toBe('eslint . -f json -o report.json');\n expect(result.skipped.map(candidate => candidate.script))\n .toStrictEqual(['lint:fix', 'lint:ci']);\n });\n\n test('prefers the entry point named `lint` over a shorter sibling', () => {\n const result = setLintScript('{\"scripts\":{\"es\":\"eslint .\",\"lint\":\"eslint .\"}}');\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint']);\n expect(result.skipped.map(candidate => candidate.script)).toStrictEqual(['es']);\n });\n\n test('prefers what `lint` delegates to over an unrelated entry point', () => {\n const result = setLintScript(JSON.stringify({\n scripts: {\n check: 'eslint src',\n lint: 'run-p lint:style lint:es',\n 'lint:es': 'eslint .',\n 'lint:style': 'stylelint \"src/**/*.css\"',\n },\n }));\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:es']);\n });\n\n test('prefers the non-fixing script when no entry point is named `lint`', () => {\n const result = setLintScript('{\"scripts\":{\"fix\":\"eslint . --fix\",\"lint:es\":\"eslint .\"}}');\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:es']);\n expect(result.skipped.map(candidate => candidate.script)).toStrictEqual(['fix']);\n });\n\n test('breaks a tie on the script name, so the pick does not depend on key order', () => {\n const result = setLintScript('{\"scripts\":{\"lint:b\":\"eslint .\",\"lint:a\":\"eslint .\"}}');\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:a']);\n });\n\n test('still targets the composed leaf rather than the `lint` entry point itself', () => {\n const result = setLintScript(JSON.stringify({\n scripts: { ...COMPOSED_SCRIPTS, 'lint:fix': 'eslint . --fix' },\n }));\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:es-ci']);\n expect(result.skipped.map(candidate => candidate.script)).toStrictEqual(['lint:fix']);\n });\n\n test('follows a `concurrently` fan-out to the leaf it names', () => {\n const result = setLintScript(JSON.stringify({\n scripts: {\n lint: 'concurrently \"npm:lint:es\" \"npm:lint:style\"',\n 'lint:es': 'eslint .',\n 'lint:style': 'stylelint \"src/**/*.css\"',\n 'lint:fix': 'eslint . --fix',\n },\n }));\n\n expect(result.changes.map(change => change.script)).toStrictEqual(['lint:es']);\n });\n\n test('reports nothing skipped when a single script runs eslint', () => {\n expect(setLintScript('{\"scripts\":{\"lint\":\"eslint .\"}}').skipped).toStrictEqual([]);\n });\n\n test('adds a lint script when the manifest has none', () => {\n const result = setLintScript('{\"name\":\"app\"}');\n\n expect(parseScripts(result.manifest).lint).toBe(OXLINT_LINT_SCRIPT);\n expect(result.changes[0].previous).toBe('');\n });\n\n test('leaves a script that already runs oxlint alone', () => {\n const raw = '{\"scripts\":{\"lint\":\"oxlint && eslint . --max-warnings 0\"}}';\n\n expect(setLintScript(raw)).toStrictEqual({\n manifest: raw,\n changed: false,\n changes: [],\n alreadyRunsOxlint: ['lint'],\n skipped: [],\n });\n });\n\n test('never replaces a lint script that runs neither linter; reports the conflict instead', () => {\n const raw = '{\"scripts\":{\"lint\":\"biome check .\"}}';\n const result = setLintScript(raw);\n\n expect(result.changed).toBe(false);\n expect(result.manifest).toBe(raw);\n expect(result.unresolved).toStrictEqual({\n reason: 'lint-script-runs-neither',\n script: 'lint',\n previous: 'biome check .',\n });\n });\n\n test('never replaces a composed lint script whose leaves do not run eslint', () => {\n const raw = '{\"scripts\":{\"lint\":\"run-p lint:type lint:style\",\"lint:type\":\"vue-tsc --noEmit\"}}';\n\n expect(setLintScript(raw).unresolved?.previous).toBe('run-p lint:type lint:style');\n });\n\n test('leaves an unparseable manifest untouched', () => {\n expect(setLintScript('{').changed).toBe(false);\n });\n\n test('preserves the manifest indentation', () => {\n const result = setLintScript('{\\n \"scripts\": {\\n \"lint\": \"eslint .\"\\n }\\n}');\n\n expect(result.manifest).toContain('\\n \"scripts\"');\n });\n\n test('falls back to two spaces when the manifest indents nothing', () => {\n const result = setLintScript('{\\n\"scripts\":{\"lint\":\"eslint .\"}\\n}');\n\n expect(result.manifest).toContain('{\\n \"scripts\": {\\n \"lint\": \"');\n });\n\n test('keeps the original script order', () => {\n const result = setLintScript(JSON.stringify({ scripts: COMPOSED_SCRIPTS }));\n\n expect(Object.keys(parseScripts(result.manifest))).toStrictEqual(Object.keys(COMPOSED_SCRIPTS));\n });\n });\n\n describe('formatSkippedLintScripts', () => {\n test('names each untouched script with the prefix it would need', () => {\n const report = formatSkippedLintScripts(setLintScript(JSON.stringify({\n scripts: { lint: 'eslint .', 'lint:fix': 'eslint . --fix' },\n })).skipped);\n\n expect(report).toBe(`lint:fix\\n prefix with: ${OXLINT_COMMAND} --fix && `);\n });\n\n test('renders nothing when every ESLint script was handled', () => {\n expect(formatSkippedLintScripts([])).toBe('');\n });\n });\n\n describe('formatLintScriptChanges', () => {\n test('reports both sides of every rewrite', () => {\n const report = formatLintScriptChanges(setLintScript(\n JSON.stringify({ scripts: COMPOSED_SCRIPTS })\n ).changes);\n\n expect(report).toContain('lint:es-ci');\n expect(report).toContain('before: NODE_OPTIONS=--max-old-space-size=6144 eslint .');\n expect(report).toContain(`after: ${OXLINT_COMMAND} && NODE_OPTIONS=`);\n });\n\n test('names an added script explicitly instead of showing an empty before', () => {\n expect(formatLintScriptChanges(setLintScript('{}').changes)).toContain('before: (no such script)');\n });\n });\n}\n","export function quote (value: string): string {\n // JSON.stringify already escapes backslashes and control characters; only the quoting style\n // has to be converted from double to single so the result is a valid JS string literal.\n const escaped = JSON.stringify(value)\n .slice(1, -1)\n .replace(/\\\\\"/g, '\"')\n .replace(/'/g, \"\\\\'\");\n\n return `'${escaped}'`;\n}\n","import { quote } from './quote';\n\nexport type ProjectType = 'backend' | 'browser' | 'hybrid';\n\nexport type Language = 'javascript' | 'typescript';\n\nexport type Languages = Language[];\n\nexport type Framework = 'vanilla' | 'vue';\n\nexport type VueMajor = 2 | 3;\n\nexport type VueApiStyle = 'options' | 'composition' | 'hybrid';\n\nexport type TestFramework = 'vitest' | 'jest' | 'none';\n\nexport type TsconfigRole = 'app' | 'test' | 'config';\n\nexport interface TsconfigRoleEntry {\n path: string;\n role: TsconfigRole;\n}\n\nexport interface TsconfigPlan {\n referencesOnly: boolean;\n entries: TsconfigRoleEntry[];\n}\n\nexport type VueHybridDefaultApi = 'composition' | 'options';\n\nexport interface VueHybridSuffixPlan {\n defaultApi: VueHybridDefaultApi;\n suffix: string;\n}\n\nexport interface VueHybridSuffixChoice {\n value: string;\n label: string;\n}\n\nconst COMPOSITION_DEFAULT_SUFFIX_CHOICES: readonly VueHybridSuffixChoice[] = [\n { value: '.options.vue', label: '*.options.vue' },\n { value: '.classic.vue', label: '*.classic.vue' },\n { value: '.legacy.vue', label: '*.legacy.vue' },\n];\n\nconst OPTIONS_DEFAULT_SUFFIX_CHOICES: readonly VueHybridSuffixChoice[] = [\n { value: '.composition.vue', label: '*.composition.vue' },\n { value: '.setup.vue', label: '*.setup.vue' },\n { value: '.modern.vue', label: '*.modern.vue' },\n];\n\nexport function getHybridSuffixChoices (defaultApi: VueHybridDefaultApi): readonly VueHybridSuffixChoice[] {\n return defaultApi === 'composition'\n ? COMPOSITION_DEFAULT_SUFFIX_CHOICES\n : OPTIONS_DEFAULT_SUFFIX_CHOICES;\n}\n\nexport function getHybridDefaultSuffix (defaultApi: VueHybridDefaultApi): string {\n return getHybridSuffixChoices(defaultApi)[0].value;\n}\n\nexport interface CliAnswers {\n projectType: ProjectType;\n languages: Languages;\n framework?: Framework;\n vueMajor?: VueMajor;\n vueApiStyle?: VueApiStyle;\n vueHybridSuffix?: VueHybridSuffixPlan;\n testFramework: TestFramework;\n extras: { jquery: boolean };\n tsconfig?: TsconfigPlan;\n}\n\ntype AppScope = | 'javascript'\n | 'javascriptDom'\n | 'javascriptNode'\n | 'typescript'\n | 'typescriptDom'\n | 'typescriptNode'\n | 'vue2'\n | 'vue3'\n | 'vue2Typescript'\n | 'vue3Typescript'\n | 'vue2OptionsApi'\n | 'vue3OptionsApi'\n | 'vue2TypescriptOptionsApi'\n | 'vue3TypescriptOptionsApi';\n\ntype TestScope = 'jest' | 'vitest';\n\ntype ExtraScope = 'jquery';\n\ninterface ScopeEntry {\n files: string[];\n ignores?: string[];\n tsconfigPaths?: string[];\n}\n\ninterface ScopedConfig {\n scope: AppScope | TestScope | ExtraScope | 'typescriptNode';\n entry: ScopeEntry;\n}\n\nconst indent = ' ';\n\nfunction hasJavascript (languages: Languages): boolean {\n return languages.includes('javascript');\n}\n\nfunction hasTypescript (languages: Languages): boolean {\n return languages.includes('typescript');\n}\n\nfunction isVueBrowserLike (answers: CliAnswers): boolean {\n return answers.framework === 'vue' && answers.projectType !== 'backend';\n}\n\nfunction isVueOptionsApi (answers: CliAnswers): boolean {\n return answers.vueApiStyle === 'options';\n}\n\nfunction isVueHybridApi (answers: CliAnswers): boolean {\n return answers.vueApiStyle === 'hybrid';\n}\n\nfunction vueJsScope (major: VueMajor, api: 'composition' | 'options'): AppScope {\n if (major === 2) {\n return api === 'options' ? 'vue2OptionsApi' : 'vue2';\n }\n\n return api === 'options' ? 'vue3OptionsApi' : 'vue3';\n}\n\nfunction vueTsScope (major: VueMajor, api: 'composition' | 'options'): AppScope {\n if (major === 2) {\n return api === 'options' ? 'vue2TypescriptOptionsApi' : 'vue2Typescript';\n }\n\n return api === 'options' ? 'vue3TypescriptOptionsApi' : 'vue3Typescript';\n}\n\nfunction jsAppScopes (answers: CliAnswers): AppScope[] {\n if (isVueBrowserLike(answers) && !hasTypescript(answers.languages)) {\n const major = answers.vueMajor ?? 3;\n\n return [vueJsScope(major, isVueOptionsApi(answers) ? 'options' : 'composition')];\n }\n\n if (answers.projectType === 'backend') {\n return ['javascriptNode'];\n }\n\n if (answers.projectType === 'hybrid') {\n return ['javascriptNode', 'javascriptDom'];\n }\n\n return ['javascriptDom'];\n}\n\nfunction tsAppScopes (answers: CliAnswers): AppScope[] {\n if (isVueBrowserLike(answers)) {\n const major = answers.vueMajor ?? 3;\n\n return [vueTsScope(major, isVueOptionsApi(answers) ? 'options' : 'composition')];\n }\n\n if (answers.projectType === 'backend') {\n return ['typescriptNode'];\n }\n\n if (answers.projectType === 'hybrid') {\n return ['typescriptNode', 'typescriptDom'];\n }\n\n return ['typescriptDom'];\n}\n\nfunction jsAppFiles (answers: CliAnswers): string[] {\n const vue = isVueBrowserLike(answers);\n\n if (vue && !hasTypescript(answers.languages)) {\n return ['**/*.{js,jsx,cjs,mjs,vue}'];\n }\n\n return ['**/*.{js,jsx,cjs,mjs}'];\n}\n\nexport function normalizeHybridSuffix (raw: string): string {\n const trimmed = raw.trim();\n const withDot = trimmed.startsWith('.') ? trimmed : `.${trimmed}`;\n\n return withDot.endsWith('.vue') ? withDot : `${withDot}.vue`;\n}\n\nfunction tsAppFiles (answers: CliAnswers, scoped: 'app' | 'all'): string[] {\n const vue = isVueBrowserLike(answers);\n const prefix = scoped === 'app' ? 'src/**/*' : '**/*';\n\n if (vue) {\n return [`${prefix}.{ts,tsx,vue}`];\n }\n\n return [`${prefix}.{ts,tsx}`];\n}\n\nfunction testFilesGlob (languages: Languages): string[] {\n const ts = hasTypescript(languages);\n const js = hasJavascript(languages);\n\n if (ts && js) {\n return ['**/*.{test,spec}.{ts,tsx,js,jsx}'];\n }\n\n if (ts) {\n return ['**/*.{test,spec}.{ts,tsx}'];\n }\n\n return ['**/*.{test,spec}.{js,jsx}'];\n}\n\nfunction jqueryFilesGlob (answers: CliAnswers): string[] {\n const vue = isVueBrowserLike(answers);\n const ts = hasTypescript(answers.languages);\n const js = hasJavascript(answers.languages);\n\n if (vue) {\n if (ts && js) {\n return ['**/*.{ts,tsx,js,jsx,cjs,mjs,vue}'];\n }\n\n if (ts) {\n return ['**/*.{ts,tsx,vue}'];\n }\n\n return ['**/*.{js,jsx,cjs,mjs,vue}'];\n }\n\n if (ts && js) {\n return ['**/*.{ts,tsx,js,jsx,cjs,mjs}'];\n }\n\n if (ts) {\n return ['**/*.{ts,tsx}'];\n }\n\n return ['**/*.{js,jsx,cjs,mjs}'];\n}\n\nfunction jsRootConfigFiles (): string[] {\n return ['*.js', '*.cjs', '*.mjs'];\n}\n\nfunction tsRootConfigFiles (): string[] {\n return ['*.ts', '*.cts', '*.mts'];\n}\n\nfunction findRole (plan: TsconfigPlan, role: TsconfigRole): TsconfigRoleEntry | undefined {\n return plan.entries.find(entry => entry.role === role);\n}\n\nfunction isHybridVueJsContext (answers: CliAnswers): boolean {\n return isVueBrowserLike(answers)\n && isVueHybridApi(answers)\n && !hasTypescript(answers.languages)\n && Boolean(answers.vueHybridSuffix);\n}\n\nfunction isHybridVueTsContext (answers: CliAnswers): boolean {\n return isVueBrowserLike(answers)\n && isVueHybridApi(answers)\n && hasTypescript(answers.languages)\n && Boolean(answers.vueHybridSuffix);\n}\n\nfunction buildHybridVueJsBlocks (answers: CliAnswers): ScopedConfig[] | null {\n if (!isHybridVueJsContext(answers) || !answers.vueHybridSuffix) {\n return null;\n }\n\n const major = answers.vueMajor ?? 3;\n const { defaultApi, suffix: rawSuffix } = answers.vueHybridSuffix;\n const suffix = normalizeHybridSuffix(rawSuffix);\n const targetGlob = `**/*${suffix}`;\n const nonDefaultApi: VueHybridDefaultApi = defaultApi === 'composition' ? 'options' : 'composition';\n const defaultEntry: ScopeEntry = {\n files: ['**/*.{js,jsx,cjs,mjs,vue}'],\n ignores: [targetGlob],\n };\n\n return [\n { scope: vueJsScope(major, defaultApi), entry: defaultEntry },\n { scope: vueJsScope(major, nonDefaultApi), entry: { files: [targetGlob] } },\n ];\n}\n\nfunction makeHybridTsEntries (\n answers: CliAnswers,\n suffix: string,\n appEntry: TsconfigRoleEntry | undefined\n): { defaultEntry: ScopeEntry; targetEntry: ScopeEntry } {\n const targetGlob = `**/*${suffix}`;\n const useAppGlob = answers.tsconfig?.referencesOnly === true && Boolean(appEntry);\n const baseFiles = tsAppFiles(answers, useAppGlob ? 'app' : 'all');\n const tsconfigPaths = appEntry ? [appEntry.path] : undefined;\n const defaultEntry: ScopeEntry = { files: baseFiles, ignores: [targetGlob] };\n const targetEntry: ScopeEntry = { files: [targetGlob] };\n\n if (tsconfigPaths) {\n defaultEntry.tsconfigPaths = tsconfigPaths;\n targetEntry.tsconfigPaths = tsconfigPaths;\n }\n\n return { defaultEntry, targetEntry };\n}\n\nfunction buildHybridVueTsBlocks (\n answers: CliAnswers,\n appEntry: TsconfigRoleEntry | undefined\n): ScopedConfig[] | null {\n if (!isHybridVueTsContext(answers) || !answers.vueHybridSuffix) {\n return null;\n }\n\n const major = answers.vueMajor ?? 3;\n const { defaultApi, suffix: rawSuffix } = answers.vueHybridSuffix;\n const suffix = normalizeHybridSuffix(rawSuffix);\n const nonDefaultApi: VueHybridDefaultApi = defaultApi === 'composition' ? 'options' : 'composition';\n const { defaultEntry, targetEntry } = makeHybridTsEntries(answers, suffix, appEntry);\n\n return [\n { scope: vueTsScope(major, defaultApi), entry: defaultEntry },\n { scope: vueTsScope(major, nonDefaultApi), entry: targetEntry },\n ];\n}\n\nfunction buildJsAppBlocks (answers: CliAnswers): ScopedConfig[] {\n if (!hasJavascript(answers.languages)) {\n return [];\n }\n\n const hybridBlocks = buildHybridVueJsBlocks(answers);\n\n if (hybridBlocks) {\n return hybridBlocks;\n }\n\n const files = jsAppFiles(answers);\n\n return jsAppScopes(answers).map(scope => ({ scope, entry: { files } }));\n}\n\nfunction buildTsAppBlocks (answers: CliAnswers, appEntry: TsconfigRoleEntry | undefined): ScopedConfig[] {\n if (!hasTypescript(answers.languages)) {\n return [];\n }\n\n const hybridBlocks = buildHybridVueTsBlocks(answers, appEntry);\n\n if (hybridBlocks) {\n return hybridBlocks;\n }\n\n const useAppGlob = answers.tsconfig?.referencesOnly === true && Boolean(appEntry);\n const files = tsAppFiles(answers, useAppGlob ? 'app' : 'all');\n\n return tsAppScopes(answers).map(scope => {\n const entry: ScopeEntry = { files };\n\n if (appEntry) {\n entry.tsconfigPaths = [appEntry.path];\n }\n\n return { scope, entry };\n });\n}\n\nfunction tsConfigPathsForRoot (\n appEntry: TsconfigRoleEntry | undefined,\n configEntry: TsconfigRoleEntry | undefined\n): string[] | undefined {\n if (configEntry) {\n return [configEntry.path];\n }\n\n if (appEntry) {\n return [appEntry.path];\n }\n\n return undefined;\n}\n\nfunction buildRootConfigBlocks (\n answers: CliAnswers,\n appEntry: TsconfigRoleEntry | undefined,\n configEntry: TsconfigRoleEntry | undefined\n): ScopedConfig[] {\n const blocks: ScopedConfig[] = [\n { scope: 'javascriptNode', entry: { files: jsRootConfigFiles() } },\n ];\n\n if (hasTypescript(answers.languages)) {\n const entry: ScopeEntry = { files: tsRootConfigFiles() };\n const tsconfigPaths = tsConfigPathsForRoot(appEntry, configEntry);\n\n if (tsconfigPaths) {\n entry.tsconfigPaths = tsconfigPaths;\n }\n\n blocks.push({ scope: 'typescriptNode', entry });\n }\n\n return blocks;\n}\n\nfunction buildTestBlock (answers: CliAnswers, testEntry: TsconfigRoleEntry | undefined): ScopedConfig | null {\n if (answers.testFramework === 'none') {\n return null;\n }\n\n const entry: ScopeEntry = {\n files: testFilesGlob(answers.languages),\n };\n\n if (hasTypescript(answers.languages) && testEntry) {\n entry.tsconfigPaths = [testEntry.path];\n }\n\n return { scope: answers.testFramework, entry };\n}\n\nfunction buildJqueryBlock (answers: CliAnswers): ScopedConfig | null {\n if (!answers.extras.jquery) {\n return null;\n }\n\n return {\n scope: 'jquery',\n entry: { files: jqueryFilesGlob(answers) },\n };\n}\n\nfunction buildScopedConfigs (answers: CliAnswers): ScopedConfig[] {\n const plan = answers.tsconfig;\n const referencesOnly = plan?.referencesOnly === true;\n const appEntry = plan ? findRole(plan, 'app') : undefined;\n const configEntry = referencesOnly ? findRole(plan, 'config') : undefined;\n const testEntry = referencesOnly ? findRole(plan, 'test') : appEntry;\n const testBlock = buildTestBlock(answers, testEntry);\n const jqueryBlock = buildJqueryBlock(answers);\n const tail: (ScopedConfig | null)[] = [testBlock, jqueryBlock];\n\n return [\n ...buildRootConfigBlocks(answers, appEntry, configEntry),\n ...buildJsAppBlocks(answers),\n ...buildTsAppBlocks(answers, appEntry),\n ...tail.filter((block): block is ScopedConfig => block !== null),\n ];\n}\n\nfunction mergeByScope (blocks: ScopedConfig[]): Map<string, ScopeEntry[]> {\n return blocks.reduce<Map<string, ScopeEntry[]>>((merged, { scope, entry }) => {\n const existing = merged.get(scope);\n\n if (existing) {\n existing.push(entry);\n } else {\n merged.set(scope, [entry]);\n }\n\n return merged;\n }, new Map());\n}\n\nfunction formatStringArray (values: string[]): string {\n const joined = values.map(quote).join(', ');\n\n return `[${joined}]`;\n}\n\nfunction formatEntry (entry: ScopeEntry, baseIndent: string): string {\n const filesLine = `files: ${formatStringArray(entry.files)}`;\n const ignoresLine = entry.ignores ? `ignores: ${formatStringArray(entry.ignores)}` : null;\n const tsconfigLine = entry.tsconfigPaths\n ? `tsconfigPaths: ${formatStringArray(entry.tsconfigPaths)}`\n : null;\n\n if (!ignoresLine && !tsconfigLine) {\n return `${baseIndent}{ ${filesLine} },`;\n }\n\n const childIndent = `${baseIndent}${indent}`;\n const lines: string[] = [`${baseIndent}{`, `${childIndent}${filesLine},`];\n\n if (ignoresLine) {\n lines.push(`${childIndent}${ignoresLine},`);\n }\n\n if (tsconfigLine) {\n lines.push(`${childIndent}${tsconfigLine},`);\n }\n\n lines.push(`${baseIndent}},`);\n\n return lines.join('\\n');\n}\n\nfunction formatScope (scope: string, entries: ScopeEntry[], baseIndent: string): string {\n const childIndent = `${baseIndent}${indent}`;\n const entryLines = entries.map(entry => formatEntry(entry, childIndent));\n\n return [\n `${baseIndent}${scope}: [`,\n ...entryLines,\n `${baseIndent}],`,\n ].join('\\n');\n}\n\nfunction renderUseInsiderBody (merged: Map<string, ScopeEntry[]>): string {\n return [...merged.entries()]\n .map(([scope, entries]) => formatScope(scope, entries, indent))\n .join('\\n');\n}\n\n/**\n * Body of the generated `insider.lint.*` module — the one file that calls `useInsider()` and the\n * only one both linter configs import.\n * @example\n * renderLintModuleFile(answers); // \"…export const { useInsiderESLint, useInsiderOXC } = useInsider({…\"\n */\nexport function renderLintModuleFile (answers: CliAnswers): string {\n const blocks = buildScopedConfigs(answers);\n const merged = mergeByScope(blocks);\n const useInsiderBody = renderUseInsiderBody(merged);\n\n const lines: string[] = [\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export const { useInsiderESLint, useInsiderOXC } = useInsider({',\n useInsiderBody,\n '});',\n '',\n ];\n\n return lines.join('\\n');\n}\n","import type {\n CliAnswers,\n Framework,\n Language,\n Languages,\n ProjectType,\n TestFramework,\n TsconfigPlan,\n TsconfigRole,\n TsconfigRoleEntry,\n VueApiStyle,\n VueHybridDefaultApi,\n VueMajor,\n} from './template';\nimport { getHybridDefaultSuffix, getHybridSuffixChoices } from './template';\n\ninterface SelectOption<Item> {\n value: Item;\n label: string;\n hint?: string;\n}\n\ninterface SelectOpts<Item> {\n message: string;\n options: SelectOption<Item>[];\n initialValue?: Item;\n}\n\ninterface ConfirmOpts {\n message: string;\n initialValue?: boolean;\n}\n\ninterface MultiselectOpts<Item> {\n message: string;\n options: SelectOption<Item>[];\n required: boolean;\n initialValues?: Item[];\n}\n\nexport interface ClackLike {\n intro: (message: string) => void;\n outro: (message: string) => void;\n cancel: (message: string) => void;\n isCancel: (value: unknown) => boolean;\n select: <Item>(opts: SelectOpts<Item>) => Promise<Item | symbol>;\n confirm: (opts: ConfirmOpts) => Promise<boolean | symbol>;\n multiselect: <Item>(opts: MultiselectOpts<Item>) => Promise<Item[] | symbol>;\n note?: (message: string, title?: string) => void;\n}\n\nclass CliCancelledError extends Error {\n constructor (message: string) {\n super(message);\n this.name = 'CliCancelledError';\n }\n}\n\nasync function loadClack (): Promise<ClackLike> {\n const mod = await import('@clack/prompts');\n\n return mod as unknown as ClackLike;\n}\n\nfunction bail (clack: ClackLike, message: string): never {\n clack.cancel(message);\n\n throw new CliCancelledError(message);\n}\n\nfunction ensure<Item> (clack: ClackLike, value: Item | symbol): Item {\n if (clack.isCancel(value)) {\n bail(clack, 'Cancelled.');\n }\n\n return value as Item;\n}\n\nasync function askProjectType (clack: ClackLike, initial: ProjectType = 'backend'): Promise<ProjectType> {\n const result = await clack.select<ProjectType>({\n message: 'What kind of project are you setting up?',\n options: [\n { value: 'backend', label: 'Backend / Node.js' },\n { value: 'browser', label: 'Browser / frontend' },\n { value: 'hybrid', label: 'Hybrid', hint: 'Node + browser (isomorphic, SSR, full-stack)' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nasync function askLanguages (clack: ClackLike, initial: Languages = ['typescript']): Promise<Languages> {\n const selection = await clack.multiselect<Language>({\n message: 'Which languages will the project use? (press space to toggle, enter to confirm)',\n options: [\n { value: 'javascript', label: 'JavaScript' },\n { value: 'typescript', label: 'TypeScript' },\n ],\n required: true,\n initialValues: initial,\n });\n const picked = ensure(clack, selection);\n\n if (picked.length === 0) {\n bail(clack, 'At least one language must be selected.');\n }\n\n return picked;\n}\n\nasync function askFramework (clack: ClackLike, initial: Framework = 'vanilla'): Promise<Framework> {\n const result = await clack.select<Framework>({\n message: 'Which frontend framework?',\n options: [\n { value: 'vanilla', label: 'None / Vanilla' },\n { value: 'vue', label: 'Vue' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nasync function askVueMajor (clack: ClackLike, initial: VueMajor = 3): Promise<VueMajor> {\n const result = await clack.select<VueMajor>({\n message: 'Which Vue major version?',\n options: [\n { value: 3, label: 'Vue 3' },\n { value: 2, label: 'Vue 2' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nasync function askVueApiStyle (\n clack: ClackLike,\n initial: VueApiStyle = 'composition'\n): Promise<VueApiStyle> {\n const result = await clack.select<VueApiStyle>({\n message: 'What API style does your Vue codebase use?',\n options: [\n { value: 'composition', label: 'Composition API (setup)' },\n { value: 'options', label: 'Options API' },\n { value: 'hybrid', label: 'Hybrid (both)' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport async function askHybridProceedWithSuffix (\n clack: ClackLike,\n initial = true\n): Promise<boolean> {\n const result = await clack.confirm({\n message: 'Want me to scaffold both Options + Composition blocks using a filename suffix convention?',\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport async function askVueHybridDefaultApi (\n clack: ClackLike,\n initial: VueHybridDefaultApi = 'composition'\n): Promise<VueHybridDefaultApi> {\n const result = await clack.select<VueHybridDefaultApi>({\n message: 'Which API style is the default in your codebase?',\n options: [\n { value: 'composition', label: 'Composition API (setup)' },\n { value: 'options', label: 'Options API' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport async function askHybridSuffix (\n clack: ClackLike,\n defaultApi: VueHybridDefaultApi,\n initial?: string\n): Promise<string> {\n const choices = getHybridSuffixChoices(defaultApi);\n const message = defaultApi === 'composition'\n ? 'Pick a suffix for Options-API components:'\n : 'Pick a suffix for Composition-API components:';\n const fallback = getHybridDefaultSuffix(defaultApi);\n const initialValue = initial && choices.some(choice => choice.value === initial) ? initial : fallback;\n\n const result = await clack.select<string>({\n message,\n options: choices.map(choice => ({ value: choice.value, label: choice.label })),\n initialValue,\n });\n\n return ensure(clack, result);\n}\n\nasync function askTestFramework (clack: ClackLike, initial: TestFramework = 'vitest'): Promise<TestFramework> {\n const result = await clack.select<TestFramework>({\n message: 'Which testing framework?',\n options: [\n { value: 'vitest', label: 'Vitest' },\n { value: 'jest', label: 'Jest' },\n { value: 'none', label: 'None' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nasync function askExtras (\n clack: ClackLike,\n initial: { jquery: boolean } = { jquery: false }\n): Promise<{ jquery: boolean }> {\n const initialValues: 'jquery'[] = initial.jquery ? ['jquery'] : [];\n const result = await clack.multiselect<'jquery'>({\n message: 'Which extra libraries do you use?',\n options: [\n { value: 'jquery', label: 'jQuery (adds globals)' },\n ],\n required: false,\n initialValues,\n });\n\n const selection = ensure(clack, result);\n\n return { jquery: selection.includes('jquery') };\n}\n\nasync function askTsconfigRole (\n clack: ClackLike,\n refPath: string,\n initial: TsconfigRole = 'app'\n): Promise<TsconfigRole> {\n const result = await clack.select<TsconfigRole>({\n message: `Map ${refPath} to a role:`,\n options: [\n { value: 'app', label: 'App / source code' },\n { value: 'test', label: 'Test code' },\n { value: 'config', label: 'Config / root files' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport interface TsconfigPromptInput {\n referencesOnly: boolean;\n rootPath: string;\n refs: string[];\n}\n\nasync function collectRoleEntries (\n clack: ClackLike,\n refs: string[],\n previous?: TsconfigRoleEntry[]\n): Promise<TsconfigRoleEntry[]> {\n const previousByPath = new Map(previous?.map(entry => [entry.path, entry.role]) ?? []);\n\n return refs.reduce<Promise<TsconfigRoleEntry[]>>(async (accumulator, ref) => {\n const entries = await accumulator;\n const role = await askTsconfigRole(clack, ref, previousByPath.get(ref));\n\n return [...entries, { path: ref, role }];\n }, Promise.resolve([]));\n}\n\nexport async function askTsconfigPlan (\n clack: ClackLike,\n input: TsconfigPromptInput,\n previous?: TsconfigPlan\n): Promise<TsconfigPlan> {\n if (!input.referencesOnly) {\n return {\n referencesOnly: false,\n entries: [{ path: './tsconfig.json', role: 'app' }],\n };\n }\n\n const entries = await collectRoleEntries(clack, input.refs, previous?.entries);\n\n return { referencesOnly: true, entries };\n}\n\nexport type ExistingConfigDecision = 'override' | 'migrate' | 'exit';\n\nexport async function askExistingConfigDecision (\n clack: ClackLike,\n configPath: string,\n initial: ExistingConfigDecision = 'migrate'\n): Promise<ExistingConfigDecision> {\n const result = await clack.select<ExistingConfigDecision>({\n message: `Found existing config at ${configPath}. How should we proceed?`,\n options: [\n { value: 'migrate', label: 'Migrate', hint: 'preserve current base config, port them to the v2 shape' },\n { value: 'override', label: 'Override', hint: 'discard the existing config and scaffold a new one' },\n { value: 'exit', label: 'Exit', hint: 'leave the project untouched' },\n ],\n initialValue: initial,\n });\n\n return ensure(clack, result);\n}\n\nexport interface RunQuestionsContext {\n tsconfigInput: TsconfigPromptInput | null;\n tsconfigMissing: boolean;\n previousAnswers?: CliAnswers;\n}\n\ninterface BrowserBranch {\n framework: Framework | undefined;\n vueMajor: VueMajor | undefined;\n vueApiStyle: VueApiStyle | undefined;\n}\n\nasync function askBrowserBranch (clack: ClackLike, previous?: CliAnswers): Promise<BrowserBranch> {\n const framework = await askFramework(clack, previous?.framework);\n\n if (framework !== 'vue') {\n return { framework, vueMajor: undefined, vueApiStyle: undefined };\n }\n\n const vueMajor = await askVueMajor(clack, previous?.vueMajor);\n const vueApiStyle = await askVueApiStyle(clack, previous?.vueApiStyle);\n\n return { framework, vueMajor, vueApiStyle };\n}\n\nfunction noteResumed (clack: ClackLike, previous: CliAnswers | undefined): void {\n if (!previous || !clack.note) {\n return;\n }\n\n clack.note(\n 'Restored your previous choices. Press Enter on each prompt to confirm, or arrow keys to change.',\n 'Resuming previous session'\n );\n}\n\nfunction guardTsconfig (clack: ClackLike, wantsTypescript: boolean, context: RunQuestionsContext): void {\n if (wantsTypescript && context.tsconfigMissing) {\n bail(clack, 'No tsconfig.json found in current directory. Create one and re-run.');\n }\n}\n\nasync function resolveBrowserBranch (\n clack: ClackLike,\n projectType: ProjectType,\n previous: CliAnswers | undefined\n): Promise<BrowserBranch> {\n if (projectType !== 'browser' && projectType !== 'hybrid') {\n return { framework: undefined, vueMajor: undefined, vueApiStyle: undefined };\n }\n\n return askBrowserBranch(clack, previous);\n}\n\nasync function resolveTsconfigPlan (\n clack: ClackLike,\n wantsTypescript: boolean,\n context: RunQuestionsContext,\n previous: CliAnswers | undefined\n): Promise<TsconfigPlan | undefined> {\n if (!wantsTypescript || !context.tsconfigInput) {\n return undefined;\n }\n\n return askTsconfigPlan(clack, context.tsconfigInput, previous?.tsconfig);\n}\n\nexport async function runQuestions (\n context: RunQuestionsContext,\n clackOverride?: ClackLike\n): Promise<CliAnswers> {\n const clack = clackOverride ?? await loadClack();\n\n clack.intro('useinsider eslint-config setup');\n noteResumed(clack, context.previousAnswers);\n\n const previous = context.previousAnswers;\n const projectType = await askProjectType(clack, previous?.projectType);\n const languages = await askLanguages(clack, previous?.languages);\n const wantsTypescript = languages.includes('typescript');\n\n guardTsconfig(clack, wantsTypescript, context);\n\n const browserBranch = await resolveBrowserBranch(clack, projectType, previous);\n const testFramework = await askTestFramework(clack, previous?.testFramework);\n const extras = await askExtras(clack, previous?.extras);\n const tsconfig = await resolveTsconfigPlan(clack, wantsTypescript, context, previous);\n\n return {\n projectType,\n languages,\n framework: browserBranch.framework,\n vueMajor: browserBranch.vueMajor,\n vueApiStyle: browserBranch.vueApiStyle,\n testFramework,\n extras,\n tsconfig,\n };\n}\n\nexport { loadClack, CliCancelledError };\n","import { createHash } from 'node:crypto';\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport type { CliAnswers } from './template';\n\nexport type SessionCommand = 'scaffold' | 'migrate';\n\nexport type ScaffoldExistingConfigChoice = 'override' | 'migrate' | 'exit';\n\nexport interface ScaffoldSessionAnswers {\n answers?: CliAnswers;\n existingConfigChoice?: ScaffoldExistingConfigChoice;\n}\n\nexport interface MigrateSessionAnswers {\n target?: string;\n yes?: boolean;\n noInstall?: boolean;\n overwriteExisting?: boolean;\n proceed?: boolean;\n}\n\nexport interface PersistedSession {\n v: 4;\n savedAt: number;\n cwd: string;\n command: SessionCommand;\n scaffold?: ScaffoldSessionAnswers;\n migrate?: MigrateSessionAnswers;\n}\n\nexport interface SessionStoreOptions {\n cwd: string;\n now?: () => number;\n tmpDir?: string;\n ttlMs?: number;\n}\n\nconst SCHEMA_VERSION = 4 as const;\nconst DEFAULT_TTL_MS = 60 * 60 * 1000;\nconst FILE_PREFIX = 'useinsider-eslint-config-session-';\n\nfunction hashCwd (cwd: string): string {\n return createHash('sha1').update(cwd).digest('hex').slice(0, 16);\n}\n\nexport function getSessionFilePath (cwd: string, tmpDirOverride?: string): string {\n const dir = tmpDirOverride ?? tmpdir();\n\n return join(dir, `${FILE_PREFIX}${hashCwd(cwd)}.json`);\n}\n\nfunction safeUnlink (path: string): void {\n try {\n unlinkSync(path);\n } catch {\n // file missing or already unlinked — silent by design\n }\n}\n\nfunction ensureDir (path: string): void {\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n}\n\nfunction isSessionShape (value: unknown): value is PersistedSession {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Partial<PersistedSession>;\n\n return candidate.v === SCHEMA_VERSION\n && typeof candidate.savedAt === 'number'\n && typeof candidate.cwd === 'string'\n && (candidate.command === 'scaffold' || candidate.command === 'migrate');\n}\n\nexport function saveSession (\n session: Omit<PersistedSession, 'v' | 'savedAt' | 'cwd'>,\n options: SessionStoreOptions\n): string {\n const now = options.now ?? Date.now;\n const dir = options.tmpDir ?? tmpdir();\n\n ensureDir(dir);\n\n const path = getSessionFilePath(options.cwd, dir);\n const payload: PersistedSession = {\n v: SCHEMA_VERSION,\n savedAt: now(),\n cwd: options.cwd,\n ...session,\n };\n\n writeFileSync(path, JSON.stringify(payload), { encoding: 'utf8', mode: 0o600 });\n\n try {\n chmodSync(path, 0o600);\n } catch {\n // chmod can fail on Windows / restricted FS — perms are best-effort\n }\n\n return path;\n}\n\nexport function loadSession (options: SessionStoreOptions): PersistedSession | null {\n const now = options.now ?? Date.now;\n const ttl = options.ttlMs ?? DEFAULT_TTL_MS;\n const path = getSessionFilePath(options.cwd, options.tmpDir);\n\n if (!existsSync(path)) {\n return null;\n }\n\n let parsed: unknown;\n\n try {\n const raw = readFileSync(path, 'utf8');\n\n parsed = JSON.parse(raw);\n } catch {\n safeUnlink(path);\n\n return null;\n }\n\n if (!isSessionShape(parsed)) {\n safeUnlink(path);\n\n return null;\n }\n\n if (parsed.cwd !== options.cwd) {\n safeUnlink(path);\n\n return null;\n }\n\n if (now() - parsed.savedAt > ttl) {\n safeUnlink(path);\n\n return null;\n }\n\n return parsed;\n}\n\nexport function clearSession (options: SessionStoreOptions): void {\n const path = getSessionFilePath(options.cwd, options.tmpDir);\n\n safeUnlink(path);\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { afterEach, beforeEach, describe, expect, test } = import.meta.vitest;\n const { mkdtempSync, rmSync, statSync } = await import('node:fs');\n const os = await import('node:os');\n let scratch = '';\n let counter = 0;\n\n function fakeCwd (): string {\n counter += 1;\n\n return `/fake/cwd-${counter}`;\n }\n\n beforeEach(() => {\n scratch = mkdtempSync(join(os.tmpdir(), 'session-store-inline-'));\n });\n\n afterEach(() => {\n if (scratch) {\n rmSync(scratch, { recursive: true, force: true });\n scratch = '';\n }\n });\n\n describe('getSessionFilePath', () => {\n test('returns the same path for the same working directory', () => {\n const cwd = fakeCwd();\n\n expect(getSessionFilePath(cwd, scratch)).toBe(getSessionFilePath(cwd, scratch));\n });\n\n test('returns different paths for different working directories', () => {\n const a = fakeCwd();\n const b = fakeCwd();\n\n expect(getSessionFilePath(a, scratch)).not.toBe(getSessionFilePath(b, scratch));\n });\n });\n\n describe('saveSession + loadSession round-trip', () => {\n test('persists scaffold answers and reloads them verbatim', () => {\n const cwd = fakeCwd();\n const answers: CliAnswers = {\n projectType: 'browser',\n languages: ['typescript'],\n framework: 'vue',\n vueMajor: 3,\n testFramework: 'vitest',\n extras: { jquery: false },\n };\n\n saveSession(\n { command: 'scaffold', scaffold: { answers } },\n { cwd, tmpDir: scratch }\n );\n\n const loaded = loadSession({ cwd, tmpDir: scratch });\n\n expect(loaded?.scaffold).toStrictEqual({ answers });\n expect(loaded?.command).toBe('scaffold');\n });\n\n test('persists existingConfigChoice on the scaffold payload', () => {\n const cwd = fakeCwd();\n\n saveSession(\n { command: 'scaffold', scaffold: { existingConfigChoice: 'migrate' } },\n { cwd, tmpDir: scratch }\n );\n\n const loaded = loadSession({ cwd, tmpDir: scratch });\n\n expect(loaded?.scaffold?.existingConfigChoice).toBe('migrate');\n });\n\n test('returns null when no session exists', () => {\n expect(loadSession({ cwd: fakeCwd(), tmpDir: scratch })).toBeNull();\n });\n\n test('returns null and removes file when TTL has elapsed', () => {\n const cwd = fakeCwd();\n const answers: CliAnswers = {\n projectType: 'backend',\n languages: ['javascript'],\n testFramework: 'none',\n extras: { jquery: false },\n };\n\n saveSession(\n { command: 'scaffold', scaffold: { answers } },\n { cwd, tmpDir: scratch, now: () => 1000 }\n );\n\n const filePath = getSessionFilePath(cwd, scratch);\n const futureNow = 1000 + 60 * 60 * 1000 + 1;\n\n expect(existsSync(filePath)).toBe(true);\n expect(loadSession({\n cwd,\n tmpDir: scratch,\n now: () => futureNow,\n ttlMs: 60 * 60 * 1000,\n })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('returns null and removes file on working-directory mismatch (collision guard)', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n const payload = {\n v: 4,\n savedAt: Date.now(),\n cwd: '/different/cwd',\n command: 'scaffold',\n };\n\n writeFileSync(filePath, JSON.stringify(payload), 'utf8');\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('returns null and removes file when payload is not valid JSON', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(filePath, 'not-json', 'utf8');\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('returns null and removes file when schema version mismatches', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(\n filePath,\n JSON.stringify({ v: 99, savedAt: Date.now(), cwd, command: 'scaffold' }),\n 'utf8'\n );\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n });\n\n test('discards legacy v1 payloads so the next run starts fresh', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(\n filePath,\n JSON.stringify({ v: 1, savedAt: Date.now(), cwd, command: 'scaffold' }),\n 'utf8'\n );\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('discards legacy v2 payloads so the next run starts fresh', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(\n filePath,\n JSON.stringify({ v: 2, savedAt: Date.now(), cwd, command: 'scaffold' }),\n 'utf8'\n );\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('discards legacy v3 payloads so the next run starts fresh', () => {\n const cwd = fakeCwd();\n const filePath = getSessionFilePath(cwd, scratch);\n\n writeFileSync(\n filePath,\n JSON.stringify({ v: 3, savedAt: Date.now(), cwd, command: 'scaffold' }),\n 'utf8'\n );\n\n expect(loadSession({ cwd, tmpDir: scratch })).toBeNull();\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('writes file with owner-only permissions on POSIX', () => {\n const cwd = fakeCwd();\n\n saveSession({ command: 'scaffold' }, { cwd, tmpDir: scratch });\n\n if (process.platform === 'win32') {\n return;\n }\n\n const stat = statSync(getSessionFilePath(cwd, scratch));\n // oxlint-disable-next-line no-bitwise -- POSIX mode mask, standard idiom\n const mode = stat.mode & 0o777;\n\n expect(mode).toBe(0o600);\n });\n });\n\n describe('clearSession', () => {\n test('removes the file when present', () => {\n const cwd = fakeCwd();\n\n saveSession({ command: 'migrate', migrate: { yes: true } }, { cwd, tmpDir: scratch });\n\n const filePath = getSessionFilePath(cwd, scratch);\n\n expect(existsSync(filePath)).toBe(true);\n\n clearSession({ cwd, tmpDir: scratch });\n\n expect(existsSync(filePath)).toBe(false);\n });\n\n test('is a no-op when no file is present', () => {\n expect(() => clearSession({ cwd: fakeCwd(), tmpDir: scratch })).not.toThrow();\n });\n });\n}\n/* v8 ignore stop */\n","export const dependencies = {} as const;\n","export const dependencies = {} as const;\n","export const dependencies = {} as const;\n","export const dependencies = {\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","export const dependencies = {\n 'eslint-plugin-sonarjs': false,\n} as const;\n","export const dependencies = {\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","export const dependencies = {\n typescript: false,\n 'typescript-eslint': false,\n '@typescript-eslint/parser': false,\n '@typescript-eslint/eslint-plugin': false,\n} as const;\n","import type { V2ScopeName } from './types';\nimport {\n ownEslintConfigSpec,\n readOwnEslintConfigManifest as sharedReadOwnEslintConfigManifest,\n type OverridesRecord,\n type PackageManifestLike as SharedPackageManifestLike,\n} from '~/cli/resolveEslintConfigManifest';\nimport { dependencies as baseDeps } from '~/configs/dependencies';\nimport { dependencies as javascriptDeps } from '~/configs/javascript/dependencies';\nimport { dependencies as javascriptDomDeps } from '~/configs/javascript-dom/dependencies';\nimport { dependencies as javascriptNodeDeps } from '~/configs/javascript-node/dependencies';\nimport { dependencies as jestDeps } from '~/configs/jest/dependencies';\nimport { dependencies as jsdocBasedTsDeps } from '~/configs/jsdoc-based-ts/dependencies';\nimport { dependencies as strictDeps } from '~/configs/strict/dependencies';\nimport { dependencies as typescriptDeps } from '~/configs/typescript/dependencies';\nimport { dependencies as typescriptDomDeps } from '~/configs/typescript-dom/dependencies';\nimport { dependencies as typescriptNodeDeps } from '~/configs/typescript-node/dependencies';\nimport { dependencies as vitestDeps } from '~/configs/vitest/dependencies';\nimport { dependencies as vue2Deps } from '~/configs/vue2/dependencies';\nimport { dependencies as vue2TypescriptDeps } from '~/configs/vue2-typescript/dependencies';\nimport { dependencies as vue3Deps } from '~/configs/vue3/dependencies';\nimport { dependencies as vue3TypescriptDeps } from '~/configs/vue3-typescript/dependencies';\n\nexport type PackageManifestLike = SharedPackageManifestLike;\n\ntype DependencyRecord = Readonly<Record<string, boolean>>;\n\nconst EXACT_PATTERNS = new Set<string>([\n 'eslint',\n '@useinsider/eslint-config',\n 'globals',\n 'vue-eslint-parser',\n 'typescript-eslint',\n]);\n\nconst PREFIX_PATTERNS: readonly string[] = [\n 'eslint-plugin-',\n 'eslint-config-',\n 'eslint-import-resolver-',\n 'eslint-formatter-',\n 'eslint-',\n];\n\nconst SCOPED_ESLINT_PATTERNS: readonly RegExp[] = [\n /^@[^/]+\\/eslint-/u,\n /^@typescript-eslint\\//u,\n];\n\n// jiti is listed here despite being an always-installed dependency: it is a general-purpose\n// loader a consumer may own for unrelated tooling, and pruning it would relocate a runtime entry\n// into devDependencies. The install list pins the version either way.\nconst SAFELIST: ReadonlySet<string> = new Set(['typescript', '@types/eslint', 'jiti']);\n\nconst SCOPE_TO_DEPS: Record<V2ScopeName, DependencyRecord> = {\n javascript: javascriptDeps,\n javascriptDom: javascriptDomDeps,\n javascriptNode: javascriptNodeDeps,\n typescript: typescriptDeps,\n typescriptDom: typescriptDomDeps,\n typescriptNode: typescriptNodeDeps,\n vue2: vue2Deps,\n vue3: vue3Deps,\n vue2Typescript: vue2TypescriptDeps,\n vue3Typescript: vue3TypescriptDeps,\n jest: jestDeps,\n vitest: vitestDeps,\n jsdocBasedTs: jsdocBasedTsDeps,\n};\n\nconst ALL_PRESET_DEPS: readonly DependencyRecord[] = [\n baseDeps,\n strictDeps,\n ...Object.values(SCOPE_TO_DEPS),\n];\n\nconst PRESET_DEPENDENCY_KEYS: ReadonlySet<string> = new Set(\n ALL_PRESET_DEPS.flatMap(record => Object.keys(record))\n);\n\nconst MIGRATABLE_SCOPES: ReadonlySet<string> = new Set(Object.keys(SCOPE_TO_DEPS));\n\n/**\n * Whether a `useInsider()` option key is a scope this migration can derive dependencies for. The\n * four `*OptionsApi` scopes are deliberately absent from the registry, so a config using one is\n * carried over untouched while its dependencies are reported as unresolved.\n * @example\n * isMigratableScope('vue3Typescript'); // true\n * isMigratableScope('vue3OptionsApi'); // false\n */\nexport function isMigratableScope (key: string): key is V2ScopeName {\n return MIGRATABLE_SCOPES.has(key);\n}\n\nexport function isEslintRelatedDependency (name: string): boolean {\n if (SAFELIST.has(name)) {\n return false;\n }\n\n if (EXACT_PATTERNS.has(name)) {\n return true;\n }\n\n if (PRESET_DEPENDENCY_KEYS.has(name)) {\n return true;\n }\n\n if (SCOPED_ESLINT_PATTERNS.some(pattern => pattern.test(name))) {\n return true;\n }\n\n return PREFIX_PATTERNS.some(prefix => name.startsWith(prefix));\n}\n\nfunction sortRecord (record: Record<string, string>): Record<string, string> {\n return Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .reduce<Record<string, string>>((accumulator, key) => {\n accumulator[key] = record[key];\n\n return accumulator;\n }, {});\n}\n\nfunction pruneSection (\n record: Record<string, string> | undefined,\n removed: string[]\n): Record<string, string> | undefined {\n if (!record) {\n return record;\n }\n\n const kept: Record<string, string> = {};\n\n Object.entries(record).forEach(([name, version]) => {\n if (isEslintRelatedDependency(name)) {\n if (!removed.includes(name)) {\n removed.push(name);\n }\n\n return;\n }\n\n kept[name] = version;\n });\n\n return sortRecord(kept);\n}\n\nexport interface ParsedOverrideKey {\n baseName: string;\n}\n\nexport function parseOverrideKey (key: string): ParsedOverrideKey {\n if (key.length === 0) {\n return { baseName: key };\n }\n\n const scoped = key.startsWith('@');\n const searchFrom = scoped ? 1 : 0;\n const atIndex = key.indexOf('@', searchFrom);\n\n if (atIndex === -1) {\n return { baseName: key };\n }\n\n return { baseName: key.slice(0, atIndex) };\n}\n\nfunction sortOverrides (record: OverridesRecord): OverridesRecord {\n return Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .reduce<OverridesRecord>((accumulator, key) => {\n accumulator[key] = record[key];\n\n return accumulator;\n }, {});\n}\n\nfunction pruneOverridesSection (\n record: OverridesRecord | undefined,\n removed: string[]\n): OverridesRecord | undefined {\n if (!record) {\n return record;\n }\n\n const kept: OverridesRecord = {};\n\n Object.entries(record).forEach(([key, value]) => {\n const isStringPin = typeof value === 'string';\n\n if (!isStringPin) {\n kept[key] = value;\n\n return;\n }\n\n const { baseName } = parseOverrideKey(key);\n\n if (isEslintRelatedDependency(baseName)) {\n if (!removed.includes(baseName)) {\n removed.push(baseName);\n }\n\n return;\n }\n\n kept[key] = value;\n });\n\n return sortOverrides(kept);\n}\n\nexport interface PruneResult {\n manifest: PackageManifestLike;\n removed: string[];\n}\n\nexport function pruneEslintDependencies (manifest: PackageManifestLike): PruneResult {\n const removed: string[] = [];\n const next: PackageManifestLike = { ...manifest };\n\n if (manifest.dependencies) {\n next.dependencies = pruneSection(manifest.dependencies, removed);\n }\n\n if (manifest.devDependencies) {\n next.devDependencies = pruneSection(manifest.devDependencies, removed);\n }\n\n if (manifest.peerDependencies) {\n next.peerDependencies = pruneSection(manifest.peerDependencies, removed);\n }\n\n if (manifest.optionalDependencies) {\n next.optionalDependencies = pruneSection(manifest.optionalDependencies, removed);\n }\n\n if (manifest.overrides) {\n next.overrides = pruneOverridesSection(manifest.overrides, removed);\n }\n\n if (manifest.pnpm && typeof manifest.pnpm === 'object') {\n const nextPnpm = { ...manifest.pnpm };\n\n if (manifest.pnpm.overrides) {\n nextPnpm.overrides = pruneOverridesSection(manifest.pnpm.overrides, removed);\n }\n\n next.pnpm = nextPnpm;\n }\n\n if (manifest.resolutions) {\n next.resolutions = pruneSection(manifest.resolutions, removed);\n }\n\n return { manifest: next, removed };\n}\n\nfunction lookupVersion (manifest: PackageManifestLike, name: string): string | undefined {\n return manifest.dependencies?.[name]\n ?? manifest.devDependencies?.[name]\n ?? manifest.peerDependencies?.[name]\n ?? manifest.optionalDependencies?.[name];\n}\n\nfunction stripRange (version: string): string {\n return version.replace(/^(?:\\^|~|>=|<=|>|<|=)/u, '');\n}\n\nexport interface InstallList {\n specs: string[];\n fallbacks: string[];\n}\n\nfunction appendSpec (specs: string[], spec: string): void {\n if (!specs.includes(spec)) {\n specs.push(spec);\n }\n}\n\nfunction resolveSpec (name: string, manifest: PackageManifestLike, fallbacks: string[]): string {\n const version = lookupVersion(manifest, name);\n\n if (!version) {\n if (!fallbacks.includes(name)) {\n fallbacks.push(name);\n }\n\n return `${name}@latest`;\n }\n\n return `${name}@${stripRange(version)}`;\n}\n\nexport function buildInstallList (\n scopes: ReadonlySet<V2ScopeName>,\n manifest: PackageManifestLike\n): InstallList {\n const specs: string[] = [];\n const fallbacks: string[] = [];\n\n appendSpec(specs, ownEslintConfigSpec(manifest));\n appendSpec(specs, resolveSpec('eslint', manifest, fallbacks));\n\n Object.entries(baseDeps).forEach(([packageName, shouldInstall]) => {\n if (shouldInstall) {\n appendSpec(specs, resolveSpec(packageName, manifest, fallbacks));\n }\n });\n\n const ordered: V2ScopeName[] = [...scopes];\n\n ordered.forEach(scope => {\n const record = SCOPE_TO_DEPS[scope];\n\n if (!record) {\n return;\n }\n\n Object.entries(record).forEach(([packageName, shouldInstall]) => {\n if (shouldInstall) {\n appendSpec(specs, resolveSpec(packageName, manifest, fallbacks));\n }\n });\n });\n\n return { specs, fallbacks };\n}\n\nexport const readOwnEslintConfigManifest = sharedReadOwnEslintConfigManifest;\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { detectIndent } from './detectIndent';\nimport {\n type PackageManifestLike,\n pruneEslintDependencies,\n} from './migrate/dependencies';\n\nexport type { PackageManifestLike };\n\nexport interface PrunePackageJsonResult {\n packageJsonPath: string | null;\n removed: string[];\n}\n\nfunction serializeManifest (manifest: PackageManifestLike, indent: string): string {\n return `${JSON.stringify(manifest, null, indent)}\\n`;\n}\n\nfunction tryReadConsumerManifest (path: string): { raw: string; manifest: PackageManifestLike } | null {\n try {\n const raw = readFileSync(path, 'utf8');\n const manifest = JSON.parse(raw) as PackageManifestLike;\n\n return { raw, manifest };\n } catch {\n return null;\n }\n}\n\nexport function pruneConsumerPackageJson (cwd: string): PrunePackageJsonResult {\n const packageJsonPath = join(cwd, 'package.json');\n\n if (!existsSync(packageJsonPath)) {\n return { packageJsonPath: null, removed: [] };\n }\n\n const read = tryReadConsumerManifest(packageJsonPath);\n\n if (!read) {\n return { packageJsonPath: null, removed: [] };\n }\n\n const { manifest, raw } = read;\n const outcome = pruneEslintDependencies(manifest);\n\n if (outcome.removed.length === 0) {\n return { packageJsonPath, removed: [] };\n }\n\n const indent = detectIndent(raw);\n\n writeFileSync(packageJsonPath, serializeManifest(outcome.manifest, indent), 'utf8');\n\n return { packageJsonPath, removed: outcome.removed };\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { ClackLike } from './questions';\nimport * as ts from 'typescript';\nimport { detectIndent } from './detectIndent';\n\nexport const TS_EXTENSIONS_FLAG = 'allowImportingTsExtensions';\n\nexport const TS_EXTENSIONS_SNIPPET = [\n '{',\n ' \"compilerOptions\": {',\n ` \"${TS_EXTENSIONS_FLAG}\": true`,\n ' }',\n '}',\n].join('\\n');\n\nexport interface TsconfigState {\n path: string;\n raw: string;\n enabled: boolean;\n governs: boolean;\n acceptsFlag: boolean;\n}\n\ninterface ParsedTsconfig {\n enabled: boolean;\n acceptsFlag: boolean;\n fileNames: readonly string[];\n references: readonly string[];\n}\n\n// `tsc` errors with TS5096 when `allowImportingTsExtensions` is set on a project that emits, so the\n// flag is only writable once the project is one of the three shapes TypeScript accepts it on.\nfunction acceptsTsExtensionsFlag (options: ts.CompilerOptions): boolean {\n return options.noEmit === true\n || options.emitDeclarationOnly === true\n || options.rewriteRelativeImportExtensions === true;\n}\n\nfunction parseTsconfig (path: string, raw: string): ParsedTsconfig | null {\n const { config } = ts.parseConfigFileTextToJson(path, raw) as { config?: unknown };\n\n if (!config) {\n return null;\n }\n\n const parsed = ts.parseJsonConfigFileContent(config, ts.sys, dirname(path), undefined, path);\n\n return {\n enabled: parsed.options.allowImportingTsExtensions === true,\n acceptsFlag: acceptsTsExtensionsFlag(parsed.options),\n fileNames: parsed.fileNames,\n references: (parsed.projectReferences ?? []).map(reference => reference.path),\n };\n}\n\nfunction readTsconfigAt (path: string, governedFiles: readonly string[]): {\n state: TsconfigState;\n references: readonly string[];\n} | null {\n if (!existsSync(path)) {\n return null;\n }\n\n try {\n const raw = readFileSync(path, 'utf8');\n const parsed = parseTsconfig(path, raw);\n\n if (!parsed) {\n return {\n state: { path, raw, enabled: false, governs: false, acceptsFlag: false },\n references: [],\n };\n }\n\n const owned = new Set(parsed.fileNames.map(name => ts.sys.resolvePath(name)));\n const governs = governedFiles.some(file => owned.has(ts.sys.resolvePath(file)));\n\n return {\n state: { path, raw, enabled: parsed.enabled, governs, acceptsFlag: parsed.acceptsFlag },\n references: parsed.references,\n };\n } catch {\n return null;\n }\n}\n\nfunction resolveReferencePath (reference: string): string {\n if (!existsSync(reference)) {\n return reference;\n }\n\n return ts.sys.directoryExists(reference) ? join(reference, 'tsconfig.json') : reference;\n}\n\n/**\n * The consumer's root `tsconfig.json` plus whether `allowImportingTsExtensions` already resolves to\n * `true` — including when it arrives through `extends`, which is followed the same way `tsc` does.\n * @example\n * readTsconfigState('/repo')?.enabled; // true when /repo/tsconfig.json extends a base that sets it\n */\nexport function readTsconfigState (cwd: string, governedFiles: readonly string[] = []): TsconfigState | null {\n return readTsconfigAt(join(cwd, 'tsconfig.json'), governedFiles)?.state ?? null;\n}\n\n/**\n * Every tsconfig in the consumer's solution — the root plus each project reference — annotated with\n * whether it actually type-checks the generated lint files. A solution-style root has an empty file\n * set, so the project that governs `insider.lint.ts` is usually a referenced `tsconfig.node.json`,\n * and that is the one `tsc` reports TS5097 from.\n * @example\n * collectTsconfigStates('/repo', ['/repo/insider.lint.ts']).filter(state => state.governs);\n * // [{ path: '/repo/tsconfig.node.json', enabled: true, governs: true, ... }]\n */\nexport function collectTsconfigStates (\n cwd: string,\n governedFiles: readonly string[] = []\n): TsconfigState[] {\n const root = readTsconfigAt(join(cwd, 'tsconfig.json'), governedFiles);\n\n if (!root) {\n return [];\n }\n\n const seen = new Set([root.state.path]);\n const states = [root.state];\n\n root.references.forEach(reference => {\n const path = resolveReferencePath(reference);\n\n if (seen.has(path)) {\n return;\n }\n\n seen.add(path);\n\n const referenced = readTsconfigAt(path, governedFiles);\n\n if (referenced) {\n states.push(referenced.state);\n }\n });\n\n return states;\n}\n\n/**\n * The tsconfigs that must gain `allowImportingTsExtensions`: the ones that type-check the generated\n * files and do not already resolve the flag to `true`. Empty when an applicable config already sets\n * it, and empty when no config type-checks the generated files at all — a tsconfig that never sees\n * them cannot raise TS5097, so editing it would only add a flag it has no use for.\n * @example\n * tsconfigsNeedingFlag('/repo', ['/repo/insider.lint.ts']).map(state => state.path); // []\n */\nexport function tsconfigsNeedingFlag (\n cwd: string,\n governedFiles: readonly string[]\n): TsconfigState[] {\n return collectTsconfigStates(cwd, governedFiles)\n .filter(state => state.governs && !state.enabled);\n}\n\nfunction rootObject (source: ts.JsonSourceFile): ts.ObjectLiteralExpression | null {\n const [statement] = source.statements;\n const expression = statement?.expression;\n\n return expression && ts.isObjectLiteralExpression(expression) ? expression : null;\n}\n\nfunction findProperty (\n object: ts.ObjectLiteralExpression,\n name: string\n): ts.PropertyAssignment | undefined {\n return object.properties.find((property): property is ts.PropertyAssignment => ts.isPropertyAssignment(property)\n && ts.isStringLiteral(property.name)\n && property.name.text === name);\n}\n\nfunction indentAt (raw: string, position: number): string {\n const lineStart = raw.lastIndexOf('\\n', position - 1) + 1;\n const prefix = raw.slice(lineStart, position);\n\n return prefix.trim().length === 0 ? prefix : '';\n}\n\nfunction splice (raw: string, start: number, end: number, text: string): string {\n return raw.slice(0, start) + text + raw.slice(end);\n}\n\nfunction setExistingFlag (\n raw: string,\n source: ts.JsonSourceFile,\n property: ts.PropertyAssignment\n): string {\n return splice(\n raw,\n property.initializer.getStart(source),\n property.initializer.getEnd(),\n 'true'\n );\n}\n\nfunction insertIntoCompilerOptions (\n raw: string,\n source: ts.JsonSourceFile,\n compilerOptions: ts.PropertyAssignment,\n object: ts.ObjectLiteralExpression\n): string {\n const openBrace = object.getStart(source) + 1;\n const [first] = object.properties;\n\n if (first) {\n const indent = indentAt(raw, first.getStart(source)) || detectIndent(raw).repeat(2);\n\n return splice(raw, openBrace, openBrace, `\\n${indent}\"${TS_EXTENSIONS_FLAG}\": true,`);\n }\n\n const outer = indentAt(raw, compilerOptions.getStart(source));\n const unit = detectIndent(raw);\n\n return splice(\n raw,\n openBrace,\n object.getEnd() - 1,\n `\\n${outer}${unit}\"${TS_EXTENSIONS_FLAG}\": true\\n${outer}`\n );\n}\n\nfunction insertCompilerOptions (\n raw: string,\n source: ts.JsonSourceFile,\n root: ts.ObjectLiteralExpression\n): string {\n const openBrace = root.getStart(source) + 1;\n const unit = detectIndent(raw);\n const [first] = root.properties;\n const indent = first ? indentAt(raw, first.getStart(source)) || unit : unit;\n const block = `\\n${indent}\"compilerOptions\": {\\n${indent}${unit}\"${TS_EXTENSIONS_FLAG}\": true\\n${indent}}`;\n\n if (first) {\n return splice(raw, openBrace, openBrace, `${block},`);\n }\n\n return splice(raw, openBrace, root.getEnd() - 1, `${block}\\n`);\n}\n\n/**\n * Turns `allowImportingTsExtensions` on in a `tsconfig.json` source without reformatting it. The\n * file is edited through its JSON syntax tree rather than re-serialized, so comments, key order and\n * indentation survive.\n * @example\n * enableTsExtensionsFlag('{\\n \"compilerOptions\": {\\n \"strict\": true\\n }\\n}').changed; // true\n */\nexport function enableTsExtensionsFlag (raw: string): { source: string; changed: boolean } {\n const source = ts.parseJsonText('tsconfig.json', raw);\n const root = rootObject(source);\n\n if (!root) {\n return { source: raw, changed: false };\n }\n\n const compilerOptions = findProperty(root, 'compilerOptions');\n\n if (!compilerOptions) {\n return { source: insertCompilerOptions(raw, source, root), changed: true };\n }\n\n if (!ts.isObjectLiteralExpression(compilerOptions.initializer)) {\n return { source: raw, changed: false };\n }\n\n const existing = findProperty(compilerOptions.initializer, TS_EXTENSIONS_FLAG);\n\n if (existing) {\n if (existing.initializer.kind === ts.SyntaxKind.TrueKeyword) {\n return { source: raw, changed: false };\n }\n\n return { source: setExistingFlag(raw, source, existing), changed: true };\n }\n\n return {\n source: insertIntoCompilerOptions(raw, source, compilerOptions, compilerOptions.initializer),\n changed: true,\n };\n}\n\nfunction noteManualStep (clack: ClackLike, lintModule: string): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n `\\`eslint.config.*\\` imports \\`./${lintModule}\\` by its real extension, which \\`tsc\\` rejects `\n + `with TS5097 unless \\`${TS_EXTENSIONS_FLAG}\\` is on. Add this to your tsconfig.json:`\n + `\\n\\n${TS_EXTENSIONS_SNIPPET}`,\n 'tsconfig.json not updated'\n );\n}\n\nfunction noteEmitConflict (clack: ClackLike, path: string, lintModule: string): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n `${path} type-checks \\`./${lintModule}\\`, so \\`tsc\\` needs \\`${TS_EXTENSIONS_FLAG}\\` there — but `\n + 'that project emits, and TypeScript rejects the pair with TS5096. Set `noEmit`, '\n + '`emitDeclarationOnly` or `rewriteRelativeImportExtensions` on it first, then add:'\n + `\\n\\n${TS_EXTENSIONS_SNIPPET}`,\n 'tsconfig.json not updated'\n );\n}\n\nasync function confirmFlag (clack: ClackLike, path: string): Promise<boolean> {\n const result = await clack.confirm({\n message: `Set \\`${TS_EXTENSIONS_FLAG}: true\\` in ${path}? `\n + 'Without it `tsc` fails with TS5097 on the generated config files.',\n initialValue: true,\n });\n\n return !clack.isCancel(result) && result === true;\n}\n\nexport interface TsExtensionsFlagInput {\n cwd: string;\n lintModule: string;\n eslintConfig?: string;\n autoConfirm?: boolean;\n}\n\nfunction governedFilesOf (input: TsExtensionsFlagInput): string[] {\n return [input.lintModule, input.eslintConfig]\n .filter((name): name is string => Boolean(name))\n .map(name => join(input.cwd, name));\n}\n\nasync function applyToOne (\n clack: ClackLike,\n state: TsconfigState,\n input: TsExtensionsFlagInput\n): Promise<void> {\n if (!state.acceptsFlag) {\n noteEmitConflict(clack, state.path, input.lintModule);\n\n return;\n }\n\n const confirmed = input.autoConfirm || await confirmFlag(clack, state.path);\n\n if (!confirmed) {\n noteManualStep(clack, input.lintModule);\n\n return;\n }\n\n const result = enableTsExtensionsFlag(state.raw);\n\n if (!result.changed) {\n noteManualStep(clack, input.lintModule);\n\n return;\n }\n\n writeFileSync(state.path, result.source, 'utf8');\n\n if (clack.note) {\n clack.note(`Set \\`${TS_EXTENSIONS_FLAG}: true\\` in ${state.path}.`, 'Updated tsconfig.json');\n }\n}\n\n/**\n * Offers to set `allowImportingTsExtensions` on every tsconfig that actually type-checks the\n * generated lint files, and prints the exact snippet when an offer is declined or when the project\n * emits — in which case writing the flag would trade TS5097 for TS5096. A no-op when there is no\n * `tsconfig.json`, when no config governs the generated files, or when an applicable config already\n * resolves the flag to `true` — through its own `compilerOptions`, through `extends`, or by being a\n * project reference that already sets it.\n * @example\n * await applyTsExtensionsFlag(clack, { cwd: '/repo', lintModule: 'insider.lint.ts' });\n */\nexport async function applyTsExtensionsFlag (\n clack: ClackLike,\n input: TsExtensionsFlagInput\n): Promise<void> {\n const pending = tsconfigsNeedingFlag(input.cwd, governedFilesOf(input));\n\n await pending.reduce<Promise<void>>(\n async (previous, state) => {\n await previous;\n\n return applyToOne(clack, state, input);\n },\n Promise.resolve()\n );\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect, vi } = import.meta.vitest;\n const { mkdirSync, mkdtempSync } = await import('node:fs');\n const { tmpdir } = await import('node:os');\n\n function makeDir (files: Record<string, string> = {}): string {\n const directory = mkdtempSync(join(tmpdir(), 'insider-tsconfig-'));\n\n Object.entries(files).forEach(([name, content]) => {\n writeFileSync(join(directory, name), content, 'utf8');\n });\n\n return directory;\n }\n\n function makeConsumer (files: Record<string, string>): string {\n return makeDir({ ...files, 'insider.lint.ts': 'export const a = 1;\\n' });\n }\n\n function stubClack (confirmValue: boolean | symbol = true) {\n const cancelSymbol = Symbol('cancel');\n\n return {\n intro: vi.fn(),\n outro: vi.fn(),\n cancel: vi.fn(),\n isCancel: (value: unknown) => value === cancelSymbol,\n select: vi.fn(),\n multiselect: vi.fn(),\n confirm: vi.fn().mockResolvedValue(confirmValue === false ? false : confirmValue),\n note: vi.fn(),\n cancelSymbol,\n };\n }\n\n function stubClackWithoutNote (confirmValue = true) {\n return {\n intro: vi.fn(),\n outro: vi.fn(),\n cancel: vi.fn(),\n isCancel: () => false,\n select: vi.fn(),\n multiselect: vi.fn(),\n confirm: vi.fn().mockResolvedValue(confirmValue),\n };\n }\n\n describe('enableTsExtensionsFlag', () => {\n test('adds the flag as the first compilerOptions entry, keeping comments and indentation', () => {\n const raw = '{\\n // project options\\n \"compilerOptions\": {\\n \"strict\": true\\n }\\n}\\n';\n const { source, changed } = enableTsExtensionsFlag(raw);\n\n expect(changed).toBe(true);\n expect(source).toBe(\n '{\\n // project options\\n \"compilerOptions\": {\\n'\n + ' \"allowImportingTsExtensions\": true,\\n \"strict\": true\\n }\\n}\\n'\n );\n });\n\n test('flips an explicit false instead of adding a duplicate key', () => {\n const { source } = enableTsExtensionsFlag(\n '{\"compilerOptions\":{\"allowImportingTsExtensions\":false,\"strict\":true}}'\n );\n\n expect(source).toBe('{\"compilerOptions\":{\"allowImportingTsExtensions\":true,\"strict\":true}}');\n });\n\n test('reports no change when the flag is already true', () => {\n const raw = '{\"compilerOptions\":{\"allowImportingTsExtensions\":true}}';\n\n expect(enableTsExtensionsFlag(raw)).toStrictEqual({ source: raw, changed: false });\n });\n\n test('fills an empty compilerOptions object', () => {\n const { source } = enableTsExtensionsFlag('{\\n \"compilerOptions\": {}\\n}\\n');\n\n expect(source).toBe('{\\n \"compilerOptions\": {\\n \"allowImportingTsExtensions\": true\\n }\\n}\\n');\n });\n\n test('creates compilerOptions when the file has none', () => {\n const { source } = enableTsExtensionsFlag('{\\n \"include\": [\"src\"]\\n}\\n');\n\n expect(source).toBe(\n '{\\n \"compilerOptions\": {\\n \"allowImportingTsExtensions\": true\\n },\\n'\n + ' \"include\": [\"src\"]\\n}\\n'\n );\n });\n\n test('creates compilerOptions in an empty config', () => {\n expect(enableTsExtensionsFlag('{}\\n').source).toBe(\n '{\\n \"compilerOptions\": {\\n \"allowImportingTsExtensions\": true\\n }\\n}\\n'\n );\n });\n\n test('preserves a two-space project style', () => {\n const { source } = enableTsExtensionsFlag('{\\n \"compilerOptions\": {\\n \"strict\": true\\n }\\n}\\n');\n\n expect(source).toContain('\\n \"allowImportingTsExtensions\": true,\\n \"strict\": true');\n });\n\n test('leaves a file whose root is not an object alone', () => {\n expect(enableTsExtensionsFlag('[]').changed).toBe(false);\n });\n\n test('leaves a non-object compilerOptions alone', () => {\n expect(enableTsExtensionsFlag('{\"compilerOptions\": null}').changed).toBe(false);\n });\n\n test('doubles the default unit when a single-line compilerOptions indents nothing', () => {\n const { source } = enableTsExtensionsFlag('{\"compilerOptions\":{\"strict\":true}}');\n\n expect(source).toBe(\n `{\"compilerOptions\":{\\n \"${TS_EXTENSIONS_FLAG}\": true,\"strict\":true}}`\n );\n });\n\n test('falls back to the default unit when creating compilerOptions in a single-line config', () => {\n const { source } = enableTsExtensionsFlag('{\"include\":[\"src\"]}');\n\n expect(source).toBe(\n `{\\n \"compilerOptions\": {\\n \"${TS_EXTENSIONS_FLAG}\": true\\n },\"include\":[\"src\"]}`\n );\n });\n });\n\n describe('readTsconfigState', () => {\n test('returns null when the consumer has no tsconfig.json', () => {\n expect(readTsconfigState(makeDir())).toBeNull();\n });\n\n test('reports the flag as off when nothing sets it', () => {\n const directory = makeDir({ 'tsconfig.json': '{\"compilerOptions\":{\"strict\":true}}' });\n\n expect(readTsconfigState(directory)?.enabled).toBe(false);\n });\n\n test('reports the flag as on when the file sets it directly', () => {\n const directory = makeDir({\n 'tsconfig.json': '{\"compilerOptions\":{\"allowImportingTsExtensions\":true,\"noEmit\":true}}',\n });\n\n expect(readTsconfigState(directory)?.enabled).toBe(true);\n });\n\n test('follows extends, so a shared base carrying the flag counts', () => {\n const directory = makeDir({\n 'base.json': '{\"compilerOptions\":{\"allowImportingTsExtensions\":true,\"noEmit\":true}}',\n 'tsconfig.json': '{\"extends\":\"./base.json\",\"compilerOptions\":{\"strict\":true}}',\n });\n\n expect(readTsconfigState(directory)?.enabled).toBe(true);\n });\n\n test('reports the flag as off for a file whose root is not a config object', () => {\n const directory = makeDir({ 'tsconfig.json': 'null' });\n\n expect(readTsconfigState(directory)?.enabled).toBe(false);\n });\n\n test('returns null when tsconfig.json exists but cannot be read', () => {\n const directory = makeDir();\n\n mkdirSync(join(directory, 'tsconfig.json'));\n\n expect(readTsconfigState(directory)).toBeNull();\n });\n\n test('tolerates comments in the consumer file', () => {\n const directory = makeDir({\n 'tsconfig.json': '{\\n // ours\\n \"compilerOptions\": { \"allowImportingTsExtensions\": true,'\n + ' \"noEmit\": true }\\n}\\n',\n });\n\n expect(readTsconfigState(directory)?.enabled).toBe(true);\n });\n });\n\n describe('applyTsExtensionsFlag', () => {\n test('does nothing when there is no tsconfig.json', async () => {\n const clack = stubClack();\n\n await applyTsExtensionsFlag(clack, { cwd: makeDir(), lintModule: 'insider.lint.ts' });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(clack.note).not.toHaveBeenCalled();\n });\n\n test('does nothing when an extended base already sets the flag', async () => {\n const clack = stubClack();\n const directory = makeConsumer({\n 'base.json': '{\"compilerOptions\":{\"allowImportingTsExtensions\":true,\"noEmit\":true}}',\n 'tsconfig.json': '{\"extends\":\"./base.json\"}',\n });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n });\n\n test('writes the flag once confirmed', async () => {\n const clack = stubClack();\n const directory = makeConsumer({\n 'tsconfig.json': '{\\n \"compilerOptions\": {\\n \"noEmit\": true\\n }\\n}\\n',\n });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8'))\n .toContain('\"allowImportingTsExtensions\": true');\n expect(clack.note).toHaveBeenCalledWith(expect.any(String), 'Updated tsconfig.json');\n });\n\n test('skips the prompt under --yes', async () => {\n const clack = stubClack();\n const directory = makeConsumer({ 'tsconfig.json': '{\"compilerOptions\":{\"noEmit\":true}}' });\n\n await applyTsExtensionsFlag(clack, {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n autoConfirm: true,\n });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8'))\n .toContain('\"allowImportingTsExtensions\": true');\n });\n\n test('leaves the file alone and prints the snippet when declined', async () => {\n const clack = stubClack(false);\n const raw = '{\"compilerOptions\":{\"strict\":true,\"noEmit\":true}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n expect(clack.note).toHaveBeenCalledWith(\n expect.stringContaining(TS_EXTENSIONS_SNIPPET),\n 'tsconfig.json not updated'\n );\n expect(clack.note).toHaveBeenCalledWith(\n expect.stringContaining('./insider.lint.ts'),\n 'tsconfig.json not updated'\n );\n });\n\n test('prints the snippet when the file cannot be edited surgically', async () => {\n const clack = stubClack();\n const directory = makeConsumer({\n 'tsconfig.json': '{\"compilerOptions\": null, \"extends\": \"./base.json\"}',\n 'base.json': '{\"compilerOptions\":{\"noEmit\":true}}',\n });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(clack.note).toHaveBeenCalledWith(expect.any(String), 'tsconfig.json not updated');\n });\n\n test('treats a cancelled prompt as a decline', async () => {\n const clack = stubClack();\n const raw = '{\"compilerOptions\":{\"strict\":true,\"noEmit\":true}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n clack.confirm.mockResolvedValue(clack.cancelSymbol);\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n expect(clack.note).toHaveBeenCalledWith(expect.any(String), 'tsconfig.json not updated');\n });\n\n test('leaves the file alone when a decline has no note channel to print into', async () => {\n const raw = '{\"compilerOptions\":{\"strict\":true,\"noEmit\":true}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(stubClackWithoutNote(false), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n });\n\n test('writes the flag when confirmed through a clack build carrying no note', async () => {\n const directory = makeConsumer({\n 'tsconfig.json': '{\\n \"compilerOptions\": {\\n \"noEmit\": true\\n }\\n}\\n',\n });\n\n await applyTsExtensionsFlag(stubClackWithoutNote(), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8'))\n .toContain(`\"${TS_EXTENSIONS_FLAG}\": true`);\n });\n });\n\n // TS5096: `allowImportingTsExtensions` is only legal on a project that does not emit, so writing\n // it into an emitting tsconfig trades one hard `tsc` failure for another. Verified against the\n // pinned typescript@5.9.3 for all four shapes below.\n describe('applyTsExtensionsFlag against an emitting project', () => {\n test('refuses to write the flag and explains TS5096 instead', async () => {\n const clack = stubClack();\n const raw = '{\"compilerOptions\":{\"outDir\":\"dist\",\"module\":\"esnext\"}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.ts' });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(clack.note).toHaveBeenCalledWith(\n expect.stringContaining('TS5096'),\n 'tsconfig.json not updated'\n );\n });\n\n test('refuses even under --yes, which cannot make the combination legal', async () => {\n const raw = '{\"compilerOptions\":{\"outDir\":\"dist\"}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(stubClack(), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n autoConfirm: true,\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n });\n\n test('leaves the file alone when there is no note channel to explain it', async () => {\n const raw = '{\"compilerOptions\":{\"outDir\":\"dist\"}}';\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(stubClackWithoutNote(), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n autoConfirm: true,\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8')).toBe(raw);\n });\n\n test.each([\n ['noEmit', '{\"compilerOptions\":{\"noEmit\":true}}'],\n ['emitDeclarationOnly', '{\"compilerOptions\":{\"declaration\":true,\"emitDeclarationOnly\":true}}'],\n ['rewriteRelativeImportExtensions',\n '{\"compilerOptions\":{\"outDir\":\"dist\",\"rewriteRelativeImportExtensions\":true}}'],\n ])('writes the flag into a project whose %s legitimizes it', async (_label, raw) => {\n const directory = makeConsumer({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(stubClack(), {\n cwd: directory,\n lintModule: 'insider.lint.ts',\n autoConfirm: true,\n });\n\n expect(readFileSync(join(directory, 'tsconfig.json'), 'utf8'))\n .toContain(`\"${TS_EXTENSIONS_FLAG}\": true`);\n });\n });\n\n describe('tsconfigsNeedingFlag', () => {\n test('nominates nothing when no tsconfig type-checks the generated files', () => {\n const directory = makeConsumer({\n 'tsconfig.json': '{\"compilerOptions\":{\"noEmit\":true},\"include\":[\"src\"]}',\n });\n\n expect(tsconfigsNeedingFlag(directory, [join(directory, 'insider.lint.ts')]))\n .toStrictEqual([]);\n });\n\n test('reports whether a nominated project can legally carry the flag', () => {\n const directory = makeConsumer({ 'tsconfig.json': '{\"compilerOptions\":{\"outDir\":\"dist\"}}' });\n const [state] = tsconfigsNeedingFlag(directory, [join(directory, 'insider.lint.ts')]);\n\n expect(state.governs).toBe(true);\n expect(state.acceptsFlag).toBe(false);\n });\n });\n}\n","import { type Dirent, readFileSync, readdirSync, realpathSync, writeFileSync } from 'node:fs';\nimport { extname, join } from 'node:path';\nimport { parse } from '@typescript-eslint/parser';\nimport { AST_TOKEN_TYPES, type TSESTree } from '@typescript-eslint/types';\nimport { isOxlintOwned, isVueUnsafeRule } from '~/builders/oxlintOwnership';\n\nconst DIRECTIVE_HEAD = /^\\s*eslint-disable(-next-line|-line)?(?![\\w-])/u;\nconst SCRIPT_BLOCK = /<script\\b[^>]*>([\\s\\S]*?)<\\/script>/giu;\nconst SFC_EXTENSIONS: readonly string[] = ['.astro', '.svelte', '.vue'];\nconst JSX_EXTENSIONS: readonly string[] = ['.cjs', '.js', '.jsx', '.mjs', '.tsx'];\n\nconst LINTED_EXTENSIONS: readonly string[] = [\n '.astro',\n '.cjs',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.mts',\n '.svelte',\n '.ts',\n '.tsx',\n '.vue',\n];\n\nconst SKIPPED_DIRECTORIES: ReadonlySet<string> = new Set([\n '.git',\n 'coverage',\n 'dist',\n 'build',\n 'node_modules',\n 'out',\n 'vendor',\n]);\n\ninterface ParsedDirective {\n rules: string[];\n reason: string;\n}\n\nfunction parseDirectiveBody (body: string): ParsedDirective {\n const [ruleList, ...reasonParts] = body.split('--');\n const rules = ruleList\n .split(',')\n .map(rule => rule.trim())\n .filter(rule => rule.length > 0);\n\n return { rules, reason: reasonParts.join('--').trim() };\n}\n\nfunction formatDirective (\n owner: 'eslint' | 'oxlint',\n block: boolean,\n kind: string,\n rules: readonly string[],\n reason: string\n): string {\n const body = reason ? `${rules.join(', ')} -- ${reason}` : rules.join(', ');\n const text = `${owner}-disable${kind} ${body}`;\n\n return block ? `/* ${text} */` : `// ${text}`;\n}\n\n/**\n * Whether the split hands this rule to oxlint for the given file, so an `eslint-disable` comment\n * naming it would read as an unused directive to ESLint.\n * @example\n * movesToOxlint('no-console', '.ts'); // true\n * movesToOxlint('@typescript-eslint/no-unused-vars', '.vue'); // false — ESLint still runs it in SFCs\n */\nexport function movesToOxlint (rule: string, fileExtension: string): boolean {\n if (!isOxlintOwned(rule)) {\n return false;\n }\n\n return !(SFC_EXTENSIONS.includes(fileExtension) && isVueUnsafeRule(rule));\n}\n\nexport interface CommentSpan {\n start: number;\n end: number;\n block: boolean;\n value: string;\n}\n\nfunction toSpans (comments: readonly TSESTree.Comment[], offset: number): CommentSpan[] {\n return comments.map(comment => ({\n start: comment.range[0] + offset,\n end: comment.range[1] + offset,\n block: comment.type === AST_TOKEN_TYPES.Block,\n value: comment.value,\n }));\n}\n\nfunction parseComments (source: string, jsx: boolean): TSESTree.Comment[] | null {\n try {\n const program = parse(source, { comment: true, jsx, range: true });\n\n return program.comments ?? [];\n } catch {\n return null;\n }\n}\n\n// Both parses are attempted because the JSX flag changes how `<T>value` is read, and neither the\n// file extension nor an SFC `lang` attribute is a reliable signal on its own.\nfunction collectFromScript (source: string, jsx: boolean, offset: number): CommentSpan[] {\n const comments = parseComments(source, jsx) ?? parseComments(source, !jsx);\n\n return comments ? toSpans(comments, offset) : [];\n}\n\nconst CLOSING_SCRIPT_TAG_LENGTH = '</script>'.length;\n\nfunction collectSfcComments (source: string, jsx: boolean): CommentSpan[] {\n return [...source.matchAll(SCRIPT_BLOCK)].flatMap(match => {\n const [whole, body] = match;\n const offset = (match.index ?? 0) + whole.length - body.length - CLOSING_SCRIPT_TAG_LENGTH;\n\n return collectFromScript(body, jsx, offset);\n });\n}\n\n/**\n * Every real comment node in the file, with ranges relative to the whole source. Only comments are\n * returned, so a string or template literal that happens to spell out a directive is invisible here.\n * @example\n * collectComments(\"const label = '// eslint-disable-next-line';\\n\", '.ts'); // []\n */\nexport function collectComments (source: string, fileExtension: string): CommentSpan[] {\n const jsx = JSX_EXTENSIONS.includes(fileExtension);\n\n if (SFC_EXTENSIONS.includes(fileExtension)) {\n return collectSfcComments(source, jsx);\n }\n\n return collectFromScript(source, jsx, 0);\n}\n\ninterface Replacement {\n start: number;\n end: number;\n text: string;\n}\n\nfunction startsItsOwnLine (source: string, start: number): boolean {\n const lineStart = source.lastIndexOf('\\n', start - 1) + 1;\n\n return source.slice(lineStart, start).trim().length === 0;\n}\n\n// A split has to leave both directives pointing at the same code. `-line` and `-next-line` each\n// target one exact physical line, so a newline between the halves would move the `-line` directive\n// off its own line and make the `-next-line` one target its sibling comment instead of the code.\n// Both therefore stay on a single line — as block comments, because a second `//` comment on the\n// same line would be swallowed by the first. Only a whole-file `eslint-disable` is line-agnostic\n// and can keep the newline separator.\nfunction splitLayout (source: string, span: CommentSpan, kind: string): { block: boolean; separator: string } {\n if (kind !== '' || !startsItsOwnLine(source, span.start)) {\n return { block: true, separator: ' ' };\n }\n\n const indent = ' '.repeat(span.start - (source.lastIndexOf('\\n', span.start - 1) + 1));\n\n return { block: span.block, separator: `\\n${indent}` };\n}\n\nfunction replacementFor (source: string, span: CommentSpan, fileExtension: string): Replacement | null {\n const head = DIRECTIVE_HEAD.exec(span.value);\n\n if (!head) {\n return null;\n }\n\n const kind = head[1] ?? '';\n const { rules, reason } = parseDirectiveBody(span.value.slice(head[0].length));\n\n if (rules.length === 0) {\n return null;\n }\n\n const moved = rules.filter(rule => movesToOxlint(rule, fileExtension));\n\n if (moved.length === 0) {\n return null;\n }\n\n const kept = rules.filter(rule => !moved.includes(rule));\n\n if (kept.length === 0) {\n return {\n start: span.start,\n end: span.end,\n text: formatDirective('oxlint', span.block, kind, moved, reason),\n };\n }\n\n const { block, separator } = splitLayout(source, span, kind);\n const text = formatDirective('oxlint', block, kind, moved, reason)\n + separator\n + formatDirective('eslint', block, kind, kept, reason);\n\n return { start: span.start, end: span.end, text };\n}\n\n/**\n * Re-points the rules oxlint now owns onto an `oxlint-disable` comment, leaving the ESLint-owned\n * ones behind. Only real comment nodes are rewritten, so a string or template literal spelling out\n * a directive is left alone.\n * @example\n * rewriteDirectives('// <eslint>-disable-next-line no-console\\nlog();', '.ts').source;\n * // '// oxlint-disable-next-line no-console\\nlog();'\n */\nexport function rewriteDirectives (source: string, fileExtension: string): { source: string; changed: boolean } {\n const replacements = collectComments(source, fileExtension)\n .map(span => replacementFor(source, span, fileExtension))\n .filter((replacement): replacement is Replacement => replacement !== null)\n .sort((left, right) => right.start - left.start);\n\n if (replacements.length === 0) {\n return { source, changed: false };\n }\n\n const next = replacements.reduce(\n (accumulator, replacement) => accumulator.slice(0, replacement.start)\n + replacement.text\n + accumulator.slice(replacement.end),\n source\n );\n\n return { source: next, changed: true };\n}\n\nfunction isLintedFile (filePath: string): boolean {\n return LINTED_EXTENSIONS.includes(extname(filePath));\n}\n\nfunction readEntries (directory: string): Dirent[] {\n try {\n return readdirSync(directory, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n\nfunction realPathOf (path: string): string | null {\n try {\n return realpathSync(path);\n } catch {\n return null;\n }\n}\n\n// A symlinked directory pointing at an ancestor — `public/assets -> ../assets`, or a link farm in a\n// monorepo — makes a naive walk recurse until the stack overflows. Directories are entered by their\n// real path, once, and an unreadable entry is skipped rather than aborting the whole migration.\nfunction collectFiles (directory: string, accumulator: string[], visited: Set<string>): void {\n const real = realPathOf(directory);\n\n if (real === null || visited.has(real)) {\n return;\n }\n\n visited.add(real);\n\n readEntries(directory).forEach(entry => {\n if (SKIPPED_DIRECTORIES.has(entry.name)) {\n return;\n }\n\n const full = join(directory, entry.name);\n\n if (entry.isDirectory()) {\n collectFiles(full, accumulator, visited);\n\n return;\n }\n\n if (entry.isFile() && isLintedFile(full)) {\n accumulator.push(full);\n }\n });\n}\n\nexport interface RewriteDirectivesResult {\n rewritten: string[];\n skipped: string[];\n}\n\nexport interface DirectiveRewriteCandidate {\n path: string;\n source: string;\n}\n\nexport interface DirectivePreview {\n candidates: DirectiveRewriteCandidate[];\n skipped: string[];\n}\n\n// Both passes run after the migration has already written the new layout and deleted the old config,\n// so a file the walk listed but cannot be read or written — EACCES on a root-owned path, or one a\n// watcher removed between the walk and the read — has to be reported and left alone. Throwing here\n// would abort a migration that is already half applied, with nothing saying the config write worked.\nfunction readSource (filePath: string): string | null {\n try {\n return readFileSync(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\n/**\n * Every file whose `eslint-disable` comments would be re-pointed, and the rewritten source, without\n * touching disk. The directive rewrite is the largest diff a migration produces, so the count is\n * reported — and confirmed — before anything is written. Files that could not be read come back in\n * `skipped` instead of aborting the walk.\n * @example\n * previewDisableDirectives('/repo').candidates.length; // 131\n */\nexport function previewDisableDirectives (cwd: string): DirectivePreview {\n const files: string[] = [];\n const candidates: DirectiveRewriteCandidate[] = [];\n const skipped: string[] = [];\n\n collectFiles(cwd, files, new Set());\n\n files.forEach(filePath => {\n const source = readSource(filePath);\n\n if (source === null) {\n skipped.push(filePath);\n\n return;\n }\n\n const result = rewriteDirectives(source, extname(filePath));\n\n if (result.changed) {\n candidates.push({ path: filePath, source: result.source });\n }\n });\n\n return { candidates, skipped };\n}\n\n/**\n * What the consumer is told about the files the rewrite could not touch: the paths, then why it\n * matters and how to finish the job. Nothing else in the migration is affected, and saying so is the\n * point — the layout was already written by the time the walk ran.\n * @example\n * formatUntouchedDirectiveFiles(['/repo/src/vendor.ts']); // '/repo/src/vendor.ts\\n\\nThese could not…'\n */\nexport function formatUntouchedDirectiveFiles (skipped: readonly string[]): string {\n return `${skipped.join('\\n')}\\n\\n`\n + 'These could not be read or written, so their `eslint-disable` comments still name rules oxlint'\n + ' now owns and ESLint will report each one as an unused directive. Everything else was migrated.'\n + ' Fix the access and re-run `npx @useinsider/eslint-config migrate` to pick them up.';\n}\n\n/**\n * Applies {@link rewriteDirectives} across a consumer tree, skipping build output and dependencies.\n * A candidate whose write fails comes back in `skipped`, so one failed write costs its own\n * directives rather than every later file's.\n * @example\n * rewriteDisableDirectives('/repo').rewritten; // ['/repo/src/logger.ts']\n */\nexport function rewriteDisableDirectives (\n cwd: string,\n candidates: readonly DirectiveRewriteCandidate[] = previewDisableDirectives(cwd).candidates\n): RewriteDirectivesResult {\n const rewritten: string[] = [];\n const skipped: string[] = [];\n\n candidates.forEach(candidate => {\n try {\n writeFileSync(candidate.path, candidate.source, 'utf8');\n rewritten.push(candidate.path);\n } catch {\n skipped.push(candidate.path);\n }\n });\n\n return { rewritten, skipped };\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('movesToOxlint', () => {\n test('claims a rule oxlint implements', () => {\n expect(movesToOxlint('no-console', '.ts')).toBe(true);\n });\n\n test('leaves a rule only ESLint implements', () => {\n expect(movesToOxlint('sonarjs/no-identical-functions', '.ts')).toBe(false);\n expect(movesToOxlint('@stylistic/indent', '.ts')).toBe(false);\n });\n\n test('leaves SFC-unsafe rules alone inside single-file components', () => {\n expect(movesToOxlint('@typescript-eslint/no-unused-vars', '.vue')).toBe(false);\n expect(movesToOxlint('@typescript-eslint/no-unused-vars', '.ts')).toBe(true);\n });\n });\n\n describe('rewriteDirectives', () => {\n test('re-points a line directive whose only rule moved', () => {\n const { source, changed } = rewriteDirectives(\n '// eslint-disable-next-line no-console\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(changed).toBe(true);\n expect(source).toBe('// oxlint-disable-next-line no-console\\nconsole.log(1);\\n');\n });\n\n test('preserves the justification tail', () => {\n const { source } = rewriteDirectives(\n '// eslint-disable-next-line no-console -- diagnostic surface\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(source).toContain('// oxlint-disable-next-line no-console -- diagnostic surface');\n });\n\n test('leaves a directive whose rules all stay with ESLint', () => {\n const input = '// eslint-disable-next-line sonarjs/no-identical-functions\\nconst a = 1;\\n';\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('keeps both halves of a split -next-line directive on one line above the code', () => {\n const { source } = rewriteDirectives(\n '// eslint-disable-next-line no-console, @stylistic/indent\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(source).toBe(\n '/* oxlint-disable-next-line no-console */'\n + ' /* eslint-disable-next-line @stylistic/indent */\\n'\n + 'console.log(1);\\n'\n );\n });\n\n test('keeps a split directive on its original indentation', () => {\n const { source } = rewriteDirectives(\n 'function run () {\\n // eslint-disable-next-line no-console, @stylistic/indent\\n'\n + ' console.log(1);\\n}\\n',\n '.ts'\n );\n\n expect(source).toContain(\n ' /* oxlint-disable-next-line no-console */'\n + ' /* eslint-disable-next-line @stylistic/indent */\\n console.log(1);\\n'\n );\n });\n\n test('splits a whole-file directive across two lines, where neither half targets a line', () => {\n const { source } = rewriteDirectives(\n '/* eslint-disable no-console, @stylistic/indent */\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(source).toBe(\n '/* oxlint-disable no-console */\\n'\n + '/* eslint-disable @stylistic/indent */\\n'\n + 'console.log(1);\\n'\n );\n });\n\n test('keeps a split -line directive on the same line, where both halves still apply', () => {\n const { source } = rewriteDirectives(\n 'console.log(1); // eslint-disable-line no-console, @stylistic/indent\\n',\n '.ts'\n );\n\n expect(source).toBe(\n 'console.log(1); /* oxlint-disable-line no-console */'\n + ' /* eslint-disable-line @stylistic/indent */\\n'\n );\n });\n\n test('rewrites a block-comment directive', () => {\n const { source } = rewriteDirectives('/* eslint-disable no-console */\\n', '.ts');\n\n expect(source).toBe('/* oxlint-disable no-console */\\n');\n });\n\n test('leaves a bare eslint-disable with no rule list alone', () => {\n const input = '/* eslint-disable */\\nconsole.log(1);\\n';\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('keeps SFC-unsafe rules on the ESLint side inside a .vue file', () => {\n const input = [\n '<script>',\n '// eslint-disable-next-line @typescript-eslint/no-unused-vars',\n 'const a = 1;',\n '</script>',\n '',\n ].join('\\n');\n\n expect(rewriteDirectives(input, '.vue').changed).toBe(false);\n });\n\n test('rewrites a directive inside a .vue script block without touching the template', () => {\n const { source } = rewriteDirectives(\n [\n '<template><div /></template>',\n '<script>',\n '// eslint-disable-next-line no-console',\n 'console.log(1);',\n '</script>',\n '',\n ].join('\\n'),\n '.vue'\n );\n\n expect(source).toContain('<template><div /></template>');\n expect(source).toContain('// oxlint-disable-next-line no-console');\n });\n\n test('rewrites an eslint-disable-line directive', () => {\n const { source } = rewriteDirectives('console.log(1); // eslint-disable-line no-console\\n', '.ts');\n\n expect(source).toBe('console.log(1); // oxlint-disable-line no-console\\n');\n });\n\n test('leaves a directive spelled out inside a string or template literal alone', () => {\n const input = [\n \"const single = '// eslint-disable-next-line no-console';\",\n 'const template = `// eslint-disable-next-line no-console`;',\n 'const multiline = `',\n '/* eslint-disable no-console */',\n '// eslint-disable-line no-console',\n '`;',\n 'export { single, template, multiline };',\n '',\n ].join('\\n');\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('rewrites a real directive in a file that also carries one inside a literal', () => {\n const { source } = rewriteDirectives(\n [\n \"const doc = 'write // eslint-disable-next-line no-console above the call';\",\n '// eslint-disable-next-line no-console',\n 'console.log(doc);',\n '',\n ].join('\\n'),\n '.ts'\n );\n\n expect(source).toContain(\"const doc = 'write // eslint-disable-next-line no-console above the call';\");\n expect(source).toContain('// oxlint-disable-next-line no-console\\nconsole.log(doc);');\n });\n\n test('keeps a reason that carries its own -- separator byte-identical', () => {\n const { source } = rewriteDirectives(\n '// eslint-disable-next-line no-console -- keep -- for now\\nconsole.log(1);\\n',\n '.ts'\n );\n\n expect(source).toBe('// oxlint-disable-next-line no-console -- keep -- for now\\nconsole.log(1);\\n');\n });\n\n test.each([\n '// eslint-disable-next-liner no-console',\n '// eslint-disabled no-console',\n '// eslint-disable-lines no-console',\n ])('leaves %s alone, since it only starts with the directive text', comment => {\n const input = `${comment}\\nconsole.log(1);\\n`;\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('retries the other JSX setting, so a .js type assertion does not hide its directives', () => {\n const input = '// eslint-disable-next-line no-console\\nconsole.log(<string>value);\\n';\n\n expect(rewriteDirectives(input, '.js').source)\n .toBe('// oxlint-disable-next-line no-console\\nconsole.log(<string>value);\\n');\n });\n\n test('leaves an unparseable file untouched rather than guessing at its comments', () => {\n const input = '// eslint-disable-next-line no-console\\nconst = = =;\\n';\n\n expect(rewriteDirectives(input, '.ts')).toStrictEqual({ source: input, changed: false });\n });\n\n test('rewrites every directive in a file, not just the first', () => {\n const { source } = rewriteDirectives(\n [\n '// eslint-disable-next-line no-console',\n 'console.log(1);',\n '// eslint-disable-next-line no-var',\n 'var legacy = 2;',\n 'export { legacy };',\n '',\n ].join('\\n'),\n '.ts'\n );\n\n expect(source).toContain('// oxlint-disable-next-line no-console');\n expect(source).toContain('// oxlint-disable-next-line no-var');\n });\n });\n\n describe('collectComments', () => {\n test('finds no comment in a file whose only directive text is a string literal', () => {\n expect(collectComments(\"const a = '// eslint-disable-line no-console';\\n\", '.ts')).toStrictEqual([]);\n });\n\n test('reports ranges against the whole SFC, not the script block', () => {\n const source = '<template><p /></template>\\n<script>\\n// eslint-disable-line no-console\\n</script>\\n';\n const [span] = collectComments(source, '.vue');\n\n expect(source.slice(span.start, span.end)).toBe('// eslint-disable-line no-console');\n });\n });\n}\n","import type { StringEntry } from './types';\nimport * as ts from 'typescript';\n\nexport function toEntries (values: readonly string[]): StringEntry[] {\n return values.map(value => ({ value }));\n}\n\nexport function entryValues (entries: readonly StringEntry[]): string[] {\n return entries.map(entry => entry.value);\n}\n\nexport function cloneEntry (entry: StringEntry): StringEntry {\n return entry.leadingComment === undefined\n ? { value: entry.value }\n : { value: entry.value, leadingComment: entry.leadingComment };\n}\n\nexport function cloneEntries (entries: readonly StringEntry[]): StringEntry[] {\n return entries.map(cloneEntry);\n}\n\nexport function findEntry (entries: readonly StringEntry[], value: string): StringEntry | undefined {\n return entries.find(entry => entry.value === value);\n}\n\nexport function hasValue (entries: readonly StringEntry[], value: string): boolean {\n return entries.some(entry => entry.value === value);\n}\n\nexport function leadingCommentTextFor (sourceFile: ts.SourceFile, node: ts.Node): string | undefined {\n const ranges = ts.getLeadingCommentRanges(sourceFile.text, node.getFullStart());\n\n if (!ranges || ranges.length === 0) {\n return undefined;\n }\n\n return ranges\n .map(range => sourceFile.text.slice(range.pos, range.end))\n .join('\\n');\n}\n","import type { StringEntry, V1GlobalConf, V1GlobalToken } from '../types';\nimport type { MigrationWarning } from '../warnings';\nimport type {\n EslintrcEnv,\n EslintrcExtend,\n EslintrcExtendKind,\n EslintrcFieldComments,\n EslintrcOverride,\n EslintrcParseResult,\n EslintrcParserOptions,\n EslintrcRootBlock,\n EslintrcRulesBlock,\n} from './types';\nimport * as ts from 'typescript';\nimport { leadingCommentTextFor } from '../stringEntry';\n\ninterface ParseContext {\n sourceFile: ts.SourceFile;\n warnings: MigrationWarning[];\n constantRulesObjects: Map<string, ts.ObjectLiteralExpression>;\n}\n\nfunction lineOf (sourceFile: ts.SourceFile, node: ts.Node): number {\n const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));\n\n return line + 1;\n}\n\nfunction isStringLiteralLike (node: ts.Node): node is ts.StringLiteral | ts.NoSubstitutionTemplateLiteral {\n return ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node);\n}\n\nfunction propertyKeyName (property: ts.ObjectLiteralElementLike): string | null {\n if (!ts.isPropertyAssignment(property) && !ts.isShorthandPropertyAssignment(property)) {\n return null;\n }\n\n const key = property.name;\n\n if (ts.isIdentifier(key) || ts.isStringLiteral(key)) {\n return key.text;\n }\n\n return null;\n}\n\nfunction findProperty (\n object: ts.ObjectLiteralExpression,\n name: string\n): ts.PropertyAssignment | undefined {\n return object.properties\n .filter((property): property is ts.PropertyAssignment => ts.isPropertyAssignment(property))\n .find(property => propertyKeyName(property) === name);\n}\n\nfunction readStringArray (initializer: ts.Expression | undefined): string[] {\n if (!initializer || !ts.isArrayLiteralExpression(initializer)) {\n return [];\n }\n\n return initializer.elements\n .map(element => (isStringLiteralLike(element) ? element.text : null))\n .filter((value): value is string => value !== null);\n}\n\nfunction readStringEntries (\n initializer: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): StringEntry[] {\n if (!initializer || !ts.isArrayLiteralExpression(initializer)) {\n return [];\n }\n\n return initializer.elements\n .map(element => {\n if (!isStringLiteralLike(element)) {\n return null;\n }\n\n const leadingComment = leadingCommentTextFor(sourceFile, element);\n\n return leadingComment === undefined\n ? { value: element.text }\n : { value: element.text, leadingComment };\n })\n .filter((entry): entry is StringEntry => entry !== null);\n}\n\nfunction readStringOrArray (initializer: ts.Expression | undefined): string[] {\n if (!initializer) {\n return [];\n }\n\n if (isStringLiteralLike(initializer)) {\n return [initializer.text];\n }\n\n return readStringArray(initializer);\n}\n\nfunction readStringOrEntries (\n initializer: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): StringEntry[] {\n if (!initializer) {\n return [];\n }\n\n if (isStringLiteralLike(initializer)) {\n return [{ value: initializer.text }];\n }\n\n return readStringEntries(initializer, sourceFile);\n}\n\nfunction readGlobalValue (initializer: ts.Expression): { value: V1GlobalConf } | null {\n if (isStringLiteralLike(initializer)) {\n return { value: initializer.text };\n }\n\n if (initializer.kind === ts.SyntaxKind.TrueKeyword) {\n return { value: true };\n }\n\n if (initializer.kind === ts.SyntaxKind.FalseKeyword) {\n return { value: false };\n }\n\n if (ts.isNumericLiteral(initializer)) {\n return { value: Number(initializer.text) };\n }\n\n return null;\n}\n\nfunction readGlobalsObject (initializer: ts.Expression | undefined): Record<string, V1GlobalConf> | undefined {\n if (!initializer || !ts.isObjectLiteralExpression(initializer)) {\n return undefined;\n }\n\n const entries: [string, V1GlobalConf][] = [];\n\n initializer.properties.forEach(property => {\n if (!ts.isPropertyAssignment(property)) {\n return;\n }\n\n const name = propertyKeyName(property);\n\n if (name === null) {\n return;\n }\n\n const wrapper = readGlobalValue(property.initializer);\n\n if (wrapper === null) {\n return;\n }\n\n entries.push([name, wrapper.value]);\n });\n\n if (entries.length === 0) {\n return undefined;\n }\n\n return Object.fromEntries(entries);\n}\n\nfunction readGlobalsTokens (\n initializer: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): V1GlobalToken[] | undefined {\n if (!initializer || !ts.isObjectLiteralExpression(initializer)) {\n return undefined;\n }\n\n const tokens: V1GlobalToken[] = [];\n\n initializer.properties.forEach(property => {\n if (ts.isSpreadAssignment(property)) {\n tokens.push({ kind: 'spread', raw: property.expression.getText(sourceFile) });\n\n return;\n }\n\n if (!ts.isPropertyAssignment(property)) {\n return;\n }\n\n const name = propertyKeyName(property);\n\n if (name === null) {\n return;\n }\n\n const wrapper = readGlobalValue(property.initializer);\n\n if (wrapper === null) {\n return;\n }\n\n tokens.push({ kind: 'named', key: name, value: wrapper.value });\n });\n\n return tokens.length > 0 ? tokens : undefined;\n}\n\nfunction readPluginsArray (initializer: ts.Expression | undefined): string[] {\n if (!initializer) {\n return [];\n }\n\n if (ts.isArrayLiteralExpression(initializer)) {\n return readStringArray(initializer);\n }\n\n if (ts.isObjectLiteralExpression(initializer)) {\n return initializer.properties\n .map(propertyKeyName)\n .filter((name): name is string => name !== null);\n }\n\n return [];\n}\n\nfunction readEnvBoolean (value: ts.Expression): boolean {\n if (value.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n\n if (value.kind === ts.SyntaxKind.FalseKeyword) {\n return false;\n }\n\n if (ts.isNumericLiteral(value)) {\n return Number(value.text) !== 0;\n }\n\n if (isStringLiteralLike(value)) {\n return value.text.length > 0;\n }\n\n return false;\n}\n\nfunction readEnvFromInitializer (initializer: ts.Expression | undefined): EslintrcEnv {\n const env: EslintrcEnv = { browser: false, node: false, jest: false, jestGlobals: false };\n\n if (!initializer || !ts.isObjectLiteralExpression(initializer)) {\n return env;\n }\n\n initializer.properties.forEach(property => {\n if (!ts.isPropertyAssignment(property)) {\n return;\n }\n\n const name = propertyKeyName(property);\n const truthy = readEnvBoolean(property.initializer);\n\n if (!truthy) {\n return;\n }\n\n if (name === 'browser') {\n env.browser = true;\n } else if (name === 'node') {\n env.node = true;\n } else if (name === 'jest') {\n env.jest = true;\n } else if (name === 'jest/globals') {\n env.jestGlobals = true;\n }\n });\n\n return env;\n}\n\nfunction classifyExtendValue (raw: string): EslintrcExtend {\n if (raw.startsWith('@useinsider/eslint-config')) {\n const slashIndex = raw.indexOf('/', '@useinsider/eslint-config'.length);\n const preset = slashIndex >= 0 ? raw.slice(slashIndex + 1) : '';\n\n return { raw, kind: 'insider', insiderPreset: preset };\n }\n\n if (raw.startsWith('plugin:vue/')) {\n const rest = raw.slice('plugin:vue/'.length);\n const vueMajor: 2 | 3 = rest.startsWith('vue2-') ? 2 : 3;\n\n return { raw, kind: 'vue', vueMajor };\n }\n\n if (raw.startsWith('plugin:jest/')) {\n return { raw, kind: 'jest' };\n }\n\n if (raw.startsWith('plugin:jsdoc/')) {\n return { raw, kind: 'jsdoc' };\n }\n\n if (raw === 'airbnb' || raw === 'airbnb-base' || raw.startsWith('airbnb-')) {\n return { raw, kind: 'airbnb' };\n }\n\n const kind: EslintrcExtendKind = 'other';\n\n return { raw, kind };\n}\n\nfunction readExtends (initializer: ts.Expression | undefined): EslintrcExtend[] {\n if (!initializer) {\n return [];\n }\n\n if (isStringLiteralLike(initializer)) {\n return [classifyExtendValue(initializer.text)];\n }\n\n return readStringArray(initializer).map(classifyExtendValue);\n}\n\nfunction readParserMarker (initializer: ts.Expression | undefined): boolean {\n if (!initializer || !isStringLiteralLike(initializer)) {\n return false;\n }\n\n return initializer.text.includes('typescript-eslint');\n}\n\nfunction readParserOptions (initializer: ts.Expression | undefined, env: EslintrcEnv): {\n options: EslintrcParserOptions;\n parserMarker: boolean;\n} {\n const options: EslintrcParserOptions = {};\n let parserMarker = false;\n\n if (!initializer || !ts.isObjectLiteralExpression(initializer)) {\n return { options, parserMarker };\n }\n\n const projectProperty = findProperty(initializer, 'project');\n\n if (projectProperty) {\n const project = readStringOrArray(projectProperty.initializer);\n\n if (project.length > 0) {\n options.project = project;\n }\n }\n\n const parserProperty = findProperty(initializer, 'parser');\n\n if (parserProperty && readParserMarker(parserProperty.initializer)) {\n parserMarker = true;\n }\n\n void env;\n\n return { options, parserMarker };\n}\n\nfunction extractGlobalComponents (\n rulesNode: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile\n): StringEntry[] | undefined {\n const rule = findProperty(rulesNode, 'vue/no-undef-components');\n\n if (!rule || !ts.isArrayLiteralExpression(rule.initializer)) {\n return undefined;\n }\n\n const [, optionsNode] = rule.initializer.elements;\n\n if (!optionsNode || !ts.isObjectLiteralExpression(optionsNode)) {\n return undefined;\n }\n\n const ignorePatterns = findProperty(optionsNode, 'ignorePatterns');\n\n if (!ignorePatterns) {\n return undefined;\n }\n\n const values = readStringEntries(ignorePatterns.initializer, sourceFile);\n\n return values.length > 0 ? values : undefined;\n}\n\nfunction detectSpellCheckerOff (rulesNode: ts.ObjectLiteralExpression): boolean {\n const rule = findProperty(rulesNode, '@cspell/spellchecker');\n\n if (!rule) {\n return false;\n }\n\n return isStringLiteralLike(rule.initializer) && rule.initializer.text === 'off';\n}\n\nfunction resolveSpreadKeyCount (expression: ts.Expression, context: ParseContext): number | null {\n if (!ts.isIdentifier(expression)) {\n return null;\n }\n\n const target = context.constantRulesObjects.get(expression.text);\n\n if (!target) {\n return null;\n }\n\n const keys = new Set<string>();\n\n target.properties.forEach(property => {\n const name = propertyKeyName(property);\n\n if (name !== null && name !== 'vue/no-undef-components' && name !== '@cspell/spellchecker') {\n keys.add(name);\n }\n });\n\n return keys.size;\n}\n\nfunction readRulesBlock (\n rulesPropertyInitializer: ts.Expression | undefined,\n context: ParseContext\n): EslintrcRulesBlock {\n const block: EslintrcRulesBlock = {\n customRuleCount: 0,\n spellCheckerOff: false,\n unresolvedSpreads: [],\n };\n\n if (!rulesPropertyInitializer || !ts.isObjectLiteralExpression(rulesPropertyInitializer)) {\n return block;\n }\n\n block.globalComponents = extractGlobalComponents(rulesPropertyInitializer, context.sourceFile);\n block.spellCheckerOff = detectSpellCheckerOff(rulesPropertyInitializer);\n\n rulesPropertyInitializer.properties.forEach(property => {\n if (ts.isPropertyAssignment(property)) {\n const name = propertyKeyName(property);\n\n if (name === null || name === 'vue/no-undef-components' || name === '@cspell/spellchecker') {\n return;\n }\n\n block.customRuleCount += 1;\n\n return;\n }\n\n if (ts.isSpreadAssignment(property)) {\n const resolved = resolveSpreadKeyCount(property.expression, context);\n\n if (resolved === null) {\n const identifierName = ts.isIdentifier(property.expression) ? property.expression.text : '<expr>';\n\n block.unresolvedSpreads.push(identifierName);\n\n return;\n }\n\n block.customRuleCount += resolved;\n }\n });\n\n return block;\n}\n\nfunction collectConstantObjects (sourceFile: ts.SourceFile): Map<string, ts.ObjectLiteralExpression> {\n const map = new Map<string, ts.ObjectLiteralExpression>();\n\n sourceFile.statements.forEach(statement => {\n if (!ts.isVariableStatement(statement)) {\n return;\n }\n\n statement.declarationList.declarations.forEach(declaration => {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) {\n return;\n }\n\n if (ts.isObjectLiteralExpression(declaration.initializer)) {\n map.set(declaration.name.text, declaration.initializer);\n }\n });\n });\n\n return map;\n}\n\ninterface BlockReadInput {\n object: ts.ObjectLiteralExpression;\n line: number;\n context: ParseContext;\n}\n\nfunction assignCommentIfPresent (\n target: EslintrcFieldComments,\n key: keyof EslintrcFieldComments,\n comment: string | undefined\n): void {\n if (comment !== undefined) {\n target[key] = comment;\n }\n}\n\nfunction collectBlockFieldComments (\n object: ts.ObjectLiteralExpression,\n parserOptionsProperty: ts.PropertyAssignment | undefined,\n rulesProperty: ts.PropertyAssignment | undefined,\n rulesBlock: EslintrcRulesBlock,\n sourceFile: ts.SourceFile\n): EslintrcFieldComments | undefined {\n const fieldComments: EslintrcFieldComments = {};\n const filesProperty = findProperty(object, 'files');\n\n if (filesProperty) {\n assignCommentIfPresent(fieldComments, 'files', leadingCommentTextFor(sourceFile, filesProperty));\n }\n\n if (parserOptionsProperty && ts.isObjectLiteralExpression(parserOptionsProperty.initializer)) {\n const projectProperty = findProperty(parserOptionsProperty.initializer, 'project');\n\n if (projectProperty) {\n assignCommentIfPresent(fieldComments, 'project', leadingCommentTextFor(sourceFile, projectProperty));\n }\n }\n\n const globalsProperty = findProperty(object, 'globals');\n\n if (globalsProperty) {\n assignCommentIfPresent(fieldComments, 'globals', leadingCommentTextFor(sourceFile, globalsProperty));\n }\n\n if (rulesProperty && rulesBlock.globalComponents) {\n assignCommentIfPresent(fieldComments, 'globalComponents', leadingCommentTextFor(sourceFile, rulesProperty));\n }\n\n return Object.keys(fieldComments).length > 0 ? fieldComments : undefined;\n}\n\nfunction readSharedBlockFields (input: BlockReadInput): {\n extendsList: EslintrcExtend[];\n env: EslintrcEnv;\n parserOptions: EslintrcParserOptions;\n parserMarker: boolean;\n globals?: Record<string, V1GlobalConf>;\n globalsTokens?: V1GlobalToken[];\n customPluginNames?: string[];\n rulesBlock: EslintrcRulesBlock;\n fieldComments?: EslintrcFieldComments;\n} {\n const { object, line, context } = input;\n\n void line;\n\n const extendsProperty = findProperty(object, 'extends');\n const extendsList = readExtends(extendsProperty?.initializer);\n const env = readEnvFromInitializer(findProperty(object, 'env')?.initializer);\n const parserOptionsProperty = findProperty(object, 'parserOptions');\n const parserOptionsResult = readParserOptions(parserOptionsProperty?.initializer, env);\n const parserProperty = findProperty(object, 'parser');\n const parserMarker = parserOptionsResult.parserMarker || readParserMarker(parserProperty?.initializer);\n const globalsInit = findProperty(object, 'globals')?.initializer;\n const globalsTokens = readGlobalsTokens(globalsInit, context.sourceFile);\n const globals = readGlobalsObject(globalsInit);\n const rulesProperty = findProperty(object, 'rules');\n const rulesBlock = readRulesBlock(rulesProperty?.initializer, context);\n const insiderPluginNames = new Set<string>(['vue', '@typescript-eslint', 'jsdoc', 'import', 'jest', '@cspell']);\n const allPluginNames = readPluginsArray(findProperty(object, 'plugins')?.initializer);\n const customPluginNames = allPluginNames.filter(name => !insiderPluginNames.has(name));\n const fieldComments = collectBlockFieldComments(\n object,\n parserOptionsProperty,\n rulesProperty,\n rulesBlock,\n context.sourceFile\n );\n\n return {\n extendsList,\n env,\n parserOptions: parserOptionsResult.options,\n parserMarker,\n globals,\n globalsTokens,\n customPluginNames: customPluginNames.length > 0 ? customPluginNames : undefined,\n rulesBlock,\n fieldComments,\n };\n}\n\nfunction readOverride (\n object: ts.ObjectLiteralExpression,\n context: ParseContext,\n elementNode: ts.Node\n): EslintrcOverride | null {\n const line = lineOf(context.sourceFile, object);\n const filesProperty = findProperty(object, 'files');\n const files = filesProperty\n ? readStringOrEntries(filesProperty.initializer, context.sourceFile)\n : [];\n\n if (files.length === 0) {\n context.warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'overrides[] entry missing `files`; skipping',\n });\n\n return null;\n }\n\n const shared = readSharedBlockFields({ object, line, context });\n const leadingComment = leadingCommentTextFor(context.sourceFile, elementNode);\n const override: EslintrcOverride = {\n line,\n files,\n extends: shared.extendsList,\n env: shared.env,\n parserMarker: shared.parserMarker,\n parserOptions: shared.parserOptions,\n globals: shared.globals,\n globalsTokens: shared.globalsTokens,\n customPluginNames: shared.customPluginNames,\n rulesBlock: shared.rulesBlock,\n fieldComments: shared.fieldComments,\n };\n\n if (leadingComment !== undefined) {\n override.leadingComment = leadingComment;\n }\n\n return override;\n}\n\nfunction readOverrides (\n initializer: ts.Expression | undefined,\n context: ParseContext\n): EslintrcOverride[] {\n if (!initializer || !ts.isArrayLiteralExpression(initializer)) {\n return [];\n }\n\n return initializer.elements\n .map(element => (ts.isObjectLiteralExpression(element) ? readOverride(element, context, element) : null))\n .filter((value): value is EslintrcOverride => value !== null);\n}\n\nfunction matchesPropertyAccess (expression: ts.Expression, owner: string, member: string): boolean {\n if (!ts.isPropertyAccessExpression(expression)) {\n return false;\n }\n\n return ts.isIdentifier(expression.expression)\n && expression.expression.text === owner\n && expression.name.text === member;\n}\n\nfunction isExportsTarget (expression: ts.Expression): boolean {\n return matchesPropertyAccess(expression, 'module', 'exports')\n || matchesPropertyAccess(expression, 'exports', 'default');\n}\n\nfunction findExportObject (sourceFile: ts.SourceFile): ts.ObjectLiteralExpression | null {\n let result: ts.ObjectLiteralExpression | null = null;\n\n sourceFile.statements.forEach(statement => {\n if (result !== null) {\n return;\n }\n\n if (!ts.isExpressionStatement(statement)) {\n return;\n }\n\n const { expression } = statement;\n\n if (!ts.isBinaryExpression(expression) || expression.operatorToken.kind !== ts.SyntaxKind.EqualsToken) {\n return;\n }\n\n if (!isExportsTarget(expression.left)) {\n return;\n }\n\n if (ts.isObjectLiteralExpression(expression.right)) {\n result = expression.right;\n }\n });\n\n return result;\n}\n\nfunction buildRoot (object: ts.ObjectLiteralExpression, context: ParseContext): EslintrcRootBlock {\n const line = lineOf(context.sourceFile, object);\n const shared = readSharedBlockFields({ object, line, context });\n const overrides = readOverrides(findProperty(object, 'overrides')?.initializer, context);\n const ignorePatterns = readStringOrEntries(\n findProperty(object, 'ignorePatterns')?.initializer,\n context.sourceFile\n );\n const settingsProperty = findProperty(object, 'settings');\n\n return {\n line,\n extends: shared.extendsList,\n env: shared.env,\n parserMarker: shared.parserMarker,\n parserOptions: shared.parserOptions,\n globals: shared.globals,\n globalsTokens: shared.globalsTokens,\n customPluginNames: shared.customPluginNames,\n rulesBlock: shared.rulesBlock,\n overrides,\n ignorePatterns,\n hasSettings: Boolean(settingsProperty),\n fieldComments: shared.fieldComments,\n };\n}\n\nexport function parseEslintrc (source: string, filePath: string): EslintrcParseResult {\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const warnings: MigrationWarning[] = [];\n const constantRulesObjects = collectConstantObjects(sourceFile);\n const context: ParseContext = { sourceFile, warnings, constantRulesObjects };\n const exportObject = findExportObject(sourceFile);\n\n if (!exportObject) {\n return { found: false, root: null, warnings };\n }\n\n const root = buildRoot(exportObject, context);\n\n return { found: true, root, warnings };\n}\n","import type { V1GlobalConf, V1GlobalToken } from './types';\nimport globals from 'globals';\n\nexport const FOLDABLE_ENVS = [\n 'jest',\n 'vitest',\n 'jquery',\n 'serviceworker',\n 'worker',\n 'webextensions',\n 'node',\n 'browser',\n] as const;\n\nexport type FoldableEnv = typeof FOLDABLE_ENVS[number];\n\nconst HIGH_THRESHOLD_ENVS = new Set<FoldableEnv>(['node', 'browser']);\n\ntype TriState = 'writable' | 'readonly' | 'off';\n\nfunction normalizeGlobalValue (value: V1GlobalConf): TriState {\n if (value === true || value === 'writable' || value === 'writeable') {\n return 'writable';\n }\n\n if (value === 'off') {\n return 'off';\n }\n\n return 'readonly';\n}\n\ntype EnvEntries = Readonly<Record<string, boolean>>;\n\nfunction envEntries (env: FoldableEnv): EnvEntries {\n return globals[env];\n}\n\nfunction envHasName (env: FoldableEnv, name: string): boolean {\n return name in envEntries(env);\n}\n\nfunction envValueFor (env: FoldableEnv, name: string): TriState | null {\n const entries = envEntries(env);\n\n if (!(name in entries)) {\n return null;\n }\n\n return normalizeGlobalValue(entries[name]);\n}\n\nconst SPREAD_PATTERN = /^globals\\.([A-Za-z_$][\\w$]*)$/;\n\nfunction spreadEnvKey (raw: string): FoldableEnv | null {\n const match = SPREAD_PATTERN.exec(raw.trim());\n\n if (!match) {\n return null;\n }\n\n const [, key] = match;\n\n return (FOLDABLE_ENVS as readonly string[]).includes(key) ? (key as FoldableEnv) : null;\n}\n\nexport interface FoldResult {\n tokens: V1GlobalToken[];\n addedSpreadEnvs: FoldableEnv[];\n}\n\nexport function foldGlobalsTokens (input: readonly V1GlobalToken[]): FoldResult {\n const preservedSpreads: V1GlobalToken[] = [];\n const preservedSpreadEnvs = new Set<FoldableEnv>();\n const namedTokens: Extract<V1GlobalToken, { kind: 'named' }>[] = [];\n\n input.forEach(token => {\n if (token.kind === 'spread') {\n preservedSpreads.push({ ...token });\n\n const envKey = spreadEnvKey(token.raw);\n\n if (envKey) {\n preservedSpreadEnvs.add(envKey);\n }\n\n return;\n }\n\n namedTokens.push({ ...token });\n });\n\n const remaining = new Map<string, Extract<V1GlobalToken, { kind: 'named' }>>();\n const namedOrder: string[] = [];\n\n namedTokens.forEach(token => {\n if (!remaining.has(token.key)) {\n namedOrder.push(token.key);\n }\n\n remaining.set(token.key, token);\n });\n\n const syntheticSpreads: V1GlobalToken[] = [];\n const addedSpreadEnvs: FoldableEnv[] = [];\n\n FOLDABLE_ENVS.forEach(env => {\n if (preservedSpreadEnvs.has(env)) {\n namedOrder.forEach(name => {\n const named = remaining.get(name);\n\n if (!named) {\n return;\n }\n\n const envValue = envValueFor(env, name);\n\n if (envValue === null) {\n return;\n }\n\n if (envValue !== normalizeGlobalValue(named.value)) {\n return;\n }\n\n remaining.delete(name);\n });\n\n return;\n }\n\n const matches: string[] = [];\n\n namedOrder.forEach(name => {\n const named = remaining.get(name);\n\n if (!named) {\n return;\n }\n\n if (!envHasName(env, name)) {\n return;\n }\n\n const envValue = envValueFor(env, name);\n\n if (envValue === null) {\n return;\n }\n\n if (envValue !== normalizeGlobalValue(named.value)) {\n return;\n }\n\n matches.push(name);\n });\n\n const threshold = HIGH_THRESHOLD_ENVS.has(env) ? 3 : 1;\n\n if (matches.length < threshold) {\n return;\n }\n\n matches.forEach(name => remaining.delete(name));\n syntheticSpreads.push({ kind: 'spread', raw: `globals.${env}` });\n addedSpreadEnvs.push(env);\n });\n\n const finalNamed: V1GlobalToken[] = namedOrder\n .map(name => remaining.get(name))\n .filter((token): token is Extract<V1GlobalToken, { kind: 'named' }> => token !== undefined)\n .map(token => ({ ...token }));\n\n const tokens: V1GlobalToken[] = [...syntheticSpreads, ...preservedSpreads, ...finalNamed];\n\n return { tokens, addedSpreadEnvs };\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('foldGlobalsTokens', () => {\n test('folds exact jest globals set into a single spread', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'expect', value: 'readonly' },\n { kind: 'named', key: 'beforeEach', value: 'readonly' },\n { kind: 'named', key: 'afterEach', value: 'readonly' },\n { kind: 'named', key: 'jest', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([{ kind: 'spread', raw: 'globals.jest' }]);\n expect(addedSpreadEnvs).toStrictEqual(['jest']);\n });\n\n test('folds jest + vitest in deterministic priority order', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'jest', value: 'readonly' },\n { kind: 'named', key: 'vitest', value: 'readonly' },\n { kind: 'named', key: 'vi', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'spread', raw: 'globals.vitest' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual(['jest', 'vitest']);\n });\n\n test('keeps unmatched custom names as explicit entries after the spread', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual(['jest']);\n });\n\n test('skips node fold below the 3-name threshold', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'process', value: 'readonly' },\n { kind: 'named', key: 'Buffer', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'named', key: 'process', value: 'readonly' },\n { kind: 'named', key: 'Buffer', value: 'readonly' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual([]);\n });\n\n test('folds node when at least 3 node-exclusive names match', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'process', value: 'readonly' },\n { kind: 'named', key: 'Buffer', value: 'readonly' },\n { kind: 'named', key: 'global', value: 'readonly' },\n { kind: 'named', key: '__dirname', value: 'readonly' },\n { kind: 'named', key: '__filename', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual(['node']);\n expect(tokens).toStrictEqual([{ kind: 'spread', raw: 'globals.node' }]);\n });\n\n test('does not fold when consumer value disagrees with env value', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'jest', value: 'writable' },\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual(['jest']);\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'named', key: 'jest', value: 'writable' },\n ]);\n });\n\n test('preserves a pre-existing spread and drops named entries already covered', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual([]);\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n });\n\n test('keeps a pre-existing non-foldable spread verbatim with its order before explicit entries', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'spread', raw: 'customGlobals' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'customGlobals' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual([]);\n });\n\n test('returns explicit entries unchanged when no env matches', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n { kind: 'named', key: 'INSIDER_API_BASE_URL', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n { kind: 'named', key: 'INSIDER_API_BASE_URL', value: 'readonly' },\n ]);\n expect(addedSpreadEnvs).toStrictEqual([]);\n });\n\n test('renders synthetic spreads before preserved spreads and explicit names', () => {\n const { tokens } = foldGlobalsTokens([\n { kind: 'spread', raw: 'customGlobals' },\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'spread', raw: 'customGlobals' },\n { kind: 'named', key: 'APP_URL', value: 'readonly' },\n ]);\n });\n\n test('treats jest globals jest=false (readonly) as compatible with readonly', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'jest', value: false },\n { kind: 'named', key: 'describe', value: false },\n { kind: 'named', key: 'it', value: false },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual(['jest']);\n expect(tokens).toStrictEqual([{ kind: 'spread', raw: 'globals.jest' }]);\n });\n\n test('mocha-only names (before/after) stay explicit because mocha is not foldable', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'before', value: 'readonly' },\n { kind: 'named', key: 'after', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual([]);\n expect(tokens).toStrictEqual([\n { kind: 'named', key: 'before', value: 'readonly' },\n { kind: 'named', key: 'after', value: 'readonly' },\n ]);\n });\n\n test('jest+vitest fold but mocha-only before/after remain explicit (product-catalog scenario)', () => {\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens([\n { kind: 'named', key: 'describe', value: 'readonly' },\n { kind: 'named', key: 'it', value: 'readonly' },\n { kind: 'named', key: 'beforeEach', value: 'readonly' },\n { kind: 'named', key: 'afterEach', value: 'readonly' },\n { kind: 'named', key: 'before', value: 'readonly' },\n { kind: 'named', key: 'after', value: 'readonly' },\n { kind: 'named', key: 'jest', value: 'readonly' },\n { kind: 'named', key: 'expect', value: 'readonly' },\n { kind: 'named', key: 'vitest', value: 'readonly' },\n ]);\n\n expect(addedSpreadEnvs).toStrictEqual(['jest', 'vitest']);\n expect(tokens).toStrictEqual([\n { kind: 'spread', raw: 'globals.jest' },\n { kind: 'spread', raw: 'globals.vitest' },\n { kind: 'named', key: 'before', value: 'readonly' },\n { kind: 'named', key: 'after', value: 'readonly' },\n ]);\n });\n });\n}\n","import type {\n PreservedImport,\n StringEntry,\n V1GlobalConf,\n V1GlobalToken,\n V1PresetName,\n V2Config,\n V2EntryFieldComments,\n V2Plan,\n V2ScopeEntry,\n V2ScopeName,\n} from '../types';\nimport type { MigrationWarning } from '../warnings';\nimport type {\n EslintrcEnv,\n EslintrcExtend,\n EslintrcFieldComments,\n EslintrcOverride,\n EslintrcParseResult,\n EslintrcRootBlock,\n} from './types';\nimport { foldGlobalsTokens } from '../globalsFolding';\nimport { cloneEntries, toEntries } from '../stringEntry';\n\nconst presetToScope: Partial<Record<V1PresetName, V2ScopeName>> = {\n javascript: 'javascript',\n 'javascript-dom': 'javascriptDom',\n 'javascript-node': 'javascriptNode',\n typescript: 'typescript',\n 'typescript-dom': 'typescriptDom',\n 'typescript-node': 'typescriptNode',\n vue2: 'vue2',\n vue3: 'vue3',\n 'vue2-typescript': 'vue2Typescript',\n 'vue3-typescript': 'vue3Typescript',\n jest: 'jest',\n vitest: 'vitest',\n 'jsdoc-based-ts': 'jsdocBasedTs',\n};\n\nconst tsScopes = new Set<V2ScopeName>([\n 'typescript',\n 'typescriptDom',\n 'typescriptNode',\n 'vue2Typescript',\n 'vue3Typescript',\n 'jsdocBasedTs',\n]);\n\nconst vueScopes = new Set<V2ScopeName>([\n 'vue2',\n 'vue3',\n 'vue2Typescript',\n 'vue3Typescript',\n]);\n\nconst defaultJestGlob = '**/*.{test,spec}.{ts,tsx,js,jsx,vue}';\n\ninterface ScopeInferenceInput {\n env: EslintrcEnv;\n extendsList: EslintrcExtend[];\n parserMarker: boolean;\n line: number;\n warnings: MigrationWarning[];\n}\n\ninterface ScopeInferenceResult {\n primary: V2ScopeName | null;\n addJest: boolean;\n vueMajor?: 2 | 3;\n}\n\nfunction hasVueExtend (extendsList: EslintrcExtend[]): boolean {\n return extendsList.some(extend => extend.kind === 'vue');\n}\n\nfunction hasJestExtend (extendsList: EslintrcExtend[]): boolean {\n return extendsList.some(extend => extend.kind === 'jest');\n}\n\nfunction inferVueMajor (extendsList: EslintrcExtend[]): 2 | 3 {\n const vueExtend = extendsList.find(extend => extend.kind === 'vue');\n\n if (vueExtend?.vueMajor === 2) {\n return 2;\n }\n\n return 3;\n}\n\nfunction mapVueScope (vueMajor: 2 | 3, tsMarker: boolean): V2ScopeName {\n if (vueMajor === 2) {\n return tsMarker ? 'vue2Typescript' : 'vue2';\n }\n\n return tsMarker ? 'vue3Typescript' : 'vue3';\n}\n\nfunction warnEnvBothBrowserAndNode (env: EslintrcEnv, line: number, warnings: MigrationWarning[]): void {\n if (!(env.browser && env.node)) {\n return;\n }\n\n if (warnings.some(warning => warning.kind === 'env-both-browser-and-node')) {\n return;\n }\n\n warnings.push({\n kind: 'env-both-browser-and-node',\n line,\n message: 'env.browser and env.node both true — defaulting to Dom scope',\n });\n}\n\nfunction inferPrimaryScope (input: ScopeInferenceInput): ScopeInferenceResult {\n const { env, extendsList, parserMarker, line, warnings } = input;\n const jestMarker = env.jest || env.jestGlobals || hasJestExtend(extendsList);\n\n warnEnvBothBrowserAndNode(env, line, warnings);\n\n if (hasVueExtend(extendsList)) {\n const vueMajor = inferVueMajor(extendsList);\n const scope = mapVueScope(vueMajor, parserMarker);\n\n return { primary: scope, addJest: jestMarker, vueMajor };\n }\n\n if (env.browser) {\n return { primary: parserMarker ? 'typescriptDom' : 'javascriptDom', addJest: jestMarker };\n }\n\n if (env.node) {\n return { primary: parserMarker ? 'typescriptNode' : 'javascriptNode', addJest: jestMarker };\n }\n\n return { primary: null, addJest: jestMarker };\n}\n\nfunction freshConfig (): V2Config {\n return {\n ignores: [],\n scopes: new Map(),\n strictGlobs: [],\n strictWholeFile: false,\n spellChecker: { ignoredPaths: [] },\n configFiles: [],\n };\n}\n\nfunction appendScope (config: V2Config, scope: V2ScopeName, entry: V2ScopeEntry): void {\n const existing = config.scopes.get(scope);\n\n if (existing) {\n existing.push(entry);\n } else {\n config.scopes.set(scope, [entry]);\n }\n}\n\nfunction mergeGlobals (\n base: Record<string, V1GlobalConf> | undefined,\n extra: Record<string, V1GlobalConf> | undefined\n): Record<string, V1GlobalConf> | undefined {\n if (!base && !extra) {\n return undefined;\n }\n\n const merged: Record<string, V1GlobalConf> = { ...base };\n\n if (extra) {\n Object.entries(extra).forEach(([key, value]) => {\n if (!(key in merged)) {\n merged[key] = value;\n }\n });\n }\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction applyTsconfig (\n entry: V2ScopeEntry,\n scope: V2ScopeName,\n perBlockProject: string[] | undefined,\n fallbackProject: string[] | undefined\n): void {\n if (!tsScopes.has(scope)) {\n return;\n }\n\n const project = perBlockProject && perBlockProject.length > 0 ? perBlockProject : fallbackProject;\n\n if (project && project.length > 0) {\n entry.tsconfigPaths = toEntries(project);\n }\n}\n\nfunction applyGlobalComponents (\n entry: V2ScopeEntry,\n scope: V2ScopeName,\n globalComponents: StringEntry[] | undefined\n): void {\n if (!vueScopes.has(scope) || !globalComponents || globalComponents.length === 0) {\n return;\n }\n\n entry.globalComponents = cloneEntries(globalComponents);\n}\n\ninterface BlockEmitInput {\n files: StringEntry[];\n scope: V2ScopeName;\n perBlockProject?: string[];\n fallbackProject?: string[];\n globalComponents?: StringEntry[];\n blockGlobals?: Record<string, V1GlobalConf>;\n blockGlobalsTokens?: V1GlobalToken[];\n topLevelGlobals?: Record<string, V1GlobalConf>;\n topLevelGlobalsTokens?: V1GlobalToken[];\n fieldComments?: EslintrcFieldComments;\n}\n\nfunction mapEslintrcFieldComments (\n incoming: EslintrcFieldComments | undefined,\n scope: V2ScopeName\n): V2EntryFieldComments | undefined {\n if (!incoming) {\n return undefined;\n }\n\n const result: V2EntryFieldComments = {};\n\n if (incoming.files !== undefined) {\n result.files = incoming.files;\n }\n\n if (incoming.globals !== undefined) {\n result.globals = incoming.globals;\n }\n\n if (incoming.project !== undefined && tsScopes.has(scope)) {\n result.tsconfigPaths = incoming.project;\n }\n\n if (incoming.globalComponents !== undefined && vueScopes.has(scope)) {\n result.globalComponents = incoming.globalComponents;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction mergeGlobalsTokens (\n base: V1GlobalToken[] | undefined,\n extra: V1GlobalToken[] | undefined\n): V1GlobalToken[] | undefined {\n if (!base && !extra) {\n return undefined;\n }\n\n const merged: V1GlobalToken[] = [];\n const seenNamed = new Map<string, number>();\n\n const append = (tokens: V1GlobalToken[]) => {\n tokens.forEach(token => {\n if (token.kind === 'spread') {\n merged.push({ ...token });\n\n return;\n }\n\n const seenIndex = seenNamed.get(token.key);\n\n if (seenIndex === undefined) {\n seenNamed.set(token.key, merged.length);\n merged.push({ ...token });\n\n return;\n }\n\n merged[seenIndex] = { ...token };\n });\n };\n\n if (base) {\n append(base);\n }\n\n if (extra) {\n append(extra);\n }\n\n return merged.length > 0 ? merged : undefined;\n}\n\nfunction buildEntry (input: BlockEmitInput): V2ScopeEntry {\n const entry: V2ScopeEntry = { files: cloneEntries(input.files) };\n\n applyTsconfig(entry, input.scope, input.perBlockProject, input.fallbackProject);\n applyGlobalComponents(entry, input.scope, input.globalComponents);\n\n const globalsTokens = mergeGlobalsTokens(input.blockGlobalsTokens, input.topLevelGlobalsTokens);\n\n if (globalsTokens) {\n entry.globalsTokens = globalsTokens;\n }\n\n const globals = mergeGlobals(input.blockGlobals, input.topLevelGlobals);\n\n if (globals) {\n entry.globals = globals;\n }\n\n const fieldComments = mapEslintrcFieldComments(input.fieldComments, input.scope);\n\n if (fieldComments) {\n entry.fieldComments = fieldComments;\n }\n\n return entry;\n}\n\ninterface EmitContext {\n config: V2Config;\n warnings: MigrationWarning[];\n topLevelGlobals?: Record<string, V1GlobalConf>;\n topLevelGlobalsTokens?: V1GlobalToken[];\n topLevelProject?: string[];\n droppedRules: number;\n droppedBlocks: number;\n droppedPlugins: Set<string>;\n droppedPluginEntries: number;\n}\n\ninterface BlockProcessInput {\n line: number;\n files: StringEntry[];\n extendsList: EslintrcExtend[];\n env: EslintrcEnv;\n parserMarker: boolean;\n perBlockProject?: string[];\n globalComponents?: StringEntry[];\n spellCheckerOff: boolean;\n blockGlobals?: Record<string, V1GlobalConf>;\n blockGlobalsTokens?: V1GlobalToken[];\n customPluginNames?: string[];\n rulesCount: number;\n unresolvedSpreads: string[];\n leadingComment?: string;\n fieldComments?: EslintrcFieldComments;\n}\n\nfunction collectInsiderPresets (extendsList: EslintrcExtend[]): string[] {\n return extendsList\n .filter(extend => extend.kind === 'insider' && extend.insiderPreset)\n .map(extend => extend.insiderPreset ?? '');\n}\n\nfunction mapInsiderPreset (preset: string): V2ScopeName | 'config' | null {\n if (preset === 'config') {\n return 'config';\n }\n\n const scope = presetToScope[preset as V1PresetName];\n\n return scope ?? null;\n}\n\nfunction captureConfigPresetFiles (input: BlockProcessInput, context: EmitContext): void {\n input.files.forEach(file => {\n if (!context.config.configFiles.some(existing => existing.value === file.value)) {\n context.config.configFiles.push({ ...file });\n }\n });\n}\n\nfunction emitInsiderScopes (\n presets: string[],\n input: BlockProcessInput,\n context: EmitContext\n): V2ScopeEntry | null {\n let firstEntry: V2ScopeEntry | null = null;\n\n presets.forEach(preset => {\n const mapped = mapInsiderPreset(preset);\n\n if (mapped === null) {\n context.warnings.push({\n kind: 'unknown-preset',\n line: input.line,\n message: `Unknown @useinsider preset '${preset}' — dropped`,\n });\n\n return;\n }\n\n if (mapped === 'config') {\n captureConfigPresetFiles(input, context);\n\n return;\n }\n\n const entry = buildEntry({\n files: input.files,\n scope: mapped,\n perBlockProject: input.perBlockProject,\n fallbackProject: context.topLevelProject,\n globalComponents: input.globalComponents,\n blockGlobals: input.blockGlobals,\n blockGlobalsTokens: input.blockGlobalsTokens,\n topLevelGlobals: context.topLevelGlobals,\n topLevelGlobalsTokens: context.topLevelGlobalsTokens,\n fieldComments: input.fieldComments,\n });\n\n appendScope(context.config, mapped, entry);\n\n if (!firstEntry) {\n firstEntry = entry;\n }\n });\n\n return firstEntry;\n}\n\nfunction emitInferredScopes (input: BlockProcessInput, context: EmitContext): V2ScopeEntry | null {\n const inference = inferPrimaryScope({\n env: input.env,\n extendsList: input.extendsList,\n parserMarker: input.parserMarker,\n line: input.line,\n warnings: context.warnings,\n });\n\n let firstEntry: V2ScopeEntry | null = null;\n\n if (inference.primary) {\n const entry = buildEntry({\n files: input.files,\n scope: inference.primary,\n perBlockProject: input.perBlockProject,\n fallbackProject: context.topLevelProject,\n globalComponents: input.globalComponents,\n blockGlobals: input.blockGlobals,\n blockGlobalsTokens: input.blockGlobalsTokens,\n topLevelGlobals: context.topLevelGlobals,\n topLevelGlobalsTokens: context.topLevelGlobalsTokens,\n fieldComments: input.fieldComments,\n });\n\n appendScope(context.config, inference.primary, entry);\n firstEntry = entry;\n }\n\n if (inference.addJest) {\n const entry = buildEntry({\n files: [{ value: defaultJestGlob }],\n scope: 'jest',\n blockGlobals: input.blockGlobals,\n blockGlobalsTokens: input.blockGlobalsTokens,\n topLevelGlobals: context.topLevelGlobals,\n topLevelGlobalsTokens: context.topLevelGlobalsTokens,\n });\n\n appendScope(context.config, 'jest', entry);\n\n if (!firstEntry) {\n firstEntry = entry;\n }\n }\n\n return firstEntry;\n}\n\nfunction recordDroppedRules (input: BlockProcessInput, context: EmitContext): void {\n if (input.rulesCount > 0) {\n context.droppedRules += input.rulesCount;\n context.droppedBlocks += 1;\n }\n\n input.unresolvedSpreads.forEach(name => {\n context.warnings.push({\n kind: 'unresolved-rules-spread',\n line: input.line,\n message: `Could not resolve identifier '${name}' inside rules; dropping`,\n });\n });\n}\n\nfunction applySpellChecker (input: BlockProcessInput, context: EmitContext): void {\n if (!input.spellCheckerOff) {\n return;\n }\n\n input.files.forEach(file => {\n if (!context.config.spellChecker.ignoredPaths.some(existing => existing.value === file.value)) {\n context.config.spellChecker.ignoredPaths.push({ ...file });\n }\n });\n}\n\nfunction recordDroppedPlugins (input: BlockProcessInput, context: EmitContext): void {\n if (!input.customPluginNames || input.customPluginNames.length === 0) {\n return;\n }\n\n input.customPluginNames.forEach(name => context.droppedPlugins.add(name));\n context.droppedPluginEntries += 1;\n}\n\nfunction processBlock (input: BlockProcessInput, context: EmitContext): boolean {\n recordDroppedRules(input, context);\n recordDroppedPlugins(input, context);\n applySpellChecker(input, context);\n\n const insiderPresets = collectInsiderPresets(input.extendsList);\n const firstEntry = insiderPresets.length > 0\n ? emitInsiderScopes(insiderPresets, input, context)\n : emitInferredScopes(input, context);\n\n if (firstEntry && input.leadingComment !== undefined) {\n firstEntry.leadingComment = input.leadingComment;\n }\n\n return firstEntry !== null;\n}\n\nfunction blockInputFromRoot (root: EslintrcRootBlock, defaultFiles: StringEntry[]): BlockProcessInput {\n return {\n line: root.line,\n files: defaultFiles,\n extendsList: root.extends,\n env: root.env,\n parserMarker: root.parserMarker,\n perBlockProject: root.parserOptions.project,\n globalComponents: root.rulesBlock.globalComponents,\n spellCheckerOff: root.rulesBlock.spellCheckerOff,\n blockGlobals: undefined,\n blockGlobalsTokens: undefined,\n customPluginNames: root.customPluginNames,\n rulesCount: root.rulesBlock.customRuleCount,\n unresolvedSpreads: root.rulesBlock.unresolvedSpreads,\n fieldComments: root.fieldComments,\n };\n}\n\nfunction isBareOverride (override: EslintrcOverride): boolean {\n const noExtends = override.extends.length === 0;\n const noEnv = !override.env.browser && !override.env.node && !override.env.jest && !override.env.jestGlobals;\n const noParserMarker = !override.parserMarker;\n\n return noExtends && noEnv && noParserMarker;\n}\n\nfunction blockInputFromOverride (override: EslintrcOverride, root: EslintrcRootBlock): BlockProcessInput {\n const inherit = isBareOverride(override);\n\n return {\n line: override.line,\n files: override.files,\n extendsList: inherit ? root.extends : override.extends,\n env: inherit ? root.env : override.env,\n parserMarker: inherit ? root.parserMarker : override.parserMarker,\n perBlockProject: override.parserOptions.project,\n globalComponents: override.rulesBlock.globalComponents,\n spellCheckerOff: override.rulesBlock.spellCheckerOff,\n blockGlobals: override.globals,\n blockGlobalsTokens: override.globalsTokens,\n customPluginNames: override.customPluginNames,\n rulesCount: override.rulesBlock.customRuleCount,\n unresolvedSpreads: override.rulesBlock.unresolvedSpreads,\n leadingComment: override.leadingComment,\n fieldComments: override.fieldComments,\n };\n}\n\nfunction defaultRootFiles (root: EslintrcRootBlock): StringEntry[] {\n if (root.env.browser && hasVueExtend(root.extends)) {\n return toEntries(['**/*.{js,jsx,ts,tsx,vue}']);\n }\n\n if (root.parserMarker) {\n return toEntries(['**/*.{ts,tsx}']);\n }\n\n return toEntries(['**/*.{js,jsx,cjs,mjs}']);\n}\n\nfunction applyIgnorePatterns (root: EslintrcRootBlock, config: V2Config): void {\n root.ignorePatterns.forEach(ignore => {\n if (!config.ignores.some(existing => existing.value === ignore.value)) {\n config.ignores.push({ ...ignore });\n }\n });\n}\n\nfunction recordSettingsWarning (root: EslintrcRootBlock, warnings: MigrationWarning[]): void {\n if (root.hasSettings) {\n warnings.push({\n kind: 'dropped-settings',\n line: root.line,\n message: 'Dropped legacy `settings` block — flat config does not support this surface',\n });\n }\n}\n\nfunction consolidateExtendsWarning (\n extendKinds: Set<EslintrcExtend['kind']>,\n rawDropped: Set<string>,\n warnings: MigrationWarning[]\n): void {\n if (rawDropped.size === 0) {\n return;\n }\n\n const list = [...rawDropped].sort((left, right) => left.localeCompare(right)).join(', ');\n\n warnings.push({\n kind: 'dropped-extends',\n message: `Dropped non-@useinsider extends: ${list}`,\n });\n\n void extendKinds;\n}\n\nfunction recordNoInsiderWarning (hasInsiderExtend: boolean, warnings: MigrationWarning[]): void {\n if (hasInsiderExtend) {\n return;\n }\n\n warnings.push({\n kind: 'no-insider-extends',\n message:\n 'Source did not extend any @useinsider/eslint-config preset — output is a best-effort inference. '\n + 'Custom rules were dropped; review the generated config and adjust scopes as needed.',\n });\n}\n\nfunction collectExtendKinds (root: EslintrcRootBlock): {\n kinds: Set<EslintrcExtend['kind']>;\n rawDropped: Set<string>;\n hasInsider: boolean;\n} {\n const kinds = new Set<EslintrcExtend['kind']>();\n const rawDropped = new Set<string>();\n let hasInsider = false;\n\n const visit = (list: EslintrcExtend[]) => {\n list.forEach(extend => {\n kinds.add(extend.kind);\n\n if (extend.kind === 'insider') {\n hasInsider = true;\n\n return;\n }\n\n rawDropped.add(extend.raw);\n });\n };\n\n visit(root.extends);\n\n root.overrides.forEach(override => visit(override.extends));\n\n return { kinds, rawDropped, hasInsider };\n}\n\nfunction formatDroppedRulesMessage (count: number, blocks: number): string {\n const rulesLabel = count === 1 ? 'rule override' : 'rule overrides';\n const blocksLabel = blocks === 1 ? 'block' : 'blocks';\n\n return `Dropped ${count} custom ${rulesLabel} across ${blocks} ${blocksLabel}`;\n}\n\nfunction tokensFromRecord (globals: Record<string, V1GlobalConf>): V1GlobalToken[] {\n return Object.entries(globals).map(([key, value]) => ({ kind: 'named' as const, key, value }));\n}\n\nfunction resolveBaseTokens (entry: V2ScopeEntry): V1GlobalToken[] | undefined {\n if (entry.globalsTokens && entry.globalsTokens.length > 0) {\n return entry.globalsTokens;\n }\n\n if (entry.globals && Object.keys(entry.globals).length > 0) {\n return tokensFromRecord(entry.globals);\n }\n\n return undefined;\n}\n\nfunction applyGlobalsFolding (config: V2Config): boolean {\n let anySyntheticEmitted = false;\n\n config.scopes.forEach(entries => {\n entries.forEach(entry => {\n const baseTokens = resolveBaseTokens(entry);\n\n if (!baseTokens) {\n return;\n }\n\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens(baseTokens);\n\n if (addedSpreadEnvs.length > 0) {\n anySyntheticEmitted = true;\n }\n\n entry.globalsTokens = tokens;\n\n const namedRecord: Record<string, V1GlobalConf> = {};\n\n tokens.forEach(token => {\n if (token.kind === 'named') {\n namedRecord[token.key] = token.value;\n }\n });\n\n entry.globals = Object.keys(namedRecord).length > 0 ? namedRecord : undefined;\n });\n });\n\n return anySyntheticEmitted;\n}\n\nfunction buildPreservedImports (emittedSyntheticSpread: boolean): PreservedImport[] {\n if (!emittedSyntheticSpread) {\n return [];\n }\n\n return [{ raw: \"import globals from 'globals';\", moduleSpecifier: 'globals' }];\n}\n\nexport function transformEslintrcToV2 (parseResult: EslintrcParseResult): V2Plan {\n const config = freshConfig();\n const warnings: MigrationWarning[] = [...parseResult.warnings];\n\n if (!parseResult.root) {\n return {\n config,\n silenceRulesCalls: [],\n needsSilenceRulesImport: false,\n preservedImports: [],\n warnings,\n droppedRuleCount: 0,\n droppedRuleBlockCount: 0,\n };\n }\n\n const { root } = parseResult;\n const topLevelGlobals = root.globals;\n const topLevelGlobalsTokens = root.globalsTokens;\n const topLevelProject = root.parserOptions.project;\n const context: EmitContext = {\n config,\n warnings,\n topLevelGlobals,\n topLevelGlobalsTokens,\n topLevelProject,\n droppedRules: 0,\n droppedBlocks: 0,\n droppedPlugins: new Set<string>(),\n droppedPluginEntries: 0,\n };\n\n applyIgnorePatterns(root, config);\n recordSettingsWarning(root, warnings);\n\n const overridesEmittedAny = root.overrides.length > 0;\n\n if (overridesEmittedAny) {\n root.overrides.forEach(override => {\n processBlock(blockInputFromOverride(override, root), context);\n });\n\n if (root.rulesBlock.customRuleCount > 0 || root.rulesBlock.unresolvedSpreads.length > 0) {\n const rootFiles = defaultRootFiles(root);\n\n recordDroppedRules(blockInputFromRoot(root, rootFiles), context);\n }\n } else {\n const rootFiles = defaultRootFiles(root);\n\n processBlock(blockInputFromRoot(root, rootFiles), context);\n }\n\n if (context.droppedRules > 0) {\n warnings.push({\n kind: 'dropped-rules',\n message: formatDroppedRulesMessage(context.droppedRules, context.droppedBlocks),\n });\n }\n\n const { kinds, rawDropped, hasInsider } = collectExtendKinds(root);\n\n consolidateExtendsWarning(kinds, rawDropped, warnings);\n recordNoInsiderWarning(hasInsider, warnings);\n\n if (context.droppedPluginEntries > 0 && context.droppedPlugins.size > 0) {\n const sorted = [...context.droppedPlugins].sort((left, right) => left.localeCompare(right));\n\n warnings.push({\n kind: 'dropped-plugins',\n message: `Dropped custom plugins on ${context.droppedPluginEntries} entries: ${sorted.join(', ')}`,\n });\n }\n\n const emittedSyntheticSpread = applyGlobalsFolding(config);\n\n return {\n config,\n silenceRulesCalls: [],\n needsSilenceRulesImport: false,\n preservedImports: buildPreservedImports(emittedSyntheticSpread),\n warnings,\n droppedRuleCount: context.droppedRules,\n droppedRuleBlockCount: context.droppedBlocks,\n };\n}\n","import type {\n ParseResult,\n PreservedImport,\n SilenceRulesCall,\n StringEntry,\n V1ArrayElement,\n V1ConfigFieldComments,\n V1GlobalConf,\n V1GlobalToken,\n V1PresetName,\n V1StandaloneGlobals,\n V1UseInsiderCall,\n} from './types';\nimport type { MigrationWarning } from './warnings';\nimport * as ts from 'typescript';\nimport { leadingCommentTextFor } from './stringEntry';\n\nconst knownPresets = new Set<V1PresetName>([\n 'config',\n 'javascript',\n 'javascript-dom',\n 'javascript-node',\n 'typescript',\n 'typescript-dom',\n 'typescript-node',\n 'vue2',\n 'vue2-typescript',\n 'vue3',\n 'vue3-typescript',\n 'jest',\n 'vitest',\n 'jsdoc-based-ts',\n 'strict',\n 'dom',\n 'node',\n]);\n\nfunction lineOf (sourceFile: ts.SourceFile, node: ts.Node): number {\n const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));\n\n return line + 1;\n}\n\nfunction unwrapTypeCasts (expression: ts.Expression): ts.Expression {\n let current = expression;\n\n while (\n ts.isParenthesizedExpression(current)\n || ts.isAsExpression(current)\n || ts.isTypeAssertionExpression(current)\n || ts.isSatisfiesExpression(current)\n ) {\n current = current.expression;\n }\n\n return current;\n}\n\nfunction unwrapAwait (expression: ts.Expression): ts.Expression {\n const peeled = unwrapTypeCasts(expression);\n\n if (ts.isAwaitExpression(peeled)) {\n return unwrapTypeCasts(peeled.expression);\n }\n\n return peeled;\n}\n\nfunction isStringLiteral (node: ts.Node): node is ts.StringLiteral | ts.NoSubstitutionTemplateLiteral {\n return ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node);\n}\n\nfunction readStringLiteralArray (node: ts.Expression | undefined): string[] | undefined {\n if (!node || !ts.isArrayLiteralExpression(node)) {\n return undefined;\n }\n\n const items = node.elements.map(element => (isStringLiteral(element) ? element.text : null));\n\n if (items.some(item => item === null)) {\n return undefined;\n }\n\n return items as string[];\n}\n\nfunction readStringLiteralEntries (\n node: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): StringEntry[] | undefined {\n if (!node || !ts.isArrayLiteralExpression(node)) {\n return undefined;\n }\n\n const entries: (StringEntry | null)[] = node.elements.map(element => {\n if (!isStringLiteral(element)) {\n return null;\n }\n\n const leadingComment = leadingCommentTextFor(sourceFile, element);\n\n return leadingComment === undefined\n ? { value: element.text }\n : { value: element.text, leadingComment };\n });\n\n if (entries.some(entry => entry === null)) {\n return undefined;\n }\n\n return entries as StringEntry[];\n}\n\nfunction propertyKeyName (property: ts.ObjectLiteralElementLike): string | null {\n if (!ts.isPropertyAssignment(property)) {\n return null;\n }\n\n const key = property.name;\n\n if (ts.isIdentifier(key) || ts.isStringLiteral(key)) {\n return key.text;\n }\n\n return null;\n}\n\nfunction findProperty (\n object: ts.ObjectLiteralExpression,\n name: string\n): ts.PropertyAssignment | undefined {\n return object.properties\n .filter((property): property is ts.PropertyAssignment => ts.isPropertyAssignment(property))\n .find(property => propertyKeyName(property) === name);\n}\n\nfunction readGlobalValue (initializer: ts.Expression): { value: V1GlobalConf } | null {\n if (isStringLiteral(initializer)) {\n return { value: initializer.text };\n }\n\n if (initializer.kind === ts.SyntaxKind.TrueKeyword) {\n return { value: true };\n }\n\n if (initializer.kind === ts.SyntaxKind.FalseKeyword) {\n return { value: false };\n }\n\n if (ts.isNumericLiteral(initializer)) {\n return { value: Number(initializer.text) };\n }\n\n return null;\n}\n\nfunction readGlobalsObject (node: ts.Expression | undefined): Record<string, V1GlobalConf> | undefined {\n if (!node || !ts.isObjectLiteralExpression(node)) {\n return undefined;\n }\n\n const entries = node.properties.map(property => {\n if (!ts.isPropertyAssignment(property)) {\n return null;\n }\n\n const name = propertyKeyName(property);\n\n if (name === null) {\n return null;\n }\n\n const valueWrapper = readGlobalValue(property.initializer);\n\n if (valueWrapper === null) {\n return null;\n }\n\n return [name, valueWrapper.value] as [string, V1GlobalConf];\n });\n\n if (entries.some(entry => entry === null)) {\n return undefined;\n }\n\n return Object.fromEntries(entries as [string, V1GlobalConf][]);\n}\n\nfunction readGlobalsTokens (\n node: ts.Expression | undefined,\n sourceFile: ts.SourceFile\n): V1GlobalToken[] | undefined {\n if (!node || !ts.isObjectLiteralExpression(node)) {\n return undefined;\n }\n\n const tokens: V1GlobalToken[] = [];\n\n node.properties.forEach(property => {\n if (ts.isSpreadAssignment(property)) {\n tokens.push({ kind: 'spread', raw: property.expression.getText(sourceFile) });\n\n return;\n }\n\n if (!ts.isPropertyAssignment(property)) {\n return;\n }\n\n const name = propertyKeyName(property);\n\n if (name === null) {\n return;\n }\n\n const valueWrapper = readGlobalValue(property.initializer);\n\n if (valueWrapper === null) {\n return;\n }\n\n tokens.push({ kind: 'named', key: name, value: valueWrapper.value });\n });\n\n return tokens.length > 0 ? tokens : undefined;\n}\n\nfunction namedTokensToRecord (tokens: V1GlobalToken[] | undefined): Record<string, V1GlobalConf> | undefined {\n if (!tokens) {\n return undefined;\n }\n\n const entries = tokens\n .filter((token): token is Extract<V1GlobalToken, { kind: 'named' }> => token.kind === 'named')\n .map(token => [token.key, token.value] as [string, V1GlobalConf]);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction extractGlobalComponents (\n rulesNode: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile\n): StringEntry[] | undefined {\n const rule = findProperty(rulesNode, 'vue/no-undef-components');\n\n if (!rule || !ts.isArrayLiteralExpression(rule.initializer)) {\n return undefined;\n }\n\n const [, optionsNode] = rule.initializer.elements;\n\n if (!optionsNode || !ts.isObjectLiteralExpression(optionsNode)) {\n return undefined;\n }\n\n const ignorePatterns = findProperty(optionsNode, 'ignorePatterns');\n\n if (!ignorePatterns) {\n return undefined;\n }\n\n return readStringLiteralEntries(ignorePatterns.initializer, sourceFile);\n}\n\ninterface ConfigBlockData {\n files?: StringEntry[];\n ignores?: StringEntry[];\n parserProject?: StringEntry[];\n parserProjectService?: boolean;\n globals?: Record<string, V1GlobalConf>;\n globalsTokens?: V1GlobalToken[];\n globalComponents?: StringEntry[];\n parserIsTypescript?: boolean;\n customPluginNames?: string[];\n extraRuleCount: number;\n fieldComments?: V1ConfigFieldComments;\n}\n\nfunction assignFieldComment (\n data: ConfigBlockData,\n field: keyof V1ConfigFieldComments,\n comment: string | undefined\n): void {\n if (comment === undefined) {\n return;\n }\n\n data.fieldComments = { ...data.fieldComments, [field]: comment };\n}\n\nfunction countExtraRules (rulesNode: ts.ObjectLiteralExpression): number {\n return rulesNode.properties.filter(property => {\n const name = propertyKeyName(property);\n\n return name !== null && name !== 'vue/no-undef-components';\n }).length;\n}\n\nfunction readParserProject (\n parserOptions: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile\n): StringEntry[] | undefined {\n const projectProperty = findProperty(parserOptions, 'project');\n\n if (!projectProperty) {\n return undefined;\n }\n\n const { initializer } = projectProperty;\n\n if (isStringLiteral(initializer)) {\n return [{ value: initializer.text }];\n }\n\n return readStringLiteralEntries(initializer, sourceFile);\n}\n\nfunction readParserProjectService (parserOptions: ts.ObjectLiteralExpression): boolean | undefined {\n const projectServiceProperty = findProperty(parserOptions, 'projectService');\n\n if (projectServiceProperty?.initializer.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n\n return undefined;\n}\n\nfunction expressionMentionsTsParser (expression: ts.Expression, sourceFile: ts.SourceFile): boolean {\n return expression.getText(sourceFile).includes('@typescript-eslint/parser');\n}\n\nfunction readLanguageOptions (\n languageOptions: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const parserOptionsProperty = findProperty(languageOptions, 'parserOptions');\n\n if (parserOptionsProperty && ts.isObjectLiteralExpression(parserOptionsProperty.initializer)) {\n const parserOptions = parserOptionsProperty.initializer;\n\n data.parserProject = readParserProject(parserOptions, sourceFile);\n data.parserProjectService = readParserProjectService(parserOptions);\n }\n\n const parserProperty = findProperty(languageOptions, 'parser');\n\n if (parserProperty && expressionMentionsTsParser(parserProperty.initializer, sourceFile)) {\n data.parserIsTypescript = true;\n }\n\n const globalsProperty = findProperty(languageOptions, 'globals');\n\n if (globalsProperty) {\n data.globalsTokens = readGlobalsTokens(globalsProperty.initializer, sourceFile);\n data.globals = namedTokensToRecord(data.globalsTokens) ?? readGlobalsObject(globalsProperty.initializer);\n }\n}\n\nfunction readPluginNames (pluginsProperty: ts.PropertyAssignment): string[] {\n if (!ts.isObjectLiteralExpression(pluginsProperty.initializer)) {\n return [];\n }\n\n return pluginsProperty.initializer.properties\n .map(propertyKeyName)\n .filter((name): name is string => name !== null);\n}\n\nfunction readRulesBlock (\n rulesProperty: ts.PropertyAssignment,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n if (!ts.isObjectLiteralExpression(rulesProperty.initializer)) {\n return;\n }\n\n const rulesObject = rulesProperty.initializer;\n\n data.globalComponents = extractGlobalComponents(rulesObject, sourceFile);\n data.extraRuleCount = countExtraRules(rulesObject);\n}\n\nfunction captureLanguageOptionsComments (\n languageOptionsObject: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const parserOptionsProperty = findProperty(languageOptionsObject, 'parserOptions');\n\n if (parserOptionsProperty && ts.isObjectLiteralExpression(parserOptionsProperty.initializer)) {\n const projectProperty = findProperty(parserOptionsProperty.initializer, 'project');\n\n if (projectProperty) {\n assignFieldComment(data, 'parserProject', leadingCommentTextFor(sourceFile, projectProperty));\n }\n }\n\n const globalsProperty = findProperty(languageOptionsObject, 'globals');\n\n if (globalsProperty) {\n assignFieldComment(data, 'globals', leadingCommentTextFor(sourceFile, globalsProperty));\n }\n}\n\nfunction processFilesProperty (\n configNode: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const filesProperty = findProperty(configNode, 'files');\n\n if (!filesProperty) {\n return;\n }\n\n data.files = readStringLiteralEntries(filesProperty.initializer, sourceFile);\n assignFieldComment(data, 'files', leadingCommentTextFor(sourceFile, filesProperty));\n}\n\nfunction processIgnoresProperty (\n configNode: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const ignoresProperty = findProperty(configNode, 'ignores');\n\n if (!ignoresProperty) {\n return;\n }\n\n data.ignores = readStringLiteralEntries(ignoresProperty.initializer, sourceFile);\n assignFieldComment(data, 'ignores', leadingCommentTextFor(sourceFile, ignoresProperty));\n}\n\nfunction processPluginsProperty (configNode: ts.ObjectLiteralExpression, data: ConfigBlockData): void {\n const pluginsProperty = findProperty(configNode, 'plugins');\n\n if (!pluginsProperty) {\n return;\n }\n\n const pluginNames = readPluginNames(pluginsProperty);\n\n if (pluginNames.length > 0) {\n data.customPluginNames = pluginNames;\n }\n}\n\nfunction processRulesProperty (\n configNode: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): void {\n const rulesProperty = findProperty(configNode, 'rules');\n\n if (!rulesProperty) {\n return;\n }\n\n readRulesBlock(rulesProperty, data, sourceFile);\n\n if (data.globalComponents !== undefined) {\n assignFieldComment(data, 'globalComponents', leadingCommentTextFor(sourceFile, rulesProperty));\n }\n}\n\nfunction parseConfigObject (configNode: ts.ObjectLiteralExpression, sourceFile: ts.SourceFile): ConfigBlockData {\n const data: ConfigBlockData = { extraRuleCount: 0 };\n\n processFilesProperty(configNode, data, sourceFile);\n processIgnoresProperty(configNode, data, sourceFile);\n\n const languageOptionsProperty = findProperty(configNode, 'languageOptions');\n\n if (languageOptionsProperty && ts.isObjectLiteralExpression(languageOptionsProperty.initializer)) {\n readLanguageOptions(languageOptionsProperty.initializer, data, sourceFile);\n captureLanguageOptionsComments(languageOptionsProperty.initializer, data, sourceFile);\n }\n\n processPluginsProperty(configNode, data);\n processRulesProperty(configNode, data, sourceFile);\n\n return data;\n}\n\nfunction mergeRescuedGlobalsTokens (\n innerTokens: V1GlobalToken[] | undefined,\n siblingTokens: V1GlobalToken[]\n): V1GlobalToken[] {\n if (!innerTokens || innerTokens.length === 0) {\n return siblingTokens.map(token => ({ ...token }));\n }\n\n const innerNamedKeys = new Set<string>();\n\n innerTokens.forEach(token => {\n if (token.kind === 'named') {\n innerNamedKeys.add(token.key);\n }\n });\n\n const merged: V1GlobalToken[] = innerTokens.map(token => ({ ...token }));\n\n siblingTokens.forEach(token => {\n if (token.kind === 'spread') {\n merged.push({ ...token });\n\n return;\n }\n\n if (innerNamedKeys.has(token.key)) {\n return;\n }\n\n merged.push({ ...token });\n innerNamedKeys.add(token.key);\n });\n\n return merged;\n}\n\nfunction applyRescuedGlobals (data: ConfigBlockData, rescued: ConfigBlockData): boolean {\n if (rescued.globalsTokens && rescued.globalsTokens.length > 0) {\n data.globalsTokens = mergeRescuedGlobalsTokens(data.globalsTokens, rescued.globalsTokens);\n data.globals = namedTokensToRecord(data.globalsTokens) ?? data.globals;\n\n return true;\n }\n\n if (rescued.globals && Object.keys(rescued.globals).length > 0) {\n const existingGlobals = data.globals ?? {};\n\n data.globals = { ...rescued.globals, ...existingGlobals };\n\n return true;\n }\n\n return false;\n}\n\nfunction applyRescuedParserProject (data: ConfigBlockData, rescued: ConfigBlockData): boolean {\n if (!rescued.parserProject || rescued.parserProject.length === 0) {\n return false;\n }\n\n if (data.parserProject && data.parserProject.length > 0) {\n return false;\n }\n\n data.parserProject = rescued.parserProject;\n\n return true;\n}\n\nfunction applyRescuedLanguageOptions (\n data: ConfigBlockData,\n rescued: ConfigBlockData\n): boolean {\n let rescuedAny = applyRescuedGlobals(data, rescued);\n\n rescuedAny = applyRescuedParserProject(data, rescued) || rescuedAny;\n\n if (rescued.parserIsTypescript && !data.parserIsTypescript) {\n data.parserIsTypescript = true;\n rescuedAny = true;\n }\n\n if (rescued.parserProjectService && data.parserProjectService === undefined) {\n data.parserProjectService = true;\n rescuedAny = true;\n }\n\n return rescuedAny;\n}\n\nfunction parseSiblingLanguageOptions (\n callArgument: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile\n): ConfigBlockData | null {\n const languageOptionsProperty = findProperty(callArgument, 'languageOptions');\n\n if (!languageOptionsProperty || !ts.isObjectLiteralExpression(languageOptionsProperty.initializer)) {\n return null;\n }\n\n const rescued: ConfigBlockData = { extraRuleCount: 0 };\n\n readLanguageOptions(languageOptionsProperty.initializer, rescued, sourceFile);\n\n return rescued;\n}\n\nfunction mergeSiblingIgnoresIntoData (\n callArgument: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): boolean {\n const ignoresProperty = findProperty(callArgument, 'ignores');\n\n if (!ignoresProperty) {\n return false;\n }\n\n const rescuedIgnores = readStringLiteralEntries(ignoresProperty.initializer, sourceFile);\n\n if (!rescuedIgnores || rescuedIgnores.length === 0) {\n return false;\n }\n\n const existing = data.ignores ?? [];\n const seen = new Set(existing.map(entry => entry.value));\n const additions: StringEntry[] = [];\n\n rescuedIgnores.forEach(entry => {\n if (seen.has(entry.value)) {\n return;\n }\n\n seen.add(entry.value);\n additions.push(entry);\n });\n\n if (additions.length === 0) {\n return false;\n }\n\n data.ignores = [...existing, ...additions];\n\n return true;\n}\n\nfunction applySiblingRescues (\n callArgument: ts.ObjectLiteralExpression,\n data: ConfigBlockData,\n sourceFile: ts.SourceFile\n): boolean {\n const rescuedSibling = parseSiblingLanguageOptions(callArgument, sourceFile);\n const rescuedLanguageOptions = rescuedSibling\n ? applyRescuedLanguageOptions(data, rescuedSibling)\n : false;\n const rescuedIgnores = mergeSiblingIgnoresIntoData(callArgument, data, sourceFile);\n\n return rescuedLanguageOptions || rescuedIgnores;\n}\n\ninterface ClassifiedPresets {\n presets: V1PresetName[];\n unknownPresets: string[];\n}\n\nfunction classifyPresets (presetList: string[], line: number, warnings: MigrationWarning[]): ClassifiedPresets {\n const presets: V1PresetName[] = [];\n const unknownPresets: string[] = [];\n\n presetList.forEach(presetName => {\n if (knownPresets.has(presetName as V1PresetName)) {\n presets.push(presetName as V1PresetName);\n } else {\n unknownPresets.push(presetName);\n warnings.push({\n kind: 'unknown-preset',\n line,\n message: `Unknown v1 preset '${presetName}' — dropped`,\n });\n }\n });\n\n return { presets, unknownPresets };\n}\n\nfunction parseUseInsiderCall (\n callExpression: ts.CallExpression,\n sourceFile: ts.SourceFile,\n warnings: MigrationWarning[]\n): V1UseInsiderCall | null {\n const line = lineOf(sourceFile, callExpression);\n const [firstArgument] = callExpression.arguments;\n\n if (!firstArgument || !ts.isObjectLiteralExpression(firstArgument)) {\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'useInsider call without object literal argument; skipping',\n });\n\n return null;\n }\n\n const presetProperty = findProperty(firstArgument, 'preset');\n const configProperty = findProperty(firstArgument, 'config');\n\n if (!presetProperty) {\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'useInsider call missing preset; skipping',\n });\n\n return null;\n }\n\n const presetList = readStringLiteralArray(presetProperty.initializer);\n\n if (!presetList) {\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'useInsider preset is not a string-literal array; skipping',\n });\n\n return null;\n }\n\n const { presets, unknownPresets } = classifyPresets(presetList, line, warnings);\n const configData = configProperty && ts.isObjectLiteralExpression(configProperty.initializer)\n ? parseConfigObject(configProperty.initializer, sourceFile)\n : { extraRuleCount: 0 } as ConfigBlockData;\n const rescuedAny = applySiblingRescues(firstArgument, configData, sourceFile);\n\n const call: V1UseInsiderCall = {\n kind: 'useInsiderCall',\n line,\n presets,\n unknownPresets,\n files: configData.files,\n ignores: configData.ignores,\n parserProject: configData.parserProject,\n parserProjectService: configData.parserProjectService,\n globals: configData.globals,\n globalsTokens: configData.globalsTokens,\n globalComponents: configData.globalComponents,\n parserIsTypescript: configData.parserIsTypescript,\n customPluginNames: configData.customPluginNames,\n extraRuleCount: configData.extraRuleCount,\n fieldComments: configData.fieldComments,\n };\n\n if (rescuedAny) {\n call.rescuedSiblingLanguageOptions = true;\n }\n\n return call;\n}\n\nfunction tryClassifyIgnoresBlock (\n objectLiteral: ts.ObjectLiteralExpression,\n keys: string[],\n line: number,\n sourceFile: ts.SourceFile\n): V1ArrayElement | null {\n if (keys.length !== 1 || keys[0] !== 'ignores') {\n return null;\n }\n\n const ignoresProperty = findProperty(objectLiteral, 'ignores');\n const ignores = ignoresProperty\n ? readStringLiteralEntries(ignoresProperty.initializer, sourceFile)\n : undefined;\n\n if (!ignores) {\n return null;\n }\n\n return { kind: 'ignoresBlock', line, ignores };\n}\n\nfunction isSpellCheckerOffRule (rules: ts.NodeArray<ts.ObjectLiteralElementLike>): boolean {\n if (rules.length !== 1) {\n return false;\n }\n\n const [onlyRule] = rules;\n\n if (!ts.isPropertyAssignment(onlyRule) || propertyKeyName(onlyRule) !== '@cspell/spellchecker') {\n return false;\n }\n\n return isStringLiteral(onlyRule.initializer) && onlyRule.initializer.text === 'off';\n}\n\nfunction tryClassifySpellCheckerOff (\n objectLiteral: ts.ObjectLiteralExpression,\n keys: string[],\n line: number,\n sourceFile: ts.SourceFile\n): V1ArrayElement | null {\n if (keys.length !== 2 || !keys.includes('files') || !keys.includes('rules')) {\n return null;\n }\n\n const filesProperty = findProperty(objectLiteral, 'files');\n const rulesProperty = findProperty(objectLiteral, 'rules');\n const files = filesProperty\n ? readStringLiteralEntries(filesProperty.initializer, sourceFile)\n : undefined;\n\n if (!files || !rulesProperty || !ts.isObjectLiteralExpression(rulesProperty.initializer)) {\n return null;\n }\n\n if (!isSpellCheckerOffRule(rulesProperty.initializer.properties)) {\n return null;\n }\n\n return { kind: 'spellCheckerOff', line, files };\n}\n\nfunction tryClassifyStandaloneGlobals (\n objectLiteral: ts.ObjectLiteralExpression,\n keys: string[],\n line: number,\n sourceFile: ts.SourceFile\n): V1StandaloneGlobals | null {\n if (!keys.includes('files') || !keys.includes('languageOptions')) {\n return null;\n }\n\n const filesProperty = findProperty(objectLiteral, 'files');\n const languageOptionsProperty = findProperty(objectLiteral, 'languageOptions');\n const files = filesProperty\n ? readStringLiteralEntries(filesProperty.initializer, sourceFile)\n : undefined;\n\n if (!files || !languageOptionsProperty || !ts.isObjectLiteralExpression(languageOptionsProperty.initializer)) {\n return null;\n }\n\n const globalsProperty = findProperty(languageOptionsProperty.initializer, 'globals');\n\n if (!globalsProperty) {\n return null;\n }\n\n const tokens = readGlobalsTokens(globalsProperty.initializer, sourceFile);\n\n if (!tokens || tokens.length === 0) {\n return null;\n }\n\n return { kind: 'standaloneGlobals', line, files, globalsTokens: tokens };\n}\n\nfunction classifyObjectElement (\n objectLiteral: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile,\n warnings: MigrationWarning[]\n): V1ArrayElement {\n const line = lineOf(sourceFile, objectLiteral);\n const keys = objectLiteral.properties\n .map(propertyKeyName)\n .filter((name): name is string => name !== null);\n\n const ignoresBlock = tryClassifyIgnoresBlock(objectLiteral, keys, line, sourceFile);\n\n if (ignoresBlock) {\n return ignoresBlock;\n }\n\n const spellCheckerOff = tryClassifySpellCheckerOff(objectLiteral, keys, line, sourceFile);\n\n if (spellCheckerOff) {\n return spellCheckerOff;\n }\n\n const standaloneGlobals = tryClassifyStandaloneGlobals(objectLiteral, keys, line, sourceFile);\n\n if (standaloneGlobals) {\n return standaloneGlobals;\n }\n\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'Unrecognized array element; dropping',\n });\n\n return { kind: 'unrecognized', line, snippet: objectLiteral.getText(sourceFile) };\n}\n\nfunction tryClassifyUseInsider (\n unwrapped: ts.Expression,\n sourceFile: ts.SourceFile,\n warnings: MigrationWarning[],\n leadingComment: string | undefined\n): V1UseInsiderCall | null | undefined {\n if (!ts.isCallExpression(unwrapped)) {\n return undefined;\n }\n\n const callee = unwrapped.expression;\n\n if (!ts.isIdentifier(callee) || callee.text !== 'useInsider') {\n return undefined;\n }\n\n const parsed = parseUseInsiderCall(unwrapped, sourceFile, warnings);\n\n if (parsed && leadingComment !== undefined) {\n parsed.leadingComment = leadingComment;\n }\n\n return parsed;\n}\n\nfunction classifyArrayElement (\n element: ts.Expression,\n sourceFile: ts.SourceFile,\n warnings: MigrationWarning[]\n): V1ArrayElement | null {\n const leadingComment = leadingCommentTextFor(sourceFile, element);\n const unwrapped = unwrapAwait(element);\n const useInsiderResult = tryClassifyUseInsider(unwrapped, sourceFile, warnings, leadingComment);\n\n if (useInsiderResult !== undefined) {\n return useInsiderResult;\n }\n\n if (ts.isObjectLiteralExpression(unwrapped)) {\n const parsed = classifyObjectElement(unwrapped, sourceFile, warnings);\n\n if (leadingComment !== undefined) {\n parsed.leadingComment = leadingComment;\n }\n\n return parsed;\n }\n\n const line = lineOf(sourceFile, element);\n\n warnings.push({\n kind: 'unrecognized-block',\n line,\n message: 'Unrecognized array element; dropping',\n });\n\n const unrecognized: V1ArrayElement = { kind: 'unrecognized', line, snippet: element.getText(sourceFile) };\n\n if (leadingComment !== undefined) {\n unrecognized.leadingComment = leadingComment;\n }\n\n return unrecognized;\n}\n\nfunction isDefineConfigCall (expression: ts.Expression): expression is ts.CallExpression {\n return ts.isCallExpression(expression)\n && ts.isIdentifier(expression.expression)\n && expression.expression.text === 'defineConfig';\n}\n\nfunction defineConfigArray (\n exportExpressions: readonly ts.Expression[]\n): ts.ArrayLiteralExpression | null {\n const defineConfigCall = exportExpressions.find(isDefineConfigCall);\n const [first] = defineConfigCall?.arguments ?? [];\n\n if (!first) {\n return null;\n }\n\n const unwrappedFirst = unwrapTypeCasts(first);\n\n if (ts.isArrayLiteralExpression(unwrappedFirst)) {\n return unwrappedFirst;\n }\n\n return null;\n}\n\n// A v1 config normally exported an array of blocks, but exporting the single `useInsider()` call on\n// its own is also valid flat config, so that form is read as a one-element array rather than ignored.\nfunction findDefaultExportElements (sourceFile: ts.SourceFile): ts.Expression[] {\n const exportExpressions = sourceFile.statements\n .filter(ts.isExportAssignment)\n .map(statement => unwrapTypeCasts(statement.expression));\n const array = exportExpressions.find(ts.isArrayLiteralExpression)\n ?? defineConfigArray(exportExpressions);\n\n if (array) {\n return [...array.elements];\n }\n\n return exportExpressions;\n}\n\nfunction checkDefineConfigWrap (sourceFile: ts.SourceFile): boolean {\n return sourceFile.statements.some(statement => {\n if (!ts.isExportAssignment(statement)) {\n return false;\n }\n\n const expression = unwrapTypeCasts(statement.expression);\n\n return ts.isCallExpression(expression)\n && ts.isIdentifier(expression.expression)\n && expression.expression.text === 'defineConfig';\n });\n}\n\ninterface ImportFlags {\n hasUseInsider: boolean;\n hasSilenceRules: boolean;\n preserved: PreservedImport[];\n warnings: MigrationWarning[];\n}\n\nfunction getModuleSpecifierText (statement: ts.ImportDeclaration): string | null {\n const { moduleSpecifier } = statement;\n\n if (!isStringLiteral(moduleSpecifier)) {\n return null;\n }\n\n return moduleSpecifier.text;\n}\n\nfunction collectNamedImports (importDeclaration: ts.ImportDeclaration): string[] {\n const namedBindings = importDeclaration.importClause?.namedBindings;\n\n if (!namedBindings || !ts.isNamedImports(namedBindings)) {\n return [];\n }\n\n return namedBindings.elements.map(specifier => specifier.propertyName?.text ?? specifier.name.text);\n}\n\nfunction hasDefaultBinding (importDeclaration: ts.ImportDeclaration): boolean {\n return Boolean(importDeclaration.importClause?.name);\n}\n\nconst insiderDefaultRewriteTargets = new Set<string>(['useInsider', 'silenceRules', 'silenceDependencyWarning']);\n\nfunction classifyInsiderImport (\n statement: ts.ImportDeclaration,\n sourceFile: ts.SourceFile,\n flags: ImportFlags\n): void {\n const namedFromInsider = collectNamedImports(statement);\n\n namedFromInsider.forEach(name => {\n if (name === 'useInsider') {\n flags.hasUseInsider = true;\n }\n\n if (name === 'silenceRules') {\n flags.hasSilenceRules = true;\n }\n });\n\n if (hasDefaultBinding(statement)) {\n const defaultLocal = statement.importClause?.name?.text ?? '';\n\n if (insiderDefaultRewriteTargets.has(defaultLocal)) {\n if (defaultLocal === 'useInsider') {\n flags.hasUseInsider = true;\n }\n\n if (defaultLocal === 'silenceRules') {\n flags.hasSilenceRules = true;\n }\n\n return;\n }\n\n flags.hasUseInsider = true;\n\n const line = lineOf(sourceFile, statement);\n\n flags.preserved.push({\n raw: statement.getText(sourceFile),\n moduleSpecifier: '@useinsider/eslint-config',\n });\n flags.warnings.push({\n kind: 'unrecognized-block',\n line,\n message:\n `Unexpected default import '${defaultLocal}' from '@useinsider/eslint-config'; `\n + 'kept literally — review before committing',\n });\n }\n}\n\nfunction inspectImports (sourceFile: ts.SourceFile): ImportFlags {\n const flags: ImportFlags = {\n hasUseInsider: false,\n hasSilenceRules: false,\n preserved: [],\n warnings: [],\n };\n\n sourceFile.statements.forEach(statement => {\n if (!ts.isImportDeclaration(statement)) {\n return;\n }\n\n const moduleSpecifier = getModuleSpecifierText(statement);\n\n if (moduleSpecifier === null) {\n return;\n }\n\n if (moduleSpecifier === '@useinsider/eslint-config') {\n classifyInsiderImport(statement, sourceFile, flags);\n\n return;\n }\n\n if (moduleSpecifier === 'eslint/config') {\n return;\n }\n\n flags.preserved.push({\n raw: statement.getText(sourceFile),\n moduleSpecifier,\n });\n });\n\n return flags;\n}\n\nfunction collectSilenceRulesCalls (sourceFile: ts.SourceFile): SilenceRulesCall[] {\n return sourceFile.statements\n .filter(ts.isExpressionStatement)\n .map(statement => {\n const { expression } = statement;\n\n if (!ts.isCallExpression(expression) || !ts.isIdentifier(expression.expression)) {\n return null;\n }\n\n if (expression.expression.text !== 'silenceRules') {\n return null;\n }\n\n const [argument] = expression.arguments;\n const rules = readStringLiteralEntries(argument, sourceFile);\n\n if (!rules) {\n return null;\n }\n\n const leadingComment = leadingCommentTextFor(sourceFile, statement);\n const call: SilenceRulesCall = { line: lineOf(sourceFile, statement), rules };\n\n if (leadingComment !== undefined) {\n call.leadingComment = leadingComment;\n }\n\n return call;\n })\n .filter((call): call is SilenceRulesCall => call !== null);\n}\n\nexport function parseV1Config (source: string, filePath: string): ParseResult {\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const warnings: MigrationWarning[] = [];\n const imports = inspectImports(sourceFile);\n\n warnings.push(...imports.warnings);\n\n const silenceRulesCalls = collectSilenceRulesCalls(sourceFile);\n const arrayElements: V1ArrayElement[] = findDefaultExportElements(sourceFile)\n .map(element => classifyArrayElement(element, sourceFile, warnings))\n .filter((entry): entry is V1ArrayElement => entry !== null);\n\n return {\n hasUseInsiderImport: imports.hasUseInsider,\n hasSilenceRulesImport: imports.hasSilenceRules,\n hasDefineConfigWrap: checkDefineConfigWrap(sourceFile),\n silenceRulesCalls,\n arrayElements,\n preservedImports: imports.preserved,\n warnings,\n };\n}\n","import { basename } from 'node:path';\nimport type { V2ScopeName } from './types';\nimport type { MigrationWarning } from './warnings';\nimport * as ts from 'typescript';\nimport { describeRemovedOptions } from '~/utils/removedOptions';\nimport { isMigratableScope } from './dependencies';\n\nconst INSIDER_MODULE = '@useinsider/eslint-config';\nconst COMPOSER_NAME = 'useInsider';\nconst DEFINE_CONFIG_NAME = 'defineConfig';\nconst SILENCE_RULES_NAME = 'silenceRules';\nconst RENDERER_EXPORT = 'export const { useInsiderESLint, useInsiderOXC } = ';\n\nconst RESERVED_KEYS: ReadonlySet<string> = new Set([\n 'ignores',\n 'jquery',\n 'strict',\n 'spellChecker',\n 'silenceRules',\n 'configFiles',\n]);\n\nexport interface V3Rehouse {\n lintModule: string;\n scopes: V2ScopeName[];\n optionKeys: string[];\n unregisteredKeys: string[];\n silenceRulesCallCount: number;\n droppedAwait: boolean;\n droppedArrayWrapper: boolean;\n warnings: MigrationWarning[];\n}\n\nexport type RehouseOutcome = | { kind: 'not-v3' }\n | { kind: 'refused'; reason: string }\n | { kind: 'rehoused'; rehoused: V3Rehouse };\n\ninterface PeelState {\n awaited: boolean;\n arrayWrapped: boolean;\n droppedAnnotation: boolean;\n siblingElements: number;\n definedConfig: boolean;\n}\n\ninterface ArgumentReading {\n scopes: V2ScopeName[];\n optionKeys: string[];\n unregisteredKeys: string[];\n unreadable: string | null;\n}\n\nfunction isInsiderImport (statement: ts.ImportDeclaration): boolean {\n const { moduleSpecifier } = statement;\n\n return ts.isStringLiteral(moduleSpecifier) && moduleSpecifier.text === INSIDER_MODULE;\n}\n\n// The emitted export reuses the call's own text, so an aliased import (`useInsider as compose`) keeps\n// working without rewriting anything — but the alias still has to be known to find the call.\nfunction composerAliases (sourceFile: ts.SourceFile): Set<string> {\n const aliases = new Set<string>();\n\n sourceFile.statements.forEach(statement => {\n if (!ts.isImportDeclaration(statement) || !isInsiderImport(statement)) {\n return;\n }\n\n const bindings = statement.importClause?.namedBindings;\n\n if (!bindings || !ts.isNamedImports(bindings)) {\n return;\n }\n\n bindings.elements.forEach(element => {\n if ((element.propertyName?.text ?? element.name.text) === COMPOSER_NAME) {\n aliases.add(element.name.text);\n }\n });\n });\n\n return aliases;\n}\n\nfunction isCallOf (node: ts.Node, names: ReadonlySet<string>): node is ts.CallExpression {\n return ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && names.has(node.expression.text);\n}\n\nfunction collectCalls (sourceFile: ts.SourceFile, names: ReadonlySet<string>): ts.CallExpression[] {\n const found: ts.CallExpression[] = [];\n\n const visit = (node: ts.Node): void => {\n if (isCallOf(node, names)) {\n found.push(node);\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n\n return found;\n}\n\nfunction peel (expression: ts.Expression, state: PeelState): ts.Expression {\n if (ts.isParenthesizedExpression(expression) || ts.isSpreadElement(expression)) {\n return peel(expression.expression, state);\n }\n\n if (ts.isAsExpression(expression) || ts.isSatisfiesExpression(expression)) {\n state.droppedAnnotation = true;\n\n return peel(expression.expression, state);\n }\n\n if (ts.isAwaitExpression(expression)) {\n state.awaited = true;\n\n return peel(expression.expression, state);\n }\n\n return expression;\n}\n\n// v2 spelled the call `export default [...await useInsider({...})]`, and v3 tightened that to the bare\n// call. A wrapper holding nothing but the call is dropped; one holding sibling blocks is refused,\n// because those blocks have nowhere to go in a lint module that exports renderers.\nfunction peelArray (expression: ts.Expression, state: PeelState): ts.Expression {\n if (!ts.isArrayLiteralExpression(expression) || expression.elements.length === 0) {\n return expression;\n }\n\n state.arrayWrapped = true;\n state.siblingElements = expression.elements.length - 1;\n\n return peel(expression.elements[0], state);\n}\n\nfunction unwrapDefaultExport (expression: ts.Expression, state: PeelState): ts.Expression {\n const peeled = peel(expression, state);\n\n if (isCallOf(peeled, new Set([DEFINE_CONFIG_NAME]))) {\n state.definedConfig = true;\n\n return peeled;\n }\n\n return peelArray(peeled, state);\n}\n\nfunction argumentObject (call: ts.CallExpression): ts.ObjectLiteralExpression | null {\n const [first] = call.arguments;\n\n if (!first || !ts.isObjectLiteralExpression(first)) {\n return null;\n }\n\n return first;\n}\n\nfunction propertyKey (property: ts.ObjectLiteralElementLike): string | null {\n const { name } = property;\n\n if (name === undefined) {\n return null;\n }\n\n if (ts.isIdentifier(name) || ts.isStringLiteral(name)) {\n return name.text;\n }\n\n return null;\n}\n\n// Everything the migration says about scopes comes from these keys, so every way of failing to read\n// them has to surface as a warning — a silently short scope list means a short install list.\nfunction unreadableReason (argument: ts.ObjectLiteralExpression | null, keysRead: number): string | null {\n if (!argument) {\n return 'is not an object literal';\n }\n\n if (argument.properties.some(ts.isSpreadAssignment)) {\n return 'spreads another object';\n }\n\n return keysRead < argument.properties.length ? 'has a property whose key is not a literal name' : null;\n}\n\nfunction readArgument (call: ts.CallExpression): ArgumentReading {\n const argument = argumentObject(call);\n const optionKeys = (argument?.properties ?? [])\n .map(propertyKey)\n .filter((key): key is string => key !== null);\n const candidates = optionKeys.filter(key => !RESERVED_KEYS.has(key));\n\n return {\n optionKeys,\n scopes: candidates.filter(isMigratableScope),\n unregisteredKeys: candidates.filter(key => !isMigratableScope(key)),\n unreadable: unreadableReason(argument, optionKeys.length),\n };\n}\n\nfunction refuse (reason: string): RehouseOutcome {\n return { kind: 'refused', reason };\n}\n\nfunction multipleCallsReason (name: string): string {\n return `${name} calls ${COMPOSER_NAME}() more than once. v4 has exactly one call — in the lint module —`\n + ' and it returns the two renderers instead of a config array, so the results cannot be concatenated.'\n + ' Merge them into a single call, one entry per scope key, then re-run the migration.';\n}\n\nfunction mixedArrayReason (name: string, siblings: number): string {\n const blocks = siblings === 1 ? 'block' : 'blocks';\n\n return `${name}'s default export combines ${COMPOSER_NAME}() with ${siblings} other flat-config ${blocks},`\n + ' which have nowhere to go in a lint module. Fold them into the call first — directory ignores into'\n + ' `ignores`, per-file rule overrides into `configFiles` — then re-run the migration.';\n}\n\nfunction indirectCallReason (name: string): string {\n return `${name} calls ${COMPOSER_NAME}(), but its default export is not that call. The migration re-houses`\n + ' the call itself, so make it the default export'\n + ` (\\`export default ${COMPOSER_NAME}({ ... })\\`) and re-run the migration.`;\n}\n\nfunction defineConfigReason (name: string): string {\n return `${name} wraps ${COMPOSER_NAME}() in ${DEFINE_CONFIG_NAME}(). v4's lint module exports the two`\n + ' renderers rather than a flat-config array, so there is nothing left for'\n + ` ${DEFINE_CONFIG_NAME}() to validate — drop the wrapper and re-run the migration.`;\n}\n\nfunction presetReason (name: string): string {\n return `${name} still passes the v1 \\`preset\\` option, and this release could not read it — the preset list`\n + ' has to be an array of string literals. Restore the literal list and re-run the migration, or convert'\n + ' the call to the scope-keyed form by hand.';\n}\n\n// Driven by the shared registry rather than a hand-written list, so an option removed later is\n// refused here on the same commit that stops `useInsider()` accepting it.\nfunction removedOptionReason (name: string, details: string): string {\n return `${name} passes option(s) this release removed. The migration copies the call across`\n + ' unchanged, so carrying them over would produce a lint module that fails on the next lint'\n + ` run. Update the call, then re-run the migration:\\n${details}`;\n}\n\nfunction annotationWarning (line: number): MigrationWarning {\n return {\n kind: 'dropped-type-annotation',\n line,\n message: `The type annotation on the default export was dropped — ${COMPOSER_NAME}() now returns`\n + ' `{ useInsiderESLint, useInsiderOXC }` rather than a config array. Delete the type import if'\n + ' nothing else uses it.',\n };\n}\n\nfunction unregisteredScopeWarning (key: string, line: number): MigrationWarning {\n return {\n kind: 'unregistered-scope',\n line,\n message: `\\`${key}\\` has no dependency manifest in the migration, so nothing was added to the install`\n + ' list for it. The key itself was carried over untouched — check its plugins are installed.',\n };\n}\n\nfunction unreadableArgumentWarning (line: number, reason: string): MigrationWarning {\n return {\n kind: 'unrecognized-block',\n line,\n message: `The ${COMPOSER_NAME}() argument ${reason}, so its scope list could not be read in full.`\n + ' The call was carried over untouched; the dependency list may be incomplete.',\n };\n}\n\nfunction lineOf (sourceFile: ts.SourceFile, node: ts.Node): number {\n return sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n}\n\nfunction collectWarnings (line: number, reading: ArgumentReading, state: PeelState): MigrationWarning[] {\n const warnings: MigrationWarning[] = [];\n\n if (state.droppedAnnotation) {\n warnings.push(annotationWarning(line));\n }\n\n if (reading.unreadable) {\n warnings.push(unreadableArgumentWarning(line, reading.unreadable));\n }\n\n reading.unregisteredKeys.forEach(key => {\n warnings.push(unregisteredScopeWarning(key, line));\n });\n\n return warnings;\n}\n\ninterface ExportSplice {\n source: string;\n sourceFile: ts.SourceFile;\n statement: ts.ExportAssignment;\n callText: string;\n}\n\n// Only the export statement is rewritten. `getStart` stops after leading trivia, so a comment above\n// the export stays in the prefix, and the call's own text carries every comment, cast and computed\n// value inside the argument through byte-for-byte.\nfunction spliceExport (input: ExportSplice): string {\n const start = input.statement.getStart(input.sourceFile);\n const prefix = input.source.slice(0, start);\n const suffix = input.source.slice(input.statement.getEnd());\n const rehoused = `${prefix}${RENDERER_EXPORT}${input.callText};${suffix}`;\n\n return rehoused.endsWith('\\n') ? rehoused : `${rehoused}\\n`;\n}\n\nfunction defaultExports (sourceFile: ts.SourceFile): ts.ExportAssignment[] {\n return sourceFile.statements\n .filter(ts.isExportAssignment)\n .filter(statement => statement.isExportEquals !== true);\n}\n\nfunction emptyState (): PeelState {\n return {\n awaited: false,\n arrayWrapped: false,\n droppedAnnotation: false,\n siblingElements: 0,\n definedConfig: false,\n };\n}\n\n/**\n * Re-houses a v3 single-file config as a v4 lint module. Nothing about the configuration itself\n * changes between the two majors — only where the call lives — so the source is spliced rather than\n * re-rendered: every import, `silenceRules(...)` call, comment and blank line outside the export\n * statement survives byte-for-byte.\n * @example\n * rehouseV3Config(\"import { useInsider } from '@useinsider/eslint-config';\\nexport default useInsider({});\", 'eslint.config.js');\n * // { kind: 'rehoused', rehoused: { lintModule: '…export const { useInsiderESLint, useInsiderOXC } = useInsider({});\\n', … } }\n */\nexport function rehouseV3Config (source: string, filePath: string): RehouseOutcome {\n const name = basename(filePath);\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const aliases = composerAliases(sourceFile);\n const calls = collectCalls(sourceFile, aliases);\n const exportStatements = defaultExports(sourceFile);\n\n if (calls.length === 0) {\n return { kind: 'not-v3' };\n }\n\n if (exportStatements.length !== 1) {\n return refuse(indirectCallReason(name));\n }\n\n if (calls.length > 1) {\n return refuse(multipleCallsReason(name));\n }\n\n const [statement] = exportStatements;\n const state = emptyState();\n const unwrapped = unwrapDefaultExport(statement.expression, state);\n\n if (state.definedConfig) {\n return refuse(defineConfigReason(name));\n }\n\n // Order matters: `[{ ignores }, ...useInsider({...})]` peels to the object literal, so the\n // indirect-call check would fire first and tell a consumer to make the call the default export\n // when it already is. The sibling count is the accurate diagnosis for every mixed array.\n if (state.siblingElements > 0) {\n return refuse(mixedArrayReason(name, state.siblingElements));\n }\n\n if (!isCallOf(unwrapped, aliases)) {\n return refuse(indirectCallReason(name));\n }\n\n const reading = readArgument(unwrapped);\n\n if (reading.optionKeys.includes('preset')) {\n return refuse(presetReason(name));\n }\n\n const removed = describeRemovedOptions(reading.optionKeys);\n\n if (removed !== null) {\n return refuse(removedOptionReason(name, removed));\n }\n\n return {\n kind: 'rehoused',\n rehoused: {\n lintModule: spliceExport({\n source,\n sourceFile,\n statement,\n callText: unwrapped.getText(sourceFile),\n }),\n scopes: reading.scopes,\n optionKeys: reading.optionKeys,\n unregisteredKeys: reading.unregisteredKeys,\n silenceRulesCallCount: collectCalls(sourceFile, new Set([SILENCE_RULES_NAME])).length,\n droppedAwait: state.awaited,\n droppedArrayWrapper: state.arrayWrapped,\n warnings: collectWarnings(lineOf(sourceFile, unwrapped), reading, state),\n },\n };\n}\n","import * as ts from 'typescript';\n\nconst INSIDER_MODULE_SPECIFIER = '@useinsider/eslint-config';\n\ninterface ImportBindings {\n statement: ts.ImportDeclaration;\n moduleSpecifier: string;\n defaultBinding?: string;\n namespaceBinding?: string;\n namedBindings: { localName: string; importedName: string }[];\n isSideEffect: boolean;\n}\n\nfunction readModuleSpecifier (statement: ts.ImportDeclaration): string | null {\n const { moduleSpecifier } = statement;\n\n if (!ts.isStringLiteralLike(moduleSpecifier)) {\n return null;\n }\n\n return moduleSpecifier.text;\n}\n\nfunction readImportBindings (statement: ts.ImportDeclaration): ImportBindings | null {\n const moduleSpecifier = readModuleSpecifier(statement);\n\n if (moduleSpecifier === null) {\n return null;\n }\n\n const { importClause } = statement;\n\n if (!importClause) {\n return {\n statement,\n moduleSpecifier,\n namedBindings: [],\n isSideEffect: true,\n };\n }\n\n const bindings: ImportBindings = {\n statement,\n moduleSpecifier,\n namedBindings: [],\n isSideEffect: false,\n };\n\n if (importClause.name) {\n bindings.defaultBinding = importClause.name.text;\n }\n\n const { namedBindings } = importClause;\n\n if (namedBindings) {\n if (ts.isNamespaceImport(namedBindings)) {\n bindings.namespaceBinding = namedBindings.name.text;\n } else {\n namedBindings.elements.forEach(element => {\n bindings.namedBindings.push({\n localName: element.name.text,\n importedName: element.propertyName?.text ?? element.name.text,\n });\n });\n }\n }\n\n return bindings;\n}\n\nfunction isPropertyKeyPosition (node: ts.Identifier): boolean {\n const { parent } = node;\n\n if (!parent) {\n return false;\n }\n\n if (ts.isPropertyAssignment(parent) && parent.name === node) {\n return true;\n }\n\n if (ts.isPropertyAccessExpression(parent) && parent.name === node) {\n return true;\n }\n\n if (ts.isQualifiedName(parent) && parent.right === node) {\n return true;\n }\n\n return false;\n}\n\nfunction classifyIdentifier (node: ts.Identifier, referenced: Set<string>): void {\n const { parent } = node;\n\n if (parent && ts.isShorthandPropertyAssignment(parent) && parent.name === node) {\n referenced.add(node.text);\n\n return;\n }\n\n if (isPropertyKeyPosition(node)) {\n return;\n }\n\n referenced.add(node.text);\n}\n\nfunction collectReferencedIdentifiers (sourceFile: ts.SourceFile): Set<string> {\n const referenced = new Set<string>();\n\n function visit (node: ts.Node): void {\n if (ts.isImportDeclaration(node)) {\n return;\n }\n\n if (ts.isIdentifier(node)) {\n classifyIdentifier(node, referenced);\n }\n\n ts.forEachChild(node, visit);\n }\n\n sourceFile.statements.forEach(statement => {\n if (ts.isImportDeclaration(statement)) {\n return;\n }\n\n visit(statement);\n });\n\n return referenced;\n}\n\nfunction quoteModuleSpecifier (statement: ts.ImportDeclaration, sourceFile: ts.SourceFile): string {\n return statement.moduleSpecifier.getText(sourceFile);\n}\n\nfunction renderNamedSpecifier (binding: { localName: string; importedName: string }): string {\n if (binding.localName === binding.importedName) {\n return binding.localName;\n }\n\n return `${binding.importedName} as ${binding.localName}`;\n}\n\nfunction rebuildImportStatement (\n bindings: ImportBindings,\n keptNamed: { localName: string; importedName: string }[],\n sourceFile: ts.SourceFile\n): string {\n const clauseParts: string[] = [];\n\n if (bindings.defaultBinding) {\n clauseParts.push(bindings.defaultBinding);\n }\n\n if (bindings.namespaceBinding) {\n clauseParts.push(`* as ${bindings.namespaceBinding}`);\n } else if (keptNamed.length > 0) {\n const list = keptNamed.map(renderNamedSpecifier).join(', ');\n\n clauseParts.push(`{ ${list} }`);\n }\n\n const moduleSpecifier = quoteModuleSpecifier(bindings.statement, sourceFile);\n\n if (clauseParts.length === 0) {\n return `import ${moduleSpecifier};`;\n }\n\n return `import ${clauseParts.join(', ')} from ${moduleSpecifier};`;\n}\n\ninterface RewriteDecision {\n keep: boolean;\n replacement?: string;\n}\n\ninterface UsageSummary {\n hasDefault: boolean;\n hasNamespace: boolean;\n hasNamed: boolean;\n defaultStays: boolean;\n namespaceStays: boolean;\n keptNamed: { localName: string; importedName: string }[];\n}\n\nfunction summarizeUsage (bindings: ImportBindings, referenced: Set<string>): UsageSummary {\n const defaultStays = bindings.defaultBinding ? referenced.has(bindings.defaultBinding) : false;\n const namespaceStays = bindings.namespaceBinding ? referenced.has(bindings.namespaceBinding) : false;\n const keptNamed = bindings.namedBindings.filter(named => referenced.has(named.localName));\n\n return {\n hasDefault: Boolean(bindings.defaultBinding),\n hasNamespace: Boolean(bindings.namespaceBinding),\n hasNamed: bindings.namedBindings.length > 0,\n defaultStays,\n namespaceStays,\n keptNamed,\n };\n}\n\nfunction isFullyUnchanged (bindings: ImportBindings, usage: UsageSummary): boolean {\n if (usage.hasDefault && !usage.defaultStays) {\n return false;\n }\n\n if (usage.hasNamespace && !usage.namespaceStays) {\n return false;\n }\n\n if (usage.hasNamed && usage.keptNamed.length !== bindings.namedBindings.length) {\n return false;\n }\n\n return true;\n}\n\nfunction hasAnyBinding (usage: UsageSummary): boolean {\n return usage.hasDefault || usage.hasNamespace || usage.hasNamed;\n}\n\nfunction hasAnySurvivingBinding (usage: UsageSummary): boolean {\n const namedStays = usage.hasNamed && usage.keptNamed.length > 0;\n\n return usage.defaultStays || usage.namespaceStays || namedStays;\n}\n\nfunction buildRebuiltBindings (bindings: ImportBindings, usage: UsageSummary): ImportBindings {\n return {\n ...bindings,\n defaultBinding: usage.defaultStays ? bindings.defaultBinding : undefined,\n namespaceBinding: usage.namespaceStays ? bindings.namespaceBinding : undefined,\n namedBindings: usage.keptNamed,\n };\n}\n\nfunction decideRewrite (\n bindings: ImportBindings,\n referenced: Set<string>,\n sourceFile: ts.SourceFile\n): RewriteDecision {\n if (bindings.moduleSpecifier === INSIDER_MODULE_SPECIFIER || bindings.isSideEffect) {\n return { keep: true };\n }\n\n const usage = summarizeUsage(bindings, referenced);\n\n if (!hasAnyBinding(usage)) {\n return { keep: true };\n }\n\n if (!hasAnySurvivingBinding(usage)) {\n return { keep: false };\n }\n\n if (isFullyUnchanged(bindings, usage)) {\n return { keep: true };\n }\n\n const rebuilt = buildRebuiltBindings(bindings, usage);\n\n return { keep: true, replacement: rebuildImportStatement(rebuilt, usage.keptNamed, sourceFile) };\n}\n\ninterface LineReplacement {\n startLine: number;\n endLine: number;\n text: string | null;\n}\n\nfunction lineRangeForStatement (statement: ts.Node, sourceFile: ts.SourceFile): { start: number; end: number } {\n const start = sourceFile.getLineAndCharacterOfPosition(statement.getStart(sourceFile)).line;\n const end = sourceFile.getLineAndCharacterOfPosition(statement.getEnd()).line;\n\n return { start, end };\n}\n\nfunction applyReplacements (source: string, replacements: LineReplacement[]): string {\n if (replacements.length === 0) {\n return source;\n }\n\n const lines = source.split('\\n');\n const sorted = replacements.slice().sort((left, right) => right.startLine - left.startLine);\n\n sorted.forEach(replacement => {\n const removeCount = replacement.endLine - replacement.startLine + 1;\n\n if (replacement.text === null) {\n lines.splice(replacement.startLine, removeCount);\n } else {\n lines.splice(replacement.startLine, removeCount, replacement.text);\n }\n });\n\n return lines.join('\\n');\n}\n\nexport function pruneUnusedImports (source: string): string {\n const sourceFile = ts.createSourceFile('migrated.mjs', source, ts.ScriptTarget.Latest, true);\n const importStatements = sourceFile.statements.filter(ts.isImportDeclaration);\n\n if (importStatements.length === 0) {\n return source;\n }\n\n const referenced = collectReferencedIdentifiers(sourceFile);\n const replacements: LineReplacement[] = [];\n\n importStatements.forEach(statement => {\n const bindings = readImportBindings(statement);\n\n if (!bindings) {\n return;\n }\n\n const decision = decideRewrite(bindings, referenced, sourceFile);\n\n if (decision.keep && decision.replacement === undefined) {\n return;\n }\n\n const range = lineRangeForStatement(statement, sourceFile);\n\n if (!decision.keep) {\n replacements.push({ startLine: range.start, endLine: range.end, text: null });\n\n return;\n }\n\n if (decision.replacement !== undefined) {\n replacements.push({ startLine: range.start, endLine: range.end, text: decision.replacement });\n }\n });\n\n return applyReplacements(source, replacements);\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('pruneUnusedImports', () => {\n test('drops a default import whose binding is unreferenced', () => {\n const source = [\n \"import { createRequire } from 'module';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({});',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).not.toContain('createRequire');\n expect(output).toContain(\"import { useInsider } from '@useinsider/eslint-config';\");\n });\n\n test('keeps a default import whose binding is referenced', () => {\n const source = [\n \"import globals from 'globals';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ x: globals.browser });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import globals from 'globals';\");\n });\n\n test('drops a single unused named specifier while keeping the rest', () => {\n const source = [\n \"import { used, unused } from 'pkg';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ x: used });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import { used } from 'pkg';\");\n expect(output).not.toContain('unused');\n });\n\n test('preserves side-effect imports', () => {\n const source = [\n \"import 'reflect-metadata';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({});',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import 'reflect-metadata';\");\n });\n\n test('preserves useInsider import even if heuristics would drop it', () => {\n const source = [\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import { useInsider } from '@useinsider/eslint-config';\");\n });\n\n test('does not count string-literal contents as identifier references', () => {\n const source = [\n \"import { createRequire } from 'module';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n \"export default useInsider({ note: 'createRequire is referenced only in this string' });\",\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).not.toContain('import { createRequire }');\n });\n\n test('drops a namespace import that is unreferenced', () => {\n const source = [\n \"import * as path from 'node:path';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({});',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).not.toContain('node:path');\n });\n\n test('keeps the namespace import when its binding is used', () => {\n const source = [\n \"import * as path from 'node:path';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ root: path.resolve() });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import * as path from 'node:path';\");\n });\n\n test('drops the whole import when default and named are all unused', () => {\n const source = [\n \"import defaultX, { a, b } from 'pkg';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({});',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).not.toContain(\"from 'pkg'\");\n });\n\n test('keeps default and prunes only named specifiers when default is referenced', () => {\n const source = [\n \"import defaultX, { a, b } from 'pkg';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ x: defaultX });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import defaultX from 'pkg';\");\n expect(output).not.toContain('{ a');\n expect(output).not.toContain(', b }');\n });\n\n test('honors renamed named specifiers via `as`', () => {\n const source = [\n \"import { original as local } from 'pkg';\",\n \"import { useInsider } from '@useinsider/eslint-config';\",\n '',\n 'export default useInsider({ x: local });',\n '',\n ].join('\\n');\n\n const output = pruneUnusedImports(source);\n\n expect(output).toContain(\"import { original as local } from 'pkg';\");\n });\n\n test('returns source unchanged when no imports are present', () => {\n const source = 'export default {};\\n';\n\n expect(pruneUnusedImports(source)).toBe(source);\n });\n });\n}\n/* v8 ignore stop */\n","import type {\n PreservedImport,\n StringEntry,\n V1GlobalConf,\n V1GlobalToken,\n V2Plan,\n V2ScopeEntry,\n V2ScopeName,\n} from './types';\nimport { quote } from '~/cli/quote';\nimport { pruneUnusedImports } from './pruneUnusedImports';\n\nconst indent = ' ';\nconst MAX_LINE_LENGTH = 120;\n\nfunction anyEntryHasComment (entries: readonly StringEntry[]): boolean {\n return entries.some(entry => entry.leadingComment !== undefined);\n}\n\nfunction indentCommentBlock (raw: string, baseIndent: string): string {\n return raw\n .split('\\n')\n .map(line => `${baseIndent}${line}`)\n .join('\\n');\n}\n\nfunction formatStringArrayInline (entries: readonly StringEntry[]): string {\n return `[${entries.map(entry => quote(entry.value)).join(', ')}]`;\n}\n\nfunction formatStringArrayMultiline (entries: readonly StringEntry[], baseIndent: string): string {\n const childIndent = `${baseIndent}${indent}`;\n const lines: string[] = ['['];\n\n entries.forEach(entry => {\n if (entry.leadingComment !== undefined) {\n lines.push(indentCommentBlock(entry.leadingComment, childIndent));\n }\n\n lines.push(`${childIndent}${quote(entry.value)},`);\n });\n\n lines.push(`${baseIndent}]`);\n\n return lines.join('\\n');\n}\n\nfunction renderStringArrayField (label: string, entries: readonly StringEntry[], baseIndent: string): string {\n if (!anyEntryHasComment(entries)) {\n const inline = `${baseIndent}${label}: ${formatStringArrayInline(entries)},`;\n\n if (inline.length <= MAX_LINE_LENGTH) {\n return inline;\n }\n }\n\n const multiline = formatStringArrayMultiline(entries, baseIndent);\n\n return `${baseIndent}${label}: ${multiline},`;\n}\n\nfunction formatGlobalValue (value: V1GlobalConf): string {\n if (typeof value === 'string') {\n return quote(value);\n }\n\n return String(value);\n}\n\nfunction tokensFromRecord (globals: Record<string, V1GlobalConf>): V1GlobalToken[] {\n return Object.entries(globals).map(([key, value]) => ({ kind: 'named' as const, key, value }));\n}\n\nfunction formatGlobalTokenInline (token: V1GlobalToken): string {\n if (token.kind === 'spread') {\n return `...${token.raw}`;\n }\n\n return `${token.key}: ${formatGlobalValue(token.value)}`;\n}\n\nfunction formatGlobalTokenLine (token: V1GlobalToken, childIndent: string): string {\n if (token.kind === 'spread') {\n return `${childIndent}...${token.raw},`;\n }\n\n return `${childIndent}${token.key}: ${formatGlobalValue(token.value)},`;\n}\n\nfunction formatGlobalsTokensInline (tokens: readonly V1GlobalToken[]): string {\n const pieces = tokens.map(formatGlobalTokenInline);\n\n return `{ ${pieces.join(', ')} }`;\n}\n\nfunction formatGlobalsTokensMultiline (tokens: readonly V1GlobalToken[], baseIndent: string): string {\n const childIndent = `${baseIndent}${indent}`;\n const lines = tokens.map(token => formatGlobalTokenLine(token, childIndent));\n\n return ['{', ...lines, `${baseIndent}}`].join('\\n');\n}\n\nfunction renderGlobalsField (tokens: readonly V1GlobalToken[], baseIndent: string): string {\n const inline = `${baseIndent}globals: ${formatGlobalsTokensInline(tokens)},`;\n\n if (inline.length <= MAX_LINE_LENGTH) {\n return inline;\n }\n\n const multiline = formatGlobalsTokensMultiline(tokens, baseIndent);\n\n return `${baseIndent}globals: ${multiline},`;\n}\n\nfunction resolveEntryGlobalsTokens (entry: V2ScopeEntry): V1GlobalToken[] | undefined {\n if (entry.globalsTokens && entry.globalsTokens.length > 0) {\n return entry.globalsTokens;\n }\n\n if (entry.globals && Object.keys(entry.globals).length > 0) {\n return tokensFromRecord(entry.globals);\n }\n\n return undefined;\n}\n\nfunction pushFieldComment (lines: string[], comment: string | undefined, fieldIndent: string): void {\n if (comment === undefined) {\n return;\n }\n\n lines.push(indentCommentBlock(comment, fieldIndent));\n}\n\nfunction pushArrayField (\n lines: string[],\n label: string,\n entries: StringEntry[] | undefined,\n fieldComment: string | undefined,\n fieldIndent: string\n): void {\n if (!entries || entries.length === 0) {\n return;\n }\n\n pushFieldComment(lines, fieldComment, fieldIndent);\n lines.push(renderStringArrayField(label, entries, fieldIndent));\n}\n\nfunction formatEntry (entry: V2ScopeEntry, baseIndent: string): string {\n const fieldIndent = `${baseIndent}${indent}`;\n const lines: string[] = [`${baseIndent}{`];\n\n pushFieldComment(lines, entry.fieldComments?.files, fieldIndent);\n lines.push(renderStringArrayField('files', entry.files, fieldIndent));\n\n pushArrayField(lines, 'tsconfigPaths', entry.tsconfigPaths, entry.fieldComments?.tsconfigPaths, fieldIndent);\n pushArrayField(\n lines,\n 'globalComponents',\n entry.globalComponents,\n entry.fieldComments?.globalComponents,\n fieldIndent\n );\n pushArrayField(lines, 'ignores', entry.ignores, entry.fieldComments?.ignores, fieldIndent);\n\n const tokens = resolveEntryGlobalsTokens(entry);\n\n if (tokens) {\n pushFieldComment(lines, entry.fieldComments?.globals, fieldIndent);\n lines.push(renderGlobalsField(tokens, fieldIndent));\n }\n\n lines.push(`${baseIndent}},`);\n\n return lines.join('\\n');\n}\n\nfunction formatScope (scope: V2ScopeName, entries: readonly V2ScopeEntry[], baseIndent: string): string {\n const childIndent = `${baseIndent}${indent}`;\n const renderedEntries: string[] = [];\n\n entries.forEach(entry => {\n if (entry.leadingComment !== undefined) {\n renderedEntries.push(indentCommentBlock(entry.leadingComment, childIndent));\n }\n\n renderedEntries.push(formatEntry(entry, childIndent));\n });\n\n return [\n `${baseIndent}${scope}: [`,\n ...renderedEntries,\n `${baseIndent}],`,\n ].join('\\n');\n}\n\nfunction renderInsiderImport (plan: V2Plan): string {\n const names = plan.needsSilenceRulesImport\n ? ['silenceRules', 'useInsider']\n : ['useInsider'];\n const sorted = names.slice().sort((left, right) => left.localeCompare(right));\n\n return `import { ${sorted.join(', ')} } from '@useinsider/eslint-config';`;\n}\n\nfunction renderPreservedImports (preserved: readonly PreservedImport[]): string[] {\n return preserved.map(item => item.raw);\n}\n\nfunction renderImports (plan: V2Plan): string {\n const preserved = renderPreservedImports(plan.preservedImports ?? []);\n\n return [...preserved, renderInsiderImport(plan)].join('\\n');\n}\n\nfunction renderSilenceRulesCall (rules: readonly StringEntry[], leadingComment: string | undefined): string {\n const hasComment = anyEntryHasComment(rules);\n const prefix = leadingComment === undefined ? '' : `${leadingComment}\\n`;\n\n if (!hasComment) {\n const inline = `${prefix}silenceRules(${formatStringArrayInline(rules)});`;\n\n if (inline.length - prefix.length <= MAX_LINE_LENGTH) {\n return inline;\n }\n }\n\n const lines: string[] = ['silenceRules(['];\n\n rules.forEach(rule => {\n if (rule.leadingComment !== undefined) {\n lines.push(indentCommentBlock(rule.leadingComment, indent));\n }\n\n lines.push(`${indent}${quote(rule.value)},`);\n });\n\n lines.push(']);');\n\n return `${prefix}${lines.join('\\n')}`;\n}\n\nfunction renderSilenceRulesCalls (plan: V2Plan): string {\n if (plan.silenceRulesCalls.length === 0) {\n return '';\n }\n\n return plan.silenceRulesCalls\n .map(call => renderSilenceRulesCall(call.rules, call.leadingComment))\n .join('\\n\\n');\n}\n\nfunction hasAnyContent (plan: V2Plan): boolean {\n const { config } = plan;\n\n return config.scopes.size > 0\n || config.ignores.length > 0\n || config.strictGlobs.length > 0\n || config.strictWholeFile\n || config.spellChecker.ignoredPaths.length > 0\n || config.configFiles.length > 0;\n}\n\nfunction renderStrict (plan: V2Plan): string | null {\n if (plan.config.strictWholeFile) {\n return `${indent}strict: true,`;\n }\n\n if (plan.config.strictGlobs.length > 0) {\n return renderStringArrayField('strict', plan.config.strictGlobs, indent);\n }\n\n return null;\n}\n\nfunction renderSpellChecker (plan: V2Plan): string | null {\n if (plan.config.spellChecker.ignoredPaths.length === 0) {\n return null;\n }\n\n const innerIndent = `${indent}${indent}`;\n\n return [\n `${indent}spellChecker: {`,\n renderStringArrayField('ignoredPaths', plan.config.spellChecker.ignoredPaths, innerIndent),\n `${indent}},`,\n ].join('\\n');\n}\n\nfunction renderScopes (plan: V2Plan): string[] {\n return [...plan.config.scopes.entries()].map(([scope, entries]) => formatScope(scope, entries, indent));\n}\n\nfunction renderConfigFiles (plan: V2Plan): string | null {\n if (plan.config.configFiles.length === 0) {\n return null;\n }\n\n return renderStringArrayField('configFiles', plan.config.configFiles, indent);\n}\n\nfunction renderConfigBody (plan: V2Plan): string {\n const lines: string[] = [];\n\n if (plan.config.ignores.length > 0) {\n lines.push(renderStringArrayField('ignores', plan.config.ignores, indent));\n }\n\n lines.push(...renderScopes(plan));\n\n const configFilesLine = renderConfigFiles(plan);\n\n if (configFilesLine) {\n lines.push(configFilesLine);\n }\n\n const strictLine = renderStrict(plan);\n\n if (strictLine) {\n lines.push(strictLine);\n }\n\n const spellCheckerSection = renderSpellChecker(plan);\n\n if (spellCheckerSection) {\n lines.push(spellCheckerSection);\n }\n\n return lines.join('\\n');\n}\n\nexport function renderV2 (plan: V2Plan): string {\n const parts: string[] = [renderImports(plan)];\n const silenceRulesSection = renderSilenceRulesCalls(plan);\n\n if (silenceRulesSection) {\n parts.push('');\n parts.push(silenceRulesSection);\n }\n\n parts.push('');\n\n if (plan.useInsiderLeadingComment !== undefined) {\n parts.push(plan.useInsiderLeadingComment);\n }\n\n if (!hasAnyContent(plan)) {\n parts.push('export const { useInsiderESLint, useInsiderOXC } = useInsider({});');\n parts.push('');\n\n return pruneUnusedImports(parts.join('\\n'));\n }\n\n parts.push('export const { useInsiderESLint, useInsiderOXC } = useInsider({');\n parts.push(renderConfigBody(plan));\n parts.push('});');\n parts.push('');\n\n return pruneUnusedImports(parts.join('\\n'));\n}\n","import type {\n ParseResult,\n PreservedImport,\n StringEntry,\n V1ArrayElement,\n V1ConfigFieldComments,\n V1GlobalConf,\n V1GlobalToken,\n V1IgnoresBlock,\n V1PresetName,\n V1SpellCheckerOffBlock,\n V1StandaloneGlobals,\n V1UseInsiderCall,\n V2Config,\n V2EntryFieldComments,\n V2Plan,\n V2ScopeEntry,\n V2ScopeName,\n} from './types';\nimport type { MigrationWarning } from './warnings';\nimport { foldGlobalsTokens } from './globalsFolding';\nimport { cloneEntries, cloneEntry, entryValues, hasValue } from './stringEntry';\n\nfunction appendUniqueEntry (target: StringEntry[], incoming: StringEntry): void {\n if (hasValue(target, incoming.value)) {\n return;\n }\n\n target.push(cloneEntry(incoming));\n}\n\nconst presetToScope: Partial<Record<V1PresetName, V2ScopeName>> = {\n javascript: 'javascript',\n 'javascript-dom': 'javascriptDom',\n 'javascript-node': 'javascriptNode',\n typescript: 'typescript',\n 'typescript-dom': 'typescriptDom',\n 'typescript-node': 'typescriptNode',\n vue2: 'vue2',\n vue3: 'vue3',\n 'vue2-typescript': 'vue2Typescript',\n 'vue3-typescript': 'vue3Typescript',\n jest: 'jest',\n vitest: 'vitest',\n 'jsdoc-based-ts': 'jsdocBasedTs',\n};\n\nfunction isTypescriptContext (call: V1UseInsiderCall): boolean {\n if (call.parserIsTypescript) {\n return true;\n }\n\n return Boolean(call.parserProject && call.parserProject.length > 0);\n}\n\nfunction resolveAliasPreset (preset: V1PresetName, call: V1UseInsiderCall): V1PresetName {\n if (preset === 'dom') {\n return isTypescriptContext(call) ? 'typescript-dom' : 'javascript-dom';\n }\n\n if (preset === 'node') {\n return isTypescriptContext(call) ? 'typescript-node' : 'javascript-node';\n }\n\n return preset;\n}\n\nfunction promoteScopeForParser (scope: V2ScopeName, call: V1UseInsiderCall): V2ScopeName {\n if (!call.parserIsTypescript) {\n return scope;\n }\n\n if (scope === 'javascript') {\n return 'typescript';\n }\n\n if (scope === 'javascriptDom') {\n return 'typescriptDom';\n }\n\n if (scope === 'javascriptNode') {\n return 'typescriptNode';\n }\n\n if (scope === 'vue2') {\n return 'vue2Typescript';\n }\n\n if (scope === 'vue3') {\n return 'vue3Typescript';\n }\n\n return scope;\n}\n\nconst tsScopes = new Set<V2ScopeName>([\n 'typescript',\n 'typescriptDom',\n 'typescriptNode',\n 'vue2Typescript',\n 'vue3Typescript',\n 'jsdocBasedTs',\n]);\n\nconst vueScopes = new Set<V2ScopeName>([\n 'vue2',\n 'vue3',\n 'vue2Typescript',\n 'vue3Typescript',\n]);\n\nfunction freshConfig (): V2Config {\n return {\n ignores: [],\n scopes: new Map(),\n strictGlobs: [],\n strictWholeFile: false,\n spellChecker: { ignoredPaths: [] },\n configFiles: [],\n };\n}\n\nfunction appendScope (config: V2Config, scope: V2ScopeName, entry: V2ScopeEntry): void {\n const existing = config.scopes.get(scope);\n\n if (existing) {\n existing.push(entry);\n } else {\n config.scopes.set(scope, [entry]);\n }\n}\n\nfunction applyTypescriptFields (\n entry: V2ScopeEntry,\n scope: V2ScopeName,\n call: V1UseInsiderCall,\n warnings: MigrationWarning[]\n): void {\n if (!tsScopes.has(scope)) {\n return;\n }\n\n if (call.parserProject && call.parserProject.length > 0) {\n entry.tsconfigPaths = cloneEntries(call.parserProject);\n\n return;\n }\n\n if (call.parserProjectService) {\n warnings.push({\n kind: 'project-service-dropped',\n line: call.line,\n message: '\\'projectService: true\\' is not supported in v2 — dropped',\n });\n }\n}\n\nfunction applyVueFields (entry: V2ScopeEntry, scope: V2ScopeName, call: V1UseInsiderCall): void {\n if (vueScopes.has(scope) && call.globalComponents && call.globalComponents.length > 0) {\n entry.globalComponents = cloneEntries(call.globalComponents);\n }\n}\n\nfunction mapV1FieldComments (\n call: V1UseInsiderCall,\n scope: V2ScopeName\n): V2EntryFieldComments | undefined {\n const incoming: V1ConfigFieldComments | undefined = call.fieldComments;\n\n if (!incoming) {\n return undefined;\n }\n\n const result: V2EntryFieldComments = {};\n\n if (incoming.files !== undefined) {\n result.files = incoming.files;\n }\n\n if (incoming.ignores !== undefined) {\n result.ignores = incoming.ignores;\n }\n\n if (incoming.globals !== undefined) {\n result.globals = incoming.globals;\n }\n\n if (incoming.parserProject !== undefined && tsScopes.has(scope)) {\n result.tsconfigPaths = incoming.parserProject;\n }\n\n if (incoming.globalComponents !== undefined && vueScopes.has(scope)) {\n result.globalComponents = incoming.globalComponents;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction buildEntry (\n call: V1UseInsiderCall,\n scope: V2ScopeName,\n warnings: MigrationWarning[]\n): V2ScopeEntry | null {\n if (!call.files || call.files.length === 0) {\n warnings.push({\n kind: 'unrecognized-block',\n line: call.line,\n message: `useInsider preset '${scope}' has no files glob; skipping`,\n });\n\n return null;\n }\n\n const entry: V2ScopeEntry = { files: cloneEntries(call.files) };\n\n if (call.ignores && call.ignores.length > 0) {\n entry.ignores = cloneEntries(call.ignores);\n }\n\n applyTypescriptFields(entry, scope, call, warnings);\n applyVueFields(entry, scope, call);\n\n if (call.globalsTokens && call.globalsTokens.length > 0) {\n entry.globalsTokens = call.globalsTokens.map(token => ({ ...token }));\n }\n\n if (call.globals && Object.keys(call.globals).length > 0) {\n entry.globals = { ...call.globals };\n }\n\n const fieldComments = mapV1FieldComments(call, scope);\n\n if (fieldComments) {\n entry.fieldComments = fieldComments;\n }\n\n return entry;\n}\n\nfunction handleStrictPreset (call: V1UseInsiderCall, config: V2Config): void {\n if (!call.files || call.files.length === 0) {\n config.strictWholeFile = true;\n\n return;\n }\n\n call.files.forEach(file => appendUniqueEntry(config.strictGlobs, file));\n}\n\nfunction handlePreset (\n preset: V1PresetName,\n call: V1UseInsiderCall,\n config: V2Config,\n warnings: MigrationWarning[]\n): V2ScopeEntry | null {\n if (preset === 'strict') {\n handleStrictPreset(call, config);\n\n return null;\n }\n\n const resolved = resolveAliasPreset(preset, call);\n const baseScope = presetToScope[resolved];\n\n if (!baseScope) {\n warnings.push({\n kind: 'unknown-preset',\n line: call.line,\n message: `Preset '${preset}' has no v2 mapping — dropped`,\n });\n\n return null;\n }\n\n const scope = promoteScopeForParser(baseScope, call);\n const entry = buildEntry(call, scope, warnings);\n\n if (entry) {\n appendScope(config, scope, entry);\n\n return entry;\n }\n\n return null;\n}\n\ninterface DroppedStats {\n droppedRules: number;\n droppedRuleBlocks: number;\n droppedPlugins: Set<string>;\n droppedPluginEntries: number;\n}\n\nfunction emptyStats (): DroppedStats {\n return {\n droppedRules: 0,\n droppedRuleBlocks: 0,\n droppedPlugins: new Set<string>(),\n droppedPluginEntries: 0,\n };\n}\n\nfunction captureConfigPresetFiles (call: V1UseInsiderCall, config: V2Config): void {\n if (!call.presets.includes('config') || !call.files) {\n return;\n }\n\n call.files.forEach(file => appendUniqueEntry(config.configFiles, file));\n}\n\nfunction processUseInsiderCall (\n call: V1UseInsiderCall,\n config: V2Config,\n warnings: MigrationWarning[]\n): DroppedStats {\n captureConfigPresetFiles(call, config);\n\n const filteredPresets = call.presets.filter(preset => preset !== 'config');\n const stats = emptyStats();\n\n stats.droppedRules = call.extraRuleCount > 0 ? call.extraRuleCount : 0;\n stats.droppedRuleBlocks = call.extraRuleCount > 0 ? 1 : 0;\n\n if (call.customPluginNames && call.customPluginNames.length > 0) {\n call.customPluginNames.forEach(name => stats.droppedPlugins.add(name));\n stats.droppedPluginEntries = 1;\n }\n\n let firstEmitted: V2ScopeEntry | null = null;\n\n filteredPresets.forEach(preset => {\n const emitted = handlePreset(preset, call, config, warnings);\n\n if (emitted && !firstEmitted) {\n firstEmitted = emitted;\n }\n });\n\n if (firstEmitted && call.leadingComment !== undefined) {\n (firstEmitted as V2ScopeEntry).leadingComment = call.leadingComment;\n }\n\n return stats;\n}\n\nfunction applyIgnoresBlock (element: V1IgnoresBlock, config: V2Config): void {\n if (element.leadingComment !== undefined\n && element.ignores.length > 0\n && config.ignores.length === 0\n && element.ignores[0].leadingComment === undefined) {\n const first = cloneEntry(element.ignores[0]);\n\n first.leadingComment = element.leadingComment;\n config.ignores.push(first);\n element.ignores.slice(1).forEach(ignore => appendUniqueEntry(config.ignores, ignore));\n\n return;\n }\n\n element.ignores.forEach(ignore => appendUniqueEntry(config.ignores, ignore));\n}\n\nfunction applySpellCheckerOff (element: V1SpellCheckerOffBlock, config: V2Config): void {\n element.files.forEach(file => appendUniqueEntry(config.spellChecker.ignoredPaths, file));\n}\n\nfunction filesOverlap (left: readonly StringEntry[], right: readonly StringEntry[]): boolean {\n const leftValues = entryValues(left);\n const rightValues = entryValues(right);\n\n if (leftValues.length === rightValues.length\n && leftValues.every((value, index) => value === rightValues[index])) {\n return true;\n }\n\n return leftValues.some(value => rightValues.includes(value));\n}\n\nfunction findEntryForStandalone (config: V2Config, files: StringEntry[]): V2ScopeEntry | null {\n const allEntries = [...config.scopes.values()].flat();\n const match = allEntries.find(entry => filesOverlap(entry.files, files));\n\n return match ?? null;\n}\n\nfunction mergeStandaloneTokensIntoEntry (entry: V2ScopeEntry, incoming: V1GlobalToken[]): void {\n const existing = entry.globalsTokens ?? [];\n const namedSeen = new Map<string, number>();\n\n existing.forEach((token, index) => {\n if (token.kind === 'named') {\n namedSeen.set(token.key, index);\n }\n });\n\n const merged = existing.slice();\n\n incoming.forEach(token => {\n if (token.kind === 'spread') {\n merged.push({ ...token });\n\n return;\n }\n\n const seenIndex = namedSeen.get(token.key);\n\n if (seenIndex === undefined) {\n namedSeen.set(token.key, merged.length);\n merged.push({ ...token });\n\n return;\n }\n\n merged[seenIndex] = { ...token };\n });\n\n entry.globalsTokens = merged;\n\n const namedRecord: Record<string, V1GlobalConf> = {};\n\n merged.forEach(token => {\n if (token.kind === 'named') {\n namedRecord[token.key] = token.value;\n }\n });\n\n entry.globals = Object.keys(namedRecord).length > 0 ? namedRecord : undefined;\n}\n\nfunction inferScopeForStandalone (files: StringEntry[]): V2ScopeName {\n const values = entryValues(files);\n const hasVue = values.some(file => file.includes('.vue'));\n\n if (hasVue) {\n return 'vue3';\n }\n\n const hasTs = values.some(file => file.includes('.ts') || file.includes('.tsx'));\n\n if (hasTs) {\n return 'typescript';\n }\n\n return 'javascript';\n}\n\nfunction applyStandaloneGlobals (element: V1StandaloneGlobals, config: V2Config): void {\n const existing = findEntryForStandalone(config, element.files);\n\n if (existing) {\n mergeStandaloneTokensIntoEntry(existing, element.globalsTokens);\n\n if (existing.leadingComment === undefined && element.leadingComment !== undefined) {\n existing.leadingComment = element.leadingComment;\n }\n\n return;\n }\n\n const scope = inferScopeForStandalone(element.files);\n const entry: V2ScopeEntry = { files: cloneEntries(element.files) };\n\n mergeStandaloneTokensIntoEntry(entry, element.globalsTokens);\n\n if (element.leadingComment !== undefined) {\n entry.leadingComment = element.leadingComment;\n }\n\n appendScope(config, scope, entry);\n}\n\nfunction processElement (\n element: V1ArrayElement,\n config: V2Config,\n warnings: MigrationWarning[]\n): DroppedStats {\n if (element.kind === 'ignoresBlock') {\n applyIgnoresBlock(element, config);\n\n return emptyStats();\n }\n\n if (element.kind === 'spellCheckerOff') {\n applySpellCheckerOff(element, config);\n\n return emptyStats();\n }\n\n if (element.kind === 'standaloneGlobals') {\n applyStandaloneGlobals(element, config);\n\n return emptyStats();\n }\n\n if (element.kind === 'useInsiderCall') {\n return processUseInsiderCall(element, config, warnings);\n }\n\n return emptyStats();\n}\n\nfunction formatDroppedRulesMessage (count: number, blocks: number): string {\n const rulesLabel = count === 1 ? 'rule override' : 'rule overrides';\n const blocksLabel = blocks === 1 ? 'block' : 'blocks';\n\n return `Dropped ${count} custom ${rulesLabel} across ${blocks} ${blocksLabel}`;\n}\n\nfunction formatDroppedPluginsMessage (pluginNames: string[], entries: number): string {\n const sorted = pluginNames.slice().sort((left, right) => left.localeCompare(right));\n\n return `Dropped custom plugins on ${entries} entries: ${sorted.join(', ')}`;\n}\n\nfunction mergeStats (left: DroppedStats, right: DroppedStats): DroppedStats {\n const merged = emptyStats();\n\n merged.droppedRules = left.droppedRules + right.droppedRules;\n merged.droppedRuleBlocks = left.droppedRuleBlocks + right.droppedRuleBlocks;\n merged.droppedPluginEntries = left.droppedPluginEntries + right.droppedPluginEntries;\n left.droppedPlugins.forEach(name => merged.droppedPlugins.add(name));\n right.droppedPlugins.forEach(name => merged.droppedPlugins.add(name));\n\n return merged;\n}\n\nfunction tokensFromRecord (globals: Record<string, V1GlobalConf>): V1GlobalToken[] {\n return Object.entries(globals).map(([key, value]) => ({ kind: 'named' as const, key, value }));\n}\n\nfunction resolveBaseTokens (entry: V2ScopeEntry): V1GlobalToken[] | undefined {\n if (entry.globalsTokens && entry.globalsTokens.length > 0) {\n return entry.globalsTokens;\n }\n\n if (entry.globals && Object.keys(entry.globals).length > 0) {\n return tokensFromRecord(entry.globals);\n }\n\n return undefined;\n}\n\nfunction applyGlobalsFolding (config: V2Config): boolean {\n let anySyntheticEmitted = false;\n\n config.scopes.forEach(entries => {\n entries.forEach(entry => {\n const baseTokens = resolveBaseTokens(entry);\n\n if (!baseTokens) {\n return;\n }\n\n const { tokens, addedSpreadEnvs } = foldGlobalsTokens(baseTokens);\n\n if (addedSpreadEnvs.length > 0) {\n anySyntheticEmitted = true;\n }\n\n entry.globalsTokens = tokens;\n\n const namedRecord: Record<string, V1GlobalConf> = {};\n\n tokens.forEach(token => {\n if (token.kind === 'named') {\n namedRecord[token.key] = token.value;\n }\n });\n\n entry.globals = Object.keys(namedRecord).length > 0 ? namedRecord : undefined;\n });\n });\n\n return anySyntheticEmitted;\n}\n\nfunction ensureGlobalsImport (preserved: PreservedImport[]): PreservedImport[] {\n if (preserved.some(item => item.moduleSpecifier === 'globals')) {\n return preserved;\n }\n\n return [{ raw: \"import globals from 'globals';\", moduleSpecifier: 'globals' }, ...preserved];\n}\n\nfunction countRescuedSiblingCalls (parseResult: ParseResult): number {\n return parseResult.arrayElements.reduce((accumulator, element) => {\n if (element.kind === 'useInsiderCall' && element.rescuedSiblingLanguageOptions === true) {\n return accumulator + 1;\n }\n\n return accumulator;\n }, 0);\n}\n\nfunction formatRescuedSiblingMessage (count: number): string {\n const label = count === 1 ? 'call' : 'calls';\n\n return `Rescued misplaced \\`languageOptions\\` from ${count} \\`useInsider()\\` ${label} `\n + '— these were source-level mistakes that v1 ignored silently';\n}\n\nexport function transformToV2 (parseResult: ParseResult): V2Plan {\n const config = freshConfig();\n const warnings: MigrationWarning[] = [...parseResult.warnings];\n\n const stats = parseResult.arrayElements.reduce<DroppedStats>(\n (accumulator, element) => mergeStats(accumulator, processElement(element, config, warnings)),\n emptyStats()\n );\n\n if (stats.droppedRules > 0) {\n warnings.push({\n kind: 'dropped-rules',\n message: formatDroppedRulesMessage(stats.droppedRules, stats.droppedRuleBlocks),\n });\n }\n\n if (stats.droppedPluginEntries > 0 && stats.droppedPlugins.size > 0) {\n warnings.push({\n kind: 'dropped-plugins',\n message: formatDroppedPluginsMessage([...stats.droppedPlugins], stats.droppedPluginEntries),\n });\n }\n\n const rescuedSiblingCount = countRescuedSiblingCalls(parseResult);\n\n if (rescuedSiblingCount > 0) {\n warnings.push({\n kind: 'rescued-sibling-language-options',\n message: formatRescuedSiblingMessage(rescuedSiblingCount),\n });\n }\n\n const emittedSyntheticSpread = applyGlobalsFolding(config);\n const preservedImports = emittedSyntheticSpread\n ? ensureGlobalsImport(parseResult.preservedImports)\n : parseResult.preservedImports;\n\n return {\n config,\n silenceRulesCalls: parseResult.silenceRulesCalls,\n needsSilenceRulesImport: parseResult.silenceRulesCalls.length > 0,\n preservedImports,\n warnings,\n droppedRuleCount: stats.droppedRules,\n droppedRuleBlockCount: stats.droppedRuleBlocks,\n };\n}\n","export type MigrationWarningKind = | 'unrecognized-block'\n | 'dropped-rules'\n | 'dropped-globals'\n | 'dropped-plugins'\n | 'project-service-dropped'\n | 'unknown-preset'\n | 'parse-failure'\n | 'no-insider-extends'\n | 'dropped-extends'\n | 'dropped-settings'\n | 'unresolved-rules-spread'\n | 'extension-not-supported'\n | 'env-both-browser-and-node'\n | 'rescued-sibling-language-options'\n | 'dropped-type-annotation'\n | 'unregistered-scope';\n\nexport interface MigrationWarning {\n kind: MigrationWarningKind;\n line?: number;\n message: string;\n}\n\nexport function formatWarnings (warnings: readonly MigrationWarning[]): string {\n if (warnings.length === 0) {\n return '';\n }\n\n return warnings\n .map(warning => {\n const location = warning.line === undefined ? '' : `line ${warning.line}: `;\n\n return ` - ${location}${warning.message}`;\n })\n .join('\\n');\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { describe, test, expect } = import.meta.vitest;\n\n describe('formatWarnings', () => {\n test('returns empty string when no warnings', () => {\n expect(formatWarnings([])).toBe('');\n });\n\n test('formats a warning without a line number', () => {\n expect(formatWarnings([\n { kind: 'dropped-rules', message: 'Dropped 5 rules across 2 blocks' },\n ])).toBe(' - Dropped 5 rules across 2 blocks');\n });\n\n test('formats a warning with a line number', () => {\n expect(formatWarnings([\n { kind: 'unrecognized-block', line: 12, message: 'Unrecognized block: dropping' },\n ])).toBe(' - line 12: Unrecognized block: dropping');\n });\n\n test('joins multiple warnings with newlines', () => {\n const output = formatWarnings([\n { kind: 'dropped-rules', message: 'a' },\n { kind: 'dropped-globals', line: 3, message: 'b' },\n ]);\n\n expect(output).toBe(' - a\\n - line 3: b');\n });\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { renderLintLayoutFiles, resolveLintLayout } from '~/cli/lintLayout';\n\nexport interface WriteMigrationResult {\n targetPath: string;\n lintModulePath: string;\n writtenPaths: string[];\n deletedSourceCandidates: string[];\n}\n\ninterface LayoutWriteResult {\n eslintConfigPath: string;\n lintModulePath: string;\n writtenPaths: string[];\n replacedEslintConfigPaths: string[];\n}\n\nfunction writeLayout (directory: string, lintModuleSource: string): LayoutWriteResult {\n const layout = resolveLintLayout(directory);\n const lintModulePath = join(directory, layout.lintModule);\n\n writeFileSync(lintModulePath, lintModuleSource, 'utf8');\n\n const writtenPaths = [lintModulePath];\n\n renderLintLayoutFiles(layout).forEach(file => {\n const path = join(directory, file.filename);\n\n writeFileSync(path, file.source, 'utf8');\n writtenPaths.push(path);\n });\n\n return {\n eslintConfigPath: join(directory, layout.eslintConfig),\n lintModulePath,\n writtenPaths,\n replacedEslintConfigPaths: layout.replacedEslintConfigs.map(name => join(directory, name)),\n };\n}\n\nfunction withoutDuplicates (paths: readonly string[], keep: string): string[] {\n return [...new Set(paths.filter(path => path !== keep))];\n}\n\n/**\n * Writes the three-file layout beside an existing flat config: the rendered `useInsider()` call\n * becomes `insider.lint.*`, and `eslint.config.*` / `oxlint.config.*` become thin re-exports. A\n * JavaScript-extension source config is superseded by the TypeScript one and nominated for deletion.\n * @example\n * writeMigration('/repo/eslint.config.js', source).deletedSourceCandidates; // ['/repo/eslint.config.js']\n */\nexport function writeMigration (targetPath: string, newSource: string): WriteMigrationResult {\n const result = writeLayout(dirname(targetPath), newSource);\n\n return {\n targetPath: result.eslintConfigPath,\n lintModulePath: result.lintModulePath,\n writtenPaths: result.writtenPaths,\n deletedSourceCandidates: withoutDuplicates(\n [...result.replacedEslintConfigPaths, targetPath],\n result.eslintConfigPath\n ),\n };\n}\n\n/**\n * Same as {@link writeMigration}, but for a legacy `.eslintrc*` source that has to be replaced by a\n * differently-named flat config.\n * @example\n * writeMigrationLegacy('/repo/.eslintrc.cjs', '/repo/eslint.config.mts', src).deletedSourceCandidates;\n * // ['/repo/.eslintrc.cjs']\n */\nexport function writeMigrationLegacy (\n sourcePath: string,\n writePath: string,\n newSource: string\n): WriteMigrationResult {\n const result = writeLayout(dirname(writePath), newSource);\n\n return {\n targetPath: result.eslintConfigPath,\n lintModulePath: result.lintModulePath,\n writtenPaths: result.writtenPaths,\n deletedSourceCandidates: withoutDuplicates(\n [...result.replacedEslintConfigPaths, sourcePath],\n result.eslintConfigPath\n ),\n };\n}\n","import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, isAbsolute, join, resolve } from 'node:path';\nimport type { ParseResult, V2Plan, V2ScopeName } from './types';\nimport { type ClackLike, loadClack } from '../questions';\nimport {\n clearSession,\n loadSession,\n type MigrateSessionAnswers,\n saveSession,\n} from '../sessionStore';\nimport {\n findConfigFile,\n FLAT_CONFIG_FILENAMES,\n LEGACY_CONFIG_FILENAMES,\n} from '~/cli/detect';\nimport {\n type DependencyInstaller,\n detectPackageManager,\n formatNextStepsAddCommand,\n formatNextStepsRemoveCommand,\n type InstallOutcome,\n installWithRetry,\n type PackageManager,\n type WipeFsOps,\n} from '~/cli/installWithRetry';\nimport {\n formatLintScriptChanges,\n formatSkippedLintScripts,\n type LintScriptResult,\n OXLINT_LINT_SCRIPT,\n resolveLintLayout,\n setLintScript,\n} from '~/cli/lintLayout';\nimport { pruneConsumerPackageJson } from '~/cli/prunePackageJson';\nimport { applyTsExtensionsFlag } from '~/cli/tsconfigFlag';\nimport {\n buildInstallList,\n type InstallList,\n type PackageManifestLike,\n pruneEslintDependencies,\n readOwnEslintConfigManifest,\n} from './dependencies';\nimport {\n formatUntouchedDirectiveFiles,\n previewDisableDirectives,\n rewriteDisableDirectives,\n} from './disableDirectives';\nimport { parseEslintrc } from './eslintrc/parse';\nimport { transformEslintrcToV2 } from './eslintrc/transform';\nimport { parseV1Config } from './parse';\nimport { rehouseV3Config, type V3Rehouse } from './rehouseV3';\nimport { renderV2 } from './render';\nimport { transformToV2 } from './transform';\nimport { formatWarnings, type MigrationWarning } from './warnings';\nimport { writeMigration, writeMigrationLegacy } from './writer';\n\nexport type { DependencyInstaller, WipeFsOps };\n\nexport interface MigrateOverrides {\n installer?: DependencyInstaller;\n readEslintConfigManifest?: () => PackageManifestLike;\n wipeFs?: WipeFsOps;\n}\n\nexport interface RunMigrateInput {\n cwd: string;\n target?: string;\n yes?: boolean;\n noInstall?: boolean;\n fromLint?: boolean;\n overrides?: MigrateOverrides;\n}\n\nconst unsupportedEslintrcExtensions = ['.json', '.yml', '.yaml'];\n\ntype SourceFormat = 'flat' | 'eslintrc' | 'eslintrc-unsupported';\n\nfunction flatLooksLikeV1 (filePath: string): boolean {\n try {\n const source = readFileSync(filePath, 'utf8');\n\n return source.includes('useInsider') && /\\b(import|require)\\b/.test(source);\n } catch {\n return false;\n }\n}\n\nfunction resolveTargetPath (input: RunMigrateInput): string | null {\n if (input.target) {\n const absolute = isAbsolute(input.target) ? input.target : resolve(input.cwd, input.target);\n\n if (existsSync(absolute)) {\n return absolute;\n }\n\n return null;\n }\n\n const flatFound = findConfigFile(input.cwd, FLAT_CONFIG_FILENAMES);\n const legacyFound = findConfigFile(input.cwd, LEGACY_CONFIG_FILENAMES);\n\n if (flatFound && legacyFound) {\n return flatLooksLikeV1(flatFound) ? flatFound : legacyFound;\n }\n\n return flatFound ?? legacyFound ?? null;\n}\n\nfunction detectFormatByName (filePath: string): SourceFormat | null {\n const name = basename(filePath);\n\n if (name.startsWith('eslint.config.')) {\n return 'flat';\n }\n\n if (!name.startsWith('.eslintrc')) {\n return null;\n }\n\n if (name === '.eslintrc') {\n return 'eslintrc-unsupported';\n }\n\n const unsupported = unsupportedEslintrcExtensions.find(extension => name.endsWith(extension));\n\n if (unsupported) {\n return 'eslintrc-unsupported';\n }\n\n return 'eslintrc';\n}\n\nfunction detectFormatByContent (source: string): SourceFormat {\n if (source.includes('export default') && source.includes('useInsider')) {\n return 'flat';\n }\n\n if (/\\bmodule\\.exports\\s*=/.test(source)) {\n return 'eslintrc';\n }\n\n return 'flat';\n}\n\nfunction detectFormat (filePath: string, source: string): SourceFormat {\n const byName = detectFormatByName(filePath);\n\n if (byName) {\n return byName;\n }\n\n return detectFormatByContent(source);\n}\n\nfunction isV1Shape (parseResult: ParseResult): boolean {\n if (!parseResult.hasUseInsiderImport) {\n return false;\n }\n\n return parseResult.arrayElements.some(element => element.kind === 'useInsiderCall');\n}\n\nfunction describeScopes (plan: V2Plan): string {\n if (plan.config.scopes.size === 0) {\n return 'Scopes detected: (none)';\n }\n\n const detected = [...plan.config.scopes.entries()]\n .map(([scope, entries]) => `${scope} (${entries.length})`)\n .join(', ');\n\n return `Scopes detected: ${detected}`;\n}\n\nfunction describeStrict (plan: V2Plan): string {\n if (plan.config.strictWholeFile) {\n return 'Strict scopes: global (true)';\n }\n\n if (plan.config.strictGlobs.length > 0) {\n return `Strict scopes: 1 (${plan.config.strictGlobs.length} globs)`;\n }\n\n return 'Strict scopes: 0';\n}\n\nfunction describeRehousedKeys (label: string, keys: readonly string[]): string {\n return keys.length === 0 ? `${label}: (none)` : `${label}: ${keys.join(', ')}`;\n}\n\n// The v3 → v4 change is where the call lives, not what it says, so the summary reports what was\n// carried over rather than what was understood — the two are the same file here.\nfunction rehouseSummary (rehoused: V3Rehouse): string {\n const lines = [\n 'Source: v3 single-file eslint.config.*',\n 'Re-housed as the lint module: only the export statement changed, every other line is byte-for-byte.',\n describeRehousedKeys('Options carried over', rehoused.optionKeys),\n describeRehousedKeys('Scopes with dependencies', rehoused.scopes),\n `silenceRules() calls kept: ${rehoused.silenceRulesCallCount}`,\n ];\n\n if (rehoused.droppedAwait) {\n lines.push('Dropped the `await` on the call — useInsider() is synchronous in v4.');\n }\n\n if (rehoused.droppedArrayWrapper) {\n lines.push('Dropped the array wrapper around the call — the lint module exports the renderers.');\n }\n\n lines.push(`Warnings: ${rehoused.warnings.length}`);\n\n return lines.join('\\n');\n}\n\nfunction summary (plan: V2Plan, format: SourceFormat): string {\n const lines: string[] = [];\n\n if (format === 'eslintrc') {\n lines.push('Source: legacy .eslintrc');\n } else {\n lines.push('Source: flat eslint.config.*');\n }\n\n lines.push(describeScopes(plan));\n lines.push(describeStrict(plan));\n lines.push(`spellChecker.ignoredPaths: ${plan.config.spellChecker.ignoredPaths.length}`);\n\n const blocksLabel = plan.droppedRuleBlockCount === 1 ? 'block' : 'blocks';\n\n lines.push(`Dropped custom rules: ${plan.droppedRuleCount} across ${plan.droppedRuleBlockCount} ${blocksLabel}`);\n lines.push(`Warnings: ${plan.warnings.length}`);\n\n return lines.join('\\n');\n}\n\nexport type PreparedSource = | { kind: 'plan'; plan: V2Plan }\n | { kind: 'rehouse'; rehoused: V3Rehouse };\n\ntype SourceModelResult = | { ok: false; reason: string | null }\n | { ok: true; model: PreparedSource };\n\n// Three source shapes reach here. A legacy `.eslintrc*` and a v1 `useInsider({ preset })` call are\n// re-rendered from a parsed plan; a v3 config carries the same options v4 takes, so it is re-housed\n// instead — re-rendering it could only lose comments and expressions it does not need to understand.\nfunction sourceModelFrom (resolved: ResolvedSource): SourceModelResult {\n if (resolved.format !== 'flat') {\n const parseResult = parseEslintrc(resolved.source, resolved.targetPath);\n\n return parseResult.found\n ? { ok: true, model: { kind: 'plan', plan: transformEslintrcToV2(parseResult) } }\n : { ok: false, reason: null };\n }\n\n const parseResult = parseV1Config(resolved.source, resolved.targetPath);\n\n if (isV1Shape(parseResult)) {\n return { ok: true, model: { kind: 'plan', plan: transformToV2(parseResult) } };\n }\n\n const outcome = rehouseV3Config(resolved.source, resolved.targetPath);\n\n if (outcome.kind === 'rehoused') {\n return { ok: true, model: { kind: 'rehouse', rehoused: outcome.rehoused } };\n }\n\n return { ok: false, reason: outcome.kind === 'refused' ? outcome.reason : null };\n}\n\nfunction scopesOf (model: PreparedSource): Set<V2ScopeName> {\n if (model.kind === 'plan') {\n return new Set<V2ScopeName>(model.plan.config.scopes.keys());\n }\n\n return new Set<V2ScopeName>(model.rehoused.scopes);\n}\n\nfunction warningsOf (model: PreparedSource): readonly MigrationWarning[] {\n return model.kind === 'plan' ? model.plan.warnings : model.rehoused.warnings;\n}\n\n// The flat config is written under the layout's own filename, not the source's. A JavaScript\n// extension is not a cosmetic difference here: ESLint loads `.js`/`.mjs`/`.cjs` configs through Node,\n// so importing `./insider.lint.ts` from one needs unflagged type stripping and dies on Node 20.\nfunction targetWritePath (cwd: string, sourcePath: string): string {\n const directory = dirname(sourcePath) || cwd;\n\n return join(directory, resolveLintLayout(directory).eslintConfig);\n}\n\nfunction parseEslintIgnoreContents (raw: string): string[] {\n return raw\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line.length > 0 && !line.startsWith('#'));\n}\n\ninterface EslintIgnoreLookup {\n path: string;\n patterns: string[];\n}\n\nfunction findEslintIgnore (sourcePath: string): EslintIgnoreLookup | null {\n const candidate = join(dirname(sourcePath), '.eslintignore');\n\n if (!existsSync(candidate)) {\n return null;\n }\n\n const raw = readFileSync(candidate, 'utf8');\n const patterns = parseEslintIgnoreContents(raw);\n\n return { path: candidate, patterns };\n}\n\nfunction mergeIgnorePatterns (plan: V2Plan, extra: readonly string[]): void {\n extra.forEach(pattern => {\n if (!plan.config.ignores.some(existing => existing.value === pattern)) {\n plan.config.ignores.push({ value: pattern });\n }\n });\n}\n\nfunction safeUnlink (filePath: string, clack: ClackLike, label: string): void {\n try {\n unlinkSync(filePath);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n if (clack.note) {\n clack.note(`Could not delete ${label} at ${filePath}: ${reason}`, 'Warning');\n }\n }\n}\n\ninterface DepChangeSummary {\n removed: string[];\n install: InstallList;\n packageJsonPath: string | null;\n}\n\nfunction describeDepChanges (depChanges: DepChangeSummary | null): string | null {\n if (!depChanges || !depChanges.packageJsonPath) {\n return null;\n }\n\n const lines: string[] = ['The following dependency changes will be applied to package.json:'];\n\n if (depChanges.removed.length > 0) {\n lines.push(`- Remove (${depChanges.removed.length}): ${depChanges.removed.join(', ')}`);\n } else {\n lines.push('- Remove (0): (none)');\n }\n\n lines.push(`- Install (${depChanges.install.specs.length}): ${depChanges.install.specs.join(', ')}`);\n\n return lines.join('\\n');\n}\n\n// Entered from a failing lint run rather than from a deliberate `migrate` invocation, so the very\n// first thing the consumer sees has to be an explicit yes/no before anything is inspected further.\nasync function confirmGuidedStart (clack: ClackLike, sourcePath: string): Promise<boolean> {\n const result = await clack.confirm({\n message: `${basename(sourcePath)} still uses the v3 single-file layout. Migrate it now?`,\n initialValue: true,\n });\n\n return !clack.isCancel(result) && result === true;\n}\n\nfunction noteConfigRename (clack: ClackLike, sourcePath: string, writePath: string): void {\n if (!clack.note || basename(sourcePath) === basename(writePath)) {\n return;\n }\n\n clack.note(\n `${basename(sourcePath)} -> ${basename(writePath)}\\n\\n`\n + 'ESLint loads a JavaScript config through Node, so importing the TypeScript lint module'\n + ' from one needs unflagged type stripping (Node >= 22.18) and fails on Node 20. A'\n + ' TypeScript config goes through jiti and loads on every supported version.',\n 'Renaming the flat config'\n );\n}\n\nasync function confirmWrite (\n clack: ClackLike,\n writePath: string,\n initial = true\n): Promise<boolean> {\n const message = `Write migrated config to ${writePath}?`;\n const result = await clack.confirm({ message, initialValue: initial });\n\n return !clack.isCancel(result) && result === true;\n}\n\nasync function confirmInstall (\n clack: ClackLike,\n depSummary: DepChangeSummary,\n initial = true\n): Promise<boolean> {\n const description = describeDepChanges(depSummary);\n const head = description ?? '';\n const message = head\n ? `${head}\\nInstall dependencies now?`\n : 'Install dependencies now?';\n const result = await clack.confirm({ message, initialValue: initial });\n\n return !clack.isCancel(result) && result === true;\n}\n\nexport interface NextStepsRenderInput {\n manager: PackageManager;\n removed: readonly string[];\n installSpecs: readonly string[];\n}\n\nexport function renderNextStepsMessage (input: NextStepsRenderInput): string | null {\n const hasRemove = input.removed.length > 0;\n const hasInstall = input.installSpecs.length > 0;\n\n if (!hasRemove && !hasInstall) {\n return null;\n }\n\n const blocks: string[] = ['Skipped dependency installation. Run these to apply manually:'];\n\n if (hasRemove) {\n blocks.push(formatNextStepsRemoveCommand(input.manager, input.removed));\n }\n\n if (hasInstall) {\n blocks.push(formatNextStepsAddCommand(input.manager, input.installSpecs));\n }\n\n return blocks.join('\\n\\n');\n}\n\nfunction emitInstallNextSteps (\n clack: ClackLike,\n depSummary: DepChangeSummary,\n cwd: string\n): void {\n if (!clack.note) {\n return;\n }\n\n const message = renderNextStepsMessage({\n manager: detectPackageManager(cwd),\n removed: depSummary.removed,\n installSpecs: depSummary.install.specs,\n });\n\n if (message === null) {\n return;\n }\n\n clack.note(message, 'Next steps');\n}\n\nfunction emitSummary (clack: ClackLike, model: PreparedSource, format: SourceFormat): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n model.kind === 'plan' ? summary(model.plan, format) : rehouseSummary(model.rehoused),\n 'Migration summary'\n );\n\n const warnings = warningsOf(model);\n\n if (warnings.length > 0) {\n clack.note(formatWarnings(warnings), 'Warnings');\n }\n}\n\ninterface WriteOutcome {\n deletedSourceCandidates: string[];\n}\n\nfunction writeAndAnnounce (\n clack: ClackLike,\n targetPath: string,\n writePath: string,\n rendered: string,\n format: SourceFormat\n): WriteOutcome {\n const result = format === 'eslintrc'\n ? writeMigrationLegacy(targetPath, writePath, rendered)\n : writeMigration(targetPath, rendered);\n\n clack.outro(`Wrote ${result.writtenPaths.join(', ')}`);\n\n return { deletedSourceCandidates: result.deletedSourceCandidates };\n}\n\n// Every flat config in the directory other than the migration source is about to be overwritten or\n// deleted. Renaming a `.js` config to `.ts` made this set bigger than \"the write path already\n// exists\", so it is computed from the layout rather than from the write path alone.\nfunction supersededFlatConfigs (sourcePath: string, writePath: string): string[] {\n const directory = dirname(writePath);\n const { replacedEslintConfigs } = resolveLintLayout(directory);\n const candidates = [\n ...replacedEslintConfigs.map(filename => join(directory, filename)),\n writePath,\n ];\n\n return [...new Set(candidates.filter(path => path !== sourcePath && existsSync(path)))];\n}\n\nasync function confirmOverwriteExistingOutput (\n clack: ClackLike,\n superseded: readonly string[],\n sourcePath: string,\n initial = false\n): Promise<boolean> {\n const names = superseded.map(path => basename(path));\n const subject = names.length === 1\n ? `An \\`${names[0]}\\` already exists`\n : `\\`${names.join('`, `')}\\` already exist`;\n const message = `${subject}. Overwrite + delete \\`${basename(sourcePath)}\\`?`;\n const result = await clack.confirm({ message, initialValue: initial });\n\n return !clack.isCancel(result) && result === true;\n}\n\ninterface ResolvedSource {\n targetPath: string;\n source: string;\n format: SourceFormat;\n}\n\ntype ResolveSourceResult = | { ok: true; resolved: ResolvedSource }\n | { ok: false; exitCode: number };\n\nfunction resolveSource (input: RunMigrateInput, clack: ClackLike): ResolveSourceResult {\n const targetPath = resolveTargetPath(input);\n\n if (!targetPath) {\n clack.cancel('No eslint.config.{mjs,js,cjs,ts,mts,cts} or .eslintrc.* found.');\n\n return { ok: false, exitCode: 1 };\n }\n\n const source = readFileSync(targetPath, 'utf8');\n const format = detectFormat(targetPath, source);\n\n if (format === 'eslintrc-unsupported') {\n const message = `Legacy ${basename(targetPath)} migration not supported in this release; `\n + 'convert manually first.';\n\n clack.cancel(message);\n\n return { ok: false, exitCode: 1 };\n }\n\n return { ok: true, resolved: { targetPath, source, format } };\n}\n\ninterface MigrationPreparation {\n model: PreparedSource;\n rendered: string;\n writePath: string;\n eslintIgnore: EslintIgnoreLookup | null;\n}\n\ntype PrepareResult = | { ok: false; reason: string | null }\n | { ok: true; prepared: MigrationPreparation };\n\nfunction renderModel (model: PreparedSource, eslintIgnore: EslintIgnoreLookup | null): string {\n if (model.kind === 'rehouse') {\n return model.rehoused.lintModule;\n }\n\n if (eslintIgnore && eslintIgnore.patterns.length > 0) {\n mergeIgnorePatterns(model.plan, eslintIgnore.patterns);\n }\n\n return renderV2(model.plan);\n}\n\nfunction prepareMigration (resolved: ResolvedSource, input: RunMigrateInput): PrepareResult {\n const outcome = sourceModelFrom(resolved);\n\n if (!outcome.ok) {\n return outcome;\n }\n\n const writePath = targetWritePath(input.cwd, resolved.targetPath);\n const eslintIgnore = findEslintIgnore(resolved.targetPath);\n\n return {\n ok: true,\n prepared: {\n model: outcome.model,\n rendered: renderModel(outcome.model, eslintIgnore),\n writePath,\n eslintIgnore,\n },\n };\n}\n\nasync function runConfirmations (\n clack: ClackLike,\n input: RunMigrateInput,\n targetPath: string,\n writePath: string,\n previous?: MigrateSessionAnswers\n): Promise<boolean> {\n const superseded = supersededFlatConfigs(targetPath, writePath);\n\n if (superseded.length > 0) {\n const overwrite = await confirmOverwriteExistingOutput(\n clack,\n superseded,\n targetPath,\n previous?.overwriteExisting ?? false\n );\n\n if (!overwrite) {\n clack.outro('Aborted: existing output kept.');\n\n return false;\n }\n }\n\n if (!input.yes) {\n const proceed = await confirmWrite(clack, writePath, previous?.proceed ?? true);\n\n if (!proceed) {\n clack.outro('Aborted: original config kept.');\n\n return false;\n }\n }\n\n return true;\n}\n\nfunction consumerPackageJsonPath (writePath: string): string {\n return join(dirname(writePath), 'package.json');\n}\n\nfunction tryReadConsumerManifest (path: string): PackageManifestLike | null {\n try {\n const raw = readFileSync(path, 'utf8');\n\n return JSON.parse(raw) as PackageManifestLike;\n } catch {\n return null;\n }\n}\n\nfunction computeDepSummary (\n model: PreparedSource,\n writePath: string,\n overrides: MigrateOverrides | undefined\n): DepChangeSummary | null {\n const pkgPath = consumerPackageJsonPath(writePath);\n const manifest = tryReadConsumerManifest(pkgPath);\n\n if (!manifest) {\n return { removed: [], install: { specs: [], fallbacks: [] }, packageJsonPath: null };\n }\n\n const pruneOutcome = pruneEslintDependencies(manifest);\n const readManifest = overrides?.readEslintConfigManifest ?? readOwnEslintConfigManifest;\n const ownManifest = readManifest();\n const install = buildInstallList(scopesOf(model), ownManifest);\n\n return { removed: pruneOutcome.removed, install, packageJsonPath: pkgPath };\n}\n\nfunction persistPrunedManifest (depSummary: DepChangeSummary): void {\n if (!depSummary.packageJsonPath) {\n return;\n }\n\n pruneConsumerPackageJson(dirname(depSummary.packageJsonPath));\n}\n\nfunction noteFallbacks (clack: ClackLike, depSummary: DepChangeSummary): void {\n if (depSummary.install.fallbacks.length === 0 || !clack.note) {\n return;\n }\n\n const list = depSummary.install.fallbacks.join(', ');\n\n clack.note(`Falling back to @latest for: ${list}`, 'Warning');\n}\n\nfunction resolveInstallCwd (depSummary: DepChangeSummary, input: RunMigrateInput): string {\n if (depSummary.packageJsonPath) {\n return dirname(depSummary.packageJsonPath);\n }\n\n return input.cwd;\n}\n\nasync function runInstaller (\n clack: ClackLike,\n depSummary: DepChangeSummary,\n input: RunMigrateInput\n): Promise<InstallOutcome> {\n return installWithRetry({\n deps: depSummary.install.specs,\n cwd: resolveInstallCwd(depSummary, input),\n autoConfirm: Boolean(input.yes),\n clack,\n fsOps: input.overrides?.wipeFs,\n installer: input.overrides?.installer,\n });\n}\n\nasync function applyDepChanges (\n clack: ClackLike,\n depSummary: DepChangeSummary,\n input: RunMigrateInput\n): Promise<boolean> {\n if (!depSummary.packageJsonPath) {\n if (clack.note) {\n clack.note('No package.json found alongside the migrated config — skipping dependency updates.', 'Notice');\n }\n\n return true;\n }\n\n persistPrunedManifest(depSummary);\n\n if (input.noInstall) {\n emitInstallNextSteps(clack, depSummary, input.cwd);\n\n return true;\n }\n\n if (!input.yes) {\n const proceed = await confirmInstall(clack, depSummary);\n\n if (!proceed) {\n emitInstallNextSteps(clack, depSummary, input.cwd);\n\n return true;\n }\n }\n\n noteFallbacks(clack, depSummary);\n\n const outcome = await runInstaller(clack, depSummary, input);\n\n if (!outcome.installed) {\n emitInstallNextSteps(clack, depSummary, input.cwd);\n\n return false;\n }\n\n return true;\n}\n\nfunction performWriteAndCleanup (\n clack: ClackLike,\n resolved: ResolvedSource,\n prepared: MigrationPreparation\n): void {\n const outcome = writeAndAnnounce(\n clack,\n resolved.targetPath,\n prepared.writePath,\n prepared.rendered,\n resolved.format\n );\n\n if (prepared.eslintIgnore && prepared.model.kind === 'plan') {\n safeUnlink(prepared.eslintIgnore.path, clack, '.eslintignore');\n }\n\n outcome.deletedSourceCandidates.forEach(path => {\n safeUnlink(path, clack, 'superseded config');\n });\n}\n\nfunction noteLintScriptOutcome (clack: ClackLike, result: LintScriptResult): void {\n if (!clack.note) {\n return;\n }\n\n if (result.unresolved) {\n clack.note(\n `Left \\`${result.unresolved.script}\\` untouched — it runs neither eslint nor oxlint:\\n\\n`\n + ` ${result.unresolved.previous}\\n\\n`\n + `Add \\`${OXLINT_LINT_SCRIPT}\\` yourself, next to whatever invokes ESLint.`,\n 'package.json script not changed'\n );\n\n return;\n }\n\n if (result.alreadyRunsOxlint.length > 0 && result.changes.length === 0) {\n clack.note(\n `\\`${result.alreadyRunsOxlint.join('`, `')}\\` already run oxlint — left alone.`,\n 'package.json scripts unchanged'\n );\n\n return;\n }\n\n if (result.skipped.length > 0) {\n clack.note(\n `${formatSkippedLintScripts(result.skipped)}\\n\\n`\n + 'oxlint was added to one entry point only, so it does not run twice over the same tree.',\n 'package.json scripts left alone'\n );\n }\n\n if (result.changes.length === 0) {\n return;\n }\n\n clack.note(\n `${formatLintScriptChanges(result.changes)}\\n\\n`\n + 'oxlint was prepended, never substituted, so every command that was there still runs.',\n 'Updated package.json scripts'\n );\n}\n\nfunction applyLintScript (clack: ClackLike, directory: string): void {\n const manifestPath = join(directory, 'package.json');\n\n if (!existsSync(manifestPath)) {\n return;\n }\n\n const result = setLintScript(readFileSync(manifestPath, 'utf8'));\n\n if (result.changed) {\n writeFileSync(manifestPath, result.manifest, 'utf8');\n }\n\n noteLintScriptOutcome(clack, result);\n}\n\n// Suppressed rules keep their `eslint-disable` comments working under oxlint, but ESLint now reads\n// them as unused directives. Re-pointing the moved rules onto `oxlint-disable` is what clears the\n// warning without dropping a suppression. It is also by far the largest diff a migration produces,\n// so the file count is shown and confirmed before anything is written.\nfunction noteUntouchedDirectiveFiles (clack: ClackLike, skipped: readonly string[]): void {\n if (skipped.length === 0 || !clack.note) {\n return;\n }\n\n clack.note(formatUntouchedDirectiveFiles(skipped), `${skipped.length} file(s) left untouched`);\n}\n\nasync function rewriteDirectivesWithNote (\n clack: ClackLike,\n directory: string,\n autoConfirm: boolean\n): Promise<void> {\n const { candidates, skipped } = previewDisableDirectives(directory);\n\n noteUntouchedDirectiveFiles(clack, skipped);\n\n if (candidates.length === 0) {\n return;\n }\n\n const count = candidates.length;\n\n if (clack.note) {\n clack.note(\n `${count} file(s) carry an \\`eslint-disable\\` naming a rule oxlint now owns. Left as they are,`\n + ' ESLint reports each one as an unused directive.\\n\\nThis is a separate, source-wide diff —'\n + ' review it on its own commit.',\n 'Disable directives'\n );\n }\n\n if (!autoConfirm) {\n const proceed = await clack.confirm({\n message: `Re-point \\`eslint-disable\\` onto \\`oxlint-disable\\` in ${count} file(s) now?`,\n initialValue: true,\n });\n\n if (clack.isCancel(proceed) || proceed !== true) {\n if (clack.note) {\n clack.note(\n 'Skipped. Re-run `npx @useinsider/eslint-config migrate` to apply it later.',\n 'Disable directives not rewritten'\n );\n }\n\n return;\n }\n }\n\n const { rewritten, skipped: unwritten } = rewriteDisableDirectives(directory, candidates);\n\n if (clack.note) {\n clack.note(`Re-pointed directives in ${rewritten.length} file(s).`, 'Disable directives');\n }\n\n noteUntouchedDirectiveFiles(clack, unwritten);\n}\n\nfunction loadPreviousMigrate (clack: ClackLike, cwd: string): MigrateSessionAnswers | undefined {\n const restored = loadSession({ cwd });\n const previousMigrate = restored?.command === 'migrate' ? restored.migrate : undefined;\n\n if (previousMigrate && clack.note) {\n clack.note(\n 'Restored your previous choices. Press Enter on each prompt to confirm, or arrow keys to change.',\n 'Resuming previous session'\n );\n }\n\n return previousMigrate;\n}\n\nfunction emitNothingToMigrate (clack: ClackLike, format: SourceFormat): void {\n clack.outro(format === 'eslintrc'\n ? 'No legacy `.eslintrc` shape found — nothing to migrate.'\n : 'No v1 or v3 useInsider patterns found — nothing to migrate.');\n}\n\n// A re-housed v3 config is copied verbatim, so an `.eslintignore` beside it cannot be folded into\n// `ignores` the way the re-rendering paths do. Flat config never read that file, so nothing changes\n// by leaving it — but saying so beats letting the consumer assume it was handled.\nfunction noteUnfoldedEslintIgnore (clack: ClackLike, prepared: MigrationPreparation): void {\n const patterns = prepared.eslintIgnore?.patterns ?? [];\n\n if (!clack.note || prepared.model.kind !== 'rehouse' || patterns.length === 0) {\n return;\n }\n\n clack.note(\n `${prepared.eslintIgnore?.path} still holds ${patterns.length} pattern(s). Flat config does not read it,`\n + ' and the v3 config was carried over verbatim, so they were not folded into `ignores`. Move the ones'\n + ' you still need into the `ignores` array and delete the file.',\n '.eslintignore left alone'\n );\n}\n\nfunction persistMigrateSession (\n input: RunMigrateInput,\n prepared: MigrationPreparation,\n resolved: ResolvedSource\n): void {\n const overwriteExisting = supersededFlatConfigs(resolved.targetPath, prepared.writePath).length > 0;\n\n saveSession({\n command: 'migrate',\n migrate: {\n target: input.target,\n yes: input.yes,\n noInstall: input.noInstall,\n overwriteExisting,\n proceed: true,\n },\n }, { cwd: input.cwd });\n}\n\n// The config was rewritten before the install, so a failed install cannot be undone here — but the\n// consumer cannot lint until the dependencies land, so the run must not report success. The session\n// is kept so a re-run picks the same answers back up.\nasync function finishMigrate (\n clack: ClackLike,\n depSummary: DepChangeSummary | null,\n input: RunMigrateInput\n): Promise<number> {\n if (depSummary && !await applyDepChanges(clack, depSummary, input)) {\n clack.cancel('Config migrated, but the dependencies did not install. Install them and re-run lint.');\n\n return 1;\n }\n\n clearSession({ cwd: input.cwd });\n\n return 0;\n}\n\nexport async function runMigrate (input: RunMigrateInput, clackOverride?: ClackLike): Promise<number> {\n const clack = clackOverride ?? await loadClack();\n const sourceResult = resolveSource(input, clack);\n\n if (!sourceResult.ok) {\n return sourceResult.exitCode;\n }\n\n const { resolved } = sourceResult;\n\n clack.intro(`Migrating ${resolved.targetPath}`);\n\n const declinedExitCode = input.fromLint ? 1 : 0;\n\n if (input.fromLint && !input.yes && !await confirmGuidedStart(clack, resolved.targetPath)) {\n clack.outro('Left the config as it is — nothing was written.');\n\n return declinedExitCode;\n }\n\n const previousMigrate = loadPreviousMigrate(clack, input.cwd);\n const outcome = prepareMigration(resolved, input);\n\n if (!outcome.ok) {\n if (outcome.reason === null) {\n emitNothingToMigrate(clack, resolved.format);\n\n return declinedExitCode;\n }\n\n clack.cancel(outcome.reason);\n\n return 1;\n }\n\n const { prepared } = outcome;\n\n emitSummary(clack, prepared.model, resolved.format);\n noteUnfoldedEslintIgnore(clack, prepared);\n noteConfigRename(clack, resolved.targetPath, prepared.writePath);\n\n const depSummary = computeDepSummary(prepared.model, prepared.writePath, input.overrides);\n const proceed = await runConfirmations(\n clack,\n input,\n resolved.targetPath,\n prepared.writePath,\n previousMigrate\n );\n\n if (!proceed) {\n return declinedExitCode;\n }\n\n persistMigrateSession(input, prepared, resolved);\n performWriteAndCleanup(clack, resolved, prepared);\n applyLintScript(clack, dirname(prepared.writePath));\n await rewriteDirectivesWithNote(clack, dirname(prepared.writePath), Boolean(input.yes));\n\n const consumerDir = dirname(prepared.writePath);\n const consumerLayout = resolveLintLayout(consumerDir);\n\n await applyTsExtensionsFlag(clack, {\n cwd: consumerDir,\n lintModule: consumerLayout.lintModule,\n eslintConfig: consumerLayout.eslintConfig,\n autoConfirm: input.yes,\n });\n\n return finishMigrate(clack, depSummary, input);\n}\n","import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n detectExistingEslintConfig,\n type ExistingConfigDetection,\n resolveTsconfigReferences,\n} from './detect';\nimport {\n detectVueApiPattern,\n type VueHybridPatternDetection,\n} from './detectVueApiPattern';\nimport { dispatch, type MigrateInput, type ScaffoldInput } from './dispatch';\nimport { buildDependencyList, installDependencies } from './install';\nimport { installWithRetry } from './installWithRetry';\nimport {\n formatLintScriptChanges,\n formatSkippedLintScripts,\n type LintScriptResult,\n OXLINT_LINT_SCRIPT,\n renderLintLayoutFiles,\n resolveLintLayout,\n setLintScript,\n} from './lintLayout';\nimport { runMigrate } from './migrate';\nimport { pruneConsumerPackageJson } from './prunePackageJson';\nimport {\n askExistingConfigDecision,\n askHybridProceedWithSuffix,\n askHybridSuffix,\n askVueHybridDefaultApi,\n type ClackLike,\n CliCancelledError,\n type ExistingConfigDecision,\n loadClack,\n runQuestions,\n type RunQuestionsContext,\n type TsconfigPromptInput,\n} from './questions';\nimport {\n clearSession,\n loadSession,\n saveSession,\n type ScaffoldExistingConfigChoice,\n} from './sessionStore';\nimport {\n type CliAnswers,\n renderLintModuleFile,\n type VueHybridDefaultApi,\n} from './template';\nimport { applyTsExtensionsFlag } from './tsconfigFlag';\n\nfunction resolveTsconfigInput (cwd: string): { input: TsconfigPromptInput | null; missing: boolean } {\n const referencesResult = resolveTsconfigReferences(cwd);\n\n if (referencesResult) {\n return {\n input: { referencesOnly: true, rootPath: referencesResult.rootPath, refs: referencesResult.refs },\n missing: false,\n };\n }\n\n const rootPath = join(cwd, 'tsconfig.json');\n\n if (existsSync(rootPath)) {\n return {\n input: { referencesOnly: false, rootPath, refs: [] },\n missing: false,\n };\n }\n\n return { input: null, missing: true };\n}\n\nexport interface RunScaffoldOverrides {\n installer?: (deps: readonly string[]) => Promise<void>;\n wipeFs?: Parameters<typeof installWithRetry>[0]['fsOps'];\n}\n\nexport interface RunScaffoldInput {\n cwd: string;\n yes?: boolean;\n overrides?: RunScaffoldOverrides;\n}\n\nfunction decisionToChoice (decision: ExistingConfigDecision): ScaffoldExistingConfigChoice {\n return decision;\n}\n\nfunction isPackageJsonSource (existing: ExistingConfigDetection): boolean {\n return existing.path.endsWith('package.json');\n}\n\ntype HandleExistingConfigOutcome = | { continueScaffold: true; viaOverride: boolean }\n | { continueScaffold: false; exitCode: number };\n\nasync function handleExistingConfig (\n clack: ClackLike,\n input: RunScaffoldInput,\n existing: ExistingConfigDetection,\n initial: ExistingConfigDecision\n): Promise<HandleExistingConfigOutcome> {\n const decision = await askExistingConfigDecision(clack, existing.path, initial);\n\n saveSession(\n { command: 'scaffold', scaffold: { existingConfigChoice: decisionToChoice(decision) } },\n { cwd: input.cwd }\n );\n\n if (decision === 'exit') {\n clearSession({ cwd: input.cwd });\n clack.outro('Exited: existing config kept.');\n\n return { continueScaffold: false, exitCode: 0 };\n }\n\n if (decision === 'migrate') {\n clearSession({ cwd: input.cwd });\n\n if (isPackageJsonSource(existing)) {\n clack.cancel('Migration from package.json `eslintConfig` is not supported; extract it to '\n + '.eslintrc.cjs first, or pick Override.');\n\n return { continueScaffold: false, exitCode: 1 };\n }\n\n const exitCode = await runMigrate({\n cwd: input.cwd,\n target: existing.path,\n yes: input.yes,\n }, clack);\n\n return { continueScaffold: false, exitCode };\n }\n\n return { continueScaffold: true, viaOverride: true };\n}\n\nfunction isScaffoldChoice (value: unknown): value is ScaffoldExistingConfigChoice {\n return value === 'override' || value === 'migrate' || value === 'exit';\n}\n\nfunction decisionInitial (\n persistedChoice: ScaffoldExistingConfigChoice | undefined\n): ExistingConfigDecision {\n if (persistedChoice && isScaffoldChoice(persistedChoice)) {\n return persistedChoice;\n }\n\n return 'migrate';\n}\n\nfunction buildQuestionsContext (\n input: RunScaffoldInput,\n restoredAnswers: CliAnswers | undefined\n): RunQuestionsContext {\n const { input: tsconfigInput, missing } = resolveTsconfigInput(input.cwd);\n\n return {\n tsconfigInput,\n tsconfigMissing: missing,\n previousAnswers: restoredAnswers,\n };\n}\n\nfunction noteOverridePrune (clack: ClackLike, removed: string[]): void {\n if (removed.length === 0 || !clack.note) {\n return;\n }\n\n const list = removed.join(', ');\n\n clack.note(\n `Removed stale ESLint-related entries from package.json: ${list}`,\n 'Override cleanup'\n );\n}\n\nfunction describeHybridPattern (detection: VueHybridPatternDetection): string {\n if (detection.kind === 'suffix') {\n return `Detected suffix convention: Options API files match \\`${detection.optionsPattern}\\`.`;\n }\n\n if (detection.kind === 'directory') {\n return `Detected directory convention: \\`${detection.optionsDir}/\\` vs \\`${detection.compositionDir}/\\`.`;\n }\n\n return '';\n}\n\nfunction noteHybridFound (clack: ClackLike, detection: VueHybridPatternDetection): void {\n if (!clack.note) {\n return;\n }\n\n if (detection.kind !== 'suffix' && detection.kind !== 'directory') {\n return;\n }\n\n clack.note(describeHybridPattern(detection), 'Hybrid Vue pattern detected');\n}\n\nfunction noteHybridMissing (clack: ClackLike): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n 'Hybrid Vue selected, but your `.vue` files do not follow a distinguishing naming pattern '\n + '(e.g. `*.options.vue` vs `*.vue`). The generated config will treat every `.vue` file '\n + 'with one preset (composition by default). To get proper per-file linting, rename your '\n + 'Options-API components to `*.options.vue` (or similar) and re-run this CLI.',\n 'No hybrid pattern detected'\n );\n}\n\nfunction noteHybridSuffixScaffold (clack: ClackLike, suffix: string): void {\n if (!clack.note) {\n return;\n }\n\n clack.note(\n `Rename your Options-API files to end with \\`${suffix}\\` and they will be picked up by the `\n + 'Options preset automatically. Composition components keep the plain `.vue` extension.',\n 'Suffix convention scaffolded'\n );\n}\n\ninterface HybridPlanResult {\n suffix: string | undefined;\n defaultApi: VueHybridDefaultApi | undefined;\n fallbackToComposition: boolean;\n}\n\nasync function resolveVueHybridPlan (\n clack: ClackLike,\n cwd: string,\n yes: boolean,\n previous: CliAnswers['vueHybridSuffix']\n): Promise<HybridPlanResult> {\n const detection = detectVueApiPattern({ cwd });\n\n if (detection.kind === 'suffix') {\n noteHybridFound(clack, detection);\n\n const detectedDefault: VueHybridDefaultApi = detection.targetApi === 'options' ? 'composition' : 'options';\n\n return { suffix: detection.suffix, defaultApi: detectedDefault, fallbackToComposition: false };\n }\n\n if (detection.kind === 'directory') {\n noteHybridFound(clack, detection);\n\n return { suffix: undefined, defaultApi: undefined, fallbackToComposition: false };\n }\n\n noteHybridMissing(clack);\n\n if (yes) {\n return { suffix: undefined, defaultApi: undefined, fallbackToComposition: true };\n }\n\n const wantsSuffix = await askHybridProceedWithSuffix(clack);\n\n if (!wantsSuffix) {\n return { suffix: undefined, defaultApi: undefined, fallbackToComposition: true };\n }\n\n const defaultApi = await askVueHybridDefaultApi(clack, previous?.defaultApi);\n const suffix = await askHybridSuffix(clack, defaultApi, previous?.suffix);\n\n noteHybridSuffixScaffold(clack, suffix);\n\n return { suffix, defaultApi, fallbackToComposition: false };\n}\n\nasync function resolveHybridAnswers (\n clack: ClackLike,\n input: RunScaffoldInput,\n answers: CliAnswers\n): Promise<CliAnswers> {\n if (answers.framework !== 'vue' || answers.vueApiStyle !== 'hybrid') {\n return answers;\n }\n\n const plan = await resolveVueHybridPlan(\n clack,\n input.cwd,\n Boolean(input.yes),\n answers.vueHybridSuffix\n );\n\n if (plan.fallbackToComposition) {\n return { ...answers, vueApiStyle: 'composition', vueHybridSuffix: undefined };\n }\n\n if (plan.suffix && plan.defaultApi) {\n return {\n ...answers,\n vueHybridSuffix: { defaultApi: plan.defaultApi, suffix: plan.suffix },\n };\n }\n\n return answers;\n}\n\nfunction applyLintScript (cwd: string): LintScriptResult | null {\n const manifestPath = join(cwd, 'package.json');\n\n if (!existsSync(manifestPath)) {\n return null;\n }\n\n const result = setLintScript(readFileSync(manifestPath, 'utf8'));\n\n if (result.changed) {\n writeFileSync(manifestPath, result.manifest, 'utf8');\n }\n\n return result;\n}\n\nfunction noteLintScriptOutcome (clack: ClackLike, result: LintScriptResult | null): void {\n if (!clack.note || !result) {\n return;\n }\n\n if (result.unresolved) {\n clack.note(\n `Left \\`${result.unresolved.script}\\` untouched — it runs neither eslint nor oxlint:\\n\\n`\n + ` ${result.unresolved.previous}\\n\\n`\n + `Add \\`${OXLINT_LINT_SCRIPT}\\` yourself, next to whatever invokes ESLint.`,\n 'package.json script not changed'\n );\n\n return;\n }\n\n if (result.skipped.length > 0) {\n clack.note(\n `${formatSkippedLintScripts(result.skipped)}\\n\\n`\n + 'oxlint was added to one entry point only, so it does not run twice over the same tree.',\n 'package.json scripts left alone'\n );\n }\n\n if (result.changes.length > 0) {\n clack.note(formatLintScriptChanges(result.changes), 'Updated package.json scripts');\n }\n}\n\nexport interface LintLayoutWriteResult {\n lintModulePath: string;\n lintScript: LintScriptResult | null;\n}\n\nexport function writeLintLayout (cwd: string, lintModuleSource: string): LintLayoutWriteResult {\n const layout = resolveLintLayout(cwd);\n const lintModulePath = join(cwd, layout.lintModule);\n\n writeFileSync(lintModulePath, lintModuleSource, 'utf8');\n\n renderLintLayoutFiles(layout).forEach(file => {\n writeFileSync(join(cwd, file.filename), file.source, 'utf8');\n });\n\n // Two flat configs in one directory is not a warning: ESLint prefers the JavaScript one, so\n // leaving it behind would hand the consumer the config the scaffold just superseded.\n layout.replacedEslintConfigs.forEach(filename => {\n rmSync(join(cwd, filename), { force: true });\n });\n\n return { lintModulePath, lintScript: applyLintScript(cwd) };\n}\n\nasync function installAndWrite (\n clack: ClackLike,\n input: RunScaffoldInput,\n answers: CliAnswers,\n options: { pruneBeforeInstall: boolean }\n): Promise<LintLayoutWriteResult | null> {\n if (options.pruneBeforeInstall) {\n const pruneResult = pruneConsumerPackageJson(input.cwd);\n\n noteOverridePrune(clack, pruneResult.removed);\n }\n\n const deps = buildDependencyList(answers);\n\n if (clack.note) {\n clack.note(deps.map(dep => ` - ${dep}`).join('\\n'), 'Installing dev dependencies');\n }\n\n const outcome = await installWithRetry({\n deps,\n cwd: input.cwd,\n autoConfirm: Boolean(input.yes),\n clack,\n installer: input.overrides?.installer ?? installDependencies,\n fsOps: input.overrides?.wipeFs,\n });\n\n if (!outcome.installed) {\n return null;\n }\n\n return writeLintLayout(input.cwd, renderLintModuleFile(answers));\n}\n\nexport async function runScaffold (\n input: RunScaffoldInput,\n clackOverride?: ClackLike\n): Promise<number> {\n const clack = clackOverride ?? await loadClack();\n const existing = detectExistingEslintConfig(input.cwd);\n const restored = loadSession({ cwd: input.cwd });\n const restoredScaffold = restored?.command === 'scaffold' ? restored.scaffold : undefined;\n let viaOverride = false;\n\n if (existing) {\n const outcome = await handleExistingConfig(\n clack,\n input,\n existing,\n decisionInitial(restoredScaffold?.existingConfigChoice)\n );\n\n if (!outcome.continueScaffold) {\n return outcome.exitCode;\n }\n\n ({ viaOverride } = outcome);\n }\n\n const context = buildQuestionsContext(input, restoredScaffold?.answers);\n const answers = await runQuestions(context, clack);\n const resolvedAnswers = await resolveHybridAnswers(clack, input, answers);\n\n saveSession(\n { command: 'scaffold', scaffold: { answers: resolvedAnswers, existingConfigChoice: 'override' } },\n { cwd: input.cwd }\n );\n\n const written = await installAndWrite(\n clack,\n input,\n resolvedAnswers,\n { pruneBeforeInstall: viaOverride }\n );\n\n // The layout is deliberately not written over a failed install: the generated config imports\n // `@useinsider/eslint-config`, so writing it would leave a repo that cannot lint at all. The\n // session is kept so a re-run resumes from the answers already given.\n if (!written) {\n clack.cancel('Dependencies were not installed — nothing was written. Fix the install and re-run.');\n\n return 1;\n }\n\n noteLintScriptOutcome(clack, written.lintScript);\n\n const layout = resolveLintLayout(input.cwd);\n\n await applyTsExtensionsFlag(clack, {\n cwd: input.cwd,\n lintModule: layout.lintModule,\n eslintConfig: layout.eslintConfig,\n autoConfirm: input.yes,\n });\n\n clearSession({ cwd: input.cwd });\n clack.outro(`Wrote ${written.lintModulePath} and its sibling linter configs`);\n\n return 0;\n}\n\nasync function runScaffoldSubcommand (scaffoldInput: ScaffoldInput): Promise<number> {\n return runScaffold(scaffoldInput);\n}\n\nasync function runMigrateSubcommand (input: MigrateInput): Promise<number> {\n return runMigrate({\n cwd: input.cwd,\n target: input.target,\n yes: input.yes,\n noInstall: input.noInstall,\n fromLint: input.fromLint,\n });\n}\n\nfunction writeStderr (line: string): void {\n // oxlint-disable-next-line no-console -- CLI usage surface goes to stderr\n console.error(line);\n}\n\nasync function main (): Promise<number> {\n const argv = process.argv.slice(2);\n const cwd = process.cwd();\n\n return dispatch(argv, cwd, {\n scaffold: runScaffoldSubcommand,\n migrate: runMigrateSubcommand,\n stderr: writeStderr,\n });\n}\n\nfunction exitCleanly (code: number): void {\n // eslint-disable-next-line no-process-exit -- CLI entry point must propagate its exit code\n process.exit(code);\n}\n\nfunction isUnderTest (): boolean {\n return Boolean(process.env.VITEST) || process.env.NODE_ENV === 'test';\n}\n\nif (!isUnderTest()) {\n main()\n .then(exitCleanly)\n .catch((error: unknown) => {\n if (!(error instanceof CliCancelledError)) {\n const message = error instanceof Error ? error.message : String(error);\n\n // oxlint-disable-next-line no-console -- CLI error surface\n console.error(`[useinsider/eslint-config] ${message}`);\n }\n\n exitCleanly(1);\n });\n}\n\n/* v8 ignore start */\nif (import.meta.vitest) {\n const { afterEach, describe, expect, test, vi } = import.meta.vitest;\n const { mkdtempSync } = await import('node:fs');\n const { tmpdir } = await import('node:os');\n\n const MIGRATED_LINT_MODULE = 'import { useInsiderESLintFactory } from \\'@useinsider/eslint-config\\';\\n\\n'\n + 'export const { useInsiderESLint, useInsiderOXC } = useInsiderESLintFactory({});\\n';\n const MIGRATED_ESLINT_CONFIG = 'import { useInsiderESLint } from \\'./insider.lint.mts\\';\\n\\n'\n + 'export default useInsiderESLint();\\n';\n\n function makeMigratedDir (): string {\n const directory = mkdtempSync(join(tmpdir(), 'insider-cli-main-'));\n\n writeFileSync(join(directory, 'insider.lint.mts'), MIGRATED_LINT_MODULE, 'utf8');\n writeFileSync(join(directory, 'eslint.config.mts'), MIGRATED_ESLINT_CONFIG, 'utf8');\n writeFileSync(join(directory, 'package.json'), '{\\n \"name\": \"consumer\"\\n}\\n', 'utf8');\n\n return directory;\n }\n\n async function runMain (directory: string, argv: readonly string[]): Promise<number> {\n const originalArgv = process.argv;\n\n vi.spyOn(process, 'cwd').mockReturnValue(directory);\n vi.spyOn(process.stdout, 'write').mockReturnValue(true);\n process.argv = ['node', 'cli.cjs', ...argv];\n\n try {\n return await main();\n } finally {\n process.argv = originalArgv;\n }\n }\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe('main', () => {\n test.each([\n { argv: ['migrate', '--from-lint', '--yes', '--no-install'], code: 1 },\n { argv: ['migrate', '--yes', '--no-install'], code: 0 },\n ])('exits $code for $argv over an already-migrated directory', async ({ argv, code }) => {\n const directory = makeMigratedDir();\n\n try {\n expect(await runMain(directory, argv)).toBe(code);\n } finally {\n rmSync(directory, { recursive: true, force: true });\n }\n });\n });\n}\n"],"mappings":"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"}
|