@generaltranslation/vue-extractor 0.0.0 → 0.1.0-iris.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.
Files changed (89) hide show
  1. package/LICENSE.md +18 -102
  2. package/dist/detect.d.ts +8 -0
  3. package/dist/detect.js +2 -0
  4. package/dist/index.d.ts +3 -1
  5. package/dist/index.js +2 -1
  6. package/dist/inspect.d.ts +9 -0
  7. package/dist/inspect.js +2 -0
  8. package/dist/integration.d.ts +69 -0
  9. package/dist/integration.js +162 -0
  10. package/dist/integration.js.map +1 -0
  11. package/dist/internal/config/configFiles.d.ts +6 -0
  12. package/dist/internal/config/configFiles.js +34 -0
  13. package/dist/internal/config/configFiles.js.map +1 -0
  14. package/dist/internal/config/resolveVueCompilerOptions.d.ts +6 -0
  15. package/dist/internal/config/resolveVueCompilerOptions.js +74 -56
  16. package/dist/internal/config/resolveVueCompilerOptions.js.map +1 -1
  17. package/dist/internal/extractFromVueSource.d.ts +4 -3
  18. package/dist/internal/extractFromVueSource.js +255 -12
  19. package/dist/internal/extractFromVueSource.js.map +1 -1
  20. package/dist/internal/project/consumerUsage.d.ts +34 -0
  21. package/dist/internal/project/consumerUsage.js +1220 -0
  22. package/dist/internal/project/consumerUsage.js.map +1 -0
  23. package/dist/internal/project/detectVueProject.d.ts +13 -0
  24. package/dist/internal/project/detectVueProject.js +65 -0
  25. package/dist/internal/project/detectVueProject.js.map +1 -0
  26. package/dist/internal/project/extractFromVueProject.d.ts +10 -0
  27. package/dist/internal/project/extractFromVueProject.js +579 -0
  28. package/dist/internal/project/extractFromVueProject.js.map +1 -0
  29. package/dist/internal/project/inspectVueProject.d.ts +48 -0
  30. package/dist/internal/project/inspectVueProject.js +143 -0
  31. package/dist/internal/project/inspectVueProject.js.map +1 -0
  32. package/dist/internal/project/manifest.d.ts +64 -0
  33. package/dist/internal/project/manifest.js +270 -0
  34. package/dist/internal/project/manifest.js.map +1 -0
  35. package/dist/internal/project/mergeVueProjectExtraction.d.ts +18 -0
  36. package/dist/internal/project/mergeVueProjectExtraction.js +79 -0
  37. package/dist/internal/project/mergeVueProjectExtraction.js.map +1 -0
  38. package/dist/internal/project/moduleResolver.d.ts +18 -0
  39. package/dist/internal/project/moduleResolver.js +325 -0
  40. package/dist/internal/project/moduleResolver.js.map +1 -0
  41. package/dist/internal/project/scopes.d.ts +31 -0
  42. package/dist/internal/project/scopes.js +182 -0
  43. package/dist/internal/project/scopes.js.map +1 -0
  44. package/dist/internal/project/sourcePatterns.d.ts +4 -0
  45. package/dist/internal/project/sourcePatterns.js +32 -0
  46. package/dist/internal/project/sourcePatterns.js.map +1 -0
  47. package/dist/internal/project/viteAliases.d.ts +42 -0
  48. package/dist/internal/project/viteAliases.js +1020 -0
  49. package/dist/internal/project/viteAliases.js.map +1 -0
  50. package/dist/internal/project/vueSourceClassification.d.ts +13 -0
  51. package/dist/internal/project/vueSourceClassification.js +146 -0
  52. package/dist/internal/project/vueSourceClassification.js.map +1 -0
  53. package/dist/internal/project/workspaces.d.ts +31 -0
  54. package/dist/internal/project/workspaces.js +326 -0
  55. package/dist/internal/project/workspaces.js.map +1 -0
  56. package/dist/internal/project/wrapperProvenance.d.ts +21 -0
  57. package/dist/internal/project/wrapperProvenance.js +287 -0
  58. package/dist/internal/project/wrapperProvenance.js.map +1 -0
  59. package/dist/internal/script/analyze.js +323 -108
  60. package/dist/internal/script/analyze.js.map +1 -1
  61. package/dist/internal/script/jsx.d.ts +7 -4
  62. package/dist/internal/script/jsx.js +351 -79
  63. package/dist/internal/script/jsx.js.map +1 -1
  64. package/dist/internal/script/knownValues.js +4 -0
  65. package/dist/internal/script/knownValues.js.map +1 -1
  66. package/dist/internal/script/localModules.d.ts +23 -2
  67. package/dist/internal/script/localModules.js +535 -20
  68. package/dist/internal/script/localModules.js.map +1 -1
  69. package/dist/internal/script/model.d.ts +10 -3
  70. package/dist/internal/script/parser.js +2 -1
  71. package/dist/internal/script/parser.js.map +1 -1
  72. package/dist/internal/script/runtimeModules.d.ts +10 -0
  73. package/dist/internal/script/runtimeModules.js +27 -0
  74. package/dist/internal/script/runtimeModules.js.map +1 -0
  75. package/dist/internal/stringCalls.js +9 -3
  76. package/dist/internal/stringCalls.js.map +1 -1
  77. package/dist/internal/template.js +263 -141
  78. package/dist/internal/template.js.map +1 -1
  79. package/dist/internal/types.d.ts +5 -2
  80. package/dist/internal/utils.d.ts +14 -3
  81. package/dist/internal/utils.js +63 -3
  82. package/dist/internal/utils.js.map +1 -1
  83. package/dist/internal/vueCompiler.d.ts +9 -1
  84. package/dist/internal/vueCompiler.js +37 -14
  85. package/dist/internal/vueCompiler.js.map +1 -1
  86. package/dist/project.d.ts +11 -0
  87. package/dist/project.js +3 -0
  88. package/dist/types.d.ts +95 -4
  89. package/package.json +30 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumerUsage.js","names":[],"sources":["../../../src/internal/project/consumerUsage.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport traverseModule, {\n type Binding,\n type NodePath,\n type Scope,\n} from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { parseScriptAst } from '../script/parser.js';\nimport {\n readJavaScriptPackageManifest,\n type JavaScriptPackageManifest,\n} from './manifest.js';\nimport { DEFAULT_VUE_SOURCE_DIRECTORIES } from './sourcePatterns.js';\nimport {\n readPublicGTImports,\n readPublicImportEntries,\n type PublicGTImport,\n} from './wrapperProvenance.js';\nimport { classifyVueSource } from './vueSourceClassification.js';\n\nconst traverse = traverseModule.default || traverseModule;\n\nconst CONSUMER_SOURCE_EXTENSIONS = new Set([\n '.cjs',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.mts',\n '.ts',\n '.tsx',\n '.vue',\n]);\n\nconst IGNORED_CONSUMER_DIRECTORIES = new Set([\n 'build',\n 'coverage',\n 'dist',\n 'node_modules',\n 'out',\n 'storybook-static',\n 'target',\n 'temp',\n 'tmp',\n]);\n\nconst GENERATED_CONSUMER_ROOT_DIRECTORIES = new Set([\n 'cjs',\n 'es',\n 'esm',\n 'generated',\n 'lib',\n 'lib-esm',\n]);\n\n/** Prevents wrapper-use detection from walking an unbounded package tree. */\nconst MAX_CONSUMER_SOURCE_FILES = 20_000;\n\ntype ConsumerImport = {\n importedNames: ReadonlySet<string> | '*';\n source: string;\n};\n\ntype ConsumerImportIndex = Map<string, ReadonlySet<string> | '*'>;\n\ntype ConsumerSourceIndex = {\n exhausted: boolean;\n importsBySpecifier: ConsumerImportIndex;\n pendingDirectories: string[];\n pendingFiles: string[];\n root: string;\n seenFiles: Set<string>;\n sourceFiles: number;\n};\n\n/** Per-inspection state that prevents repeated wrapper provenance scans. */\nexport type ConsumerUsageCache = {\n consumers: Map<string, ConsumerSourceIndex>;\n publicImports: Map<string, PublicGTImport[]>;\n queries: Map<string, boolean>;\n};\n\n/** Creates an edit-fresh cache for one project detection or inspection. */\nexport function createConsumerUsageCache(): ConsumerUsageCache {\n return {\n consumers: new Map(),\n publicImports: new Map(),\n queries: new Map(),\n };\n}\n\n/**\n * Returns whether consumer source actually imports a wrapper's public GT API.\n *\n * A dependency can expose separate React and Vue entrypoints. Package\n * metadata alone cannot tell which one an application uses, so Vue ownership\n * propagates only through a static value import or re-export of the exact\n * public subpath and export name. The dependency binding name is kept\n * separate from the package's declared name so npm/workspace aliases retain\n * their consumer-visible specifiers.\n */\nexport function packageConsumesPublicGT(\n consumerDirectory: string,\n dependencyName: string,\n packageDirectory: string,\n manifest: JavaScriptPackageManifest,\n cache: ConsumerUsageCache = createConsumerUsageCache()\n): boolean {\n const packageName = readPackageName(manifest);\n if (!packageName) return false;\n const consumerRoot = resolveRealPath(consumerDirectory);\n const packageRoot = resolveRealPath(packageDirectory);\n const queryKey = `${consumerRoot}\\0${dependencyName}\\0${packageRoot}`;\n const cachedQuery = cache.queries.get(queryKey);\n if (cachedQuery !== undefined) return cachedQuery;\n\n let packagePublicImports = cache.publicImports.get(packageRoot);\n if (!packagePublicImports) {\n packagePublicImports = readPublicGTImports(packageDirectory, manifest);\n cache.publicImports.set(packageRoot, packagePublicImports);\n }\n const publicImports = packagePublicImports.map(\n ({ entry: _entry, exportNames, specifier }) => ({\n exportNames,\n specifier: `${dependencyName}${specifier.slice(packageName.length)}`,\n })\n );\n if (publicImports.length === 0) return false;\n\n const importsBySpecifier = new Map<string, ReadonlySet<string>>();\n for (const { exportNames, specifier } of publicImports) {\n const existing = importsBySpecifier.get(specifier);\n importsBySpecifier.set(\n specifier,\n existing ? new Set([...existing, ...exportNames]) : exportNames\n );\n }\n const result = consumerSourceUsesGT(consumerRoot, importsBySpecifier, cache);\n cache.queries.set(queryKey, result);\n return result;\n}\n\n/** Returns whether a wrapper exposes any public gt-vue-derived value. */\nexport function packageExposesPublicGT(\n packageDirectory: string,\n manifest: JavaScriptPackageManifest,\n cache: ConsumerUsageCache\n): boolean {\n const packageRoot = resolveRealPath(packageDirectory);\n let publicImports = cache.publicImports.get(packageRoot);\n if (!publicImports) {\n publicImports = readPublicGTImports(packageDirectory, manifest);\n cache.publicImports.set(packageRoot, publicImports);\n }\n return publicImports.length > 0;\n}\n\n/** Scans one package boundary for static imports of its dependency's GT API. */\nfunction consumerSourceUsesGT(\n consumerDirectory: string,\n importsBySpecifier: ReadonlyMap<string, ReadonlySet<string>>,\n cache: ConsumerUsageCache\n): boolean {\n let consumer = cache.consumers.get(consumerDirectory);\n if (!consumer) {\n consumer = createConsumerSourceIndex(consumerDirectory);\n cache.consumers.set(consumerDirectory, consumer);\n }\n if (\n consumerImportIndexMatches(consumer.importsBySpecifier, importsBySpecifier)\n ) {\n return true;\n }\n while (!consumer.exhausted) {\n const file = readNextConsumerSourceFile(consumer);\n if (!file) break;\n mergeConsumerImports(\n consumer.importsBySpecifier,\n readConsumerImports(file)\n );\n if (\n consumerImportIndexMatches(\n consumer.importsBySpecifier,\n importsBySpecifier\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\n/** Creates a lazy, single-pass source index for one consumer package. */\nfunction createConsumerSourceIndex(root: string): ConsumerSourceIndex {\n const pendingFiles = new Set<string>();\n const consumerManifest = readJavaScriptPackageManifest(\n path.join(root, 'package.json')\n );\n if (consumerManifest) {\n for (const { entry } of readPublicImportEntries(root, consumerManifest)) {\n if (isConsumerSourceFile(entry) && !isIgnoredConsumerPath(root, entry)) {\n pendingFiles.add(entry);\n }\n }\n }\n try {\n for (const entry of fs.readdirSync(root, { withFileTypes: true })) {\n if (entry.isFile() && path.extname(entry.name).toLowerCase() === '.vue') {\n pendingFiles.add(path.join(root, entry.name));\n }\n }\n } catch {\n // Public entries may still establish usage when the root cannot be listed.\n }\n return {\n exhausted: false,\n importsBySpecifier: new Map(),\n pendingDirectories: DEFAULT_VUE_SOURCE_DIRECTORIES.map((directory) =>\n path.join(root, directory)\n )\n .filter((directory) => isContainedPhysicalDirectory(root, directory))\n .reverse(),\n pendingFiles: [...pendingFiles].reverse(),\n root,\n seenFiles: new Set(),\n sourceFiles: 0,\n };\n}\n\n/** Returns each consumer source file at most once across every wrapper query. */\nfunction readNextConsumerSourceFile(\n consumer: ConsumerSourceIndex\n): string | undefined {\n while (true) {\n const pendingFile = consumer.pendingFiles.pop();\n if (pendingFile) {\n const file = resolveRealPath(pendingFile);\n if (consumer.seenFiles.has(file) || !isConsumerSourceFile(file)) continue;\n consumer.seenFiles.add(file);\n consumer.sourceFiles += 1;\n if (consumer.sourceFiles > MAX_CONSUMER_SOURCE_FILES) {\n consumer.exhausted = true;\n return undefined;\n }\n return file;\n }\n\n const current = consumer.pendingDirectories.pop();\n if (!current) {\n consumer.exhausted = true;\n return undefined;\n }\n if (fs.existsSync(path.join(current, 'package.json'))) {\n // Nested workspace packages establish their own ownership. Their imports\n // must never promote an aggregator or sibling package.\n continue;\n }\n\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(current, { withFileTypes: true });\n } catch {\n continue;\n }\n const sourceFiles: string[] = [];\n for (const entry of entries) {\n if (shouldIgnoreConsumerEntry(entry)) continue;\n const candidate = path.join(current, entry.name);\n if (entry.isDirectory()) {\n consumer.pendingDirectories.push(candidate);\n } else if (entry.isFile() && isConsumerSourceFile(candidate)) {\n sourceFiles.push(candidate);\n }\n }\n // The stack remains lazy while preserving the historical readdir order,\n // including which files fall inside the finite source budget.\n consumer.pendingFiles.push(...sourceFiles.reverse());\n }\n}\n\nfunction mergeConsumerImports(\n importsBySpecifier: ConsumerImportIndex,\n imports: readonly ConsumerImport[]\n): void {\n for (const consumerImport of imports) {\n const existing = importsBySpecifier.get(consumerImport.source);\n if (existing === '*' || consumerImport.importedNames === '*') {\n importsBySpecifier.set(consumerImport.source, '*');\n continue;\n }\n importsBySpecifier.set(\n consumerImport.source,\n new Set([...(existing ?? []), ...consumerImport.importedNames])\n );\n }\n}\n\nfunction consumerImportIndexMatches(\n consumerImports: ReadonlyMap<string, ReadonlySet<string> | '*'>,\n gtImports: ReadonlyMap<string, ReadonlySet<string>>\n): boolean {\n for (const [specifier, gtExportNames] of gtImports) {\n const importedNames = consumerImports.get(specifier);\n if (\n importedNames === '*' ||\n (importedNames &&\n [...importedNames].some((name) => gtExportNames.has(name)))\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction shouldIgnoreConsumerEntry(entry: fs.Dirent): boolean {\n return (\n entry.isSymbolicLink() ||\n (entry.isDirectory() &&\n (entry.name.startsWith('.') ||\n IGNORED_CONSUMER_DIRECTORIES.has(entry.name)))\n );\n}\n\n/** Accepts executable source while rejecting ambient declaration artifacts. */\nfunction isConsumerSourceFile(file: string): boolean {\n const fileName = path.basename(file).toLowerCase();\n if (/\\.d\\.(?:c|m)?ts$/.test(fileName)) return false;\n return CONSUMER_SOURCE_EXTENSIONS.has(path.extname(fileName));\n}\n\n/** Rejects public entries that resolve only into generated package output. */\nfunction isIgnoredConsumerPath(root: string, file: string): boolean {\n const relative = path.relative(root, file);\n if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {\n return true;\n }\n const directories = relative.split(path.sep).slice(0, -1);\n const rootDirectory = directories[0]?.toLowerCase();\n return Boolean(\n (rootDirectory && GENERATED_CONSUMER_ROOT_DIRECTORIES.has(rootDirectory)) ||\n directories.some((segment) => {\n const normalized = segment.toLowerCase();\n return (\n segment.startsWith('.') || IGNORED_CONSUMER_DIRECTORIES.has(normalized)\n );\n })\n );\n}\n\n/** Parses regular modules and the executable script blocks of Vue SFCs. */\nfunction readConsumerImports(file: string): ConsumerImport[] {\n let source: string;\n try {\n source = fs.readFileSync(file, 'utf8');\n } catch {\n return [];\n }\n const extension = path.extname(file).toLowerCase();\n if (extension === '.vue') {\n if (classifyVueSource(source) === 'non-sfc') {\n return readScriptImports(source, 'tsx');\n }\n const { blocks, templateSource } = readVueScriptBlocks(source);\n const parsedBlocks = blocks.map((block) => ({\n ...block,\n ast: parseConsumerScript(block.source, block.language),\n }));\n const hasScriptSetup = parsedBlocks.some(\n ({ ast, setup, source }) =>\n setup && Boolean(ast) && Boolean(source.trim())\n );\n const templateBindings = hasScriptSetup\n ? readTemplateBindingMetadata(parsedBlocks)\n : undefined;\n const siblingExternalUsage = readSiblingExternalUsage(parsedBlocks);\n return parsedBlocks.flatMap(({ ast, setup }) =>\n ast\n ? collectStaticImports(ast, {\n externalUsage: siblingExternalUsage.get(ast.program),\n scriptSetup: setup,\n templateBindings,\n templateSource: hasScriptSetup ? templateSource : undefined,\n })\n : []\n );\n }\n const language =\n extension === '.mjs' || extension === '.cjs'\n ? 'js'\n : extension === '.mts' || extension === '.cts'\n ? 'ts'\n : extension.slice(1);\n return readScriptImports(source, language);\n}\n\n/** Reads SFC script blocks without loading a project Vue compiler. */\nfunction readVueScriptBlocks(source: string): {\n blocks: ConsumerScriptBlock[];\n templateSource: string;\n} {\n const blocks: ConsumerScriptBlock[] = [];\n const templateSources: string[] = [];\n for (const block of readTopLevelSfcBlocks(source)) {\n if (block.name === 'template') {\n templateSources.push(block.source);\n continue;\n }\n if (block.name !== 'script') continue;\n const attributes = readTemplateAttributes(block.attributes);\n blocks.push({\n language: attributes.find(({ name }) => name === 'lang')?.value,\n setup: attributes.some(({ name }) => name === 'setup'),\n source: block.source,\n });\n }\n return { blocks, templateSource: templateSources.join('\\n') };\n}\n\ntype ConsumerScriptBlock = {\n language: string | undefined;\n setup: boolean;\n source: string;\n};\n\ntype ParsedConsumerScriptBlock = ConsumerScriptBlock & {\n ast: t.File | undefined;\n};\n\n/** Collects unresolved runtime references made from every sibling SFC block. */\nfunction readSiblingExternalUsage(\n blocks: readonly ParsedConsumerScriptBlock[]\n): Map<t.Program, TemplateUsage> {\n const usages = new Map<t.Program, TemplateUsage>();\n const parsedBlocks = blocks.filter(\n (block): block is ParsedConsumerScriptBlock & { ast: t.File } =>\n Boolean(block.ast)\n );\n for (const target of parsedBlocks) {\n const usage = createTemplateUsage();\n let hasSibling = false;\n for (const source of parsedBlocks) {\n if (source.ast.program === target.ast.program) continue;\n hasSibling = true;\n collectTemplateAstUsage(source.ast, usage, new Map(), source.setup);\n }\n if (hasSibling) usages.set(target.ast.program, usage);\n }\n return usages;\n}\n\ntype SfcBlock = {\n attributes: string;\n name: string;\n source: string;\n};\n\ntype MarkupTag = {\n attributes: string;\n closing: boolean;\n end: number;\n name: string;\n selfClosing: boolean;\n start: number;\n};\n\n/** Reads real top-level SFC blocks without loading the Vue compiler. */\nfunction readTopLevelSfcBlocks(source: string): SfcBlock[] {\n const blocks: SfcBlock[] = [];\n let index = 0;\n while (index < source.length) {\n if (source.startsWith('<!--', index)) {\n index = readHtmlCommentEnd(source, index);\n continue;\n }\n if (source[index] !== '<') {\n index += 1;\n continue;\n }\n const tag = readMarkupTag(source, index);\n if (!tag) {\n index += 1;\n continue;\n }\n index = tag.end;\n if (tag.closing || tag.selfClosing) continue;\n\n const closingTag =\n tag.name === 'script' || tag.name === 'style'\n ? findRawBlockClosingTag(source, tag.name, tag.end)\n : findStructuredBlockClosingTag(source, tag.name, tag.end);\n if (!closingTag) continue;\n if (tag.name === 'script' || tag.name === 'template') {\n blocks.push({\n attributes: tag.attributes,\n name: tag.name,\n source: source.slice(tag.end, closingTag.start),\n });\n }\n index = closingTag.end;\n }\n return blocks;\n}\n\n/** Reads one quote-aware markup tag at an exact source offset. */\nfunction readMarkupTag(source: string, start: number): MarkupTag | undefined {\n if (source[start] !== '<' || source.startsWith('<!--', start)) {\n return undefined;\n }\n let cursor = start + 1;\n const closing = source[cursor] === '/';\n if (closing) cursor += 1;\n const nameStart = cursor;\n while (cursor < source.length && /[A-Za-z0-9:_-]/.test(source[cursor]!)) {\n cursor += 1;\n }\n if (cursor === nameStart) return undefined;\n const name = source.slice(nameStart, cursor).toLowerCase();\n const attributesStart = cursor;\n let quote: string | undefined;\n while (cursor < source.length) {\n const character = source[cursor]!;\n if (quote) {\n if (character === quote) quote = undefined;\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === '>') {\n const attributes = source.slice(attributesStart, cursor);\n return {\n attributes,\n closing,\n end: cursor + 1,\n name,\n selfClosing: !closing && /\\/\\s*$/.test(attributes),\n start,\n };\n }\n cursor += 1;\n }\n return undefined;\n}\n\n/** Finds a raw-text script/style closing tag using HTML parsing semantics. */\nfunction findRawBlockClosingTag(\n source: string,\n name: string,\n start: number\n): MarkupTag | undefined {\n const expression = new RegExp(\n `<\\\\/\\\\s*${escapeRegularExpression(name)}\\\\s*>`,\n 'gi'\n );\n expression.lastIndex = start;\n const match = expression.exec(source);\n return match ? readMarkupTag(source, match.index) : undefined;\n}\n\n/** Finds a matching structured block while respecting comments and nesting. */\nfunction findStructuredBlockClosingTag(\n source: string,\n name: string,\n start: number\n): MarkupTag | undefined {\n let depth = 1;\n let index = start;\n while (index < source.length) {\n if (source.startsWith('<!--', index)) {\n index = readHtmlCommentEnd(source, index);\n continue;\n }\n if (source[index] !== '<') {\n index += 1;\n continue;\n }\n const tag = readMarkupTag(source, index);\n if (!tag) {\n index += 1;\n continue;\n }\n index = tag.end;\n if (tag.name !== name) continue;\n if (tag.closing) {\n depth -= 1;\n if (depth === 0) return tag;\n } else if (!tag.selfClosing) {\n depth += 1;\n }\n }\n return undefined;\n}\n\nfunction readHtmlCommentEnd(source: string, start: number): number {\n const end = source.indexOf('-->', start + 4);\n return end < 0 ? source.length : end + 3;\n}\n\n/** Accepts project-compatible syntax while extracting only static ESM edges. */\nfunction readScriptImports(\n source: string,\n declaredLanguage: string | undefined\n): ConsumerImport[] {\n const ast = parseConsumerScript(source, declaredLanguage);\n return ast ? collectStaticImports(ast) : [];\n}\n\n/** Parses syntax accepted by consumer discovery without requiring Vue. */\nfunction parseConsumerScript(\n source: string,\n declaredLanguage: string | undefined\n): t.File | undefined {\n const languages = new Set<string | undefined>([declaredLanguage]);\n languages.add('tsx');\n if (\n declaredLanguage === 'js' ||\n declaredLanguage === 'jsx' ||\n declaredLanguage === 'tsx'\n ) {\n languages.add('flow');\n }\n\n for (const language of languages) {\n try {\n return parseScriptAst(source, language);\n } catch {\n // Try the next syntax accepted by source extraction.\n }\n }\n return undefined;\n}\n\ntype TemplateBindingType =\n | 'setup-const'\n | 'setup-reactive-const'\n | 'literal-const'\n | 'setup-let'\n | 'setup-ref'\n | 'setup-maybe-ref'\n | 'props';\n\ntype TemplateBinding = {\n owner: t.Program;\n type: TemplateBindingType;\n};\n\nconst TEMPLATE_BINDING_RESOLUTION_ORDER: readonly TemplateBindingType[] = [\n 'setup-const',\n 'setup-reactive-const',\n 'literal-const',\n 'setup-let',\n 'setup-ref',\n 'setup-maybe-ref',\n 'props',\n];\n\n/**\n * Reproduces the binding metadata needed by Vue's component-tag resolver.\n *\n * Project detection cannot load a consumer's Vue compiler before ownership is\n * proven. This self-contained model lets the detector choose one setup binding\n * with Vue's type and spelling precedence without introducing a compiler\n * dependency into the lightweight entrypoint. Where supported Vue versions or\n * compiler options differ, the stronger local binding wins so ambiguous source\n * cannot activate Vue in an existing non-Vue project.\n */\nfunction readTemplateBindingMetadata(\n blocks: readonly ParsedConsumerScriptBlock[]\n): Map<string, TemplateBinding> {\n const bindings = new Map<string, TemplateBinding>();\n const normalBlocks = blocks.filter(({ setup }) => !setup);\n const setupBlocks = blocks.filter(({ setup }) => setup);\n const vueImportAliases = new Map<string, string>();\n\n for (const block of [...normalBlocks, ...setupBlocks]) {\n if (!block.ast) continue;\n registerTemplateImportBindings(block.ast, bindings, vueImportAliases);\n }\n for (const block of normalBlocks) {\n if (!block.ast) continue;\n registerOptionsApiSetupBindings(block.ast, bindings);\n }\n for (const block of normalBlocks) {\n if (!block.ast) continue;\n registerTemplateDeclarationBindings(\n block.ast,\n bindings,\n vueImportAliases,\n 'script',\n true\n );\n }\n for (const block of setupBlocks) {\n if (!block.ast) continue;\n registerTemplateDeclarationBindings(\n block.ast,\n bindings,\n vueImportAliases,\n 'script-setup',\n normalBlocks.length === 0\n );\n }\n return bindings;\n}\n\n/** Adds statically named Options API setup-return bindings used by templates. */\nfunction registerOptionsApiSetupBindings(\n ast: t.File,\n bindings: Map<string, TemplateBinding>\n): void {\n for (const statement of ast.program.body) {\n if (\n statement.type !== 'ExportDefaultDeclaration' ||\n statement.declaration.type !== 'ObjectExpression'\n ) {\n continue;\n }\n for (const property of statement.declaration.properties) {\n if (\n property.type !== 'ObjectMethod' ||\n property.computed ||\n property.key.type !== 'Identifier' ||\n property.key.name !== 'setup'\n ) {\n continue;\n }\n for (const bodyItem of property.body.body) {\n if (\n bodyItem.type !== 'ReturnStatement' ||\n bodyItem.argument?.type !== 'ObjectExpression'\n ) {\n continue;\n }\n for (const returnedProperty of bodyItem.argument.properties) {\n if (returnedProperty.type === 'SpreadElement') continue;\n const name = readStaticObjectKey(returnedProperty);\n if (name && !bindings.has(name)) {\n setTemplateBinding(bindings, name, 'setup-maybe-ref', ast.program);\n }\n }\n }\n }\n }\n}\n\n/** Mirrors compiler-sfc's static Options API object-key resolution. */\nfunction readStaticObjectKey(\n property: t.ObjectMethod | t.ObjectProperty\n): string | undefined {\n const key = property.key;\n if (key.type === 'Identifier' && !property.computed) return key.name;\n if (key.type === 'StringLiteral' || key.type === 'NumericLiteral') {\n return String(key.value);\n }\n if (key.type === 'TemplateLiteral' && key.expressions.length === 0) {\n return key.quasis.map((quasi) => quasi.value.cooked ?? '').join('');\n }\n return undefined;\n}\n\nfunction registerTemplateImportBindings(\n ast: t.File,\n bindings: Map<string, TemplateBinding>,\n vueImportAliases: Map<string, string>\n): void {\n for (const statement of ast.program.body) {\n if (\n statement.type !== 'ImportDeclaration' ||\n statement.importKind === 'type' ||\n statement.importKind === 'typeof'\n ) {\n continue;\n }\n const source = statement.source.value;\n for (const specifier of statement.specifiers) {\n if (\n specifier.type === 'ImportSpecifier' &&\n (specifier.importKind === 'type' || specifier.importKind === 'typeof')\n ) {\n continue;\n }\n const imported =\n specifier.type === 'ImportDefaultSpecifier'\n ? 'default'\n : specifier.type === 'ImportNamespaceSpecifier'\n ? '*'\n : readModuleName(specifier.imported);\n if (source === 'vue') {\n vueImportAliases.set(imported, specifier.local.name);\n }\n if (!bindings.has(specifier.local.name)) {\n setTemplateBinding(\n bindings,\n specifier.local.name,\n imported === '*' ||\n (imported === 'default' && source.endsWith('.vue')) ||\n source === 'vue'\n ? 'setup-const'\n : 'setup-maybe-ref',\n ast.program\n );\n }\n }\n }\n}\n\n/** Adds script declarations after imports in compiler-sfc's merge order. */\nfunction registerTemplateDeclarationBindings(\n ast: t.File,\n bindings: Map<string, TemplateBinding>,\n vueImportAliases: ReadonlyMap<string, string>,\n source: 'script' | 'script-setup',\n hoistStatic: boolean\n): void {\n for (const statement of ast.program.body) {\n const declaration =\n statement.type === 'ExportNamedDeclaration' && statement.declaration\n ? statement.declaration\n : statement;\n if (\n (declaration.type === 'VariableDeclaration' ||\n declaration.type === 'FunctionDeclaration' ||\n declaration.type === 'ClassDeclaration' ||\n declaration.type === 'TSEnumDeclaration') &&\n !declaration.declare\n ) {\n walkTemplateDeclaration(\n declaration,\n bindings,\n vueImportAliases,\n ast.program,\n source,\n hoistStatic\n );\n }\n }\n}\n\ntype TemplateDeclaration =\n | t.VariableDeclaration\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.TSEnumDeclaration;\n\n/** Mirrors compiler-sfc's binding-type analysis used by component lookup. */\nfunction walkTemplateDeclaration(\n declaration: TemplateDeclaration,\n bindings: Map<string, TemplateBinding>,\n vueImportAliases: ReadonlyMap<string, string>,\n owner: t.Program,\n source: 'script' | 'script-setup',\n hoistStatic: boolean\n): void {\n if (declaration.type === 'VariableDeclaration') {\n const isConst = declaration.kind === 'const';\n const isAllLiteral =\n isConst &&\n declaration.declarations.every(\n ({ id, init }) =>\n id.type === 'Identifier' && isStaticTemplateBinding(init)\n );\n for (const { id, init: wrappedInitializer } of declaration.declarations) {\n const initializer = unwrapTemplateBindingExpression(wrappedInitializer);\n const isConstMacroCall =\n isConst &&\n isTemplateCallOf(initializer, [\n 'defineProps',\n 'defineEmits',\n 'defineSlots',\n 'withDefaults',\n ]);\n if (id.type === 'Identifier') {\n let type: TemplateBindingType;\n const reactiveImport = vueImportAliases.get('reactive');\n if (\n (hoistStatic || source === 'script') &&\n (isAllLiteral || (isConst && isStaticTemplateBinding(initializer)))\n ) {\n type = 'literal-const';\n } else if (isTemplateCallOf(initializer, reactiveImport)) {\n type = isConst ? 'setup-reactive-const' : 'setup-let';\n } else if (\n isConstMacroCall ||\n (isConst && canNeverBeTemplateRef(initializer, reactiveImport))\n ) {\n type = isTemplateCallOf(initializer, 'defineProps')\n ? 'setup-reactive-const'\n : 'setup-const';\n } else if (isConst) {\n type = isTemplateCallOf(initializer, [\n vueImportAliases.get('ref'),\n vueImportAliases.get('computed'),\n vueImportAliases.get('shallowRef'),\n vueImportAliases.get('customRef'),\n vueImportAliases.get('toRef'),\n vueImportAliases.get('useTemplateRef'),\n 'defineModel',\n ])\n ? 'setup-ref'\n : 'setup-maybe-ref';\n } else {\n type = 'setup-let';\n }\n setTemplateBinding(bindings, id.name, type, owner);\n continue;\n }\n if (\n id.type === 'ObjectPattern' &&\n isTemplateCallOf(initializer, 'defineProps')\n ) {\n registerTemplatePropsDestructure(id, bindings, owner);\n } else {\n walkTemplateBindingPattern(\n id,\n bindings,\n owner,\n isConst,\n isConstMacroCall\n );\n }\n }\n return;\n }\n if (declaration.type === 'TSEnumDeclaration') {\n const isAllLiteral = declaration.members.every(\n ({ initializer }) => !initializer || isStaticTemplateBinding(initializer)\n );\n setTemplateBinding(\n bindings,\n declaration.id.name,\n isAllLiteral ? 'literal-const' : 'setup-const',\n owner\n );\n return;\n }\n if (declaration.id) {\n setTemplateBinding(bindings, declaration.id.name, 'setup-const', owner);\n }\n}\n\n/**\n * Registers the conservative union of reactive and legacy prop destructuring.\n *\n * Vue 3.3/3.5 and `propsDestructure: false` disagree about these local binding\n * types. Compiler configuration cannot be loaded safely before Vue ownership\n * is established, so a local destructure takes the strongest possible type.\n * This may defer an ambiguous wrapper-only project, but it cannot make that\n * ambiguity poison an otherwise valid React extraction.\n */\nfunction registerTemplatePropsDestructure(\n pattern: t.ObjectPattern,\n bindings: Map<string, TemplateBinding>,\n owner: t.Program\n): void {\n for (const property of pattern.properties) {\n if (property.type === 'RestElement') {\n for (const identifier of Object.values(\n t.getBindingIdentifiers(property.argument)\n )) {\n setTemplateBinding(\n bindings,\n identifier.name,\n 'setup-reactive-const',\n owner\n );\n }\n continue;\n }\n const publicName = readStaticPatternPropertyName(property);\n if (!publicName) continue;\n setTemplateBinding(bindings, publicName, 'props', owner);\n const value =\n property.value.type === 'AssignmentPattern'\n ? property.value.left\n : property.value;\n if (value.type === 'Identifier') {\n setTemplateBinding(bindings, value.name, 'setup-const', owner);\n }\n }\n}\n\nfunction readStaticPatternPropertyName(\n property: t.ObjectProperty\n): string | undefined {\n if (property.computed) return undefined;\n if (property.key.type === 'Identifier') return property.key.name;\n if (\n property.key.type === 'StringLiteral' ||\n property.key.type === 'NumericLiteral'\n ) {\n return String(property.key.value);\n }\n return undefined;\n}\n\nfunction walkTemplateBindingPattern(\n pattern: t.VariableDeclarator['id'],\n bindings: Map<string, TemplateBinding>,\n owner: t.Program,\n isConst: boolean,\n isDefineCall = false\n): void {\n if (pattern.type === 'ObjectPattern') {\n for (const property of pattern.properties) {\n if (property.type === 'RestElement') {\n registerTemplatePatternIdentifiers(\n property.argument,\n bindings,\n owner,\n isConst ? 'setup-const' : 'setup-let'\n );\n } else if (\n property.key.type === 'Identifier' &&\n property.shorthand &&\n property.value.type === 'Identifier'\n ) {\n setTemplateBinding(\n bindings,\n property.value.name,\n isDefineCall\n ? 'setup-const'\n : isConst\n ? 'setup-maybe-ref'\n : 'setup-let',\n owner\n );\n } else {\n walkTemplatePattern(\n property.value,\n bindings,\n owner,\n isConst,\n isDefineCall\n );\n }\n }\n return;\n }\n if (pattern.type === 'ArrayPattern') {\n for (const element of pattern.elements) {\n if (element) {\n walkTemplatePattern(element, bindings, owner, isConst, isDefineCall);\n }\n }\n }\n}\n\n/** Applies compiler-sfc's recursive destructuring binding classification. */\nfunction walkTemplatePattern(\n pattern: t.Node,\n bindings: Map<string, TemplateBinding>,\n owner: t.Program,\n isConst: boolean,\n isDefineCall = false\n): void {\n if (pattern.type === 'Identifier') {\n setTemplateBinding(\n bindings,\n pattern.name,\n isDefineCall ? 'setup-const' : isConst ? 'setup-maybe-ref' : 'setup-let',\n owner\n );\n } else if (pattern.type === 'RestElement') {\n registerTemplatePatternIdentifiers(\n pattern.argument,\n bindings,\n owner,\n isConst ? 'setup-const' : 'setup-let'\n );\n } else if (\n pattern.type === 'ObjectPattern' ||\n pattern.type === 'ArrayPattern'\n ) {\n walkTemplateBindingPattern(pattern, bindings, owner, isConst);\n } else if (pattern.type === 'AssignmentPattern') {\n walkTemplatePattern(pattern.left, bindings, owner, isConst, isDefineCall);\n }\n}\n\nfunction registerTemplatePatternIdentifiers(\n pattern: t.LVal,\n bindings: Map<string, TemplateBinding>,\n owner: t.Program,\n type: TemplateBindingType\n): void {\n for (const identifier of Object.values(t.getBindingIdentifiers(pattern))) {\n setTemplateBinding(bindings, identifier.name, type, owner);\n }\n}\n\nfunction setTemplateBinding(\n bindings: Map<string, TemplateBinding>,\n name: string,\n type: TemplateBindingType,\n owner: t.Program\n): void {\n bindings.set(name, { owner, type });\n}\n\nfunction unwrapTemplateBindingExpression(\n input: t.Node | null | undefined\n): t.Node | undefined {\n let current = input ?? undefined;\n while (\n current &&\n (current.type === 'TSAsExpression' ||\n current.type === 'TSTypeAssertion' ||\n current.type === 'TSNonNullExpression' ||\n current.type === 'TSSatisfiesExpression' ||\n current.type === 'TSInstantiationExpression' ||\n current.type === 'TypeCastExpression' ||\n current.type === 'ParenthesizedExpression')\n ) {\n current = current.expression;\n }\n return current;\n}\n\n/** Matches direct compiler macros and locally aliased Vue helper calls. */\nfunction isTemplateCallOf(\n node: t.Node | null | undefined,\n names: string | readonly (string | undefined)[] | undefined\n): boolean {\n if (!node || !names || node.type !== 'CallExpression') return false;\n const callee = unwrapTemplateBindingExpression(node.callee);\n if (callee?.type !== 'Identifier') return false;\n return typeof names === 'string'\n ? callee.name === names\n : names.some((name) => Boolean(name) && name === callee.name);\n}\n\n/** Returns whether compiler-sfc can prove that a value will never be a ref. */\nfunction canNeverBeTemplateRef(\n node: t.Node | null | undefined,\n reactiveImport: string | undefined\n): boolean {\n const expression = unwrapTemplateBindingExpression(node);\n if (!expression) return false;\n if (isTemplateCallOf(expression, reactiveImport)) return true;\n if (\n expression.type === 'UnaryExpression' ||\n expression.type === 'BinaryExpression' ||\n expression.type === 'ArrayExpression' ||\n expression.type === 'ObjectExpression' ||\n expression.type === 'FunctionExpression' ||\n expression.type === 'ArrowFunctionExpression' ||\n expression.type === 'UpdateExpression' ||\n expression.type === 'ClassExpression' ||\n expression.type === 'TaggedTemplateExpression'\n ) {\n return true;\n }\n if (expression.type === 'SequenceExpression') {\n return canNeverBeTemplateRef(expression.expressions.at(-1), reactiveImport);\n }\n return expression.type.endsWith('Literal');\n}\n\n/** Reproduces compiler-sfc's static-expression predicate for hoisted bindings. */\nfunction isStaticTemplateBinding(node: t.Node | null | undefined): boolean {\n const expression = unwrapTemplateBindingExpression(node);\n if (!expression) return false;\n if (expression.type === 'UnaryExpression') {\n return isStaticTemplateBinding(expression.argument);\n }\n if (\n expression.type === 'LogicalExpression' ||\n expression.type === 'BinaryExpression'\n ) {\n return (\n isStaticTemplateBinding(expression.left) &&\n isStaticTemplateBinding(expression.right)\n );\n }\n if (expression.type === 'ConditionalExpression') {\n return (\n isStaticTemplateBinding(expression.test) &&\n isStaticTemplateBinding(expression.consequent) &&\n isStaticTemplateBinding(expression.alternate)\n );\n }\n if (\n expression.type === 'SequenceExpression' ||\n expression.type === 'TemplateLiteral'\n ) {\n return expression.expressions.every(isStaticTemplateBinding);\n }\n return (\n expression.type === 'StringLiteral' ||\n expression.type === 'NumericLiteral' ||\n expression.type === 'BooleanLiteral' ||\n expression.type === 'NullLiteral' ||\n expression.type === 'BigIntLiteral'\n );\n}\n\ntype StaticImportUsageOptions = {\n externalUsage?: TemplateUsage;\n scriptSetup?: boolean;\n templateBindings?: ReadonlyMap<string, TemplateBinding>;\n templateSource?: string;\n};\n\nfunction collectStaticImports(\n ast: t.File,\n options: StaticImportUsageOptions = {}\n): ConsumerImport[] {\n let programScope: Scope | undefined;\n traverse(ast, {\n Program(programPath) {\n programScope = programPath.scope;\n programPath.stop();\n },\n });\n if (!programScope) return [];\n const templateUsage =\n options.templateSource && options.templateBindings\n ? readTemplateUsage(options.templateSource, options.templateBindings)\n : undefined;\n const runtimeUsages = [templateUsage, options.externalUsage].filter(\n (usage): usage is TemplateUsage => Boolean(usage)\n );\n\n const imports: ConsumerImport[] = [];\n for (const statement of ast.program.body) {\n if (\n statement.type === 'ImportDeclaration' &&\n statement.importKind !== 'type' &&\n statement.importKind !== 'typeof'\n ) {\n const importedNames = new Set<string>();\n for (const specifier of statement.specifiers) {\n if (specifier.type === 'ImportDefaultSpecifier') {\n if (\n bindingHasRuntimeUsage(\n programScope,\n specifier.local.name,\n runtimeUsages,\n ast.program,\n options.scriptSetup\n )\n ) {\n importedNames.add('default');\n }\n } else if (specifier.type === 'ImportNamespaceSpecifier') {\n for (const name of readUsedNamespaceMembers(\n programScope,\n specifier.local.name,\n runtimeUsages,\n ast.program\n )) {\n importedNames.add(name);\n }\n } else if (\n specifier.importKind !== 'type' &&\n specifier.importKind !== 'typeof' &&\n bindingHasRuntimeUsage(\n programScope,\n specifier.local.name,\n runtimeUsages,\n ast.program,\n options.scriptSetup\n )\n ) {\n importedNames.add(readModuleName(specifier.imported));\n }\n }\n if (importedNames.size > 0) {\n imports.push({ importedNames, source: statement.source.value });\n }\n continue;\n }\n\n if (\n statement.type === 'ExportAllDeclaration' &&\n statement.exportKind !== 'type'\n ) {\n imports.push({ importedNames: '*', source: statement.source.value });\n continue;\n }\n\n if (\n statement.type !== 'ExportNamedDeclaration' ||\n statement.exportKind === 'type' ||\n !statement.source\n ) {\n continue;\n }\n const importedNames = new Set<string>();\n for (const specifier of statement.specifiers) {\n if (\n specifier.type === 'ExportSpecifier' &&\n specifier.exportKind !== 'type'\n ) {\n importedNames.add(readModuleName(specifier.local));\n }\n }\n if (importedNames.size > 0) {\n imports.push({\n importedNames,\n source: statement.source.value,\n });\n }\n }\n return imports;\n}\n\nfunction readModuleName(node: t.Identifier | t.StringLiteral): string {\n return node.type === 'Identifier' ? node.name : node.value;\n}\n\n/** Requires a named/default import to participate in executable source. */\nfunction bindingHasRuntimeUsage(\n scope: Scope,\n localName: string,\n runtimeUsages: readonly TemplateUsage[],\n owner: t.Program,\n scriptSetup = false\n): boolean {\n const binding = scope.getBinding(localName);\n return Boolean(\n binding?.referencePaths.some(\n (reference) =>\n !isTypeOnlyReference(reference) &&\n !(scriptSetup && isCompilerConsumedSetupMacroReference(reference))\n ) ||\n runtimeUsages.some((usage) =>\n templateUsageMatchesBinding(usage, localName, owner)\n )\n );\n}\n\nconst VALUE_SETUP_COMPILER_MACROS = new Set([\n 'defineEmits',\n 'defineProps',\n 'defineSlots',\n 'withDefaults',\n]);\n\nconst EXPRESSION_SETUP_COMPILER_MACROS = new Set([\n ...VALUE_SETUP_COMPILER_MACROS,\n 'defineExpose',\n 'defineOptions',\n]);\n\n/**\n * Returns whether compiler-sfc removes this setup-only macro reference.\n *\n * Vue 3.3 and 3.5 agree on these direct top-level forms. `defineModel` is\n * deliberately absent because Vue 3.3 only consumes it behind an experimental\n * option, and nested calls remain ordinary runtime JavaScript in both lines.\n */\nfunction isCompilerConsumedSetupMacroReference(\n reference: NodePath<t.Node>\n): boolean {\n if (reference.node.type !== 'Identifier') return false;\n const macro = reference.node.name;\n if (!EXPRESSION_SETUP_COMPILER_MACROS.has(macro)) return false;\n const call = reference.parentPath;\n if (!call?.isCallExpression() || call.node.callee !== reference.node) {\n return false;\n }\n\n let consumedCall = call;\n if (macro === 'defineProps') {\n const parentCall = call.parentPath;\n if (\n parentCall?.isCallExpression() &&\n parentCall.node.arguments[0] === call.node &&\n parentCall.node.callee.type === 'Identifier' &&\n parentCall.node.callee.name === 'withDefaults'\n ) {\n consumedCall = parentCall;\n }\n }\n\n const parent = consumedCall.parentPath;\n if (parent?.isExpressionStatement() && parent.parentPath?.isProgram()) {\n return true;\n }\n return Boolean(\n VALUE_SETUP_COMPILER_MACROS.has(macro) &&\n parent?.isVariableDeclarator() &&\n parent.node.init === consumedCall.node &&\n parent.parentPath?.isVariableDeclaration() &&\n parent.parentPath.parentPath?.isProgram()\n );\n}\n\nfunction isTypeOnlyReference(reference: NodePath<t.Node>): boolean {\n if (\n reference.findParent(\n (parent) => t.isTSType(parent.node) || t.isFlow(parent.node)\n )\n ) {\n return true;\n }\n const exportSpecifier = reference.findParent((parent) =>\n parent.isExportSpecifier()\n );\n return Boolean(\n exportSpecifier?.isExportSpecifier() &&\n (exportSpecifier.node.exportKind === 'type' ||\n (exportSpecifier.parentPath?.isExportNamedDeclaration() &&\n exportSpecifier.parentPath.node.exportKind === 'type'))\n );\n}\n\n/** Returns only statically named namespace members used by source or template. */\nfunction readUsedNamespaceMembers(\n scope: Scope,\n localName: string,\n runtimeUsages: readonly TemplateUsage[],\n owner: t.Program\n): Set<string> {\n const names = new Set<string>();\n const bindings = new Set<Binding>();\n const collectImmutableAliases = (binding: Binding | undefined): void => {\n if (!binding?.constant || bindings.has(binding)) return;\n bindings.add(binding);\n for (const reference of binding.referencePaths) {\n const declarator = reference.parentPath;\n if (\n !declarator?.isVariableDeclarator() ||\n declarator.node.init !== reference.node ||\n declarator.node.id.type !== 'Identifier' ||\n !declarator.parentPath?.isVariableDeclaration() ||\n declarator.parentPath.node.kind !== 'const'\n ) {\n continue;\n }\n const alias = declarator.scope.getBinding(declarator.node.id.name);\n if (alias?.path.node === declarator.node) collectImmutableAliases(alias);\n }\n };\n collectImmutableAliases(scope.getBinding(localName));\n\n const writtenMembers = new Set<string>();\n for (const binding of bindings) {\n for (const reference of binding.referencePaths) {\n const member = readNamespaceMemberPath(reference);\n if (!member) continue;\n const name = readStaticPropertyName(member.node);\n if (name && isMemberWrite(member)) writtenMembers.add(name);\n }\n }\n\n const templateNames = new Set<string>();\n for (const binding of bindings) {\n if (binding.scope === scope) templateNames.add(binding.identifier.name);\n for (const reference of binding.referencePaths) {\n const member = readNamespaceMemberPath(reference);\n if (member) {\n const name = readStaticPropertyName(member.node);\n if (name && !writtenMembers.has(name)) names.add(name);\n continue;\n }\n const jsxMember = reference.parentPath;\n if (\n jsxMember?.isJSXMemberExpression() &&\n jsxMember.node.object === reference.node &&\n jsxMember.node.property.type === 'JSXIdentifier' &&\n !writtenMembers.has(jsxMember.node.property.name)\n ) {\n names.add(jsxMember.node.property.name);\n continue;\n }\n const parent = reference.parent;\n if (\n parent?.type !== 'VariableDeclarator' ||\n parent.init !== reference.node ||\n parent.id.type !== 'ObjectPattern'\n ) {\n continue;\n }\n for (const property of parent.id.properties) {\n if (property.type !== 'ObjectProperty' || property.computed) continue;\n const name =\n property.key.type === 'Identifier'\n ? property.key.name\n : property.key.type === 'StringLiteral'\n ? property.key.value\n : undefined;\n if (name && !writtenMembers.has(name)) names.add(name);\n }\n }\n }\n for (const runtimeUsage of runtimeUsages) {\n for (const templateName of templateNames) {\n if (!templateUsageMatchesBinding(runtimeUsage, templateName, owner)) {\n continue;\n }\n for (const name of runtimeUsage.namespaceMembers.get(templateName) ??\n []) {\n if (!writtenMembers.has(name)) names.add(name);\n }\n }\n }\n return names;\n}\n\nfunction readNamespaceMemberPath(\n reference: NodePath<t.Node>\n): NodePath<t.MemberExpression | t.OptionalMemberExpression> | undefined {\n const member = reference.parentPath;\n if (\n (member?.isMemberExpression() || member?.isOptionalMemberExpression()) &&\n member.node.object === reference.node\n ) {\n return member;\n }\n return undefined;\n}\n\nfunction isMemberWrite(\n member: NodePath<t.MemberExpression | t.OptionalMemberExpression>\n): boolean {\n const parent = member.parentPath?.node;\n return Boolean(\n (parent?.type === 'AssignmentExpression' && parent.left === member.node) ||\n (parent?.type === 'UpdateExpression' && parent.argument === member.node) ||\n (parent?.type === 'UnaryExpression' &&\n parent.operator === 'delete' &&\n parent.argument === member.node) ||\n ((parent?.type === 'ForInStatement' || parent?.type === 'ForOfStatement') &&\n parent.left === member.node)\n );\n}\n\ntype TemplateUsage = {\n bindingOwners?: ReadonlyMap<string, t.Program>;\n identifiers: Set<string>;\n namespaceMembers: Map<string, Set<string>>;\n};\n\nfunction createTemplateUsage(\n bindingOwners?: ReadonlyMap<string, t.Program>\n): TemplateUsage {\n return {\n bindingOwners,\n identifiers: new Set(),\n namespaceMembers: new Map(),\n };\n}\n\nfunction templateUsageMatchesBinding(\n usage: TemplateUsage,\n name: string,\n owner: t.Program\n): boolean {\n if (!usage.identifiers.has(name)) return false;\n const expectedOwner = usage.bindingOwners?.get(name);\n return !expectedOwner || expectedOwner === owner;\n}\n\nconst VUE_CORE_COMPONENT_TEMPLATE_TAGS = new Set([\n 'BaseTransition',\n 'KeepAlive',\n 'Suspense',\n 'Teleport',\n 'Transition',\n 'TransitionGroup',\n 'base-transition',\n 'keep-alive',\n 'suspense',\n 'teleport',\n 'transition',\n 'transition-group',\n]);\n\nconst VUE_BUILTIN_TEMPLATE_TAGS = new Set([\n ...VUE_CORE_COMPONENT_TEMPLATE_TAGS,\n 'slot',\n 'template',\n]);\n\nconst VUE_RAW_TEXT_TEMPLATE_TAGS = new Set(['script', 'style']);\n\nconst VUE_RCDATA_TEMPLATE_TAGS = new Set(['textarea', 'title']);\n\nconst VUE_VOID_TEMPLATE_TAGS = new Set(\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(\n ','\n )\n);\n\n/**\n * Native platform tags recognized by Vue templates.\n *\n * Detection deliberately keeps this list local instead of importing\n * `@vue/shared`: `/detect` runs for every CLI extraction and must not load a\n * Vue runtime dependency before a project has proven Vue ownership.\n */\nconst VUE_NATIVE_TEMPLATE_TAGS = new Set(\n (\n 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +\n 'header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,' +\n 'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,' +\n 'code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,' +\n 'sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +\n 'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +\n 'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +\n 'option,output,progress,select,textarea,details,dialog,menu,summary,' +\n 'template,blockquote,iframe,tfoot,svg,animate,animateMotion,' +\n 'animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,' +\n 'feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,' +\n 'feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,' +\n 'feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,' +\n 'feMerge,feMergeNode,feMorphology,feOffset,fePointLight,' +\n 'feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,' +\n 'g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,' +\n 'meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,' +\n 'polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,' +\n 'textPath,tspan,unknown,use,view,annotation,annotation-xml,maction,' +\n 'maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,' +\n 'mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,' +\n 'mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,' +\n 'mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,' +\n 'mtr,munder,munderover,none,semantics'\n ).split(',')\n);\n\n/** Parses component tags and executable expressions without raw-text guesses. */\nfunction readTemplateUsage(\n templateSource: string,\n scriptBindings: ReadonlyMap<string, TemplateBinding>\n): TemplateUsage {\n const usage = createTemplateUsage(\n new Map([...scriptBindings].map(([name, binding]) => [name, binding.owner]))\n );\n const activeBindings = new Map<string, number>();\n const elementStack: TemplateElementScope[] = [];\n let vPreDepth = 0;\n let index = 0;\n while (index < templateSource.length) {\n if (templateSource.startsWith('<!--', index)) {\n index = readHtmlCommentEnd(templateSource, index);\n continue;\n }\n if (templateSource.startsWith('{{', index)) {\n if (vPreDepth > 0) {\n index += 2;\n continue;\n }\n const interpolation = readTemplateInterpolation(templateSource, index);\n if (interpolation.ast) {\n collectTemplateAstUsage(interpolation.ast, usage, activeBindings);\n }\n index = interpolation.end;\n continue;\n }\n if (templateSource[index] !== '<') {\n index += 1;\n continue;\n }\n const tag = readTemplateMarkupTag(templateSource, index);\n if (!tag) {\n index += 1;\n continue;\n }\n const normalizedTagName = tag.name.toLowerCase();\n if (tag.closing) {\n vPreDepth = Math.max(\n 0,\n vPreDepth -\n closeTemplateElementScope(\n normalizedTagName,\n elementStack,\n activeBindings\n )\n );\n index = tag.end;\n continue;\n }\n const attributes = readTemplateAttributes(tag.attributes);\n const introducesVPre = attributes.some(({ name }) =>\n isTemplateVPreDirective(name)\n );\n const suppressUsage = vPreDepth > 0 || introducesVPre;\n let descendantBindings = new Set<string>();\n if (!suppressUsage) {\n const directiveUsage = collectTemplateDirectiveUsage(\n attributes,\n usage,\n activeBindings\n );\n descendantBindings = directiveUsage.descendantBindings;\n const elementBindings = new Map(activeBindings);\n for (const binding of directiveUsage.elementBindings) {\n elementBindings.set(binding, (elementBindings.get(binding) ?? 0) + 1);\n }\n recordTemplateTagUsage(\n tag.name,\n usage,\n elementBindings,\n attributes,\n scriptBindings\n );\n }\n const rawTextClosingTag =\n !tag.selfClosing && VUE_RAW_TEXT_TEMPLATE_TAGS.has(tag.name)\n ? findRawBlockClosingTag(templateSource, tag.name, tag.end)\n : undefined;\n if (rawTextClosingTag) {\n index = rawTextClosingTag.end;\n continue;\n }\n const rcdataClosingTag =\n !tag.selfClosing && VUE_RCDATA_TEMPLATE_TAGS.has(tag.name)\n ? findRawBlockClosingTag(templateSource, tag.name, tag.end)\n : undefined;\n if (rcdataClosingTag) {\n if (!suppressUsage) {\n const rcdataBindings = new Map(activeBindings);\n for (const binding of descendantBindings) {\n rcdataBindings.set(binding, (rcdataBindings.get(binding) ?? 0) + 1);\n }\n collectTemplateRcdataUsage(\n templateSource.slice(tag.end, rcdataClosingTag.start),\n usage,\n rcdataBindings\n );\n }\n index = rcdataClosingTag.end;\n continue;\n }\n if (!tag.selfClosing && !VUE_VOID_TEMPLATE_TAGS.has(tag.name)) {\n elementStack.push({\n bindings: descendantBindings,\n name: normalizedTagName,\n vPre: introducesVPre,\n });\n for (const binding of descendantBindings) {\n activeBindings.set(binding, (activeBindings.get(binding) ?? 0) + 1);\n }\n if (introducesVPre) vPreDepth += 1;\n }\n index = tag.end;\n }\n return usage;\n}\n\ntype TemplateElementScope = {\n bindings: Set<string>;\n name: string;\n vPre: boolean;\n};\n\nfunction closeTemplateElementScope(\n name: string,\n elementStack: TemplateElementScope[],\n activeBindings: Map<string, number>\n): number {\n let matchingIndex = -1;\n for (let index = elementStack.length - 1; index >= 0; index -= 1) {\n if (elementStack[index]?.name === name) {\n matchingIndex = index;\n break;\n }\n }\n if (matchingIndex < 0) return 0;\n let closedVPreScopes = 0;\n while (elementStack.length > matchingIndex) {\n const element = elementStack.pop()!;\n if (element.vPre) closedVPreScopes += 1;\n for (const binding of element.bindings) {\n const remaining = (activeBindings.get(binding) ?? 1) - 1;\n if (remaining > 0) activeBindings.set(binding, remaining);\n else activeBindings.delete(binding);\n }\n }\n return closedVPreScopes;\n}\n\n/** Records executable Vue interpolations while keeping RCDATA tags opaque. */\nfunction collectTemplateRcdataUsage(\n source: string,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>\n): void {\n let index = source.indexOf('{{');\n while (index >= 0) {\n const interpolation = readTemplateInterpolation(source, index);\n if (interpolation.ast) {\n collectTemplateAstUsage(interpolation.ast, usage, shadowedBindings);\n }\n if (interpolation.end >= source.length) return;\n index = source.indexOf('{{', interpolation.end);\n }\n}\n\ntype TemplateMarkupTag = {\n attributes: string;\n closing: boolean;\n end: number;\n name: string;\n selfClosing: boolean;\n};\n\n/** Reads one real template tag while keeping quoted attribute data opaque. */\nfunction readTemplateMarkupTag(\n source: string,\n start: number\n): TemplateMarkupTag | undefined {\n if (source[start] !== '<' || source.startsWith('<!--', start)) {\n return undefined;\n }\n let cursor = start + 1;\n const closing = source[cursor] === '/';\n if (closing) cursor += 1;\n const nameStart = cursor;\n while (cursor < source.length && /[A-Za-z0-9_$.:?-]/.test(source[cursor]!)) {\n cursor += 1;\n }\n if (cursor === nameStart || !/[A-Za-z_$]/.test(source[nameStart]!)) {\n return undefined;\n }\n const name = source.slice(nameStart, cursor);\n const attributesStart = cursor;\n let quote: string | undefined;\n while (cursor < source.length) {\n const character = source[cursor]!;\n if (quote) {\n if (character === quote) quote = undefined;\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === '>') {\n return {\n attributes: source.slice(attributesStart, cursor),\n closing,\n end: cursor + 1,\n name,\n selfClosing:\n !closing && /\\/\\s*$/.test(source.slice(attributesStart, cursor)),\n };\n }\n cursor += 1;\n }\n return undefined;\n}\n\nfunction recordTemplateTagUsage(\n sourceTag: string,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>,\n attributes: readonly TemplateAttribute[],\n scriptBindings: ReadonlyMap<string, TemplateBinding>\n): void {\n if (isDynamicComponentTag(sourceTag, attributes)) return;\n const valuedVIs = readValuedVIsDirective(attributes);\n if (valuedVIs) {\n recordVersionStableVIsUsage(\n sourceTag,\n valuedVIs,\n usage,\n shadowedBindings,\n attributes,\n scriptBindings\n );\n return;\n }\n\n const staticVueIsTarget = readStaticVueIsTarget(attributes);\n let tag = sourceTag;\n if (staticVueIsTarget !== undefined) {\n if (!hasStableStaticVueIsSemantics(sourceTag)) return;\n tag = staticVueIsTarget;\n }\n const member = /^([A-Za-z_$][\\w$-]*)\\.([A-Za-z_$][\\w$]*)$/.exec(tag);\n if (member?.[1] && member[2]) {\n const namespace = resolveTemplateTagBinding(\n member[1],\n shadowedBindings,\n scriptBindings\n );\n if (namespace) {\n usage.identifiers.add(namespace);\n addTemplateNamespaceMember(usage, namespace, member[2]);\n }\n return;\n }\n if (\n staticVueIsTarget !== undefined\n ? VUE_CORE_COMPONENT_TEMPLATE_TAGS.has(tag)\n : VUE_BUILTIN_TEMPLATE_TAGS.has(tag) || VUE_NATIVE_TEMPLATE_TAGS.has(tag)\n ) {\n return;\n }\n const name = resolveTemplateTagBinding(tag, shadowedBindings, scriptBindings);\n if (name) usage.identifiers.add(name);\n}\n\n/** Reads the component target of Vue's static `is=\"vue:...\"` syntax. */\nfunction readStaticVueIsTarget(\n attributes: readonly TemplateAttribute[]\n): string | undefined {\n const value = attributes.find(({ name }) => name === 'is')?.value;\n return value?.startsWith('vue:') ? value.slice(4) : undefined;\n}\n\n/**\n * Limits static `vue:` rewriting to tags whose parser classification is known.\n *\n * Project-level custom-element options are unavailable until Vue ownership is\n * established. Unknown component/custom-element tags therefore cannot safely\n * prove that the `vue:` target executes. `slot`, `template`, and dynamic\n * `component` also differ from ordinary elements (and `template` differs\n * between supported Vue 3.3/3.5 lines), so they remain conservative.\n */\nfunction hasStableStaticVueIsSemantics(tag: string): boolean {\n if (\n tag === 'component' ||\n tag === 'Component' ||\n tag === 'slot' ||\n tag === 'template'\n ) {\n return false;\n }\n return (\n VUE_NATIVE_TEMPLATE_TAGS.has(tag) || VUE_BUILTIN_TEMPLATE_TAGS.has(tag)\n );\n}\n\n/** Reads a valued `v-is` whose meaning differs across supported Vue lines. */\nfunction readValuedVIsDirective(\n attributes: readonly TemplateAttribute[]\n): TemplateAttribute | undefined {\n return attributes.find(\n ({ name, value }) => value !== undefined && /^v-is(?:$|[:.])/.test(name)\n );\n}\n\n/**\n * Retains only wrapper bindings used by both meanings of valued `v-is`.\n *\n * Vue 3.3 evaluates the directive expression and replaces the source tag;\n * Vue 3.5 removes the directive and renders the source tag. Intersecting both\n * usage sets avoids false ownership on either version while preserving a\n * wrapper deliberately referenced on both sides.\n */\nfunction recordVersionStableVIsUsage(\n sourceTag: string,\n directive: TemplateAttribute,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>,\n attributes: readonly TemplateAttribute[],\n scriptBindings: ReadonlyMap<string, TemplateBinding>\n): void {\n const sourceUsage = createTemplateUsage();\n recordTemplateTagUsage(\n sourceTag,\n sourceUsage,\n shadowedBindings,\n attributes.filter((attribute) => attribute !== directive),\n scriptBindings\n );\n const directiveUsage = createTemplateUsage();\n collectTemplateExpressionUsage(\n directive.value ?? '',\n directiveUsage,\n shadowedBindings\n );\n\n for (const identifier of sourceUsage.identifiers) {\n if (directiveUsage.identifiers.has(identifier)) {\n usage.identifiers.add(identifier);\n }\n }\n for (const [namespace, sourceMembers] of sourceUsage.namespaceMembers) {\n const directiveMembers = directiveUsage.namespaceMembers.get(namespace);\n if (!directiveMembers) continue;\n for (const member of sourceMembers) {\n if (directiveMembers.has(member)) {\n addTemplateNamespaceMember(usage, namespace, member);\n }\n }\n }\n}\n\n/** Selects the first lexical or setup binding in Vue's tag lookup order. */\nfunction resolveTemplateTagBinding(\n sourceName: string,\n shadowedBindings: ReadonlyMap<string, number>,\n scriptBindings: ReadonlyMap<string, TemplateBinding>\n): string | undefined {\n const candidates = [...normalizeTemplateBindingNames(sourceName)];\n for (const bindingType of TEMPLATE_BINDING_RESOLUTION_ORDER) {\n for (const candidate of candidates) {\n if (scriptBindings.get(candidate)?.type !== bindingType) continue;\n return shadowedBindings.has(candidate) ? undefined : candidate;\n }\n }\n return undefined;\n}\n\nfunction isDynamicComponentTag(\n tag: string,\n attributes: readonly TemplateAttribute[]\n): boolean {\n if (tag !== 'component' && tag !== 'Component') return false;\n return attributes.some(({ name, value }) => {\n // No-value bind shorthand resolves differently in Vue 3.3 and 3.5. Keep\n // the static tag candidate as well as collecting the shorthand expression,\n // so neither supported runtime can silently lose real wrapper usage.\n if (value === undefined) return false;\n const baseName = name.split('.')[0];\n return (\n baseName === 'is' ||\n baseName === ':is' ||\n baseName === 'v-bind:is' ||\n name === '.is' ||\n name.startsWith('.is.')\n );\n });\n}\n\n/** Collects dynamic directive arguments and executable directive values. */\nfunction collectTemplateDirectiveUsage(\n attributes: readonly TemplateAttribute[],\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>\n): TemplateDirectiveUsage {\n const directives = attributes.filter(({ name }) =>\n isTemplateDirectiveName(name)\n );\n const elementBindings = new Set<string>();\n const descendantBindings = new Set<string>();\n for (const directive of directives.filter(({ name }) =>\n isTemplateForDirective(name)\n )) {\n for (const binding of collectTemplateDirective(\n directive.name,\n directive.value,\n usage,\n shadowedBindings\n )) {\n elementBindings.add(binding);\n descendantBindings.add(binding);\n }\n }\n for (const directive of directives.filter(({ name }) =>\n isTemplateConditionalDirective(name)\n )) {\n collectTemplateDirective(\n directive.name,\n directive.value,\n usage,\n shadowedBindings\n );\n }\n const loopBindings = new Map(shadowedBindings);\n for (const binding of elementBindings) {\n loopBindings.set(binding, (loopBindings.get(binding) ?? 0) + 1);\n }\n for (const directive of directives) {\n if (\n isTemplateForDirective(directive.name) ||\n isTemplateConditionalDirective(directive.name)\n ) {\n continue;\n }\n for (const binding of collectTemplateDirective(\n directive.name,\n directive.value,\n usage,\n loopBindings\n )) {\n descendantBindings.add(binding);\n }\n }\n return { descendantBindings, elementBindings };\n}\n\ntype TemplateDirectiveUsage = {\n descendantBindings: Set<string>;\n elementBindings: Set<string>;\n};\n\ntype TemplateAttribute = {\n name: string;\n value: string | undefined;\n};\n\nfunction readTemplateAttributes(attributes: string): TemplateAttribute[] {\n const parsedAttributes: TemplateAttribute[] = [];\n let index = 0;\n while (index < attributes.length) {\n while (/\\s/.test(attributes[index] ?? '')) index += 1;\n if (index >= attributes.length || attributes[index] === '/') {\n return parsedAttributes;\n }\n const nameStart = index;\n while (index < attributes.length && !/[\\s=]/.test(attributes[index]!)) {\n index += 1;\n }\n const name = attributes.slice(nameStart, index);\n while (/\\s/.test(attributes[index] ?? '')) index += 1;\n\n let value: string | undefined;\n if (attributes[index] === '=') {\n index += 1;\n while (/\\s/.test(attributes[index] ?? '')) index += 1;\n const quote = attributes[index];\n if (quote === '\"' || quote === \"'\") {\n index += 1;\n const valueStart = index;\n while (index < attributes.length && attributes[index] !== quote) {\n index += 1;\n }\n value = attributes.slice(valueStart, index);\n if (attributes[index] === quote) index += 1;\n } else {\n const valueStart = index;\n while (index < attributes.length && !/[\\s>]/.test(attributes[index]!)) {\n index += 1;\n }\n value = attributes.slice(valueStart, index);\n }\n }\n parsedAttributes.push({ name, value });\n }\n return parsedAttributes;\n}\n\nfunction isTemplateDirectiveName(name: string): boolean {\n return /^[.:@#]|^v-/.test(name);\n}\n\nfunction isTemplateVPreDirective(name: string): boolean {\n return /^v-pre(?:$|[:.])/.test(name);\n}\n\nfunction isTemplateForDirective(name: string): boolean {\n return /^v-for(?::|$)/.test(name);\n}\n\nfunction isTemplateConditionalDirective(name: string): boolean {\n return /^v-(?:if|else-if)(?::|$)/.test(name);\n}\n\nfunction collectTemplateDirective(\n name: string,\n value: string | undefined,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>\n): Set<string> {\n if (!/^[.:@#]|^v-/.test(name)) return new Set();\n // Vue consumes the complete compatibility directive. Its dynamic argument\n // is never a runtime expression; valued forms are intersected with source\n // tag usage separately because Vue 3.3 and 3.5 interpret them differently.\n if (/^v-is(?:$|[:.])/.test(name)) return new Set();\n const argument = readDynamicDirectiveArgument(name);\n if (argument) {\n collectTemplateExpressionUsage(argument, usage, shadowedBindings);\n }\n if (value === undefined) {\n if ((name.startsWith(':') || name.startsWith('.')) && !argument) {\n collectTemplateExpressionUsage(\n name.slice(1).split('.')[0] ?? '',\n usage,\n shadowedBindings\n );\n }\n return new Set();\n }\n if (/^(?:#|v-slot(?::|$))/.test(name)) {\n return collectTemplateBindingUsage(value, usage, shadowedBindings);\n } else if (/^v-for(?::|$)/.test(name)) {\n return collectTemplateForUsage(value, usage, shadowedBindings);\n } else {\n collectTemplateExpressionUsage(value, usage, shadowedBindings);\n }\n return new Set();\n}\n\nfunction readDynamicDirectiveArgument(name: string): string | undefined {\n const start = name.indexOf('[');\n const end = name.lastIndexOf(']');\n return start >= 0 && end > start ? name.slice(start + 1, end) : undefined;\n}\n\nfunction collectTemplateExpressionUsage(\n source: string,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>\n): void {\n const ast = parseTemplateExpression(source);\n if (ast) collectTemplateAstUsage(ast, usage, shadowedBindings);\n}\n\nfunction collectTemplateBindingUsage(\n source: string,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>\n): Set<string> {\n try {\n const ast = parseScriptAst(`((${source}) => {})`, 'tsx');\n collectTemplateAstUsage(ast, usage, shadowedBindings);\n const statement = ast.program.body[0];\n if (\n statement?.type !== 'ExpressionStatement' ||\n statement.expression.type !== 'ArrowFunctionExpression'\n ) {\n return new Set();\n }\n return new Set(\n statement.expression.params.flatMap((parameter) =>\n Object.keys(t.getBindingIdentifiers(parameter))\n )\n );\n } catch {\n // Invalid bindings are diagnosed by the owning Vue compiler later.\n return new Set();\n }\n}\n\nfunction collectTemplateForUsage(\n source: string,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>\n): Set<string> {\n const separator = /\\s+(?:in|of)\\s+/.exec(source);\n if (!separator || separator.index === undefined) {\n collectTemplateExpressionUsage(source, usage, shadowedBindings);\n return new Set();\n }\n const left = source.slice(0, separator.index).trim();\n const right = source.slice(separator.index + separator[0].length).trim();\n const unwrappedLeft =\n left.startsWith('(') && left.endsWith(')') ? left.slice(1, -1) : left;\n const bindings = collectTemplateBindingUsage(\n unwrappedLeft,\n usage,\n shadowedBindings\n );\n collectTemplateExpressionUsage(right, usage, shadowedBindings);\n return bindings;\n}\n\n/** Finds the first syntactically complete interpolation closing delimiter. */\nfunction readTemplateInterpolation(\n source: string,\n start: number\n): { ast?: t.File; end: number } {\n let closing = source.indexOf('}}', start + 2);\n while (closing >= 0) {\n const ast = parseTemplateExpression(source.slice(start + 2, closing));\n if (ast) return { ast, end: closing + 2 };\n closing = source.indexOf('}}', closing + 1);\n }\n return { end: source.length };\n}\n\n/** Accepts expression, binding-pattern, and event-statement template syntax. */\nfunction parseTemplateExpression(source: string): t.File | undefined {\n for (const candidate of [\n `(${source})`,\n `((${source}) => {})`,\n `function __gt_template_expression__() { ${source} }`,\n ]) {\n try {\n return parseScriptAst(candidate, 'tsx');\n } catch {\n // Try the next executable wrapper.\n }\n }\n return undefined;\n}\n\n/** Records only unshadowed runtime identifiers and static namespace members. */\nfunction collectTemplateAstUsage(\n ast: t.File,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>,\n scriptSetup = false\n): void {\n traverse(ast, {\n ReferencedIdentifier(path) {\n if (\n (scriptSetup && isCompilerConsumedSetupMacroReference(path)) ||\n shadowedBindings.has(path.node.name) ||\n path.scope.getBinding(path.node.name) ||\n path.findParent(\n (parent) => t.isTSType(parent.node) || t.isFlow(parent.node)\n )\n ) {\n return;\n }\n usage.identifiers.add(path.node.name);\n },\n JSXIdentifier(path) {\n if (\n !/^[A-Z_$]/.test(path.node.name) ||\n path.parentPath?.isJSXMemberExpression() ||\n !(\n (path.parentPath?.isJSXOpeningElement() &&\n path.parentPath.node.name === path.node) ||\n (path.parentPath?.isJSXClosingElement() &&\n path.parentPath.node.name === path.node)\n ) ||\n shadowedBindings.has(path.node.name) ||\n path.scope.getBinding(path.node.name)\n ) {\n return;\n }\n usage.identifiers.add(path.node.name);\n },\n MemberExpression(path) {\n collectTemplateMemberUsage(path, usage, shadowedBindings);\n },\n OptionalMemberExpression(path) {\n collectTemplateMemberUsage(path, usage, shadowedBindings);\n },\n JSXMemberExpression(path) {\n const object = path.node.object;\n if (\n object.type !== 'JSXIdentifier' ||\n shadowedBindings.has(object.name) ||\n path.scope.getBinding(object.name) ||\n path.node.property.type !== 'JSXIdentifier'\n ) {\n return;\n }\n usage.identifiers.add(object.name);\n addTemplateNamespaceMember(usage, object.name, path.node.property.name);\n },\n });\n}\n\nfunction collectTemplateMemberUsage(\n path: NodePath<t.MemberExpression | t.OptionalMemberExpression>,\n usage: TemplateUsage,\n shadowedBindings: ReadonlyMap<string, number>\n): void {\n const object = path.node.object;\n if (\n object.type !== 'Identifier' ||\n shadowedBindings.has(object.name) ||\n path.scope.getBinding(object.name) ||\n path.findParent(\n (parent) => t.isTSType(parent.node) || t.isFlow(parent.node)\n )\n ) {\n return;\n }\n const member = readStaticPropertyName(path.node);\n if (member) addTemplateNamespaceMember(usage, object.name, member);\n}\n\nfunction addTemplateNamespaceMember(\n usage: TemplateUsage,\n namespace: string,\n member: string\n): void {\n const members = usage.namespaceMembers.get(namespace) ?? new Set<string>();\n members.add(member);\n usage.namespaceMembers.set(namespace, members);\n}\n\n/** Mirrors Vue's kebab/camel/Pascal lookup for setup template bindings. */\nfunction normalizeTemplateBindingNames(sourceName: string): Set<string> {\n const camelized = sourceName.replace(/-(\\w)/g, (_match, letter: string) =>\n letter.toUpperCase()\n );\n const pascalized = camelized\n ? camelized[0]!.toUpperCase() + camelized.slice(1)\n : camelized;\n return new Set([sourceName, camelized, pascalized]);\n}\n\nfunction readStaticPropertyName(\n member: t.MemberExpression | t.OptionalMemberExpression\n): string | undefined {\n if (!member.computed && member.property.type === 'Identifier') {\n return member.property.name;\n }\n if (member.computed && member.property.type === 'StringLiteral') {\n return member.property.value;\n }\n return undefined;\n}\n\nfunction readPackageName(\n manifest: JavaScriptPackageManifest\n): string | undefined {\n return typeof manifest.name === 'string' && manifest.name\n ? manifest.name\n : undefined;\n}\n\nfunction resolveRealPath(file: string): string {\n try {\n return fs.realpathSync(file);\n } catch {\n return path.resolve(file);\n }\n}\n\n/** Keeps a package's default source roots from following external symlinks. */\nfunction isContainedPhysicalDirectory(\n root: string,\n directory: string\n): boolean {\n try {\n const stat = fs.lstatSync(directory);\n if (!stat.isDirectory() || stat.isSymbolicLink()) return false;\n const realDirectory = fs.realpathSync(directory);\n const relative = path.relative(root, realDirectory);\n return (\n relative !== '' &&\n !relative.startsWith(`..${path.sep}`) &&\n relative !== '..' &&\n !path.isAbsolute(relative)\n );\n } catch {\n return false;\n }\n}\n\nfunction escapeRegularExpression(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type JavaScriptPackageManifest } from './manifest.js';
2
+ import { type ConsumerUsageCache } from './consumerUsage.js';
3
+ /**
4
+ * Returns whether the root package owns gt-vue directly or through local code.
5
+ *
6
+ * Only installed bindings proven to originate inside the current project are
7
+ * traversed. Registry packages and unrelated workspace descendants therefore
8
+ * cannot change the root CLI mode, and ordinary projects never scan workspace
9
+ * manifests or eagerly load the Vue parser and project-discovery graph.
10
+ */
11
+ export declare function detectVueProject(cwd?: string): boolean;
12
+ /** Checks only installed project-local dependency edges for a Vue wrapper. */
13
+ export declare function localDependencyGraphDeclaresVue(rootManifest: JavaScriptPackageManifest, projectRoot: string, consumerUsageCache?: ConsumerUsageCache): boolean;
@@ -0,0 +1,65 @@
1
+ import { declaresAvailableJavaScriptDependency, dependencyBindingAcceptsPackageVersion, parseLocalDependencyPath, readJavaScriptPackageManifest, readWorkspaceDependencyBindings, resolveInstalledJavaScriptPackage } from "./manifest.js";
2
+ import { createConsumerUsageCache, packageConsumesPublicGT } from "./consumerUsage.js";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ //#region src/internal/project/detectVueProject.ts
6
+ /**
7
+ * Returns whether the root package owns gt-vue directly or through local code.
8
+ *
9
+ * Only installed bindings proven to originate inside the current project are
10
+ * traversed. Registry packages and unrelated workspace descendants therefore
11
+ * cannot change the root CLI mode, and ordinary projects never scan workspace
12
+ * manifests or eagerly load the Vue parser and project-discovery graph.
13
+ */
14
+ function detectVueProject(cwd = process.cwd()) {
15
+ try {
16
+ const projectRoot = normalizeDirectory(cwd);
17
+ const rootManifest = readJavaScriptPackageManifest(path.join(projectRoot, "package.json"));
18
+ if (!rootManifest) return false;
19
+ if (declaresAvailableJavaScriptDependency(rootManifest, "gt-vue", projectRoot)) return true;
20
+ return localDependencyGraphDeclaresVue(rootManifest, projectRoot, createConsumerUsageCache());
21
+ } catch {
22
+ return false;
23
+ }
24
+ }
25
+ /** Checks only installed project-local dependency edges for a Vue wrapper. */
26
+ function localDependencyGraphDeclaresVue(rootManifest, projectRoot, consumerUsageCache = createConsumerUsageCache()) {
27
+ for (const binding of readWorkspaceDependencyBindings(rootManifest, projectRoot)) {
28
+ const installed = resolveInstalledJavaScriptPackage(projectRoot, binding.name);
29
+ if (!installed) continue;
30
+ const sourceDirectory = findLocalSourceDirectory(binding, projectRoot, installed.directory, projectRoot);
31
+ if (!sourceDirectory) continue;
32
+ const sourceManifest = readJavaScriptPackageManifest(path.join(sourceDirectory, "package.json"));
33
+ const packageName = readPackageName(sourceManifest);
34
+ if (!sourceManifest || !packageName || !dependencyBindingAcceptsPackageVersion(binding, packageName, sourceManifest.version)) continue;
35
+ if (packageConsumesPublicGT(projectRoot, binding.name, sourceDirectory, sourceManifest, consumerUsageCache)) return true;
36
+ }
37
+ return false;
38
+ }
39
+ function findLocalSourceDirectory(binding, importerSourceDirectory, installedDirectory, projectRoot) {
40
+ const localPath = parseLocalDependencyPath(binding.specifier);
41
+ if (localPath) {
42
+ const sourceDirectory = normalizeDirectory(path.resolve(importerSourceDirectory, localPath));
43
+ if (isLocalSourceDirectory(projectRoot, sourceDirectory)) return sourceDirectory;
44
+ }
45
+ const normalizedInstalled = normalizeDirectory(installedDirectory);
46
+ if (isLocalSourceDirectory(projectRoot, normalizedInstalled)) return normalizedInstalled;
47
+ }
48
+ function isLocalSourceDirectory(projectRoot, candidate) {
49
+ const relative = path.relative(projectRoot, candidate);
50
+ return relative !== "" && relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative) && !relative.split(path.sep).includes("node_modules") && fs.existsSync(path.join(candidate, "package.json"));
51
+ }
52
+ function normalizeDirectory(directory) {
53
+ try {
54
+ return fs.realpathSync(directory);
55
+ } catch {
56
+ return path.resolve(directory);
57
+ }
58
+ }
59
+ function readPackageName(manifest) {
60
+ return typeof manifest?.name === "string" && manifest.name ? manifest.name : void 0;
61
+ }
62
+ //#endregion
63
+ export { detectVueProject, localDependencyGraphDeclaresVue };
64
+
65
+ //# sourceMappingURL=detectVueProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectVueProject.js","names":[],"sources":["../../../src/internal/project/detectVueProject.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport {\n dependencyBindingAcceptsPackageVersion,\n declaresAvailableJavaScriptDependency,\n GT_VUE_PACKAGE,\n parseLocalDependencyPath,\n readJavaScriptPackageManifest,\n readWorkspaceDependencyBindings,\n resolveInstalledJavaScriptPackage,\n type JavaScriptDependencyBinding,\n type JavaScriptPackageManifest,\n} from './manifest.js';\nimport {\n createConsumerUsageCache,\n packageConsumesPublicGT,\n type ConsumerUsageCache,\n} from './consumerUsage.js';\n\n/**\n * Returns whether the root package owns gt-vue directly or through local code.\n *\n * Only installed bindings proven to originate inside the current project are\n * traversed. Registry packages and unrelated workspace descendants therefore\n * cannot change the root CLI mode, and ordinary projects never scan workspace\n * manifests or eagerly load the Vue parser and project-discovery graph.\n */\nexport function detectVueProject(cwd: string = process.cwd()): boolean {\n try {\n const projectRoot = normalizeDirectory(cwd);\n const rootManifest = readJavaScriptPackageManifest(\n path.join(projectRoot, 'package.json')\n );\n if (!rootManifest) return false;\n if (\n declaresAvailableJavaScriptDependency(\n rootManifest,\n GT_VUE_PACKAGE,\n projectRoot\n )\n ) {\n return true;\n }\n return localDependencyGraphDeclaresVue(\n rootManifest,\n projectRoot,\n createConsumerUsageCache()\n );\n } catch {\n return false;\n }\n}\n\n/** Checks only installed project-local dependency edges for a Vue wrapper. */\nexport function localDependencyGraphDeclaresVue(\n rootManifest: JavaScriptPackageManifest,\n projectRoot: string,\n consumerUsageCache: ConsumerUsageCache = createConsumerUsageCache()\n): boolean {\n for (const binding of readWorkspaceDependencyBindings(\n rootManifest,\n projectRoot\n )) {\n const installed = resolveInstalledJavaScriptPackage(\n projectRoot,\n binding.name\n );\n if (!installed) continue;\n const sourceDirectory = findLocalSourceDirectory(\n binding,\n projectRoot,\n installed.directory,\n projectRoot\n );\n if (!sourceDirectory) continue;\n const sourceManifest = readJavaScriptPackageManifest(\n path.join(sourceDirectory, 'package.json')\n );\n const packageName = readPackageName(sourceManifest);\n if (\n !sourceManifest ||\n !packageName ||\n !dependencyBindingAcceptsPackageVersion(\n binding,\n packageName,\n sourceManifest.version\n )\n ) {\n continue;\n }\n if (\n packageConsumesPublicGT(\n projectRoot,\n binding.name,\n sourceDirectory,\n sourceManifest,\n consumerUsageCache\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction findLocalSourceDirectory(\n binding: JavaScriptDependencyBinding,\n importerSourceDirectory: string,\n installedDirectory: string,\n projectRoot: string\n): string | undefined {\n const localPath = parseLocalDependencyPath(binding.specifier);\n if (localPath) {\n const sourceDirectory = normalizeDirectory(\n path.resolve(importerSourceDirectory, localPath)\n );\n if (isLocalSourceDirectory(projectRoot, sourceDirectory)) {\n return sourceDirectory;\n }\n }\n\n const normalizedInstalled = normalizeDirectory(installedDirectory);\n if (isLocalSourceDirectory(projectRoot, normalizedInstalled)) {\n return normalizedInstalled;\n }\n return undefined;\n}\n\nfunction isLocalSourceDirectory(\n projectRoot: string,\n candidate: string\n): boolean {\n const relative = path.relative(projectRoot, candidate);\n return (\n relative !== '' &&\n relative !== '..' &&\n !relative.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relative) &&\n !relative.split(path.sep).includes('node_modules') &&\n fs.existsSync(path.join(candidate, 'package.json'))\n );\n}\n\nfunction normalizeDirectory(directory: string): string {\n try {\n return fs.realpathSync(directory);\n } catch {\n return path.resolve(directory);\n }\n}\n\nfunction readPackageName(\n manifest: JavaScriptPackageManifest | undefined\n): string | undefined {\n return typeof manifest?.name === 'string' && manifest.name\n ? manifest.name\n : undefined;\n}\n"],"mappings":";;;;;;;;;;;;;AA2BA,SAAgB,iBAAiB,MAAc,QAAQ,KAAK,EAAW;AACrE,KAAI;EACF,MAAM,cAAc,mBAAmB,IAAI;EAC3C,MAAM,eAAe,8BACnB,KAAK,KAAK,aAAa,eAAe,CACvC;AACD,MAAI,CAAC,aAAc,QAAO;AAC1B,MACE,sCACE,cAAA,UAEA,YACD,CAED,QAAO;AAET,SAAO,gCACL,cACA,aACA,0BAA0B,CAC3B;SACK;AACN,SAAO;;;;AAKX,SAAgB,gCACd,cACA,aACA,qBAAyC,0BAA0B,EAC1D;AACT,MAAK,MAAM,WAAW,gCACpB,cACA,YACD,EAAE;EACD,MAAM,YAAY,kCAChB,aACA,QAAQ,KACT;AACD,MAAI,CAAC,UAAW;EAChB,MAAM,kBAAkB,yBACtB,SACA,aACA,UAAU,WACV,YACD;AACD,MAAI,CAAC,gBAAiB;EACtB,MAAM,iBAAiB,8BACrB,KAAK,KAAK,iBAAiB,eAAe,CAC3C;EACD,MAAM,cAAc,gBAAgB,eAAe;AACnD,MACE,CAAC,kBACD,CAAC,eACD,CAAC,uCACC,SACA,aACA,eAAe,QAChB,CAED;AAEF,MACE,wBACE,aACA,QAAQ,MACR,iBACA,gBACA,mBACD,CAED,QAAO;;AAGX,QAAO;;AAGT,SAAS,yBACP,SACA,yBACA,oBACA,aACoB;CACpB,MAAM,YAAY,yBAAyB,QAAQ,UAAU;AAC7D,KAAI,WAAW;EACb,MAAM,kBAAkB,mBACtB,KAAK,QAAQ,yBAAyB,UAAU,CACjD;AACD,MAAI,uBAAuB,aAAa,gBAAgB,CACtD,QAAO;;CAIX,MAAM,sBAAsB,mBAAmB,mBAAmB;AAClE,KAAI,uBAAuB,aAAa,oBAAoB,CAC1D,QAAO;;AAKX,SAAS,uBACP,aACA,WACS;CACT,MAAM,WAAW,KAAK,SAAS,aAAa,UAAU;AACtD,QACE,aAAa,MACb,aAAa,QACb,CAAC,SAAS,WAAW,KAAK,KAAK,MAAM,IACrC,CAAC,KAAK,WAAW,SAAS,IAC1B,CAAC,SAAS,MAAM,KAAK,IAAI,CAAC,SAAS,eAAe,IAClD,GAAG,WAAW,KAAK,KAAK,WAAW,eAAe,CAAC;;AAIvD,SAAS,mBAAmB,WAA2B;AACrD,KAAI;AACF,SAAO,GAAG,aAAa,UAAU;SAC3B;AACN,SAAO,KAAK,QAAQ,UAAU;;;AAIlC,SAAS,gBACP,UACoB;AACpB,QAAO,OAAO,UAAU,SAAS,YAAY,SAAS,OAClD,SAAS,OACT,KAAA"}
@@ -0,0 +1,10 @@
1
+ import type { VueProjectExtractionOptions, VueProjectExtractionOutput } from '../../types.js';
2
+ /**
3
+ * Extracts, hashes, and deduplicates every gt-vue message owned by a project.
4
+ *
5
+ * This is the package-level orchestration boundary used by host CLIs. It owns
6
+ * workspace discovery, source matching, compiler/config resolution, static
7
+ * module resolution, and catalog hashing so framework hosts do not need Vue
8
+ * implementation details. Configuration failures return no partial updates.
9
+ */
10
+ export declare function extractFromVueProject(options?: VueProjectExtractionOptions): Promise<VueProjectExtractionOutput>;