@geoql/doctor-core 0.1.0-alpha.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["resolvePath","check","vForHasKey","vIfVForPrecedence"],"sources":["../src/file-scan.ts","../src/merge-diagnostics.ts","../src/oxlint/diagnostic.ts","../src/oxlint/generate-config.ts","../src/oxlint/resolve-plugin.ts","../src/oxlint/spawn.ts","../src/oxlint/run.ts","../src/score.ts","../src/template/parse-sfc.ts","../src/template/directive-helpers.ts","../src/template/walk.ts","../src/template/rules/v-for-has-key.ts","../src/template/rules/v-if-v-for-precedence.ts","../src/template/rules/index.ts","../src/template/run.ts","../src/audit.ts","../src/config.ts","../src/reporters/json.ts","../src/reporters/text.ts","../src/reporters/index.ts"],"sourcesContent":["import { resolve } from 'node:path';\nimport { glob } from 'tinyglobby';\n\nexport interface ScanOptions {\n rootDir: string;\n include: string[];\n exclude: string[];\n}\n\nexport async function listSourceFiles(opts: ScanOptions): Promise<string[]> {\n const files = await glob(opts.include, {\n cwd: opts.rootDir,\n absolute: true,\n ignore: opts.exclude,\n onlyFiles: true,\n dot: false,\n });\n return files.map((f) => resolve(f)).sort();\n}\n","import type { Diagnostic } from './types.js';\n\nexport function mergeDiagnostics(...batches: Diagnostic[][]): Diagnostic[] {\n const seen = new Set<string>();\n const out: Diagnostic[] = [];\n for (const batch of batches) {\n for (const d of batch) {\n const key = `${d.file}|${d.line}|${d.column}|${d.ruleId}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(d);\n }\n }\n out.sort((a, b) => {\n if (a.file !== b.file) return a.file < b.file ? -1 : 1;\n if (a.line !== b.line) return a.line - b.line;\n if (a.column !== b.column) return a.column - b.column;\n return a.ruleId < b.ruleId ? -1 : 1;\n });\n return out;\n}\n","import { resolve } from 'node:path';\nimport type { Diagnostic } from '../types.js';\nimport type { OxlintRawDiagnostic } from './types.js';\n\nconst OXLINT_CODE_PATTERN = /^([a-z0-9_-]+)\\(([a-z0-9_-]+)\\)$/i;\n\nexport function normalizeOxlintRuleId(raw: OxlintRawDiagnostic): string {\n if (raw.code) {\n const match = OXLINT_CODE_PATTERN.exec(raw.code);\n if (match) return `${match[1]}/${match[2]}`;\n return raw.code;\n }\n if (raw.rule) return raw.rule;\n return 'oxlint/unknown';\n}\n\nexport function toCanonicalDiagnostic(\n raw: OxlintRawDiagnostic,\n rootDir: string,\n): Diagnostic {\n const ruleId = normalizeOxlintRuleId(raw);\n const severity = raw.severity === 'warning' ? 'warning' : 'error';\n const primary = raw.labels?.[0]?.span;\n const line = primary?.line ?? raw.start_line ?? 1;\n const column = primary?.column ?? raw.start_column ?? 1;\n return {\n file: resolve(rootDir, raw.filename),\n line,\n column,\n endLine: raw.end_line,\n endColumn: raw.end_column,\n ruleId,\n severity,\n message: raw.message,\n source: 'oxlint',\n };\n}\n\nexport function toCanonicalDiagnostics(\n raws: OxlintRawDiagnostic[],\n rootDir: string,\n): Diagnostic[] {\n return raws.map((r) => toCanonicalDiagnostic(r, rootDir));\n}\n","import { writeFile, mkdtemp } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Severity } from '../types.js';\n\nexport interface GenerateConfigInput {\n pluginPath: string;\n ruleOverrides?: Record<string, Severity | 'off'>;\n}\n\nconst DEFAULT_RULES: Record<string, Severity> = {\n 'vue/no-export-in-script-setup': 'error',\n 'vue/require-typed-ref': 'warning',\n 'vue-doctor/no-em-dash-in-string': 'warning',\n};\n\nfunction toOxlintSeverity(s: Severity | 'off'): 'error' | 'warn' | 'off' {\n if (s === 'warning') return 'warn';\n return s;\n}\n\nexport async function generateOxlintConfig(\n input: GenerateConfigInput,\n): Promise<string> {\n const dir = await mkdtemp(join(tmpdir(), 'geoql-doctor-'));\n const merged: Record<string, Severity> = { ...DEFAULT_RULES };\n if (input.ruleOverrides) {\n for (const [id, sev] of Object.entries(input.ruleOverrides)) {\n if (sev === 'off') delete merged[id];\n else merged[id] = sev;\n }\n }\n const rules: Record<string, 'error' | 'warn'> = {};\n for (const [id, sev] of Object.entries(merged)) {\n rules[id] = toOxlintSeverity(sev) as 'error' | 'warn';\n }\n const config = {\n $schema:\n 'https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json',\n plugins: ['vue'],\n jsPlugins: [input.pluginPath],\n rules,\n };\n const configPath = join(dir, '.oxlintrc.json');\n await writeFile(configPath, JSON.stringify(config, null, 2));\n return configPath;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve as resolvePath } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nfunction readPkgMain(pkgJsonPath: string): string | undefined {\n try {\n const raw = readFileSync(pkgJsonPath, 'utf8');\n const pkg = JSON.parse(raw) as {\n exports?: {\n '.'?: { import?: string; default?: string };\n default?: string;\n };\n module?: string;\n main?: string;\n };\n const exp = pkg.exports?.['.'];\n if (exp?.import) return exp.import;\n if (exp?.default) return exp.default;\n if (pkg.module) return pkg.module;\n if (pkg.main) return pkg.main;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction lookUpwards(fromDir: string, relPath: string): string | undefined {\n let current = resolvePath(fromDir);\n // Bounded ascent: stop when dirname() returns the same value (filesystem root).\n while (true) {\n const candidate = resolvePath(current, relPath);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\nexport function resolveVueDoctorPluginPath(fromDir: string): string {\n const pkgJson = lookUpwards(\n fromDir,\n 'node_modules/@geoql/oxlint-plugin-vue-doctor/package.json',\n );\n if (pkgJson) {\n const main = readPkgMain(pkgJson) ?? './dist/index.js';\n return resolvePath(dirname(pkgJson), main);\n }\n if (typeof import.meta.resolve === 'function') {\n try {\n const baseUrl = pathToFileURL(resolvePath(fromDir, 'package.json')).href;\n const resolved = import.meta.resolve(\n '@geoql/oxlint-plugin-vue-doctor',\n baseUrl,\n );\n return fileURLToPath(resolved);\n } catch {\n return throwResolveError(fromDir);\n }\n }\n return throwResolveError(fromDir);\n}\n\nfunction throwResolveError(fromDir: string): never {\n throw new Error(\n `Failed to resolve @geoql/oxlint-plugin-vue-doctor from ${fromDir}. Install it as a dependency of your project or use the bundled @geoql/vue-doctor CLI.`,\n );\n}\n\nexport function resolveOxlintBin(fromDir: string): string {\n const pkgJson = lookUpwards(fromDir, 'node_modules/oxlint/package.json');\n if (pkgJson) {\n return resolvePath(dirname(pkgJson), 'bin/oxlint');\n }\n throw new Error(\n `Failed to resolve oxlint from ${fromDir}. Install oxlint as a dependency of your project.`,\n );\n}\n","import { spawn } from 'node:child_process';\nimport type {\n OxlintRawDiagnostic,\n OxlintRunOptions,\n OxlintRunResult,\n} from './types.js';\n\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\ninterface OxlintJsonReport {\n diagnostics?: OxlintRawDiagnostic[];\n}\n\nexport async function runOxlint(\n opts: OxlintRunOptions,\n): Promise<OxlintRunResult> {\n return new Promise<OxlintRunResult>((resolve, reject) => {\n const args = ['-c', opts.configPath, '--format', 'json', opts.targetPath];\n const child = spawn(opts.oxlintBin, args, {\n cwd: opts.rootDir,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let timer: NodeJS.Timeout | undefined;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (timeoutMs > 0) {\n timer = setTimeout(() => {\n child.kill('SIGKILL');\n reject(new Error(`oxlint subprocess timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n }\n child.stdout.on('data', (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr.on('data', (chunk: Buffer) => stderrChunks.push(chunk));\n child.on('error', (err) => {\n if (timer) clearTimeout(timer);\n reject(err);\n });\n child.on('close', (exitCode) => {\n if (timer) clearTimeout(timer);\n const stdout = Buffer.concat(stdoutChunks).toString('utf8');\n const stderr = Buffer.concat(stderrChunks).toString('utf8');\n const diagnostics = parseOxlintJsonStream(stdout);\n resolve({ diagnostics, stderr, exitCode });\n });\n });\n}\n\nfunction parseOxlintJsonStream(stdout: string): OxlintRawDiagnostic[] {\n const trimmed = stdout.trim();\n if (!trimmed) return [];\n try {\n const parsed = JSON.parse(trimmed) as\n | OxlintJsonReport\n | OxlintRawDiagnostic[];\n if (Array.isArray(parsed)) return parsed;\n if (parsed.diagnostics) return parsed.diagnostics;\n } catch {\n return parseNdjson(trimmed);\n }\n return [];\n}\n\nfunction parseNdjson(text: string): OxlintRawDiagnostic[] {\n const out: OxlintRawDiagnostic[] = [];\n for (const line of text.split('\\n')) {\n const t = line.trim();\n if (!t) continue;\n try {\n const obj = JSON.parse(t) as OxlintRawDiagnostic;\n if (obj && typeof obj === 'object' && 'message' in obj) out.push(obj);\n } catch {\n // skip non-json line\n }\n }\n return out;\n}\n","import type { Diagnostic, Severity } from '../types.js';\nimport { toCanonicalDiagnostics } from './diagnostic.js';\nimport { generateOxlintConfig } from './generate-config.js';\nimport {\n resolveOxlintBin,\n resolveVueDoctorPluginPath,\n} from './resolve-plugin.js';\nimport { runOxlint } from './spawn.js';\n\nexport interface ScriptPassOptions {\n rootDir: string;\n targetPath: string;\n ruleOverrides?: Record<string, Severity | 'off'>;\n timeoutMs?: number;\n}\n\nexport interface ScriptPassResult {\n diagnostics: Diagnostic[];\n stderr: string;\n exitCode: number | null;\n}\n\nexport async function runScriptPass(\n opts: ScriptPassOptions,\n): Promise<ScriptPassResult> {\n const pluginPath = resolveVueDoctorPluginPath(opts.rootDir);\n const oxlintBin = resolveOxlintBin(opts.rootDir);\n const configPath = await generateOxlintConfig({\n pluginPath,\n ruleOverrides: opts.ruleOverrides,\n });\n const raw = await runOxlint({\n rootDir: opts.rootDir,\n targetPath: opts.targetPath,\n configPath,\n oxlintBin,\n timeoutMs: opts.timeoutMs,\n });\n return {\n diagnostics: toCanonicalDiagnostics(raw.diagnostics, opts.rootDir),\n stderr: raw.stderr,\n exitCode: raw.exitCode,\n };\n}\n","import type { Diagnostic } from './types.js';\n\nconst ERROR_PENALTY = 10;\nconst WARNING_PENALTY = 2;\n\nexport interface ScoreBreakdown {\n score: number;\n errorCount: number;\n warningCount: number;\n}\n\nexport function scoreDiagnostics(diagnostics: Diagnostic[]): ScoreBreakdown {\n let errorCount = 0;\n let warningCount = 0;\n for (const d of diagnostics) {\n if (d.severity === 'error') errorCount += 1;\n else warningCount += 1;\n }\n const penalty = errorCount * ERROR_PENALTY + warningCount * WARNING_PENALTY;\n const score = Math.max(0, 100 - penalty);\n return { score, errorCount, warningCount };\n}\n","import { readFile } from 'node:fs/promises';\nimport { parse, type SFCDescriptor } from '@vue/compiler-sfc';\n\nconst cache = new Map<string, SFCDescriptor | null>();\n\nexport async function parseSfc(absPath: string): Promise<SFCDescriptor | null> {\n if (cache.has(absPath)) return cache.get(absPath) ?? null;\n let source: string;\n try {\n source = await readFile(absPath, 'utf8');\n } catch {\n cache.set(absPath, null);\n return null;\n }\n const { descriptor, errors } = parse(source, { filename: absPath });\n if (errors.length > 0 || !descriptor.template) {\n cache.set(absPath, null);\n return null;\n }\n cache.set(absPath, descriptor);\n return descriptor;\n}\n\nexport function clearSfcCache(): void {\n cache.clear();\n}\n","import type {\n AttributeNode,\n DirectiveNode,\n ElementNode,\n} from '@vue/compiler-core';\n\nconst NODE_DIRECTIVE = 7;\n\nexport function findDirective(\n el: ElementNode,\n name: string,\n): DirectiveNode | undefined {\n for (const prop of el.props) {\n if (prop.type === NODE_DIRECTIVE && prop.name === name)\n return prop as DirectiveNode;\n }\n return undefined;\n}\n\nexport function findBindAttr(\n el: ElementNode,\n attrName: string,\n): DirectiveNode | undefined {\n for (const prop of el.props) {\n if (prop.type !== NODE_DIRECTIVE) continue;\n const dir = prop as DirectiveNode;\n if (dir.name !== 'bind') continue;\n const arg = dir.arg as { content?: string } | undefined;\n if (arg?.content === attrName) return dir;\n }\n return undefined;\n}\n\nexport function findStaticAttr(\n el: ElementNode,\n attrName: string,\n): AttributeNode | undefined {\n for (const prop of el.props) {\n if (prop.type === 6 && (prop as AttributeNode).name === attrName) {\n return prop as AttributeNode;\n }\n }\n return undefined;\n}\n","import type {\n ElementNode,\n RootNode,\n TemplateChildNode,\n} from '@vue/compiler-core';\n\nconst NODE_ELEMENT = 1;\n\nexport function isElementNode(\n node: { type: number } | undefined | null,\n): node is ElementNode {\n return node !== null && node !== undefined && node.type === NODE_ELEMENT;\n}\n\nexport type ElementVisitor = (node: ElementNode) => void;\n\nexport function walkElements(root: RootNode, visit: ElementVisitor): void {\n const stack: TemplateChildNode[] = [...root.children];\n while (stack.length > 0) {\n const node = stack.pop();\n if (!node) continue;\n if (isElementNode(node)) {\n visit(node);\n if (node.children) {\n for (const child of node.children) stack.push(child);\n }\n }\n }\n}\n","import type { ElementNode } from '@vue/compiler-core';\nimport type { Diagnostic } from '../../types.js';\nimport {\n findBindAttr,\n findDirective,\n findStaticAttr,\n} from '../directive-helpers.js';\nimport { walkElements } from '../walk.js';\nimport type { TemplateRuleContext, TemplateRuleResult } from './types.js';\n\nexport function check(ctx: TemplateRuleContext): TemplateRuleResult {\n const diagnostics: Diagnostic[] = [];\n walkElements(ctx.template, (el: ElementNode) => {\n const vFor = findDirective(el, 'for');\n if (!vFor) return;\n const hasKey = findBindAttr(el, 'key') ?? findStaticAttr(el, 'key');\n if (hasKey) return;\n diagnostics.push({\n file: ctx.file,\n line: el.loc.start.line,\n column: el.loc.start.column,\n endLine: el.loc.end.line,\n endColumn: el.loc.end.column,\n ruleId: 'vue-doctor/template/v-for-has-key',\n severity: 'error',\n message: `<${el.tag}> uses v-for without :key. Vue cannot efficiently diff this list across renders.`,\n source: 'template',\n recommendation:\n 'Add :key with a stable, unique identifier from the iterated item.',\n });\n });\n return { diagnostics };\n}\n","import type { ElementNode } from '@vue/compiler-core';\nimport type { Diagnostic } from '../../types.js';\nimport { findDirective } from '../directive-helpers.js';\nimport { walkElements } from '../walk.js';\nimport type { TemplateRuleContext, TemplateRuleResult } from './types.js';\n\nexport function check(ctx: TemplateRuleContext): TemplateRuleResult {\n const diagnostics: Diagnostic[] = [];\n walkElements(ctx.template, (el: ElementNode) => {\n const vIf = findDirective(el, 'if');\n const vFor = findDirective(el, 'for');\n if (!vIf || !vFor) return;\n diagnostics.push({\n file: ctx.file,\n line: el.loc.start.line,\n column: el.loc.start.column,\n endLine: el.loc.end.line,\n endColumn: el.loc.end.column,\n ruleId: 'vue-doctor/template/v-if-v-for-precedence',\n severity: 'error',\n message: `<${el.tag}> uses v-if and v-for on the same element. In Vue 3, v-if binds tighter than v-for, so the condition cannot reference loop variables.`,\n source: 'template',\n recommendation:\n 'Move the v-if to a <template v-for> wrapper or to a parent element, or filter the iterated source in a computed.',\n });\n });\n return { diagnostics };\n}\n","import { check as vForHasKey } from './v-for-has-key.js';\nimport { check as vIfVForPrecedence } from './v-if-v-for-precedence.js';\nimport type { TemplateRule } from './types.js';\n\nexport const TEMPLATE_RULES: TemplateRule[] = [\n { id: 'vue-doctor/template/v-for-has-key', check: vForHasKey },\n { id: 'vue-doctor/template/v-if-v-for-precedence', check: vIfVForPrecedence },\n];\n","import type { Diagnostic, Severity } from '../types.js';\nimport { parseSfc } from './parse-sfc.js';\nimport { TEMPLATE_RULES } from './rules/index.js';\n\nexport interface TemplatePassOptions {\n files: string[];\n ruleOverrides?: Record<string, Severity | 'off'>;\n}\n\nexport async function runTemplatePass(\n opts: TemplatePassOptions,\n): Promise<Diagnostic[]> {\n const all: Diagnostic[] = [];\n for (const file of opts.files) {\n if (!file.endsWith('.vue')) continue;\n const descriptor = await parseSfc(file);\n if (!descriptor?.template?.ast) continue;\n for (const rule of TEMPLATE_RULES) {\n const override = opts.ruleOverrides?.[rule.id];\n if (override === 'off') continue;\n const { diagnostics } = rule.check({\n file,\n template: descriptor.template.ast,\n });\n for (const d of diagnostics) {\n all.push(override ? { ...d, severity: override } : d);\n }\n }\n }\n return all;\n}\n","import { resolve } from 'node:path';\nimport { listSourceFiles } from './file-scan.js';\nimport { mergeDiagnostics } from './merge-diagnostics.js';\nimport { runScriptPass } from './oxlint/run.js';\nimport { scoreDiagnostics } from './score.js';\nimport { runTemplatePass } from './template/run.js';\nimport type { AuditConfig, AuditReport, Diagnostic } from './types.js';\n\nconst DEFAULT_INCLUDE = [\n '**/*.vue',\n '**/*.ts',\n '**/*.tsx',\n '**/*.js',\n '**/*.jsx',\n];\nconst DEFAULT_EXCLUDE = [\n 'node_modules',\n 'dist',\n '.nuxt',\n '.output',\n 'coverage',\n];\n\nexport async function audit(config: AuditConfig = {}): Promise<AuditReport> {\n const rootDir = resolve(config.rootDir ?? process.cwd());\n const include = config.include ?? DEFAULT_INCLUDE;\n const exclude = config.exclude ?? DEFAULT_EXCLUDE;\n const failOn = config.failOn ?? 'error';\n\n const files = await listSourceFiles({ rootDir, include, exclude });\n\n const templateDiagnostics = await runTemplatePass({\n files,\n ruleOverrides: config.rules,\n });\n\n let scriptDiagnostics: Diagnostic[] = [];\n let oxlintStderr = '';\n try {\n const result = await runScriptPass({\n rootDir,\n targetPath: rootDir,\n ruleOverrides: config.rules,\n });\n scriptDiagnostics = result.diagnostics;\n oxlintStderr = result.stderr;\n } catch (err) {\n oxlintStderr = err instanceof Error ? err.message : String(err);\n if (process.env.DOCTOR_DEBUG) {\n process.stderr.write(\n `[doctor-core] script pass failed: ${oxlintStderr}\\n`,\n );\n }\n }\n\n const merged = mergeDiagnostics(templateDiagnostics, scriptDiagnostics);\n const { score, errorCount, warningCount } = scoreDiagnostics(merged);\n\n let exitCode: 0 | 1 | 2 = 0;\n if (\n oxlintStderr &&\n scriptDiagnostics.length === 0 &&\n oxlintStderr.includes('Failed')\n ) {\n exitCode = 2;\n } else {\n const tripping =\n failOn === 'warning' ? errorCount + warningCount : errorCount;\n if (tripping > 0) exitCode = 1;\n }\n\n return {\n rootDir,\n filesScanned: files.length,\n diagnostics: merged,\n score,\n errorCount,\n warningCount,\n exitCode,\n };\n}\n","import { loadConfig } from 'c12';\nimport type { AuditConfig } from './types.js';\n\nconst DEFAULTS: Required<Pick<AuditConfig, 'include' | 'exclude' | 'failOn'>> =\n {\n include: ['**/*.vue', '**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['node_modules', 'dist', '.nuxt', '.output', 'coverage'],\n failOn: 'error',\n };\n\nexport interface LoadedConfig {\n config: AuditConfig;\n configFile?: string;\n}\n\nexport async function loadAuditConfig(\n rootDir: string,\n explicitPath?: string,\n): Promise<LoadedConfig> {\n const { config, configFile } = await loadConfig<AuditConfig>({\n cwd: rootDir,\n name: 'doctor',\n configFile: explicitPath,\n defaults: DEFAULTS as AuditConfig,\n });\n return { config: { rootDir, ...config }, configFile };\n}\n","import type { AuditReport } from '../types.js';\n\nexport function formatJson(report: AuditReport): string {\n return JSON.stringify(report, null, 2);\n}\n","import { relative } from 'node:path';\nimport * as c from 'kolorist';\nimport type { AuditReport } from '../types.js';\n\nexport function formatText(report: AuditReport): string {\n const lines: string[] = [];\n const groups = new Map<string, AuditReport['diagnostics']>();\n for (const d of report.diagnostics) {\n const arr = groups.get(d.file) ?? [];\n arr.push(d);\n groups.set(d.file, arr);\n }\n for (const [file, diags] of groups) {\n const rel = relative(report.rootDir, file) || file;\n lines.push(c.underline(c.bold(rel)));\n for (const d of diags) {\n const sev = d.severity === 'error' ? c.red('error') : c.yellow('warning');\n const loc = c.dim(`${d.line}:${d.column}`);\n const rule = c.dim(`(${d.ruleId})`);\n lines.push(` ${loc} ${sev} ${d.message} ${rule}`);\n if (d.recommendation)\n lines.push(` ${c.dim('hint:')} ${d.recommendation}`);\n }\n lines.push('');\n }\n const summary = `${report.errorCount} error${report.errorCount === 1 ? '' : 's'}, ${report.warningCount} warning${report.warningCount === 1 ? '' : 's'} in ${report.filesScanned} file${report.filesScanned === 1 ? '' : 's'}`;\n const scoreLine = `Score: ${c.bold(String(report.score))}/100`;\n lines.push(summary);\n lines.push(scoreLine);\n return lines.join('\\n');\n}\n","import type { AuditReport } from '../types.js';\nimport { formatJson } from './json.js';\nimport { formatText } from './text.js';\n\nexport type ReporterFormat = 'text' | 'json';\n\nexport function format(report: AuditReport, kind: ReporterFormat): string {\n if (kind === 'json') return formatJson(report);\n return formatText(report);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["RULE_ID","DOCS","RULE_ID","DOCS","RULE_ID","DOCS","RULE_ID","RULE_ID","RULE_ID","parseMajorMinor","RULE_ID","RULE_ID","RULE_ID","RULE_ID","RULE_ID","RULE_ID","RULE_ID","RULE_ID","RULE_ID","RULE_ID","RULE_ID","resolvePath","cache","RULE_ID","MESSAGE","RECOMMENDATION","check","NODE_ELEMENT","RULE_ID","MESSAGE","RECOMMENDATION","check","RULE_ID","MESSAGE","RECOMMENDATION","check","check","noMixedOptionsAndCompositionApi","useSeoMetaOnPublicPage","ogImageDefined","noMixedAppAndRootLayout","NODE_DIRECTIVE","check","check","check","NODE_DIRECTIVE","checkElement","check","NODE_ELEMENT","NODE_DIRECTIVE","checkElement","check","vForHasKey","vIfVForPrecedence","vMemoOnLargeList","noInlineObjectPropInList","noComputedGetterInTemplateLoop","avoidDeepVBindSpreadInList","relativize","process"],"sources":["../src/annotations.ts","../src/project-info/read-package-json.ts","../src/build-quality/read-deps.ts","../src/build-quality/check-eslint-plugin-vue.ts","../src/build-quality/check-no-vue-cli.ts","../src/build-quality/strip-json-comments.ts","../src/build-quality/check-tsconfig-strict.ts","../src/build-quality/check-vue-tsc.ts","../src/check-build-quality.ts","../src/dead-code/build-knip-config.ts","../src/dead-code/dedupe.ts","../src/dead-code/errors.ts","../src/dead-code/map-knip-diagnostic.ts","../src/check-dead-code.ts","../src/deps/exec-list.ts","../src/deps/list-vue-resolutions.ts","../src/deps/check-duplicate-vue.ts","../src/deps/check-vue-major-current.ts","../src/check-deps.ts","../src/project-info/parse-nuxt-config.ts","../src/nuxt/post-checks/compatibility-date-set.ts","../src/nuxt/post-checks/lang-on-html.ts","../src/nuxt/post-checks/nitro-cloudflare-preset.ts","../src/nuxt/post-checks/no-modules-incompatible-with-nuxt-4.ts","../src/nuxt/post-checks/no-node-only-modules.ts","../src/nuxt/post-checks/nuxt-major-current.ts","../src/nuxt/post-checks/og-image-via-satori.ts","../src/nuxt/post-checks/preset-defined-for-deploy-target.ts","../src/nuxt/post-checks/recommended-modules-installed.ts","../src/nuxt/post-checks/runtime-config-typed.ts","../src/nuxt/post-checks/uses-app-directory.ts","../src/check-nuxt-project.ts","../src/disables/parse-directives.ts","../src/disables/apply.ts","../src/code-snippet.ts","../src/project-info/fs-checks.ts","../src/project-info/path-exists.ts","../src/project-info/find-monorepo-root.ts","../src/project-info/resolve-dep-version.ts","../src/project-info/parse-nuxt-version.ts","../src/project-info/parse-vue-version.ts","../src/detect-project.ts","../src/file-scan.ts","../src/merge-diagnostics.ts","../src/oxlint/diagnostic.ts","../src/oxlint/generate-config.ts","../src/oxlint/resolve-plugin.ts","../src/oxlint/errors.ts","../src/oxlint/spawn.ts","../src/oxlint/run.ts","../src/score.ts","../src/sfc/parse-sfc-descriptor.ts","../src/sfc/rules/no-mixed-options-and-composition-api.ts","../src/nuxt/file-role.ts","../src/template/walk.ts","../src/sfc/rules/nuxt/no-mixed-app-and-root-layout.ts","../src/sfc/rules/nuxt/og-image-defined.ts","../src/sfc/rules/nuxt/use-seo-meta-on-public-page.ts","../src/sfc/rules/index.ts","../src/sfc/run.ts","../src/nuxt/cross-file/run.ts","../src/template/parse-sfc.ts","../src/template/directive-helpers.ts","../src/template/rules/v-for-has-key.ts","../src/template/rules/v-if-v-for-precedence.ts","../src/template/rules/v-memo-on-large-list.ts","../src/template/rules/no-inline-object-prop-in-list.ts","../src/template/rules/no-computed-getter-in-template-loop.ts","../src/template/rules/avoid-deep-v-bind-spread-in-list.ts","../src/template/rules/index.ts","../src/template/run.ts","../src/audit.ts","../src/config/define-config.ts","../src/config/merge-cli-overrides.ts","../src/git-scope.ts","../src/reporters/docs-url.ts","../src/reporters/render.ts","../src/reporters/agent.ts","../src/rule-docs.ts","../src/reporters/sarif.ts","../src/reporters/html.ts","../src/reporters/json.ts","../src/reporters/json-compact.ts","../src/reporters/pretty.ts","../src/reporters/verbose.ts","../src/reporters/index.ts"],"sourcesContent":["import type { Diagnostic } from './types.js';\n\nfunction escapeProperty(value: string): string {\n return value\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n\nfunction escapeData(value: string): string {\n return value.replace(/%/g, '%25').replace(/\\r/g, '%0D').replace(/\\n/g, '%0A');\n}\n\nexport function encodeAnnotation(diagnostic: Diagnostic): string {\n const level = diagnostic.severity === 'error' ? 'error' : 'warning';\n const props = [\n `file=${escapeProperty(diagnostic.file)}`,\n `line=${diagnostic.line}`,\n `col=${diagnostic.column}`,\n `title=${escapeProperty(diagnostic.ruleId)}`,\n ].join(',');\n return `::${level} ${props}::${escapeData(diagnostic.message)}`;\n}\n\nexport function encodeAnnotations(diagnostics: Diagnostic[]): string {\n return diagnostics.map(encodeAnnotation).join('\\n');\n}\n","import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nexport interface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[] | { packages?: string[] };\n engines?: Record<string, string>;\n}\n\nexport async function readPackageJson(\n dir: string,\n): Promise<PackageJson | null> {\n try {\n const source = await readFile(join(dir, 'package.json'), 'utf8');\n return JSON.parse(source) as PackageJson;\n } catch {\n return null;\n }\n}\n","import { dirname } from 'node:path';\nimport { readPackageJson } from '../project-info/read-package-json.js';\n\nexport interface PackageDeps {\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n}\n\nexport async function readDeps(\n packageJsonPath: string,\n): Promise<PackageDeps | null> {\n const pkg = await readPackageJson(dirname(packageJsonPath));\n if (pkg === null) return null;\n return {\n dependencies: pkg.dependencies ?? {},\n devDependencies: pkg.devDependencies ?? {},\n };\n}\n","import type { ProjectInfo } from '../types/project-info.js';\nimport type { BuildQualityIssue } from './types.js';\nimport { readDeps } from './read-deps.js';\n\nconst RULE_ID = 'vue-doctor/build-quality/eslint-plugin-vue-installed';\nconst DOCS = 'https://eslint.vuejs.org/';\n\nexport async function checkEslintPluginVue(\n projectInfo: ProjectInfo,\n): Promise<BuildQualityIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n if (projectInfo.framework !== 'vue' && projectInfo.framework !== 'nuxt') {\n return [];\n }\n\n const deps = await readDeps(projectInfo.packageJsonPath);\n if (deps === null) return [];\n if (deps.devDependencies['eslint-plugin-vue']) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath,\n line: 1,\n column: 1,\n severity: 'info',\n message: `eslint-plugin-vue is not in devDependencies; it catches many Vue-specific issues. See ${DOCS}`,\n recommendation: 'Add eslint-plugin-vue to devDependencies.',\n },\n ];\n}\n","import type { ProjectInfo } from '../types/project-info.js';\nimport type { BuildQualityIssue } from './types.js';\nimport { readDeps } from './read-deps.js';\n\nconst RULE_ID = 'vue-doctor/build-quality/no-vue-cli';\nconst DOCS = 'https://cli.vuejs.org/migrations/migrate-from-v4.html';\n\nfunction isOffendingKey(key: string): boolean {\n return key === '@vue/cli-service' || key.startsWith('vue-cli-plugin-');\n}\n\nexport async function checkNoVueCli(\n projectInfo: ProjectInfo,\n): Promise<BuildQualityIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n\n const deps = await readDeps(projectInfo.packageJsonPath);\n if (deps === null) return [];\n\n const offenders: string[] = [];\n for (const key of [\n ...Object.keys(deps.dependencies),\n ...Object.keys(deps.devDependencies),\n ]) {\n if (isOffendingKey(key) && !offenders.includes(key)) offenders.push(key);\n }\n\n return offenders.map((key, index) => ({\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath as string,\n line: index + 1,\n column: 1,\n severity: 'warn',\n message: `${key} indicates Vue CLI, which is deprecated; migrate to Vite. See ${DOCS}`,\n recommendation: `Remove ${key} and migrate the build to Vite.`,\n }));\n}\n","export function stripJsonComments(input: string): string {\n let out = '';\n let inString = false;\n let inLineComment = false;\n let inBlockComment = false;\n let escaped = false;\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const next = input[i + 1];\n\n if (inLineComment) {\n if (char === '\\n') {\n inLineComment = false;\n out += char;\n }\n continue;\n }\n\n if (inBlockComment) {\n if (char === '*' && next === '/') {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inString) {\n out += char;\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n out += char;\n continue;\n }\n\n if (char === '/' && next === '/') {\n inLineComment = true;\n i++;\n continue;\n }\n\n if (char === '/' && next === '*') {\n inBlockComment = true;\n i++;\n continue;\n }\n\n out += char;\n }\n\n return out;\n}\n","import { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { ProjectInfo } from '../types/project-info.js';\nimport type { BuildQualityIssue } from './types.js';\nimport { stripJsonComments } from './strip-json-comments.js';\n\nconst RULE_ID = 'vue-doctor/build-quality/tsconfig-strict-required';\nconst DOCS = 'https://www.typescriptlang.org/tsconfig#strict';\n\ninterface TsconfigShape {\n compilerOptions?: { strict?: unknown };\n}\n\nexport async function checkTsconfigStrict(\n projectInfo: ProjectInfo,\n): Promise<BuildQualityIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n\n const tsconfigPath = join(\n dirname(projectInfo.packageJsonPath),\n 'tsconfig.json',\n );\n\n let parsed: TsconfigShape;\n try {\n const source = await readFile(tsconfigPath, 'utf8');\n parsed = JSON.parse(stripJsonComments(source)) as TsconfigShape;\n } catch {\n return [];\n }\n\n if (parsed.compilerOptions?.strict === true) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: tsconfigPath,\n line: 1,\n column: 1,\n severity: 'warn',\n message: `tsconfig.json should set compilerOptions.strict to true for full type safety. See ${DOCS}`,\n recommendation: 'Set \"strict\": true in tsconfig.json compilerOptions.',\n },\n ];\n}\n","import type { ProjectInfo } from '../types/project-info.js';\nimport type { BuildQualityIssue } from './types.js';\nimport { readDeps } from './read-deps.js';\n\nconst RULE_ID = 'vue-doctor/build-quality/vue-tsc-in-devDeps';\nconst DOCS = 'https://github.com/vuejs/language-tools/tree/master/packages/tsc';\n\nexport async function checkVueTsc(\n projectInfo: ProjectInfo,\n): Promise<BuildQualityIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n if (projectInfo.framework !== 'vue' && projectInfo.framework !== 'nuxt') {\n return [];\n }\n\n const deps = await readDeps(projectInfo.packageJsonPath);\n if (deps === null) return [];\n if (deps.devDependencies['vue-tsc']) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath,\n line: 1,\n column: 1,\n severity: 'warn',\n message: `Vue projects should type-check with vue-tsc, but it is missing from devDependencies. See ${DOCS}`,\n recommendation: 'Add vue-tsc to devDependencies.',\n },\n ];\n}\n","import type { Diagnostic } from './types.js';\nimport type { ProjectInfo } from './types/project-info.js';\nimport { checkEslintPluginVue } from './build-quality/check-eslint-plugin-vue.js';\nimport { checkNoVueCli } from './build-quality/check-no-vue-cli.js';\nimport { checkTsconfigStrict } from './build-quality/check-tsconfig-strict.js';\nimport { checkVueTsc } from './build-quality/check-vue-tsc.js';\nimport type { BuildQualityIssue } from './build-quality/types.js';\n\nexport async function checkBuildQuality(\n projectInfo: ProjectInfo,\n): Promise<Diagnostic[]> {\n if (projectInfo.packageJsonPath === null) return [];\n\n const results = await Promise.all([\n checkTsconfigStrict(projectInfo),\n checkVueTsc(projectInfo),\n checkNoVueCli(projectInfo),\n checkEslintPluginVue(projectInfo),\n ]);\n\n const issues: BuildQualityIssue[] = results.flat();\n\n return issues.map((issue) => ({\n file: issue.file,\n line: issue.line,\n column: issue.column,\n ruleId: issue.ruleId,\n severity: issue.severity,\n message: issue.message,\n source: 'project',\n recommendation: issue.recommendation,\n }));\n}\n","import type { ProjectInfo } from '../types/project-info.js';\nimport type { ResolvedDoctorConfig } from '../config/types.js';\n\nexport interface KnipConfig {\n cwd: string;\n entry: string[];\n project: string[];\n ignoreFiles: string[];\n ignoreDependencies: string[];\n compilers?: Record<string, true>;\n}\n\nexport function buildKnipConfig(\n projectInfo: ProjectInfo,\n doctorConfig: ResolvedDoctorConfig,\n): KnipConfig {\n const isNuxt = projectInfo.framework === 'nuxt';\n\n const entry = isNuxt\n ? [\n 'app/**/*.vue',\n 'app/**/*.ts',\n 'server/**/*.ts',\n 'nuxt.config.{ts,js,mjs}',\n ]\n : ['src/main.{ts,js}', 'src/App.vue', 'index.html', 'vite.config.{ts,js}'];\n\n const config: KnipConfig = {\n cwd: projectInfo.rootDirectory,\n entry,\n project: [\n '**/*.{ts,vue}',\n '!**/node_modules/**',\n '!**/dist/**',\n '!**/.nuxt/**',\n '!**/knip.config.mjs',\n ],\n ignoreFiles: [...doctorConfig.exclude, 'knip.config.mjs'],\n ignoreDependencies: [\n 'vite-plus',\n '@geoql/vue-doctor',\n '@geoql/nuxt-doctor',\n ],\n };\n\n if (isNuxt) {\n config.compilers = { nuxt: true };\n }\n\n return config;\n}\n","import type { Diagnostic } from '../types.js';\n\nexport function dedupeDeadCodeAgainstLint(\n deadCode: Diagnostic[],\n lint: Diagnostic[],\n): Diagnostic[] {\n const lintFiles = new Set(lint.map((d) => d.file));\n return deadCode.filter(\n (d) => !(d.ruleId === 'dead-code/unused-file' && lintFiles.has(d.file)),\n );\n}\n","export class DeadCodeTimeoutError extends Error {\n override name = 'DeadCodeTimeoutError' as const;\n\n constructor(timeoutMs: number) {\n super(`Dead-code analysis timed out after ${timeoutMs}ms`);\n }\n}\n\nexport class DeadCodeImportFailed extends Error {\n override name = 'DeadCodeImportFailed' as const;\n\n constructor(cause?: unknown) {\n const message =\n cause instanceof Error\n ? `Failed to import knip: ${cause.message}`\n : 'Failed to import knip';\n super(message, { cause });\n }\n}\n","import { resolve } from 'node:path';\nimport type { Diagnostic, Severity } from '../types.js';\nimport type { KnipIssue, KnipIssueKind } from './types.js';\n\nconst KIND_MAP: Record<\n KnipIssueKind,\n { ruleId: string; severity: Severity; message: string } | null\n> = {\n files: {\n ruleId: 'dead-code/unused-file',\n severity: 'warn',\n message: 'Unused file',\n },\n exports: {\n ruleId: 'dead-code/unused-export',\n severity: 'warn',\n message: 'Unused export',\n },\n types: {\n ruleId: 'dead-code/unused-type-export',\n severity: 'info',\n message: 'Unused type export',\n },\n enumMembers: {\n ruleId: 'dead-code/unused-member',\n severity: 'info',\n message: 'Unused enum member',\n },\n namespaceMembers: {\n ruleId: 'dead-code/unused-member',\n severity: 'info',\n message: 'Unused namespace member',\n },\n deps: {\n ruleId: 'dead-code/unused-dependency',\n severity: 'warn',\n message: 'Unused dependency',\n },\n devDependencies: {\n ruleId: 'dead-code/unused-dependency',\n severity: 'warn',\n message: 'Unused devDependency',\n },\n unlisted: {\n ruleId: 'dead-code/unlisted-dependency',\n severity: 'error',\n message: 'Unlisted dependency',\n },\n duplicates: {\n ruleId: 'dead-code/duplicate-export',\n severity: 'warn',\n message: 'Duplicate export',\n },\n nsExports: null,\n nsTypes: null,\n optionalPeerDependencies: null,\n binaries: null,\n unresolved: null,\n catalog: null,\n};\n\nexport function mapKnipDiagnostic(\n rootDirectory: string,\n issue: KnipIssue,\n): Diagnostic | null {\n const mapping = KIND_MAP[issue.kind];\n if (!mapping) return null;\n\n return {\n file: resolve(rootDirectory, issue.file),\n line: issue.line ?? 1,\n column: issue.col ?? 1,\n ruleId: mapping.ruleId,\n severity: mapping.severity,\n message: issue.symbol\n ? `${mapping.message}: ${issue.symbol}`\n : mapping.message,\n source: 'dead-code',\n };\n}\n","import { join } from 'node:path';\nimport { createRequire } from 'node:module';\nimport type { Diagnostic } from './types.js';\nimport type { ProjectInfo } from './types/project-info.js';\nimport type { ResolvedDoctorConfig } from './config/types.js';\nimport { buildKnipConfig } from './dead-code/build-knip-config.js';\nimport { dedupeDeadCodeAgainstLint } from './dead-code/dedupe.js';\nimport {\n DeadCodeImportFailed,\n DeadCodeTimeoutError,\n} from './dead-code/errors.js';\nimport { mapKnipDiagnostic } from './dead-code/map-knip-diagnostic.js';\nimport type { KnipIssue, KnipIssueKind } from './dead-code/types.js';\n\ninterface CheckDeadCodeOptions {\n projectInfo: ProjectInfo;\n doctorConfig: ResolvedDoctorConfig;\n enabled: boolean;\n timeoutMs?: number;\n}\n\ninterface KnipIssueEntry {\n filePath: string;\n symbol: string;\n line?: number;\n col?: number;\n type: string;\n}\n\ntype KnipIssueRecords = Record<string, Record<string, KnipIssueEntry>>;\n\ninterface KnipIssues {\n files: KnipIssueRecords;\n exports: KnipIssueRecords;\n types: KnipIssueRecords;\n deps: KnipIssueRecords;\n devDependencies: KnipIssueRecords;\n unlisted: KnipIssueRecords;\n duplicates: KnipIssueRecords;\n enumMembers: KnipIssueRecords;\n namespaceMembers: KnipIssueRecords;\n nsExports: KnipIssueRecords;\n nsTypes: KnipIssueRecords;\n optionalPeerDependencies: KnipIssueRecords;\n binaries: KnipIssueRecords;\n unresolved: KnipIssueRecords;\n catalog: KnipIssueRecords;\n}\n\nconst MAPPED_KINDS: KnipIssueKind[] = [\n 'files',\n 'exports',\n 'types',\n 'deps',\n 'devDependencies',\n 'unlisted',\n 'duplicates',\n 'enumMembers',\n 'namespaceMembers',\n];\n\nfunction flattenKnipIssues(issues: KnipIssues): KnipIssue[] {\n const out: KnipIssue[] = [];\n for (const kind of MAPPED_KINDS) {\n const records = issues[kind];\n if (!records) continue;\n for (const filePath of Object.keys(records)) {\n const symbols = records[filePath];\n for (const symbolName of Object.keys(symbols)) {\n const entry = symbols[symbolName];\n out.push({\n file: entry.filePath,\n symbol: entry.symbol,\n line: entry.line,\n col: entry.col,\n kind,\n });\n }\n }\n }\n return out;\n}\n\nexport const _knipLoader = {\n load: async (): Promise<{\n createOptions: (opts: { cwd: string }) => Promise<Record<string, unknown>>;\n run: (\n opts: Record<string, unknown>,\n ) => Promise<{ results: { issues: KnipIssues } }>;\n }> => {\n const require = createRequire(import.meta.url);\n const knipMainPath = require.resolve('knip');\n const knipDir = knipMainPath.replace(/\\/dist\\/index\\.js$/, '');\n\n const { pathToFileURL } = await import('node:url');\n const createOptionsUrl = pathToFileURL(\n join(knipDir, 'dist', 'util', 'create-options.js'),\n ).href;\n const runUrl = pathToFileURL(join(knipDir, 'dist', 'run.js')).href;\n\n const createOptionsModule = (await import(createOptionsUrl)) as {\n createOptions: (opts: {\n cwd: string;\n }) => Promise<Record<string, unknown>>;\n };\n const runModule = (await import(runUrl)) as {\n run: (\n opts: Record<string, unknown>,\n ) => Promise<{ results: { issues: KnipIssues } }>;\n };\n\n return {\n createOptions: createOptionsModule.createOptions,\n run: runModule.run,\n };\n },\n};\n\nexport async function checkDeadCode(\n options: CheckDeadCodeOptions,\n): Promise<Diagnostic[]> {\n if (!options.enabled) return [];\n\n const config = buildKnipConfig(options.projectInfo, options.doctorConfig);\n const timeoutMs = options.timeoutMs ?? 30_000;\n\n let createOptions: (opts: {\n cwd: string;\n }) => Promise<Record<string, unknown>>;\n let run: (\n opts: Record<string, unknown>,\n ) => Promise<{ results: { issues: KnipIssues } }>;\n try {\n const internals = await _knipLoader.load();\n createOptions = internals.createOptions;\n run = internals.run;\n } catch (err) {\n throw new DeadCodeImportFailed(err);\n }\n\n const knipOptions = await createOptions({\n cwd: options.projectInfo.rootDirectory,\n entry: config.entry,\n project: config.project,\n ignoreFiles: config.ignoreFiles,\n ignoreDependencies: config.ignoreDependencies,\n ...(config.compilers ? { compilers: config.compilers } : {}),\n });\n\n const result = await Promise.race([\n run(knipOptions),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new DeadCodeTimeoutError(timeoutMs)), timeoutMs),\n ),\n ]);\n\n const allIssues = flattenKnipIssues(result.results.issues);\n const diagnostics = allIssues\n .map((issue) => mapKnipDiagnostic(options.projectInfo.rootDirectory, issue))\n .filter((d): d is Diagnostic => d !== null);\n\n diagnostics.sort((a, b) => {\n if (a.file !== b.file) return a.file < b.file ? -1 : 1;\n if (a.line !== b.line) return a.line - b.line;\n return a.ruleId.localeCompare(b.ruleId);\n });\n\n return diagnostics;\n}\n\nexport {\n dedupeDeadCodeAgainstLint,\n DeadCodeImportFailed,\n DeadCodeTimeoutError,\n};\n","import { execFile } from 'node:child_process';\n\ninterface PnpmListEntry {\n dependencies?: Record<string, { version: string }>;\n devDependencies?: Record<string, { version: string }>;\n peers?: Array<{ name: string; version: string }>;\n}\n\nfunction collectVersions(entry: PnpmListEntry, versions: Set<string>): void {\n if (entry.dependencies) {\n for (const [name, info] of Object.entries(entry.dependencies)) {\n if (name === 'vue' && info.version) {\n versions.add(info.version);\n }\n }\n }\n if (entry.devDependencies) {\n for (const [name, info] of Object.entries(entry.devDependencies)) {\n if (name === 'vue' && info.version) {\n versions.add(info.version);\n }\n }\n }\n if (entry.peers) {\n for (const peer of entry.peers) {\n if (peer.name === 'vue' && peer.version) {\n versions.add(peer.version);\n }\n }\n }\n}\n\nexport async function runPnpmList(\n rootDir: string,\n): Promise<\n { versions: string[]; error: null } | { versions: []; error: Error }\n> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve({ versions: [], error: new Error('timeout') });\n }, 10_000);\n\n execFile(\n 'pnpm',\n ['list', 'vue', '--depth', 'Infinity', '--json'],\n { cwd: rootDir, timeout: 10_000 },\n (error: Error | null, stdout: string, stderr: string) => {\n clearTimeout(timeout);\n if (error || stderr) {\n resolve({ versions: [], error: error ?? new Error(stderr) });\n return;\n }\n try {\n const parsed = JSON.parse(stdout) as PnpmListEntry[];\n const versions = new Set<string>();\n for (const entry of parsed) {\n collectVersions(entry, versions);\n }\n resolve({ versions: [...versions], error: null });\n } catch {\n resolve({ versions: [], error: new Error('parse error') });\n }\n },\n );\n });\n}\n\nexport async function runNpmList(\n rootDir: string,\n): Promise<\n { versions: string[]; error: null } | { versions: []; error: Error }\n> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve({ versions: [], error: new Error('timeout') });\n }, 10_000);\n\n execFile(\n 'npm',\n ['ls', 'vue', '--all', '--json'],\n { cwd: rootDir, timeout: 10_000 },\n (error: Error | null, stdout: string, stderr: string) => {\n clearTimeout(timeout);\n if (error || stderr) {\n resolve({ versions: [], error: error ?? new Error(stderr) });\n return;\n }\n try {\n const parsed = JSON.parse(stdout) as PnpmListEntry;\n const versions = new Set<string>();\n collectVersions(parsed, versions);\n resolve({ versions: [...versions], error: null });\n } catch {\n resolve({ versions: [], error: new Error('parse error') });\n }\n },\n );\n });\n}\n","import { dirname } from 'node:path';\nimport { runPnpmList, runNpmList } from './exec-list.js';\n\nexport async function listVueResolutions(\n packageJsonPath: string,\n): Promise<string[]> {\n const rootDir = dirname(packageJsonPath);\n\n const pnpmResult = await runPnpmList(rootDir);\n if (pnpmResult.error === null) {\n return pnpmResult.versions;\n }\n\n const npmResult = await runNpmList(rootDir);\n if (npmResult.error === null) {\n return npmResult.versions;\n }\n\n return [];\n}\n","import type { ProjectInfo } from '../types/project-info.js';\nimport { listVueResolutions } from './list-vue-resolutions.js';\nimport type { DepsIssue } from './types.js';\n\nconst RULE_ID = 'vue-doctor/deps/duplicate-vue-versions';\n\nexport async function checkDuplicateVue(\n projectInfo: ProjectInfo,\n): Promise<DepsIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n\n const versions = await listVueResolutions(projectInfo.packageJsonPath);\n\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length <= 1) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath,\n line: 1,\n column: 1,\n severity: 'error',\n message: `Multiple versions of vue detected in node_modules: ${uniqueVersions.join(', ')}. Vue's reactivity system requires a single instance.`,\n recommendation:\n 'Add \"vue\": \"^3.5.0\" to pnpm.overrides (or npm overrides) to deduplicate. Run pnpm dedupe.',\n versions: uniqueVersions,\n },\n ];\n}\n","import type { ProjectInfo } from '../types/project-info.js';\nimport type { DepsIssue } from './types.js';\n\nconst RULE_ID = 'vue-doctor/deps/vue-major-current';\n\nconst DOCTOR_BUNDLED_VUE_FLOOR_MAJOR = 3;\nconst DOCTOR_BUNDLED_VUE_FLOOR_MINOR = 5;\n\nfunction parseMajorMinor(\n version: string,\n): { major: number; minor: number } | null {\n const match = /^v?(\\d+)\\.(\\d+)/.exec(version.trim());\n if (!match) return null;\n return { major: Number(match[1]), minor: Number(match[2]) };\n}\n\nexport function checkVueMajorCurrent(projectInfo: ProjectInfo): DepsIssue[] {\n if (projectInfo.packageJsonPath === null) return [];\n if (projectInfo.vueVersion === null) return [];\n\n const parsed = parseMajorMinor(projectInfo.vueVersion);\n if (parsed === null) return [];\n\n if (parsed.major !== DOCTOR_BUNDLED_VUE_FLOOR_MAJOR) return [];\n if (parsed.minor >= DOCTOR_BUNDLED_VUE_FLOOR_MINOR) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath,\n line: 1,\n column: 1,\n severity: 'info',\n message: `Vue ${projectInfo.vueVersion} is older than the doctor-bundled floor (^${DOCTOR_BUNDLED_VUE_FLOOR_MAJOR}.${DOCTOR_BUNDLED_VUE_FLOOR_MINOR}.0). Newer minors often ship rule-relevant features (e.g. 3.4 reactive props destructure, 3.5 useTemplateRef).`,\n recommendation: `Bump \"vue\" to ^${DOCTOR_BUNDLED_VUE_FLOOR_MAJOR}.${DOCTOR_BUNDLED_VUE_FLOOR_MINOR}.0 or later in package.json.`,\n },\n ];\n}\n","import type { Diagnostic } from './types.js';\nimport type { ProjectInfo } from './types/project-info.js';\nimport { checkDuplicateVue } from './deps/check-duplicate-vue.js';\nimport { checkVueMajorCurrent } from './deps/check-vue-major-current.js';\nimport type { DepsIssue } from './deps/types.js';\n\nexport async function checkDeps(\n projectInfo: ProjectInfo,\n): Promise<Diagnostic[]> {\n if (projectInfo.packageJsonPath === null) return [];\n\n const results = await Promise.all([\n checkDuplicateVue(projectInfo),\n Promise.resolve(checkVueMajorCurrent(projectInfo)),\n ]);\n\n const issues: DepsIssue[] = results.flat();\n\n return issues.map((issue) => ({\n file: issue.file,\n line: issue.line,\n column: issue.column,\n ruleId: issue.ruleId,\n severity: issue.severity,\n message: issue.message,\n source: 'deps',\n recommendation: issue.recommendation,\n }));\n}\n","import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { parseSync } from 'oxc-parser';\n\nexport interface NuxtConfigInfo {\n compatibilityVersion?: number;\n compatibilityDate?: string;\n nitroPreset?: string;\n modules?: string[];\n importsAutoImport?: boolean;\n hasRuntimeConfig?: boolean;\n htmlLang?: string;\n}\n\ninterface AstNode {\n type: string;\n [key: string]: unknown;\n}\n\nconst CONFIG_FILES = ['nuxt.config.ts', 'nuxt.config.js', 'nuxt.config.mjs'];\n\nasync function readConfigSource(dir: string): Promise<string | null> {\n for (const name of CONFIG_FILES) {\n try {\n return await readFile(join(dir, name), 'utf8');\n } catch {\n continue;\n }\n }\n return null;\n}\n\nfunction* objectEntries(obj: AstNode): Generator<[string, AstNode]> {\n for (const prop of obj.properties as AstNode[]) {\n if (prop.type !== 'Property') continue;\n const key = prop.key as AstNode;\n if (key.type !== 'Identifier') continue;\n yield [key.name as string, prop.value as AstNode];\n }\n}\n\nfunction findEntry(obj: AstNode, name: string): AstNode | undefined {\n for (const [key, value] of objectEntries(obj)) {\n if (key === name) return value;\n }\n return undefined;\n}\n\nfunction stringLiteral(node: AstNode): string | undefined {\n return node.type === 'Literal' && typeof node.value === 'string'\n ? node.value\n : undefined;\n}\n\nfunction unwrapDefault(decl: AstNode): AstNode | null {\n if (decl.type !== 'CallExpression') return decl;\n const callee = decl.callee as AstNode;\n if (callee.type !== 'Identifier') return null;\n if (callee.name !== 'defineNuxtConfig') return null;\n return (decl.arguments as AstNode[])[0] ?? null;\n}\n\nfunction extractConfigObject(source: string): AstNode | null {\n const result = parseSync('nuxt.config.ts', source, {\n sourceType: 'module',\n lang: 'ts',\n });\n const body = (result.program as unknown as AstNode).body as AstNode[];\n const exported = body.find((n) => n.type === 'ExportDefaultDeclaration');\n if (!exported) return null;\n const node = unwrapDefault(exported.declaration as AstNode);\n if (!node) return null;\n return node.type === 'ObjectExpression' ? node : null;\n}\n\nfunction readNitroPreset(value: AstNode): string | undefined {\n if (value.type !== 'ObjectExpression') return undefined;\n const preset = findEntry(value, 'preset');\n return preset ? stringLiteral(preset) : undefined;\n}\n\nfunction readImportsAutoImport(value: AstNode): boolean | undefined {\n if (value.type !== 'ObjectExpression') return undefined;\n const node = findEntry(value, 'autoImport');\n if (node?.type === 'Literal' && typeof node.value === 'boolean') {\n return node.value;\n }\n return undefined;\n}\n\nfunction readModules(value: AstNode): string[] | undefined {\n if (value.type !== 'ArrayExpression') return undefined;\n const out: string[] = [];\n for (const element of value.elements as (AstNode | null)[]) {\n if (!element) continue;\n const str = stringLiteral(element);\n if (str !== undefined) out.push(str);\n }\n return out;\n}\n\nfunction readCompatibility(value: AstNode): number | undefined {\n return value.type === 'Literal' && typeof value.value === 'number'\n ? value.value\n : undefined;\n}\n\nfunction readHtmlLang(value: AstNode): string | undefined {\n if (value.type !== 'ObjectExpression') return undefined;\n const head = findEntry(value, 'head');\n if (head?.type !== 'ObjectExpression') return undefined;\n const htmlAttrs = findEntry(head, 'htmlAttrs');\n if (htmlAttrs?.type !== 'ObjectExpression') return undefined;\n const lang = findEntry(htmlAttrs, 'lang');\n return lang ? stringLiteral(lang) : undefined;\n}\n\nexport async function parseNuxtConfig(\n dir: string,\n): Promise<NuxtConfigInfo | null> {\n const source = await readConfigSource(dir);\n if (source === null) return null;\n\n const info: NuxtConfigInfo = {};\n const config = extractConfigObject(source);\n if (!config) return info;\n\n for (const [key, value] of objectEntries(config)) {\n if (key === 'compatibilityVersion') {\n const compat = readCompatibility(value);\n if (compat !== undefined) info.compatibilityVersion = compat;\n } else if (key === 'compatibilityDate') {\n const date = stringLiteral(value);\n if (date !== undefined) info.compatibilityDate = date;\n } else if (key === 'nitro') {\n const preset = readNitroPreset(value);\n if (preset !== undefined) info.nitroPreset = preset;\n } else if (key === 'modules') {\n const modules = readModules(value);\n if (modules !== undefined) info.modules = modules;\n } else if (key === 'imports') {\n const autoImport = readImportsAutoImport(value);\n if (autoImport !== undefined) info.importsAutoImport = autoImport;\n } else if (key === 'runtimeConfig') {\n info.hasRuntimeConfig = true;\n } else if (key === 'app') {\n const lang = readHtmlLang(value);\n if (lang !== undefined) info.htmlLang = lang;\n }\n }\n return info;\n}\n","import type { NuxtConfigInfo } from '../../project-info/parse-nuxt-config.js';\nimport type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/nitro/compatibilityDate-set';\n\nexport function checkCompatibilityDateSet(\n projectInfo: ProjectInfo,\n nuxtConfig: NuxtConfigInfo | null,\n): NuxtPostCheckIssue[] {\n if (projectInfo.packageJsonPath === null) return [];\n if (nuxtConfig?.compatibilityDate !== undefined) return [];\n\n const file = projectInfo.nuxtConfigPath ?? projectInfo.packageJsonPath;\n\n return [\n {\n ruleId: RULE_ID,\n file,\n line: 1,\n column: 1,\n severity: 'error',\n message:\n 'No compatibilityDate is set. Nuxt 4 and Nitro require a compatibilityDate to pin deployment behaviour.',\n recommendation:\n \"Add compatibilityDate: 'YYYY-MM-DD' to defineNuxtConfig in nuxt.config.\",\n },\n ];\n}\n","import type { NuxtConfigInfo } from '../../project-info/parse-nuxt-config.js';\nimport type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/seo/lang-on-html';\n\nexport function checkLangOnHtml(\n projectInfo: ProjectInfo,\n nuxtConfig: NuxtConfigInfo | null,\n): NuxtPostCheckIssue[] {\n if (projectInfo.packageJsonPath === null) return [];\n if (nuxtConfig?.htmlLang !== undefined) return [];\n\n const file = projectInfo.nuxtConfigPath ?? projectInfo.packageJsonPath;\n\n return [\n {\n ruleId: RULE_ID,\n file,\n line: 1,\n column: 1,\n severity: 'warn',\n message:\n 'No lang attribute is set on the html element. Screen readers and search engines rely on it.',\n recommendation:\n \"Set app.head.htmlAttrs.lang (e.g. 'en') in defineNuxtConfig.\",\n },\n ];\n}\n","import type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/cloudflare/nitro-cloudflare-preset';\n\nconst CLOUDFLARE_PRESETS = new Set([\n 'cloudflare-pages',\n 'cloudflare-module',\n 'cloudflare',\n]);\n\nexport function checkNitroCloudflarePreset(\n projectInfo: ProjectInfo,\n): NuxtPostCheckIssue[] {\n if (projectInfo.packageJsonPath === null) return [];\n if (!projectInfo.hasWranglerConfig) return [];\n if (projectInfo.nitroPreset === null) return [];\n if (CLOUDFLARE_PRESETS.has(projectInfo.nitroPreset)) return [];\n\n const file = projectInfo.nuxtConfigPath ?? projectInfo.packageJsonPath;\n\n return [\n {\n ruleId: RULE_ID,\n file,\n line: 1,\n column: 1,\n severity: 'warn',\n message: `A wrangler config is present but the Nitro preset is '${projectInfo.nitroPreset}', not a Cloudflare preset.`,\n recommendation:\n \"Set nitro.preset to 'cloudflare-module' (or 'cloudflare-pages') to deploy on Cloudflare.\",\n },\n ];\n}\n","import { readDeps } from '../../build-quality/read-deps.js';\nimport type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/modules-deps/no-modules-incompatible-with-nuxt-4';\n\nconst INCOMPATIBLE_MODULES = new Set([\n '@nuxtjs/composition-api',\n '@nuxt/bridge',\n 'nuxt-property-decorator',\n]);\n\nexport async function checkNoModulesIncompatibleWithNuxt4(\n projectInfo: ProjectInfo,\n): Promise<NuxtPostCheckIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n\n const deps = await readDeps(projectInfo.packageJsonPath);\n if (deps === null) return [];\n\n const offenders: string[] = [];\n for (const key of [\n ...Object.keys(deps.dependencies),\n ...Object.keys(deps.devDependencies),\n ]) {\n if (INCOMPATIBLE_MODULES.has(key) && !offenders.includes(key)) {\n offenders.push(key);\n }\n }\n\n return offenders.map((name, index) => ({\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath as string,\n line: index + 1,\n column: 1,\n severity: 'warn',\n message: `${name} is incompatible with Nuxt 4 and is no longer maintained.`,\n recommendation: `Remove ${name} and adopt the Nuxt 4 native equivalent.`,\n }));\n}\n","import { readDeps } from '../../build-quality/read-deps.js';\nimport type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/cloudflare/no-node-only-modules';\n\n// Modules that rely on native bindings or the Node runtime and do not work on\n// the Cloudflare Workers runtime without a compatible replacement.\nconst NODE_ONLY_MODULES = new Set(['fs-extra', 'sharp']);\n\nexport async function checkNoNodeOnlyModules(\n projectInfo: ProjectInfo,\n): Promise<NuxtPostCheckIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n if (!projectInfo.hasWranglerConfig) return [];\n\n const deps = await readDeps(projectInfo.packageJsonPath);\n if (deps === null) return [];\n\n const offenders: string[] = [];\n for (const key of [\n ...Object.keys(deps.dependencies),\n ...Object.keys(deps.devDependencies),\n ]) {\n if (NODE_ONLY_MODULES.has(key) && !offenders.includes(key)) {\n offenders.push(key);\n }\n }\n\n return offenders.map((name, index) => ({\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath as string,\n line: index + 1,\n column: 1,\n severity: 'warn',\n message: `${name} is a Node-only module and does not run on the Cloudflare Workers runtime.`,\n recommendation: `Replace ${name} with a Workers-compatible alternative or move it to a build-only step.`,\n }));\n}\n","import type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/structure/nuxt-major-current';\n\nconst DOCTOR_BUNDLED_NUXT_FLOOR_MAJOR = 4;\nconst DOCTOR_BUNDLED_NUXT_FLOOR_MINOR = 4;\n\nfunction parseMajorMinor(\n version: string,\n): { major: number; minor: number } | null {\n const match = /^v?(\\d+)\\.(\\d+)/.exec(version.trim());\n if (!match) return null;\n return { major: Number(match[1]), minor: Number(match[2]) };\n}\n\nexport function checkNuxtMajorCurrent(\n projectInfo: ProjectInfo,\n): NuxtPostCheckIssue[] {\n if (projectInfo.packageJsonPath === null) return [];\n if (projectInfo.nuxtVersion === null) return [];\n\n const parsed = parseMajorMinor(projectInfo.nuxtVersion);\n if (parsed === null) return [];\n\n if (parsed.major !== DOCTOR_BUNDLED_NUXT_FLOOR_MAJOR) return [];\n if (parsed.minor >= DOCTOR_BUNDLED_NUXT_FLOOR_MINOR) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath,\n line: 1,\n column: 1,\n severity: 'info',\n message: `Nuxt ${projectInfo.nuxtVersion} is older than the doctor-bundled floor (^${DOCTOR_BUNDLED_NUXT_FLOOR_MAJOR}.${DOCTOR_BUNDLED_NUXT_FLOOR_MINOR}.0). Newer minors ship rule-relevant fixes and Nitro improvements.`,\n recommendation: `Bump \"nuxt\" to ^${DOCTOR_BUNDLED_NUXT_FLOOR_MAJOR}.${DOCTOR_BUNDLED_NUXT_FLOOR_MINOR}.0 or later in package.json.`,\n },\n ];\n}\n","import { readDeps } from '../../build-quality/read-deps.js';\nimport type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/cloudflare/og-image-via-satori';\n\nconst OG_IMAGE_MODULES = ['@nuxtjs/og-image', 'nuxt-og-image'];\n\nexport async function checkOgImageViaSatori(\n projectInfo: ProjectInfo,\n): Promise<NuxtPostCheckIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n if (!projectInfo.hasWranglerConfig) return [];\n\n const deps = await readDeps(projectInfo.packageJsonPath);\n if (deps === null) return [];\n\n const installed = new Set([\n ...Object.keys(deps.dependencies),\n ...Object.keys(deps.devDependencies),\n ]);\n if (OG_IMAGE_MODULES.some((name) => installed.has(name))) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath,\n line: 1,\n column: 1,\n severity: 'info',\n message:\n 'Running on Cloudflare with no OG image module installed; dynamic social images are unconfigured.',\n recommendation:\n 'Add @nuxtjs/og-image to generate Satori-based OG images that run on Cloudflare Workers.',\n },\n ];\n}\n","import type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/nitro/preset-defined-for-deploy-target';\n\nexport function checkPresetDefinedForDeployTarget(\n projectInfo: ProjectInfo,\n): NuxtPostCheckIssue[] {\n if (projectInfo.packageJsonPath === null) return [];\n if (!projectInfo.hasWranglerConfig) return [];\n if (projectInfo.nitroPreset !== null) return [];\n\n const file = projectInfo.nuxtConfigPath ?? projectInfo.packageJsonPath;\n\n return [\n {\n ruleId: RULE_ID,\n file,\n line: 1,\n column: 1,\n severity: 'warn',\n message:\n 'A wrangler config is present but no Nitro preset is defined for the deploy target.',\n recommendation:\n \"Set nitro.preset in nuxt.config (e.g. 'cloudflare-module') to match your deploy target.\",\n },\n ];\n}\n","import { readDeps } from '../../build-quality/read-deps.js';\nimport type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/modules-deps/recommended-modules-installed';\n\ninterface RecommendedGroup {\n readonly label: string;\n readonly candidates: readonly string[];\n}\n\nconst RECOMMENDED_GROUPS: readonly RecommendedGroup[] = [\n { label: '@nuxt/image', candidates: ['@nuxt/image'] },\n { label: '@nuxtjs/seo', candidates: ['@nuxtjs/seo', '@nuxtjs/sitemap'] },\n { label: '@nuxt/fonts', candidates: ['@nuxt/fonts'] },\n];\n\nexport async function checkRecommendedModulesInstalled(\n projectInfo: ProjectInfo,\n): Promise<NuxtPostCheckIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n\n const deps = await readDeps(projectInfo.packageJsonPath);\n if (deps === null) return [];\n\n const installed = new Set([\n ...Object.keys(deps.dependencies),\n ...Object.keys(deps.devDependencies),\n ]);\n\n const missing = RECOMMENDED_GROUPS.filter(\n (group) => !group.candidates.some((name) => installed.has(name)),\n );\n\n return missing.map((group, index) => ({\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath as string,\n line: index + 1,\n column: 1,\n severity: 'info',\n message: `Recommended Nuxt 4 module ${group.label} is not installed.`,\n recommendation: `Add ${group.label} to dependencies to improve image, SEO, or font handling.`,\n }));\n}\n","import { readFile, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { NuxtConfigInfo } from '../../project-info/parse-nuxt-config.js';\nimport type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/nitro/runtime-config-typed';\n\nasync function hasRuntimeConfigAugmentation(dir: string): Promise<boolean> {\n const entries = await readdir(dir);\n for (const name of entries) {\n if (!name.endsWith('.d.ts')) continue;\n const source = await readFile(join(dir, name), 'utf8');\n if (source.includes('RuntimeConfig')) return true;\n }\n return false;\n}\n\nexport async function checkRuntimeConfigTyped(\n projectInfo: ProjectInfo,\n nuxtConfig: NuxtConfigInfo | null,\n): Promise<NuxtPostCheckIssue[]> {\n if (projectInfo.packageJsonPath === null) return [];\n if (nuxtConfig?.hasRuntimeConfig !== true) return [];\n\n if (await hasRuntimeConfigAugmentation(projectInfo.rootDirectory)) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath,\n line: 1,\n column: 1,\n severity: 'info',\n message:\n 'runtimeConfig is defined but no RuntimeConfig type augmentation was found, so runtime config access is untyped.',\n recommendation:\n \"Augment 'nuxt/schema' with a RuntimeConfig interface in a .d.ts file to type useRuntimeConfig().\",\n },\n ];\n}\n","import type { ProjectInfo } from '../../types/project-info.js';\nimport type { NuxtPostCheckIssue } from './types.js';\n\nconst RULE_ID = 'nuxt-doctor/structure/uses-app-directory';\n\nexport function checkUsesAppDirectory(\n projectInfo: ProjectInfo,\n): NuxtPostCheckIssue[] {\n if (projectInfo.packageJsonPath === null) return [];\n if (projectInfo.hasAppDir) return [];\n\n return [\n {\n ruleId: RULE_ID,\n file: projectInfo.packageJsonPath,\n line: 1,\n column: 1,\n severity: 'warn',\n message:\n 'No app/ directory found. Nuxt 4 expects source under app/ (app/pages, app/components, app/app.vue).',\n recommendation:\n 'Create an app/ directory and move pages, components, layouts, and app.vue into it.',\n },\n ];\n}\n","import { parseNuxtConfig } from './project-info/parse-nuxt-config.js';\nimport { checkCompatibilityDateSet } from './nuxt/post-checks/compatibility-date-set.js';\nimport { checkLangOnHtml } from './nuxt/post-checks/lang-on-html.js';\nimport { checkNitroCloudflarePreset } from './nuxt/post-checks/nitro-cloudflare-preset.js';\nimport { checkNoModulesIncompatibleWithNuxt4 } from './nuxt/post-checks/no-modules-incompatible-with-nuxt-4.js';\nimport { checkNoNodeOnlyModules } from './nuxt/post-checks/no-node-only-modules.js';\nimport { checkNuxtMajorCurrent } from './nuxt/post-checks/nuxt-major-current.js';\nimport { checkOgImageViaSatori } from './nuxt/post-checks/og-image-via-satori.js';\nimport { checkPresetDefinedForDeployTarget } from './nuxt/post-checks/preset-defined-for-deploy-target.js';\nimport { checkRecommendedModulesInstalled } from './nuxt/post-checks/recommended-modules-installed.js';\nimport { checkRuntimeConfigTyped } from './nuxt/post-checks/runtime-config-typed.js';\nimport type { NuxtPostCheckIssue } from './nuxt/post-checks/types.js';\nimport { checkUsesAppDirectory } from './nuxt/post-checks/uses-app-directory.js';\nimport type { Diagnostic } from './types.js';\nimport type { ProjectInfo } from './types/project-info.js';\n\nexport async function checkNuxtProject(\n projectInfo: ProjectInfo,\n): Promise<Diagnostic[]> {\n if (projectInfo.packageJsonPath === null) return [];\n if (projectInfo.framework !== 'nuxt') return [];\n\n const nuxtConfig = await parseNuxtConfig(projectInfo.rootDirectory);\n\n const results = await Promise.all([\n Promise.resolve(checkUsesAppDirectory(projectInfo)),\n Promise.resolve(checkNuxtMajorCurrent(projectInfo)),\n checkNoModulesIncompatibleWithNuxt4(projectInfo),\n checkRecommendedModulesInstalled(projectInfo),\n Promise.resolve(checkCompatibilityDateSet(projectInfo, nuxtConfig)),\n Promise.resolve(checkPresetDefinedForDeployTarget(projectInfo)),\n checkRuntimeConfigTyped(projectInfo, nuxtConfig),\n Promise.resolve(checkLangOnHtml(projectInfo, nuxtConfig)),\n Promise.resolve(checkNitroCloudflarePreset(projectInfo)),\n checkOgImageViaSatori(projectInfo),\n checkNoNodeOnlyModules(projectInfo),\n ]);\n\n const issues: NuxtPostCheckIssue[] = results.flat();\n\n return issues.map((issue) => ({\n file: issue.file,\n line: issue.line,\n column: issue.column,\n ruleId: issue.ruleId,\n severity: issue.severity,\n message: issue.message,\n source: 'project',\n recommendation: issue.recommendation,\n }));\n}\n","export interface DirectiveRange {\n start: number;\n end: number;\n rules: string[];\n}\n\nexport interface DirectiveLine {\n line: number;\n rules: string[];\n}\n\nexport interface DirectiveSet {\n blocks: DirectiveRange[];\n nextLine: DirectiveLine[];\n sameLine: DirectiveLine[];\n}\n\nconst DIRECTIVE =\n /doctor-(disable-next-line|disable-line|disable|enable)\\b(.*)/;\n\nfunction parseRuleList(raw: string): string[] {\n return raw\n .replace(/-->\\s*$/, '')\n .split(',')\n .map((token) => token.trim())\n .filter((token) => token.length > 0);\n}\n\nexport function parseDirectives(text: string): DirectiveSet {\n const blocks: DirectiveRange[] = [];\n const nextLine: DirectiveLine[] = [];\n const sameLine: DirectiveLine[] = [];\n\n const lines = text.split('\\n');\n let open: { start: number; rules: string[] } | null = null;\n\n for (let index = 0; index < lines.length; index += 1) {\n const match = DIRECTIVE.exec(lines[index]);\n if (!match) continue;\n\n const keyword = match[1];\n const rules = parseRuleList(match[2]);\n const lineNumber = index + 1;\n\n if (keyword === 'disable-next-line') {\n nextLine.push({ line: lineNumber + 1, rules });\n } else if (keyword === 'disable-line') {\n sameLine.push({ line: lineNumber, rules });\n } else if (keyword === 'disable') {\n if (!open) open = { start: lineNumber, rules };\n } else if (open) {\n blocks.push({ start: open.start, end: lineNumber, rules: open.rules });\n open = null;\n }\n }\n\n if (open) {\n blocks.push({ start: open.start, end: lines.length, rules: open.rules });\n }\n\n return { blocks, nextLine, sameLine };\n}\n","import { readFileSync } from 'node:fs';\nimport type { Diagnostic } from '../types.js';\nimport { parseDirectives, type DirectiveSet } from './parse-directives.js';\n\nexport interface ApplyInlineDisablesOptions {\n respect: boolean;\n}\n\nfunction ruleMatches(ruleId: string, rules: string[]): boolean {\n if (rules.length === 0) return true;\n return rules.some(\n (token) => ruleId === token || ruleId.endsWith(`/${token}`),\n );\n}\n\nfunction isSuppressed(set: DirectiveSet, diagnostic: Diagnostic): boolean {\n const { line, ruleId } = diagnostic;\n for (const block of set.blocks) {\n if (\n line >= block.start &&\n line <= block.end &&\n ruleMatches(ruleId, block.rules)\n ) {\n return true;\n }\n }\n for (const target of set.nextLine) {\n if (target.line === line && ruleMatches(ruleId, target.rules)) return true;\n }\n for (const target of set.sameLine) {\n if (target.line === line && ruleMatches(ruleId, target.rules)) return true;\n }\n return false;\n}\n\nfunction loadDirectives(\n file: string,\n cache: Map<string, DirectiveSet | null>,\n): DirectiveSet | null {\n const cached = cache.get(file);\n if (cached !== undefined) return cached;\n let set: DirectiveSet | null;\n try {\n set = parseDirectives(readFileSync(file, 'utf-8'));\n } catch {\n set = null;\n }\n cache.set(file, set);\n return set;\n}\n\nexport function applyInlineDisables(\n diags: Diagnostic[],\n opts: ApplyInlineDisablesOptions,\n): Diagnostic[] {\n if (!opts.respect) return diags;\n const cache = new Map<string, DirectiveSet | null>();\n return diags.filter((diagnostic) => {\n const set = loadDirectives(diagnostic.file, cache);\n return set === null || !isSuppressed(set, diagnostic);\n });\n}\n","import { readFile } from 'node:fs/promises';\nimport type { Diagnostic } from './types.js';\n\nasync function readLines(file: string): Promise<string[]> {\n try {\n const content = await readFile(file, 'utf-8');\n return content.split('\\n');\n } catch {\n return [];\n }\n}\n\nexport async function attachCodeSnippets(\n diagnostics: readonly Diagnostic[],\n): Promise<Diagnostic[]> {\n const cache = new Map<string, string[]>();\n const out: Diagnostic[] = [];\n for (const d of diagnostics) {\n let lines = cache.get(d.file);\n if (lines === undefined) {\n lines = await readLines(d.file);\n cache.set(d.file, lines);\n }\n const raw = lines[d.line - 1];\n if (raw === undefined) {\n out.push(d);\n } else {\n out.push({ ...d, codeSnippet: raw.trim() });\n }\n }\n return out;\n}\n","import { existsSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Synchronously reports whether `target` exists and is a directory. Missing\n * paths and non-directory entries both return false rather than throwing.\n */\nexport function directoryExists(target: string): boolean {\n try {\n return statSync(target).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Returns the absolute path of the first existing candidate file (resolved\n * against `dir`), or null when none of the candidates exist.\n */\nexport function resolveExistingFile(\n dir: string,\n candidates: readonly string[],\n): string | null {\n for (const name of candidates) {\n const full = join(dir, name);\n if (existsSync(full)) return full;\n }\n return null;\n}\n","import { access } from 'node:fs/promises';\n\nexport async function pathExists(target: string): Promise<boolean> {\n try {\n await access(target);\n return true;\n } catch {\n return false;\n }\n}\n","import { dirname, join } from 'node:path';\nimport type { MonorepoKind } from '../types/project-info.js';\nimport { pathExists } from './path-exists.js';\nimport { readPackageJson } from './read-package-json.js';\n\nexport interface MonorepoResult {\n root: string;\n kind: MonorepoKind;\n}\n\nasync function detectKind(dir: string): Promise<MonorepoKind> {\n if (await pathExists(join(dir, 'pnpm-workspace.yaml'))) return 'pnpm';\n const pkg = await readPackageJson(dir);\n if (pkg?.workspaces) {\n if (await pathExists(join(dir, 'yarn.lock'))) return 'yarn';\n if (await pathExists(join(dir, 'package-lock.json'))) return 'npm';\n }\n if (await pathExists(join(dir, 'turbo.json'))) return 'turbo';\n return null;\n}\n\nexport async function findMonorepoRoot(\n rootDirectory: string,\n): Promise<MonorepoResult> {\n let current = rootDirectory;\n for (;;) {\n const kind = await detectKind(current);\n if (kind) return { root: current, kind };\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return { root: rootDirectory, kind: null };\n}\n","import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { coerce } from 'semver';\nimport type { PackageJson } from './read-package-json.js';\n\nasync function readInstalledVersion(\n base: string,\n dep: string,\n): Promise<string | null> {\n try {\n const source = await readFile(\n join(base, 'node_modules', dep, 'package.json'),\n 'utf8',\n );\n const parsed = JSON.parse(source) as { version?: string };\n return parsed.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction declaredRange(dep: string, pkg: PackageJson | null): string | null {\n return pkg?.dependencies?.[dep] ?? pkg?.devDependencies?.[dep] ?? null;\n}\n\nexport async function resolveDepVersion(\n dep: string,\n rootDirectory: string,\n monorepoRoot: string,\n pkg: PackageJson | null,\n): Promise<string | null> {\n const installed =\n (await readInstalledVersion(rootDirectory, dep)) ??\n (await readInstalledVersion(monorepoRoot, dep));\n if (installed) return installed;\n\n const range = declaredRange(dep, pkg);\n if (!range) return null;\n return coerce(range)?.version ?? null;\n}\n","import type { PackageJson } from './read-package-json.js';\nimport { resolveDepVersion } from './resolve-dep-version.js';\n\nexport function parseNuxtVersion(\n rootDirectory: string,\n monorepoRoot: string,\n pkg: PackageJson | null,\n): Promise<string | null> {\n return resolveDepVersion('nuxt', rootDirectory, monorepoRoot, pkg);\n}\n","import type { PackageJson } from './read-package-json.js';\nimport { resolveDepVersion } from './resolve-dep-version.js';\n\nexport function parseVueVersion(\n rootDirectory: string,\n monorepoRoot: string,\n pkg: PackageJson | null,\n): Promise<string | null> {\n return resolveDepVersion('vue', rootDirectory, monorepoRoot, pkg);\n}\n","import { join } from 'node:path';\nimport { gte, major, minor } from 'semver';\nimport {\n directoryExists,\n resolveExistingFile,\n} from './project-info/fs-checks.js';\nimport { findMonorepoRoot } from './project-info/find-monorepo-root.js';\nimport { parseNuxtConfig } from './project-info/parse-nuxt-config.js';\nimport { parseNuxtVersion } from './project-info/parse-nuxt-version.js';\nimport { parseVueVersion } from './project-info/parse-vue-version.js';\nimport { pathExists } from './project-info/path-exists.js';\nimport type { PackageJson } from './project-info/read-package-json.js';\nimport { readPackageJson } from './project-info/read-package-json.js';\nimport { resolveDepVersion } from './project-info/resolve-dep-version.js';\nimport type {\n Capability,\n Framework,\n MonorepoKind,\n ProjectInfo,\n} from './types/project-info.js';\n\ninterface DetectionInput {\n framework: Framework;\n vueVersion: string | null;\n nuxtVersion: string | null;\n typescriptVersion: string | null;\n hasTypescript: boolean;\n hasAutoImports: boolean;\n hasComponentsAutoImport: boolean;\n hasPinia: boolean;\n hasVueRouter: boolean;\n nitroPreset: string | null;\n nuxtCompatibilityVersion: 3 | 4 | null;\n monorepoKind: MonorepoKind;\n hasWrangler: boolean;\n isNuxtMajor4: boolean;\n hasNuxtConfig: boolean;\n hasAppDir: boolean;\n hasServerDir: boolean;\n hasPagesDir: boolean;\n}\n\nfunction hasDependency(pkg: PackageJson | null, name: string): boolean {\n return Boolean(pkg?.dependencies?.[name] ?? pkg?.devDependencies?.[name]);\n}\n\nfunction resolveFramework(pkg: PackageJson | null): Framework {\n if (hasDependency(pkg, 'nuxt')) return 'nuxt';\n if (hasDependency(pkg, 'vue')) return 'vue';\n return 'unknown';\n}\n\nfunction resolveCompatibility(\n nuxtVersion: string | null,\n compatibilityVersion: number | undefined,\n): 3 | 4 | null {\n const nuxtMajor = nuxtVersion ? major(nuxtVersion) : 0;\n if (compatibilityVersion === 4 || nuxtMajor >= 4) return 4;\n if (compatibilityVersion === 3) return 3;\n return null;\n}\n\nfunction buildCapabilities(input: DetectionInput): Set<Capability> {\n const caps = new Set<Capability>();\n if (input.framework === 'unknown') return caps;\n\n if (input.vueVersion && major(input.vueVersion) === 3) {\n caps.add('vue:3');\n if (minor(input.vueVersion) >= 4) caps.add('vue:3.4');\n if (minor(input.vueVersion) >= 5) caps.add('vue:3.5');\n }\n\n if (input.nuxtCompatibilityVersion === 4) caps.add('nuxt:4');\n if (input.nuxtVersion && gte(input.nuxtVersion, '4.4.0'))\n caps.add('nuxt:4.4');\n if (input.isNuxtMajor4) caps.add('nuxt4');\n\n if (input.hasNuxtConfig) caps.add('nuxt-config');\n if (input.hasAppDir) caps.add('app-dir');\n if (input.hasServerDir) caps.add('server-dir');\n if (input.hasPagesDir) caps.add('pages-dir');\n if (input.hasWrangler) caps.add('wrangler');\n\n if (input.hasAutoImports) caps.add('auto-imports:vue');\n if (input.hasComponentsAutoImport) caps.add('components:auto');\n if (input.hasPinia) caps.add('pinia');\n if (input.hasVueRouter) caps.add('vue-router');\n\n if (input.hasTypescript) caps.add('typescript');\n if (input.typescriptVersion && major(input.typescriptVersion) >= 6) {\n caps.add('typescript:6');\n }\n\n if (\n input.monorepoKind === 'pnpm' ||\n input.monorepoKind === 'yarn' ||\n input.monorepoKind === 'npm'\n ) {\n caps.add(`monorepo:${input.monorepoKind}`);\n }\n\n if (input.hasWrangler || input.nitroPreset === 'cloudflare-pages') {\n caps.add('cf-pages:enabled');\n }\n if (input.nitroPreset === 'node-server') caps.add('nitro:node-server');\n\n return caps;\n}\n\nexport async function detectProject(\n rootDirectory: string,\n): Promise<ProjectInfo> {\n const pkg = await readPackageJson(rootDirectory);\n const packageJsonPath = pkg ? join(rootDirectory, 'package.json') : null;\n const { root: monorepoRoot, kind: monorepoKind } =\n await findMonorepoRoot(rootDirectory);\n\n const framework = resolveFramework(pkg);\n const vueVersion = await parseVueVersion(rootDirectory, monorepoRoot, pkg);\n const nuxtVersion = await parseNuxtVersion(rootDirectory, monorepoRoot, pkg);\n const typescriptVersion = await resolveDepVersion(\n 'typescript',\n rootDirectory,\n monorepoRoot,\n pkg,\n );\n\n const nuxtConfig =\n framework === 'nuxt' ? await parseNuxtConfig(rootDirectory) : null;\n const nitroPreset = nuxtConfig?.nitroPreset ?? null;\n const nuxtCompatibilityVersion = resolveCompatibility(\n nuxtVersion,\n nuxtConfig?.compatibilityVersion,\n );\n\n const isNuxt = framework === 'nuxt';\n const hasAutoImports = isNuxt\n ? nuxtConfig?.importsAutoImport !== false\n : hasDependency(pkg, 'unplugin-auto-import');\n const hasComponentsAutoImport =\n isNuxt || hasDependency(pkg, 'unplugin-vue-components');\n const hasPinia = hasDependency(pkg, 'pinia');\n const hasVueRouter = hasDependency(pkg, 'vue-router') && !isNuxt;\n\n const tsconfigExists = await pathExists(join(rootDirectory, 'tsconfig.json'));\n const hasTypescript = hasDependency(pkg, 'typescript') || tsconfigExists;\n\n const wranglerConfigPath = resolveExistingFile(rootDirectory, [\n 'wrangler.toml',\n 'wrangler.jsonc',\n 'wrangler.json',\n ]);\n const hasWranglerConfig = wranglerConfigPath !== null;\n\n const nuxtConfigPath = resolveExistingFile(rootDirectory, [\n 'nuxt.config.ts',\n 'nuxt.config.js',\n 'nuxt.config.mjs',\n ]);\n\n const appDirPath = join(rootDirectory, 'app');\n const hasAppDir = directoryExists(appDirPath);\n const hasServerDir = directoryExists(join(rootDirectory, 'server'));\n const hasPagesDir =\n (hasAppDir && directoryExists(join(appDirPath, 'pages'))) ||\n directoryExists(join(rootDirectory, 'pages'));\n\n const isNuxtMajor4 = nuxtVersion !== null && major(nuxtVersion) >= 4;\n\n const capabilities = buildCapabilities({\n framework,\n vueVersion,\n nuxtVersion,\n typescriptVersion,\n hasTypescript,\n hasAutoImports,\n hasComponentsAutoImport,\n hasPinia,\n hasVueRouter,\n nitroPreset,\n nuxtCompatibilityVersion,\n monorepoKind,\n hasWrangler: hasWranglerConfig,\n isNuxtMajor4,\n hasNuxtConfig: nuxtConfigPath !== null,\n hasAppDir,\n hasServerDir,\n hasPagesDir,\n });\n\n return {\n framework,\n rootDirectory,\n packageJsonPath,\n vueVersion,\n nuxtVersion,\n typescriptVersion,\n hasAutoImports,\n hasComponentsAutoImport,\n hasPinia,\n hasVueRouter,\n nitroPreset,\n nuxtCompatibilityVersion,\n monorepoKind,\n nuxtConfigPath,\n hasAppDir,\n appDirPath: hasAppDir ? appDirPath : null,\n hasServerDir,\n hasPagesDir,\n hasWranglerConfig,\n capabilities,\n };\n}\n","import { resolve } from 'node:path';\nimport { glob } from 'tinyglobby';\n\nexport interface ScanOptions {\n rootDir: string;\n include: string[];\n exclude: string[];\n}\n\nexport async function listSourceFiles(opts: ScanOptions): Promise<string[]> {\n const files = await glob(opts.include, {\n cwd: opts.rootDir,\n absolute: true,\n ignore: opts.exclude,\n onlyFiles: true,\n dot: false,\n });\n return files.map((f) => resolve(f)).sort();\n}\n","import type { Diagnostic } from './types.js';\n\nexport function mergeDiagnostics(...batches: Diagnostic[][]): Diagnostic[] {\n const seen = new Set<string>();\n const out: Diagnostic[] = [];\n for (const batch of batches) {\n for (const d of batch) {\n const key = `${d.file}|${d.line}|${d.column}|${d.ruleId}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(d);\n }\n }\n out.sort((a, b) => {\n if (a.file !== b.file) return a.file < b.file ? -1 : 1;\n if (a.line !== b.line) return a.line - b.line;\n if (a.column !== b.column) return a.column - b.column;\n return a.ruleId < b.ruleId ? -1 : 1;\n });\n return out;\n}\n","import { resolve } from 'node:path';\nimport type { Diagnostic } from '../types.js';\nimport type { OxlintRawDiagnostic } from './types.js';\n\nconst OXLINT_CODE_PATTERN = /^([a-z0-9_-]+)\\(([a-z0-9/_-]+)\\)$/i;\n\nexport function normalizeOxlintRuleId(raw: OxlintRawDiagnostic): string {\n if (raw.code) {\n const match = OXLINT_CODE_PATTERN.exec(raw.code);\n if (match) return `${match[1]}/${match[2]}`;\n return raw.code;\n }\n if (raw.rule) return raw.rule;\n return 'oxlint/unknown';\n}\n\nexport function toCanonicalDiagnostic(\n raw: OxlintRawDiagnostic,\n rootDir: string,\n): Diagnostic {\n const ruleId = normalizeOxlintRuleId(raw);\n const severity = raw.severity === 'warning' ? 'warn' : 'error';\n const primary = raw.labels?.[0]?.span;\n const line = primary?.line ?? raw.start_line ?? 1;\n const column = primary?.column ?? raw.start_column ?? 1;\n return {\n file: resolve(rootDir, raw.filename),\n line,\n column,\n endLine: raw.end_line,\n endColumn: raw.end_column,\n ruleId,\n severity,\n message: raw.message,\n source: 'oxlint',\n };\n}\n\nexport function toCanonicalDiagnostics(\n raws: OxlintRawDiagnostic[],\n rootDir: string,\n): Diagnostic[] {\n return raws.map((r) => toCanonicalDiagnostic(r, rootDir));\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Severity } from '../types.js';\n\nexport interface GenerateConfigInput {\n pluginPaths: string[];\n ruleOverrides?: Record<string, Severity | 'off'>;\n rootDir?: string;\n framework?: 'vue' | 'nuxt';\n}\n\nexport interface GeneratedConfig {\n configPath: string;\n cleanup: () => Promise<void>;\n}\n\nconst VUE_DEFAULT_RULES: Record<string, Severity> = {\n 'vue/no-export-in-script-setup': 'error',\n 'vue/require-typed-ref': 'warn',\n 'vue-doctor/no-em-dash-in-string': 'warn',\n 'vue-doctor/no-non-null-assertion-on-ref-value': 'warn',\n 'vue-doctor/no-imports-from-vue-when-auto-imported': 'warn',\n 'vue-doctor/reactivity/watch-without-cleanup': 'warn',\n 'vue-doctor/composition/prefer-script-setup-for-new-files': 'warn',\n 'vue-doctor/composition/defineProps-typed': 'warn',\n};\n\nconst NUXT_PLUGIN_RULES: Record<string, Severity> = {\n 'nuxt-doctor/ai-slop/no-process-client-server': 'error',\n 'nuxt-doctor/ai-slop/no-explicit-imports-of-auto-imported': 'warn',\n 'nuxt-doctor/ai-slop/no-useState-for-server-data': 'warn',\n 'nuxt-doctor/ai-slop/no-fetch-in-setup': 'warn',\n 'nuxt-doctor/data-fetching/useAsyncData-key-required-in-loop': 'error',\n 'nuxt-doctor/server-routes/defineEventHandler-typed': 'warn',\n 'nuxt-doctor/server-routes/validate-body-with-h3-v2': 'warn',\n 'nuxt-doctor/server-routes/createError-on-failure': 'warn',\n 'nuxt-doctor/hydration/no-document-in-setup': 'error',\n 'nuxt-doctor/hydration/clientOnly-for-browser-apis': 'error',\n};\n\n// Only these ids are real oxlint-plugin/built-in rules. Other doctor rules run\n// in separate passes; emitting their ids here makes oxlint exit non-zero\n// (\"rule not found\"), silently killing the whole script pass — so the rules\n// block is filtered to this allowlist.\nconst VUE_OXLINT_RULE_IDS: ReadonlySet<string> = new Set([\n 'vue/no-export-in-script-setup',\n 'vue/require-typed-ref',\n 'vue-doctor/no-em-dash-in-string',\n 'vue-doctor/no-destructure-props-without-to-refs',\n 'vue-doctor/no-destructure-reactive-without-to-refs',\n 'vue-doctor/no-non-null-assertion-on-ref-value',\n 'vue-doctor/no-imports-from-vue-when-auto-imported',\n 'vue-doctor/reactivity/watch-without-cleanup',\n 'vue-doctor/reactivity/prefer-shallowRef-for-large-data',\n 'vue-doctor/reactivity/prefer-readonly-for-injected',\n 'vue-doctor/composition/prefer-script-setup-for-new-files',\n 'vue-doctor/composition/defineProps-typed',\n 'vue-doctor/performance/prefer-defineAsyncComponent-on-route',\n]);\n\nconst NUXT_OXLINT_RULE_IDS: ReadonlySet<string> = new Set(\n Object.keys(NUXT_PLUGIN_RULES),\n);\n\nfunction oxlintRuleAllowlist(framework: 'vue' | 'nuxt'): ReadonlySet<string> {\n if (framework !== 'nuxt') return VUE_OXLINT_RULE_IDS;\n return new Set([...VUE_OXLINT_RULE_IDS, ...NUXT_OXLINT_RULE_IDS]);\n}\n\nfunction toOxlintSeverity(s: Severity): 'error' | 'warn' {\n if (s === 'error') return 'error';\n return 'warn';\n}\n\ninterface CacheTarget {\n dir: string;\n removeDir: boolean;\n}\n\nasync function resolveCacheDir(\n rootDir: string | undefined,\n): Promise<CacheTarget> {\n if (rootDir && existsSync(join(rootDir, 'node_modules'))) {\n const dir = join(rootDir, 'node_modules', '.cache', 'doctor');\n await mkdir(dir, { recursive: true });\n return { dir, removeDir: false };\n }\n const dir = await mkdtemp(join(tmpdir(), 'geoql-doctor-'));\n return { dir, removeDir: true };\n}\n\nfunction resolveUserConfig(rootDir: string | undefined): string | undefined {\n if (!rootDir) return undefined;\n for (const name of ['.oxlintrc.json', '.oxlintrc']) {\n const candidate = join(rootDir, name);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\nexport async function generateOxlintConfig(\n input: GenerateConfigInput,\n): Promise<GeneratedConfig> {\n const { dir, removeDir } = await resolveCacheDir(input.rootDir);\n const framework = input.framework === 'nuxt' ? 'nuxt' : 'vue';\n const allowlist = oxlintRuleAllowlist(framework);\n let defaults: Record<string, Severity> = { ...VUE_DEFAULT_RULES };\n if (framework === 'nuxt') {\n defaults = { ...defaults, ...NUXT_PLUGIN_RULES };\n }\n const merged: Record<string, Severity> = { ...defaults };\n if (input.ruleOverrides) {\n for (const [id, sev] of Object.entries(input.ruleOverrides)) {\n // Only oxlint-plugin rule ids belong in the oxlint config. Overrides for\n // rules handled by other doctor-core passes are ignored here (they are\n // applied in their own pass), preventing oxlint \"rule not found\" exits.\n if (!allowlist.has(id)) continue;\n if (sev === 'off') delete merged[id];\n else merged[id] = sev;\n }\n }\n const rules: Record<string, 'error' | 'warn'> = {};\n for (const [id, sev] of Object.entries(merged)) {\n rules[id] = toOxlintSeverity(sev);\n }\n const userConfig = resolveUserConfig(input.rootDir);\n const config = {\n $schema:\n 'https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json',\n ...(userConfig ? { extends: [userConfig] } : {}),\n plugins: ['vue'],\n jsPlugins: input.pluginPaths,\n rules,\n };\n const configPath = join(dir, '.oxlintrc.json');\n await writeFile(configPath, JSON.stringify(config, null, 2));\n const cleanup = async (): Promise<void> => {\n await rm(removeDir ? dir : configPath, { recursive: true, force: true });\n };\n return { configPath, cleanup };\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve as resolvePath } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPkgMain(pkgJsonPath: string): string | undefined {\n try {\n const raw = readFileSync(pkgJsonPath, 'utf8');\n const pkg = JSON.parse(raw) as {\n exports?: {\n '.'?: { import?: string; default?: string };\n default?: string;\n };\n module?: string;\n main?: string;\n };\n const exp = pkg.exports?.['.'];\n if (exp?.import) return exp.import;\n if (exp?.default) return exp.default;\n if (pkg.module) return pkg.module;\n if (pkg.main) return pkg.main;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction lookUpwards(fromDir: string, relPath: string): string | undefined {\n let current = resolvePath(fromDir);\n // Bounded ascent: stop when dirname() returns the same value (filesystem root).\n while (true) {\n const candidate = resolvePath(current, relPath);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\nfunction resolveFromSelf(specifier: string): string | undefined {\n try {\n return fileURLToPath(import.meta.resolve(specifier));\n } catch {\n return undefined;\n }\n}\n\nexport function resolveVueDoctorPluginPath(fromDir: string): string {\n const pkgJson = lookUpwards(\n fromDir,\n 'node_modules/@geoql/oxlint-plugin-vue-doctor/package.json',\n );\n if (pkgJson) {\n const main = readPkgMain(pkgJson) ?? './dist/index.js';\n return resolvePath(dirname(pkgJson), main);\n }\n const selfMain = resolveFromSelf('@geoql/oxlint-plugin-vue-doctor');\n if (selfMain) return selfMain;\n return throwVueResolveError(fromDir);\n}\n\nexport function resolveNuxtDoctorPluginPath(fromDir: string): string {\n const pkgJson = lookUpwards(\n fromDir,\n 'node_modules/@geoql/oxlint-plugin-nuxt-doctor/package.json',\n );\n if (pkgJson) {\n const main = readPkgMain(pkgJson) ?? './dist/index.js';\n return resolvePath(dirname(pkgJson), main);\n }\n const selfMain = resolveFromSelf('@geoql/oxlint-plugin-nuxt-doctor');\n if (selfMain) return selfMain;\n return throwNuxtResolveError(fromDir);\n}\n\nfunction throwVueResolveError(fromDir: string): never {\n throw new Error(\n `Failed to resolve @geoql/oxlint-plugin-vue-doctor from ${fromDir}. Install it as a dependency of your project or use the bundled @geoql/vue-doctor CLI.`,\n );\n}\n\nfunction throwNuxtResolveError(fromDir: string): never {\n throw new Error(\n `Failed to resolve @geoql/oxlint-plugin-nuxt-doctor from ${fromDir}. Install it as a dependency of your project or use the bundled @geoql/nuxt-doctor CLI.`,\n );\n}\n\nexport function resolveOxlintBin(fromDir: string): string {\n const pkgJson = lookUpwards(fromDir, 'node_modules/oxlint/package.json');\n if (pkgJson) {\n return resolvePath(dirname(pkgJson), 'bin/oxlint');\n }\n const selfPkgJson = resolveFromSelf('oxlint/package.json');\n if (selfPkgJson) {\n return resolvePath(dirname(selfPkgJson), 'bin/oxlint');\n }\n throw new Error(\n `Failed to resolve oxlint from ${fromDir}. Install oxlint as a dependency of your project.`,\n );\n}\n","const STDERR_TAIL_LIMIT = 2000;\n\nexport class OxlintSpawnFailed extends Error {\n override name = 'OxlintSpawnFailed' as const;\n\n constructor(exitCode: number | null, stderr: string) {\n const tail = stderr.slice(-STDERR_TAIL_LIMIT);\n super(`oxlint subprocess exited with code ${exitCode}: ${tail}`);\n }\n}\n\nexport class OxlintOutputTooLarge extends Error {\n override name = 'OxlintOutputTooLarge' as const;\n\n constructor(maxBytes: number) {\n super(`oxlint subprocess output exceeded ${maxBytes} bytes`);\n }\n}\n","import { spawn } from 'node:child_process';\nimport { OxlintOutputTooLarge, OxlintSpawnFailed } from './errors.js';\nimport type {\n OxlintRawDiagnostic,\n OxlintRunOptions,\n OxlintRunResult,\n} from './types.js';\n\nexport const OXLINT_SPAWN_TIMEOUT_MS = 60_000;\nexport const OXLINT_MAX_OUTPUT_BYTES = 32 * 1024 * 1024;\n\ninterface OxlintJsonReport {\n diagnostics?: OxlintRawDiagnostic[];\n}\n\nfunction sanitizedEnv(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = { ...process.env };\n delete env.NODE_OPTIONS;\n for (const key of Object.keys(env)) {\n if (key.startsWith('npm_config_')) delete env[key];\n }\n return env;\n}\n\nexport async function runOxlint(\n opts: OxlintRunOptions,\n): Promise<OxlintRunResult> {\n return new Promise<OxlintRunResult>((resolve, reject) => {\n const args = ['-c', opts.configPath, '--format', 'json', opts.targetPath];\n const child = spawn(opts.oxlintBin, args, {\n cwd: opts.rootDir,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: sanitizedEnv(),\n });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let stdoutBytes = 0;\n let settled = false;\n let timer: NodeJS.Timeout | undefined;\n const timeoutMs = opts.timeoutMs ?? OXLINT_SPAWN_TIMEOUT_MS;\n const maxOutputBytes = opts.maxOutputBytes ?? OXLINT_MAX_OUTPUT_BYTES;\n const finish = (fn: () => void): void => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n fn();\n };\n if (timeoutMs > 0) {\n timer = setTimeout(() => {\n child.kill('SIGKILL');\n finish(() =>\n reject(new Error(`oxlint subprocess timed out after ${timeoutMs}ms`)),\n );\n }, timeoutMs);\n }\n child.stdout.on('data', (chunk: Buffer) => {\n stdoutBytes += chunk.length;\n if (stdoutBytes > maxOutputBytes) {\n child.kill('SIGKILL');\n finish(() => reject(new OxlintOutputTooLarge(maxOutputBytes)));\n return;\n }\n stdoutChunks.push(chunk);\n });\n child.stderr.on('data', (chunk: Buffer) => stderrChunks.push(chunk));\n child.on('error', (err) => {\n finish(() => reject(err));\n });\n child.on('close', (exitCode) => {\n finish(() => {\n const stdout = Buffer.concat(stdoutChunks).toString('utf8');\n const stderr = Buffer.concat(stderrChunks).toString('utf8');\n const diagnostics = parseOxlintJsonStream(stdout);\n if (exitCode !== 0 && exitCode !== null && diagnostics.length === 0) {\n reject(new OxlintSpawnFailed(exitCode, stderr));\n return;\n }\n resolve({ diagnostics, stderr, exitCode });\n });\n });\n });\n}\n\nfunction parseOxlintJsonStream(stdout: string): OxlintRawDiagnostic[] {\n const trimmed = stdout.trim();\n if (!trimmed) return [];\n try {\n const parsed = JSON.parse(trimmed) as\n | OxlintJsonReport\n | OxlintRawDiagnostic[];\n if (Array.isArray(parsed)) return parsed;\n if (parsed.diagnostics) return parsed.diagnostics;\n } catch {\n return parseNdjson(trimmed);\n }\n return [];\n}\n\nfunction parseNdjson(text: string): OxlintRawDiagnostic[] {\n const out: OxlintRawDiagnostic[] = [];\n for (const line of text.split('\\n')) {\n const t = line.trim();\n if (!t) continue;\n try {\n const obj = JSON.parse(t) as OxlintRawDiagnostic;\n if (obj && typeof obj === 'object' && 'message' in obj) out.push(obj);\n } catch {\n // skip non-json line\n }\n }\n return out;\n}\n","import type { Diagnostic, Severity } from '../types.js';\nimport { toCanonicalDiagnostics } from './diagnostic.js';\nimport { generateOxlintConfig } from './generate-config.js';\nimport {\n resolveNuxtDoctorPluginPath,\n resolveOxlintBin,\n resolveVueDoctorPluginPath,\n} from './resolve-plugin.js';\nimport { runOxlint } from './spawn.js';\n\nexport interface ScriptPassOptions {\n rootDir: string;\n targetPath: string;\n ruleOverrides?: Record<string, Severity | 'off'>;\n timeoutMs?: number;\n framework?: 'vue' | 'nuxt';\n}\n\nexport interface ScriptPassResult {\n diagnostics: Diagnostic[];\n stderr: string;\n exitCode: number | null;\n}\n\nexport async function runScriptPass(\n opts: ScriptPassOptions,\n): Promise<ScriptPassResult> {\n const vuePluginPath = resolveVueDoctorPluginPath(opts.rootDir);\n const oxlintBin = resolveOxlintBin(opts.rootDir);\n let pluginPaths: string[];\n if (opts.framework === 'nuxt') {\n const nuxtPluginPath = resolveNuxtDoctorPluginPath(opts.rootDir);\n pluginPaths = [nuxtPluginPath, vuePluginPath];\n } else {\n pluginPaths = [vuePluginPath];\n }\n const { configPath, cleanup } = await generateOxlintConfig({\n pluginPaths,\n ruleOverrides: opts.ruleOverrides,\n rootDir: opts.rootDir,\n framework: opts.framework,\n });\n try {\n const raw = await runOxlint({\n rootDir: opts.rootDir,\n targetPath: opts.targetPath,\n configPath,\n oxlintBin,\n timeoutMs: opts.timeoutMs,\n });\n return {\n diagnostics: toCanonicalDiagnostics(raw.diagnostics, opts.rootDir),\n stderr: raw.stderr,\n exitCode: raw.exitCode,\n };\n } finally {\n await cleanup();\n }\n}\n","import type { Diagnostic } from './types.js';\n\nconst SEVERITY_WEIGHTS = { error: 5, warn: 2, info: 0.5 } as const;\n\nexport interface ScoreBreakdownEntry {\n ruleId: string;\n occurrences: number;\n weightPerOccurrence: number;\n penalty: number;\n}\n\nexport interface ScoreResult {\n score: number;\n passed: boolean;\n threshold: number;\n totalFindings: number;\n errorCount: number;\n warnCount: number;\n infoCount: number;\n breakdown: ScoreBreakdownEntry[];\n}\n\nexport interface ScoreConfig {\n rules?: Record<string, { weight?: number }>;\n threshold?: number;\n}\n\nexport function scoreDiagnostics(\n diagnostics: Diagnostic[],\n config?: ScoreConfig,\n): ScoreResult {\n const threshold = config?.threshold ?? 0;\n\n let errorCount = 0;\n let warnCount = 0;\n let infoCount = 0;\n\n const byRule = new Map<string, Diagnostic[]>();\n for (const d of diagnostics) {\n if (d.severity === 'error') errorCount += 1;\n else if (d.severity === 'warn') warnCount += 1;\n else infoCount += 1;\n\n const list = byRule.get(d.ruleId);\n if (list) list.push(d);\n else byRule.set(d.ruleId, [d]);\n }\n\n const sortedRuleIds = [...byRule.keys()].sort();\n const breakdown: ScoreBreakdownEntry[] = [];\n let penalty = 0;\n\n for (const ruleId of sortedRuleIds) {\n const list = byRule.get(ruleId)!;\n const weight =\n config?.rules?.[ruleId]?.weight ??\n SEVERITY_WEIGHTS[list[0].severity as keyof typeof SEVERITY_WEIGHTS];\n let rulePenalty = 0;\n for (let i = 0; i < list.length; i++) {\n rulePenalty += weight * (i === 0 ? 1 : 1 / Math.sqrt(i + 1));\n }\n penalty += rulePenalty;\n breakdown.push({\n ruleId,\n occurrences: list.length,\n weightPerOccurrence: weight,\n penalty: rulePenalty,\n });\n }\n\n breakdown.sort((a, b) => b.penalty - a.penalty);\n\n const score = Math.max(0, Math.round(100 - penalty));\n\n return {\n score,\n passed: score >= threshold,\n threshold,\n totalFindings: diagnostics.length,\n errorCount,\n warnCount,\n infoCount,\n breakdown,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { parse, type SFCDescriptor } from '@vue/compiler-sfc';\n\nconst cache = new Map<string, SFCDescriptor | null>();\n\nexport async function parseSfcDescriptor(\n absPath: string,\n): Promise<SFCDescriptor | null> {\n if (cache.has(absPath)) return cache.get(absPath) ?? null;\n let source: string;\n try {\n source = await readFile(absPath, 'utf8');\n } catch {\n cache.set(absPath, null);\n return null;\n }\n const { descriptor, errors } = parse(source, { filename: absPath });\n if (errors.length > 0) {\n cache.set(absPath, null);\n return null;\n }\n cache.set(absPath, descriptor);\n return descriptor;\n}\n\nexport function clearSfcDescriptorCache(): void {\n cache.clear();\n}\n","import { parseSync } from 'oxc-parser';\nimport type { Diagnostic } from '../../types.js';\nimport type { SfcRuleContext, SfcRuleResult } from './types.js';\n\ntype Program = ReturnType<typeof parseSync>['program'];\ntype Node = Program['body'][number];\ntype ExportDefault = Extract<Node, { type: 'ExportDefaultDeclaration' }>;\ntype Declaration = ExportDefault['declaration'];\ntype ObjectExpr = Extract<Declaration, { type: 'ObjectExpression' }>;\ntype CallExpr = Extract<Declaration, { type: 'CallExpression' }>;\ntype Expression = CallExpr['callee'];\n\nconst RULE_ID = 'vue-doctor/sfc/no-mixed-options-and-composition-api';\n\nconst MESSAGE =\n 'Mixed Options API in a <script setup> SFC. Move data/methods/computed/watch/lifecycle into <script setup> Composition API; keep <script> only for options like name/inheritAttrs. See https://vuejs.org/api/sfc-script-setup.html#usage-alongside-normal-script';\n\nconst RECOMMENDATION =\n 'Move this option into the <script setup> block using the Composition API, or keep <script> only for options-only config such as name or inheritAttrs.';\n\nconst DISALLOWED = new Set<string>([\n 'data',\n 'methods',\n 'computed',\n 'watch',\n 'props',\n 'emits',\n 'provide',\n 'inject',\n 'beforeCreate',\n 'created',\n 'beforeMount',\n 'mounted',\n 'beforeUpdate',\n 'updated',\n 'beforeUnmount',\n 'unmounted',\n 'activated',\n 'deactivated',\n 'errorCaptured',\n 'serverPrefetch',\n]);\n\nfunction resolveDefineComponentCall(call: CallExpr): ObjectExpr | null {\n if (call.callee.type !== 'Identifier') return null;\n if (call.callee.name !== 'defineComponent') return null;\n const first = call.arguments[0];\n if (!first || first.type !== 'ObjectExpression') return null;\n return first;\n}\n\nfunction findBindingInit(body: Node[], name: string): Expression | null {\n for (const stmt of body) {\n if (stmt.type !== 'VariableDeclaration') continue;\n for (const declarator of stmt.declarations) {\n if (declarator.id.type !== 'Identifier') continue;\n if (declarator.id.name !== name) continue;\n return declarator.init;\n }\n }\n return null;\n}\n\nfunction resolveOptionsObject(program: Program): ObjectExpr | null {\n const exported = program.body.find(\n (node): node is ExportDefault => node.type === 'ExportDefaultDeclaration',\n );\n if (!exported) return null;\n const declaration = exported.declaration;\n if (declaration.type === 'ObjectExpression') return declaration;\n if (declaration.type === 'CallExpression') {\n return resolveDefineComponentCall(declaration);\n }\n if (declaration.type === 'Identifier') {\n const init = findBindingInit(program.body, declaration.name);\n if (init && init.type === 'CallExpression') {\n return resolveDefineComponentCall(init);\n }\n return null;\n }\n return null;\n}\n\nfunction locate(\n content: string,\n offset: number,\n startLine: number,\n startColumn: number,\n): { line: number; column: number } {\n let line = startLine;\n let lastNewline = -1;\n for (let i = 0; i < offset; i += 1) {\n if (content.charCodeAt(i) === 10) {\n line += 1;\n lastNewline = i;\n }\n }\n const column =\n lastNewline === -1 ? startColumn + offset : offset - lastNewline;\n return { line, column };\n}\n\nexport function check(ctx: SfcRuleContext): SfcRuleResult {\n const { script, scriptSetup } = ctx.descriptor;\n if (!script || !scriptSetup) return { diagnostics: [] };\n\n const lang = script.lang === 'ts' ? 'ts' : 'js';\n const { program } = parseSync(`script.${lang}`, script.content, {\n sourceType: 'module',\n lang,\n });\n\n const options = resolveOptionsObject(program);\n if (!options) return { diagnostics: [] };\n\n const diagnostics: Diagnostic[] = [];\n for (const property of options.properties) {\n if (property.type !== 'Property') continue;\n if (property.key.type !== 'Identifier') continue;\n if (!DISALLOWED.has(property.key.name)) continue;\n const { line, column } = locate(\n script.content,\n property.start,\n script.loc.start.line,\n script.loc.start.column,\n );\n diagnostics.push({\n file: ctx.file,\n line,\n column,\n ruleId: RULE_ID,\n severity: 'error',\n message: MESSAGE,\n source: 'sfc',\n recommendation: RECOMMENDATION,\n });\n }\n return { diagnostics };\n}\n","const PAGE_DIR = /^(?:app\\/)?pages\\//;\nconst LAYOUT_DIR = /^(?:app\\/)?layouts\\//;\n\nfunction normalize(relPath: string): string {\n return relPath.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\n/**\n * True when the path points at a Nuxt page component — a `.vue` file under\n * `pages/` (Nuxt 3 layout) or `app/pages/` (Nuxt 4 layout) at the project root.\n */\nexport function isNuxtPageFile(relPath: string): boolean {\n const path = normalize(relPath);\n return PAGE_DIR.test(path) && path.endsWith('.vue');\n}\n\n/**\n * True when the path points at a Nitro server file — a `.ts` file under the\n * project-root `server/` directory.\n */\nexport function isNuxtServerFile(relPath: string): boolean {\n const path = normalize(relPath);\n return path.startsWith('server/') && path.endsWith('.ts');\n}\n\n/**\n * True when the path points at a Nuxt layout component — a `.vue` file under\n * `layouts/` (Nuxt 3 layout) or `app/layouts/` (Nuxt 4 layout) at the project\n * root.\n */\nexport function isNuxtLayoutFile(relPath: string): boolean {\n const path = normalize(relPath);\n return LAYOUT_DIR.test(path) && path.endsWith('.vue');\n}\n","import type {\n ElementNode,\n RootNode,\n TemplateChildNode,\n} from '@vue/compiler-core';\n\nconst NODE_ELEMENT = 1;\n\nexport function isElementNode(\n node: { type: number } | undefined | null,\n): node is ElementNode {\n return node !== null && node !== undefined && node.type === NODE_ELEMENT;\n}\n\nexport type ElementVisitor = (node: ElementNode) => void;\n\nexport function walkElements(root: RootNode, visit: ElementVisitor): void {\n const stack: TemplateChildNode[] = [...root.children];\n while (stack.length > 0) {\n const node = stack.pop();\n if (!node) continue;\n if (isElementNode(node)) {\n visit(node);\n if (node.children) {\n for (const child of node.children) stack.push(child);\n }\n }\n }\n}\n","import type { ElementNode } from '@vue/compiler-core';\nimport type { Diagnostic } from '../../../types.js';\nimport { isNuxtLayoutFile } from '../../../nuxt/file-role.js';\nimport { walkElements } from '../../../template/walk.js';\nimport type { SfcRuleContext, SfcRuleResult } from '../types.js';\n\nconst RULE_ID = 'nuxt-doctor/ai-slop/no-mixed-app-and-root-layout';\n\nconst MESSAGE =\n 'Layout file renders<NuxtLayout> inside itself. This creates a nested layout chain where the root layout renders itself as a slot. Use<slot /> directly and let the page content flow through.';\n\nconst RECOMMENDATION =\n 'Replace <NuxtLayout> in this layout file with <slot />. The layout slot is already provided by the parent layout wrapper.';\n\nexport function check(ctx: SfcRuleContext): SfcRuleResult {\n if (!isNuxtLayoutFile(ctx.relativePath)) return { diagnostics: [] };\n const { template } = ctx.descriptor;\n if (!template || !template.ast) return { diagnostics: [] };\n let foundNuxtLayout = false;\n let nuxtLayoutNode: ElementNode | undefined;\n walkElements(template.ast, (el: ElementNode) => {\n if (el.tag === 'NuxtLayout') {\n foundNuxtLayout = true;\n nuxtLayoutNode = el;\n }\n });\n if (!foundNuxtLayout) return { diagnostics: [] };\n const node = nuxtLayoutNode!;\n const diagnostics: Diagnostic[] = [\n {\n file: ctx.file,\n line: node.loc.start.line,\n column: node.loc.start.column,\n endLine: node.loc.end.line,\n endColumn: node.loc.end.column,\n ruleId: RULE_ID,\n severity: 'warn',\n message: MESSAGE,\n source: 'sfc',\n recommendation: RECOMMENDATION,\n },\n ];\n return { diagnostics };\n}\n","import { readFileSync } from 'node:fs';\nimport { parseSync } from 'oxc-parser';\nimport type { Diagnostic } from '../../../types.js';\nimport { isNuxtPageFile } from '../../../nuxt/file-role.js';\nimport type { SfcRuleContext, SfcRuleResult } from '../types.js';\n\nconst RULE_ID = 'nuxt-doctor/seo/og-image-defined';\n\nconst MESSAGE =\n 'Page uses SEO meta but has no og:image property. Open Graph images improve social sharing previews. Add an og:image value or install @nuxtjs/og-image for automatic OG images.';\n\nconst RECOMMENDATION =\n 'Add ogImage: \"/path/to/image.png\" to useSeoMeta / useHead, or install @nuxtjs/og-image.';\n\nfunction hasOgImageInCall(\n program: ReturnType<typeof parseSync>['program'],\n): boolean {\n for (const stmt of program.body) {\n if (stmt.type !== 'ExpressionStatement') continue;\n const call = stmt.expression;\n if (call.type !== 'CallExpression') continue;\n if (call.callee.type !== 'Identifier') continue;\n const name = call.callee.name;\n if (name !== 'useSeoMeta' && name !== 'useHead') continue;\n const firstArg = call.arguments[0];\n if (!firstArg || firstArg.type !== 'ObjectExpression') continue;\n for (const prop of firstArg.properties) {\n if (prop.type !== 'Property') continue;\n if (prop.key.type === 'Identifier' && prop.key.name === 'ogImage')\n return true;\n if (prop.key.type === 'Literal' && prop.key.value === 'og:image')\n return true;\n }\n }\n return false;\n}\n\nfunction hasOgImageDep(packageJsonPath: string): boolean {\n try {\n const raw = readFileSync(packageJsonPath, 'utf8');\n const pkg = JSON.parse(raw);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n return '@nuxtjs/og-image' in deps || 'nuxt-og-image' in deps;\n } catch {\n return false;\n }\n}\n\nexport function check(ctx: SfcRuleContext): SfcRuleResult {\n if (!isNuxtPageFile(ctx.relativePath)) return { diagnostics: [] };\n const { scriptSetup } = ctx.descriptor;\n if (!scriptSetup) return { diagnostics: [] };\n const lang = scriptSetup.lang === 'ts' ? 'ts' : 'js';\n const { program } = parseSync(`script.${lang}`, scriptSetup.content, {\n sourceType: 'module',\n lang,\n });\n if (hasOgImageInCall(program)) return { diagnostics: [] };\n if (ctx.projectInfo.packageJsonPath === null) return { diagnostics: [] };\n if (hasOgImageDep(ctx.projectInfo.packageJsonPath))\n return { diagnostics: [] };\n const { line, column } = scriptSetup.loc.start;\n const diagnostics: Diagnostic[] = [\n {\n file: ctx.file,\n line,\n column,\n ruleId: RULE_ID,\n severity: 'warn',\n message: MESSAGE,\n source: 'sfc',\n recommendation: RECOMMENDATION,\n },\n ];\n return { diagnostics };\n}\n","import { parseSync } from 'oxc-parser';\nimport type { Diagnostic } from '../../../types.js';\nimport { isNuxtPageFile } from '../../../nuxt/file-role.js';\nimport type { SfcRuleContext, SfcRuleResult } from '../types.js';\n\nconst RULE_ID = 'nuxt-doctor/seo/useSeoMeta-on-public-page';\n\nconst MESSAGE =\n 'Public page component is missing SEO metadata. Add useSeoMeta, useHead, or definePageMeta with a title so search engines can index it properly.';\n\nconst RECOMMENDATION =\n 'Call useSeoMeta({ title: \"...\" }) in<script setup> to define page title and meta tags for search engines and social previews.';\n\nfunction hasTitleInCall(\n program: ReturnType<typeof parseSync>['program'],\n): boolean {\n for (const stmt of program.body) {\n if (stmt.type !== 'ExpressionStatement') continue;\n const call = stmt.expression;\n if (call.type !== 'CallExpression') continue;\n if (call.callee.type !== 'Identifier') continue;\n const name = call.callee.name;\n if (\n name !== 'useSeoMeta' &&\n name !== 'useHead' &&\n name !== 'definePageMeta'\n )\n continue;\n const firstArg = call.arguments[0];\n if (!firstArg || firstArg.type !== 'ObjectExpression') continue;\n for (const prop of firstArg.properties) {\n if (prop.type !== 'Property') continue;\n if (prop.key.type === 'Identifier' && prop.key.name === 'title')\n return true;\n if (prop.key.type === 'Literal' && prop.key.value === 'title')\n return true;\n }\n }\n return false;\n}\n\nexport function check(ctx: SfcRuleContext): SfcRuleResult {\n if (!isNuxtPageFile(ctx.relativePath)) return { diagnostics: [] };\n const { scriptSetup } = ctx.descriptor;\n if (!scriptSetup) return { diagnostics: [] };\n const lang = scriptSetup.lang === 'ts' ? 'ts' : 'js';\n const { program } = parseSync(`script.${lang}`, scriptSetup.content, {\n sourceType: 'module',\n lang,\n });\n if (hasTitleInCall(program)) return { diagnostics: [] };\n const { line, column } = scriptSetup.loc.start;\n const diagnostics: Diagnostic[] = [\n {\n file: ctx.file,\n line,\n column,\n ruleId: RULE_ID,\n severity: 'warn',\n message: MESSAGE,\n source: 'sfc',\n recommendation: RECOMMENDATION,\n },\n ];\n return { diagnostics };\n}\n","import { check as noMixedOptionsAndCompositionApi } from './no-mixed-options-and-composition-api.js';\nimport { check as noMixedAppAndRootLayout } from './nuxt/no-mixed-app-and-root-layout.js';\nimport { check as ogImageDefined } from './nuxt/og-image-defined.js';\nimport { check as useSeoMetaOnPublicPage } from './nuxt/use-seo-meta-on-public-page.js';\nimport type { SfcRule } from './types.js';\n\nexport const SFC_RULES: SfcRule[] = [\n {\n id: 'vue-doctor/sfc/no-mixed-options-and-composition-api',\n check: noMixedOptionsAndCompositionApi,\n },\n {\n id: 'nuxt-doctor/seo/useSeoMeta-on-public-page',\n check: useSeoMetaOnPublicPage,\n },\n {\n id: 'nuxt-doctor/seo/og-image-defined',\n check: ogImageDefined,\n },\n {\n id: 'nuxt-doctor/ai-slop/no-mixed-app-and-root-layout',\n check: noMixedAppAndRootLayout,\n },\n];\n","import { relative } from 'node:path';\nimport type { Diagnostic, Severity } from '../types.js';\nimport type { ProjectInfo } from '../types/project-info.js';\nimport { parseSfcDescriptor } from './parse-sfc-descriptor.js';\nimport { SFC_RULES } from './rules/index.js';\n\nexport interface SfcPassOptions {\n files: string[];\n ruleOverrides?: Record<string, Severity | 'off'>;\n projectInfo?: ProjectInfo;\n}\n\nexport async function runSfcPass(opts: SfcPassOptions): Promise<Diagnostic[]> {\n const all: Diagnostic[] = [];\n const { projectInfo } = opts;\n const rootDir = projectInfo?.rootDirectory ?? process.cwd();\n for (const file of opts.files) {\n if (!file.endsWith('.vue')) continue;\n const descriptor = await parseSfcDescriptor(file);\n if (!descriptor) continue;\n const relativePath = relative(rootDir, file).replace(/\\\\/g, '/');\n for (const rule of SFC_RULES) {\n const override = opts.ruleOverrides?.[rule.id];\n if (override === 'off') continue;\n const { diagnostics } = rule.check({\n file,\n descriptor,\n rootDirectory: rootDir,\n relativePath,\n projectInfo,\n });\n for (const d of diagnostics) {\n all.push(override ? { ...d, severity: override } : d);\n }\n }\n }\n return all;\n}\n","import { parseSync } from 'oxc-parser';\nimport { relative } from 'node:path';\nimport type { Diagnostic } from '../../types.js';\nimport { isNuxtPageFile } from '../file-role.js';\nimport { parseSfcDescriptor } from '../../sfc/parse-sfc-descriptor.js';\nimport type { ProjectInfo } from '../../types/project-info.js';\n\nexport interface CrossFilePassOptions {\n files: string[];\n projectInfo: ProjectInfo;\n}\n\nexport interface ParsedPageScript {\n file: string;\n relativePath: string;\n keys: string[];\n scriptSetupContent: string;\n scriptSetupLang: 'ts' | 'js';\n scriptSetupLine: number;\n}\n\nfunction extractDataFetchingKeys(content: string, lang: 'ts' | 'js'): string[] {\n const keys: string[] = [];\n try {\n const { program } = parseSync(`script.${lang}`, content, {\n sourceType: 'module',\n lang,\n });\n for (const stmt of program.body) {\n if (stmt.type === 'VariableDeclaration') {\n for (const decl of stmt.declarations) {\n const call = unwrapAwait(decl.init);\n if (call?.type !== 'CallExpression') continue;\n extractKeyFromCall(call, keys);\n }\n } else if (stmt.type === 'ExpressionStatement') {\n const expr = unwrapAwait(stmt.expression);\n if (expr?.type === 'CallExpression') {\n extractKeyFromCall(expr, keys);\n }\n }\n }\n } catch {}\n return keys;\n}\n\ntype MaybeNode = { type: string; argument?: MaybeNode } | null | undefined;\n\nfunction unwrapAwait<T extends MaybeNode>(node: T): MaybeNode {\n if (node?.type === 'AwaitExpression') return node.argument;\n return node;\n}\n\nfunction extractKeyFromCall(\n call: Record<string, unknown>,\n keys: string[],\n): void {\n if (call.callee.type !== 'Identifier') return;\n const fnName = call.callee.name;\n if (fnName !== 'useAsyncData' && fnName !== 'useFetch') return;\n const keyArg = call.arguments[0];\n if (keyArg?.type === 'Literal' && typeof keyArg.value === 'string') {\n keys.push(keyArg.value);\n } else if (keyArg?.type === 'TemplateLiteral' && keyArg.quasis.length === 1) {\n const val = keyArg.quasis[0]?.value?.raw;\n if (val) keys.push(val);\n }\n if (fnName === 'useFetch' && call.arguments.length >= 2) {\n const optsArg = call.arguments[1];\n if (optsArg?.type === 'ObjectExpression') {\n for (const prop of optsArg.properties) {\n if (\n prop.type === 'Property' &&\n prop.key.type === 'Identifier' &&\n prop.key.name === 'key' &&\n prop.value.type === 'Literal' &&\n typeof prop.value.value === 'string'\n ) {\n keys.push(prop.value.value);\n }\n }\n }\n }\n}\n\nexport async function runCrossFilePass(\n opts: CrossFilePassOptions,\n): Promise<Diagnostic[]> {\n const { files, projectInfo } = opts;\n if (projectInfo.framework !== 'nuxt') return [];\n const rootDir = projectInfo.rootDirectory;\n const pageFiles = files.filter((f) =>\n isNuxtPageFile(relative(rootDir, f).replace(/\\\\/g, '/')),\n );\n if (pageFiles.length === 0) return [];\n const parsed: ParsedPageScript[] = [];\n for (const file of pageFiles) {\n const descriptor = await parseSfcDescriptor(file);\n if (!descriptor) continue;\n const { scriptSetup } = descriptor;\n if (!scriptSetup) continue;\n parsed.push({\n file,\n relativePath: relative(rootDir, file).replace(/\\\\/g, '/'),\n keys: extractDataFetchingKeys(\n scriptSetup.content,\n scriptSetup.lang === 'ts' ? 'ts' : 'js',\n ),\n scriptSetupContent: scriptSetup.content,\n scriptSetupLang: scriptSetup.lang === 'ts' ? 'ts' : 'js',\n scriptSetupLine: scriptSetup.loc.start.line,\n });\n }\n return runCrossFileRules(parsed);\n}\n\nfunction runCrossFileRules(pages: ParsedPageScript[]): Diagnostic[] {\n const all: Diagnostic[] = [];\n all.push(...ruleNoSharedKeyAcrossPages(pages));\n all.push(...ruleSsrSafeOnMountedOnlyForClient(pages));\n return all;\n}\n\nfunction ruleNoSharedKeyAcrossPages(pages: ParsedPageScript[]): Diagnostic[] {\n const keyToFiles = new Map<string, string[]>();\n for (const page of pages) {\n for (const key of page.keys) {\n const existing = keyToFiles.get(key) ?? [];\n if (!existing.includes(page.file)) existing.push(page.file);\n keyToFiles.set(key, existing);\n }\n }\n const diags: Diagnostic[] = [];\n for (const [key, files] of keyToFiles) {\n if (files.length < 2) continue;\n for (const file of files) {\n diags.push({\n file,\n line: 1,\n column: 1,\n ruleId: 'nuxt-doctor/data-fetching/no-shared-key-across-pages',\n severity: 'warn',\n message: `Data fetching key \"${key}\" is shared across ${files.length} different page files. This causes cache collisions in useAsyncData/useFetch. Use a unique key per page.`,\n source: 'cross-file',\n recommendation: `Rename the key to something page-specific, e.g. \"page-${key}\" or \"users-${key}\".`,\n });\n }\n }\n return diags;\n}\n\nconst BROWSER_GLOBALS = new Set([\n 'window',\n 'document',\n 'navigator',\n 'localStorage',\n 'sessionStorage',\n 'location',\n 'history',\n 'fetch',\n 'XMLHttpRequest',\n 'matchMedia',\n 'IntersectionObserver',\n 'MutationObserver',\n 'indexedDB',\n 'webkit',\n 'moz',\n 'onmessage',\n]);\n\nfunction ruleSsrSafeOnMountedOnlyForClient(\n pages: ParsedPageScript[],\n): Diagnostic[] {\n const diags: Diagnostic[] = [];\n for (const page of pages) {\n const { program } = parseSync(\n `script.${page.scriptSetupLang}`,\n page.scriptSetupContent,\n { sourceType: 'module', lang: page.scriptSetupLang },\n );\n for (const stmt of program.body) {\n if (stmt.type === 'VariableDeclaration') {\n for (const decl of stmt.declarations) {\n const init = decl.init;\n if (!init) continue;\n if (init.type === 'CallExpression') {\n const call = init;\n if (isSkippedReactiveCall(call)) continue;\n checkCallForBrowserGlobal(call, page, diags);\n } else if (init.type === 'MemberExpression') {\n checkMemberForBrowserGlobal(init, page, diags);\n }\n }\n } else if (stmt.type === 'ExpressionStatement') {\n const expr = stmt.expression;\n if (expr.type === 'CallExpression') {\n if (isSkippedReactiveCall(expr)) continue;\n checkCallForBrowserGlobal(expr, page, diags);\n } else if (expr.type === 'MemberExpression') {\n checkMemberForBrowserGlobal(expr, page, diags);\n }\n }\n }\n }\n return diags;\n}\n\nconst CLIENT_SAFE_WRAPPERS = new Set(['onMounted', 'watchEffect', 'watch']);\n\nfunction isSkippedReactiveCall(call: {\n callee: { type: string; name?: string };\n}): boolean {\n if (call.callee.type !== 'Identifier') return false;\n return CLIENT_SAFE_WRAPPERS.has(call.callee.name as string);\n}\n\nfunction checkCallForBrowserGlobal(\n call: Record<string, unknown>,\n page: ParsedPageScript,\n diags: Diagnostic[],\n) {\n const callee = call.callee as Record<string, unknown>;\n if (callee.type !== 'MemberExpression') return;\n const obj = callee.object as Record<string, unknown>;\n if (obj.type !== 'Identifier' || !BROWSER_GLOBALS.has(obj.name as string))\n return;\n diags.push({\n file: page.file,\n line: page.scriptSetupLine,\n column: 1,\n ruleId: 'nuxt-doctor/data-fetching/ssr-safe-onMounted-only-for-client',\n severity: 'warn',\n message: `Browser global \"${obj.name}\" is accessed at setup top-level outside onMounted. This causes SSR/hydration mismatches. Move browser-only code inside onMounted or a client-only plugin.`,\n source: 'cross-file',\n recommendation: `Wrap \"${obj.name}\" access in onMounted(() => { /* code */ }) or use defineNuxtPlugin to run only on the client.`,\n });\n}\n\nfunction checkMemberForBrowserGlobal(\n mem: Record<string, unknown>,\n page: ParsedPageScript,\n diags: Diagnostic[],\n) {\n const obj = mem.object as Record<string, unknown>;\n if (obj.type !== 'Identifier' || !BROWSER_GLOBALS.has(obj.name as string))\n return;\n diags.push({\n file: page.file,\n line: page.scriptSetupLine,\n column: 1,\n ruleId: 'nuxt-doctor/data-fetching/ssr-safe-onMounted-only-for-client',\n severity: 'warn',\n message: `Browser global \"${obj.name}\" is accessed at setup top-level outside onMounted. This causes SSR/hydration mismatches. Move browser-only code inside onMounted or a client-only plugin.`,\n source: 'cross-file',\n recommendation: `Wrap \"${obj.name}\" access in onMounted(() => { /* code */ }) or use defineNuxtPlugin to run only on the client.`,\n });\n}\n","import { readFile } from 'node:fs/promises';\nimport { parse, type SFCDescriptor } from '@vue/compiler-sfc';\n\nconst cache = new Map<string, SFCDescriptor | null>();\n\nexport async function parseSfc(absPath: string): Promise<SFCDescriptor | null> {\n if (cache.has(absPath)) return cache.get(absPath) ?? null;\n let source: string;\n try {\n source = await readFile(absPath, 'utf8');\n } catch {\n cache.set(absPath, null);\n return null;\n }\n const { descriptor, errors } = parse(source, { filename: absPath });\n if (errors.length > 0 || !descriptor.template) {\n cache.set(absPath, null);\n return null;\n }\n cache.set(absPath, descriptor);\n return descriptor;\n}\n\nexport function clearSfcCache(): void {\n cache.clear();\n}\n","import type {\n AttributeNode,\n DirectiveNode,\n ElementNode,\n} from '@vue/compiler-core';\n\nconst NODE_DIRECTIVE = 7;\n\nexport function findDirective(\n el: ElementNode,\n name: string,\n): DirectiveNode | undefined {\n for (const prop of el.props) {\n if (prop.type === NODE_DIRECTIVE && prop.name === name)\n return prop as DirectiveNode;\n }\n return undefined;\n}\n\nexport function findBindAttr(\n el: ElementNode,\n attrName: string,\n): DirectiveNode | undefined {\n for (const prop of el.props) {\n if (prop.type !== NODE_DIRECTIVE) continue;\n const dir = prop as DirectiveNode;\n if (dir.name !== 'bind') continue;\n const arg = dir.arg as { content?: string } | undefined;\n if (arg?.content === attrName) return dir;\n }\n return undefined;\n}\n\nexport function findStaticAttr(\n el: ElementNode,\n attrName: string,\n): AttributeNode | undefined {\n for (const prop of el.props) {\n if (prop.type === 6 && (prop as AttributeNode).name === attrName) {\n return prop as AttributeNode;\n }\n }\n return undefined;\n}\n","import type { ElementNode } from '@vue/compiler-core';\nimport type { Diagnostic } from '../../types.js';\nimport {\n findBindAttr,\n findDirective,\n findStaticAttr,\n} from '../directive-helpers.js';\nimport { walkElements } from '../walk.js';\nimport type { TemplateRuleContext, TemplateRuleResult } from './types.js';\n\nexport function check(ctx: TemplateRuleContext): TemplateRuleResult {\n const diagnostics: Diagnostic[] = [];\n walkElements(ctx.template, (el: ElementNode) => {\n const vFor = findDirective(el, 'for');\n if (!vFor) return;\n const hasKey = findBindAttr(el, 'key') ?? findStaticAttr(el, 'key');\n if (hasKey) return;\n diagnostics.push({\n file: ctx.file,\n line: el.loc.start.line,\n column: el.loc.start.column,\n endLine: el.loc.end.line,\n endColumn: el.loc.end.column,\n ruleId: 'vue-doctor/template/v-for-has-key',\n severity: 'error',\n message: `<${el.tag}> uses v-for without :key. Vue cannot efficiently diff this list across renders.`,\n source: 'template',\n recommendation:\n 'Add :key with a stable, unique identifier from the iterated item.',\n });\n });\n return { diagnostics };\n}\n","import type { ElementNode } from '@vue/compiler-core';\nimport type { Diagnostic } from '../../types.js';\nimport { findDirective } from '../directive-helpers.js';\nimport { walkElements } from '../walk.js';\nimport type { TemplateRuleContext, TemplateRuleResult } from './types.js';\n\nexport function check(ctx: TemplateRuleContext): TemplateRuleResult {\n const diagnostics: Diagnostic[] = [];\n walkElements(ctx.template, (el: ElementNode) => {\n const vIf = findDirective(el, 'if');\n const vFor = findDirective(el, 'for');\n if (!vIf || !vFor) return;\n diagnostics.push({\n file: ctx.file,\n line: el.loc.start.line,\n column: el.loc.start.column,\n endLine: el.loc.end.line,\n endColumn: el.loc.end.column,\n ruleId: 'vue-doctor/template/v-if-v-for-precedence',\n severity: 'error',\n message: `<${el.tag}> uses v-if and v-for on the same element. In Vue 3, v-if binds tighter than v-for, so the condition cannot reference loop variables.`,\n source: 'template',\n recommendation:\n 'Move the v-if to a <template v-for> wrapper or to a parent element, or filter the iterated source in a computed.',\n });\n });\n return { diagnostics };\n}\n","import type { ElementNode } from '@vue/compiler-core';\nimport { babelParse } from '@vue/compiler-sfc';\nimport type { Diagnostic } from '../../types.js';\nimport { findDirective } from '../directive-helpers.js';\nimport { walkElements } from '../walk.js';\nimport type { TemplateRuleContext, TemplateRuleResult } from './types.js';\n\nconst ARRAY_LITERAL_THRESHOLD = 100;\n\nfunction findLargeArrayBindings(script: string): Map<string, number> {\n const bindings = new Map<string, number>();\n try {\n const ast = babelParse(script, { sourceType: 'module' });\n for (const node of ast.program.body) {\n if (node.type !== 'VariableDeclaration') continue;\n if (node.kind !== 'const' && node.kind !== 'let') continue;\n for (const decl of node.declarations) {\n if (decl.id.type !== 'Identifier') continue;\n const init = decl.init;\n if (!init || init.type !== 'ArrayExpression') continue;\n if (!init.elements || init.elements.length <= ARRAY_LITERAL_THRESHOLD)\n continue;\n bindings.set(decl.id.name, init.elements.length);\n }\n }\n } catch {\n // ignore parse errors\n }\n return bindings;\n}\n\nexport function check(ctx: TemplateRuleContext): TemplateRuleResult {\n const diagnostics: Diagnostic[] = [];\n\n const largeArrays =\n ctx.script && ctx.script.length > 0\n ? findLargeArrayBindings(ctx.script)\n : new Map<string, number>();\n\n walkElements(ctx.template, (el: ElementNode) => {\n const vFor = findDirective(el, 'for');\n if (!vFor) return;\n\n const vMemo = findDirective(el, 'memo');\n if (vMemo) return;\n\n const source = vFor.forParseResult?.source;\n if (!source) return;\n\n const sourceName = source.content;\n const largeArraySize = largeArrays.get(sourceName);\n if (\n largeArraySize !== undefined &&\n largeArraySize > ARRAY_LITERAL_THRESHOLD\n ) {\n diagnostics.push({\n file: ctx.file,\n line: el.loc.start.line,\n column: el.loc.start.column,\n endLine: el.loc.end.line,\n endColumn: el.loc.end.column,\n ruleId: 'vue-doctor/template/v-memo-on-large-list',\n severity: 'warn',\n message: `<${el.tag}> uses v-for over a large dataset (array literal with ${largeArraySize} items) without v-memo. Vue cannot skip diffing this list on every render.`,\n source: 'template',\n recommendation:\n 'Add v-memo with a meaningful memoization key so Vue can skip re-rendering unchanged items.',\n });\n }\n });\n\n return { diagnostics };\n}\n","import type {\n ElementNode,\n RootNode,\n TemplateChildNode,\n} from '@vue/compiler-core';\nimport type { Diagnostic } from '../../types.js';\nimport type { TemplateRuleContext, TemplateRuleResult } from './types.js';\n\nconst NODE_DIRECTIVE = 7;\n\nfunction checkElement(\n el: ElementNode,\n inVForSubtree: boolean,\n ctx: TemplateRuleContext,\n diagnostics: Diagnostic[],\n): void {\n const isVFor = el.props.some(\n (p) => p.type === NODE_DIRECTIVE && (p as { name?: string }).name === 'for',\n );\n\n const effectiveInVFor = inVForSubtree || isVFor;\n\n if (effectiveInVFor) {\n for (const prop of el.props) {\n if (prop.type !== NODE_DIRECTIVE) continue;\n const dir = prop as {\n name?: string;\n arg?: { content?: string } | null;\n exp?: { ast?: { type?: string } | null } | null;\n loc: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n };\n if (dir.name !== 'bind') continue;\n\n const attrName = dir.arg?.content;\n if (!attrName || attrName === 'key') continue;\n\n const astType = dir.exp?.ast?.type;\n if (astType !== 'ObjectExpression' && astType !== 'ArrayExpression')\n continue;\n\n diagnostics.push({\n file: ctx.file,\n line: dir.loc.start.line,\n column: dir.loc.start.column,\n endLine: dir.loc.end.line,\n endColumn: dir.loc.end.column,\n ruleId: 'vue-doctor/template/no-inline-object-prop-in-list',\n severity: 'warn',\n message: `<${el.tag}> has an inline ${attrName} prop with an object or array literal inside a v-for subtree. Inline objects and arrays create new references on every render, defeating v-for's ability to reuse DOM nodes.`,\n source: 'template',\n recommendation:\n 'Move the object or array to a computed property or a module-level constant so the reference remains stable across renders.',\n });\n }\n }\n\n for (const child of el.children) {\n if (child.type === 1) {\n checkElement(child as ElementNode, effectiveInVFor, ctx, diagnostics);\n }\n }\n}\n\nexport function check(ctx: TemplateRuleContext): TemplateRuleResult {\n const diagnostics: Diagnostic[] = [];\n\n function walk(node: TemplateChildNode, inVForSubtree: boolean): void {\n if (node.type === 1) {\n checkElement(node as ElementNode, inVForSubtree, ctx, diagnostics);\n } else if (node.type === 0) {\n const root = node as RootNode;\n for (const child of root.children) {\n walk(child, inVForSubtree);\n }\n }\n }\n\n walk(ctx.template as unknown as TemplateChildNode, false);\n return { diagnostics };\n}\n","import type {\n ElementNode,\n RootNode,\n TemplateChildNode,\n} from '@vue/compiler-core';\nimport type { Diagnostic } from '../../types.js';\nimport type { TemplateRuleContext, TemplateRuleResult } from './types.js';\n\nconst NODE_ELEMENT = 1;\nconst NODE_INTERPOLATION = 5;\nconst NODE_DIRECTIVE = 7;\n\ninterface ExprNode {\n type?: string;\n computed?: boolean;\n name?: string;\n object?: ExprNode;\n property?: ExprNode;\n}\n\ninterface Loc {\n start: { line: number; column: number };\n end: { line: number; column: number };\n}\n\ninterface BindDirective {\n name?: string;\n exp?: { ast?: unknown } | null;\n loc: Loc;\n}\n\ninterface InterpolationNode {\n content: { ast?: unknown };\n loc: Loc;\n}\n\nfunction isValueDeref(node: ExprNode): boolean {\n if (node.type !== 'MemberExpression' || node.computed === true) return false;\n const { object, property } = node as {\n object: ExprNode;\n property: ExprNode;\n };\n return object.type === 'Identifier' && property.name === 'value';\n}\n\nfunction containsValueDeref(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n if (Array.isArray(value)) {\n return value.some((item) => containsValueDeref(item));\n }\n const node = value as ExprNode;\n return (\n isValueDeref(node) ||\n Object.values(node).some((child) => containsValueDeref(child))\n );\n}\n\nfunction pushDiagnostic(\n el: ElementNode,\n loc: Loc,\n ctx: TemplateRuleContext,\n diagnostics: Diagnostic[],\n): void {\n diagnostics.push({\n file: ctx.file,\n line: loc.start.line,\n column: loc.start.column,\n endLine: loc.end.line,\n endColumn: loc.end.column,\n ruleId: 'vue-doctor/template/no-computed-getter-in-template-loop',\n severity: 'warn',\n message: `<${el.tag}> reads a ref or computed via .value inside a v-for subtree. The getter re-runs on every item and every render, which is easy to hoist out of the loop.`,\n source: 'template',\n recommendation:\n 'Read .value once into a computed property or a local binding outside the loop so the getter runs a single time per render.',\n });\n}\n\nfunction checkElement(\n el: ElementNode,\n inVForSubtree: boolean,\n ctx: TemplateRuleContext,\n diagnostics: Diagnostic[],\n): void {\n const isVFor = el.props.some(\n (p) => p.type === NODE_DIRECTIVE && (p as { name?: string }).name === 'for',\n );\n\n const effectiveInVFor = inVForSubtree || isVFor;\n\n if (effectiveInVFor) {\n for (const prop of el.props) {\n if (prop.type !== NODE_DIRECTIVE) continue;\n const dir = prop as BindDirective;\n if (dir.name !== 'bind') continue;\n if (containsValueDeref(dir.exp?.ast)) {\n pushDiagnostic(el, dir.loc, ctx, diagnostics);\n }\n }\n\n for (const child of el.children) {\n if (child.type === NODE_INTERPOLATION) {\n const interp = child as unknown as InterpolationNode;\n if (containsValueDeref(interp.content.ast)) {\n pushDiagnostic(el, interp.loc, ctx, diagnostics);\n }\n }\n }\n }\n\n for (const child of el.children) {\n if (child.type === NODE_ELEMENT) {\n checkElement(child as ElementNode, effectiveInVFor, ctx, diagnostics);\n }\n }\n}\n\nexport function check(ctx: TemplateRuleContext): TemplateRuleResult {\n const diagnostics: Diagnostic[] = [];\n\n function walk(node: TemplateChildNode, inVForSubtree: boolean): void {\n if (node.type === NODE_ELEMENT) {\n checkElement(node as ElementNode, inVForSubtree, ctx, diagnostics);\n } else if (node.type === 0) {\n const root = node as RootNode;\n for (const child of root.children) {\n walk(child, inVForSubtree);\n }\n }\n }\n\n walk(ctx.template as unknown as TemplateChildNode, false);\n return { diagnostics };\n}\n","import type {\n ElementNode,\n RootNode,\n TemplateChildNode,\n} from '@vue/compiler-core';\nimport type { Diagnostic } from '../../types.js';\nimport type { TemplateRuleContext, TemplateRuleResult } from './types.js';\n\nconst NODE_ELEMENT = 1;\nconst NODE_DIRECTIVE = 7;\n\ninterface SpreadDirective {\n name?: string;\n arg?: unknown;\n exp?: { ast?: unknown } | null;\n loc: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n}\n\nfunction isIdentifierSpread(dir: SpreadDirective): boolean {\n return dir.name === 'bind' && dir.arg === undefined && dir.exp?.ast === null;\n}\n\nfunction checkElement(\n el: ElementNode,\n inVForSubtree: boolean,\n ctx: TemplateRuleContext,\n diagnostics: Diagnostic[],\n): void {\n const isVFor = el.props.some(\n (p) => p.type === NODE_DIRECTIVE && (p as { name?: string }).name === 'for',\n );\n\n const effectiveInVFor = inVForSubtree || isVFor;\n\n if (effectiveInVFor) {\n for (const prop of el.props) {\n if (prop.type !== NODE_DIRECTIVE) continue;\n const dir = prop as SpreadDirective;\n if (!isIdentifierSpread(dir)) continue;\n diagnostics.push({\n file: ctx.file,\n line: dir.loc.start.line,\n column: dir.loc.start.column,\n endLine: dir.loc.end.line,\n endColumn: dir.loc.end.column,\n ruleId: 'vue-doctor/template/avoid-deep-v-bind-spread-in-list',\n severity: 'info',\n message: `<${el.tag}> spreads a whole object via v-bind inside a v-for subtree. Spreading a reactive object binds every property per item, which can churn props and defeat patching on large lists.`,\n source: 'template',\n recommendation:\n 'Bind only the props each item needs explicitly, or hoist a stable per-item object so Vue can patch instead of re-binding the full spread.',\n });\n }\n }\n\n for (const child of el.children) {\n if (child.type === NODE_ELEMENT) {\n checkElement(child as ElementNode, effectiveInVFor, ctx, diagnostics);\n }\n }\n}\n\nexport function check(ctx: TemplateRuleContext): TemplateRuleResult {\n const diagnostics: Diagnostic[] = [];\n\n function walk(node: TemplateChildNode, inVForSubtree: boolean): void {\n if (node.type === NODE_ELEMENT) {\n checkElement(node as ElementNode, inVForSubtree, ctx, diagnostics);\n } else if (node.type === 0) {\n const root = node as RootNode;\n for (const child of root.children) {\n walk(child, inVForSubtree);\n }\n }\n }\n\n walk(ctx.template as unknown as TemplateChildNode, false);\n return { diagnostics };\n}\n","import { check as vForHasKey } from './v-for-has-key.js';\nimport { check as vIfVForPrecedence } from './v-if-v-for-precedence.js';\nimport { check as vMemoOnLargeList } from './v-memo-on-large-list.js';\nimport { check as noInlineObjectPropInList } from './no-inline-object-prop-in-list.js';\nimport { check as noComputedGetterInTemplateLoop } from './no-computed-getter-in-template-loop.js';\nimport { check as avoidDeepVBindSpreadInList } from './avoid-deep-v-bind-spread-in-list.js';\nimport type { TemplateRule } from './types.js';\n\nexport const TEMPLATE_RULES: TemplateRule[] = [\n { id: 'vue-doctor/template/v-for-has-key', check: vForHasKey },\n { id: 'vue-doctor/template/v-if-v-for-precedence', check: vIfVForPrecedence },\n { id: 'vue-doctor/template/v-memo-on-large-list', check: vMemoOnLargeList },\n {\n id: 'vue-doctor/template/no-inline-object-prop-in-list',\n check: noInlineObjectPropInList,\n },\n {\n id: 'vue-doctor/template/no-computed-getter-in-template-loop',\n check: noComputedGetterInTemplateLoop,\n },\n {\n id: 'vue-doctor/template/avoid-deep-v-bind-spread-in-list',\n check: avoidDeepVBindSpreadInList,\n },\n];\n","import type { Diagnostic, Severity } from '../types.js';\nimport { parseSfc } from './parse-sfc.js';\nimport { TEMPLATE_RULES } from './rules/index.js';\n\nexport interface TemplatePassOptions {\n files: string[];\n ruleOverrides?: Record<string, Severity | 'off'>;\n}\n\nexport async function runTemplatePass(\n opts: TemplatePassOptions,\n): Promise<Diagnostic[]> {\n const all: Diagnostic[] = [];\n for (const file of opts.files) {\n if (!file.endsWith('.vue')) continue;\n const descriptor = await parseSfc(file);\n if (!descriptor?.template?.ast) continue;\n for (const rule of TEMPLATE_RULES) {\n const override = opts.ruleOverrides?.[rule.id];\n if (override === 'off') continue;\n const { diagnostics } = rule.check({\n file,\n template: descriptor.template.ast,\n script: descriptor.scriptSetup?.content ?? descriptor.script?.content,\n });\n for (const d of diagnostics) {\n all.push(override ? { ...d, severity: override } : d);\n }\n }\n }\n return all;\n}\n","import { resolve } from 'node:path';\nimport { performance } from 'node:perf_hooks';\nimport { checkBuildQuality } from './check-build-quality.js';\nimport { checkDeadCode } from './check-dead-code.js';\nimport { checkDeps } from './check-deps.js';\nimport { checkNuxtProject } from './check-nuxt-project.js';\nimport { dedupeDeadCodeAgainstLint } from './dead-code/dedupe.js';\nimport { applyInlineDisables } from './disables/index.js';\nimport { attachCodeSnippets } from './code-snippet.js';\nimport { detectProject } from './detect-project.js';\nimport { listSourceFiles } from './file-scan.js';\nimport { mergeDiagnostics } from './merge-diagnostics.js';\nimport { runScriptPass } from './oxlint/run.js';\nimport type { ProjectInfoLite } from './reporters/types.js';\nimport { scoreDiagnostics } from './score.js';\nimport { runSfcPass } from './sfc/run.js';\nimport { runCrossFilePass } from './nuxt/cross-file/run.js';\nimport { runTemplatePass } from './template/run.js';\nimport type {\n AuditConfig,\n AuditReport,\n Diagnostic,\n AuditTimings,\n} from './types.js';\n\nconst DEFAULT_INCLUDE = [\n '**/*.vue',\n '**/*.ts',\n '**/*.tsx',\n '**/*.js',\n '**/*.jsx',\n];\nconst DEFAULT_EXCLUDE = [\n 'node_modules',\n 'dist',\n '.nuxt',\n '.output',\n 'coverage',\n];\n\nfunction countRuleCounts(diagnostics: Diagnostic[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const d of diagnostics) {\n counts[d.ruleId] = (counts[d.ruleId] ?? 0) + 1;\n }\n return counts;\n}\n\nexport async function audit(config: AuditConfig = {}): Promise<AuditReport> {\n const rootDir = resolve(config.rootDir ?? process.cwd());\n const include = config.include ?? DEFAULT_INCLUDE;\n const exclude = config.exclude ?? DEFAULT_EXCLUDE;\n const failOn = config.failOn ?? 'error';\n const threshold = config.threshold ?? 0;\n const lintEnabled = config.lint !== false;\n\n const files = await listSourceFiles({ rootDir, include, exclude });\n\n const overallStart = performance.now();\n\n const project = await detectProject(rootDir);\n\n const templateStart = performance.now();\n const templateDiagnostics = lintEnabled\n ? await runTemplatePass({ files, ruleOverrides: config.rules })\n : [];\n const templateElapsed = performance.now() - templateStart;\n\n const sfcStart = performance.now();\n const sfcDiagnostics = lintEnabled\n ? await runSfcPass({\n files,\n ruleOverrides: config.rules,\n projectInfo: project,\n })\n : [];\n const sfcElapsed = performance.now() - sfcStart;\n\n let scriptDiagnostics: Diagnostic[] = [];\n let oxlintStderr = '';\n const scriptStart = performance.now();\n if (lintEnabled) {\n try {\n const result = await runScriptPass({\n rootDir,\n targetPath: rootDir,\n ruleOverrides: config.rules,\n framework: project.framework === 'nuxt' ? 'nuxt' : 'vue',\n });\n scriptDiagnostics = result.diagnostics;\n oxlintStderr = result.stderr;\n } catch (err) {\n oxlintStderr = err instanceof Error ? err.message : String(err);\n if (process.env.DOCTOR_DEBUG) {\n process.stderr.write(\n `[doctor-core] script pass failed: ${oxlintStderr}\\n`,\n );\n }\n }\n }\n const scriptElapsed = performance.now() - scriptStart;\n\n let deadCodeDiagnostics: Diagnostic[] = [];\n let deadCodeElapsed = 0;\n const deadCodeEnabled = config.deadCode !== false;\n if (deadCodeEnabled) {\n const deadCodeStart = performance.now();\n try {\n const { loadDoctorConfig } = await import('./config/load.js');\n const doctorConfig = await loadDoctorConfig(rootDir);\n const raw = await checkDeadCode({\n projectInfo: project,\n doctorConfig,\n enabled: true,\n });\n const deduplicated = dedupeDeadCodeAgainstLint(raw, [\n ...templateDiagnostics,\n ...sfcDiagnostics,\n ...scriptDiagnostics,\n ]);\n deadCodeDiagnostics = deduplicated.filter(\n (d) => config.rules?.[d.ruleId] !== 'off',\n );\n } catch {\n // knip failed — diagnostics remain empty for this pass\n }\n deadCodeElapsed = performance.now() - deadCodeStart;\n }\n\n let buildQualityDiagnostics: Diagnostic[] = [];\n try {\n const raw = await checkBuildQuality(project);\n buildQualityDiagnostics = raw\n .filter((d) => config.rules?.[d.ruleId] !== 'off')\n .map((d) => {\n const override = config.rules?.[d.ruleId];\n return override ? { ...d, severity: override } : d;\n });\n } catch {\n // build-quality pass failed — diagnostics remain empty for this pass\n }\n\n let depsDiagnostics: Diagnostic[] = [];\n try {\n const raw = await checkDeps(project);\n depsDiagnostics = raw\n .filter((d) => config.rules?.[d.ruleId] !== 'off')\n .map((d) => {\n const override = config.rules?.[d.ruleId];\n return override ? { ...d, severity: override } : d;\n });\n } catch {\n // deps pass failed — diagnostics remain empty for this pass\n }\n\n let nuxtProjectDiagnostics: Diagnostic[] = [];\n if (project.framework === 'nuxt') {\n try {\n const raw = await checkNuxtProject(project);\n nuxtProjectDiagnostics = raw\n .filter((d) => config.rules?.[d.ruleId] !== 'off')\n .map((d) => {\n const override = config.rules?.[d.ruleId];\n return override ? { ...d, severity: override } : d;\n });\n } catch {\n // nuxt-project pass failed — diagnostics remain empty for this pass\n }\n }\n\n let crossFileDiagnostics: Diagnostic[] = [];\n if (project.framework === 'nuxt') {\n try {\n const raw = await runCrossFilePass({ files, projectInfo: project });\n crossFileDiagnostics = raw\n .filter((d) => config.rules?.[d.ruleId] !== 'off')\n .map((d) => {\n const override = config.rules?.[d.ruleId];\n return override ? { ...d, severity: override } : d;\n });\n } catch {\n // cross-file pass failed — diagnostics remain empty for this pass\n }\n }\n\n const elapsedMs = performance.now() - overallStart;\n\n const timings: AuditTimings = {\n template: templateElapsed,\n sfc: sfcElapsed,\n script: scriptElapsed,\n deadCode: deadCodeElapsed,\n total: elapsedMs,\n };\n\n const merged = mergeDiagnostics(\n templateDiagnostics,\n sfcDiagnostics,\n scriptDiagnostics,\n deadCodeDiagnostics,\n buildQualityDiagnostics,\n depsDiagnostics,\n nuxtProjectDiagnostics,\n crossFileDiagnostics,\n );\n let afterDisables = applyInlineDisables(merged, {\n respect: config.respectInlineDisables !== false,\n });\n if (config.scopeFiles) {\n const scope = new Set(config.scopeFiles.map((f) => resolve(rootDir, f)));\n afterDisables = afterDisables.filter((d) =>\n scope.has(resolve(rootDir, d.file)),\n );\n }\n const diagnostics = await attachCodeSnippets(afterDisables);\n const scored = scoreDiagnostics(diagnostics, { threshold });\n\n const ruleCounts = countRuleCounts(diagnostics);\n\n const projectInfo: ProjectInfoLite = {\n framework: project.framework,\n vueVersion: project.vueVersion,\n nuxtVersion: project.nuxtVersion,\n capabilities: [...project.capabilities].sort(),\n rootDirectory: project.rootDirectory,\n };\n\n let exitCode: 0 | 1 | 2 = 0;\n if (\n oxlintStderr &&\n scriptDiagnostics.length === 0 &&\n oxlintStderr.includes('Failed')\n ) {\n exitCode = 2;\n } else if (failOn !== 'none') {\n const tripping =\n failOn === 'warn'\n ? scored.errorCount + scored.warnCount\n : scored.errorCount;\n if (tripping > 0) exitCode = 1;\n }\n\n return {\n rootDir,\n filesScanned: files.length,\n diagnostics,\n score: scored.score,\n errorCount: scored.errorCount,\n warnCount: scored.warnCount,\n infoCount: scored.infoCount,\n exitCode,\n scoreResult: scored,\n projectInfo,\n elapsedMs,\n timings,\n ruleCounts,\n };\n}\n","import type { DoctorUserConfig } from './types.js';\n\nexport function defineConfig<T extends DoctorUserConfig>(config: T): T {\n return config;\n}\n","import type { ResolvedDoctorConfig } from './types.js';\nimport type { Severity } from '../types.js';\n\nexport interface CliOverrides {\n include?: string[];\n exclude?: string[];\n failOn?: 'error' | 'warn' | 'none';\n threshold?: number;\n rules?: Record<string, Severity | 'off'>;\n}\n\nexport function mergeCliOverrides(\n resolved: ResolvedDoctorConfig,\n cli: CliOverrides,\n): ResolvedDoctorConfig {\n const rules = { ...resolved.rules };\n\n if (cli.rules) {\n for (const [key, value] of Object.entries(cli.rules)) {\n if (value === 'off') {\n delete rules[key];\n } else {\n rules[key] = value;\n }\n }\n }\n\n return {\n rootDir: resolved.rootDir,\n include: cli.include ?? resolved.include,\n exclude: cli.exclude ?? resolved.exclude,\n failOn: cli.failOn ?? resolved.failOn,\n threshold: cli.threshold ?? resolved.threshold,\n rules,\n source: resolved.source,\n configFile: resolved.configFile,\n };\n}\n","import { execFile } from 'node:child_process';\nimport { resolve } from 'node:path';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport type GitScopeMode = 'diff' | 'staged';\n\nconst SOURCE_EXTENSIONS = ['.vue', '.ts', '.tsx', '.js', '.jsx'];\n\nfunction isSourceFile(path: string): boolean {\n return SOURCE_EXTENSIONS.some((ext) => path.endsWith(ext));\n}\n\nexport interface GitScopeOptions {\n rootDir: string;\n mode: GitScopeMode;\n}\n\nasync function gitLines(rootDir: string, args: string[]): Promise<string[]> {\n const { stdout } = await execFileAsync('git', args, { cwd: rootDir });\n return stdout\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n}\n\nexport async function listChangedFiles(\n options: GitScopeOptions,\n): Promise<string[]> {\n const { rootDir, mode } = options;\n\n let relPaths: string[];\n if (mode === 'staged') {\n relPaths = await gitLines(rootDir, [\n 'diff',\n '--name-only',\n '--cached',\n '--diff-filter=ACMR',\n ]);\n } else {\n const tracked = await gitLines(rootDir, [\n 'diff',\n '--name-only',\n 'HEAD',\n '--diff-filter=ACMR',\n ]);\n const untracked = await gitLines(rootDir, [\n 'ls-files',\n '--others',\n '--exclude-standard',\n ]);\n relPaths = [...tracked, ...untracked];\n }\n\n const absolute = relPaths\n .filter(isSourceFile)\n .map((rel) => resolve(rootDir, rel));\n return [...new Set(absolute)].sort();\n}\n","export function docsUrl(ruleId: string): string {\n return `https://docs.doctor.geoql.in/rules/${ruleId}`;\n}\n","import { relative } from 'node:path';\nimport type { ScoreBreakdownEntry, ScoreResult } from '../score.js';\nimport type { Diagnostic, Severity } from '../types.js';\nimport { docsUrl } from './docs-url.js';\nimport type { ReporterInput, ReporterOptions } from './types.js';\n\nconst CODE_WIDTH = 80;\nconst WHY_WIDTH = 70;\nconst SEVERITY_WIDTH = 6;\nconst CONTINUATION_INDENT = ' '.repeat(10);\n\nexport interface Theme {\n severity: (severity: Severity) => string;\n scoreValue: (score: number) => string;\n}\n\nfunction relativize(file: string, rootDirectory: string): string {\n return relative(rootDirectory, file).replaceAll('\\\\', '/');\n}\n\nexport function compareStrings(a: string, b: string): number {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n}\n\nfunction truncateCode(code: string): string {\n if (code.length <= CODE_WIDTH) return code;\n return `${code.slice(0, CODE_WIDTH - 1)}…`;\n}\n\nfunction wrapText(text: string, width: number): string[] {\n const words = text.trim().split(/\\s+/);\n const lines: string[] = [];\n let current = '';\n for (const word of words) {\n if (current === '') {\n current = word;\n } else if (`${current} ${word}`.length <= width) {\n current = `${current} ${word}`;\n } else {\n lines.push(current);\n current = word;\n }\n }\n if (current !== '') lines.push(current);\n return lines;\n}\n\nfunction formatWhy(message: string): string {\n return wrapText(message, WHY_WIDTH).join(`\\n${CONTINUATION_INDENT}`);\n}\n\nfunction severityTag(severity: Severity, theme: Theme): string {\n const padding = ' '.repeat(SEVERITY_WIDTH - severity.length);\n return `${theme.severity(severity)}${padding}`;\n}\n\nfunction sortDiagnostics(\n diagnostics: readonly Diagnostic[],\n rootDirectory: string,\n): Diagnostic[] {\n return [...diagnostics].sort((a, b) => {\n const byFile = compareStrings(\n relativize(a.file, rootDirectory),\n relativize(b.file, rootDirectory),\n );\n if (byFile !== 0) return byFile;\n if (a.line !== b.line) return a.line - b.line;\n if (a.column !== b.column) return a.column - b.column;\n return compareStrings(a.ruleId, b.ruleId);\n });\n}\n\nfunction diagnosticBlock(\n index: number,\n diagnostic: Diagnostic,\n rootDirectory: string,\n theme: Theme,\n): string {\n const tag = severityTag(diagnostic.severity, theme);\n const location = `${relativize(diagnostic.file, rootDirectory)}:${diagnostic.line}:${diagnostic.column}`;\n const code = truncateCode(diagnostic.codeSnippet ?? '');\n const fix = diagnostic.recommendation ?? '(no automated fix)';\n const why = formatWhy(diagnostic.message);\n return [\n `[${index}] ${tag} ${diagnostic.ruleId}`,\n ` file: ${location}`,\n ` code: ${code}`,\n ` fix: ${fix}`,\n ` why: ${why}`,\n ` docs: ${docsUrl(diagnostic.ruleId)}`,\n ].join('\\n');\n}\n\nfunction findingsLine(score: ScoreResult): string {\n if (score.totalFindings === 0) return 'FINDINGS: 0 (clean)';\n return `FINDINGS: ${score.totalFindings} (${score.errorCount} error, ${score.warnCount} warn, ${score.infoCount} info)`;\n}\n\nfunction nextSteps(breakdown: readonly ScoreBreakdownEntry[]): string {\n const top = breakdown.slice(0, 3);\n const lines = top.map(\n (entry) =>\n ` −${Math.round(entry.penalty)} pts ${entry.occurrences}× ${entry.ruleId}`,\n );\n lines.push(\n ` Run \\`vue-doctor explain ${breakdown[0]!.ruleId}\\` for full context.`,\n );\n return ['NEXT STEPS:', ...lines].join('\\n');\n}\n\nexport function render(\n input: ReporterInput,\n options: ReporterOptions | undefined,\n theme: Theme,\n): string {\n if (options?.quiet) {\n return `SCORE: ${theme.scoreValue(input.score.score)}/100 (threshold: ${input.score.threshold})\\n`;\n }\n\n const seconds = (input.elapsedMs / 1000).toFixed(1);\n const segments: string[] = [\n `${input.toolName} v${input.toolVersion}`,\n `analyzed ${input.analyzedFileCount} files in ${seconds}s`,\n '',\n `SCORE: ${theme.scoreValue(input.score.score)}/100 (threshold: ${input.score.threshold})`,\n '',\n findingsLine(input.score),\n ];\n\n const sorted = sortDiagnostics(input.diagnostics, input.rootDirectory);\n sorted.forEach((diagnostic, i) => {\n segments.push('');\n segments.push(\n diagnosticBlock(i + 1, diagnostic, input.rootDirectory, theme),\n );\n });\n\n if (input.score.breakdown.length > 0) {\n segments.push('');\n segments.push(nextSteps(input.score.breakdown));\n }\n\n return `${segments.join('\\n')}\\n`;\n}\n","import { render, type Theme } from './render.js';\nimport type { ReporterInput, ReporterOptions } from './types.js';\n\nconst plainTheme: Theme = {\n severity: (severity) => severity,\n scoreValue: (score) => String(score),\n};\n\nexport function agentReport(\n input: ReporterInput,\n options?: ReporterOptions,\n): string {\n return render(input, options, plainTheme);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { docsUrl } from './reporters/docs-url.js';\nimport { RULE_REGISTRY } from './rule-registry.js';\nimport type { RegisteredRule } from './rule-registry.js';\n\nexport interface RuleDoc {\n readonly id: string;\n readonly title: string;\n readonly severity: string;\n readonly category: string;\n readonly recommended: boolean;\n readonly source: string;\n readonly helpUri: string;\n readonly description: string;\n readonly hasOverride: boolean;\n}\n\nfunction autoDescription(rule: RegisteredRule): string {\n const presetNote = rule.recommended\n ? 'Active in the `recommended` preset.'\n : 'Off by default in `recommended`; enable via `--rule <id>:warn` or in `doctor.config.ts`.';\n return `\\`${rule.id}\\` is a ${rule.severity}-severity ${rule.category} rule from ${rule.source}. ${presetNote}\\n\\nSee ${docsUrl(rule.id)} for details when the docs site lands.`;\n}\n\nfunction resolveDocsRoot(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n return resolve(here, '..', 'docs', 'rules');\n}\n\nfunction safeReadOverride(ruleId: string, docsRoot: string): string | null {\n const safeName = `${ruleId.replace(/\\//g, '__')}.md`;\n const candidate = join(docsRoot, safeName);\n if (!existsSync(candidate)) return null;\n return readFileSync(candidate, 'utf-8');\n}\n\nexport interface LoadRuleDocOptions {\n readonly docsRoot?: string;\n}\n\nexport function loadRuleDoc(\n ruleId: string,\n options: LoadRuleDocOptions = {},\n): RuleDoc | null {\n const rule = RULE_REGISTRY.find((r) => r.id === ruleId);\n if (!rule) return null;\n const docsRoot = options.docsRoot ?? resolveDocsRoot();\n const override = safeReadOverride(ruleId, docsRoot);\n const description = override ?? autoDescription(rule);\n return {\n id: rule.id,\n title: rule.id,\n severity: rule.severity,\n category: rule.category,\n recommended: rule.recommended,\n source: rule.source,\n helpUri: docsUrl(rule.id),\n description,\n hasOverride: override !== null,\n };\n}\n\nexport function loadAllRuleDocs(options: LoadRuleDocOptions = {}): RuleDoc[] {\n return RULE_REGISTRY.map((rule) => loadRuleDoc(rule.id, options) as RuleDoc);\n}\n","import { loadRuleDoc } from '../rule-docs.js';\nimport { RULE_REGISTRY } from '../rule-registry.js';\nimport type { Diagnostic, Severity } from '../types.js';\nimport { docsUrl } from './docs-url.js';\nimport type { ReporterInput } from './types.js';\n\nconst SARIF_SCHEMA =\n 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json' as const;\nconst INFORMATION_URI = 'https://github.com/geoql/doctor';\n\ntype SarifLevel = 'error' | 'warning' | 'note';\n\ninterface SarifReportingDescriptor {\n id: string;\n name: string;\n shortDescription: { text: string };\n fullDescription: { text: string };\n helpUri: string;\n defaultConfiguration: { level: SarifLevel };\n properties: { category: string };\n}\n\ninterface SarifLocation {\n physicalLocation: {\n artifactLocation: { uri: string; uriBaseId: '%SRCROOT%' };\n region: {\n startLine: number;\n startColumn: number;\n endLine?: number;\n endColumn?: number;\n };\n };\n}\n\ninterface SarifResult {\n ruleId: string;\n level: SarifLevel;\n message: { text: string };\n locations: SarifLocation[];\n partialFingerprints: { primaryLocationLineHash: string };\n}\n\ninterface SarifLog {\n $schema: typeof SARIF_SCHEMA;\n version: '2.1.0';\n runs: [\n {\n tool: {\n driver: {\n name: string;\n version: string;\n informationUri: string;\n rules: SarifReportingDescriptor[];\n };\n };\n results: SarifResult[];\n },\n ];\n}\n\nfunction toSarifLevel(severity: Severity): SarifLevel {\n if (severity === 'error') return 'error';\n if (severity === 'warn') return 'warning';\n return 'note';\n}\n\nfunction toRelativeUri(filePath: string, rootDirectory: string): string {\n const normalizedRoot = rootDirectory.endsWith('/')\n ? rootDirectory\n : `${rootDirectory}/`;\n if (filePath.startsWith(normalizedRoot)) {\n return filePath.slice(normalizedRoot.length);\n }\n return filePath;\n}\n\nfunction toSarifResult(diag: Diagnostic, rootDirectory: string): SarifResult {\n const region: SarifLocation['physicalLocation']['region'] = {\n startLine: diag.line,\n startColumn: diag.column,\n };\n if (diag.endLine !== undefined) region.endLine = diag.endLine;\n if (diag.endColumn !== undefined) region.endColumn = diag.endColumn;\n const uri = toRelativeUri(diag.file, rootDirectory);\n return {\n ruleId: diag.ruleId,\n level: toSarifLevel(diag.severity),\n message: { text: diag.message },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri, uriBaseId: '%SRCROOT%' },\n region,\n },\n },\n ],\n partialFingerprints: {\n primaryLocationLineHash: `${uri}:${diag.line}:${diag.ruleId}`,\n },\n };\n}\n\nfunction collectRuleIds(diagnostics: Diagnostic[]): Set<string> {\n const ids = new Set<string>();\n for (const d of diagnostics) ids.add(d.ruleId);\n return ids;\n}\n\nfunction toRuleDescriptor(ruleId: string): SarifReportingDescriptor {\n const registered = RULE_REGISTRY.find((r) => r.id === ruleId);\n const severity: Severity = registered?.severity ?? 'warn';\n const category = registered?.category ?? 'doctor-owned';\n const name = ruleId.includes('/')\n ? ruleId.split('/').slice(1).join('/')\n : ruleId;\n const doc = loadRuleDoc(ruleId);\n const fullDescription = doc?.description ?? ruleId;\n return {\n id: ruleId,\n name,\n shortDescription: { text: ruleId },\n fullDescription: { text: fullDescription },\n helpUri: docsUrl(ruleId),\n defaultConfiguration: { level: toSarifLevel(severity) },\n properties: { category },\n };\n}\n\nexport function sarifReport(input: ReporterInput): string {\n const ids = collectRuleIds(input.diagnostics);\n const rules = [...ids].sort().map(toRuleDescriptor);\n const results = input.diagnostics.map((d) =>\n toSarifResult(d, input.rootDirectory),\n );\n const log: SarifLog = {\n $schema: SARIF_SCHEMA,\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: input.toolName,\n version: input.toolVersion,\n informationUri: INFORMATION_URI,\n rules,\n },\n },\n results,\n },\n ],\n };\n return `${JSON.stringify(log, null, 2)}\\n`;\n}\n","import { docsUrl } from './docs-url.js';\nimport type { ReporterInput } from './types.js';\nimport type { Diagnostic, Severity } from '../types.js';\n\nconst SEVERITY_LABEL: Record<Severity, string> = {\n error: 'Error',\n warn: 'Warn',\n info: 'Info',\n};\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction relativize(file: string, rootDir: string): string {\n return file.startsWith(`${rootDir}/`) ? file.slice(rootDir.length + 1) : file;\n}\n\nfunction renderDiagnosticRow(d: Diagnostic, rootDir: string): string {\n const loc = `${escapeHtml(relativize(d.file, rootDir))}:${d.line}:${d.column}`;\n const recommendation = d.recommendation\n ? `<div class=\"rec\"><strong>Fix:</strong> ${escapeHtml(d.recommendation)}</div>`\n : '';\n return [\n `<details class=\"finding sev-${d.severity}\">`,\n ` <summary>`,\n ` <span class=\"sev\">${SEVERITY_LABEL[d.severity]}</span>`,\n ` <code class=\"rule\">${escapeHtml(d.ruleId)}</code>`,\n ` <span class=\"loc\">${loc}</span>`,\n ` <span class=\"msg\">${escapeHtml(d.message)}</span>`,\n ` </summary>`,\n ` <div class=\"body\">`,\n recommendation,\n ` <div class=\"docs\"><a href=\"${escapeHtml(docsUrl(d.ruleId))}\" target=\"_blank\" rel=\"noopener\">Rule docs</a></div>`,\n ` </div>`,\n `</details>`,\n ].join('\\n');\n}\n\nconst STYLES = `\n* { box-sizing: border-box; margin: 0; padding: 0; }\nbody { font: 14px/1.5 system-ui, -apple-system, sans-serif; background: #0f0f0f; color: #e5e5e5; padding: 2rem; }\nheader { border-bottom: 1px solid #2a2a2a; padding-bottom: 1.5rem; margin-bottom: 1.5rem; }\nh1 { font-size: 1.25rem; font-weight: 500; color: #fafafa; }\n.meta { color: #888; margin-top: 0.5rem; font-size: 0.85rem; }\n.score-row { display: flex; gap: 2rem; margin-top: 1rem; align-items: baseline; }\n.score-row .score { font-size: 3rem; font-weight: 200; color: #fafafa; }\n.score-row .score.pass { color: #4ade80; }\n.score-row .score.fail { color: #f87171; }\n.score-row .breakdown { color: #aaa; font-size: 0.9rem; }\n.finding { border: 1px solid #2a2a2a; border-radius: 6px; margin-bottom: 0.5rem; background: #1a1a1a; overflow: hidden; }\n.finding summary { padding: 0.75rem 1rem; cursor: pointer; display: grid; grid-template-columns: 4rem 14rem 14rem 1fr; gap: 0.75rem; align-items: baseline; font-size: 0.85rem; list-style: none; }\n.finding summary::-webkit-details-marker { display: none; }\n.sev { font-size: 0.7rem; text-transform: uppercase; font-weight: 600; letter-spacing: 0.05em; }\n.sev-error .sev { color: #f87171; }\n.sev-warn .sev { color: #fbbf24; }\n.sev-info .sev { color: #60a5fa; }\n.rule { color: #aaa; font-family: ui-monospace, monospace; font-size: 0.8rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.loc { color: #888; font-family: ui-monospace, monospace; font-size: 0.8rem; }\n.msg { color: #d4d4d4; }\n.body { padding: 0 1rem 1rem; border-top: 1px solid #2a2a2a; color: #ccc; font-size: 0.85rem; }\n.rec { margin-top: 0.75rem; }\n.docs { margin-top: 0.5rem; }\n.docs a { color: #60a5fa; text-decoration: none; }\n.docs a:hover { text-decoration: underline; }\n.empty { color: #888; padding: 2rem 0; text-align: center; }\n`;\n\nexport function htmlReport(input: ReporterInput): string {\n const score = input.score.score;\n const pass = input.score.passed;\n const rows = input.diagnostics\n .map((d) => renderDiagnosticRow(d, input.rootDirectory))\n .join('\\n');\n const body =\n input.diagnostics.length === 0\n ? `<p class=\"empty\">No findings. Clean run.</p>`\n : rows;\n const findingsLabel = `${input.diagnostics.length} finding${input.diagnostics.length === 1 ? '' : 's'}`;\n const meta = `${input.toolName} v${input.toolVersion} · ${input.analyzedFileCount} file${input.analyzedFileCount === 1 ? '' : 's'} · ${input.elapsedMs.toFixed(0)}ms`;\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>${escapeHtml(input.toolName)} — Report</title>\n<style>${STYLES}</style>\n</head>\n<body>\n<header>\n <h1>${escapeHtml(input.toolName)} report</h1>\n <div class=\"meta\">${escapeHtml(meta)} · ${escapeHtml(input.rootDirectory)}</div>\n <div class=\"score-row\">\n <div class=\"score ${pass ? 'pass' : 'fail'}\">${score}<span style=\"font-size:1.5rem;color:#888\">/100</span></div>\n <div class=\"breakdown\">${findingsLabel} · ${input.score.errorCount} error · ${input.score.warnCount} warn · ${input.score.infoCount} info</div>\n </div>\n</header>\n<main>\n${body}\n</main>\n</body>\n</html>\n`;\n}\n","import { relative } from 'node:path';\nimport type { Severity } from '../types.js';\nimport type { ReporterInput } from './types.js';\n\nexport const DOCTOR_REPORT_SCHEMA_VERSION = '1';\n\nexport interface DoctorReportDiagnostic {\n file: string;\n line: number;\n column: number;\n endLine?: number;\n endColumn?: number;\n ruleId: string;\n severity: Severity;\n message: string;\n source: string;\n recommendation?: string;\n}\n\nexport interface DoctorReportBreakdownEntry {\n ruleId: string;\n occurrences: number;\n weightPerOccurrence: number;\n penalty: number;\n}\n\nexport interface DoctorReport {\n schemaVersion: string;\n tool: { name: string; version: string };\n projectInfo: {\n framework: string;\n vueVersion: string | null;\n nuxtVersion: string | null;\n capabilities: string[];\n rootDirectory: string;\n };\n score: {\n value: number;\n threshold: number;\n passed: boolean;\n bySeverity: { error: number; warn: number; info: number };\n breakdown: DoctorReportBreakdownEntry[];\n };\n diagnostics: DoctorReportDiagnostic[];\n timing: { elapsedMs: number; analyzedFileCount: number };\n}\n\nexport function buildDoctorReport(input: ReporterInput): DoctorReport {\n return {\n schemaVersion: DOCTOR_REPORT_SCHEMA_VERSION,\n tool: { name: input.toolName, version: input.toolVersion },\n projectInfo: {\n framework: input.projectInfo.framework,\n vueVersion: input.projectInfo.vueVersion,\n nuxtVersion: input.projectInfo.nuxtVersion,\n capabilities: [...input.projectInfo.capabilities].sort(),\n rootDirectory: input.projectInfo.rootDirectory,\n },\n score: {\n value: input.score.score,\n threshold: input.score.threshold,\n passed: input.score.passed,\n bySeverity: {\n error: input.score.errorCount,\n warn: input.score.warnCount,\n info: input.score.infoCount,\n },\n breakdown: input.score.breakdown.map((entry) => ({\n ruleId: entry.ruleId,\n occurrences: entry.occurrences,\n weightPerOccurrence: entry.weightPerOccurrence,\n penalty: entry.penalty,\n })),\n },\n diagnostics: input.diagnostics.map((d) => ({\n file: relative(input.rootDirectory, d.file).replaceAll('\\\\', '/'),\n line: d.line,\n column: d.column,\n endLine: d.endLine,\n endColumn: d.endColumn,\n ruleId: d.ruleId,\n severity: d.severity,\n message: d.message,\n source: d.source,\n recommendation: d.recommendation,\n })),\n timing: {\n elapsedMs: input.elapsedMs,\n analyzedFileCount: input.analyzedFileCount,\n },\n };\n}\n\nexport function jsonReport(input: ReporterInput): string {\n return JSON.stringify(buildDoctorReport(input), null, 2);\n}\n","import { buildDoctorReport } from './json.js';\nimport type { ReporterInput } from './types.js';\n\nexport function jsonCompactReport(input: ReporterInput): string {\n return `${JSON.stringify(buildDoctorReport(input))}\\n`;\n}\n","import process from 'node:process';\nimport pc from 'picocolors';\nimport { agentReport } from './agent.js';\nimport { render, type Theme } from './render.js';\nimport type { ReporterInput, ReporterOptions } from './types.js';\n\nconst colors = pc.createColors(true);\n\nconst colorTheme: Theme = {\n severity: (severity) => {\n if (severity === 'error') return colors.red(severity);\n if (severity === 'warn') return colors.yellow(severity);\n return colors.cyan(severity);\n },\n scoreValue: (score) => {\n if (score <= 50) return colors.red(String(score));\n if (score <= 79) return colors.yellow(String(score));\n return colors.green(String(score));\n },\n};\n\nexport function prettyReport(\n input: ReporterInput,\n options?: ReporterOptions,\n): string {\n const noColor = options?.color === false || Boolean(process.env.NO_COLOR);\n if (noColor) return agentReport(input, options);\n return render(input, options, colorTheme);\n}\n","import type { AuditReport } from '../types.js';\nimport type { ConfigSource } from '../config/types.js';\n\nexport interface VerboseTraceOptions {\n configSource?: ConfigSource;\n}\n\nfunction formatMs(ms: number): string {\n return `${ms.toFixed(1)}ms`;\n}\n\nexport function renderVerboseTrace(\n report: AuditReport,\n options: VerboseTraceOptions,\n): string {\n const lines: string[] = [];\n lines.push('TIMINGS');\n lines.push(` template: ${formatMs(report.timings.template)}`);\n lines.push(` sfc: ${formatMs(report.timings.sfc)}`);\n lines.push(` script: ${formatMs(report.timings.script)}`);\n lines.push(` deadCode: ${formatMs(report.timings.deadCode)}`);\n lines.push(` total: ${formatMs(report.timings.total)}`);\n\n const ruleKeys = Object.keys(report.ruleCounts);\n if (ruleKeys.length > 0) {\n lines.push('RULE COUNTS');\n for (const ruleId of ruleKeys.sort()) {\n lines.push(` ${ruleId}: ${report.ruleCounts[ruleId]}`);\n }\n }\n\n if (options.configSource) {\n lines.push('CONFIG');\n lines.push(` source: ${options.configSource}`);\n }\n\n return lines.join('\\n');\n}\n","import { agentReport } from './agent.js';\nimport { htmlReport } from './html.js';\nimport { jsonCompactReport } from './json-compact.js';\nimport { jsonReport } from './json.js';\nimport { prettyReport } from './pretty.js';\nimport { sarifReport } from './sarif.js';\nimport { renderVerboseTrace, type VerboseTraceOptions } from './verbose.js';\nimport type { ReporterInput, ReporterOptions } from './types.js';\n\nexport type ReporterFormat =\n | 'agent'\n | 'pretty'\n | 'json'\n | 'json-compact'\n | 'sarif'\n | 'html';\n\nexport { renderVerboseTrace, type VerboseTraceOptions };\n\nexport function format(\n input: ReporterInput,\n kind: ReporterFormat = 'agent',\n options?: ReporterOptions,\n): string {\n if (kind === 'pretty') return prettyReport(input, options);\n if (kind === 'json') return jsonReport(input);\n if (kind === 'json-compact') return jsonCompactReport(input);\n if (kind === 'sarif') return sarifReport(input);\n if (kind === 'html') return htmlReport(input);\n return agentReport(input, options);\n}\n"],"mappings":"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"}