@useinsider/eslint-config 1.15.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -4
- package/dist/builders/scopeBlocks.d.ts +0 -1
- package/dist/cli.cjs +20 -35
- package/dist/cli.cjs.map +1 -1
- package/dist/{javascript-C_TnSBvE.cjs → javascript-9tQ9nS7g.cjs} +2 -2
- package/dist/{javascript-C_TnSBvE.cjs.map → javascript-9tQ9nS7g.cjs.map} +1 -1
- package/dist/{javascript-DY1G2zHE.js → javascript-DZ8AUcFu.js} +2 -2
- package/dist/{javascript-DY1G2zHE.js.map → javascript-DZ8AUcFu.js.map} +1 -1
- package/dist/{javascript-dom-CoYti9xp.js → javascript-dom-DaclGNp-.js} +2 -2
- package/dist/{javascript-dom-CoYti9xp.js.map → javascript-dom-DaclGNp-.js.map} +1 -1
- package/dist/{javascript-dom-CdLX8B4z.cjs → javascript-dom-Duiy5LQP.cjs} +2 -2
- package/dist/{javascript-dom-CdLX8B4z.cjs.map → javascript-dom-Duiy5LQP.cjs.map} +1 -1
- package/dist/{javascript-node-Dkr_NJve.cjs → javascript-node-42x75ZCz.cjs} +2 -2
- package/dist/{javascript-node-Dkr_NJve.cjs.map → javascript-node-42x75ZCz.cjs.map} +1 -1
- package/dist/{javascript-node-Cu9xJaij.js → javascript-node-CbCig5az.js} +2 -2
- package/dist/{javascript-node-Cu9xJaij.js.map → javascript-node-CbCig5az.js.map} +1 -1
- package/dist/main.cjs +22 -17
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.js +22 -17
- package/dist/main.js.map +1 -1
- package/dist/{stylistic-CTTpohNe.cjs → stylistic-D9tHaeG4.cjs} +5 -2
- package/dist/stylistic-D9tHaeG4.cjs.map +1 -0
- package/dist/{stylistic-KhH5RHgo.js → stylistic-DwB496Pa.js} +5 -2
- package/dist/stylistic-DwB496Pa.js.map +1 -0
- package/dist/{typescript-8AyLBzlB.cjs → typescript-BDc8Y6Hc.cjs} +2 -2
- package/dist/{typescript-8AyLBzlB.cjs.map → typescript-BDc8Y6Hc.cjs.map} +1 -1
- package/dist/{typescript-D9mAiTUp.js → typescript-CDhrDEoi.js} +2 -2
- package/dist/{typescript-D9mAiTUp.js.map → typescript-CDhrDEoi.js.map} +1 -1
- package/dist/{typescript-dom-B2YDpT02.js → typescript-dom-CexiRZAz.js} +2 -2
- package/dist/{typescript-dom-B2YDpT02.js.map → typescript-dom-CexiRZAz.js.map} +1 -1
- package/dist/{typescript-dom--BGWriPK.cjs → typescript-dom-xYDL7O9g.cjs} +2 -2
- package/dist/{typescript-dom--BGWriPK.cjs.map → typescript-dom-xYDL7O9g.cjs.map} +1 -1
- package/dist/{typescript-node-CDuDtwLn.js → typescript-node-B8TpRcjd.js} +2 -2
- package/dist/{typescript-node-CDuDtwLn.js.map → typescript-node-B8TpRcjd.js.map} +1 -1
- package/dist/{typescript-node-D8Ehc8Xl.cjs → typescript-node-BjpTUbKF.cjs} +2 -2
- package/dist/{typescript-node-D8Ehc8Xl.cjs.map → typescript-node-BjpTUbKF.cjs.map} +1 -1
- package/dist/{vue-RCTZLBFW.cjs → vue-2Tf2LIPf.cjs} +5 -2
- package/dist/vue-2Tf2LIPf.cjs.map +1 -0
- package/dist/{vue-BFlqHfdu.js → vue-Bg3R-yZT.js} +5 -2
- package/dist/vue-Bg3R-yZT.js.map +1 -0
- package/dist/{vue2-ux7RewSI.js → vue2-CVSRM5hR.js} +2 -2
- package/dist/{vue2-ux7RewSI.js.map → vue2-CVSRM5hR.js.map} +1 -1
- package/dist/{vue2-Clsujsr4.cjs → vue2-CwpD2fD-.cjs} +2 -2
- package/dist/{vue2-Clsujsr4.cjs.map → vue2-CwpD2fD-.cjs.map} +1 -1
- package/dist/{vue2-B8OOzQe1.cjs → vue2-DAi-TxWE.cjs} +3 -3
- package/dist/{vue2-B8OOzQe1.cjs.map → vue2-DAi-TxWE.cjs.map} +1 -1
- package/dist/{vue2-BkT8z7rj.js → vue2-G2Q58B8-.js} +3 -3
- package/dist/{vue2-BkT8z7rj.js.map → vue2-G2Q58B8-.js.map} +1 -1
- package/dist/{vue2-options-api-DZYpHaey.js → vue2-options-api-CKnW7uvJ.js} +3 -3
- package/dist/{vue2-options-api-DZYpHaey.js.map → vue2-options-api-CKnW7uvJ.js.map} +1 -1
- package/dist/{vue2-options-api-wn4cJNBZ.cjs → vue2-options-api-DHnhmw3v.cjs} +3 -3
- package/dist/{vue2-options-api-wn4cJNBZ.cjs.map → vue2-options-api-DHnhmw3v.cjs.map} +1 -1
- package/dist/{vue2-typescript-CMTQRTOb.cjs → vue2-typescript-CcuFB-YB.cjs} +3 -3
- package/dist/{vue2-typescript-CMTQRTOb.cjs.map → vue2-typescript-CcuFB-YB.cjs.map} +1 -1
- package/dist/{vue2-typescript-QtAzStxj.js → vue2-typescript-DgXglO8R.js} +3 -3
- package/dist/{vue2-typescript-QtAzStxj.js.map → vue2-typescript-DgXglO8R.js.map} +1 -1
- package/dist/{vue2-typescript-options-api-D97kaNDK.cjs → vue2-typescript-options-api-2fugBIOF.cjs} +3 -3
- package/dist/{vue2-typescript-options-api-D97kaNDK.cjs.map → vue2-typescript-options-api-2fugBIOF.cjs.map} +1 -1
- package/dist/{vue2-typescript-options-api-BSPWgVim.js → vue2-typescript-options-api-DsejF_KX.js} +3 -3
- package/dist/{vue2-typescript-options-api-BSPWgVim.js.map → vue2-typescript-options-api-DsejF_KX.js.map} +1 -1
- package/dist/{vue3-D6yjGs6S.js → vue3-CADfXE8I.js} +3 -3
- package/dist/{vue3-D6yjGs6S.js.map → vue3-CADfXE8I.js.map} +1 -1
- package/dist/{vue3-pkQy_hqQ.cjs → vue3-CJAdAg73.cjs} +3 -3
- package/dist/{vue3-pkQy_hqQ.cjs.map → vue3-CJAdAg73.cjs.map} +1 -1
- package/dist/{vue3-options-api-IXOi0n4J.cjs → vue3-options-api-D2Wub1Oy.cjs} +3 -3
- package/dist/{vue3-options-api-IXOi0n4J.cjs.map → vue3-options-api-D2Wub1Oy.cjs.map} +1 -1
- package/dist/{vue3-options-api-DHVQ7O2g.js → vue3-options-api-DFWOX_UU.js} +3 -3
- package/dist/{vue3-options-api-DHVQ7O2g.js.map → vue3-options-api-DFWOX_UU.js.map} +1 -1
- package/dist/{vue3-typescript-DPOYvbgC.cjs → vue3-typescript-DLfJPXTc.cjs} +3 -3
- package/dist/{vue3-typescript-DPOYvbgC.cjs.map → vue3-typescript-DLfJPXTc.cjs.map} +1 -1
- package/dist/{vue3-typescript-DN0oQSDz.js → vue3-typescript-DlncdT6z.js} +3 -3
- package/dist/{vue3-typescript-DN0oQSDz.js.map → vue3-typescript-DlncdT6z.js.map} +1 -1
- package/dist/{vue3-typescript-options-api-B6a32vcF.cjs → vue3-typescript-options-api-Cn4u57BK.cjs} +3 -3
- package/dist/{vue3-typescript-options-api-B6a32vcF.cjs.map → vue3-typescript-options-api-Cn4u57BK.cjs.map} +1 -1
- package/dist/{vue3-typescript-options-api-DC3rDbkx.js → vue3-typescript-options-api-CorDmhg0.js} +3 -3
- package/dist/{vue3-typescript-options-api-DC3rDbkx.js.map → vue3-typescript-options-api-CorDmhg0.js.map} +1 -1
- package/package.json +1 -1
- package/dist/config-BAAd4RYs.js +0 -9
- package/dist/config-BAAd4RYs.js.map +0 -1
- package/dist/config-CG7HGKHr.cjs +0 -9
- package/dist/config-CG7HGKHr.cjs.map +0 -1
- package/dist/configs/config/dependencies.d.ts +0 -1
- package/dist/configs/config/index.d.ts +0 -3
- package/dist/stylistic-CTTpohNe.cjs.map +0 -1
- package/dist/stylistic-KhH5RHgo.js.map +0 -1
- package/dist/vue-BFlqHfdu.js.map +0 -1
- package/dist/vue-RCTZLBFW.cjs.map +0 -1
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":[],"sources":["../src/cli/detect.ts","../src/cli/detectVueApiPattern.ts","../src/cli/dispatch.ts","../src/configs/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/config/dependencies.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\ntype ConfigScope = 'config';\n\ninterface ScopeEntry {\n files: string[];\n ignores?: string[];\n tsconfigPaths?: string[];\n}\n\ninterface ScopedConfig {\n scope: AppScope | TestScope | ExtraScope | ConfigScope | '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 configScopeFiles (answers: CliAnswers): string[] {\n const files = [...jsRootConfigFiles()];\n\n if (hasTypescript(answers.languages)) {\n files.push(...tsRootConfigFiles());\n }\n\n return files;\n}\n\nfunction buildRootConfigBlocks (\n answers: CliAnswers,\n appEntry: TsconfigRoleEntry | undefined,\n configEntry: TsconfigRoleEntry | undefined\n): ScopedConfig[] {\n const blocks: ScopedConfig[] = [\n { scope: 'config', entry: { files: configScopeFiles(answers) } },\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 // eslint-disable-next-line sonarjs/hashing -- non-security filename derivation: collision risk acceptable\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 = {} 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 configDeps } from '~/configs/config/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 configDeps,\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/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 // eslint-disable-next-line sonarjs/hashing -- non-security filename derivation: collision risk acceptable\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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"}
|