@generaltranslation/vue-extractor 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +105 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/internal/compilerAst.d.ts +43 -0
- package/dist/internal/compilerAst.js +77 -0
- package/dist/internal/compilerAst.js.map +1 -0
- package/dist/internal/config/resolveVueCompilerOptions.d.ts +23 -0
- package/dist/internal/config/resolveVueCompilerOptions.js +987 -0
- package/dist/internal/config/resolveVueCompilerOptions.js.map +1 -0
- package/dist/internal/extractFromVueSource.d.ts +9 -0
- package/dist/internal/extractFromVueSource.js +332 -0
- package/dist/internal/extractFromVueSource.js.map +1 -0
- package/dist/internal/script/analyze.d.ts +13 -0
- package/dist/internal/script/analyze.js +4761 -0
- package/dist/internal/script/analyze.js.map +1 -0
- package/dist/internal/script/jsx.d.ts +36 -0
- package/dist/internal/script/jsx.js +667 -0
- package/dist/internal/script/jsx.js.map +1 -0
- package/dist/internal/script/knownValues.d.ts +14 -0
- package/dist/internal/script/knownValues.js +148 -0
- package/dist/internal/script/knownValues.js.map +1 -0
- package/dist/internal/script/localModules.d.ts +80 -0
- package/dist/internal/script/localModules.js +364 -0
- package/dist/internal/script/localModules.js.map +1 -0
- package/dist/internal/script/model.d.ts +317 -0
- package/dist/internal/script/model.js +1 -0
- package/dist/internal/script/parser.d.ts +3 -0
- package/dist/internal/script/parser.js +21 -0
- package/dist/internal/script/parser.js.map +1 -0
- package/dist/internal/script/replay.d.ts +53 -0
- package/dist/internal/script/replay.js +1611 -0
- package/dist/internal/script/replay.js.map +1 -0
- package/dist/internal/script/snapshot.d.ts +25 -0
- package/dist/internal/script/snapshot.js +293 -0
- package/dist/internal/script/snapshot.js.map +1 -0
- package/dist/internal/script/syntax.d.ts +21 -0
- package/dist/internal/script/syntax.js +46 -0
- package/dist/internal/script/syntax.js.map +1 -0
- package/dist/internal/script.d.ts +2 -0
- package/dist/internal/script.js +2 -0
- package/dist/internal/stringCalls.d.ts +7 -0
- package/dist/internal/stringCalls.js +82 -0
- package/dist/internal/stringCalls.js.map +1 -0
- package/dist/internal/template.d.ts +4 -0
- package/dist/internal/template.js +2198 -0
- package/dist/internal/template.js.map +1 -0
- package/dist/internal/templatePath.d.ts +12 -0
- package/dist/internal/templatePath.js +23 -0
- package/dist/internal/templatePath.js.map +1 -0
- package/dist/internal/types.d.ts +69 -0
- package/dist/internal/types.js +1 -0
- package/dist/internal/utils.d.ts +19 -0
- package/dist/internal/utils.js +149 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/internal/vueCompiler.d.ts +35 -0
- package/dist/internal/vueCompiler.js +320 -0
- package/dist/internal/vueCompiler.js.map +1 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.js +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","names":[],"sources":["../../src/internal/template.ts"],"sourcesContent":["import { parseExpression, type ParserPlugin } from '@babel/parser';\nimport traverseModule, { type Scope } from '@babel/traverse';\nimport * as babel from '@babel/types';\nimport type {\n DirectiveNode,\n ElementNode,\n ExpressionNode,\n RootNode,\n SimpleExpressionNode,\n TemplateChildNode,\n} from '@vue/compiler-dom';\nimport {\n HTML_CONTENT_PROPS,\n type GTProp,\n type JsxChild,\n type JsxChildren,\n} from '@generaltranslation/format/types';\nimport { isAcceptedPluralForm } from 'generaltranslation/internal';\nimport { ElementTypes, NodeTypes } from './compilerAst.js';\nimport { processVueStringCall } from './stringCalls.js';\nimport {\n appendTemplatePath,\n recursiveTemplatePathSegment,\n unknownTemplatePathSegment,\n} from './templatePath.js';\nimport type {\n ExtractionLocation,\n GTComponentName,\n TemplateBindings,\n VueBuiltinName,\n VueExtractionContext,\n} from './types.js';\nimport {\n addVueError,\n createInlineMetadata,\n readStaticPrimitive,\n type StaticPrimitive,\n unwrapExpression,\n} from './utils.js';\n\nconst traverse = traverseModule.default || traverseModule;\n\ntype Counter = { value: number };\n\ntype SlotContent = {\n children: TemplateChildNode[];\n /** Number of VNode roots Vue produces before Suspense normalization. */\n rootCount: number;\n shadowed: Set<string>;\n};\n\ntype SlotLayout = {\n defaultSlot: SlotContent;\n namedSlots: Map<string, SlotContent>;\n};\n\ntype DynamicSelectorCandidate = {\n kind: 'expression' | 'string';\n name: string;\n};\n\ntype DynamicSelectorContainer =\n | {\n kind: 'literal';\n node: babel.ArrayExpression | babel.ObjectExpression;\n }\n | { kind: 'path'; path: string }\n | {\n /** A callback-created container whose children are abstract values. */\n kind: 'analysis';\n containerKind: 'array' | 'object';\n members?: Map<string, Omit<DynamicSelectorAnalysis, 'displayName'>>;\n values: Omit<DynamicSelectorAnalysis, 'displayName'>;\n };\n\ntype DynamicSelectorAnalysis = {\n candidates: DynamicSelectorCandidate[];\n componentFactories: Set<string>;\n containers: DynamicSelectorContainer[];\n displayName: string;\n gtComponentFactories: Set<string>;\n possibleGT: boolean;\n unknown: boolean;\n};\n\nconst COMPONENT_SELECTING_ARRAY_METHODS = new Set([\n 'at',\n 'find',\n 'findLast',\n 'pop',\n 'shift',\n]);\n\nconst COMPONENT_PRESERVING_ARRAY_METHODS = new Set([\n 'concat',\n 'filter',\n 'reverse',\n 'slice',\n 'sort',\n 'splice',\n 'toReversed',\n 'toSorted',\n 'toSpliced',\n]);\n\n// Vue 3.3 does not attach `forParseResult` to compiler-dom directive nodes.\n// These expressions match Vue's own stable v-for grammar and are used only as\n// a compatibility fallback when the consuming compiler omits that metadata.\nconst FOR_ALIAS_EXPRESSION = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\nconst FOR_ITERATOR_EXPRESSION = /,([^,}\\]]*)(?:,([^,}\\]]*))?$/;\nconst FOR_STRIP_PARENS = /^\\(|\\)$/g;\n\ntype ForParseResult = {\n index?: SimpleExpressionNode;\n key?: SimpleExpressionNode;\n source?: SimpleExpressionNode;\n value?: SimpleExpressionNode;\n};\n\ntype TemplateBindingPattern =\n | babel.ArrayPattern\n | babel.AssignmentPattern\n | babel.Identifier\n | babel.ObjectPattern\n | babel.RestElement;\n\nconst NON_BRANCH_ATTRIBUTE_NAMES = new Set([\n 'branch',\n 'class',\n 'n',\n 'locales',\n 'key',\n 'ref',\n 'ref_for',\n 'ref_key',\n 'ref-for',\n 'ref-key',\n 'style',\n]);\n\nconst RESERVED_T_PROPS = new Set([\n 'key',\n 'ref',\n 'ref_for',\n 'ref_key',\n 'ref-for',\n 'ref-key',\n]);\n\nconst SOURCE_SHAPING_DIRECTIVES = new Set([\n 'if',\n 'else',\n 'else-if',\n 'for',\n 'html',\n 'text',\n]);\n\nexport function parseVueTemplate(\n root: RootNode,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): void {\n visitTemplateChildren(\n root.children,\n new Set(),\n bindings,\n expressionPlugins,\n context,\n false\n );\n}\n\nfunction visitTemplateChildren(\n children: TemplateChildNode[],\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext,\n insideTranslation: boolean\n): void {\n for (const child of children) {\n if (child.type === NodeTypes.INTERPOLATION) {\n processTemplateExpression(\n child.content,\n shadowed,\n bindings,\n expressionPlugins,\n context\n );\n continue;\n }\n if (child.type !== NodeTypes.ELEMENT) continue;\n\n const localBindings = collectElementScopeBindings(child, expressionPlugins);\n const possibleScopedComponents = collectPossibleScopedComponentAliases(\n child,\n bindings,\n shadowed,\n expressionPlugins\n );\n const possibleScopedContainers = collectPossibleScopedContainerAliases(\n child,\n bindings,\n shadowed,\n expressionPlugins\n );\n const componentBindings =\n possibleScopedComponents.size > 0\n ? createScopedComponentBindings(bindings, possibleScopedComponents)\n : bindings;\n const childBindings =\n possibleScopedContainers.size > 0\n ? createScopedContainerBindings(\n componentBindings,\n possibleScopedContainers,\n shadowed\n )\n : componentBindings;\n const childShadowed = unionSets(shadowed, localBindings);\n for (const localName of [\n ...possibleScopedComponents,\n ...possibleScopedContainers.keys(),\n ]) {\n childShadowed.delete(localName);\n }\n\n for (const property of child.props) {\n if (property.type !== NodeTypes.DIRECTIVE) continue;\n if (property.name === 'for') {\n const parseResult = readForParseResult(property);\n for (const alias of [\n parseResult?.value,\n parseResult?.key,\n parseResult?.index,\n ]) {\n processBindingDefaults(\n alias,\n childShadowed,\n childBindings,\n expressionPlugins,\n context\n );\n }\n } else if (property.name === 'slot') {\n processBindingDefaults(\n property.exp,\n childShadowed,\n childBindings,\n expressionPlugins,\n context\n );\n }\n }\n\n for (const property of child.props) {\n if (property.type !== NodeTypes.DIRECTIVE) continue;\n if (\n property.arg?.type === NodeTypes.SIMPLE_EXPRESSION &&\n !property.arg.isStatic\n ) {\n processTemplateExpression(\n property.arg,\n childShadowed,\n childBindings,\n expressionPlugins,\n context\n );\n }\n if (property.name === 'slot' || !property.exp) continue;\n if (property.name === 'for') {\n const parseResult = readForParseResult(property);\n if (parseResult?.source) {\n processTemplateExpression(\n parseResult.source,\n shadowed,\n bindings,\n expressionPlugins,\n context\n );\n }\n continue;\n }\n processTemplateExpression(\n property.exp,\n property.name === 'if' || property.name === 'else-if'\n ? shadowed\n : childShadowed,\n property.name === 'if' || property.name === 'else-if'\n ? bindings\n : childBindings,\n expressionPlugins,\n context\n );\n }\n\n const component = resolveGTComponent(\n child,\n childBindings,\n expressionPlugins,\n childShadowed\n );\n const suspense = resolveSuspenseComponent(\n child,\n childBindings,\n expressionPlugins,\n childShadowed\n );\n const fragment = resolveFragmentComponent(\n child,\n childBindings,\n expressionPlugins,\n childShadowed\n );\n const uncertainGTComponent = resolveUncertainComponentBinding(\n child,\n childBindings,\n childBindings.uncertainGTComponents,\n childBindings.uncertainRegisteredGTComponents,\n childBindings.gtComponentFactories,\n expressionPlugins,\n childShadowed\n );\n const possibleDynamicT = component\n ? undefined\n : resolvePossibleDynamicT(\n child,\n childBindings,\n expressionPlugins,\n childShadowed\n );\n const unresolvedGTComponent = uncertainGTComponent ?? possibleDynamicT;\n if (!insideTranslation && !component && unresolvedGTComponent) {\n addVueError(\n context,\n child.loc,\n `Could not statically resolve possible gt-vue component alias \"${unresolvedGTComponent}\"`,\n 'Use a direct gt-vue import or an immutable alias that does not escape static analysis'\n );\n }\n if (\n component?.originalName === 'Var' ||\n component?.originalName === 'Num' ||\n component?.originalName === 'DateTime' ||\n component?.originalName === 'Currency'\n ) {\n validateVariableComponentShape(child, component.originalName, context);\n }\n if (component?.originalName === 'T' && !insideTranslation) {\n extractTranslationComponent(\n child,\n childShadowed,\n childBindings,\n expressionPlugins,\n context\n );\n }\n\n const childInsideTranslation =\n component?.originalName === 'Var' ||\n (insideTranslation &&\n isOpaqueComponent(child, component, suspense ?? fragment))\n ? false\n : insideTranslation || component?.originalName === 'T';\n if (childInsideTranslation && suspense) {\n const suspenseElementIsFallback = hasStaticSlotName(child, 'fallback');\n for (const suspenseChild of child.children) {\n visitTemplateChildren(\n [suspenseChild],\n childShadowed,\n childBindings,\n expressionPlugins,\n context,\n suspenseElementIsFallback\n ? false\n : !isSuspenseFallbackTemplate(suspenseChild)\n );\n }\n } else {\n visitTemplateChildren(\n child.children,\n childShadowed,\n childBindings,\n expressionPlugins,\n context,\n childInsideTranslation\n );\n }\n }\n}\n\n/** Finds local Vue aliases whose runtime value can be a GT component. */\nfunction collectPossibleScopedComponentAliases(\n element: ElementNode,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n expressionPlugins: ParserPlugin[]\n): Set<string> {\n const aliases = new Set<string>();\n for (const property of element.props) {\n if (property.type !== NodeTypes.DIRECTIVE) continue;\n if (property.name === 'for') {\n const parseResult = readForParseResult(property);\n const pattern = parseResult?.value\n ? parseTemplateBindingPattern(parseResult.value, expressionPlugins)\n : undefined;\n const source = parseResult?.source\n ? getExpressionNode(parseResult.source, expressionPlugins)\n : undefined;\n if (!pattern || !source) continue;\n const values = collectTemplateContainerCandidates(\n source,\n bindings,\n shadowed,\n new Set()\n );\n collectPossiblePatternComponents(\n pattern,\n values,\n bindings,\n shadowed,\n aliases\n );\n continue;\n }\n if (\n property.name !== 'slot' ||\n property.exp?.type !== NodeTypes.SIMPLE_EXPRESSION ||\n !property.exp.content\n ) {\n continue;\n }\n try {\n const arrow = parseExpression(`(${property.exp.content}) => 0`, {\n plugins: expressionPlugins,\n });\n if (arrow.type !== 'ArrowFunctionExpression') continue;\n for (const parameter of arrow.params) {\n collectPossibleComponentDefaults(\n parameter,\n bindings,\n shadowed,\n aliases\n );\n }\n } catch {\n // Vue's compiler reports malformed slot patterns separately.\n }\n }\n return aliases;\n}\n\n/** Collects v-for aliases whose runtime value can itself be a container. */\nfunction collectPossibleScopedContainerAliases(\n element: ElementNode,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n expressionPlugins: ParserPlugin[]\n): Map<string, Omit<DynamicSelectorAnalysis, 'displayName'>> {\n const aliases = new Map<\n string,\n Omit<DynamicSelectorAnalysis, 'displayName'>\n >();\n for (const property of element.props) {\n if (property.type !== NodeTypes.DIRECTIVE || property.name !== 'for') {\n continue;\n }\n const parseResult = readForParseResult(property);\n const pattern = parseResult?.value\n ? parseTemplateBindingPattern(parseResult.value, expressionPlugins)\n : undefined;\n const source = parseResult?.source\n ? getExpressionNode(parseResult.source, expressionPlugins)\n : undefined;\n if (!pattern || !source) continue;\n collectPossiblePatternContainers(\n pattern,\n collectTemplateContainerCandidates(source, bindings, shadowed, new Set()),\n bindings,\n shadowed,\n aliases\n );\n }\n return aliases;\n}\n\n/** Projects container alternatives through one v-for binding pattern. */\nfunction collectPossiblePatternContainers(\n pattern: TemplateBindingPattern,\n values: Omit<DynamicSelectorAnalysis, 'displayName'>,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n aliases: Map<string, Omit<DynamicSelectorAnalysis, 'displayName'>>\n): void {\n if (pattern.type === 'Identifier') {\n if (values.containers.length === 0) return;\n const existing = aliases.get(pattern.name);\n aliases.set(\n pattern.name,\n existing ? mergeDynamicSelectorAnalyses([existing, values]) : values\n );\n return;\n }\n if (pattern.type === 'AssignmentPattern') {\n if (!isTemplateBindingPattern(pattern.left)) return;\n collectPossiblePatternContainers(\n pattern.left,\n values,\n bindings,\n shadowed,\n aliases\n );\n collectPossiblePatternContainers(\n pattern.left,\n collectDynamicSelectorCandidates(\n pattern.right,\n bindings,\n shadowed,\n new Set()\n ),\n bindings,\n shadowed,\n aliases\n );\n return;\n }\n if (pattern.type === 'RestElement') {\n if (isTemplateBindingPattern(pattern.argument)) {\n collectPossiblePatternContainers(\n pattern.argument,\n values,\n bindings,\n shadowed,\n aliases\n );\n }\n return;\n }\n if (pattern.type === 'ObjectPattern') {\n for (const property of pattern.properties) {\n const target =\n property.type === 'RestElement' ? property.argument : property.value;\n if (!isTemplateBindingPattern(target)) continue;\n collectPossiblePatternContainers(\n target,\n property.type === 'RestElement'\n ? values\n : selectPossibleContainerChildren(\n values,\n readTemplateLiteralPropertyKey(property, bindings, shadowed),\n bindings,\n shadowed\n ),\n bindings,\n shadowed,\n aliases\n );\n }\n return;\n }\n pattern.elements.forEach((element, index) => {\n if (!element || !isTemplateBindingPattern(element)) return;\n collectPossiblePatternContainers(\n element,\n selectPossibleContainerChildren(\n values,\n element.type === 'RestElement' ? undefined : String(index),\n bindings,\n shadowed\n ),\n bindings,\n shadowed,\n aliases\n );\n });\n}\n\n/** Parses a Vue alias expression as one JavaScript binding pattern. */\nfunction parseTemplateBindingPattern(\n expression: SimpleExpressionNode,\n expressionPlugins: ParserPlugin[]\n): TemplateBindingPattern | undefined {\n try {\n const arrow = parseExpression(`(${expression.content}) => 0`, {\n plugins: expressionPlugins,\n });\n const parameter =\n arrow.type === 'ArrowFunctionExpression' && arrow.params.length === 1\n ? arrow.params[0]\n : undefined;\n return parameter && isTemplateBindingPattern(parameter)\n ? parameter\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Projects possible iterable values through a v-for destructuring pattern. */\nfunction collectPossiblePatternComponents(\n pattern: TemplateBindingPattern,\n values: Omit<DynamicSelectorAnalysis, 'displayName'>,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n aliases: Set<string>\n): void {\n if (pattern.type === 'Identifier') {\n if (selectorAnalysisMayContainGT(values, bindings)) {\n aliases.add(pattern.name);\n }\n return;\n }\n if (pattern.type === 'AssignmentPattern') {\n if (!isTemplateBindingPattern(pattern.left)) return;\n collectPossiblePatternComponents(\n pattern.left,\n values,\n bindings,\n shadowed,\n aliases\n );\n const fallback = collectDynamicSelectorCandidates(\n pattern.right,\n bindings,\n shadowed,\n new Set()\n );\n collectPossiblePatternComponents(\n pattern.left,\n fallback,\n bindings,\n shadowed,\n aliases\n );\n return;\n }\n if (pattern.type === 'RestElement') {\n if (!isTemplateBindingPattern(pattern.argument)) return;\n collectPossiblePatternComponents(\n pattern.argument,\n values,\n bindings,\n shadowed,\n aliases\n );\n return;\n }\n if (pattern.type === 'ObjectPattern') {\n for (const property of pattern.properties) {\n if (property.type === 'RestElement') {\n if (isTemplateBindingPattern(property.argument)) {\n collectPossiblePatternComponents(\n property.argument,\n values,\n bindings,\n shadowed,\n aliases\n );\n }\n continue;\n }\n const key = readTemplateLiteralPropertyKey(property, bindings, shadowed);\n const selected = selectPossibleContainerChildren(\n values,\n key,\n bindings,\n shadowed\n );\n if (isTemplateBindingPattern(property.value)) {\n collectPossiblePatternComponents(\n property.value,\n selected,\n bindings,\n shadowed,\n aliases\n );\n }\n }\n return;\n }\n if (pattern.type === 'ArrayPattern') {\n pattern.elements.forEach((element, index) => {\n if (!element) return;\n const selected = selectPossibleContainerChildren(\n values,\n element.type === 'RestElement' ? undefined : String(index),\n bindings,\n shadowed\n );\n if (isTemplateBindingPattern(element)) {\n collectPossiblePatternComponents(\n element,\n selected,\n bindings,\n shadowed,\n aliases\n );\n }\n });\n }\n}\n\nfunction isTemplateBindingPattern(\n node: babel.Node\n): node is TemplateBindingPattern {\n return (\n node.type === 'ArrayPattern' ||\n node.type === 'AssignmentPattern' ||\n node.type === 'Identifier' ||\n node.type === 'ObjectPattern' ||\n node.type === 'RestElement'\n );\n}\n\n/** Selects from every possible container carried by an abstract value. */\nfunction selectPossibleContainerChildren(\n values: Omit<DynamicSelectorAnalysis, 'displayName'>,\n key: string | undefined,\n bindings: TemplateBindings,\n shadowed: Set<string>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n const selected = values.containers.map((container) =>\n selectTemplateContainerReference(\n container,\n key,\n bindings,\n shadowed,\n new Set()\n )\n );\n return selected.length > 0\n ? mergeDynamicSelectorAnalyses(selected)\n : emptyDynamicSelectorAnalysis(true);\n}\n\n/** Walks one binding pattern and records GT-bearing default expressions. */\nfunction collectPossibleComponentDefaults(\n pattern: babel.Node,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n aliases: Set<string>\n): void {\n if (pattern.type === 'AssignmentPattern') {\n if (pattern.left.type === 'Identifier') {\n const analysis = collectDynamicSelectorCandidates(\n pattern.right,\n bindings,\n shadowed,\n new Set()\n );\n if (selectorAnalysisMayContainGT(analysis, bindings)) {\n aliases.add(pattern.left.name);\n }\n }\n collectPossibleComponentDefaults(pattern.left, bindings, shadowed, aliases);\n return;\n }\n if (pattern.type === 'ObjectPattern') {\n for (const property of pattern.properties) {\n collectPossibleComponentDefaults(\n property.type === 'RestElement' ? property.argument : property.value,\n bindings,\n shadowed,\n aliases\n );\n }\n return;\n }\n if (pattern.type === 'ArrayPattern') {\n for (const element of pattern.elements) {\n if (element) {\n collectPossibleComponentDefaults(element, bindings, shadowed, aliases);\n }\n }\n return;\n }\n if (pattern.type === 'RestElement') {\n collectPossibleComponentDefaults(\n pattern.argument,\n bindings,\n shadowed,\n aliases\n );\n }\n}\n\n/** Returns whether an abstract selector value can resolve to any GT component. */\nfunction selectorAnalysisMayContainGT(\n analysis: Omit<DynamicSelectorAnalysis, 'displayName'>,\n bindings: TemplateBindings\n): boolean {\n if (analysis.possibleGT || analysis.gtComponentFactories.size > 0) {\n return true;\n }\n return analysis.candidates.some((candidate) => {\n if (candidate.kind === 'expression') {\n return (\n bindings.components.get(candidate.name) === 'T' ||\n bindings.uncertainGTComponents.has(candidate.name)\n );\n }\n return [...normalizeTemplateBindingNames(candidate.name)].some(\n (name) => bindings.registeredComponents.get(name) === 'T'\n );\n });\n}\n\n/** Shadows program bindings with one local alias of uncertain GT identity. */\nfunction createScopedComponentBindings(\n bindings: TemplateBindings,\n aliases: Set<string>\n): TemplateBindings {\n const scoped: TemplateBindings = {\n ...bindings,\n arrayLengths: new Map(bindings.arrayLengths),\n componentFactories: new Set(bindings.componentFactories),\n components: new Map(bindings.components),\n containerKinds: new Map(bindings.containerKinds),\n possibleGTContainers: new Set(bindings.possibleGTContainers),\n gtContainerFactories: new Set(bindings.gtContainerFactories),\n directBindings: new Set(bindings.directBindings),\n gtComponentFactories: new Set(bindings.gtComponentFactories),\n identityFunctions: new Set(bindings.identityFunctions),\n possibleStaticStrings: new Map(\n [...bindings.possibleStaticStrings].map(([name, values]) => [\n name,\n new Set(values),\n ])\n ),\n staticValues: new Map(bindings.staticValues),\n stringFunctions: new Map(bindings.stringFunctions),\n uncertainComponents: new Set(bindings.uncertainComponents),\n uncertainGTComponents: new Set(bindings.uncertainGTComponents),\n uncertainStringFunctions: new Set(bindings.uncertainStringFunctions),\n vueBuiltins: new Map(bindings.vueBuiltins),\n };\n for (const alias of aliases) {\n clearScopedPath(scoped.arrayLengths, alias);\n clearScopedPath(scoped.componentFactories, alias);\n clearScopedPath(scoped.components, alias);\n clearScopedPath(scoped.containerKinds, alias);\n clearScopedPath(scoped.possibleGTContainers, alias);\n clearScopedPath(scoped.gtContainerFactories, alias);\n clearScopedPath(scoped.gtComponentFactories, alias);\n clearScopedPath(scoped.identityFunctions, alias);\n clearScopedPath(scoped.possibleStaticStrings, alias);\n clearScopedPath(scoped.staticValues, alias);\n clearScopedPath(scoped.stringFunctions, alias);\n clearScopedPath(scoped.uncertainComponents, alias);\n clearScopedPath(scoped.uncertainGTComponents, alias);\n clearScopedPath(scoped.uncertainStringFunctions, alias);\n clearScopedPath(scoped.vueBuiltins, alias);\n scoped.directBindings.add(alias);\n scoped.uncertainComponents.add(alias);\n scoped.uncertainGTComponents.add(alias);\n }\n return scoped;\n}\n\n/** Exposes container-valued v-for aliases to nested template scopes. */\nfunction createScopedContainerBindings(\n bindings: TemplateBindings,\n aliases: Map<string, Omit<DynamicSelectorAnalysis, 'displayName'>>,\n shadowed: Set<string>\n): TemplateBindings {\n const scoped = createScopedComponentBindings(bindings, new Set());\n for (const [alias, values] of aliases) {\n clearScopedPath(scoped.arrayLengths, alias);\n clearScopedPath(scoped.componentFactories, alias);\n clearScopedPath(scoped.components, alias);\n clearScopedPath(scoped.containerKinds, alias);\n clearScopedPath(scoped.possibleGTContainers, alias);\n clearScopedPath(scoped.gtContainerFactories, alias);\n clearScopedPath(scoped.gtComponentFactories, alias);\n clearScopedPath(scoped.identityFunctions, alias);\n clearScopedPath(scoped.possibleStaticStrings, alias);\n clearScopedPath(scoped.staticValues, alias);\n clearScopedPath(scoped.stringFunctions, alias);\n clearScopedPath(scoped.uncertainComponents, alias);\n clearScopedPath(scoped.uncertainGTComponents, alias);\n clearScopedPath(scoped.uncertainStringFunctions, alias);\n clearScopedPath(scoped.vueBuiltins, alias);\n scoped.directBindings.add(alias);\n\n const expose = (\n container: DynamicSelectorContainer,\n path: string,\n depth: number\n ): void => {\n if (depth > 32) return;\n const kind =\n container.kind === 'literal'\n ? container.node.type === 'ArrayExpression'\n ? 'array'\n : 'object'\n : container.kind === 'analysis'\n ? container.containerKind\n : scoped.containerKinds.get(container.path);\n if (kind) scoped.containerKinds.set(path, kind);\n const children = selectTemplateContainerReference(\n container,\n undefined,\n scoped,\n shadowed,\n new Set()\n );\n if (selectorAnalysisMayContainGT(children, scoped)) {\n scoped.possibleGTContainers.add(path);\n }\n const childPath = appendTemplatePath(path, unknownTemplatePathSegment);\n for (const child of children.containers) {\n expose(child, childPath, depth + 1);\n }\n };\n for (const container of values.containers) expose(container, alias, 0);\n }\n return scoped;\n}\n\nfunction clearScopedPath(\n collection: Map<string, unknown> | Set<string>,\n path: string\n): void {\n for (const key of collection.keys()) {\n if (key === path || key.startsWith(`${path}.`)) collection.delete(key);\n }\n}\n\nfunction processTemplateExpression(\n expression: ExpressionNode,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): void {\n const expressionNode = getExpressionNode(expression, expressionPlugins);\n if (!expressionNode) return;\n\n processTemplateExpressionNode(\n expressionNode,\n expression.loc,\n shadowed,\n bindings,\n context\n );\n}\n\nfunction processTemplateExpressionNode(\n expression: babel.Node,\n location: ExtractionLocation,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n context: VueExtractionContext\n): void {\n const file = wrapForTraversal(expression);\n if (!file) return;\n\n traverse(file, {\n CallExpression(path) {\n const kind = resolveTemplateStringFunction(\n path.node.callee,\n path.scope,\n shadowed,\n bindings\n );\n if (!kind) {\n reportPossibleTemplateStringFunction(\n path.node.callee,\n path.scope,\n location,\n shadowed,\n bindings,\n context\n );\n return;\n }\n processVueStringCall(path.node, kind, location, context, (node) =>\n readTemplatePrimitive(node, path.scope, shadowed, bindings)\n );\n },\n OptionalCallExpression(path) {\n const kind = resolveTemplateStringFunction(\n path.node.callee,\n path.scope,\n shadowed,\n bindings\n );\n if (!kind) {\n reportPossibleTemplateStringFunction(\n path.node.callee,\n path.scope,\n location,\n shadowed,\n bindings,\n context\n );\n return;\n }\n processVueStringCall(path.node, kind, location, context, (node) =>\n readTemplatePrimitive(node, path.scope, shadowed, bindings)\n );\n },\n TaggedTemplateExpression(path) {\n const kind = resolveTemplateStringFunction(\n path.node.tag,\n path.scope,\n shadowed,\n bindings\n );\n if (!kind) {\n reportPossibleTemplateStringFunction(\n path.node.tag,\n path.scope,\n location,\n shadowed,\n bindings,\n context\n );\n return;\n }\n addVueError(\n context,\n location,\n 'Found an unsupported tagged template translation in gt-vue',\n 'Call the translation function with a string literal instead'\n );\n },\n });\n}\n\n/** Reports a call whose binding may be a gt-vue string translator. */\nfunction reportPossibleTemplateStringFunction(\n input: babel.Node,\n scope: Scope,\n location: ExtractionLocation,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n context: VueExtractionContext\n): void {\n const displayName = resolvePossibleTemplateStringFunction(\n input,\n scope,\n shadowed,\n bindings\n );\n if (!displayName) return;\n addVueError(\n context,\n location,\n `Could not statically resolve possible gt-vue translation function alias \"${displayName}\"`,\n 'Use a direct gt-vue import or an immutable translator alias that does not escape static analysis'\n );\n}\n\n/** Resolves direct or dynamically selected uncertain translator paths. */\nfunction resolvePossibleTemplateStringFunction(\n input: babel.Node,\n scope: Scope,\n shadowed: Set<string>,\n bindings: TemplateBindings\n): string | undefined {\n const node = unwrapExpression(input);\n if (!node) return undefined;\n const path = readStaticTemplateMemberPath(node, bindings, shadowed);\n const root = path?.split('.', 1)[0];\n if (\n path &&\n root &&\n !scope.hasBinding(root) &&\n bindings.uncertainStringFunctions.has(path)\n ) {\n return path;\n }\n if (\n node.type !== 'MemberExpression' &&\n node.type !== 'OptionalMemberExpression'\n ) {\n return undefined;\n }\n const objectPath = readStaticTemplateMemberPath(\n node.object,\n bindings,\n shadowed\n );\n const objectRoot = objectPath?.split('.', 1)[0];\n if (!objectPath || !objectRoot || scope.hasBinding(objectRoot)) {\n return undefined;\n }\n const prefix = `${objectPath}.`;\n const hasPossibleChild = [\n ...bindings.stringFunctions.keys(),\n ...bindings.uncertainStringFunctions,\n ].some((name) => {\n if (!name.startsWith(prefix)) return false;\n const suffix = name.slice(prefix.length);\n return !suffix.includes('.');\n });\n return hasPossibleChild ? objectPath : undefined;\n}\n\n/** Reads a script-exposed primitive unless a Vue or expression scope masks it. */\nfunction readTemplatePrimitive(\n input: babel.Node | null | undefined,\n scope: Scope,\n shadowed: Set<string>,\n bindings: TemplateBindings\n) {\n return readStaticPrimitive(input, (identifier) => {\n if (shadowed.has(identifier.name) || scope.hasBinding(identifier.name)) {\n return { ok: false };\n }\n const value = bindings.staticValues.get(identifier.name);\n return bindings.staticValues.has(identifier.name)\n ? { ok: true, value: value! }\n : { ok: false };\n });\n}\n\n/** Resolves a template call back to a statically imported gt-vue function. */\nfunction resolveTemplateStringFunction(\n input: babel.Node,\n scope: Scope,\n shadowed: Set<string>,\n bindings: TemplateBindings\n) {\n const node = unwrapExpression(input);\n if (!node) return undefined;\n const path = readStaticTemplateMemberPath(node, bindings, shadowed);\n const root = path?.split('.', 1)[0];\n return root && !scope.hasBinding(root)\n ? bindings.stringFunctions.get(path)\n : undefined;\n}\n\n/** Visits expressions that execute while Vue initializes binding patterns. */\nfunction processBindingDefaults(\n expression: ExpressionNode | undefined,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): void {\n if (\n !expression ||\n expression.type !== NodeTypes.SIMPLE_EXPRESSION ||\n !expression.content\n ) {\n return;\n }\n try {\n const arrow = parseExpression(`(${expression.content}) => 0`, {\n plugins: expressionPlugins,\n });\n if (arrow.type !== 'ArrowFunctionExpression') return;\n for (const parameter of arrow.params) {\n visitBindingDefaultExpressions(parameter, (node) =>\n processTemplateExpressionNode(\n node,\n expression.loc,\n shadowed,\n bindings,\n context\n )\n );\n }\n } catch {\n // The Vue compiler reports malformed v-for/v-slot bindings separately.\n }\n}\n\n/** Recursively finds default and computed-key expressions in a binding. */\nfunction visitBindingDefaultExpressions(\n pattern: babel.Node | null,\n visit: (expression: babel.Expression) => void\n): void {\n if (!pattern) return;\n if (pattern.type === 'AssignmentPattern') {\n visit(pattern.right);\n visitBindingDefaultExpressions(pattern.left, visit);\n } else if (pattern.type === 'RestElement') {\n visitBindingDefaultExpressions(pattern.argument, visit);\n } else if (pattern.type === 'ArrayPattern') {\n for (const element of pattern.elements) {\n if (element) visitBindingDefaultExpressions(element, visit);\n }\n } else if (pattern.type === 'ObjectPattern') {\n for (const property of pattern.properties) {\n if (property.type === 'RestElement') {\n visitBindingDefaultExpressions(property.argument, visit);\n } else {\n if (property.computed && babel.isExpression(property.key)) {\n visit(property.key);\n }\n visitBindingDefaultExpressions(property.value, visit);\n }\n }\n } else if (pattern.type === 'TSParameterProperty') {\n visitBindingDefaultExpressions(pattern.parameter, visit);\n }\n}\n\nfunction extractTranslationComponent(\n element: ElementNode,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): void {\n const errorCount = context.errors.length;\n const translationContext = readTContext(\n element,\n shadowed,\n bindings,\n expressionPlugins,\n context\n );\n const slots = getSlotLayout(element, shadowed, expressionPlugins, context);\n if (slots.namedSlots.size > 0) {\n addVueError(\n context,\n element.loc,\n 'Found a named slot on a gt-vue <T> component',\n 'Place translatable content in the default slot'\n );\n }\n\n const counter = { value: 0 };\n const serialized = serializeChildren(\n slots.defaultSlot.children,\n counter,\n slots.defaultSlot.shadowed,\n bindings,\n expressionPlugins,\n context\n );\n if (context.errors.length !== errorCount) return;\n\n context.results.push({\n dataFormat: 'JSX',\n source: collapseChildren(serialized),\n metadata: createInlineMetadata(context, element.loc, translationContext),\n });\n}\n\nfunction readTContext(\n element: ElementNode,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): string | undefined {\n let translationContext: string | undefined;\n let hasContext = false;\n\n for (const property of element.props) {\n if (isDynamicComponentSelector(element, property)) continue;\n if (property.type === NodeTypes.ATTRIBUTE) {\n if (RESERVED_T_PROPS.has(property.name)) continue;\n if (property.name !== 'context' && property.name !== '$context') {\n addVueError(\n context,\n property.loc,\n `Found unsupported prop \"${property.name}\" on a gt-vue <T> component`,\n 'gt-vue <T> currently supports only context'\n );\n continue;\n }\n if (hasContext) {\n addDuplicateContextError(property.loc, context);\n continue;\n }\n hasContext = true;\n translationContext = property.value?.content ?? '';\n continue;\n }\n\n if (property.name !== 'bind') continue;\n if (property.modifiers.length > 0) {\n const directive = property.rawName ?? 'v-bind';\n addVueError(\n context,\n property.loc,\n `Found unsupported directive ${directive} on a gt-vue <T> component`,\n 'Pass context without a v-bind modifier'\n );\n continue;\n }\n const key = readDirectiveKey(property);\n if (key === undefined) {\n addVueError(\n context,\n property.loc,\n 'Found a dynamic or spread binding on a gt-vue <T> component',\n 'Pass context as a static context or $context prop'\n );\n continue;\n }\n if (RESERVED_T_PROPS.has(key)) continue;\n if (key !== 'context' && key !== '$context') {\n addVueError(\n context,\n property.loc,\n `Found unsupported prop \"${key}\" on a gt-vue <T> component`,\n 'gt-vue <T> currently supports only context'\n );\n continue;\n }\n if (hasContext) {\n addDuplicateContextError(property.loc, context);\n continue;\n }\n hasContext = true;\n const value = readExpressionPrimitive(\n property.exp,\n expressionPlugins,\n shadowed,\n bindings\n );\n if (!value.ok || typeof value.value !== 'string') {\n addVueError(\n context,\n property.loc,\n 'Found a dynamic context on a gt-vue <T> component',\n 'Use a string literal or a template literal without expressions'\n );\n continue;\n }\n translationContext = value.value;\n }\n return translationContext;\n}\n\nfunction addDuplicateContextError(\n location: ExtractionLocation,\n context: VueExtractionContext\n): void {\n addVueError(\n context,\n location,\n 'Found duplicate context props on a gt-vue <T> component',\n 'Pass only one context prop'\n );\n}\n\nfunction serializeChildren(\n children: TemplateChildNode[],\n counter: Counter,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): JsxChild[] {\n validateCommentWhitespaceParity(children, context);\n const result: JsxChild[] = [];\n for (const child of children) {\n const values = serializeChild(\n child,\n counter,\n shadowed,\n bindings,\n expressionPlugins,\n context\n );\n for (const value of values) appendSerializedChild(result, value);\n }\n return result;\n}\n\n/**\n * Rejects comments whose removal can change Vue's surrounding whitespace.\n *\n * Vue keeps template comments in development and strips them in production.\n * The compiler's whitespace transform can therefore produce different text\n * VNodes, and consequently different persisted translation hashes, across\n * Vue versions and build modes. Restrict this check to children that are\n * actually serialized so comments in opaque or unused slots remain opaque.\n */\nfunction validateCommentWhitespaceParity(\n children: TemplateChildNode[],\n context: VueExtractionContext\n): void {\n for (const child of children) {\n if (child.type !== NodeTypes.COMMENT) continue;\n const before = context.source[child.loc.start.offset - 1];\n const after = context.source[child.loc.end.offset];\n if (!isHtmlWhitespace(before) && !isHtmlWhitespace(after)) continue;\n addVueError(\n context,\n child.loc,\n 'Found a comment adjacent to translatable whitespace inside a gt-vue <T> component',\n 'Remove the adjacent whitespace or move the comment outside the translated content'\n );\n }\n}\n\n/** Matches the whitespace characters normalized by the Vue HTML compiler. */\nfunction isHtmlWhitespace(value: string | undefined): boolean {\n return value !== undefined && /[\\t\\n\\f\\r ]/.test(value);\n}\n\nfunction serializeChild(\n child: TemplateChildNode,\n counter: Counter,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): JsxChild[] {\n if (child.type === NodeTypes.COMMENT) return [];\n if (child.type === NodeTypes.TEXT) return [child.content];\n if (child.type === NodeTypes.INTERPOLATION) {\n const value = readExpressionPrimitive(\n child.content,\n expressionPlugins,\n shadowed,\n bindings\n );\n if (!value.ok) {\n addVueError(\n context,\n child.loc,\n 'Found dynamic template content inside a gt-vue <T> component',\n 'Wrap runtime values in <Var>, <Num>, <DateTime>, or <Currency>'\n );\n return [];\n }\n return [toDisplayString(value.value)];\n }\n if (child.type !== NodeTypes.ELEMENT) {\n addVueError(\n context,\n child.loc,\n 'Found unsupported template syntax inside a gt-vue <T> component',\n 'Use static template content and gt-vue rich translation components'\n );\n return [];\n }\n const fragment = resolveFragmentComponent(\n child,\n bindings,\n expressionPlugins,\n shadowed\n );\n if (fragment) {\n return serializeFragmentElement(\n child,\n counter,\n shadowed,\n bindings,\n expressionPlugins,\n context\n );\n }\n return [\n serializeElement(\n child,\n counter,\n shadowed,\n bindings,\n expressionPlugins,\n context\n ),\n ];\n}\n\n/** Flattens an exact Vue Fragment default slot without consuming an ID. */\nfunction serializeFragmentElement(\n element: ElementNode,\n counter: Counter,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): JsxChild[] {\n validateRichElement(element, context, true);\n const slots = getSlotLayout(element, shadowed, expressionPlugins, context);\n if (slots.namedSlots.size > 0) {\n addVueError(\n context,\n element.loc,\n 'Found a named slot on Vue Fragment inside a gt-vue <T> component',\n 'Keep Fragment content in its default slot'\n );\n }\n return serializeChildren(\n slots.defaultSlot.children,\n counter,\n slots.defaultSlot.shadowed,\n bindings,\n expressionPlugins,\n context\n );\n}\n\nfunction serializeElement(\n element: ElementNode,\n counter: Counter,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): JsxChild {\n counter.value += 1;\n const id = counter.value;\n const component = resolveGTComponent(\n element,\n bindings,\n expressionPlugins,\n shadowed\n );\n const suspense = resolveSuspenseComponent(\n element,\n bindings,\n expressionPlugins,\n shadowed\n );\n const uncertainComponent =\n !component && !suspense\n ? resolveUncertainComponent(\n element,\n bindings,\n expressionPlugins,\n shadowed\n )\n : undefined;\n if (uncertainComponent) {\n addVueError(\n context,\n element.loc,\n `Could not statically resolve component alias \"${uncertainComponent}\" inside a gt-vue <T> component`,\n 'Use a direct component import or an immutable alias that does not escape static analysis'\n );\n }\n validateRichElement(\n element,\n context,\n Boolean(component || suspense || uncertainComponent)\n );\n const originalName = component?.originalName;\n\n if (originalName === 'T') {\n addVueError(\n context,\n element.loc,\n 'Found a nested gt-vue <T> component inside another <T>',\n 'Split nested translations into sibling <T> components'\n );\n }\n\n if (\n originalName === 'Var' ||\n originalName === 'Num' ||\n originalName === 'DateTime' ||\n originalName === 'Currency'\n ) {\n validateVariableComponentShape(element, originalName, context);\n const variable =\n originalName === 'Num'\n ? { name: 'n', type: 'n' as const }\n : originalName === 'DateTime'\n ? { name: 'date', type: 'd' as const }\n : originalName === 'Currency'\n ? { name: 'cost', type: 'c' as const }\n : { name: 'value', type: 'v' as const };\n return {\n i: id,\n k: `_gt_${variable.name}_${id}`,\n v: variable.type,\n };\n }\n\n const data = readContentProps(\n element,\n shadowed,\n bindings,\n expressionPlugins,\n context\n );\n if (isOpaqueComponent(element, component, suspense)) {\n return {\n t: element.tag,\n i: id,\n ...(Object.keys(data).length > 0 && { d: data }),\n };\n }\n\n const slotLayout =\n element.tagType === ElementTypes.COMPONENT\n ? getSlotLayout(element, shadowed, expressionPlugins, context)\n : {\n defaultSlot: {\n children: element.children,\n rootCount: countVueSlotRoots(element.children),\n shadowed,\n },\n namedSlots: new Map<string, SlotContent>(),\n };\n\n const children = serializeChildren(\n slotLayout.defaultSlot.children,\n counter,\n slotLayout.defaultSlot.shadowed,\n bindings,\n expressionPlugins,\n context\n );\n if (suspense && slotLayout.defaultSlot.rootCount > 1) {\n addVueError(\n context,\n element.loc,\n 'Found more than one default root inside Vue <Suspense> within a gt-vue <T> component',\n 'Wrap the Suspense default content in a single element or move <T> inside <Suspense>'\n );\n }\n\n const unsupportedNamedSlots = [...slotLayout.namedSlots].filter(\n ([name]) => !suspense || name !== 'fallback'\n );\n if (\n unsupportedNamedSlots.length > 0 &&\n originalName !== 'Branch' &&\n originalName !== 'Plural'\n ) {\n addVueError(\n context,\n element.loc,\n `Found named slots on <${originalName ?? element.tag}> inside a gt-vue <T> component`,\n 'Move named-slot content outside <T> or use only the component default slot'\n );\n }\n\n if (originalName === 'Branch' || originalName === 'Plural') {\n const branches = readBranches(\n element,\n slotLayout,\n id,\n originalName,\n shadowed,\n bindings,\n expressionPlugins,\n context\n );\n if (Object.keys(branches).length > 0) {\n data.b = branches;\n data.t = originalName === 'Plural' ? 'p' : 'b';\n }\n }\n\n return {\n t: originalName ?? suspense?.originalName ?? element.tag,\n i: id,\n ...(Object.keys(data).length > 0 && { d: data }),\n ...(children.length > 0 && { c: collapseChildren(children) }),\n };\n}\n\n/** Returns true when the runtime preserves a component's slots as opaque. */\nfunction isOpaqueComponent(\n element: ElementNode,\n component?: { localName: string; originalName: GTComponentName },\n vueBuiltin?: { localName: string; originalName: VueBuiltinName }\n): boolean {\n return (\n element.tagType === ElementTypes.COMPONENT && !component && !vueBuiltin\n );\n}\n\n/** Resolves literal Suspense and statically proven aliases of Vue's builtin. */\nfunction resolveSuspenseComponent(\n element: ElementNode,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>\n): { localName: string; originalName: 'Suspense' } | undefined {\n if (\n element.tagType === ElementTypes.COMPONENT &&\n element.tag.toLowerCase() === 'suspense'\n ) {\n return { localName: element.tag, originalName: 'Suspense' };\n }\n const builtin = resolveVueBuiltinComponent(\n element,\n bindings,\n expressionPlugins,\n shadowed\n );\n return builtin?.originalName === 'Suspense'\n ? { localName: builtin.localName, originalName: 'Suspense' }\n : undefined;\n}\n\n/** Resolves an imported Vue Fragment alias without matching an ordinary tag. */\nfunction resolveFragmentComponent(\n element: ElementNode,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>\n): { localName: string; originalName: 'Fragment' } | undefined {\n const builtin = resolveVueBuiltinComponent(\n element,\n bindings,\n expressionPlugins,\n shadowed\n );\n return builtin?.originalName === 'Fragment'\n ? { localName: builtin.localName, originalName: 'Fragment' }\n : undefined;\n}\n\n/** Resolves a statically proven Vue builtin through direct or registered use. */\nfunction resolveVueBuiltinComponent(\n element: ElementNode,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>\n): { localName: string; originalName: VueBuiltinName } | undefined {\n return resolveComponentBinding(\n element,\n bindings,\n bindings.vueBuiltins,\n bindings.registeredVueBuiltins,\n bindings.directBindings,\n expressionPlugins,\n shadowed\n );\n}\n\n/** Resolves a component-shaped binding whose exact identity is uncertain. */\nfunction resolveUncertainComponent(\n element: ElementNode,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>\n): string | undefined {\n return resolveUncertainComponentBinding(\n element,\n bindings,\n bindings.uncertainComponents,\n bindings.uncertainRegisteredComponents,\n bindings.componentFactories,\n expressionPlugins,\n shadowed\n );\n}\n\n/** Resolves uncertainty while preserving direct versus registered precedence. */\nfunction resolveUncertainComponentBinding(\n element: ElementNode,\n bindings: TemplateBindings,\n uncertainDirectBindings: Set<string>,\n uncertainRegisteredBindings: Set<string>,\n uncertainFactories: Set<string>,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>\n): string | undefined {\n if (element.tagType !== ElementTypes.COMPONENT) return undefined;\n const selector = readDynamicComponentSelector(\n element,\n expressionPlugins,\n bindings,\n shadowed\n );\n if (selector) {\n if (\n [...selector.componentFactories].some((name) =>\n uncertainFactories.has(name)\n ) ||\n [...selector.gtComponentFactories].some((name) =>\n uncertainFactories.has(name)\n )\n ) {\n return selector.displayName;\n }\n for (const candidate of selector.candidates) {\n for (const localName of normalizeTemplateBindingNames(candidate.name)) {\n if (\n candidate.kind === 'string'\n ? uncertainRegisteredBindings.has(localName)\n : uncertainDirectBindings.has(localName)\n ) {\n return localName;\n }\n }\n }\n return undefined;\n }\n for (const localName of normalizeTemplateBindingNames(element.tag)) {\n const direct = uncertainDirectBindings.has(localName);\n const registered = uncertainRegisteredBindings.has(localName);\n if (isDirectTemplateBinding(localName, bindings.directBindings)) {\n if (direct) return localName;\n } else if (registered || direct) {\n return localName;\n }\n }\n return undefined;\n}\n\n/** Detects an unresolved dynamic selector whose possible result includes T. */\nfunction resolvePossibleDynamicT(\n element: ElementNode,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>\n): string | undefined {\n const selector = readDynamicComponentSelector(\n element,\n expressionPlugins,\n bindings,\n shadowed\n );\n if (!selector) return undefined;\n if (selector.possibleGT || selector.gtComponentFactories.size > 0) {\n return selector.displayName;\n }\n for (const candidate of selector.candidates) {\n for (const localName of normalizeTemplateBindingNames(candidate.name)) {\n const component =\n candidate.kind === 'string'\n ? bindings.registeredComponents.get(localName)\n : bindings.components.get(localName);\n if (component === 'T') return selector.displayName;\n }\n }\n return undefined;\n}\n\n/** Identifies a statically named Suspense fallback slot during tree walking. */\nfunction isSuspenseFallbackTemplate(child: TemplateChildNode): boolean {\n return (\n child.type === NodeTypes.ELEMENT &&\n child.tag === 'template' &&\n hasStaticSlotName(child, 'fallback')\n );\n}\n\n/** Matches one statically named slot directive without emitting diagnostics. */\nfunction hasStaticSlotName(element: ElementNode, name: string): boolean {\n const directive = element.props.find(\n (property): property is DirectiveNode =>\n property.type === NodeTypes.DIRECTIVE && property.name === 'slot'\n );\n return (\n directive?.arg?.type === NodeTypes.SIMPLE_EXPRESSION &&\n directive.arg.isStatic &&\n directive.arg.content === name\n );\n}\n\nfunction validateRichElement(\n element: ElementNode,\n context: VueExtractionContext,\n resolvedDynamicComponent: boolean\n): void {\n if (element.tagType === ElementTypes.SLOT || element.tag === 'slot') {\n addVueError(\n context,\n element.loc,\n 'Found a <slot> inside a gt-vue <T> component',\n 'Move runtime slot content outside <T> or wrap a stable value in <Var>'\n );\n }\n if (\n element.tag === 'template' &&\n !element.props.some(\n (property) =>\n property.type === NodeTypes.DIRECTIVE && property.name === 'slot'\n )\n ) {\n addVueError(\n context,\n element.loc,\n 'Found a bare <template> inside a gt-vue <T> component',\n 'Use an ordinary element or a statically named slot template'\n );\n }\n if (element.tag.toLowerCase() === 'component' && !resolvedDynamicComponent) {\n addVueError(\n context,\n element.loc,\n 'Found a dynamic <component> inside a gt-vue <T> component',\n 'Use a statically named element or component'\n );\n }\n\n for (const property of element.props) {\n if (property.type !== NodeTypes.DIRECTIVE) continue;\n if (SOURCE_SHAPING_DIRECTIVES.has(property.name)) {\n addVueError(\n context,\n property.loc,\n `Found source-shaping directive ${property.rawName ?? `v-${property.name}`} inside a gt-vue <T> component`,\n 'Move conditional or repeated content outside <T>, or use Branch/Plural'\n );\n } else if (property.name === 'bind' && !readDirectiveKey(property)) {\n addVueError(\n context,\n property.loc,\n 'Found a dynamic or spread v-bind inside a gt-vue <T> component',\n 'Bind props by a static name so their effect on the translation source is known'\n );\n }\n }\n}\n\n/** Enforces the one supported public shape for every variable component. */\nfunction validateVariableComponentShape(\n element: ElementNode,\n component: 'Currency' | 'DateTime' | 'Num' | 'Var',\n context: VueExtractionContext\n): void {\n if (context.validatedVariableComponents.has(element)) return;\n context.validatedVariableComponents.add(element);\n\n if (component !== 'Var') {\n if (!hasTemplateProp(element, 'value')) {\n addVueError(\n context,\n element.loc,\n `Found a gt-vue <${component}> component without a value prop`,\n `Pass the runtime value through <${component} :value=\"value\" />`\n );\n }\n if (hasMeaningfulSlotContent(element.children, context)) {\n addVueError(\n context,\n element.loc,\n `Found children on a gt-vue <${component}> component`,\n `Use only the required value prop: <${component} :value=\"value\" />`\n );\n }\n return;\n }\n\n for (const property of element.props) {\n const key =\n property.type === NodeTypes.ATTRIBUTE\n ? property.name\n : property.name === 'bind'\n ? readDirectiveKey(property)\n : undefined;\n if (key === 'name' || key === 'value') {\n addVueError(\n context,\n property.loc,\n `Found unsupported ${key} prop on a gt-vue <Var> component`,\n 'Pass the variable as the default child of <Var>'\n );\n } else if (\n property.type === NodeTypes.DIRECTIVE &&\n property.name === 'bind' &&\n !property.arg\n ) {\n addVueError(\n context,\n property.loc,\n 'Found a spread v-bind on a gt-vue <Var> component',\n 'Pass the variable only as the default child of <Var>'\n );\n }\n }\n}\n\n/** Returns whether a statically named template prop is explicitly present. */\nfunction hasTemplateProp(element: ElementNode, expected: string): boolean {\n return element.props.some((property) => {\n if (property.type === NodeTypes.ATTRIBUTE) {\n return property.name === expected;\n }\n return property.name === 'bind' && readDirectiveKey(property) === expected;\n });\n}\n\nfunction readContentProps(\n element: ElementNode,\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): GTProp {\n const data: GTProp = {};\n for (const [shortName, propName] of Object.entries(HTML_CONTENT_PROPS)) {\n const property = findElementProperty(\n element,\n propName,\n expressionPlugins,\n shadowed,\n bindings\n );\n if (!property.present) continue;\n if (!property.static) {\n addVueError(\n context,\n property.location,\n `Found dynamic translatable prop \"${propName}\" inside a gt-vue <T> component`,\n 'Use a string literal for translatable HTML props'\n );\n continue;\n }\n if (typeof property.value === 'string') {\n (data as Record<string, unknown>)[shortName] = property.value;\n }\n }\n return data;\n}\n\nfunction readBranches(\n element: ElementNode,\n slots: SlotLayout,\n branchElementId: number,\n component: 'Branch' | 'Plural',\n shadowed: Set<string>,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): Record<string, JsxChildren> {\n const branches: Record<string, JsxChildren> = {};\n\n for (const [name, slot] of slots.namedSlots) {\n if (name.startsWith('_')) continue;\n if (component === 'Plural' && !isAcceptedPluralForm(name)) continue;\n branches[name] = collapseChildren(\n serializeChildren(\n slot.children,\n { value: branchElementId },\n slot.shadowed,\n bindings,\n expressionPlugins,\n context\n )\n );\n }\n\n for (const property of element.props) {\n if (isDynamicComponentSelector(element, property)) continue;\n if (property.type === NodeTypes.DIRECTIVE && property.name === 'slot') {\n continue;\n }\n const key =\n property.type === NodeTypes.ATTRIBUTE\n ? property.name\n : readDirectiveKey(property);\n\n // Vue compiles v-on directives to listener props, which gt-vue always\n // excludes from branch content regardless of the handler expression.\n if (property.type === NodeTypes.DIRECTIVE && property.name === 'on') {\n continue;\n }\n if (\n key &&\n (!isBranchAttributeName(key) ||\n Object.prototype.hasOwnProperty.call(branches, key) ||\n (component === 'Plural' && !isAcceptedPluralForm(key)))\n ) {\n continue;\n }\n if (\n property.type === NodeTypes.DIRECTIVE &&\n (property.name !== 'bind' || property.modifiers.length > 0)\n ) {\n const directive = property.rawName ?? `v-${property.name}`;\n addVueError(\n context,\n property.loc,\n `Found unsupported directive ${directive} on a gt-vue <${component}> component`,\n `Move ${directive} to an element outside <${component}>`\n );\n continue;\n }\n if (key === undefined) continue;\n const value = readPropertyValue(\n property,\n expressionPlugins,\n shadowed,\n bindings\n );\n if (!value.ok) {\n if (\n isStaticallyNonBranchValue(\n property,\n expressionPlugins,\n shadowed,\n bindings\n )\n ) {\n continue;\n }\n addVueError(\n context,\n property.loc,\n `Found dynamic branch prop \"${key}\" on a gt-vue <${component}> component`,\n 'Use a static branch prop or a named slot'\n );\n continue;\n }\n branches[key] = branchPropToChildren(value.value);\n }\n return branches;\n}\n\nfunction branchPropToChildren(value: StaticPrimitive): JsxChildren {\n if (value == null || typeof value === 'boolean') return [];\n return String(value);\n}\n\n/**\n * Mirrors the attribute-name half of gt-vue's runtime branch predicate.\n *\n * Vue combines explicit component props, presentation attributes, and\n * normalized listeners in one VNode prop record. The extractor must discard\n * the same names before evaluating values so dynamic class/style/listener\n * expressions cannot change a published translation hash.\n */\nfunction isBranchAttributeName(name: string): boolean {\n return !(\n NON_BRANCH_ATTRIBUTE_NAMES.has(name) ||\n name.startsWith('aria-') ||\n name.startsWith('data-') ||\n /^on[^a-z]/.test(name)\n );\n}\n\n/**\n * Identifies expressions whose top-level runtime type can never be branch\n * content. Unknown identifiers and calls deliberately return false so an\n * arbitrary prop whose runtime type may be primitive still fails closed.\n */\nfunction isStaticallyNonBranchValue(\n property: ElementNode['props'][number],\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>,\n bindings: TemplateBindings\n): boolean {\n if (property.type !== NodeTypes.DIRECTIVE || property.name !== 'bind') {\n return false;\n }\n const expression = property.exp\n ? getExpressionNode(property.exp, expressionPlugins)\n : undefined;\n const node = unwrapExpression(expression);\n if (!node) return false;\n\n if (babel.isIdentifier(node, { name: 'undefined' })) {\n return !shadowed.has(node.name) && !bindings.staticValues.has(node.name);\n }\n return (\n babel.isArrayExpression(node) ||\n babel.isArrowFunctionExpression(node) ||\n babel.isClassExpression(node) ||\n babel.isFunctionExpression(node) ||\n babel.isNewExpression(node) ||\n babel.isObjectExpression(node) ||\n babel.isRegExpLiteral(node) ||\n (babel.isUnaryExpression(node) && node.operator === 'void')\n );\n}\n\nfunction getSlotLayout(\n element: ElementNode,\n shadowed: Set<string>,\n expressionPlugins: ParserPlugin[],\n context: VueExtractionContext\n): SlotLayout {\n const namedSlots = new Map<string, SlotContent>();\n let defaultSlot: SlotContent = { children: [], rootCount: 0, shadowed };\n let hasTemplateSlots = false;\n let hasExplicitDefaultSlot = false;\n let reportedDefaultConflict = false;\n const componentSlot = element.props.find(\n (property): property is DirectiveNode =>\n property.type === NodeTypes.DIRECTIVE && property.name === 'slot'\n );\n\n if (componentSlot) {\n if (componentSlot.exp) addScopedSlotError(componentSlot.loc, context);\n const slotName = readSlotName(componentSlot, context);\n const slotShadowed = unionSets(\n shadowed,\n collectExpressionBindings(componentSlot.exp, expressionPlugins)\n );\n if (slotName === 'default') {\n defaultSlot = {\n children: element.children,\n rootCount: countVueSlotRoots(element.children),\n shadowed: slotShadowed,\n };\n } else if (slotName) {\n namedSlots.set(slotName, {\n children: element.children,\n rootCount: countVueSlotRoots(element.children),\n shadowed: slotShadowed,\n });\n }\n return { defaultSlot, namedSlots };\n }\n\n const defaultChildren: TemplateChildNode[] = [];\n for (const child of element.children) {\n const slotDirective =\n child.type === NodeTypes.ELEMENT && child.tag === 'template'\n ? child.props.find(\n (property): property is DirectiveNode =>\n property.type === NodeTypes.DIRECTIVE && property.name === 'slot'\n )\n : undefined;\n if (!slotDirective || child.type !== NodeTypes.ELEMENT) {\n defaultChildren.push(child);\n continue;\n }\n hasTemplateSlots = true;\n\n for (const property of child.props) {\n if (property.type === NodeTypes.DIRECTIVE && property.name !== 'slot') {\n addVueError(\n context,\n property.loc,\n 'Found a conditional or dynamic named slot inside a gt-vue <T> component',\n 'Use an unconditional, statically named slot'\n );\n }\n }\n\n const slotName = readSlotName(slotDirective, context);\n if (slotDirective.exp) addScopedSlotError(slotDirective.loc, context);\n const slotShadowed = unionSets(\n shadowed,\n collectExpressionBindings(slotDirective.exp, expressionPlugins)\n );\n if (slotName === 'default') {\n if (\n hasMeaningfulSlotContent(defaultChildren, context) ||\n hasExplicitDefaultSlot\n ) {\n addVueError(\n context,\n child.loc,\n 'Found more than one default slot definition inside a gt-vue translation',\n 'Use a single default slot'\n );\n reportedDefaultConflict = true;\n }\n hasExplicitDefaultSlot = true;\n defaultSlot = {\n children: child.children,\n rootCount: countVueSlotRoots(child.children),\n shadowed: slotShadowed,\n };\n } else if (slotName) {\n if (namedSlots.has(slotName)) {\n addVueError(\n context,\n child.loc,\n `Found duplicate named slot \"${slotName}\" inside a gt-vue translation`,\n 'Define each named slot once'\n );\n }\n namedSlots.set(slotName, {\n children: child.children,\n rootCount: countVueSlotRoots(child.children),\n shadowed: slotShadowed,\n });\n }\n }\n\n const hasMeaningfulDefault = hasMeaningfulSlotContent(\n defaultChildren,\n context\n );\n if (\n hasExplicitDefaultSlot &&\n hasMeaningfulDefault &&\n !reportedDefaultConflict\n ) {\n addVueError(\n context,\n defaultChildren[0].loc,\n 'Found more than one default slot definition inside a gt-vue translation',\n 'Use a single default slot'\n );\n } else if (\n !hasExplicitDefaultSlot &&\n defaultChildren.length > 0 &&\n (!hasTemplateSlots || hasMeaningfulDefault)\n ) {\n defaultSlot = {\n children: defaultChildren,\n rootCount: countImplicitSlotRoots(element.children),\n shadowed,\n };\n }\n return { defaultSlot, namedSlots };\n}\n\n/** Matches Vue's test for an implicit slot containing more than separators. */\nfunction hasMeaningfulSlotContent(\n children: TemplateChildNode[],\n context: VueExtractionContext\n): boolean {\n return children.some(\n (child) =>\n child.type !== NodeTypes.COMMENT &&\n (child.type !== NodeTypes.TEXT ||\n !isImplicitSlotWhitespace(\n child.content,\n context.implicitSlotWhitespace\n ))\n );\n}\n\n/** Mirrors the exact whitespace predicate detected from consumer compiler. */\nfunction isImplicitSlotWhitespace(\n value: string,\n semantics: VueExtractionContext['implicitSlotWhitespace']\n): boolean {\n return semantics === 'ecmascript'\n ? value.trim().length === 0\n : /^[\\t\\n\\f\\r ]*$/.test(value);\n}\n\n/** Counts roots in a complete Vue slot before Suspense normalizes the array. */\nfunction countVueSlotRoots(children: TemplateChildNode[]): number {\n return countSlotRoots(children, () => false);\n}\n\n/**\n * Counts roots in an implicit slot while treating named-slot templates as\n * barriers. Vue removes those templates from the default slot only after its\n * text transform has run, so text on opposite sides remains separate VNodes.\n */\nfunction countImplicitSlotRoots(children: TemplateChildNode[]): number {\n return countSlotRoots(children, (child) => {\n if (child.type !== NodeTypes.ELEMENT || child.tag !== 'template') {\n return false;\n }\n return child.props.some(\n (property) =>\n property.type === NodeTypes.DIRECTIVE && property.name === 'slot'\n );\n });\n}\n\nfunction countSlotRoots(\n children: TemplateChildNode[],\n isExcluded: (child: TemplateChildNode) => boolean\n): number {\n let roots = 0;\n let previousWasText = false;\n for (const child of children) {\n if (child.type === NodeTypes.COMMENT || isExcluded(child)) {\n previousWasText = false;\n continue;\n }\n const isText =\n child.type === NodeTypes.TEXT || child.type === NodeTypes.INTERPOLATION;\n if (!isText || !previousWasText) roots += 1;\n previousWasText = isText;\n }\n return roots;\n}\n\nfunction addScopedSlotError(\n location: ExtractionLocation,\n context: VueExtractionContext\n): void {\n addVueError(\n context,\n location,\n 'Found a scoped slot inside a gt-vue <T> component',\n 'Use a slot without runtime slot props so the translation source is static'\n );\n}\n\nfunction readSlotName(\n directive: DirectiveNode,\n context: VueExtractionContext\n): string | undefined {\n if (!directive.arg) return 'default';\n if (\n directive.arg.type !== NodeTypes.SIMPLE_EXPRESSION ||\n !directive.arg.isStatic\n ) {\n addVueError(\n context,\n directive.loc,\n 'Found a dynamic slot name inside a gt-vue translation',\n 'Use a static slot name'\n );\n return undefined;\n }\n return directive.arg.content;\n}\n\nfunction findElementProperty(\n element: ElementNode,\n name: string,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>,\n bindings: TemplateBindings\n):\n | { present: false }\n | {\n location: ExtractionLocation;\n present: true;\n static: boolean;\n value?: StaticPrimitive;\n } {\n for (const property of element.props) {\n const key =\n property.type === NodeTypes.ATTRIBUTE\n ? property.name\n : property.name === 'bind'\n ? readDirectiveKey(property)\n : undefined;\n if (key !== name) continue;\n const value = readPropertyValue(\n property,\n expressionPlugins,\n shadowed,\n bindings\n );\n return {\n location: property.loc,\n present: true,\n static: value.ok,\n ...(value.ok && { value: value.value }),\n };\n }\n return { present: false };\n}\n\nfunction readPropertyValue(\n property: ElementNode['props'][number],\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>,\n bindings: TemplateBindings\n): { ok: true; value: StaticPrimitive } | { ok: false } {\n if (property.type === NodeTypes.ATTRIBUTE) {\n return { ok: true, value: property.value?.content ?? '' };\n }\n if (property.name !== 'bind') return { ok: false };\n return readExpressionPrimitive(\n property.exp,\n expressionPlugins,\n shadowed,\n bindings\n );\n}\n\nfunction readExpressionPrimitive(\n expression: ExpressionNode | undefined,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>,\n bindings: TemplateBindings\n): { ok: true; value: StaticPrimitive } | { ok: false } {\n const node = expression\n ? getExpressionNode(expression, expressionPlugins)\n : undefined;\n return readStaticPrimitive(node, (identifier) => {\n if (shadowed.has(identifier.name)) return { ok: false };\n const value = bindings.staticValues.get(identifier.name);\n return bindings.staticValues.has(identifier.name)\n ? { ok: true, value: value! }\n : { ok: false };\n });\n}\n\nfunction getExpressionNode(\n expression: ExpressionNode,\n expressionPlugins: ParserPlugin[]\n): babel.Node | undefined {\n if (expression.type !== NodeTypes.SIMPLE_EXPRESSION) return undefined;\n if (expression.ast && typeof expression.ast === 'object') {\n return expression.ast as babel.Node;\n }\n try {\n return parseExpression(expression.content, {\n plugins: expressionPlugins,\n });\n } catch {\n return undefined;\n }\n}\n\nfunction wrapForTraversal(node: babel.Node): babel.File | undefined {\n if (node.type === 'File') return node;\n if (node.type === 'Program') return babel.file(node);\n if (babel.isExpression(node)) {\n return babel.file(\n babel.program([babel.expressionStatement(node as babel.Expression)])\n );\n }\n if (babel.isStatement(node)) {\n return babel.file(babel.program([node]));\n }\n return undefined;\n}\n\nfunction collectElementScopeBindings(\n element: ElementNode,\n expressionPlugins: ParserPlugin[]\n): Set<string> {\n const result = new Set<string>();\n for (const property of element.props) {\n if (property.type !== NodeTypes.DIRECTIVE) continue;\n if (property.name === 'for') {\n const parseResult = readForParseResult(property);\n for (const alias of [\n parseResult?.value,\n parseResult?.key,\n parseResult?.index,\n ]) {\n for (const name of collectExpressionBindings(\n alias,\n expressionPlugins\n )) {\n result.add(name);\n }\n }\n } else if (property.name === 'slot') {\n for (const name of collectExpressionBindings(\n property.exp,\n expressionPlugins\n )) {\n result.add(name);\n }\n }\n }\n return result;\n}\n\n/**\n * Reads Vue's normalized v-for fields across every supported Vue 3 release.\n *\n * Vue 3.4+ supplies `forParseResult`; Vue 3.3 exposes only the original\n * directive expression. The fallback deliberately mirrors Vue's own alias,\n * iterator, and parenthesis expressions so scope tracking sees the same value,\n * key, index, and source fields without depending on a second compiler copy.\n */\nfunction readForParseResult(\n property: DirectiveNode\n): ForParseResult | undefined {\n const compilerResult = (\n property as DirectiveNode & { forParseResult?: ForParseResult }\n ).forParseResult;\n if (compilerResult) return compilerResult;\n if (\n property.exp?.type !== NodeTypes.SIMPLE_EXPRESSION ||\n !property.exp.content\n ) {\n return undefined;\n }\n\n const match = property.exp.content.match(FOR_ALIAS_EXPRESSION);\n if (!match) return undefined;\n const source = match[2]?.trim();\n const aliases = match[1]?.trim().replace(FOR_STRIP_PARENS, '').trim();\n if (!source || !aliases) return undefined;\n\n const iteratorMatch = aliases.match(FOR_ITERATOR_EXPRESSION);\n const value = iteratorMatch\n ? aliases.replace(FOR_ITERATOR_EXPRESSION, '').trim()\n : aliases;\n if (!value) return undefined;\n\n return {\n source: cloneForExpression(property.exp, source),\n value: cloneForExpression(property.exp, value),\n ...(iteratorMatch?.[1]?.trim() && {\n key: cloneForExpression(property.exp, iteratorMatch[1].trim()),\n }),\n ...(iteratorMatch?.[2]?.trim() && {\n index: cloneForExpression(property.exp, iteratorMatch[2].trim()),\n }),\n };\n}\n\n/** Creates one parser-neutral v-for field from Vue's original expression. */\nfunction cloneForExpression(\n expression: SimpleExpressionNode,\n content: string\n): SimpleExpressionNode {\n return {\n ...expression,\n ast: undefined,\n content,\n loc: { ...expression.loc, source: content },\n };\n}\n\nfunction collectExpressionBindings(\n expression: ExpressionNode | undefined,\n expressionPlugins: ParserPlugin[]\n): Set<string> {\n const result = new Set<string>();\n if (\n !expression ||\n expression.type !== NodeTypes.SIMPLE_EXPRESSION ||\n !expression.content\n ) {\n return result;\n }\n try {\n const arrow = parseExpression(`(${expression.content}) => 0`, {\n plugins: expressionPlugins,\n });\n if (arrow.type === 'ArrowFunctionExpression') {\n for (const parameter of arrow.params)\n collectPatternNames(parameter, result);\n }\n } catch {\n // The Vue compiler reports malformed v-for/v-slot bindings separately.\n }\n return result;\n}\n\nfunction collectPatternNames(\n pattern: babel.Node | null,\n result: Set<string>\n): void {\n if (!pattern) return;\n if (pattern.type === 'Identifier') {\n result.add(pattern.name);\n } else if (pattern.type === 'RestElement') {\n collectPatternNames(pattern.argument, result);\n } else if (pattern.type === 'AssignmentPattern') {\n collectPatternNames(pattern.left, result);\n } else if (pattern.type === 'ArrayPattern') {\n for (const element of pattern.elements) {\n if (element) collectPatternNames(element, result);\n }\n } else if (pattern.type === 'ObjectPattern') {\n for (const property of pattern.properties) {\n if (property.type === 'RestElement') {\n collectPatternNames(property.argument, result);\n } else {\n collectPatternNames(property.value, result);\n }\n }\n } else if (pattern.type === 'TSParameterProperty') {\n collectPatternNames(pattern.parameter, result);\n }\n}\n\nfunction resolveGTComponent(\n element: ElementNode,\n bindings: TemplateBindings,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>\n): { localName: string; originalName: GTComponentName } | undefined {\n return resolveComponentBinding(\n element,\n bindings,\n bindings.components,\n bindings.registeredComponents,\n bindings.directBindings,\n expressionPlugins,\n shadowed\n );\n}\n\n/** Resolves a template tag or static dynamic selector through known bindings. */\nfunction resolveComponentBinding<Name extends string>(\n element: ElementNode,\n bindings: TemplateBindings,\n directBindings: Map<string, Name>,\n registeredBindings: Map<string, Name>,\n directTemplateBindings: Set<string>,\n expressionPlugins: ParserPlugin[],\n shadowed: Set<string>\n): { localName: string; originalName: Name } | undefined {\n if (element.tagType !== ElementTypes.COMPONENT) return undefined;\n const selector = readDynamicComponentSelector(\n element,\n expressionPlugins,\n bindings,\n shadowed\n );\n if (selector) {\n if (\n selector.unknown ||\n selector.possibleGT ||\n selector.componentFactories.size > 0 ||\n selector.gtComponentFactories.size > 0 ||\n selector.candidates.length === 0\n ) {\n return undefined;\n }\n const resolved = selector.candidates.map((candidate) => {\n for (const localName of normalizeTemplateBindingNames(candidate.name)) {\n const originalName =\n candidate.kind === 'string'\n ? registeredBindings.get(localName)\n : directBindings.get(localName);\n if (originalName) return { localName, originalName };\n }\n return undefined;\n });\n const first = resolved[0];\n return first &&\n resolved.every(\n (candidate) => candidate?.originalName === first.originalName\n )\n ? first\n : undefined;\n }\n for (const localName of normalizeTemplateBindingNames(element.tag)) {\n const originalName = isDirectTemplateBinding(\n localName,\n directTemplateBindings\n )\n ? directBindings.get(localName)\n : registeredBindings.get(localName);\n if (originalName) return { localName, originalName };\n }\n return undefined;\n}\n\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\n/** Returns whether a program binding shadows an Options API registration. */\nfunction isDirectTemplateBinding(\n localName: string,\n directBindings: Set<string>\n): boolean {\n return (\n directBindings.has(localName) ||\n directBindings.has(localName.split('.', 1)[0] ?? localName)\n );\n}\n\n/** Resolves a statically knowable Vue dynamic-component selector. */\nfunction readDynamicComponentSelector(\n element: ElementNode,\n expressionPlugins: ParserPlugin[],\n bindings: TemplateBindings,\n shadowed: Set<string>\n): DynamicSelectorAnalysis | undefined {\n if (element.tag.toLowerCase() !== 'component') return undefined;\n const property = element.props.find((candidate) =>\n isDynamicComponentSelector(element, candidate)\n );\n if (!property) return undefined;\n if (property.type === NodeTypes.ATTRIBUTE) {\n return property.value\n ? {\n candidates: [{ kind: 'string', name: property.value.content }],\n componentFactories: new Set(),\n containers: [],\n displayName: property.value.content,\n gtComponentFactories: new Set(),\n possibleGT: false,\n unknown: false,\n }\n : undefined;\n }\n const node = property.exp\n ? getExpressionNode(property.exp, expressionPlugins)\n : undefined;\n if (!node) return undefined;\n return {\n ...collectDynamicSelectorCandidates(node, bindings, shadowed, new Set()),\n displayName:\n property.exp?.type === NodeTypes.SIMPLE_EXPRESSION\n ? property.exp.content\n : 'dynamic component',\n };\n}\n\n/** Collects every statically visible result of a dynamic selector expression. */\nfunction collectDynamicSelectorCandidates(\n node: babel.Node,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n const expression = unwrapExpression(node);\n if (!expression || seen.has(expression)) {\n return emptyDynamicSelectorAnalysis(true);\n }\n const nextSeen = new Set(seen).add(expression);\n if (\n expression.type === 'ArrayExpression' ||\n expression.type === 'ObjectExpression'\n ) {\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'literal', node: expression }],\n };\n }\n if (\n expression.type === 'ArrowFunctionExpression' ||\n expression.type === 'FunctionExpression' ||\n expression.type === 'ObjectMethod'\n ) {\n const result = collectTemplateCallableReturnAnalysis(\n expression,\n bindings,\n shadowed,\n nextSeen\n );\n return { ...result, unknown: true };\n }\n if (expression.type === 'Identifier') {\n if (shadowed.has(expression.name)) {\n return emptyDynamicSelectorAnalysis(true);\n }\n if (bindings.containerKinds.has(expression.name)) {\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'path', path: expression.name }],\n };\n }\n if (bindings.staticValues.has(expression.name)) {\n const value = bindings.staticValues.get(expression.name);\n return typeof value === 'string'\n ? selectorCandidate('string', value)\n : emptyDynamicSelectorAnalysis(false);\n }\n const possibleStrings = bindings.possibleStaticStrings.get(expression.name);\n if (possibleStrings && possibleStrings.size > 0) {\n const result = mergeDynamicSelectorAnalyses(\n [...possibleStrings].map((value) => selectorCandidate('string', value))\n );\n return { ...result, unknown: true };\n }\n return selectorCandidate('expression', expression.name);\n }\n if (expression.type === 'StringLiteral') {\n return selectorCandidate('string', expression.value);\n }\n const staticValue = readTemplateStaticPrimitive(\n expression,\n bindings,\n shadowed\n );\n if (staticValue.ok) {\n return typeof staticValue.value === 'string'\n ? selectorCandidate('string', staticValue.value)\n : emptyDynamicSelectorAnalysis(false);\n }\n if (\n expression.type === 'MemberExpression' ||\n expression.type === 'OptionalMemberExpression'\n ) {\n const property = readStaticTemplateMemberProperty(\n expression,\n bindings,\n shadowed\n );\n if (property !== undefined) {\n const selected = selectTemplateStaticMemberExpression(\n expression.object,\n property,\n bindings,\n shadowed,\n new Set()\n );\n if (selected) {\n return collectDynamicSelectorCandidates(\n selected,\n bindings,\n shadowed,\n nextSeen\n );\n }\n const objectAnalysis = collectDynamicSelectorCandidates(\n expression.object,\n bindings,\n shadowed,\n nextSeen\n );\n if (objectAnalysis.containers.length > 0) {\n const memberAnalysis = mergeDynamicSelectorAnalyses(\n objectAnalysis.containers.map((container) =>\n selectTemplateContainerReference(\n container,\n property,\n bindings,\n shadowed,\n nextSeen\n )\n )\n );\n return {\n ...memberAnalysis,\n unknown: memberAnalysis.unknown || objectAnalysis.unknown,\n };\n }\n }\n const memberPath = readStaticTemplateMemberPath(\n expression,\n bindings,\n shadowed\n );\n if (memberPath) {\n const staticMember = bindings.staticValues.get(memberPath);\n if (typeof staticMember === 'string') {\n return selectorCandidate('string', staticMember);\n }\n if (bindings.containerKinds.has(memberPath)) {\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'path', path: memberPath }],\n };\n }\n const possibleStrings = bindings.possibleStaticStrings.get(memberPath);\n if (possibleStrings && possibleStrings.size > 0) {\n const result = mergeDynamicSelectorAnalyses(\n [...possibleStrings].map((value) =>\n selectorCandidate('string', value)\n )\n );\n return { ...result, unknown: true };\n }\n const possibleContainer = findPossibleGTContainerPath(\n memberPath,\n bindings\n );\n if (possibleContainer) {\n return {\n ...emptyDynamicSelectorAnalysis(true),\n containers: [{ kind: 'path', path: possibleContainer }],\n };\n }\n if (templatePathSelectsPossibleGT(memberPath, bindings)) {\n return {\n ...emptyDynamicSelectorAnalysis(true),\n possibleGT: true,\n };\n }\n return selectorCandidate('expression', memberPath);\n }\n const container = collectTemplateContainerCandidates(\n expression.object,\n bindings,\n shadowed,\n nextSeen\n );\n if (\n container.candidates.length > 0 ||\n container.componentFactories.size > 0 ||\n container.containers.length > 0 ||\n container.gtComponentFactories.size > 0 ||\n container.possibleGT\n ) {\n return { ...container, unknown: true };\n }\n return emptyDynamicSelectorAnalysis(true);\n }\n if (expression.type === 'ConditionalExpression') {\n const test = readTemplateStaticPrimitive(\n expression.test,\n bindings,\n shadowed\n );\n if (test.ok) {\n return collectDynamicSelectorCandidates(\n test.value ? expression.consequent : expression.alternate,\n bindings,\n shadowed,\n nextSeen\n );\n }\n return mergeDynamicSelectorAnalyses([\n collectDynamicSelectorCandidates(\n expression.consequent,\n bindings,\n shadowed,\n nextSeen\n ),\n collectDynamicSelectorCandidates(\n expression.alternate,\n bindings,\n shadowed,\n nextSeen\n ),\n ]);\n }\n if (expression.type === 'LogicalExpression') {\n const leftCandidates = collectDynamicSelectorCandidates(\n expression.left,\n bindings,\n shadowed,\n nextSeen\n );\n if (selectorAnalysisIsKnownComponent(leftCandidates, bindings)) {\n return expression.operator === '&&'\n ? collectDynamicSelectorCandidates(\n expression.right,\n bindings,\n shadowed,\n nextSeen\n )\n : leftCandidates;\n }\n const left = readTemplateStaticPrimitive(\n expression.left,\n bindings,\n shadowed\n );\n if (left.ok) {\n const selectsRight =\n expression.operator === '??'\n ? left.value == null\n : expression.operator === '||'\n ? !left.value\n : Boolean(left.value);\n return selectsRight\n ? collectDynamicSelectorCandidates(\n expression.right,\n bindings,\n shadowed,\n nextSeen\n )\n : emptyDynamicSelectorAnalysis(false);\n }\n const merged = mergeDynamicSelectorAnalyses([\n leftCandidates,\n collectDynamicSelectorCandidates(\n expression.right,\n bindings,\n shadowed,\n nextSeen\n ),\n ]);\n return { ...merged, unknown: true };\n }\n if (expression.type === 'SequenceExpression') {\n const last = expression.expressions.at(-1);\n return last\n ? collectDynamicSelectorCandidates(last, bindings, shadowed, nextSeen)\n : emptyDynamicSelectorAnalysis(true);\n }\n if (\n expression.type === 'CallExpression' ||\n expression.type === 'OptionalCallExpression'\n ) {\n const reduction = collectTemplateReductionResult(\n expression,\n bindings,\n shadowed,\n nextSeen\n );\n if (reduction) return reduction;\n const directCallable = unwrapExpression(expression.callee);\n if (\n directCallable &&\n (directCallable.type === 'ArrowFunctionExpression' ||\n directCallable.type === 'FunctionExpression')\n ) {\n const returned = collectTemplateCallableReturnAnalysis(\n directCallable,\n bindings,\n shadowed,\n nextSeen\n );\n return { ...returned, unknown: true };\n }\n const memberCallee = unwrapExpression(expression.callee);\n if (\n memberCallee &&\n (memberCallee.type === 'MemberExpression' ||\n memberCallee.type === 'OptionalMemberExpression')\n ) {\n const method = readStaticTemplateMemberProperty(\n memberCallee,\n bindings,\n shadowed\n );\n const literalMethod = method\n ? selectTemplateStaticMemberExpression(\n memberCallee.object,\n method,\n bindings,\n shadowed,\n new Set()\n )\n : undefined;\n if (literalMethod?.type === 'ObjectMethod') {\n const returned = collectTemplateCallableReturnAnalysis(\n literalMethod,\n bindings,\n shadowed,\n nextSeen\n );\n return { ...returned, unknown: true };\n }\n if (method === 'call' || method === 'apply' || method === 'bind') {\n const receiver = collectDynamicSelectorCandidates(\n memberCallee.object,\n bindings,\n shadowed,\n nextSeen\n );\n const receiverPath = readStaticTemplateMemberPath(\n memberCallee.object,\n bindings,\n shadowed\n );\n if (receiverPath && bindings.componentFactories.has(receiverPath)) {\n receiver.componentFactories.add(receiverPath);\n }\n if (receiverPath && bindings.gtComponentFactories.has(receiverPath)) {\n receiver.gtComponentFactories.add(receiverPath);\n }\n if (\n receiver.componentFactories.size > 0 ||\n receiver.gtComponentFactories.size > 0\n ) {\n return { ...receiver, unknown: true };\n }\n }\n if (\n method &&\n (COMPONENT_SELECTING_ARRAY_METHODS.has(method) ||\n COMPONENT_PRESERVING_ARRAY_METHODS.has(method))\n ) {\n const references = collectTemplateContainerReferences(\n memberCallee.object,\n bindings,\n shadowed,\n nextSeen\n );\n const arrays = references.containers.filter(\n (container) =>\n isKnownTemplateArray(container, bindings) &&\n !templateContainerHasOwnMember(container, method, bindings)\n );\n if (arrays.length > 0) {\n if (COMPONENT_PRESERVING_ARRAY_METHODS.has(method)) {\n const argumentAnalyses =\n method === 'concat'\n ? expression.arguments.flatMap((argument) =>\n argument.type === 'ArgumentPlaceholder'\n ? []\n : [\n collectDynamicSelectorCandidates(\n argument.type === 'SpreadElement'\n ? argument.argument\n : argument,\n bindings,\n shadowed,\n nextSeen\n ),\n ]\n )\n : [];\n const argumentContainers =\n method === 'concat'\n ? argumentAnalyses.flatMap((analysis) => analysis.containers)\n : [];\n return {\n ...emptyDynamicSelectorAnalysis(true),\n containers: [...arrays, ...argumentContainers],\n possibleGT: argumentAnalyses.some((analysis) =>\n selectorAnalysisMayContainGT(analysis, bindings)\n ),\n };\n }\n\n let hasUnknownSelection = false;\n const analyses = arrays.flatMap((container) => {\n const key = readSelectingArrayMethodKey(\n method,\n expression.arguments[0],\n container,\n bindings,\n shadowed\n );\n if (key === null) return [];\n hasUnknownSelection ||= key === undefined;\n return [\n selectTemplateContainerReference(\n container,\n key,\n bindings,\n shadowed,\n nextSeen\n ),\n ];\n });\n if (analyses.length === 0) {\n return emptyDynamicSelectorAnalysis(false);\n }\n const selected = mergeDynamicSelectorAnalyses(analyses);\n return {\n ...selected,\n unknown: selected.unknown || hasUnknownSelection,\n };\n }\n }\n if (method === 'get') {\n const receiverPath = readStaticTemplateMemberPath(\n memberCallee.object,\n bindings,\n shadowed\n );\n if (\n receiverPath &&\n findPossibleGTContainerPath(receiverPath, bindings)\n ) {\n return {\n ...emptyDynamicSelectorAnalysis(true),\n possibleGT: true,\n };\n }\n const references = collectTemplateContainerReferences(\n memberCallee.object,\n bindings,\n shadowed,\n nextSeen\n );\n if (references.containers.length > 0) {\n const argument = expression.arguments[0];\n const staticKey =\n argument &&\n argument.type !== 'ArgumentPlaceholder' &&\n argument.type !== 'SpreadElement'\n ? readTemplateStaticPrimitive(argument, bindings, shadowed)\n : undefined;\n const key =\n staticKey?.ok &&\n (typeof staticKey.value === 'string' ||\n typeof staticKey.value === 'number')\n ? String(staticKey.value)\n : argument &&\n argument.type !== 'ArgumentPlaceholder' &&\n argument.type !== 'SpreadElement'\n ? (() => {\n const argumentPath = readStaticTemplateMemberPath(\n argument,\n bindings,\n shadowed\n );\n return argumentPath &&\n bindings.containerKinds.has(argumentPath)\n ? argumentPath\n : undefined;\n })()\n : undefined;\n const selected = mergeDynamicSelectorAnalyses(\n references.containers.map((container) =>\n selectTemplateContainerReference(\n container,\n key,\n bindings,\n shadowed,\n nextSeen\n )\n )\n );\n return {\n ...selected,\n unknown: selected.unknown || key === undefined,\n };\n }\n }\n }\n const callee = readStaticTemplateMemberPath(\n expression.callee,\n bindings,\n shadowed\n );\n if (callee === 'Reflect.get' && expression.arguments.length >= 2) {\n const target = expression.arguments[0];\n const keyNode = expression.arguments[1];\n if (\n target &&\n target.type !== 'ArgumentPlaceholder' &&\n target.type !== 'SpreadElement' &&\n keyNode &&\n keyNode.type !== 'ArgumentPlaceholder' &&\n keyNode.type !== 'SpreadElement'\n ) {\n const references = collectTemplateContainerReferences(\n target,\n bindings,\n shadowed,\n nextSeen\n );\n const staticKey = readTemplateStaticPrimitive(\n keyNode,\n bindings,\n shadowed\n );\n const key =\n staticKey.ok &&\n (typeof staticKey.value === 'string' ||\n typeof staticKey.value === 'number')\n ? String(staticKey.value)\n : undefined;\n const selected = mergeDynamicSelectorAnalyses(\n references.containers.map((container) =>\n selectTemplateContainerReference(\n container,\n key,\n bindings,\n shadowed,\n nextSeen\n )\n )\n );\n if (references.containers.length > 0) {\n return {\n ...selected,\n unknown: selected.unknown || key === undefined,\n };\n }\n }\n }\n const first = expression.arguments[0];\n if (\n callee &&\n bindings.identityFunctions.has(callee) &&\n expression.arguments.length === 1 &&\n first &&\n first.type !== 'ArgumentPlaceholder' &&\n first.type !== 'SpreadElement'\n ) {\n return collectDynamicSelectorCandidates(\n first,\n bindings,\n shadowed,\n nextSeen\n );\n }\n const argumentsAnalysis = mergeDynamicSelectorAnalyses(\n expression.arguments\n .filter(\n (\n argument\n ): argument is Exclude<typeof argument, babel.ArgumentPlaceholder> =>\n argument.type !== 'ArgumentPlaceholder'\n )\n .map((argument) =>\n collectDynamicSelectorCandidates(\n argument.type === 'SpreadElement' ? argument.argument : argument,\n bindings,\n shadowed,\n nextSeen\n )\n )\n );\n const calleeAnalysis = collectDynamicSelectorCandidates(\n expression.callee,\n bindings,\n shadowed,\n nextSeen\n );\n for (const candidate of calleeAnalysis.candidates) {\n if (candidate.kind !== 'expression') continue;\n if (bindings.componentFactories.has(candidate.name)) {\n argumentsAnalysis.componentFactories.add(candidate.name);\n }\n if (bindings.gtComponentFactories.has(candidate.name)) {\n argumentsAnalysis.gtComponentFactories.add(candidate.name);\n }\n }\n for (const name of calleeAnalysis.componentFactories) {\n argumentsAnalysis.componentFactories.add(name);\n }\n for (const name of calleeAnalysis.gtComponentFactories) {\n argumentsAnalysis.gtComponentFactories.add(name);\n }\n if (callee && bindings.componentFactories.has(callee)) {\n argumentsAnalysis.componentFactories.add(callee);\n }\n if (callee && bindings.gtComponentFactories.has(callee)) {\n argumentsAnalysis.gtComponentFactories.add(callee);\n }\n return { ...argumentsAnalysis, unknown: true };\n }\n if (expression.type === 'AssignmentExpression') {\n return collectDynamicSelectorCandidates(\n expression.right,\n bindings,\n shadowed,\n nextSeen\n );\n }\n if (\n expression.type === 'AwaitExpression' ||\n expression.type === 'YieldExpression'\n ) {\n return expression.argument\n ? collectDynamicSelectorCandidates(\n expression.argument,\n bindings,\n shadowed,\n nextSeen\n )\n : emptyDynamicSelectorAnalysis(true);\n }\n return emptyDynamicSelectorAnalysis(false);\n}\n\n/** Finds component-bearing values that a dynamic container index may select. */\nfunction collectTemplateContainerCandidates(\n node: babel.Node,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n const expression = unwrapExpression(node);\n if (!expression || seen.has(expression)) {\n return emptyDynamicSelectorAnalysis(true);\n }\n const nextSeen = new Set(seen).add(expression);\n if (\n expression.type === 'ArrayExpression' ||\n expression.type === 'ObjectExpression'\n ) {\n return collectLiteralContainerCandidates(\n expression,\n bindings,\n shadowed,\n nextSeen\n );\n }\n if (\n expression.type === 'CallExpression' ||\n expression.type === 'OptionalCallExpression'\n ) {\n const transformed = collectTemplateTransformCandidates(\n expression,\n bindings,\n shadowed,\n nextSeen\n );\n if (transformed) return transformed;\n }\n const path = readStaticTemplateMemberPath(expression, bindings, shadowed);\n if (\n path &&\n (bindings.containerKinds.has(path) ||\n findPossibleGTContainerPath(path, bindings) !== undefined ||\n hasImmediatePossibleGTContainerChild(path, bindings) ||\n hasPossibleStaticStringChild(path, bindings))\n ) {\n const result =\n bindings.containerKinds.has(path) ||\n hasImmediatePossibleGTContainerChild(path, bindings) ||\n hasPossibleStaticStringChild(path, bindings)\n ? collectExposedContainerCandidates(path, bindings)\n : emptyDynamicSelectorAnalysis(true);\n return {\n ...result,\n possibleGT:\n result.possibleGT ||\n findPossibleGTContainerPath(path, bindings) !== undefined,\n };\n }\n if (\n expression.type === 'CallExpression' ||\n expression.type === 'OptionalCallExpression'\n ) {\n const callee = readStaticTemplateMemberPath(\n expression.callee,\n bindings,\n shadowed\n );\n if (callee && bindings.gtContainerFactories.has(callee)) {\n return {\n ...emptyDynamicSelectorAnalysis(true),\n possibleGT: true,\n };\n }\n }\n const selected = collectDynamicSelectorCandidates(\n expression,\n bindings,\n shadowed,\n seen\n );\n const analyses = selected.containers.map((container) =>\n selectTemplateContainerReference(\n container,\n undefined,\n bindings,\n shadowed,\n nextSeen\n )\n );\n if (analyses.length === 0) {\n return {\n ...emptyDynamicSelectorAnalysis(true),\n possibleGT: false,\n };\n }\n const result = mergeDynamicSelectorAnalyses(analyses);\n return {\n ...result,\n possibleGT: result.possibleGT,\n unknown: result.unknown || selected.unknown,\n };\n}\n\n/** Models built-in transforms whose result is immediately selected or iterated. */\nfunction collectTemplateTransformCandidates(\n call: babel.CallExpression | babel.OptionalCallExpression,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> | undefined {\n const callee = unwrapExpression(call.callee);\n if (\n !callee ||\n (callee.type !== 'MemberExpression' &&\n callee.type !== 'OptionalMemberExpression')\n ) {\n return undefined;\n }\n const method = readStaticTemplateMemberProperty(callee, bindings, shadowed);\n if (!method) return undefined;\n const receiverPath = readStaticTemplateMemberPath(\n callee.object,\n bindings,\n shadowed\n );\n const readArgument = (index: number): babel.Node | undefined => {\n const argument = call.arguments[index];\n return argument && argument.type !== 'ArgumentPlaceholder'\n ? argument.type === 'SpreadElement'\n ? argument.argument\n : argument\n : undefined;\n };\n const receiver = (): Omit<DynamicSelectorAnalysis, 'displayName'> =>\n collectTemplateContainerCandidates(callee.object, bindings, shadowed, seen);\n const mapValues = (\n source: Omit<DynamicSelectorAnalysis, 'displayName'>,\n callbackNode: babel.Node | undefined,\n includeSourceParameter = true,\n thisNode?: babel.Node\n ): Omit<DynamicSelectorAnalysis, 'displayName'> => {\n const callback = unwrapExpression(callbackNode);\n if (\n !callback ||\n (callback.type !== 'ArrowFunctionExpression' &&\n callback.type !== 'FunctionExpression')\n ) {\n return { ...source, unknown: true };\n }\n const parameters = new Map<\n string,\n Omit<DynamicSelectorAnalysis, 'displayName'>\n >();\n const sourceArray: Omit<DynamicSelectorAnalysis, 'displayName'> = {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [\n { kind: 'analysis', containerKind: 'array', values: source },\n ],\n };\n const callbackArguments = [\n source,\n emptyDynamicSelectorAnalysis(false),\n ...(includeSourceParameter ? [sourceArray] : []),\n ];\n bindTemplateCallbackParameters(\n callback,\n callbackArguments,\n bindings,\n shadowed,\n parameters\n );\n if (callback.type !== 'ArrowFunctionExpression' && thisNode) {\n parameters.set(\n 'this',\n collectTemplateSelectorValue(thisNode, bindings, shadowed, seen)\n );\n }\n const analyses = collectTemplateFunctionReturns(callback).map((value) =>\n collectTemplateCallbackReturnValue(\n value,\n parameters,\n bindings,\n shadowed,\n seen\n )\n );\n const mapped = mergeDynamicSelectorAnalyses(analyses);\n return { ...mapped, unknown: mapped.unknown || analyses.length === 0 };\n };\n\n if (\n receiverPath === 'Array' &&\n method === 'from' &&\n !bindings.directBindings.has('Array') &&\n !shadowed.has('Array')\n ) {\n const sourceNode = readArgument(0);\n if (!sourceNode) return emptyDynamicSelectorAnalysis(true);\n const source = collectTemplateContainerCandidates(\n sourceNode,\n bindings,\n shadowed,\n seen\n );\n return call.arguments.length > 1\n ? mapValues(source, readArgument(1), false, readArgument(2))\n : source;\n }\n\n if (\n receiverPath === 'Object' &&\n (method === 'values' || method === 'entries') &&\n !bindings.directBindings.has('Object') &&\n !shadowed.has('Object')\n ) {\n const sourceNode = readArgument(0);\n if (!sourceNode) return emptyDynamicSelectorAnalysis(true);\n if (method === 'values') {\n return collectTemplateContainerCandidates(\n sourceNode,\n bindings,\n shadowed,\n seen\n );\n }\n const sourceValues = collectTemplateContainerCandidates(\n sourceNode,\n bindings,\n shadowed,\n seen\n );\n const source = unwrapExpression(sourceNode);\n if (source?.type !== 'ObjectExpression') {\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [\n {\n kind: 'analysis',\n containerKind: 'array',\n members: new Map([\n ['0', emptyDynamicSelectorAnalysis(false)],\n ['1', sourceValues],\n ]),\n values: sourceValues,\n },\n ],\n };\n }\n const properties = flattenTemplateLiteralObject(source, new Set());\n if (!properties) return emptyDynamicSelectorAnalysis(true);\n const tuples: DynamicSelectorContainer[] = [];\n let unknown = false;\n for (const property of properties) {\n if (property.type === 'SpreadElement') {\n unknown = true;\n continue;\n }\n const key = readTemplateLiteralPropertyKey(property, bindings, shadowed);\n if (\n property.type !== 'ObjectProperty' ||\n !babel.isExpression(property.value)\n ) {\n unknown = true;\n continue;\n }\n tuples.push({\n kind: 'literal',\n node: babel.arrayExpression([\n babel.stringLiteral(key ?? ''),\n property.value,\n ]),\n });\n unknown ||= key === undefined;\n }\n return {\n ...emptyDynamicSelectorAnalysis(unknown),\n containers: tuples,\n };\n }\n\n const source = receiver();\n if (method === 'concat') {\n const argumentsAnalysis = call.arguments.flatMap((_, index) => {\n const argument = readArgument(index);\n if (!argument) return [];\n return [\n flattenTemplateTransformAnalysis(\n collectDynamicSelectorCandidates(argument, bindings, shadowed, seen),\n 1,\n bindings,\n shadowed,\n seen\n ),\n ];\n });\n return mergeDynamicSelectorAnalyses([source, ...argumentsAnalysis]);\n }\n if (method === 'map') {\n return mapValues(source, readArgument(0), true, readArgument(1));\n }\n if (method === 'flatMap') {\n return flattenTemplateTransformAnalysis(\n mapValues(source, readArgument(0), true, readArgument(1)),\n 1,\n bindings,\n shadowed,\n seen\n );\n }\n if (method === 'flat') {\n const depthNode = readArgument(0);\n const depthValue = depthNode\n ? readTemplateStaticPrimitive(depthNode, bindings, shadowed, true)\n : { ok: true as const, value: 1 };\n if (!depthValue.ok) {\n const possibilities = [source];\n let current = source;\n for (\n let depth = 0;\n depth < 32 && current.containers.length > 0;\n depth += 1\n ) {\n current = flattenTemplateTransformAnalysis(\n current,\n 1,\n bindings,\n shadowed,\n seen\n );\n possibilities.push(current);\n }\n const merged = mergeDynamicSelectorAnalyses(possibilities);\n return { ...merged, unknown: true };\n }\n if (typeof depthValue.value === 'bigint') {\n return emptyDynamicSelectorAnalysis(false);\n }\n const numericDepth = Number(depthValue.value);\n const depth = Number.isNaN(numericDepth)\n ? 0\n : numericDepth === Number.POSITIVE_INFINITY\n ? 32\n : Math.max(0, Math.trunc(numericDepth));\n return flattenTemplateTransformAnalysis(\n source,\n depth,\n bindings,\n shadowed,\n seen\n );\n }\n if (method === 'with' || method === 'toSpliced') {\n const inserted =\n method === 'with'\n ? [readArgument(1)]\n : call.arguments.slice(2).map((_, index) => readArgument(index + 2));\n return mergeDynamicSelectorAnalyses([\n source,\n ...inserted.flatMap((value) =>\n value\n ? [collectTemplateSelectorValue(value, bindings, shadowed, seen)]\n : []\n ),\n ]);\n }\n if (method === 'copyWithin') return source;\n if (method === 'fill') {\n const value = readArgument(0);\n return value\n ? collectTemplateSelectorValue(value, bindings, shadowed, seen)\n : emptyDynamicSelectorAnalysis(false);\n }\n if (method === 'reduce' || method === 'reduceRight') {\n const reduction = collectTemplateReductionResult(\n call,\n bindings,\n shadowed,\n seen\n );\n if (reduction) {\n const scalar = { ...reduction, containers: [] };\n return mergeDynamicSelectorAnalyses([\n scalar,\n ...reduction.containers.map((container) =>\n selectTemplateContainerReference(\n container,\n undefined,\n bindings,\n shadowed,\n seen\n )\n ),\n ]);\n }\n const flattened = flattenTemplateTransformAnalysis(\n source,\n 1,\n bindings,\n shadowed,\n seen\n );\n const initial = readArgument(1);\n return mergeDynamicSelectorAnalyses([\n source,\n flattened,\n ...(initial\n ? [collectTemplateSelectorValue(initial, bindings, shadowed, seen)]\n : []),\n ]);\n }\n return undefined;\n}\n\n/** Evaluates a finite literal reduce/reduceRight without executing user code. */\nfunction collectTemplateReductionResult(\n call: babel.CallExpression | babel.OptionalCallExpression,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> | undefined {\n const callee = unwrapExpression(call.callee);\n if (\n !callee ||\n (callee.type !== 'MemberExpression' &&\n callee.type !== 'OptionalMemberExpression')\n ) {\n return undefined;\n }\n const method = readStaticTemplateMemberProperty(callee, bindings, shadowed);\n if (method !== 'reduce' && method !== 'reduceRight') return undefined;\n const receiver = unwrapExpression(callee.object);\n if (receiver?.type !== 'ArrayExpression') return undefined;\n const elements = flattenTemplateLiteralArray(receiver, new Set());\n if (!elements) return undefined;\n const callbackArgument = call.arguments[0];\n const callback =\n callbackArgument &&\n callbackArgument.type !== 'ArgumentPlaceholder' &&\n callbackArgument.type !== 'SpreadElement'\n ? unwrapExpression(callbackArgument)\n : undefined;\n if (\n !callback ||\n (callback.type !== 'ArrowFunctionExpression' &&\n callback.type !== 'FunctionExpression')\n ) {\n return undefined;\n }\n const entries = elements\n .filter((element): element is babel.Node => Boolean(element))\n .map((element) =>\n collectTemplateSelectorValue(element, bindings, shadowed, seen)\n );\n const initialArgument = call.arguments[1];\n const initial =\n initialArgument &&\n initialArgument.type !== 'ArgumentPlaceholder' &&\n initialArgument.type !== 'SpreadElement'\n ? collectTemplateSelectorValue(initialArgument, bindings, shadowed, seen)\n : undefined;\n if (entries.length === 0)\n return initial ?? emptyDynamicSelectorAnalysis(false);\n const ordered = method === 'reduceRight' ? [...entries].reverse() : entries;\n let accumulator = initial ?? ordered.shift();\n if (!accumulator) return emptyDynamicSelectorAnalysis(false);\n const sourceArray = collectTemplateSelectorValue(\n receiver,\n bindings,\n shadowed,\n seen\n );\n for (const current of ordered) {\n const parameters = new Map<\n string,\n Omit<DynamicSelectorAnalysis, 'displayName'>\n >();\n bindTemplateCallbackParameters(\n callback,\n [accumulator, current, emptyDynamicSelectorAnalysis(false), sourceArray],\n bindings,\n shadowed,\n parameters\n );\n const returned = collectTemplateFunctionReturns(callback).map((value) =>\n collectTemplateCallbackReturnValue(\n value,\n parameters,\n bindings,\n shadowed,\n seen\n )\n );\n accumulator =\n returned.length > 0\n ? mergeDynamicSelectorAnalyses(returned)\n : emptyDynamicSelectorAnalysis(true);\n }\n return accumulator;\n}\n\n/** Flattens only container alternatives while retaining non-array values. */\nfunction flattenTemplateTransformAnalysis(\n analysis: Omit<DynamicSelectorAnalysis, 'displayName'>,\n depth: number,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n let current = analysis;\n for (\n let index = 0;\n index < depth && current.containers.length > 0;\n index += 1\n ) {\n const retained = { ...current, containers: [] };\n const children = current.containers.map((container) =>\n selectTemplateContainerReference(\n container,\n undefined,\n bindings,\n shadowed,\n seen\n )\n );\n current = mergeDynamicSelectorAnalyses([retained, ...children]);\n }\n return current;\n}\n\n/** Binds positional callback values, including a precise rest-argument tuple. */\nfunction bindTemplateCallbackParameters(\n callback: babel.ArrowFunctionExpression | babel.FunctionExpression,\n callbackArguments: Array<Omit<DynamicSelectorAnalysis, 'displayName'>>,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n parameters: Map<string, Omit<DynamicSelectorAnalysis, 'displayName'>>\n): void {\n callback.params.forEach((parameter, index) => {\n if (!isTemplateBindingPattern(parameter)) return;\n if (parameter.type === 'RestElement') {\n if (!isTemplateBindingPattern(parameter.argument)) return;\n const restValues = callbackArguments.slice(index);\n collectTemplateCallbackParameterValues(\n parameter.argument,\n {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [\n {\n kind: 'analysis',\n containerKind: 'array',\n members: new Map(\n restValues.map((value, memberIndex) => [\n String(memberIndex),\n value,\n ])\n ),\n values: mergeDynamicSelectorAnalyses(restValues),\n },\n ],\n },\n bindings,\n shadowed,\n parameters\n );\n return;\n }\n collectTemplateCallbackParameterValues(\n parameter,\n callbackArguments[index] ?? emptyDynamicSelectorAnalysis(true),\n bindings,\n shadowed,\n parameters\n );\n });\n}\n\n/** Projects one mapper input through its callback parameter pattern. */\nfunction collectTemplateCallbackParameterValues(\n pattern: TemplateBindingPattern,\n values: Omit<DynamicSelectorAnalysis, 'displayName'>,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n parameters: Map<string, Omit<DynamicSelectorAnalysis, 'displayName'>>\n): void {\n if (pattern.type === 'Identifier') {\n parameters.set(pattern.name, values);\n return;\n }\n if (pattern.type === 'AssignmentPattern') {\n if (isTemplateBindingPattern(pattern.left)) {\n collectTemplateCallbackParameterValues(\n pattern.left,\n mergeDynamicSelectorAnalyses([\n values,\n collectDynamicSelectorCandidates(\n pattern.right,\n bindings,\n shadowed,\n new Set()\n ),\n ]),\n bindings,\n shadowed,\n parameters\n );\n }\n return;\n }\n if (pattern.type === 'RestElement') {\n if (isTemplateBindingPattern(pattern.argument)) {\n collectTemplateCallbackParameterValues(\n pattern.argument,\n {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'analysis', containerKind: 'array', values }],\n },\n bindings,\n shadowed,\n parameters\n );\n }\n return;\n }\n if (pattern.type === 'ObjectPattern') {\n for (const property of pattern.properties) {\n const target =\n property.type === 'RestElement' ? property.argument : property.value;\n if (!isTemplateBindingPattern(target)) continue;\n collectTemplateCallbackParameterValues(\n target,\n property.type === 'RestElement'\n ? values\n : selectPossibleContainerChildren(\n values,\n readTemplateLiteralPropertyKey(property, bindings, shadowed),\n bindings,\n shadowed\n ),\n bindings,\n shadowed,\n parameters\n );\n }\n return;\n }\n pattern.elements.forEach((element, index) => {\n if (!element || !isTemplateBindingPattern(element)) return;\n collectTemplateCallbackParameterValues(\n element,\n selectPossibleContainerChildren(\n values,\n element.type === 'RestElement' ? undefined : String(index),\n bindings,\n shadowed\n ),\n bindings,\n shadowed,\n parameters\n );\n });\n}\n\n/** Evaluates a callback return against abstract parameter values. */\nfunction collectTemplateCallbackReturnValue(\n node: babel.Node,\n parameters: Map<string, Omit<DynamicSelectorAnalysis, 'displayName'>>,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n const expression = unwrapExpression(node);\n if (!expression) return emptyDynamicSelectorAnalysis(true);\n if (expression.type === 'Identifier') {\n const parameter = parameters.get(expression.name);\n if (parameter) return parameter;\n }\n if (\n expression.type === 'CallExpression' ||\n expression.type === 'OptionalCallExpression'\n ) {\n const callee = unwrapExpression(expression.callee);\n if (\n callee &&\n (callee.type === 'MemberExpression' ||\n callee.type === 'OptionalMemberExpression') &&\n readStaticTemplateMemberProperty(callee, bindings, shadowed) === 'concat'\n ) {\n const objectValue = collectTemplateCallbackReturnValue(\n callee.object,\n parameters,\n bindings,\n shadowed,\n seen\n );\n if (objectValue.containers.length > 0) {\n const flattenOne = (\n value: Omit<DynamicSelectorAnalysis, 'displayName'>\n ): Omit<DynamicSelectorAnalysis, 'displayName'> =>\n mergeDynamicSelectorAnalyses([\n { ...value, containers: [] },\n ...value.containers.map((container) =>\n selectTemplateContainerReference(\n container,\n undefined,\n bindings,\n shadowed,\n seen\n )\n ),\n ]);\n const values = mergeDynamicSelectorAnalyses([\n flattenOne(objectValue),\n ...expression.arguments.flatMap((argument) =>\n argument.type === 'ArgumentPlaceholder'\n ? []\n : [\n flattenOne(\n collectTemplateCallbackReturnValue(\n argument.type === 'SpreadElement'\n ? argument.argument\n : argument,\n parameters,\n bindings,\n shadowed,\n seen\n )\n ),\n ]\n ),\n ]);\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'analysis', containerKind: 'array', values }],\n };\n }\n }\n }\n if (\n expression.type === 'MemberExpression' ||\n expression.type === 'OptionalMemberExpression'\n ) {\n const objectValue = collectTemplateCallbackReturnValue(\n expression.object,\n parameters,\n bindings,\n shadowed,\n seen\n );\n if (objectValue.containers.length > 0) {\n return selectPossibleContainerChildren(\n objectValue,\n readStaticTemplateMemberProperty(expression, bindings, shadowed),\n bindings,\n shadowed\n );\n }\n }\n if (expression.type === 'ThisExpression') {\n return parameters.get('this') ?? emptyDynamicSelectorAnalysis(true);\n }\n if (expression.type === 'ArrayExpression') {\n const elementValues = expression.elements.map((element) =>\n element\n ? collectTemplateCallbackReturnValue(\n element.type === 'SpreadElement' ? element.argument : element,\n parameters,\n bindings,\n shadowed,\n seen\n )\n : emptyDynamicSelectorAnalysis(false)\n );\n const values = mergeDynamicSelectorAnalyses(elementValues);\n const hasSpread = expression.elements.some(\n (element) => element?.type === 'SpreadElement'\n );\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [\n {\n kind: 'analysis',\n containerKind: 'array',\n members: hasSpread\n ? undefined\n : new Map(\n elementValues.map((value, index) => [String(index), value])\n ),\n values,\n },\n ],\n };\n }\n if (expression.type === 'ObjectExpression') {\n const values = mergeDynamicSelectorAnalyses(\n expression.properties.map((property) =>\n collectTemplateCallbackReturnValue(\n property.type === 'SpreadElement'\n ? property.argument\n : property.type === 'ObjectProperty'\n ? property.value\n : property,\n parameters,\n bindings,\n shadowed,\n seen\n )\n )\n );\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'analysis', containerKind: 'object', values }],\n };\n }\n if (expression.type === 'ConditionalExpression') {\n return mergeDynamicSelectorAnalyses([\n collectTemplateCallbackReturnValue(\n expression.consequent,\n parameters,\n bindings,\n shadowed,\n seen\n ),\n collectTemplateCallbackReturnValue(\n expression.alternate,\n parameters,\n bindings,\n shadowed,\n seen\n ),\n ]);\n }\n if (expression.type === 'LogicalExpression') {\n return mergeDynamicSelectorAnalyses([\n collectTemplateCallbackReturnValue(\n expression.left,\n parameters,\n bindings,\n shadowed,\n seen\n ),\n collectTemplateCallbackReturnValue(\n expression.right,\n parameters,\n bindings,\n shadowed,\n seen\n ),\n ]);\n }\n if (expression.type === 'SequenceExpression') {\n const last = expression.expressions.at(-1);\n return last\n ? collectTemplateCallbackReturnValue(\n last,\n parameters,\n bindings,\n shadowed,\n seen\n )\n : emptyDynamicSelectorAnalysis(true);\n }\n return collectTemplateSelectorValue(expression, bindings, shadowed, seen);\n}\n\n/** Resolves an expression to container identities without selecting a child. */\nfunction collectTemplateContainerReferences(\n node: babel.Node,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n const expression = unwrapExpression(node);\n if (!expression || seen.has(expression)) {\n return emptyDynamicSelectorAnalysis(true);\n }\n if (\n expression.type === 'ArrayExpression' ||\n expression.type === 'ObjectExpression'\n ) {\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'literal', node: expression }],\n };\n }\n const path = readStaticTemplateMemberPath(expression, bindings, shadowed);\n if (path && bindings.containerKinds.has(path)) {\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'path', path }],\n };\n }\n const selected = collectDynamicSelectorCandidates(\n expression,\n bindings,\n shadowed,\n seen\n );\n return {\n ...emptyDynamicSelectorAnalysis(selected.unknown),\n containers: selected.containers,\n };\n}\n\n/** Selects one exact child, or every immediate child, from a container. */\nfunction selectTemplateContainerReference(\n container: DynamicSelectorContainer,\n key: string | undefined,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n if (container.kind === 'path') {\n return key === undefined\n ? collectExposedContainerCandidates(container.path, bindings)\n : collectExposedPathCandidate(\n appendTemplatePath(container.path, key),\n bindings\n );\n }\n if (container.kind === 'analysis') {\n const selected =\n key === undefined ? container.values : container.members?.get(key);\n return selected\n ? { ...selected, unknown: selected.unknown || key === undefined }\n : emptyDynamicSelectorAnalysis(true);\n }\n if (key === undefined) {\n return collectLiteralContainerCandidates(\n container.node,\n bindings,\n shadowed,\n seen\n );\n }\n const selected = selectTemplateLiteralMember(container.node, key);\n return selected\n ? collectTemplateSelectorValue(selected, bindings, shadowed, seen)\n : templateLiteralMemberIsUncertain(container.node, key)\n ? collectLiteralContainerCandidates(\n container.node,\n bindings,\n shadowed,\n seen\n )\n : emptyDynamicSelectorAnalysis(false);\n}\n\n/** Reads one exact flattened script path, retaining its value category. */\nfunction collectExposedPathCandidate(\n path: string,\n bindings: TemplateBindings\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n const result = emptyDynamicSelectorAnalysis(false);\n const value = bindings.staticValues.get(path);\n if (typeof value === 'string') {\n result.candidates.push({ kind: 'string', name: value });\n }\n const possibleStrings = bindings.possibleStaticStrings.get(path);\n if (possibleStrings) {\n for (const possible of possibleStrings) {\n result.candidates.push({ kind: 'string', name: possible });\n }\n result.unknown = possibleStrings.size > 0;\n }\n if (\n bindings.components.has(path) ||\n bindings.vueBuiltins.has(path) ||\n bindings.uncertainComponents.has(path)\n ) {\n result.candidates.push({ kind: 'expression', name: path });\n }\n if (bindings.componentFactories.has(path)) {\n result.componentFactories.add(path);\n result.candidates.push({ kind: 'expression', name: path });\n }\n if (bindings.gtComponentFactories.has(path)) {\n result.gtComponentFactories.add(path);\n }\n if (bindings.containerKinds.has(path)) {\n result.containers.push({ kind: 'path', path });\n }\n const possibleContainer = findPossibleGTContainerPath(path, bindings);\n if (possibleContainer) {\n result.containers.push({ kind: 'path', path: possibleContainer });\n }\n result.possibleGT ||= templatePathSelectsPossibleGT(path, bindings);\n result.unknown =\n result.unknown ||\n bindings.uncertainComponents.has(path) ||\n (result.candidates.length === 0 &&\n result.componentFactories.size === 0 &&\n result.containers.length === 0);\n return result;\n}\n\n/** Returns true only for arrays whose shape was proven by static analysis. */\nfunction isKnownTemplateArray(\n container: DynamicSelectorContainer,\n bindings: TemplateBindings\n): boolean {\n return container.kind === 'literal'\n ? container.node.type === 'ArrayExpression'\n : container.kind === 'analysis'\n ? container.containerKind === 'array'\n : bindings.containerKinds.get(container.path) === 'array';\n}\n\n/** Detects a statically defined own property that overrides an array method. */\nfunction templateContainerHasOwnMember(\n container: DynamicSelectorContainer,\n member: string,\n bindings: TemplateBindings\n): boolean {\n if (container.kind !== 'path') return false;\n const path = appendTemplatePath(container.path, member);\n return (\n bindings.components.has(path) ||\n bindings.componentFactories.has(path) ||\n bindings.containerKinds.has(path) ||\n bindings.gtComponentFactories.has(path) ||\n bindings.staticValues.has(path) ||\n bindings.uncertainComponents.has(path) ||\n bindings.vueBuiltins.has(path)\n );\n}\n\n/** Resolves the exact child selected by an array method when it is static. */\nfunction readSelectingArrayMethodKey(\n method: string,\n argument: babel.CallExpression['arguments'][number] | undefined,\n container: DynamicSelectorContainer,\n bindings: TemplateBindings,\n shadowed: Set<string>\n): string | null | undefined {\n if (templateContainerHasOwnMember(container, method, bindings)) {\n return null;\n }\n const length =\n container.kind === 'literal'\n ? container.node.type === 'ArrayExpression'\n ? flattenTemplateLiteralArray(container.node, new Set())?.length\n : undefined\n : container.kind === 'path'\n ? bindings.arrayLengths.get(container.path)\n : undefined;\n if (method === 'shift') return length === 0 ? null : '0';\n if (method === 'pop') {\n return length === undefined\n ? undefined\n : length === 0\n ? null\n : `${length - 1}`;\n }\n if (method !== 'at') return undefined;\n\n if (\n argument?.type === 'ArgumentPlaceholder' ||\n argument?.type === 'SpreadElement'\n ) {\n return undefined;\n }\n const indexValue = argument\n ? readTemplateStaticPrimitive(argument, bindings, shadowed)\n : { ok: true as const, value: 0 };\n if (!indexValue.ok) return undefined;\n if (typeof indexValue.value === 'bigint') return null;\n let index: number;\n try {\n index = Number(indexValue.value);\n } catch {\n return null;\n }\n if (Number.isNaN(index)) index = 0;\n else if (!Number.isFinite(index)) return null;\n index = Math.trunc(index);\n if (index < 0) {\n if (length === undefined) return undefined;\n index += length;\n }\n if (index < 0 || (length !== undefined && index >= length)) return null;\n return String(index);\n}\n\n/** Collects only the immediate values that one literal selection may return. */\nfunction collectLiteralContainerCandidates(\n container: babel.ArrayExpression | babel.ObjectExpression,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n if (container.type === 'ArrayExpression') {\n const flattened = flattenTemplateLiteralArray(container, new Set());\n const values = flattened\n ? flattened.filter((value): value is babel.Node => Boolean(value))\n : container.elements.flatMap((element) =>\n !element ? [] : element.type === 'SpreadElement' ? [] : [element]\n );\n const analyses = values.map((value) =>\n collectTemplateSelectorValue(value, bindings, shadowed, seen)\n );\n if (!flattened) {\n for (const element of container.elements) {\n if (element?.type !== 'SpreadElement') continue;\n analyses.push(\n collectTemplateContainerCandidates(\n element.argument,\n bindings,\n shadowed,\n seen\n )\n );\n }\n }\n const result = mergeDynamicSelectorAnalyses(analyses);\n return { ...result, unknown: result.unknown || !flattened };\n }\n\n const properties = flattenTemplateLiteralObject(container, new Set());\n const finalValues = new Map<string, babel.Node>();\n const uncertainValues: babel.Node[] = [];\n const spreadAnalyses: Array<Omit<DynamicSelectorAnalysis, 'displayName'>> =\n [];\n for (const property of properties ?? container.properties) {\n if (property.type === 'SpreadElement') {\n spreadAnalyses.push(\n collectTemplateContainerCandidates(\n property.argument,\n bindings,\n shadowed,\n seen\n )\n );\n continue;\n }\n const key = readTemplateLiteralPropertyKey(property, bindings, shadowed);\n const value =\n property.type === 'ObjectProperty'\n ? property.value\n : property.type === 'ObjectMethod' && property.kind === 'get'\n ? property\n : undefined;\n if (!value) continue;\n if (key === undefined) uncertainValues.push(value);\n else finalValues.set(key, value);\n }\n const analyses = [...finalValues.values(), ...uncertainValues].map((value) =>\n collectTemplateSelectorValue(value, bindings, shadowed, seen)\n );\n analyses.push(...spreadAnalyses);\n const result = mergeDynamicSelectorAnalyses(analyses);\n return {\n ...result,\n unknown:\n result.unknown || properties === undefined || uncertainValues.length > 0,\n };\n}\n\n/** Preserves a nested literal as a container instead of flattening its leaves. */\nfunction collectTemplateSelectorValue(\n node: babel.Node,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n if (node.type === 'ObjectMethod' && node.kind === 'get') {\n const returns = collectTemplateFunctionReturns(node);\n const result = mergeDynamicSelectorAnalyses(\n returns.map((value) =>\n collectTemplateSelectorValue(value, bindings, shadowed, seen)\n )\n );\n return { ...result, unknown: true };\n }\n const expression = unwrapExpression(node);\n if (\n expression?.type === 'ArrayExpression' ||\n expression?.type === 'ObjectExpression'\n ) {\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'literal', node: expression }],\n };\n }\n const path = readStaticTemplateMemberPath(expression, bindings, shadowed);\n if (path && bindings.containerKinds.has(path)) {\n return {\n ...emptyDynamicSelectorAnalysis(false),\n containers: [{ kind: 'path', path }],\n };\n }\n return expression\n ? collectDynamicSelectorCandidates(expression, bindings, shadowed, seen)\n : emptyDynamicSelectorAnalysis(true);\n}\n\n/** Collects returns from one function body without entering nested functions. */\nfunction collectTemplateCallableReturnAnalysis(\n fn:\n | babel.ArrowFunctionExpression\n | babel.FunctionExpression\n | babel.ObjectMethod,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n return mergeDynamicSelectorAnalyses(\n collectTemplateFunctionReturns(fn).map((value) =>\n collectTemplateSelectorValue(value, bindings, shadowed, seen)\n )\n );\n}\n\nfunction collectTemplateFunctionReturns(\n fn:\n | babel.ArrowFunctionExpression\n | babel.FunctionExpression\n | babel.ObjectMethod\n): babel.Expression[] {\n if (\n fn.type === 'ArrowFunctionExpression' &&\n fn.body.type !== 'BlockStatement'\n ) {\n return [fn.body];\n }\n const returns: babel.Expression[] = [];\n const visit = (node: babel.Node): void => {\n if (node !== fn && babel.isFunction(node)) return;\n if (node.type === 'ReturnStatement') {\n if (node.argument && babel.isExpression(node.argument)) {\n returns.push(node.argument);\n }\n return;\n }\n for (const key of babel.VISITOR_KEYS[node.type] ?? []) {\n const child = (node as unknown as Record<string, unknown>)[key];\n if (Array.isArray(child)) {\n for (const entry of child) {\n if (entry && typeof entry === 'object' && 'type' in entry) {\n visit(entry as babel.Node);\n }\n }\n } else if (child && typeof child === 'object' && 'type' in child) {\n visit(child as babel.Node);\n }\n }\n };\n visit(fn);\n return returns;\n}\n\n/** Expands literal-only object spreads while preserving property write order. */\nfunction flattenTemplateLiteralObject(\n object: babel.ObjectExpression,\n seen: Set<babel.Node>\n): babel.ObjectExpression['properties'] | undefined {\n if (seen.has(object)) return undefined;\n const nextSeen = new Set(seen).add(object);\n const properties: babel.ObjectExpression['properties'] = [];\n for (const property of object.properties) {\n if (property.type !== 'SpreadElement') {\n properties.push(property);\n continue;\n }\n const argument = unwrapExpression(property.argument);\n if (argument?.type !== 'ObjectExpression') return undefined;\n const spread = flattenTemplateLiteralObject(argument, nextSeen);\n if (!spread) return undefined;\n properties.push(...spread);\n }\n return properties;\n}\n\n/** Resolves a literal object key without executing user code. */\nfunction readTemplateLiteralPropertyKey(\n property: babel.ObjectExpression['properties'][number],\n bindings: TemplateBindings,\n shadowed: Set<string>\n): string | undefined {\n if (property.type === 'SpreadElement') return undefined;\n if (!property.computed && property.key.type === 'Identifier') {\n return property.key.name;\n }\n if (property.key.type === 'StringLiteral') return property.key.value;\n if (property.key.type === 'NumericLiteral') return String(property.key.value);\n if (!property.computed) return undefined;\n const key = readTemplateStaticPrimitive(property.key, bindings, shadowed);\n return key.ok &&\n (typeof key.value === 'string' || typeof key.value === 'number')\n ? String(key.value)\n : undefined;\n}\n\n/** Collects exact component-bearing descendants exposed by script analysis. */\nfunction collectExposedContainerCandidates(\n path: string,\n bindings: TemplateBindings\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n const candidates = new Map<string, DynamicSelectorCandidate>();\n const componentFactories = new Set<string>();\n const containers: DynamicSelectorContainer[] = [];\n const gtComponentFactories = new Set<string>();\n const prefix = `${path}.`;\n const isImmediateChild = (name: string) => {\n if (!name.startsWith(prefix)) return false;\n const suffix = name.slice(prefix.length);\n return !suffix.includes('.');\n };\n const addExpression = (name: string) => {\n if (!isImmediateChild(name)) return;\n candidates.set(`expression:${name}`, { kind: 'expression', name });\n };\n\n for (const name of bindings.components.keys()) addExpression(name);\n for (const name of bindings.vueBuiltins.keys()) addExpression(name);\n for (const name of bindings.uncertainComponents) addExpression(name);\n for (const [name, value] of bindings.staticValues) {\n if (isImmediateChild(name) && typeof value === 'string') {\n candidates.set(`string:${value}`, { kind: 'string', name: value });\n }\n }\n for (const [name, values] of bindings.possibleStaticStrings) {\n if (!isImmediateChild(name)) continue;\n for (const value of values) {\n candidates.set(`string:${value}`, { kind: 'string', name: value });\n }\n }\n for (const name of bindings.componentFactories) {\n if (!isImmediateChild(name)) continue;\n componentFactories.add(name);\n addExpression(name);\n }\n for (const name of bindings.gtComponentFactories) {\n if (!isImmediateChild(name)) continue;\n gtComponentFactories.add(name);\n addExpression(name);\n }\n for (const [name] of bindings.containerKinds) {\n if (isImmediateChild(name)) containers.push({ kind: 'path', path: name });\n }\n const addNestedContainer = (\n name: string,\n requireNestedChild: boolean\n ): void => {\n if (!name.startsWith(prefix)) return;\n const suffix = name.slice(prefix.length);\n if (requireNestedChild && !suffix.includes('.')) return;\n const firstSegment = suffix.split('.', 1)[0];\n if (!firstSegment) return;\n const childPath = `${prefix}${firstSegment}`;\n if (\n !containers.some(\n (container) => container.kind === 'path' && container.path === childPath\n )\n ) {\n containers.push({ kind: 'path', path: childPath });\n }\n };\n for (const name of bindings.possibleGTContainers) {\n addNestedContainer(name, false);\n }\n for (const name of bindings.possibleStaticStrings.keys()) {\n addNestedContainer(name, true);\n }\n\n return {\n candidates: [...candidates.values()],\n componentFactories,\n containers,\n gtComponentFactories,\n possibleGT: findPossibleGTContainerPath(path, bindings) !== undefined,\n unknown: true,\n };\n}\n\n/** Returns whether selecting one direct child of a tainted path can yield T. */\nfunction templatePathSelectsPossibleGT(\n path: string,\n bindings: TemplateBindings\n): boolean {\n const separator = path.lastIndexOf('.');\n return (\n separator > 0 &&\n findPossibleGTContainerPath(path.slice(0, separator), bindings) !==\n undefined\n );\n}\n\n/** Finds an exact or wildcard tainted-container path. */\nfunction findPossibleGTContainerPath(\n path: string,\n bindings: TemplateBindings\n): string | undefined {\n if (bindings.possibleGTContainers.has(path)) return path;\n const wildcard = appendTemplatePath('', unknownTemplatePathSegment).slice(1);\n const recursiveSuffix = appendTemplatePath('', recursiveTemplatePathSegment);\n const segments = path.split('.');\n for (const candidate of bindings.possibleGTContainers) {\n if (candidate.endsWith(recursiveSuffix)) {\n const recursiveRoot = candidate.slice(0, -recursiveSuffix.length);\n if (path === recursiveRoot || path.startsWith(`${recursiveRoot}.`)) {\n return candidate;\n }\n }\n const candidateSegments = candidate.split('.');\n if (\n candidateSegments.length === segments.length &&\n candidateSegments.every(\n (segment, index) => segment === wildcard || segment === segments[index]\n )\n ) {\n return candidate;\n }\n }\n return undefined;\n}\n\n/** Returns whether one selected child contains a tainted container path. */\nfunction hasImmediatePossibleGTContainerChild(\n path: string,\n bindings: TemplateBindings\n): boolean {\n const prefix = `${path}.`;\n return [...bindings.possibleGTContainers].some((candidate) =>\n candidate.startsWith(prefix)\n );\n}\n\n/** Returns whether one selected child can expose a known selector string. */\nfunction hasPossibleStaticStringChild(\n path: string,\n bindings: TemplateBindings\n): boolean {\n const prefix = `${path}.`;\n return [...bindings.possibleStaticStrings].some(\n ([candidate, values]) => candidate.startsWith(prefix) && values.size > 0\n );\n}\n\n/** Selects through nested literal member chains in a template expression. */\nfunction selectTemplateStaticMemberExpression(\n node: babel.Node,\n key: string,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n seen: Set<babel.Node>\n): babel.Node | undefined {\n const expression = unwrapExpression(node);\n if (!expression || seen.has(expression)) return undefined;\n const nextSeen = new Set(seen).add(expression);\n if (\n expression.type === 'MemberExpression' ||\n expression.type === 'OptionalMemberExpression'\n ) {\n const parentKey = readStaticTemplateMemberProperty(\n expression,\n bindings,\n shadowed\n );\n const parent =\n parentKey === undefined\n ? undefined\n : selectTemplateStaticMemberExpression(\n expression.object,\n parentKey,\n bindings,\n shadowed,\n nextSeen\n );\n return parent\n ? selectTemplateStaticMemberExpression(\n parent,\n key,\n bindings,\n shadowed,\n nextSeen\n )\n : undefined;\n }\n return selectTemplateLiteralMember(expression, key);\n}\n\nfunction selectorAnalysisIsKnownComponent(\n analysis: Omit<DynamicSelectorAnalysis, 'displayName'>,\n bindings: TemplateBindings\n): boolean {\n return (\n !analysis.unknown &&\n analysis.componentFactories.size === 0 &&\n analysis.candidates.length > 0 &&\n analysis.candidates.every((candidate) =>\n [...normalizeTemplateBindingNames(candidate.name)].some((name) =>\n candidate.kind === 'string'\n ? bindings.registeredComponents.has(name) ||\n bindings.registeredVueBuiltins.has(name)\n : bindings.components.has(name) || bindings.vueBuiltins.has(name)\n )\n )\n );\n}\n\nfunction selectorCandidate(\n kind: DynamicSelectorCandidate['kind'],\n name: string\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n return {\n candidates: [{ kind, name }],\n componentFactories: new Set(),\n containers: [],\n gtComponentFactories: new Set(),\n possibleGT: false,\n unknown: false,\n };\n}\n\nfunction emptyDynamicSelectorAnalysis(\n unknown: boolean\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n return {\n candidates: [],\n componentFactories: new Set(),\n containers: [],\n gtComponentFactories: new Set(),\n possibleGT: false,\n unknown,\n };\n}\n\nfunction mergeDynamicSelectorAnalyses(\n analyses: Array<Omit<DynamicSelectorAnalysis, 'displayName'>>\n): Omit<DynamicSelectorAnalysis, 'displayName'> {\n const candidates = new Map<string, DynamicSelectorCandidate>();\n const componentFactories = new Set<string>();\n const containers: DynamicSelectorContainer[] = [];\n const containerPaths = new Set<string>();\n const literalContainers = new Set<babel.Node>();\n const abstractContainers = new Set<DynamicSelectorContainer>();\n const gtComponentFactories = new Set<string>();\n let possibleGT = false;\n let unknown = false;\n for (const analysis of analyses) {\n possibleGT ||= analysis.possibleGT;\n unknown ||= analysis.unknown;\n for (const candidate of analysis.candidates) {\n candidates.set(`${candidate.kind}:${candidate.name}`, candidate);\n }\n for (const name of analysis.componentFactories) {\n componentFactories.add(name);\n }\n for (const container of analysis.containers) {\n if (container.kind === 'path') {\n if (containerPaths.has(container.path)) continue;\n containerPaths.add(container.path);\n } else if (container.kind === 'literal') {\n if (literalContainers.has(container.node)) continue;\n literalContainers.add(container.node);\n } else {\n if (abstractContainers.has(container)) continue;\n abstractContainers.add(container);\n }\n containers.push(container);\n }\n for (const name of analysis.gtComponentFactories) {\n gtComponentFactories.add(name);\n }\n }\n return {\n candidates: [...candidates.values()],\n componentFactories,\n containers,\n gtComponentFactories,\n possibleGT,\n unknown,\n };\n}\n\n/** Selects a literal array/object member used directly in a template. */\nfunction selectTemplateLiteralMember(\n node: babel.Node,\n key: string\n): babel.Node | undefined {\n const expression = unwrapExpression(node);\n if (expression?.type === 'ArrayExpression') {\n const index = key.match(/^(0|[1-9]\\d*)$/) ? Number(key) : undefined;\n const elements = flattenTemplateLiteralArray(expression, new Set());\n return index === undefined ? undefined : elements?.[index];\n }\n if (expression?.type !== 'ObjectExpression') return undefined;\n const properties =\n flattenTemplateLiteralObject(expression, new Set()) ??\n expression.properties;\n let selected: babel.Node | undefined;\n let uncertainWriteAfterSelection = false;\n for (const property of properties) {\n if (property.type === 'SpreadElement') {\n uncertainWriteAfterSelection = true;\n continue;\n }\n const propertyKey =\n !property.computed && property.key.type === 'Identifier'\n ? property.key.name\n : property.key.type === 'StringLiteral'\n ? property.key.value\n : property.key.type === 'NumericLiteral'\n ? String(property.key.value)\n : undefined;\n if (propertyKey === undefined) {\n uncertainWriteAfterSelection = true;\n continue;\n }\n if (propertyKey === key) {\n selected =\n property.type === 'ObjectProperty' || property.type === 'ObjectMethod'\n ? property.type === 'ObjectProperty'\n ? property.value\n : property\n : undefined;\n uncertainWriteAfterSelection = false;\n }\n }\n return uncertainWriteAfterSelection ? undefined : selected;\n}\n\n/** Returns whether an unresolved literal member can be supplied by a spread. */\nfunction templateLiteralMemberIsUncertain(\n node: babel.ArrayExpression | babel.ObjectExpression,\n key: string\n): boolean {\n if (node.type === 'ArrayExpression') {\n return (\n /^(0|[1-9]\\d*)$/.test(key) &&\n flattenTemplateLiteralArray(node, new Set()) === undefined\n );\n }\n if (flattenTemplateLiteralObject(node, new Set())) return false;\n let uncertain = false;\n for (const property of node.properties) {\n if (property.type === 'SpreadElement') {\n uncertain = true;\n continue;\n }\n const propertyKey =\n !property.computed && property.key.type === 'Identifier'\n ? property.key.name\n : property.key.type === 'StringLiteral'\n ? property.key.value\n : property.key.type === 'NumericLiteral'\n ? String(property.key.value)\n : undefined;\n if (propertyKey === undefined) uncertain = true;\n else if (propertyKey === key) uncertain = false;\n }\n return uncertain;\n}\n\n/** Flattens array spreads only when every spread operand is another literal. */\nfunction flattenTemplateLiteralArray(\n array: babel.ArrayExpression,\n seen: Set<babel.Node>\n): Array<babel.Node | undefined> | undefined {\n if (seen.has(array)) return undefined;\n const nextSeen = new Set(seen).add(array);\n const elements: Array<babel.Node | undefined> = [];\n for (const element of array.elements) {\n if (!element) {\n elements.push(undefined);\n continue;\n }\n if (element.type !== 'SpreadElement') {\n elements.push(element);\n continue;\n }\n const argument = unwrapExpression(element.argument);\n if (argument?.type !== 'ArrayExpression') return undefined;\n const spread = flattenTemplateLiteralArray(argument, nextSeen);\n if (!spread) return undefined;\n elements.push(...spread);\n }\n return elements;\n}\n\n/** Resolves a computed member key from literals or exposed static bindings. */\nfunction readStaticTemplateMemberProperty(\n node: babel.MemberExpression | babel.OptionalMemberExpression,\n bindings: TemplateBindings,\n shadowed: Set<string>\n): string | undefined {\n if (!node.computed && node.property.type === 'Identifier') {\n return node.property.name;\n }\n if (!node.computed) return undefined;\n const property = readTemplateStaticPrimitive(\n node.property,\n bindings,\n shadowed\n );\n return property.ok &&\n (typeof property.value === 'string' || typeof property.value === 'number')\n ? String(property.value)\n : undefined;\n}\n\nfunction readTemplateStaticPrimitive(\n node: babel.Node,\n bindings: TemplateBindings,\n shadowed: Set<string>,\n allowNumericGlobals = false\n) {\n return readStaticPrimitive(node, (identifier) => {\n if (shadowed.has(identifier.name)) {\n return { ok: false };\n }\n if (bindings.staticValues.has(identifier.name)) {\n return { ok: true, value: bindings.staticValues.get(identifier.name)! };\n }\n if (\n allowNumericGlobals &&\n !bindings.directBindings.has(identifier.name) &&\n identifier.name === 'Infinity'\n ) {\n return { ok: true, value: Number.POSITIVE_INFINITY };\n }\n if (\n allowNumericGlobals &&\n !bindings.directBindings.has(identifier.name) &&\n identifier.name === 'NaN'\n ) {\n return { ok: true, value: Number.NaN };\n }\n return { ok: false };\n });\n}\n\n/** Reads a dotted template member chain without evaluating runtime code. */\nfunction readStaticTemplateMemberPath(\n node: babel.Node | undefined,\n bindings: TemplateBindings,\n shadowed: Set<string>\n): string | undefined {\n const expression = unwrapExpression(node);\n if (!expression) return undefined;\n if (expression.type === 'Identifier') {\n return shadowed.has(expression.name) ? undefined : expression.name;\n }\n if (\n expression.type !== 'MemberExpression' &&\n expression.type !== 'OptionalMemberExpression'\n ) {\n return undefined;\n }\n const object = readStaticTemplateMemberPath(\n expression.object,\n bindings,\n shadowed\n );\n const property = readStaticTemplateMemberProperty(\n expression,\n bindings,\n shadowed\n );\n return object && property !== undefined\n ? appendTemplatePath(object, property)\n : undefined;\n}\n\n/** Identifies the selector prop that Vue consumes for `<component>`. */\nfunction isDynamicComponentSelector(\n element: ElementNode,\n property: ElementNode['props'][number]\n): boolean {\n if (element.tag.toLowerCase() !== 'component') return false;\n if (property.type === NodeTypes.ATTRIBUTE) return property.name === 'is';\n return property.name === 'bind' && readDirectiveKey(property) === 'is';\n}\n\nfunction readDirectiveKey(directive: DirectiveNode): string | undefined {\n return directive.arg?.type === NodeTypes.SIMPLE_EXPRESSION &&\n directive.arg.isStatic\n ? directive.arg.content\n : undefined;\n}\n\nfunction toDisplayString(value: StaticPrimitive): string {\n return value == null ? '' : String(value);\n}\n\nfunction appendSerializedChild(result: JsxChild[], value: JsxChild): void {\n const previous = result[result.length - 1];\n if (typeof previous === 'string' && typeof value === 'string') {\n result[result.length - 1] = previous + value;\n } else {\n result.push(value);\n }\n}\n\nfunction collapseChildren(children: JsxChild[]): JsxChildren {\n return children.length === 1 ? children[0] : children;\n}\n\nfunction unionSets(first: Set<string>, second: Set<string>): Set<string> {\n return second.size === 0 ? first : new Set([...first, ...second]);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Internal segment reserved for an unresolved object key. */
|
|
2
|
+
export declare const unknownTemplatePathSegment = "%GT_UNKNOWN%";
|
|
3
|
+
/** Internal segment marking a GT-bearing identity reachable through a cycle. */
|
|
4
|
+
export declare const recursiveTemplatePathSegment = "%GT_RECURSIVE%";
|
|
5
|
+
/**
|
|
6
|
+
* Appends one property to a flattened template-binding path.
|
|
7
|
+
*
|
|
8
|
+
* Dots delimit JavaScript member segments internally, so literal dots and
|
|
9
|
+
* percent escapes in property names must be encoded before concatenation.
|
|
10
|
+
* This keeps `value.a.b` distinct from `value['a.b']`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function appendTemplatePath(path: string, property: string): string;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/internal/templatePath.ts
|
|
2
|
+
/** Internal segment reserved for an unresolved object key. */
|
|
3
|
+
const unknownTemplatePathSegment = "%GT_UNKNOWN%";
|
|
4
|
+
/** Internal segment marking a GT-bearing identity reachable through a cycle. */
|
|
5
|
+
const recursiveTemplatePathSegment = "%GT_RECURSIVE%";
|
|
6
|
+
/**
|
|
7
|
+
* Appends one property to a flattened template-binding path.
|
|
8
|
+
*
|
|
9
|
+
* Dots delimit JavaScript member segments internally, so literal dots and
|
|
10
|
+
* percent escapes in property names must be encoded before concatenation.
|
|
11
|
+
* This keeps `value.a.b` distinct from `value['a.b']`.
|
|
12
|
+
*/
|
|
13
|
+
function appendTemplatePath(path, property) {
|
|
14
|
+
return `${path}.${encodeTemplatePathSegment(property)}`;
|
|
15
|
+
}
|
|
16
|
+
/** Encodes the only characters that can collide with the path wire format. */
|
|
17
|
+
function encodeTemplatePathSegment(segment) {
|
|
18
|
+
return segment.replace(/%/g, "%25").replace(/\./g, "%2E");
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { appendTemplatePath, recursiveTemplatePathSegment, unknownTemplatePathSegment };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=templatePath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templatePath.js","names":[],"sources":["../../src/internal/templatePath.ts"],"sourcesContent":["/** Internal segment reserved for an unresolved object key. */\nexport const unknownTemplatePathSegment = '%GT_UNKNOWN%';\n\n/** Internal segment marking a GT-bearing identity reachable through a cycle. */\nexport const recursiveTemplatePathSegment = '%GT_RECURSIVE%';\n\n/**\n * Appends one property to a flattened template-binding path.\n *\n * Dots delimit JavaScript member segments internally, so literal dots and\n * percent escapes in property names must be encoded before concatenation.\n * This keeps `value.a.b` distinct from `value['a.b']`.\n */\nexport function appendTemplatePath(path: string, property: string): string {\n return `${path}.${encodeTemplatePathSegment(property)}`;\n}\n\n/** Encodes the only characters that can collide with the path wire format. */\nfunction encodeTemplatePathSegment(segment: string): string {\n return segment.replace(/%/g, '%25').replace(/\\./g, '%2E');\n}\n"],"mappings":";;AACA,MAAa,6BAA6B;;AAG1C,MAAa,+BAA+B;;;;;;;;AAS5C,SAAgB,mBAAmB,MAAc,UAA0B;AACzE,QAAO,GAAG,KAAK,GAAG,0BAA0B,SAAS;;;AAIvD,SAAS,0BAA0B,SAAyB;AAC1D,QAAO,QAAQ,QAAQ,MAAM,MAAM,CAAC,QAAQ,OAAO,MAAM"}
|