@useinsider/eslint-config 3.0.2-beta.1 → 4.0.0-beta.1
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/README.md +285 -64
- package/dist/builders/configFiles.d.ts +13 -0
- package/dist/builders/oxlint.d.ts +51 -0
- package/dist/builders/oxlintOwnership.d.ts +43 -0
- package/dist/cli.cjs +584 -27
- package/dist/cli.cjs.map +1 -1
- package/dist/configs/dependencies.d.ts +3 -0
- package/dist/{javascript-VBXqjVi8.cjs → javascript-DH8-N38w.cjs} +5 -5
- package/dist/{javascript-VBXqjVi8.cjs.map → javascript-DH8-N38w.cjs.map} +1 -1
- package/dist/{javascript-dom-5jRL_yKP.cjs → javascript-dom-CvtQ6_9W.cjs} +4 -4
- package/dist/{javascript-dom-5jRL_yKP.cjs.map → javascript-dom-CvtQ6_9W.cjs.map} +1 -1
- package/dist/{javascript-node-C1AU_4X2.cjs → javascript-node-BNsy3loY.cjs} +4 -4
- package/dist/{javascript-node-C1AU_4X2.cjs.map → javascript-node-BNsy3loY.cjs.map} +1 -1
- package/dist/{jest-CHzjzBtf.cjs → jest-4Es9Ggaa.cjs} +3 -3
- package/dist/{jest-CHzjzBtf.cjs.map → jest-4Es9Ggaa.cjs.map} +1 -1
- package/dist/main.cjs +452 -73
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.ts +9 -2
- package/dist/main.js +435 -56
- package/dist/main.js.map +1 -1
- package/dist/oxlintOwnership-7hpdB3d1.cjs +199 -0
- package/dist/oxlintOwnership-7hpdB3d1.cjs.map +1 -0
- package/dist/oxlintOwnership-Cx0hgA_J.js +127 -0
- package/dist/oxlintOwnership-Cx0hgA_J.js.map +1 -0
- package/dist/removePluginsFromConfigs-D0oSUj2C.cjs.map +1 -1
- package/dist/removePluginsFromConfigs-DzqX2Ju2.js.map +1 -1
- package/dist/{stylistic-Dio0AM2E.cjs → stylistic-CoP3MT1Y.cjs} +4 -4
- package/dist/{stylistic-Dio0AM2E.cjs.map → stylistic-CoP3MT1Y.cjs.map} +1 -1
- package/dist/{typescript-C1icmOxY.cjs → typescript-D3VeLnpn.cjs} +7 -7
- package/dist/{typescript-C1icmOxY.cjs.map → typescript-D3VeLnpn.cjs.map} +1 -1
- package/dist/{typescript-dom-RUJn2WCZ.cjs → typescript-dom-iB_xBTAD.cjs} +4 -4
- package/dist/{typescript-dom-RUJn2WCZ.cjs.map → typescript-dom-iB_xBTAD.cjs.map} +1 -1
- package/dist/{typescript-node-CBEzcc56.cjs → typescript-node-Cq6qhj53.cjs} +4 -4
- package/dist/{typescript-node-CBEzcc56.cjs.map → typescript-node-Cq6qhj53.cjs.map} +1 -1
- package/dist/utils/ensureConfigStructure.d.ts +9 -4
- package/dist/utils/ensureOxlintConfig.d.ts +9 -0
- package/dist/utils/silenceRules.d.ts +9 -0
- package/dist/{vitest-BomI8gtu.cjs → vitest-BlGQswK2.cjs} +3 -3
- package/dist/{vitest-BomI8gtu.cjs.map → vitest-BlGQswK2.cjs.map} +1 -1
- package/dist/{vue2-azKwRgaJ.cjs → vue2-Da1i_oVn.cjs} +8 -8
- package/dist/{vue2-azKwRgaJ.cjs.map → vue2-Da1i_oVn.cjs.map} +1 -1
- package/dist/{vue2-options-api-ma3J-bvM.cjs → vue2-options-api-BSdrUm8H.cjs} +8 -8
- package/dist/{vue2-options-api-ma3J-bvM.cjs.map → vue2-options-api-BSdrUm8H.cjs.map} +1 -1
- package/dist/{vue2-typescript-CZSHzp7I.cjs → vue2-typescript-dXLRSGNP.cjs} +10 -10
- package/dist/{vue2-typescript-CZSHzp7I.cjs.map → vue2-typescript-dXLRSGNP.cjs.map} +1 -1
- package/dist/{vue2-typescript-options-api-B8OzZlje.cjs → vue2-typescript-options-api-LM7U5dWq.cjs} +10 -10
- package/dist/{vue2-typescript-options-api-B8OzZlje.cjs.map → vue2-typescript-options-api-LM7U5dWq.cjs.map} +1 -1
- package/dist/{vue3-Df5UQ1Ys.cjs → vue3-621EM2Ii.cjs} +8 -8
- package/dist/{vue3-Df5UQ1Ys.cjs.map → vue3-621EM2Ii.cjs.map} +1 -1
- package/dist/{vue3-options-api-Bx7yYHza.cjs → vue3-options-api-CC9_fAiq.cjs} +8 -8
- package/dist/{vue3-options-api-Bx7yYHza.cjs.map → vue3-options-api-CC9_fAiq.cjs.map} +1 -1
- package/dist/{vue3-typescript-C0O1JZlk.cjs → vue3-typescript-DONe-IKz.cjs} +10 -10
- package/dist/{vue3-typescript-C0O1JZlk.cjs.map → vue3-typescript-DONe-IKz.cjs.map} +1 -1
- package/dist/{vue3-typescript-options-api-cPal4O-K.cjs → vue3-typescript-options-api-D4pqpDFs.cjs} +10 -10
- package/dist/{vue3-typescript-options-api-cPal4O-K.cjs.map → vue3-typescript-options-api-D4pqpDFs.cjs.map} +1 -1
- package/package.json +8 -5
- package/dist/rolldown-runtime-VH7oDXx4.cjs +0 -28
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/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/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/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/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}\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']);\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\ninterface MigrateArgs {\n target: string | undefined;\n yes: boolean;\n noInstall: boolean;\n}\n\nfunction parseMigrateArgs (rest: readonly string[]): MigrateArgs {\n const yes = rest.some(isYesFlag);\n const noInstall = rest.some(isNoInstallFlag);\n const positional = rest.filter(arg => !isYesFlag(arg) && !isNoInstallFlag(arg));\n const target = positional.length > 0 ? positional[positional.length - 1] : undefined;\n\n return { target, yes, noInstall };\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] Scaffold a new eslint.config.mjs');\n stderr(' npx @useinsider/eslint-config migrate [path] [--yes|-y] [--no-install]');\n stderr(' Migrate an existing v1 useInsider() config to v2');\n}\n\nfunction isScaffoldArgv (argv: readonly string[]): boolean {\n return argv.length === 0 || 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 } = parseMigrateArgs(rest);\n\n return deps.migrate({ cwd, target, yes, noInstall });\n }\n\n printUsage(deps.stderr, subcommand);\n\n return 1;\n}\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 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 === '@useinsider/eslint-config' ? 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","import type { CliAnswers, VueMajor } from './template';\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 readOwnEslintConfigManifest,\n type PackageManifestLike,\n} from './resolveEslintConfigManifest';\n\ninterface RequiredManifest {\n version: string;\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 version: manifest.version ?? '0.0.0',\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(`@useinsider/eslint-config@${manifest.version}`);\n deps.add(pinned(manifest, 'eslint'));\n deps.add(pinned(manifest, 'globals'));\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\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<void> {\n try {\n await installer(deps);\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}\n\nasync function tryGenericRetryInstall (\n clack: ClackLike,\n installer: DependencyInstaller,\n deps: readonly string[],\n context: WipeContext\n): Promise<void> {\n try {\n await installer(deps);\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}\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<void> {\n const confirmed = await confirmPeerDepWipe(clack, autoConfirm);\n\n if (!confirmed) {\n noteError(clack, 'Install failed: ', reason, context, deps);\n\n return;\n }\n\n performFullWipe(clack, context);\n await 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<void> {\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;\n }\n\n performFullWipe(clack, context);\n await tryGenericRetryInstall(clack, installer, deps, context);\n}\n\nexport async function installWithRetry (opts: InstallWithRetryOptions): Promise<void> {\n const installer = opts.installer ?? defaultInstaller;\n const fs = opts.fsOps ?? defaultWipeFs();\n\n try {\n await installer(opts.deps);\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 await handlePeerDepFailure(opts.clack, opts.deps, opts.autoConfirm, installer, reason, context);\n\n return;\n }\n\n await handleGenericFailure(opts.clack, opts.deps, opts.autoConfirm, installer, reason, context);\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\nexport function renderConfigFile (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 default 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 // eslint-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 readOwnEslintConfigManifest as sharedReadOwnEslintConfigManifest,\n type OverridesRecord,\n type PackageManifestLike as SharedPackageManifestLike,\n} from '~/cli/resolveEslintConfigManifest';\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 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\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, '@useinsider/eslint-config@latest');\n appendSpec(specs, resolveSpec('eslint', manifest, fallbacks));\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 {\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 detectIndent (raw: string): string {\n const match = /\\n([ \\t]+)\"/u.exec(raw);\n\n if (!match) {\n return ' ';\n }\n\n return match[1];\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 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 findDefaultExportArray (sourceFile: ts.SourceFile): ts.ArrayLiteralExpression | null {\n const exportExpressions = sourceFile.statements\n .filter(ts.isExportAssignment)\n .map(statement => unwrapTypeCasts(statement.expression));\n const directArray = exportExpressions.find(ts.isArrayLiteralExpression);\n\n if (directArray) {\n return directArray;\n }\n\n const defineConfigCall = exportExpressions.find(isDefineConfigCall);\n\n if (!defineConfigCall) {\n return null;\n }\n\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\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 arrayLiteral = findDefaultExportArray(sourceFile);\n const arrayElements: V1ArrayElement[] = arrayLiteral\n ? arrayLiteral.elements\n .map(element => classifyArrayElement(element, sourceFile, warnings))\n .filter((entry): entry is V1ArrayElement => entry !== null)\n : [];\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 * 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 default useInsider({});');\n parts.push('');\n\n return pruneUnusedImports(parts.join('\\n'));\n }\n\n parts.push('export default 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\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 { basename } from 'node:path';\n\nexport interface WriteMigrationResult {\n targetPath: string;\n deletedSourceCandidate?: string;\n}\n\nexport function writeMigration (targetPath: string, newSource: string): WriteMigrationResult {\n writeFileSync(targetPath, newSource, 'utf8');\n\n return { targetPath };\n}\n\nexport function writeMigrationLegacy (\n sourcePath: string,\n writePath: string,\n newSource: string\n): WriteMigrationResult {\n writeFileSync(writePath, newSource, 'utf8');\n\n const deletedSourceCandidate = basename(sourcePath) === basename(writePath) ? undefined : sourcePath;\n\n return { targetPath: writePath, deletedSourceCandidate };\n}\n","import { existsSync, readFileSync, unlinkSync } 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 installWithRetry,\n type PackageManager,\n type WipeFsOps,\n} from '~/cli/installWithRetry';\nimport { pruneConsumerPackageJson } from '~/cli/prunePackageJson';\nimport {\n buildInstallList,\n type InstallList,\n type PackageManifestLike,\n pruneEslintDependencies,\n readOwnEslintConfigManifest,\n} from './dependencies';\nimport { parseEslintrc } from './eslintrc/parse';\nimport { transformEslintrcToV2 } from './eslintrc/transform';\nimport { parseV1Config } from './parse';\nimport { renderV2 } from './render';\nimport { transformToV2 } from './transform';\nimport { formatWarnings } 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 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 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\ninterface PlanResult {\n plan: V2Plan;\n rendered: string;\n}\n\nfunction planFromSource (source: string, filePath: string, format: SourceFormat): PlanResult | null {\n if (format === 'flat') {\n const parseResult = parseV1Config(source, filePath);\n\n if (!isV1Shape(parseResult)) {\n return null;\n }\n\n const plan = transformToV2(parseResult);\n\n return { plan, rendered: renderV2(plan) };\n }\n\n const parseResult = parseEslintrc(source, filePath);\n\n if (!parseResult.found) {\n return null;\n }\n\n const plan = transformEslintrcToV2(parseResult);\n\n return { plan, rendered: renderV2(plan) };\n}\n\nfunction targetWritePath (cwd: string, sourcePath: string, format: SourceFormat): string {\n if (format !== 'eslintrc') {\n return sourcePath;\n }\n\n const base = basename(sourcePath);\n const dir = sourcePath.slice(0, sourcePath.length - base.length);\n\n return join(dir.length > 0 ? dir : cwd, 'eslint.config.mjs');\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\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, plan: V2Plan, format: SourceFormat): void {\n if (clack.note) {\n clack.note(summary(plan, format), 'Migration summary');\n }\n\n if (plan.warnings.length > 0 && clack.note) {\n clack.note(formatWarnings(plan.warnings), 'Warnings');\n }\n}\n\ninterface WriteOutcome {\n deletedSourceCandidate?: string;\n}\n\nfunction writeAndAnnounce (\n clack: ClackLike,\n targetPath: string,\n writePath: string,\n rendered: string,\n format: SourceFormat\n): WriteOutcome {\n if (format === 'eslintrc') {\n const result = writeMigrationLegacy(targetPath, writePath, rendered);\n\n clack.outro(`Wrote ${writePath}`);\n\n return { deletedSourceCandidate: result.deletedSourceCandidate };\n }\n\n writeMigration(targetPath, rendered);\n\n clack.outro(`Wrote ${targetPath}`);\n\n return {};\n}\n\nasync function confirmOverwriteExistingOutput (\n clack: ClackLike,\n writePath: string,\n sourcePath: string,\n initial = false\n): Promise<boolean> {\n const message = `An \\`${basename(writePath)}\\` already exists. `\n + `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 plan: V2Plan;\n rendered: string;\n writePath: string;\n eslintIgnore: EslintIgnoreLookup | null;\n}\n\nfunction prepareMigration (resolved: ResolvedSource, input: RunMigrateInput): MigrationPreparation | null {\n const planResult = planFromSource(resolved.source, resolved.targetPath, resolved.format);\n\n if (!planResult) {\n return null;\n }\n\n const { plan } = planResult;\n const writePath = targetWritePath(input.cwd, resolved.targetPath, resolved.format);\n const eslintIgnore = findEslintIgnore(resolved.targetPath);\n\n if (eslintIgnore && eslintIgnore.patterns.length > 0) {\n mergeIgnorePatterns(plan, eslintIgnore.patterns);\n }\n\n return { plan, rendered: renderV2(plan), writePath, eslintIgnore };\n}\n\nasync function runConfirmations (\n clack: ClackLike,\n input: RunMigrateInput,\n targetPath: string,\n writePath: string,\n previous?: MigrateSessionAnswers\n): Promise<boolean> {\n if (writePath !== targetPath && existsSync(writePath)) {\n const overwrite = await confirmOverwriteExistingOutput(\n clack,\n writePath,\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 plan: V2Plan,\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 scopes = new Set<V2ScopeName>(plan.config.scopes.keys());\n const install = buildInstallList(scopes, 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<void> {\n await 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<void> {\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;\n }\n\n persistPrunedManifest(depSummary);\n\n if (input.noInstall) {\n emitInstallNextSteps(clack, depSummary, input.cwd);\n\n return;\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;\n }\n }\n\n noteFallbacks(clack, depSummary);\n await runInstaller(clack, depSummary, input);\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) {\n safeUnlink(prepared.eslintIgnore.path, clack, '.eslintignore');\n }\n\n if (outcome.deletedSourceCandidate) {\n safeUnlink(outcome.deletedSourceCandidate, clack, 'source config');\n }\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 useInsider patterns found — nothing to migrate.');\n}\n\nfunction persistMigrateSession (\n input: RunMigrateInput,\n prepared: MigrationPreparation,\n resolved: ResolvedSource\n): void {\n const overwriteExisting = prepared.writePath !== resolved.targetPath\n && existsSync(prepared.writePath);\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\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 previousMigrate = loadPreviousMigrate(clack, input.cwd);\n const prepared = prepareMigration(resolved, input);\n\n if (!prepared) {\n emitNothingToMigrate(clack, resolved.format);\n\n return 0;\n }\n\n emitSummary(clack, prepared.plan, resolved.format);\n\n const depSummary = computeDepSummary(prepared.plan, 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 0;\n }\n\n persistMigrateSession(input, prepared, resolved);\n performWriteAndCleanup(clack, resolved, prepared);\n\n if (depSummary) {\n await applyDepChanges(clack, depSummary, input);\n }\n\n clearSession({ cwd: input.cwd });\n\n return 0;\n}\n","import { writeFileSync, existsSync } 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 { 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 renderConfigFile,\n type VueHybridDefaultApi,\n} from './template';\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\nasync function installAndWrite (\n clack: ClackLike,\n input: RunScaffoldInput,\n answers: CliAnswers,\n options: { pruneBeforeInstall: boolean }\n): Promise<string> {\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 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 const targetPath = join(input.cwd, 'eslint.config.mjs');\n\n writeFileSync(targetPath, renderConfigFile(answers), 'utf8');\n\n return targetPath;\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 targetPath = await installAndWrite(\n clack,\n input,\n resolvedAnswers,\n { pruneBeforeInstall: viaOverride }\n );\n\n clearSession({ cwd: input.cwd });\n clack.outro(`Wrote ${targetPath}`);\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 });\n}\n\nfunction writeStderr (line: string): void {\n // eslint-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 // eslint-disable-next-line no-console -- CLI error surface\n console.error(`[useinsider/eslint-config] ${message}`);\n }\n\n exitCleanly(1);\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/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/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}\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']);\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\ninterface MigrateArgs {\n target: string | undefined;\n yes: boolean;\n noInstall: boolean;\n}\n\nfunction parseMigrateArgs (rest: readonly string[]): MigrateArgs {\n const yes = rest.some(isYesFlag);\n const noInstall = rest.some(isNoInstallFlag);\n const positional = rest.filter(arg => !isYesFlag(arg) && !isNoInstallFlag(arg));\n const target = positional.length > 0 ? positional[positional.length - 1] : undefined;\n\n return { target, yes, noInstall };\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]');\n stderr(' Split an existing useInsider() or .eslintrc* config into the three-file layout');\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 } = parseMigrateArgs(rest);\n\n return deps.migrate({ cwd, target, yes, noInstall });\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 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 === '@useinsider/eslint-config' ? 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","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 readOwnEslintConfigManifest,\n type PackageManifestLike,\n} from './resolveEslintConfigManifest';\n\ninterface RequiredManifest {\n version: string;\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 version: manifest.version ?? '0.0.0',\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(`@useinsider/eslint-config@${manifest.version}`);\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\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<void> {\n try {\n await installer(deps);\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}\n\nasync function tryGenericRetryInstall (\n clack: ClackLike,\n installer: DependencyInstaller,\n deps: readonly string[],\n context: WipeContext\n): Promise<void> {\n try {\n await installer(deps);\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}\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<void> {\n const confirmed = await confirmPeerDepWipe(clack, autoConfirm);\n\n if (!confirmed) {\n noteError(clack, 'Install failed: ', reason, context, deps);\n\n return;\n }\n\n performFullWipe(clack, context);\n await 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<void> {\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;\n }\n\n performFullWipe(clack, context);\n await tryGenericRetryInstall(clack, installer, deps, context);\n}\n\nexport async function installWithRetry (opts: InstallWithRetryOptions): Promise<void> {\n const installer = opts.installer ?? defaultInstaller;\n const fs = opts.fsOps ?? defaultWipeFs();\n\n try {\n await installer(opts.deps);\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 await handlePeerDepFailure(opts.clack, opts.deps, opts.autoConfirm, installer, reason, context);\n\n return;\n }\n\n await handleGenericFailure(opts.clack, opts.deps, opts.autoConfirm, installer, reason, context);\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\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}\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_LINT_SCRIPT = 'oxlint --disable-nested-config && 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\nfunction findExistingEslintConfig (cwd: string, fallback: string): string {\n const candidates = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'].map(ext => `eslint.config.${ext}`);\n const found = candidates.find(filename => existsSync(join(cwd, filename)));\n\n return found ?? fallback;\n}\n\n/**\n * The three filenames `useInsider()` requires, resolved against a consumer directory. An existing\n * `eslint.config.*` keeps its name so a migration does not leave two flat configs behind.\n * @example\n * resolveLintLayout('/repo'); // { lintModule: 'insider.lint.mts', eslintConfig: 'eslint.config.mjs', ... }\n */\nexport function resolveLintLayout (cwd: string, eslintConfigFallback = 'eslint.config.mjs'): LintLayout {\n const extension = resolveLayoutExtension(cwd);\n\n return {\n extension,\n lintModule: `insider.lint.${extension}`,\n oxlintConfig: `oxlint.config.${extension}`,\n eslintConfig: findExistingEslintConfig(cwd, eslintConfigFallback),\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.mjs', '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 LintScriptResult {\n manifest: string;\n changed: boolean;\n previous?: string;\n}\n\nconst DEFAULT_INDENT = 2;\n\nfunction detectIndent (raw: string): number {\n const firstBreak = raw.indexOf('\\n');\n\n if (firstBreak === -1) {\n return DEFAULT_INDENT;\n }\n\n const rest = raw.slice(firstBreak + 1);\n const width = rest.length - rest.trimStart().length;\n\n return width > 0 ? width : DEFAULT_INDENT;\n}\n\n/**\n * Rewrites the consumer's `lint` script so both linters run. Returns the manifest untouched when it\n * already runs oxlint, so re-running the CLI is idempotent.\n * @example\n * setLintScript('{\"scripts\":{\"lint\":\"eslint .\"}}').manifest;\n * // '…\"lint\": \"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 };\n }\n\n const previous = parsed.scripts?.lint;\n\n if (previous?.includes('oxlint')) {\n return { manifest: rawManifest, changed: false, previous };\n }\n\n parsed.scripts = { ...parsed.scripts, lint: OXLINT_LINT_SCRIPT };\n\n return {\n manifest: `${JSON.stringify(parsed, null, detectIndent(rawManifest))}\\n`,\n changed: true,\n previous,\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): string {\n const directory = mkdtempSync(join(tmpdir(), 'insider-layout-'));\n\n if (manifest !== undefined) {\n writeFileSync(join(directory, 'package.json'), manifest);\n }\n\n return directory;\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.mjs');\n });\n\n test('keeps an existing flat config filename', () => {\n const directory = makeDir('{\"type\":\"module\"}');\n\n writeFileSync(join(directory, 'eslint.config.js'), 'export default [];\\n');\n\n expect(resolveLintLayout(directory).eslintConfig).toBe('eslint.config.js');\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('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('replaces 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.previous).toBe('eslint .');\n expect(parseScripts(result.manifest).lint).toBe(OXLINT_LINT_SCRIPT);\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 });\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 previous: 'oxlint && eslint . --max-warnings 0',\n });\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}\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 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\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, '@useinsider/eslint-config@latest');\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 {\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 detectIndent (raw: string): string {\n const match = /\\n([ \\t]+)\"/u.exec(raw);\n\n if (!match) {\n return ' ';\n }\n\n return match[1];\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';\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\nconst DEFAULT_INDENT_UNIT = ' ';\n\nexport interface TsconfigState {\n path: string;\n raw: string;\n enabled: boolean;\n}\n\nfunction readEffectiveFlag (path: string, raw: string): boolean {\n const { config } = ts.parseConfigFileTextToJson(path, raw) as { config?: unknown };\n\n if (!config) {\n return false;\n }\n\n const parsed = ts.parseJsonConfigFileContent(config, ts.sys, dirname(path), undefined, path);\n\n return parsed.options.allowImportingTsExtensions === true;\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): TsconfigState | null {\n const path = join(cwd, 'tsconfig.json');\n\n if (!existsSync(path)) {\n return null;\n }\n\n try {\n const raw = readFileSync(path, 'utf8');\n\n return { path, raw, enabled: readEffectiveFlag(path, raw) };\n } catch {\n return null;\n }\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 detectIndentUnit (raw: string): string {\n const match = /\\n([\\t ]+)\\S/u.exec(raw);\n\n return match ? match[1] : DEFAULT_INDENT_UNIT;\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)) || detectIndentUnit(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 = detectIndentUnit(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 = detectIndentUnit(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\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 autoConfirm?: boolean;\n}\n\n/**\n * Offers to set `allowImportingTsExtensions` on the consumer's `tsconfig.json`, and prints the exact\n * snippet when the offer is declined. A no-op when there is no `tsconfig.json` or the flag already\n * resolves to `true` through the `extends` chain.\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 state = readTsconfigState(input.cwd);\n\n if (!state || state.enabled) {\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/* 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 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 = makeDir({\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 = makeDir({ 'tsconfig.json': '{\\n \"compilerOptions\": {}\\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 = makeDir({ 'tsconfig.json': '{\"compilerOptions\":{}}' });\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}}';\n const directory = makeDir({ 'tsconfig.json': raw });\n\n await applyTsExtensionsFlag(clack, { cwd: directory, lintModule: 'insider.lint.mts' });\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.mts'),\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 = makeDir({ 'tsconfig.json': '{\"compilerOptions\": null}' });\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}}';\n const directory = makeDir({ '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}}';\n const directory = makeDir({ '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 = makeDir({ 'tsconfig.json': '{\\n \"compilerOptions\": {}\\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","import { readFileSync, readdirSync, statSync, 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 collectFiles (directory: string, accumulator: string[]): void {\n readdirSync(directory).forEach(entry => {\n if (SKIPPED_DIRECTORIES.has(entry)) {\n return;\n }\n\n const full = join(directory, entry);\n\n if (statSync(full).isDirectory()) {\n collectFiles(full, accumulator);\n\n return;\n }\n\n if (isLintedFile(full)) {\n accumulator.push(full);\n }\n });\n}\n\nexport interface RewriteDirectivesResult {\n rewritten: string[];\n}\n\n/**\n * Applies {@link rewriteDirectives} across a consumer tree, skipping build output and dependencies.\n * @example\n * rewriteDisableDirectives('/repo').rewritten; // ['/repo/src/logger.ts']\n */\nexport function rewriteDisableDirectives (cwd: string): RewriteDirectivesResult {\n const files: string[] = [];\n\n collectFiles(cwd, files);\n\n const rewritten = files.filter(filePath => {\n const original = readFileSync(filePath, 'utf8');\n const result = rewriteDirectives(original, extname(filePath));\n\n if (!result.changed) {\n return false;\n }\n\n writeFileSync(filePath, result.source, 'utf8');\n\n return true;\n });\n\n return { rewritten };\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 findDefaultExportArray (sourceFile: ts.SourceFile): ts.ArrayLiteralExpression | null {\n const exportExpressions = sourceFile.statements\n .filter(ts.isExportAssignment)\n .map(statement => unwrapTypeCasts(statement.expression));\n const directArray = exportExpressions.find(ts.isArrayLiteralExpression);\n\n if (directArray) {\n return directArray;\n }\n\n const defineConfigCall = exportExpressions.find(isDefineConfigCall);\n\n if (!defineConfigCall) {\n return null;\n }\n\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\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 arrayLiteral = findDefaultExportArray(sourceFile);\n const arrayElements: V1ArrayElement[] = arrayLiteral\n ? arrayLiteral.elements\n .map(element => classifyArrayElement(element, sourceFile, warnings))\n .filter((entry): entry is V1ArrayElement => entry !== null)\n : [];\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 * 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\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 { basename, 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 deletedSourceCandidate?: string;\n}\n\nfunction writeLayout (eslintConfigPath: string, lintModuleSource: string): {\n lintModulePath: string;\n writtenPaths: string[];\n} {\n const directory = dirname(eslintConfigPath);\n const layout = resolveLintLayout(directory, basename(eslintConfigPath));\n const lintModulePath = join(directory, layout.lintModule);\n\n writeFileSync(lintModulePath, lintModuleSource, 'utf8');\n\n const writtenPaths = [lintModulePath];\n\n renderLintLayoutFiles({ ...layout, eslintConfig: basename(eslintConfigPath) }).forEach(file => {\n const path = join(directory, file.filename);\n\n writeFileSync(path, file.source, 'utf8');\n writtenPaths.push(path);\n });\n\n return { lintModulePath, writtenPaths };\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.\n * @example\n * writeMigration('/repo/eslint.config.mjs', source).writtenPaths.length; // 3\n */\nexport function writeMigration (targetPath: string, newSource: string): WriteMigrationResult {\n const { lintModulePath, writtenPaths } = writeLayout(targetPath, newSource);\n\n return { targetPath, lintModulePath, writtenPaths };\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. Nominates the old file for deletion when the name changed.\n * @example\n * writeMigrationLegacy('/repo/.eslintrc.cjs', '/repo/eslint.config.mjs', source).deletedSourceCandidate;\n * // '/repo/.eslintrc.cjs'\n */\nexport function writeMigrationLegacy (\n sourcePath: string,\n writePath: string,\n newSource: string\n): WriteMigrationResult {\n const { lintModulePath, writtenPaths } = writeLayout(writePath, newSource);\n const deletedSourceCandidate = basename(sourcePath) === basename(writePath) ? undefined : sourcePath;\n\n return { targetPath: writePath, lintModulePath, writtenPaths, deletedSourceCandidate };\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 installWithRetry,\n type PackageManager,\n type WipeFsOps,\n} from '~/cli/installWithRetry';\nimport { resolveLintLayout, setLintScript } 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 { rewriteDisableDirectives } from './disableDirectives';\nimport { parseEslintrc } from './eslintrc/parse';\nimport { transformEslintrcToV2 } from './eslintrc/transform';\nimport { parseV1Config } from './parse';\nimport { renderV2 } from './render';\nimport { transformToV2 } from './transform';\nimport { formatWarnings } 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 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 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\ninterface PlanResult {\n plan: V2Plan;\n rendered: string;\n}\n\nfunction planFromSource (source: string, filePath: string, format: SourceFormat): PlanResult | null {\n if (format === 'flat') {\n const parseResult = parseV1Config(source, filePath);\n\n if (!isV1Shape(parseResult)) {\n return null;\n }\n\n const plan = transformToV2(parseResult);\n\n return { plan, rendered: renderV2(plan) };\n }\n\n const parseResult = parseEslintrc(source, filePath);\n\n if (!parseResult.found) {\n return null;\n }\n\n const plan = transformEslintrcToV2(parseResult);\n\n return { plan, rendered: renderV2(plan) };\n}\n\nfunction targetWritePath (cwd: string, sourcePath: string, format: SourceFormat): string {\n if (format !== 'eslintrc') {\n return sourcePath;\n }\n\n const base = basename(sourcePath);\n const dir = sourcePath.slice(0, sourcePath.length - base.length);\n\n return join(dir.length > 0 ? dir : cwd, 'eslint.config.mjs');\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\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, plan: V2Plan, format: SourceFormat): void {\n if (clack.note) {\n clack.note(summary(plan, format), 'Migration summary');\n }\n\n if (plan.warnings.length > 0 && clack.note) {\n clack.note(formatWarnings(plan.warnings), 'Warnings');\n }\n}\n\ninterface WriteOutcome {\n deletedSourceCandidate?: 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 { deletedSourceCandidate: result.deletedSourceCandidate };\n}\n\nasync function confirmOverwriteExistingOutput (\n clack: ClackLike,\n writePath: string,\n sourcePath: string,\n initial = false\n): Promise<boolean> {\n const message = `An \\`${basename(writePath)}\\` already exists. `\n + `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 plan: V2Plan;\n rendered: string;\n writePath: string;\n eslintIgnore: EslintIgnoreLookup | null;\n}\n\nfunction prepareMigration (resolved: ResolvedSource, input: RunMigrateInput): MigrationPreparation | null {\n const planResult = planFromSource(resolved.source, resolved.targetPath, resolved.format);\n\n if (!planResult) {\n return null;\n }\n\n const { plan } = planResult;\n const writePath = targetWritePath(input.cwd, resolved.targetPath, resolved.format);\n const eslintIgnore = findEslintIgnore(resolved.targetPath);\n\n if (eslintIgnore && eslintIgnore.patterns.length > 0) {\n mergeIgnorePatterns(plan, eslintIgnore.patterns);\n }\n\n return { plan, rendered: renderV2(plan), writePath, eslintIgnore };\n}\n\nasync function runConfirmations (\n clack: ClackLike,\n input: RunMigrateInput,\n targetPath: string,\n writePath: string,\n previous?: MigrateSessionAnswers\n): Promise<boolean> {\n if (writePath !== targetPath && existsSync(writePath)) {\n const overwrite = await confirmOverwriteExistingOutput(\n clack,\n writePath,\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 plan: V2Plan,\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 scopes = new Set<V2ScopeName>(plan.config.scopes.keys());\n const install = buildInstallList(scopes, 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<void> {\n await 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<void> {\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;\n }\n\n persistPrunedManifest(depSummary);\n\n if (input.noInstall) {\n emitInstallNextSteps(clack, depSummary, input.cwd);\n\n return;\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;\n }\n }\n\n noteFallbacks(clack, depSummary);\n await runInstaller(clack, depSummary, input);\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) {\n safeUnlink(prepared.eslintIgnore.path, clack, '.eslintignore');\n }\n\n if (outcome.deletedSourceCandidate) {\n safeUnlink(outcome.deletedSourceCandidate, clack, 'source config');\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 return;\n }\n\n writeFileSync(manifestPath, result.manifest, 'utf8');\n\n if (clack.note) {\n const previous = result.previous ?? '(none)';\n\n clack.note(`lint: ${previous} -> oxlint --disable-nested-config && eslint .`, 'Updated package.json script');\n }\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.\nfunction rewriteDirectivesWithNote (clack: ClackLike, directory: string): void {\n const { rewritten } = rewriteDisableDirectives(directory);\n\n if (rewritten.length === 0 || !clack.note) {\n return;\n }\n\n clack.note(\n `Re-pointed eslint-disable comments onto oxlint-disable in ${rewritten.length} file(s).`,\n 'Disable directives'\n );\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 useInsider patterns found — nothing to migrate.');\n}\n\nfunction persistMigrateSession (\n input: RunMigrateInput,\n prepared: MigrationPreparation,\n resolved: ResolvedSource\n): void {\n const overwriteExisting = prepared.writePath !== resolved.targetPath\n && existsSync(prepared.writePath);\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\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 previousMigrate = loadPreviousMigrate(clack, input.cwd);\n const prepared = prepareMigration(resolved, input);\n\n if (!prepared) {\n emitNothingToMigrate(clack, resolved.format);\n\n return 0;\n }\n\n emitSummary(clack, prepared.plan, resolved.format);\n\n const depSummary = computeDepSummary(prepared.plan, 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 0;\n }\n\n persistMigrateSession(input, prepared, resolved);\n performWriteAndCleanup(clack, resolved, prepared);\n applyLintScript(clack, dirname(prepared.writePath));\n rewriteDirectivesWithNote(clack, dirname(prepared.writePath));\n\n const consumerDir = dirname(prepared.writePath);\n\n await applyTsExtensionsFlag(clack, {\n cwd: consumerDir,\n lintModule: resolveLintLayout(consumerDir).lintModule,\n autoConfirm: input.yes,\n });\n\n if (depSummary) {\n await applyDepChanges(clack, depSummary, input);\n }\n\n clearSession({ cwd: input.cwd });\n\n return 0;\n}\n","import { existsSync, readFileSync, 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 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): void {\n const manifestPath = join(cwd, '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\nexport function writeLintLayout (cwd: string, lintModuleSource: string): string {\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 applyLintScript(cwd);\n\n return lintModulePath;\n}\n\nasync function installAndWrite (\n clack: ClackLike,\n input: RunScaffoldInput,\n answers: CliAnswers,\n options: { pruneBeforeInstall: boolean }\n): Promise<string> {\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 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 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 targetPath = await installAndWrite(\n clack,\n input,\n resolvedAnswers,\n { pruneBeforeInstall: viaOverride }\n );\n\n await applyTsExtensionsFlag(clack, {\n cwd: input.cwd,\n lintModule: resolveLintLayout(input.cwd).lintModule,\n autoConfirm: input.yes,\n });\n\n clearSession({ cwd: input.cwd });\n clack.outro(`Wrote ${targetPath} 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 });\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"],"mappings":"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"}
|