@generaltranslation/compiler 1.3.27 → 1.3.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/config.d.ts +12 -7
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +61 -6
  7. package/dist/index.js.map +1 -1
  8. package/dist/passes/basePass.d.ts.map +1 -1
  9. package/dist/passes/basePass.js +9 -10
  10. package/dist/passes/basePass.js.map +1 -1
  11. package/dist/processing/collection/processCallExpression.js +8 -6
  12. package/dist/processing/collection/processCallExpression.js.map +1 -1
  13. package/dist/processing/collection/processTaggedTemplateExpression.d.ts +1 -1
  14. package/dist/processing/collection/processTaggedTemplateExpression.js +1 -1
  15. package/dist/processing/collection/processTaggedTemplateExpression.js.map +1 -1
  16. package/dist/processing/jsx-insertion/processCallExpression.js.map +1 -1
  17. package/dist/processing/jsx-insertion/processProgram.d.ts.map +1 -1
  18. package/dist/processing/jsx-insertion/processProgram.js +1 -1
  19. package/dist/processing/jsx-insertion/processProgram.js.map +1 -1
  20. package/dist/processing/macro-expansion/processProgram.js +1 -1
  21. package/dist/processing/macro-expansion/processProgram.js.map +1 -1
  22. package/dist/processing/macro-expansion/processTaggedTemplateExpression.d.ts +1 -1
  23. package/dist/processing/macro-expansion/processTaggedTemplateExpression.js +1 -1
  24. package/dist/processing/macro-expansion/processTaggedTemplateExpression.js.map +1 -1
  25. package/dist/processing/processFunctionDeclaration.js +1 -1
  26. package/dist/processing/processFunctionExpression.js +1 -1
  27. package/dist/processing/runtime-translate/processProgram.d.ts.map +1 -1
  28. package/dist/processing/runtime-translate/processProgram.js +2 -1
  29. package/dist/processing/runtime-translate/processProgram.js.map +1 -1
  30. package/dist/state/StringCollector.d.ts +3 -3
  31. package/dist/state/StringCollector.d.ts.map +1 -1
  32. package/dist/state/StringCollector.js.map +1 -1
  33. package/dist/state/utils/initializeState.d.ts.map +1 -1
  34. package/dist/state/utils/initializeState.js +8 -5
  35. package/dist/state/utils/initializeState.js.map +1 -1
  36. package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.d.ts +1 -1
  37. package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.js +6 -5
  38. package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.js.map +1 -1
  39. package/dist/transform/injection/injectHashIntoTranslationOptions.d.ts.map +1 -1
  40. package/dist/transform/injection/injectHashIntoTranslationOptions.js +1 -0
  41. package/dist/transform/injection/injectHashIntoTranslationOptions.js.map +1 -1
  42. package/dist/transform/injection/injectTComponentParameters.d.ts.map +1 -1
  43. package/dist/transform/injection/injectTComponentParameters.js +2 -1
  44. package/dist/transform/injection/injectTComponentParameters.js.map +1 -1
  45. package/dist/transform/jsx-children/constructJsxChildren.d.ts +1 -0
  46. package/dist/transform/jsx-children/constructJsxChildren.d.ts.map +1 -1
  47. package/dist/transform/jsx-children/constructJsxChildren.js +17 -5
  48. package/dist/transform/jsx-children/constructJsxChildren.js.map +1 -1
  49. package/dist/transform/jsx-insertion/injectJsxInsertionImport.d.ts +2 -2
  50. package/dist/transform/jsx-insertion/injectJsxInsertionImport.d.ts.map +1 -1
  51. package/dist/transform/jsx-insertion/injectJsxInsertionImport.js +4 -3
  52. package/dist/transform/jsx-insertion/injectJsxInsertionImport.js.map +1 -1
  53. package/dist/transform/macro-expansion/injectMacroImport.d.ts +2 -2
  54. package/dist/transform/macro-expansion/injectMacroImport.d.ts.map +1 -1
  55. package/dist/transform/macro-expansion/injectMacroImport.js +4 -3
  56. package/dist/transform/macro-expansion/injectMacroImport.js.map +1 -1
  57. package/dist/transform/registration/callbacks/registerUseGTCallback.d.ts.map +1 -1
  58. package/dist/transform/registration/callbacks/registerUseGTCallback.js +0 -1
  59. package/dist/transform/registration/callbacks/registerUseGTCallback.js.map +1 -1
  60. package/dist/transform/registration/registerStandaloneTranslation.d.ts.map +1 -1
  61. package/dist/transform/registration/registerStandaloneTranslation.js +0 -1
  62. package/dist/transform/registration/registerStandaloneTranslation.js.map +1 -1
  63. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.d.ts +3 -2
  64. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.d.ts.map +1 -1
  65. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.js +4 -3
  66. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.js.map +1 -1
  67. package/dist/transform/validation/validateTranslationComponentArgs.d.ts +2 -0
  68. package/dist/transform/validation/validateTranslationComponentArgs.d.ts.map +1 -1
  69. package/dist/transform/validation/validateTranslationComponentArgs.js +4 -3
  70. package/dist/transform/validation/validateTranslationComponentArgs.js.map +1 -1
  71. package/dist/transform/validation/validateTranslationFunction.d.ts.map +1 -1
  72. package/dist/transform/validation/validateTranslationFunction.js +3 -3
  73. package/dist/transform/validation/validateTranslationFunction.js.map +1 -1
  74. package/dist/utils/calculateHash.d.ts +1 -2
  75. package/dist/utils/calculateHash.d.ts.map +1 -1
  76. package/dist/utils/calculateHash.js +1 -3
  77. package/dist/utils/calculateHash.js.map +1 -1
  78. package/dist/utils/constants/gt/constants.d.ts +1 -5
  79. package/dist/utils/constants/gt/constants.d.ts.map +1 -1
  80. package/dist/utils/constants/gt/constants.js +1 -5
  81. package/dist/utils/constants/gt/constants.js.map +1 -1
  82. package/dist/utils/constants/gt/helpers.d.ts +2 -1
  83. package/dist/utils/constants/gt/helpers.d.ts.map +1 -1
  84. package/dist/utils/constants/gt/helpers.js +15 -5
  85. package/dist/utils/constants/gt/helpers.js.map +1 -1
  86. package/dist/utils/constants/resolveIdentifier/isGTComponent.d.ts +1 -1
  87. package/dist/utils/constants/resolveIdentifier/isGTComponent.d.ts.map +1 -1
  88. package/dist/utils/constants/resolveIdentifier/isGTComponent.js +2 -3
  89. package/dist/utils/constants/resolveIdentifier/isGTComponent.js.map +1 -1
  90. package/dist/utils/parsing/isStringTranslationTaggedTemplate.d.ts +1 -1
  91. package/dist/utils/parsing/isStringTranslationTaggedTemplate.js +3 -3
  92. package/dist/utils/parsing/isStringTranslationTaggedTemplate.js.map +1 -1
  93. package/package.json +3 -3
  94. package/dist/processing/index.d.ts +0 -15
  95. package/dist/processing/index.d.ts.map +0 -1
  96. package/dist/processing/index.js +0 -29
  97. package/dist/transform/jsx-children/index.d.ts +0 -2
  98. package/dist/transform/jsx-children/index.d.ts.map +0 -1
  99. package/dist/transform/jsx-children/index.js +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"processCallExpression.js","names":["isReactJsxFunction","isUserVariableComponent","isUserTranslationComponent","resolveFirstArgGTName","isGTBranchComponent","isGTDeriveComponent","t","BRANCH_CONTROL_PROPS","PLURAL_CONTROL_PROPS"],"sources":["../../../src/processing/jsx-insertion/processCallExpression.ts"],"sourcesContent":["import { VisitNode, NodePath } from '@babel/traverse';\nimport { TransformState } from '../../state/types';\nimport * as t from '@babel/types';\nimport {\n GT_COMPONENT_TYPES,\n BRANCH_CONTROL_PROPS,\n PLURAL_CONTROL_PROPS,\n} from '../../utils/constants/gt/constants';\nimport { OTHER_IDENTIFIERS_ENUM } from '../../utils/constants/other/constants';\nimport { REACT_FUNTIONS } from '../../utils/constants/react/constants';\nimport { isReactJsxFunction } from '../../utils/constants/resolveIdentifier/isReactJsxFunction';\nimport {\n resolveFirstArgGTName,\n isUserTranslationComponent,\n isUserVariableComponent,\n isGTBranchComponent,\n isGTDeriveComponent,\n} from '../../utils/constants/resolveIdentifier/isGTComponent';\nimport { JsxCalleeInfo } from './processImportDeclaration';\n\n/**\n * Extended state for the JSX insertion pass.\n * Bundles the base TransformState with insertion-specific context.\n */\ninterface JsxInsertionState extends TransformState {\n processedNodes: WeakSet<t.Node>;\n calleeInfo: JsxCalleeInfo;\n /** Depth counter: when > 0, we are inside a user Var/Num/Currency/DateTime — skip all transforms */\n insideUserVarDepth: number;\n}\n\n/**\n * Babel visitor entry point for the JSX insertion pass.\n *\n * All internal functions use NodePath-based traversal via .get() so that\n * Babel binding lookups (scope.getBinding) work correctly at every depth.\n * This handles aliased imports like `import { jsxDEV as _jsxDEV }`.\n */\nexport function processCallExpression(\n state: TransformState,\n calleeInfo: JsxCalleeInfo\n): VisitNode<t.Node, t.CallExpression> {\n const jsxState: JsxInsertionState = {\n ...state,\n processedNodes: new WeakSet<t.Node>(),\n calleeInfo,\n insideUserVarDepth: 0,\n };\n\n return {\n enter: (path) => {\n // Check jsx callee first — needed for both user Var detection and processing\n const calleePath = path.get('callee');\n if (\n (!calleePath.isIdentifier() && !calleePath.isMemberExpression()) ||\n !isReactJsxFunction(calleePath)\n ) {\n return;\n }\n\n // Check if this is a user Var/Num/Currency/DateTime — suppress transforms inside.\n // This must happen BEFORE the processedNodes check, because user T's\n // markDescendantJsxCalls may have already added the Var call to processedNodes,\n // but we still need to increment the depth counter so children are suppressed.\n const firstArg = path.get('arguments')[0];\n if (firstArg?.isExpression() && isUserVariableComponent(firstArg)) {\n jsxState.insideUserVarDepth++;\n return;\n }\n\n // Skip all processing when inside a user variable component\n if (jsxState.insideUserVarDepth > 0) return;\n\n if (jsxState.processedNodes.has(path.node)) return;\n\n processJsxNode({ path, insideAutoT: false, state: jsxState });\n },\n exit: (path) => {\n // Decrement depth when exiting a user Var/Num/Currency/DateTime\n const calleePath = path.get('callee');\n if (\n (!calleePath.isIdentifier() && !calleePath.isMemberExpression()) ||\n !isReactJsxFunction(calleePath)\n ) {\n return;\n }\n const firstArg = path.get('arguments')[0];\n if (firstArg?.isExpression() && isUserVariableComponent(firstArg)) {\n jsxState.insideUserVarDepth--;\n }\n },\n };\n}\n\n// ===== Core recursive function =====\n\nfunction processJsxNode({\n path,\n insideAutoT,\n state,\n}: {\n path: NodePath<t.CallExpression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n state.processedNodes.add(path.node);\n\n const firstArgPath = path.get('arguments')[0];\n if (!firstArgPath?.isExpression()) return;\n\n // User T → mark all descendant jsx calls as processed, hands off\n if (isUserTranslationComponent(firstArgPath)) {\n markDescendantJsxCalls({ jsxCallPath: path, state });\n return;\n }\n\n // User Var/Num/Currency/DateTime → mark descendants, hands off\n if (isUserVariableComponent(firstArgPath)) {\n markDescendantJsxCalls({ jsxCallPath: path, state });\n return;\n }\n\n // Already auto-inserted → skip\n const gtName = resolveFirstArgGTName(firstArgPath);\n if (\n gtName === GT_COMPONENT_TYPES.GtInternalTranslateJsx ||\n gtName === GT_COMPONENT_TYPES.GtInternalVar\n ) {\n return;\n }\n\n // Branch/Plural/Derive/Static → opaque for static JSX, dynamic props get _Var\n if (isGTBranchComponent(firstArgPath) || isGTDeriveComponent(firstArgPath)) {\n // Process props BEFORE wrapping — path still points to the opaque component\n processOpaqueComponentProps({\n jsxCallPath: path,\n insideAutoT: !insideAutoT ? true : insideAutoT,\n state,\n });\n if (!insideAutoT) {\n // Root-level opaque component — wrap in _T (single child → use singleCallee)\n const callee =\n state.calleeInfo.singleCallee ??\n state.calleeInfo.multiCallee ??\n REACT_FUNTIONS.jsx;\n const tWrapped = wrapInT(\n path.node,\n t.identifier(callee),\n state.calleeInfo\n );\n state.processedNodes.add(tWrapped);\n path.replaceWith(tWrapped);\n state.statistics.jsxInsertionsCount++;\n }\n return;\n }\n\n // --- Get children prop path ---\n const childrenPropPath = getChildrenPropPath(path);\n if (!childrenPropPath) return;\n\n const childrenPath = childrenPropPath.get('value');\n if (!childrenPath.isExpression()) return;\n\n // --- Determine if this level should claim T ---\n const shouldClaimT =\n !insideAutoT &&\n (hasNonWhitespaceText(childrenPath) || hasOpaqueGTChild(childrenPath));\n\n if (shouldClaimT) {\n processChildren({ childrenPath, insideAutoT: true, state });\n const currentChildren = childrenPropPath.get('value').node;\n const tCallee = t.isArrayExpression(currentChildren)\n ? state.calleeInfo.multiCallee\n : state.calleeInfo.singleCallee;\n const tWrapped = wrapInT(\n currentChildren as t.Expression,\n t.identifier(tCallee ?? 'jsx'),\n state.calleeInfo\n );\n state.processedNodes.add(tWrapped);\n childrenPropPath.get('value').replaceWith(tWrapped);\n updateCalleeToSingle({ jsxCallPath: path, state });\n state.statistics.jsxInsertionsCount++;\n } else if (insideAutoT) {\n processChildren({ childrenPath, insideAutoT: true, state });\n } else {\n recurseChildJsxCalls({ childrenPath, insideAutoT: false, state });\n }\n}\n\n// ===== Children processing ===== //\n\nfunction processChildren({\n childrenPath,\n insideAutoT,\n state,\n}: {\n childrenPath: NodePath<t.Expression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n if (childrenPath.isArrayExpression()) {\n for (const elPath of childrenPath.get('elements')) {\n if (elPath.isExpression()) {\n processSingleChild({ childPath: elPath, insideAutoT, state });\n }\n }\n return;\n }\n processSingleChild({ childPath: childrenPath, insideAutoT, state });\n}\n\nfunction processSingleChild({\n childPath,\n insideAutoT,\n state,\n}: {\n childPath: NodePath<t.Expression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n if (childPath.isCallExpression() && isJsxCallPath(childPath)) {\n processJsxNode({ path: childPath, insideAutoT, state });\n return;\n }\n\n // _Var always has a single child → use singleCallee\n if (insideAutoT && needsVarWrapping(childPath)) {\n const callee = state.calleeInfo.singleCallee ?? REACT_FUNTIONS.jsx;\n const wrapped = wrapInVar(\n childPath.node,\n t.identifier(callee),\n state.calleeInfo\n );\n state.processedNodes.add(wrapped);\n childPath.replaceWith(wrapped);\n }\n}\n\nfunction recurseChildJsxCalls({\n childrenPath,\n insideAutoT,\n state,\n}: {\n childrenPath: NodePath<t.Expression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n if (childrenPath.isArrayExpression()) {\n for (const elPath of childrenPath.get('elements')) {\n if (elPath.isCallExpression() && isJsxCallPath(elPath)) {\n processJsxNode({ path: elPath, insideAutoT, state });\n }\n }\n } else if (childrenPath.isCallExpression() && isJsxCallPath(childrenPath)) {\n processJsxNode({ path: childrenPath, insideAutoT, state });\n }\n}\n\n// ===== Helper functions =====\n\nfunction getChildrenPropPath(\n jsxCallPath: NodePath<t.CallExpression>\n): NodePath<t.ObjectProperty> | undefined {\n const args = jsxCallPath.get('arguments');\n const propsArg = args[1];\n if (!propsArg?.isObjectExpression()) return undefined;\n\n for (const propPath of propsArg.get('properties')) {\n if (\n propPath.isObjectProperty() &&\n t.isIdentifier(propPath.node.key, { name: 'children' })\n ) {\n return propPath;\n }\n }\n return undefined;\n}\n\nfunction isJsxCallPath(callPath: NodePath<t.CallExpression>): boolean {\n const callee = callPath.get('callee');\n if (!callee.isIdentifier() && !callee.isMemberExpression()) return false;\n return isReactJsxFunction(callee);\n}\n\nfunction hasNonWhitespaceText(childrenPath: NodePath<t.Expression>): boolean {\n const isText = (p: NodePath): boolean => {\n if (p.isStringLiteral()) return p.node.value.trim().length > 0;\n if (p.isTemplateLiteral()) {\n return (\n p.node.expressions.length === 0 &&\n (p.node.quasis[0]?.value.cooked ?? '').trim().length > 0\n );\n }\n return false;\n };\n\n if (childrenPath.isArrayExpression()) {\n return childrenPath\n .get('elements')\n .some((el) => el.isExpression() && isText(el));\n }\n return isText(childrenPath);\n}\n\nfunction hasOpaqueGTChild(childrenPath: NodePath<t.Expression>): boolean {\n const isOpaque = (elPath: NodePath): boolean => {\n if (!elPath.isCallExpression() || !isJsxCallPath(elPath)) return false;\n const firstArg = elPath.get('arguments')[0];\n if (!firstArg?.isExpression()) return false;\n return isGTBranchComponent(firstArg) || isGTDeriveComponent(firstArg);\n };\n\n if (childrenPath.isArrayExpression()) {\n return childrenPath\n .get('elements')\n .some((el) => el.isExpression() && isOpaque(el));\n }\n return isOpaque(childrenPath);\n}\n\nfunction needsVarWrapping(exprPath: NodePath<t.Expression>): boolean {\n if (exprPath.isStringLiteral()) return false;\n if (exprPath.isNumericLiteral()) return false;\n if (exprPath.isBooleanLiteral()) return false;\n if (exprPath.isNullLiteral()) return false;\n if (exprPath.isTemplateLiteral() && exprPath.node.expressions.length === 0) {\n return false;\n }\n if (\n exprPath.isUnaryExpression() &&\n exprPath.node.operator === '-' &&\n t.isNumericLiteral(exprPath.node.argument)\n ) {\n return false;\n }\n if (exprPath.isIdentifier()) {\n return ![\n OTHER_IDENTIFIERS_ENUM.UNDEFINED,\n OTHER_IDENTIFIERS_ENUM.NAN,\n OTHER_IDENTIFIERS_ENUM.INFINITY,\n ].includes(exprPath.node.name as OTHER_IDENTIFIERS_ENUM);\n }\n if (exprPath.isCallExpression() && isJsxCallPath(exprPath)) {\n return false;\n }\n return true;\n}\n\n/**\n * After wrapping children in _T, the parent now has a single child.\n * Update its callee from jsxs → jsx if needed.\n */\nfunction updateCalleeToSingle({\n jsxCallPath,\n state,\n}: {\n jsxCallPath: NodePath<t.CallExpression>;\n state: JsxInsertionState;\n}): void {\n const { singleCallee, multiCallee } = state.calleeInfo;\n\n // Production (jsx/jsxs): update callee name jsxs → jsx\n if (singleCallee && multiCallee && singleCallee !== multiCallee) {\n const callee = jsxCallPath.get('callee');\n if (callee.isIdentifier() && callee.node.name === multiCallee) {\n callee.node.name = singleCallee;\n }\n }\n\n // Dev (jsxDEV): update isStaticChildren (4th arg, index 3) to false\n const args = jsxCallPath.get('arguments');\n const isStaticArg = args[3];\n if (isStaticArg?.isBooleanLiteral({ value: true })) {\n isStaticArg.replaceWith(t.booleanLiteral(false));\n }\n}\n\n// ===== AST construction =====\n\nfunction wrapInVar(\n expr: t.Expression,\n callee: t.Expression,\n calleeInfo: JsxCalleeInfo\n): t.CallExpression {\n const args: t.Expression[] = [\n t.identifier(GT_COMPONENT_TYPES.GtInternalVar),\n t.objectExpression([t.objectProperty(t.identifier('children'), expr)]),\n ];\n if (isDevMode(calleeInfo)) {\n args.push(\n t.unaryExpression('void', t.numericLiteral(0)),\n t.booleanLiteral(false)\n );\n }\n return t.callExpression(t.cloneNode(callee), args);\n}\n\nfunction wrapInT(\n children: t.Expression,\n callee: t.Expression,\n calleeInfo: JsxCalleeInfo\n): t.CallExpression {\n const args: t.Expression[] = [\n t.identifier(GT_COMPONENT_TYPES.GtInternalTranslateJsx),\n t.objectExpression([t.objectProperty(t.identifier('children'), children)]),\n ];\n if (isDevMode(calleeInfo)) {\n args.push(\n t.unaryExpression('void', t.numericLiteral(0)),\n t.booleanLiteral(t.isArrayExpression(children))\n );\n }\n return t.callExpression(t.cloneNode(callee), args);\n}\n\nfunction isDevMode(calleeInfo: JsxCalleeInfo): boolean {\n return (\n calleeInfo.singleCallee != null &&\n calleeInfo.singleCallee === calleeInfo.multiCallee\n );\n}\n\n// ===== Marking descendants as processed =====\n\nfunction markDescendantJsxCalls({\n jsxCallPath,\n state,\n}: {\n jsxCallPath: NodePath<t.CallExpression>;\n state: JsxInsertionState;\n}): void {\n const childrenPropPath = getChildrenPropPath(jsxCallPath);\n if (!childrenPropPath) return;\n const valuePath = childrenPropPath.get('value');\n if (valuePath.isExpression()) {\n walkAndMark({ exprPath: valuePath, state });\n }\n}\n\nfunction processOpaqueComponentProps({\n jsxCallPath,\n insideAutoT,\n state,\n}: {\n jsxCallPath: NodePath<t.CallExpression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n const args = jsxCallPath.get('arguments');\n const propsArg = args[1];\n if (!propsArg?.isObjectExpression()) return;\n\n // Resolve component type to filter control props\n const firstArgPath = args[0];\n const gtName = firstArgPath?.isExpression()\n ? resolveFirstArgGTName(firstArgPath)\n : null;\n\n for (const propPath of propsArg.get('properties')) {\n if (!propPath.isObjectProperty()) continue;\n\n // Determine prop name and skip control props\n const key = propPath.node.key;\n const propName = t.isIdentifier(key)\n ? key.name\n : t.isStringLiteral(key)\n ? key.value\n : null;\n if (isControlProp(gtName, propName)) continue;\n\n const valuePath = propPath.get('value');\n if (!valuePath.isExpression()) continue;\n\n // children is fallback content for Branch/Plural — process element-by-element\n // For Derive/Static, children is opaque — skip entirely\n if (propName === 'children') {\n if (\n insideAutoT &&\n (gtName === GT_COMPONENT_TYPES.Branch ||\n gtName === GT_COMPONENT_TYPES.Plural)\n ) {\n processChildren({ childrenPath: valuePath, insideAutoT: true, state });\n }\n continue;\n }\n\n if (valuePath.isCallExpression() && isJsxCallPath(valuePath)) {\n // Content prop with JSX value — recurse into children for Var-wrapping\n if (insideAutoT) {\n const childrenPropPath = getChildrenPropPath(valuePath);\n if (childrenPropPath) {\n const childrenPath = childrenPropPath.get('value');\n if (childrenPath.isExpression()) {\n processChildren({ childrenPath, insideAutoT: true, state });\n }\n }\n }\n state.processedNodes.add(valuePath.node);\n walkAndMark({ exprPath: valuePath, state });\n } else if (insideAutoT && needsVarWrapping(valuePath)) {\n const callee = state.calleeInfo.singleCallee ?? REACT_FUNTIONS.jsx;\n const wrapped = wrapInVar(\n valuePath.node,\n t.identifier(callee),\n state.calleeInfo\n );\n state.processedNodes.add(wrapped);\n valuePath.replaceWith(wrapped);\n }\n }\n}\n\nfunction isControlProp(\n gtName: string | null,\n propName: string | null\n): boolean {\n if (!propName) return false;\n if (gtName === GT_COMPONENT_TYPES.Branch) {\n return BRANCH_CONTROL_PROPS.has(propName) || propName.startsWith('data-');\n }\n if (gtName === GT_COMPONENT_TYPES.Plural) {\n return PLURAL_CONTROL_PROPS.has(propName);\n }\n return false;\n}\n\nfunction walkAndMark({\n exprPath,\n state,\n}: {\n exprPath: NodePath<t.Expression>;\n state: JsxInsertionState;\n}): void {\n if (exprPath.isCallExpression() && isJsxCallPath(exprPath)) {\n state.processedNodes.add(exprPath.node);\n const childrenPropPath = getChildrenPropPath(exprPath);\n if (childrenPropPath) {\n const valuePath = childrenPropPath.get('value');\n if (valuePath.isExpression()) {\n walkAndMark({ exprPath: valuePath, state });\n }\n }\n } else if (exprPath.isArrayExpression()) {\n for (const elPath of exprPath.get('elements')) {\n if (elPath.isExpression()) {\n walkAndMark({ exprPath: elPath, state });\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"processCallExpression.js","names":["isReactJsxFunction","isUserVariableComponent","isUserTranslationComponent","resolveFirstArgGTName","isGTBranchComponent","isGTDeriveComponent","t","BRANCH_CONTROL_PROPS","PLURAL_CONTROL_PROPS"],"sources":["../../../src/processing/jsx-insertion/processCallExpression.ts"],"sourcesContent":["import { VisitNode, NodePath } from '@babel/traverse';\nimport { TransformState } from '../../state/types';\nimport * as t from '@babel/types';\nimport {\n GT_COMPONENT_TYPES,\n BRANCH_CONTROL_PROPS,\n PLURAL_CONTROL_PROPS,\n} from '../../utils/constants/gt/constants';\nimport { OTHER_IDENTIFIERS_ENUM } from '../../utils/constants/other/constants';\nimport { REACT_FUNTIONS } from '../../utils/constants/react/constants';\nimport { isReactJsxFunction } from '../../utils/constants/resolveIdentifier/isReactJsxFunction';\nimport {\n resolveFirstArgGTName,\n isUserTranslationComponent,\n isUserVariableComponent,\n isGTBranchComponent,\n isGTDeriveComponent,\n} from '../../utils/constants/resolveIdentifier/isGTComponent';\nimport { JsxCalleeInfo } from './processImportDeclaration';\n\n/**\n * Extended state for the JSX insertion pass.\n * Bundles the base TransformState with insertion-specific context.\n */\ninterface JsxInsertionState extends TransformState {\n processedNodes: WeakSet<t.Node>;\n calleeInfo: JsxCalleeInfo;\n /** Depth counter: when > 0, we are inside a user Var/Num/Currency/DateTime — skip all transforms */\n insideUserVarDepth: number;\n}\n\n/**\n * Babel visitor entry point for the JSX insertion pass.\n *\n * All internal functions use NodePath-based traversal via .get() so that\n * Babel binding lookups (scope.getBinding) work correctly at every depth.\n * This handles aliased imports like `import { jsxDEV as _jsxDEV }`.\n */\nexport function processCallExpression(\n state: TransformState,\n calleeInfo: JsxCalleeInfo\n): VisitNode<t.Node, t.CallExpression> {\n const jsxState: JsxInsertionState = {\n ...state,\n processedNodes: new WeakSet<t.Node>(),\n calleeInfo,\n insideUserVarDepth: 0,\n };\n\n return {\n enter: (path) => {\n // Check jsx callee first — needed for both user Var detection and processing\n const calleePath = path.get('callee');\n if (\n (!calleePath.isIdentifier() && !calleePath.isMemberExpression()) ||\n !isReactJsxFunction(calleePath)\n ) {\n return;\n }\n\n // Check if this is a user Var/Num/Currency/DateTime — suppress transforms inside.\n // This must happen BEFORE the processedNodes check, because user T's\n // markDescendantJsxCalls may have already added the Var call to processedNodes,\n // but we still need to increment the depth counter so children are suppressed.\n const firstArg = path.get('arguments')[0];\n if (firstArg?.isExpression() && isUserVariableComponent(firstArg)) {\n jsxState.insideUserVarDepth++;\n return;\n }\n\n // Skip all processing when inside a user variable component\n if (jsxState.insideUserVarDepth > 0) return;\n\n if (jsxState.processedNodes.has(path.node)) return;\n\n processJsxNode({ path, insideAutoT: false, state: jsxState });\n },\n exit: (path) => {\n // Decrement depth when exiting a user Var/Num/Currency/DateTime\n const calleePath = path.get('callee');\n if (\n (!calleePath.isIdentifier() && !calleePath.isMemberExpression()) ||\n !isReactJsxFunction(calleePath)\n ) {\n return;\n }\n const firstArg = path.get('arguments')[0];\n if (firstArg?.isExpression() && isUserVariableComponent(firstArg)) {\n jsxState.insideUserVarDepth--;\n }\n },\n };\n}\n\n// ===== Core recursive function =====\n\nfunction processJsxNode({\n path,\n insideAutoT,\n state,\n}: {\n path: NodePath<t.CallExpression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n state.processedNodes.add(path.node);\n\n const firstArgPath = path.get('arguments')[0];\n if (!firstArgPath?.isExpression()) return;\n\n // User T → mark all descendant jsx calls as processed, hands off\n if (isUserTranslationComponent(firstArgPath)) {\n markDescendantJsxCalls({ jsxCallPath: path, state });\n return;\n }\n\n // User Var/Num/Currency/DateTime → mark descendants, hands off\n if (isUserVariableComponent(firstArgPath)) {\n markDescendantJsxCalls({ jsxCallPath: path, state });\n return;\n }\n\n // Already auto-inserted → skip\n const gtName = resolveFirstArgGTName(firstArgPath);\n if (\n gtName === GT_COMPONENT_TYPES.GtInternalTranslateJsx ||\n gtName === GT_COMPONENT_TYPES.GtInternalVar\n ) {\n return;\n }\n\n // Branch/Plural/Derive → opaque for static JSX, dynamic props get _Var\n if (isGTBranchComponent(firstArgPath) || isGTDeriveComponent(firstArgPath)) {\n // Process props BEFORE wrapping — path still points to the opaque component\n processOpaqueComponentProps({\n jsxCallPath: path,\n insideAutoT: !insideAutoT ? true : insideAutoT,\n state,\n });\n if (!insideAutoT) {\n // Root-level opaque component — wrap in _T (single child → use singleCallee)\n const callee =\n state.calleeInfo.singleCallee ??\n state.calleeInfo.multiCallee ??\n REACT_FUNTIONS.jsx;\n const tWrapped = wrapInT(\n path.node,\n t.identifier(callee),\n state.calleeInfo\n );\n state.processedNodes.add(tWrapped);\n path.replaceWith(tWrapped);\n state.statistics.jsxInsertionsCount++;\n }\n return;\n }\n\n // --- Get children prop path ---\n const childrenPropPath = getChildrenPropPath(path);\n if (!childrenPropPath) return;\n\n const childrenPath = childrenPropPath.get('value');\n if (!childrenPath.isExpression()) return;\n\n // --- Determine if this level should claim T ---\n const shouldClaimT =\n !insideAutoT &&\n (hasNonWhitespaceText(childrenPath) || hasOpaqueGTChild(childrenPath));\n\n if (shouldClaimT) {\n processChildren({ childrenPath, insideAutoT: true, state });\n const currentChildren = childrenPropPath.get('value').node;\n const tCallee = t.isArrayExpression(currentChildren)\n ? state.calleeInfo.multiCallee\n : state.calleeInfo.singleCallee;\n const tWrapped = wrapInT(\n currentChildren as t.Expression,\n t.identifier(tCallee ?? 'jsx'),\n state.calleeInfo\n );\n state.processedNodes.add(tWrapped);\n childrenPropPath.get('value').replaceWith(tWrapped);\n updateCalleeToSingle({ jsxCallPath: path, state });\n state.statistics.jsxInsertionsCount++;\n } else if (insideAutoT) {\n processChildren({ childrenPath, insideAutoT: true, state });\n } else {\n recurseChildJsxCalls({ childrenPath, insideAutoT: false, state });\n }\n}\n\n// ===== Children processing ===== //\n\nfunction processChildren({\n childrenPath,\n insideAutoT,\n state,\n}: {\n childrenPath: NodePath<t.Expression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n if (childrenPath.isArrayExpression()) {\n for (const elPath of childrenPath.get('elements')) {\n if (elPath.isExpression()) {\n processSingleChild({ childPath: elPath, insideAutoT, state });\n }\n }\n return;\n }\n processSingleChild({ childPath: childrenPath, insideAutoT, state });\n}\n\nfunction processSingleChild({\n childPath,\n insideAutoT,\n state,\n}: {\n childPath: NodePath<t.Expression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n if (childPath.isCallExpression() && isJsxCallPath(childPath)) {\n processJsxNode({ path: childPath, insideAutoT, state });\n return;\n }\n\n // _Var always has a single child → use singleCallee\n if (insideAutoT && needsVarWrapping(childPath)) {\n const callee = state.calleeInfo.singleCallee ?? REACT_FUNTIONS.jsx;\n const wrapped = wrapInVar(\n childPath.node,\n t.identifier(callee),\n state.calleeInfo\n );\n state.processedNodes.add(wrapped);\n childPath.replaceWith(wrapped);\n }\n}\n\nfunction recurseChildJsxCalls({\n childrenPath,\n insideAutoT,\n state,\n}: {\n childrenPath: NodePath<t.Expression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n if (childrenPath.isArrayExpression()) {\n for (const elPath of childrenPath.get('elements')) {\n if (elPath.isCallExpression() && isJsxCallPath(elPath)) {\n processJsxNode({ path: elPath, insideAutoT, state });\n }\n }\n } else if (childrenPath.isCallExpression() && isJsxCallPath(childrenPath)) {\n processJsxNode({ path: childrenPath, insideAutoT, state });\n }\n}\n\n// ===== Helper functions =====\n\nfunction getChildrenPropPath(\n jsxCallPath: NodePath<t.CallExpression>\n): NodePath<t.ObjectProperty> | undefined {\n const args = jsxCallPath.get('arguments');\n const propsArg = args[1];\n if (!propsArg?.isObjectExpression()) return undefined;\n\n for (const propPath of propsArg.get('properties')) {\n if (\n propPath.isObjectProperty() &&\n t.isIdentifier(propPath.node.key, { name: 'children' })\n ) {\n return propPath;\n }\n }\n return undefined;\n}\n\nfunction isJsxCallPath(callPath: NodePath<t.CallExpression>): boolean {\n const callee = callPath.get('callee');\n if (!callee.isIdentifier() && !callee.isMemberExpression()) return false;\n return isReactJsxFunction(callee);\n}\n\nfunction hasNonWhitespaceText(childrenPath: NodePath<t.Expression>): boolean {\n const isText = (p: NodePath): boolean => {\n if (p.isStringLiteral()) return p.node.value.trim().length > 0;\n if (p.isTemplateLiteral()) {\n return (\n p.node.expressions.length === 0 &&\n (p.node.quasis[0]?.value.cooked ?? '').trim().length > 0\n );\n }\n return false;\n };\n\n if (childrenPath.isArrayExpression()) {\n return childrenPath\n .get('elements')\n .some((el) => el.isExpression() && isText(el));\n }\n return isText(childrenPath);\n}\n\nfunction hasOpaqueGTChild(childrenPath: NodePath<t.Expression>): boolean {\n const isOpaque = (elPath: NodePath): boolean => {\n if (!elPath.isCallExpression() || !isJsxCallPath(elPath)) return false;\n const firstArg = elPath.get('arguments')[0];\n if (!firstArg?.isExpression()) return false;\n return isGTBranchComponent(firstArg) || isGTDeriveComponent(firstArg);\n };\n\n if (childrenPath.isArrayExpression()) {\n return childrenPath\n .get('elements')\n .some((el) => el.isExpression() && isOpaque(el));\n }\n return isOpaque(childrenPath);\n}\n\nfunction needsVarWrapping(exprPath: NodePath<t.Expression>): boolean {\n if (exprPath.isStringLiteral()) return false;\n if (exprPath.isNumericLiteral()) return false;\n if (exprPath.isBooleanLiteral()) return false;\n if (exprPath.isNullLiteral()) return false;\n if (exprPath.isTemplateLiteral() && exprPath.node.expressions.length === 0) {\n return false;\n }\n if (\n exprPath.isUnaryExpression() &&\n exprPath.node.operator === '-' &&\n t.isNumericLiteral(exprPath.node.argument)\n ) {\n return false;\n }\n if (exprPath.isIdentifier()) {\n return ![\n OTHER_IDENTIFIERS_ENUM.UNDEFINED,\n OTHER_IDENTIFIERS_ENUM.NAN,\n OTHER_IDENTIFIERS_ENUM.INFINITY,\n ].includes(exprPath.node.name as OTHER_IDENTIFIERS_ENUM);\n }\n if (exprPath.isCallExpression() && isJsxCallPath(exprPath)) {\n return false;\n }\n return true;\n}\n\n/**\n * After wrapping children in _T, the parent now has a single child.\n * Update its callee from jsxs → jsx if needed.\n */\nfunction updateCalleeToSingle({\n jsxCallPath,\n state,\n}: {\n jsxCallPath: NodePath<t.CallExpression>;\n state: JsxInsertionState;\n}): void {\n const { singleCallee, multiCallee } = state.calleeInfo;\n\n // Production (jsx/jsxs): update callee name jsxs → jsx\n if (singleCallee && multiCallee && singleCallee !== multiCallee) {\n const callee = jsxCallPath.get('callee');\n if (callee.isIdentifier() && callee.node.name === multiCallee) {\n callee.node.name = singleCallee;\n }\n }\n\n // Dev (jsxDEV): update isStaticChildren (4th arg, index 3) to false\n const args = jsxCallPath.get('arguments');\n const isStaticArg = args[3];\n if (isStaticArg?.isBooleanLiteral({ value: true })) {\n isStaticArg.replaceWith(t.booleanLiteral(false));\n }\n}\n\n// ===== AST construction =====\n\nfunction wrapInVar(\n expr: t.Expression,\n callee: t.Expression,\n calleeInfo: JsxCalleeInfo\n): t.CallExpression {\n const args: t.Expression[] = [\n t.identifier(GT_COMPONENT_TYPES.GtInternalVar),\n t.objectExpression([t.objectProperty(t.identifier('children'), expr)]),\n ];\n if (isDevMode(calleeInfo)) {\n args.push(\n t.unaryExpression('void', t.numericLiteral(0)),\n t.booleanLiteral(false)\n );\n }\n return t.callExpression(t.cloneNode(callee), args);\n}\n\nfunction wrapInT(\n children: t.Expression,\n callee: t.Expression,\n calleeInfo: JsxCalleeInfo\n): t.CallExpression {\n const args: t.Expression[] = [\n t.identifier(GT_COMPONENT_TYPES.GtInternalTranslateJsx),\n t.objectExpression([t.objectProperty(t.identifier('children'), children)]),\n ];\n if (isDevMode(calleeInfo)) {\n args.push(\n t.unaryExpression('void', t.numericLiteral(0)),\n t.booleanLiteral(t.isArrayExpression(children))\n );\n }\n return t.callExpression(t.cloneNode(callee), args);\n}\n\nfunction isDevMode(calleeInfo: JsxCalleeInfo): boolean {\n return (\n calleeInfo.singleCallee != null &&\n calleeInfo.singleCallee === calleeInfo.multiCallee\n );\n}\n\n// ===== Marking descendants as processed =====\n\nfunction markDescendantJsxCalls({\n jsxCallPath,\n state,\n}: {\n jsxCallPath: NodePath<t.CallExpression>;\n state: JsxInsertionState;\n}): void {\n const childrenPropPath = getChildrenPropPath(jsxCallPath);\n if (!childrenPropPath) return;\n const valuePath = childrenPropPath.get('value');\n if (valuePath.isExpression()) {\n walkAndMark({ exprPath: valuePath, state });\n }\n}\n\nfunction processOpaqueComponentProps({\n jsxCallPath,\n insideAutoT,\n state,\n}: {\n jsxCallPath: NodePath<t.CallExpression>;\n insideAutoT: boolean;\n state: JsxInsertionState;\n}): void {\n const args = jsxCallPath.get('arguments');\n const propsArg = args[1];\n if (!propsArg?.isObjectExpression()) return;\n\n // Resolve component type to filter control props\n const firstArgPath = args[0];\n const gtName = firstArgPath?.isExpression()\n ? resolveFirstArgGTName(firstArgPath)\n : null;\n\n for (const propPath of propsArg.get('properties')) {\n if (!propPath.isObjectProperty()) continue;\n\n // Determine prop name and skip control props\n const key = propPath.node.key;\n const propName = t.isIdentifier(key)\n ? key.name\n : t.isStringLiteral(key)\n ? key.value\n : null;\n if (isControlProp(gtName, propName)) continue;\n\n const valuePath = propPath.get('value');\n if (!valuePath.isExpression()) continue;\n\n // children is fallback content for Branch/Plural — process element-by-element\n // For Derive, children is opaque — skip entirely\n if (propName === 'children') {\n if (\n insideAutoT &&\n (gtName === GT_COMPONENT_TYPES.Branch ||\n gtName === GT_COMPONENT_TYPES.Plural)\n ) {\n processChildren({ childrenPath: valuePath, insideAutoT: true, state });\n }\n continue;\n }\n\n if (valuePath.isCallExpression() && isJsxCallPath(valuePath)) {\n // Content prop with JSX value — recurse into children for Var-wrapping\n if (insideAutoT) {\n const childrenPropPath = getChildrenPropPath(valuePath);\n if (childrenPropPath) {\n const childrenPath = childrenPropPath.get('value');\n if (childrenPath.isExpression()) {\n processChildren({ childrenPath, insideAutoT: true, state });\n }\n }\n }\n state.processedNodes.add(valuePath.node);\n walkAndMark({ exprPath: valuePath, state });\n } else if (insideAutoT && needsVarWrapping(valuePath)) {\n const callee = state.calleeInfo.singleCallee ?? REACT_FUNTIONS.jsx;\n const wrapped = wrapInVar(\n valuePath.node,\n t.identifier(callee),\n state.calleeInfo\n );\n state.processedNodes.add(wrapped);\n valuePath.replaceWith(wrapped);\n }\n }\n}\n\nfunction isControlProp(\n gtName: string | null,\n propName: string | null\n): boolean {\n if (!propName) return false;\n if (gtName === GT_COMPONENT_TYPES.Branch) {\n return BRANCH_CONTROL_PROPS.has(propName) || propName.startsWith('data-');\n }\n if (gtName === GT_COMPONENT_TYPES.Plural) {\n return PLURAL_CONTROL_PROPS.has(propName);\n }\n return false;\n}\n\nfunction walkAndMark({\n exprPath,\n state,\n}: {\n exprPath: NodePath<t.Expression>;\n state: JsxInsertionState;\n}): void {\n if (exprPath.isCallExpression() && isJsxCallPath(exprPath)) {\n state.processedNodes.add(exprPath.node);\n const childrenPropPath = getChildrenPropPath(exprPath);\n if (childrenPropPath) {\n const valuePath = childrenPropPath.get('value');\n if (valuePath.isExpression()) {\n walkAndMark({ exprPath: valuePath, state });\n }\n }\n } else if (exprPath.isArrayExpression()) {\n for (const elPath of exprPath.get('elements')) {\n if (elPath.isExpression()) {\n walkAndMark({ exprPath: elPath, state });\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAsCA,SAAgB,sBACd,OACA,YACqC;CACrC,MAAM,WAA8B;EAClC,GAAG;EACH,gCAAgB,IAAI,SAAiB;EACrC;EACA,oBAAoB;EACrB;AAED,QAAO;EACL,QAAQ,SAAS;GAEf,MAAM,aAAa,KAAK,IAAI,SAAS;AACrC,OACG,CAAC,WAAW,cAAc,IAAI,CAAC,WAAW,oBAAoB,IAC/D,CAACA,6DAAAA,mBAAmB,WAAW,CAE/B;GAOF,MAAM,WAAW,KAAK,IAAI,YAAY,CAAC;AACvC,QAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAI,SAAU,cAAc,KAAIC,wDAAAA,wBAAwB,SAAS,EAAE;AACjE,aAAS;AACT;;AAIF,OAAI,SAAS,qBAAqB,EAAG;AAErC,OAAI,SAAS,eAAe,IAAI,KAAK,KAAK,CAAE;AAE5C,kBAAe;IAAE;IAAM,aAAa;IAAO,OAAO;IAAU,CAAC;;EAE/D,OAAO,SAAS;GAEd,MAAM,aAAa,KAAK,IAAI,SAAS;AACrC,OACG,CAAC,WAAW,cAAc,IAAI,CAAC,WAAW,oBAAoB,IAC/D,CAACD,6DAAAA,mBAAmB,WAAW,CAE/B;GAEF,MAAM,WAAW,KAAK,IAAI,YAAY,CAAC;AACvC,QAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAI,SAAU,cAAc,KAAIC,wDAAAA,wBAAwB,SAAS,CAC/D,UAAS;;EAGd;;AAKH,SAAS,eAAe,EACtB,MACA,aACA,SAKO;AACP,OAAM,eAAe,IAAI,KAAK,KAAK;CAEnC,MAAM,eAAe,KAAK,IAAI,YAAY,CAAC;AAC3C,KAAI,EAAA,iBAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAC,aAAc,cAAc,EAAE;AAGnC,KAAIC,wDAAAA,2BAA2B,aAAa,EAAE;AAC5C,yBAAuB;GAAE,aAAa;GAAM;GAAO,CAAC;AACpD;;AAIF,KAAID,wDAAAA,wBAAwB,aAAa,EAAE;AACzC,yBAAuB;GAAE,aAAa;GAAM;GAAO,CAAC;AACpD;;CAIF,MAAM,SAASE,wDAAAA,sBAAsB,aAAa;AAClD,KACE,WAAA,4BACA,WAAA,gBAEA;AAIF,KAAIC,wDAAAA,oBAAoB,aAAa,IAAIC,wDAAAA,oBAAoB,aAAa,EAAE;AAE1E,8BAA4B;GAC1B,aAAa;GACb,aAAa,CAAC,cAAc,OAAO;GACnC;GACD,CAAC;AACF,MAAI,CAAC,aAAa;GAEhB,MAAM,SACJ,MAAM,WAAW,gBACjB,MAAM,WAAW,eAAA;GAEnB,MAAM,WAAW,QACf,KAAK,MACLC,aAAE,WAAW,OAAO,EACpB,MAAM,WACP;AACD,SAAM,eAAe,IAAI,SAAS;AAClC,QAAK,YAAY,SAAS;AAC1B,SAAM,WAAW;;AAEnB;;CAIF,MAAM,mBAAmB,oBAAoB,KAAK;AAClD,KAAI,CAAC,iBAAkB;CAEvB,MAAM,eAAe,iBAAiB,IAAI,QAAQ;AAClD,KAAI,CAAC,aAAa,cAAc,CAAE;AAOlC,KAHE,CAAC,gBACA,qBAAqB,aAAa,IAAI,iBAAiB,aAAa,GAErD;AAChB,kBAAgB;GAAE;GAAc,aAAa;GAAM;GAAO,CAAC;EAC3D,MAAM,kBAAkB,iBAAiB,IAAI,QAAQ,CAAC;EACtD,MAAM,UAAUA,aAAE,kBAAkB,gBAAgB,GAChD,MAAM,WAAW,cACjB,MAAM,WAAW;EACrB,MAAM,WAAW,QACf,iBACAA,aAAE,WAAW,WAAW,MAAM,EAC9B,MAAM,WACP;AACD,QAAM,eAAe,IAAI,SAAS;AAClC,mBAAiB,IAAI,QAAQ,CAAC,YAAY,SAAS;AACnD,uBAAqB;GAAE,aAAa;GAAM;GAAO,CAAC;AAClD,QAAM,WAAW;YACR,YACT,iBAAgB;EAAE;EAAc,aAAa;EAAM;EAAO,CAAC;KAE3D,sBAAqB;EAAE;EAAc,aAAa;EAAO;EAAO,CAAC;;AAMrE,SAAS,gBAAgB,EACvB,cACA,aACA,SAKO;AACP,KAAI,aAAa,mBAAmB,EAAE;AACpC,OAAK,MAAM,UAAU,aAAa,IAAI,WAAW,CAC/C,KAAI,OAAO,cAAc,CACvB,oBAAmB;GAAE,WAAW;GAAQ;GAAa;GAAO,CAAC;AAGjE;;AAEF,oBAAmB;EAAE,WAAW;EAAc;EAAa;EAAO,CAAC;;AAGrE,SAAS,mBAAmB,EAC1B,WACA,aACA,SAKO;AACP,KAAI,UAAU,kBAAkB,IAAI,cAAc,UAAU,EAAE;AAC5D,iBAAe;GAAE,MAAM;GAAW;GAAa;GAAO,CAAC;AACvD;;AAIF,KAAI,eAAe,iBAAiB,UAAU,EAAE;EAC9C,MAAM,SAAS,MAAM,WAAW,gBAAA;EAChC,MAAM,UAAU,UACd,UAAU,MACVA,aAAE,WAAW,OAAO,EACpB,MAAM,WACP;AACD,QAAM,eAAe,IAAI,QAAQ;AACjC,YAAU,YAAY,QAAQ;;;AAIlC,SAAS,qBAAqB,EAC5B,cACA,aACA,SAKO;AACP,KAAI,aAAa,mBAAmB;OAC7B,MAAM,UAAU,aAAa,IAAI,WAAW,CAC/C,KAAI,OAAO,kBAAkB,IAAI,cAAc,OAAO,CACpD,gBAAe;GAAE,MAAM;GAAQ;GAAa;GAAO,CAAC;YAG/C,aAAa,kBAAkB,IAAI,cAAc,aAAa,CACvE,gBAAe;EAAE,MAAM;EAAc;EAAa;EAAO,CAAC;;AAM9D,SAAS,oBACP,aACwC;CAExC,MAAM,WADO,YAAY,IAAI,YACR,CAAC;AACtB,KAAI,EAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAC,SAAU,oBAAoB,EAAE,QAAO,KAAA;AAE5C,MAAK,MAAM,YAAY,SAAS,IAAI,aAAa,CAC/C,KACE,SAAS,kBAAkB,IAC3BA,aAAE,aAAa,SAAS,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC,CAEvD,QAAO;;AAMb,SAAS,cAAc,UAA+C;CACpE,MAAM,SAAS,SAAS,IAAI,SAAS;AACrC,KAAI,CAAC,OAAO,cAAc,IAAI,CAAC,OAAO,oBAAoB,CAAE,QAAO;AACnE,QAAON,6DAAAA,mBAAmB,OAAO;;AAGnC,SAAS,qBAAqB,cAA+C;CAC3E,MAAM,UAAU,MAAyB;AACvC,MAAI,EAAE,iBAAiB,CAAE,QAAO,EAAE,KAAK,MAAM,MAAM,CAAC,SAAS;AAC7D,MAAI,EAAE,mBAAmB,EAAE;;AACzB,UACE,EAAE,KAAK,YAAY,WAAW,QAAA,kBAC7B,EAAE,KAAK,OAAO,QAAA,QAAA,oBAAA,KAAA,IAAA,KAAA,IAAA,gBAAI,MAAM,WAAU,IAAI,MAAM,CAAC,SAAS;;AAG3D,SAAO;;AAGT,KAAI,aAAa,mBAAmB,CAClC,QAAO,aACJ,IAAI,WAAW,CACf,MAAM,OAAO,GAAG,cAAc,IAAI,OAAO,GAAG,CAAC;AAElD,QAAO,OAAO,aAAa;;AAG7B,SAAS,iBAAiB,cAA+C;CACvE,MAAM,YAAY,WAA8B;AAC9C,MAAI,CAAC,OAAO,kBAAkB,IAAI,CAAC,cAAc,OAAO,CAAE,QAAO;EACjE,MAAM,WAAW,OAAO,IAAI,YAAY,CAAC;AACzC,MAAI,EAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAC,SAAU,cAAc,EAAE,QAAO;AACtC,SAAOI,wDAAAA,oBAAoB,SAAS,IAAIC,wDAAAA,oBAAoB,SAAS;;AAGvE,KAAI,aAAa,mBAAmB,CAClC,QAAO,aACJ,IAAI,WAAW,CACf,MAAM,OAAO,GAAG,cAAc,IAAI,SAAS,GAAG,CAAC;AAEpD,QAAO,SAAS,aAAa;;AAG/B,SAAS,iBAAiB,UAA2C;AACnE,KAAI,SAAS,iBAAiB,CAAE,QAAO;AACvC,KAAI,SAAS,kBAAkB,CAAE,QAAO;AACxC,KAAI,SAAS,kBAAkB,CAAE,QAAO;AACxC,KAAI,SAAS,eAAe,CAAE,QAAO;AACrC,KAAI,SAAS,mBAAmB,IAAI,SAAS,KAAK,YAAY,WAAW,EACvE,QAAO;AAET,KACE,SAAS,mBAAmB,IAC5B,SAAS,KAAK,aAAa,OAC3BC,aAAE,iBAAiB,SAAS,KAAK,SAAS,CAE1C,QAAO;AAET,KAAI,SAAS,cAAc,CACzB,QAAO,CAAC;;;;EAIP,CAAC,SAAS,SAAS,KAAK,KAA+B;AAE1D,KAAI,SAAS,kBAAkB,IAAI,cAAc,SAAS,CACxD,QAAO;AAET,QAAO;;;;;;AAOT,SAAS,qBAAqB,EAC5B,aACA,SAIO;CACP,MAAM,EAAE,cAAc,gBAAgB,MAAM;AAG5C,KAAI,gBAAgB,eAAe,iBAAiB,aAAa;EAC/D,MAAM,SAAS,YAAY,IAAI,SAAS;AACxC,MAAI,OAAO,cAAc,IAAI,OAAO,KAAK,SAAS,YAChD,QAAO,KAAK,OAAO;;CAMvB,MAAM,cADO,YAAY,IAAI,YACL,CAAC;AACzB,KAAA,gBAAA,QAAA,gBAAA,KAAA,IAAA,KAAA,IAAI,YAAa,iBAAiB,EAAE,OAAO,MAAM,CAAC,CAChD,aAAY,YAAYA,aAAE,eAAe,MAAM,CAAC;;AAMpD,SAAS,UACP,MACA,QACA,YACkB;CAClB,MAAM,OAAuB,CAC3BA,aAAE,WAAA,gBAA4C,EAC9CA,aAAE,iBAAiB,CAACA,aAAE,eAAeA,aAAE,WAAW,WAAW,EAAE,KAAK,CAAC,CAAC,CACvE;AACD,KAAI,UAAU,WAAW,CACvB,MAAK,KACHA,aAAE,gBAAgB,QAAQA,aAAE,eAAe,EAAE,CAAC,EAC9CA,aAAE,eAAe,MAAM,CACxB;AAEH,QAAOA,aAAE,eAAeA,aAAE,UAAU,OAAO,EAAE,KAAK;;AAGpD,SAAS,QACP,UACA,QACA,YACkB;CAClB,MAAM,OAAuB,CAC3BA,aAAE,WAAA,yBAAqD,EACvDA,aAAE,iBAAiB,CAACA,aAAE,eAAeA,aAAE,WAAW,WAAW,EAAE,SAAS,CAAC,CAAC,CAC3E;AACD,KAAI,UAAU,WAAW,CACvB,MAAK,KACHA,aAAE,gBAAgB,QAAQA,aAAE,eAAe,EAAE,CAAC,EAC9CA,aAAE,eAAeA,aAAE,kBAAkB,SAAS,CAAC,CAChD;AAEH,QAAOA,aAAE,eAAeA,aAAE,UAAU,OAAO,EAAE,KAAK;;AAGpD,SAAS,UAAU,YAAoC;AACrD,QACE,WAAW,gBAAgB,QAC3B,WAAW,iBAAiB,WAAW;;AAM3C,SAAS,uBAAuB,EAC9B,aACA,SAIO;CACP,MAAM,mBAAmB,oBAAoB,YAAY;AACzD,KAAI,CAAC,iBAAkB;CACvB,MAAM,YAAY,iBAAiB,IAAI,QAAQ;AAC/C,KAAI,UAAU,cAAc,CAC1B,aAAY;EAAE,UAAU;EAAW;EAAO,CAAC;;AAI/C,SAAS,4BAA4B,EACnC,aACA,aACA,SAKO;CACP,MAAM,OAAO,YAAY,IAAI,YAAY;CACzC,MAAM,WAAW,KAAK;AACtB,KAAI,EAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAC,SAAU,oBAAoB,EAAE;CAGrC,MAAM,eAAe,KAAK;CAC1B,MAAM,UAAA,iBAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAS,aAAc,cAAc,IACvCH,wDAAAA,sBAAsB,aAAa,GACnC;AAEJ,MAAK,MAAM,YAAY,SAAS,IAAI,aAAa,EAAE;AACjD,MAAI,CAAC,SAAS,kBAAkB,CAAE;EAGlC,MAAM,MAAM,SAAS,KAAK;EAC1B,MAAM,WAAWG,aAAE,aAAa,IAAI,GAChC,IAAI,OACJA,aAAE,gBAAgB,IAAI,GACpB,IAAI,QACJ;AACN,MAAI,cAAc,QAAQ,SAAS,CAAE;EAErC,MAAM,YAAY,SAAS,IAAI,QAAQ;AACvC,MAAI,CAAC,UAAU,cAAc,CAAE;AAI/B,MAAI,aAAa,YAAY;AAC3B,OACE,gBACC,WAAA,YACC,WAAA,UAEF,iBAAgB;IAAE,cAAc;IAAW,aAAa;IAAM;IAAO,CAAC;AAExE;;AAGF,MAAI,UAAU,kBAAkB,IAAI,cAAc,UAAU,EAAE;AAE5D,OAAI,aAAa;IACf,MAAM,mBAAmB,oBAAoB,UAAU;AACvD,QAAI,kBAAkB;KACpB,MAAM,eAAe,iBAAiB,IAAI,QAAQ;AAClD,SAAI,aAAa,cAAc,CAC7B,iBAAgB;MAAE;MAAc,aAAa;MAAM;MAAO,CAAC;;;AAIjE,SAAM,eAAe,IAAI,UAAU,KAAK;AACxC,eAAY;IAAE,UAAU;IAAW;IAAO,CAAC;aAClC,eAAe,iBAAiB,UAAU,EAAE;GACrD,MAAM,SAAS,MAAM,WAAW,gBAAA;GAChC,MAAM,UAAU,UACd,UAAU,MACVA,aAAE,WAAW,OAAO,EACpB,MAAM,WACP;AACD,SAAM,eAAe,IAAI,QAAQ;AACjC,aAAU,YAAY,QAAQ;;;;AAKpC,SAAS,cACP,QACA,UACS;AACT,KAAI,CAAC,SAAU,QAAO;AACtB,KAAI,WAAA,SACF,QAAOC,qCAAAA,qBAAqB,IAAI,SAAS,IAAI,SAAS,WAAW,QAAQ;AAE3E,KAAI,WAAA,SACF,QAAOC,qCAAAA,qBAAqB,IAAI,SAAS;AAE3C,QAAO;;AAGT,SAAS,YAAY,EACnB,UACA,SAIO;AACP,KAAI,SAAS,kBAAkB,IAAI,cAAc,SAAS,EAAE;AAC1D,QAAM,eAAe,IAAI,SAAS,KAAK;EACvC,MAAM,mBAAmB,oBAAoB,SAAS;AACtD,MAAI,kBAAkB;GACpB,MAAM,YAAY,iBAAiB,IAAI,QAAQ;AAC/C,OAAI,UAAU,cAAc,CAC1B,aAAY;IAAE,UAAU;IAAW;IAAO,CAAC;;YAGtC,SAAS,mBAAmB;OAChC,MAAM,UAAU,SAAS,IAAI,WAAW,CAC3C,KAAI,OAAO,cAAc,CACvB,aAAY;GAAE,UAAU;GAAQ;GAAO,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"processProgram.d.ts","sourceRoot":"","sources":["../../../src/processing/jsx-insertion/processProgram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAI3D;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,WAAW,EACX,iBAAiB,EACjB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,OAAO,CAAC;IACjC,UAAU,EAAE,aAAa,CAAC;CAC3B,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CA2B/B"}
1
+ {"version":3,"file":"processProgram.d.ts","sourceRoot":"","sources":["../../../src/processing/jsx-insertion/processProgram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAI3D;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,WAAW,EACX,iBAAiB,EACjB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,OAAO,CAAC;IACjC,UAAU,EAAE,aAAa,CAAC;CAC3B,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CA8B/B"}
@@ -15,7 +15,7 @@ _babel_types = require_runtime.__toESM(_babel_types);
15
15
  function processProgram({ state, countBefore, isAlreadyImported, calleeInfo }) {
16
16
  return { exit(path) {
17
17
  if (!(state.statistics.jsxInsertionsCount > countBefore)) return;
18
- if (!isAlreadyImported()) require_transform_jsx_insertion_injectJsxInsertionImport.injectJsxInsertionImport(path);
18
+ if (!isAlreadyImported()) require_transform_jsx_insertion_injectJsxInsertionImport.injectJsxInsertionImport(path, state.settings.legacyGtReactImportSource);
19
19
  if (!calleeInfo.singleCallee && calleeInfo.multiCallee) {
20
20
  const jsxImport = _babel_types.importDeclaration([_babel_types.importSpecifier(_babel_types.identifier("jsx"), _babel_types.identifier("jsx"))], _babel_types.stringLiteral("react/jsx-runtime"));
21
21
  path.unshiftContainer("body", jsxImport);
@@ -1 +1 @@
1
- {"version":3,"file":"processProgram.js","names":["t"],"sources":["../../../src/processing/jsx-insertion/processProgram.ts"],"sourcesContent":["import { TransformState } from '../../state/types';\nimport { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { injectJsxInsertionImport } from '../../transform/jsx-insertion/injectJsxInsertionImport';\nimport { JsxCalleeInfo } from './processImportDeclaration';\nimport { REACT_FUNTIONS } from '../../utils/constants/react/constants';\nimport { REACT_IMPORT_SOURCES } from '../../utils/constants/react/constants';\n\n/**\n * Process program:\n * - on exit, injects GtInternalTranslateJsx/GtInternalVar import if needed\n * - also injects `jsx` from React runtime if only `jsxs` was imported\n * (Vite production builds only import what's needed — if a file has only\n * multi-child elements, `jsx` is never imported, but our _Var wrappers need it)\n */\nexport function processProgram({\n state,\n countBefore,\n isAlreadyImported,\n calleeInfo,\n}: {\n state: TransformState;\n countBefore: number;\n isAlreadyImported: () => boolean;\n calleeInfo: JsxCalleeInfo;\n}): VisitNode<t.Node, t.Program> {\n return {\n exit(path) {\n const didInsert = state.statistics.jsxInsertionsCount > countBefore;\n if (!didInsert) return;\n\n if (!isAlreadyImported()) {\n injectJsxInsertionImport(path);\n }\n\n // If only jsxs was imported (no jsx), inject jsx import.\n // _Var wrappers always use singleCallee which defaults to 'jsx'.\n if (!calleeInfo.singleCallee && calleeInfo.multiCallee) {\n const jsxImport = t.importDeclaration(\n [\n t.importSpecifier(\n t.identifier(REACT_FUNTIONS.jsx),\n t.identifier(REACT_FUNTIONS.jsx)\n ),\n ],\n t.stringLiteral(REACT_IMPORT_SOURCES.JSX_RUNTIME)\n );\n path.unshiftContainer('body', jsxImport);\n calleeInfo.singleCallee = REACT_FUNTIONS.jsx;\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,eAAe,EAC7B,OACA,aACA,mBACA,cAM+B;AAC/B,QAAO,EACL,KAAK,MAAM;AAET,MAAI,EADc,MAAM,WAAW,qBAAqB,aACxC;AAEhB,MAAI,CAAC,mBAAmB,CACtB,0DAAA,yBAAyB,KAAK;AAKhC,MAAI,CAAC,WAAW,gBAAgB,WAAW,aAAa;GACtD,MAAM,YAAYA,aAAE,kBAClB,CACEA,aAAE,gBACAA,aAAE,WAAA,MAA8B,EAChCA,aAAE,WAAA,MAA8B,CACjC,CACF,EACDA,aAAE,cAAA,oBAA+C,CAClD;AACD,QAAK,iBAAiB,QAAQ,UAAU;AACxC,cAAW,eAAA;;IAGhB"}
1
+ {"version":3,"file":"processProgram.js","names":["t"],"sources":["../../../src/processing/jsx-insertion/processProgram.ts"],"sourcesContent":["import { TransformState } from '../../state/types';\nimport { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { injectJsxInsertionImport } from '../../transform/jsx-insertion/injectJsxInsertionImport';\nimport { JsxCalleeInfo } from './processImportDeclaration';\nimport { REACT_FUNTIONS } from '../../utils/constants/react/constants';\nimport { REACT_IMPORT_SOURCES } from '../../utils/constants/react/constants';\n\n/**\n * Process program:\n * - on exit, injects GtInternalTranslateJsx/GtInternalVar import if needed\n * - also injects `jsx` from React runtime if only `jsxs` was imported\n * (Vite production builds only import what's needed — if a file has only\n * multi-child elements, `jsx` is never imported, but our _Var wrappers need it)\n */\nexport function processProgram({\n state,\n countBefore,\n isAlreadyImported,\n calleeInfo,\n}: {\n state: TransformState;\n countBefore: number;\n isAlreadyImported: () => boolean;\n calleeInfo: JsxCalleeInfo;\n}): VisitNode<t.Node, t.Program> {\n return {\n exit(path) {\n const didInsert = state.statistics.jsxInsertionsCount > countBefore;\n if (!didInsert) return;\n\n if (!isAlreadyImported()) {\n injectJsxInsertionImport(\n path,\n state.settings.legacyGtReactImportSource\n );\n }\n\n // If only jsxs was imported (no jsx), inject jsx import.\n // _Var wrappers always use singleCallee which defaults to 'jsx'.\n if (!calleeInfo.singleCallee && calleeInfo.multiCallee) {\n const jsxImport = t.importDeclaration(\n [\n t.importSpecifier(\n t.identifier(REACT_FUNTIONS.jsx),\n t.identifier(REACT_FUNTIONS.jsx)\n ),\n ],\n t.stringLiteral(REACT_IMPORT_SOURCES.JSX_RUNTIME)\n );\n path.unshiftContainer('body', jsxImport);\n calleeInfo.singleCallee = REACT_FUNTIONS.jsx;\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,eAAe,EAC7B,OACA,aACA,mBACA,cAM+B;AAC/B,QAAO,EACL,KAAK,MAAM;AAET,MAAI,EADc,MAAM,WAAW,qBAAqB,aACxC;AAEhB,MAAI,CAAC,mBAAmB,CACtB,0DAAA,yBACE,MACA,MAAM,SAAS,0BAChB;AAKH,MAAI,CAAC,WAAW,gBAAgB,WAAW,aAAa;GACtD,MAAM,YAAYA,aAAE,kBAClB,CACEA,aAAE,gBACAA,aAAE,WAAA,MAA8B,EAChCA,aAAE,WAAA,MAA8B,CACjC,CACF,EACDA,aAAE,cAAA,oBAA+C,CAClD;AACD,QAAK,iBAAiB,QAAQ,UAAU;AACxC,cAAW,eAAA;;IAGhB"}
@@ -14,7 +14,7 @@ function processProgram({ state, countBefore, isAlreadyImported }) {
14
14
  return { exit(path) {
15
15
  if (!(state.statistics.macroExpansionsCount > countBefore) || isAlreadyImported()) return;
16
16
  if (!state.settings.enableMacroImportInjection) return;
17
- require_transform_macro_expansion_injectMacroImport.injectMacroImport(path);
17
+ require_transform_macro_expansion_injectMacroImport.injectMacroImport(path, state.settings.legacyGtReactImportSource);
18
18
  } };
19
19
  }
20
20
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"processProgram.js","names":[],"sources":["../../../src/processing/macro-expansion/processProgram.ts"],"sourcesContent":["import { TransformState } from '../../state/types';\nimport { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { injectMacroImport } from '../../transform/macro-expansion/injectMacroImport';\n\n/**\n * Process program:\n * - on exit,injects macro import if needed\n * @param {Object} param0 - The parameters for the function.\n * @param {TransformState} param0.state - The state of the transformation.\n * @param {number} param0.countBefore - The count before the transformation.\n * @param {boolean} param0.alreadyImported - Whether the macro import has already been injected.\n * @returns {VisitNode<t.Node, t.Program>} The visit node for the program.\n */\nexport function processProgram({\n state,\n countBefore,\n isAlreadyImported,\n}: {\n state: TransformState;\n countBefore: number;\n isAlreadyImported: () => boolean;\n}): VisitNode<t.Node, t.Program> {\n return {\n exit(path) {\n // (1) Check if the macro expansions count has changed\n const didTransform = state.statistics.macroExpansionsCount > countBefore;\n if (!didTransform || isAlreadyImported()) return;\n // (2) If the macro import injection is disabled, return.\n if (!state.settings.enableMacroImportInjection) return;\n // Inject the macro import.\n injectMacroImport(path);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,eAAe,EAC7B,OACA,aACA,qBAK+B;AAC/B,QAAO,EACL,KAAK,MAAM;AAGT,MAAI,EADiB,MAAM,WAAW,uBAAuB,gBACxC,mBAAmB,CAAE;AAE1C,MAAI,CAAC,MAAM,SAAS,2BAA4B;AAEhD,sDAAA,kBAAkB,KAAK;IAE1B"}
1
+ {"version":3,"file":"processProgram.js","names":[],"sources":["../../../src/processing/macro-expansion/processProgram.ts"],"sourcesContent":["import { TransformState } from '../../state/types';\nimport { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { injectMacroImport } from '../../transform/macro-expansion/injectMacroImport';\n\n/**\n * Process program:\n * - on exit,injects macro import if needed\n * @param {Object} param0 - The parameters for the function.\n * @param {TransformState} param0.state - The state of the transformation.\n * @param {number} param0.countBefore - The count before the transformation.\n * @param {boolean} param0.alreadyImported - Whether the macro import has already been injected.\n * @returns {VisitNode<t.Node, t.Program>} The visit node for the program.\n */\nexport function processProgram({\n state,\n countBefore,\n isAlreadyImported,\n}: {\n state: TransformState;\n countBefore: number;\n isAlreadyImported: () => boolean;\n}): VisitNode<t.Node, t.Program> {\n return {\n exit(path) {\n // (1) Check if the macro expansions count has changed\n const didTransform = state.statistics.macroExpansionsCount > countBefore;\n if (!didTransform || isAlreadyImported()) return;\n // (2) If the macro import injection is disabled, return.\n if (!state.settings.enableMacroImportInjection) return;\n // Inject the macro import.\n injectMacroImport(path, state.settings.legacyGtReactImportSource);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,eAAe,EAC7B,OACA,aACA,qBAK+B;AAC/B,QAAO,EACL,KAAK,MAAM;AAGT,MAAI,EADiB,MAAM,WAAW,uBAAuB,gBACxC,mBAAmB,CAAE;AAE1C,MAAI,CAAC,MAAM,SAAS,2BAA4B;AAEhD,sDAAA,kBAAkB,MAAM,MAAM,SAAS,0BAA0B;IAEpE"}
@@ -7,7 +7,7 @@ import { TransformState } from '../../state/types';
7
7
  *
8
8
  * Only transforms when:
9
9
  * - t is unbound (global macro via gt-react/macros)
10
- * - t is imported from gt-react/browser
10
+ * - t is imported from a gt-react entrypoint
11
11
  * Skips when t is bound to a non-GT import (e.g., i18next)
12
12
  */
13
13
  export declare function processTaggedTemplateExpression(state: TransformState): VisitNode<t.Node, t.TaggedTemplateExpression>;
@@ -12,7 +12,7 @@ _babel_types = require_runtime.__toESM(_babel_types);
12
12
  *
13
13
  * Only transforms when:
14
14
  * - t is unbound (global macro via gt-react/macros)
15
- * - t is imported from gt-react/browser
15
+ * - t is imported from a gt-react entrypoint
16
16
  * Skips when t is bound to a non-GT import (e.g., i18next)
17
17
  */
18
18
  function processTaggedTemplateExpression(state) {
@@ -1 +1 @@
1
- {"version":3,"file":"processTaggedTemplateExpression.js","names":["isStringTranslationTaggedTemplate","transformTemplateLiteral","t"],"sources":["../../../src/processing/macro-expansion/processTaggedTemplateExpression.ts"],"sourcesContent":["import { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { TransformState } from '../../state/types';\nimport { GT_OTHER_FUNCTIONS } from '../../utils/constants/gt/constants';\nimport { transformTemplateLiteral } from '../../transform/macro-expansion/transformTemplateLiteral';\nimport { isStringTranslationTaggedTemplate } from '../../utils/parsing/isStringTranslationTaggedTemplate';\n\n/**\n * Process tagged template expressions for macro expansion.\n * Transforms t`Hello, ${name}` → t(\"Hello, {0}\", { \"0\": name })\n *\n * Only transforms when:\n * - t is unbound (global macro via gt-react/macros)\n * - t is imported from gt-react/browser\n * Skips when t is bound to a non-GT import (e.g., i18next)\n */\nexport function processTaggedTemplateExpression(\n state: TransformState\n): VisitNode<t.Node, t.TaggedTemplateExpression> {\n const symbol = state.settings.stringTranslationMacro;\n\n return (path) => {\n if (!state.settings.enableTaggedTemplate) return;\n if (!isStringTranslationTaggedTemplate(path, symbol)) return;\n\n // Extract message from the template literal, errors are logged by collection pass\n const { content, errors } = transformTemplateLiteral(path.get('quasi'));\n // TODO: Until derive added, we only support one message variant\n const message = content[0]?.message;\n const variables = content[0]?.variables;\n if (errors.length > 0 || message == null) return;\n\n // Build the call expression arguments\n const args: t.Expression[] = [message];\n if (variables) args.push(variables);\n path.replaceWith(\n t.callExpression(t.identifier(GT_OTHER_FUNCTIONS.t), args)\n );\n state.statistics.macroExpansionsCount++;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,SAAgB,gCACd,OAC+C;CAC/C,MAAM,SAAS,MAAM,SAAS;AAE9B,SAAQ,SAAS;;AACf,MAAI,CAAC,MAAM,SAAS,qBAAsB;AAC1C,MAAI,CAACA,wDAAAA,kCAAkC,MAAM,OAAO,CAAE;EAGtD,MAAM,EAAE,SAAS,WAAWC,2DAAAA,yBAAyB,KAAK,IAAI,QAAQ,CAAC;EAEvE,MAAM,WAAA,YAAU,QAAQ,QAAA,QAAA,cAAA,KAAA,IAAA,KAAA,IAAA,UAAI;EAC5B,MAAM,aAAA,aAAY,QAAQ,QAAA,QAAA,eAAA,KAAA,IAAA,KAAA,IAAA,WAAI;AAC9B,MAAI,OAAO,SAAS,KAAK,WAAW,KAAM;EAG1C,MAAM,OAAuB,CAAC,QAAQ;AACtC,MAAI,UAAW,MAAK,KAAK,UAAU;AACnC,OAAK,YACHC,aAAE,eAAeA,aAAE,WAAA,IAAgC,EAAE,KAAK,CAC3D;AACD,QAAM,WAAW"}
1
+ {"version":3,"file":"processTaggedTemplateExpression.js","names":["isStringTranslationTaggedTemplate","transformTemplateLiteral","t"],"sources":["../../../src/processing/macro-expansion/processTaggedTemplateExpression.ts"],"sourcesContent":["import { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { TransformState } from '../../state/types';\nimport { GT_OTHER_FUNCTIONS } from '../../utils/constants/gt/constants';\nimport { transformTemplateLiteral } from '../../transform/macro-expansion/transformTemplateLiteral';\nimport { isStringTranslationTaggedTemplate } from '../../utils/parsing/isStringTranslationTaggedTemplate';\n\n/**\n * Process tagged template expressions for macro expansion.\n * Transforms t`Hello, ${name}` → t(\"Hello, {0}\", { \"0\": name })\n *\n * Only transforms when:\n * - t is unbound (global macro via gt-react/macros)\n * - t is imported from a gt-react entrypoint\n * Skips when t is bound to a non-GT import (e.g., i18next)\n */\nexport function processTaggedTemplateExpression(\n state: TransformState\n): VisitNode<t.Node, t.TaggedTemplateExpression> {\n const symbol = state.settings.stringTranslationMacro;\n\n return (path) => {\n if (!state.settings.enableTaggedTemplate) return;\n if (!isStringTranslationTaggedTemplate(path, symbol)) return;\n\n // Extract message from the template literal, errors are logged by collection pass\n const { content, errors } = transformTemplateLiteral(path.get('quasi'));\n // TODO: Until derive added, we only support one message variant\n const message = content[0]?.message;\n const variables = content[0]?.variables;\n if (errors.length > 0 || message == null) return;\n\n // Build the call expression arguments\n const args: t.Expression[] = [message];\n if (variables) args.push(variables);\n path.replaceWith(\n t.callExpression(t.identifier(GT_OTHER_FUNCTIONS.t), args)\n );\n state.statistics.macroExpansionsCount++;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,SAAgB,gCACd,OAC+C;CAC/C,MAAM,SAAS,MAAM,SAAS;AAE9B,SAAQ,SAAS;;AACf,MAAI,CAAC,MAAM,SAAS,qBAAsB;AAC1C,MAAI,CAACA,wDAAAA,kCAAkC,MAAM,OAAO,CAAE;EAGtD,MAAM,EAAE,SAAS,WAAWC,2DAAAA,yBAAyB,KAAK,IAAI,QAAQ,CAAC;EAEvE,MAAM,WAAA,YAAU,QAAQ,QAAA,QAAA,cAAA,KAAA,IAAA,KAAA,IAAA,UAAI;EAC5B,MAAM,aAAA,aAAY,QAAQ,QAAA,QAAA,eAAA,KAAA,IAAA,KAAA,IAAA,WAAI;AAC9B,MAAI,OAAO,SAAS,KAAK,WAAW,KAAM;EAG1C,MAAM,OAAuB,CAAC,QAAQ;AACtC,MAAI,UAAW,MAAK,KAAK,UAAU;AACnC,OAAK,YACHC,aAAE,eAAeA,aAAE,WAAA,IAAgC,EAAE,KAAK,CAC3D;AACD,QAAM,WAAW"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_transform_tracking_trackFunctionParams = require("../transform/tracking/trackFunctionParams.js");
3
2
  const require_transform_tracking_trackFunctionName = require("../transform/tracking/trackFunctionName.js");
3
+ const require_transform_tracking_trackFunctionParams = require("../transform/tracking/trackFunctionParams.js");
4
4
  //#region src/processing/processFunctionDeclaration.ts
5
5
  /**
6
6
  * Process function declaration:
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_transform_tracking_trackFunctionParams = require("../transform/tracking/trackFunctionParams.js");
3
2
  const require_transform_tracking_trackFunctionName = require("../transform/tracking/trackFunctionName.js");
3
+ const require_transform_tracking_trackFunctionParams = require("../transform/tracking/trackFunctionParams.js");
4
4
  //#region src/processing/processFunctionExpression.ts
5
5
  /**
6
6
  * Process function expression:
@@ -1 +1 @@
1
- {"version":3,"file":"processProgram.d.ts","sourceRoot":"","sources":["../../../src/processing/runtime-translate/processProgram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,GACb,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,uBAAuB,EAAE,MAAM,OAAO,CAAC;IACvC,oBAAoB,EAAE,MAAM,OAAO,CAAC;IACpC,YAAY,EAAE,YAAY,CAAC;CAC5B,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAmD/B"}
1
+ {"version":3,"file":"processProgram.d.ts","sourceRoot":"","sources":["../../../src/processing/runtime-translate/processProgram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,GACb,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,uBAAuB,EAAE,MAAM,OAAO,CAAC;IACvC,oBAAoB,EAAE,MAAM,OAAO,CAAC;IACpC,YAAY,EAAE,YAAY,CAAC;CAC5B,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAoD/B"}
@@ -22,7 +22,8 @@ function processProgram({ state, isStringAlreadyImported, isJsxAlreadyImported,
22
22
  if (needsString || needsJsx) {
23
23
  const injectedPath = require_transform_runtime_translate_injectRuntimeTranslateImport.injectRuntimeTranslateImport(path, {
24
24
  needsString,
25
- needsJsx
25
+ needsJsx,
26
+ legacyGtReactImportSource: state.settings.legacyGtReactImportSource
26
27
  });
27
28
  if (injectedPath) importAnchor.path = injectedPath;
28
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"processProgram.js","names":["buildRuntimeTranslateCalls","injectRuntimeTranslateImport"],"sources":["../../../src/processing/runtime-translate/processProgram.ts"],"sourcesContent":["import { TransformState } from '../../state/types';\nimport { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { injectRuntimeTranslateImport } from '../../transform/runtime-translate/injectRuntimeTranslateImport';\nimport { buildRuntimeTranslateCalls } from '../../transform/runtime-translate/buildRuntimeTranslateCalls';\nimport { ImportAnchor } from './processImportDeclaration';\n\n/**\n * Process program for runtime translate pass:\n * - On exit, reads collected strings and JSX content from StringCollector\n * - Filters out derive entries (hash === '')\n * - Injects import and await Promise.all([...]) with runtime translate calls\n */\nexport function processProgram({\n state,\n isStringAlreadyImported,\n isJsxAlreadyImported,\n importAnchor,\n}: {\n state: TransformState;\n isStringAlreadyImported: () => boolean;\n isJsxAlreadyImported: () => boolean;\n importAnchor: ImportAnchor;\n}): VisitNode<t.Node, t.Program> {\n return {\n exit(path) {\n // Read collected content, filtered by granular devHotReload config\n const allStrings = state.settings.devHotReload.strings\n ? [\n ...state.stringCollector.getAllTranslationContent(),\n ...state.stringCollector.getRuntimeOnlyContent(),\n ].filter((entry) => entry.hash !== '')\n : [];\n const allJsx = state.settings.devHotReload.jsx\n ? state.stringCollector\n .getAllTranslationJsx()\n .filter((entry) => entry.hash !== '')\n : [];\n\n // Nothing to inject\n if (allStrings.length === 0 && allJsx.length === 0) return;\n\n // Build the await Promise.all([...]) statement\n const promiseAllStatement = buildRuntimeTranslateCalls({\n strings: allStrings,\n jsx: allJsx,\n });\n\n // Inject import with only the specifiers that are needed and not already imported\n const needsString = allStrings.length > 0 && !isStringAlreadyImported();\n const needsJsx = allJsx.length > 0 && !isJsxAlreadyImported();\n\n if (needsString || needsJsx) {\n const injectedPath = injectRuntimeTranslateImport(path, {\n needsString,\n needsJsx,\n });\n if (injectedPath) {\n importAnchor.path = injectedPath;\n }\n }\n\n // Insert the Promise.all statement right after the runtime translate import\n if (importAnchor.path) {\n importAnchor.path.insertAfter(promiseAllStatement);\n } else {\n path.unshiftContainer('body', promiseAllStatement);\n }\n\n // Track that we injected runtime translate calls\n state.statistics.runtimeTranslateCount =\n allStrings.length + allJsx.length;\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,eAAe,EAC7B,OACA,yBACA,sBACA,gBAM+B;AAC/B,QAAO,EACL,KAAK,MAAM;EAET,MAAM,aAAa,MAAM,SAAS,aAAa,UAC3C,CACE,GAAG,MAAM,gBAAgB,0BAA0B,EACnD,GAAG,MAAM,gBAAgB,uBAAuB,CACjD,CAAC,QAAQ,UAAU,MAAM,SAAS,GAAG,GACtC,EAAE;EACN,MAAM,SAAS,MAAM,SAAS,aAAa,MACvC,MAAM,gBACH,sBAAsB,CACtB,QAAQ,UAAU,MAAM,SAAS,GAAG,GACvC,EAAE;AAGN,MAAI,WAAW,WAAW,KAAK,OAAO,WAAW,EAAG;EAGpD,MAAM,sBAAsBA,+DAAAA,2BAA2B;GACrD,SAAS;GACT,KAAK;GACN,CAAC;EAGF,MAAM,cAAc,WAAW,SAAS,KAAK,CAAC,yBAAyB;EACvE,MAAM,WAAW,OAAO,SAAS,KAAK,CAAC,sBAAsB;AAE7D,MAAI,eAAe,UAAU;GAC3B,MAAM,eAAeC,iEAAAA,6BAA6B,MAAM;IACtD;IACA;IACD,CAAC;AACF,OAAI,aACF,cAAa,OAAO;;AAKxB,MAAI,aAAa,KACf,cAAa,KAAK,YAAY,oBAAoB;MAElD,MAAK,iBAAiB,QAAQ,oBAAoB;AAIpD,QAAM,WAAW,wBACf,WAAW,SAAS,OAAO;IAEhC"}
1
+ {"version":3,"file":"processProgram.js","names":["buildRuntimeTranslateCalls","injectRuntimeTranslateImport"],"sources":["../../../src/processing/runtime-translate/processProgram.ts"],"sourcesContent":["import { TransformState } from '../../state/types';\nimport { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { injectRuntimeTranslateImport } from '../../transform/runtime-translate/injectRuntimeTranslateImport';\nimport { buildRuntimeTranslateCalls } from '../../transform/runtime-translate/buildRuntimeTranslateCalls';\nimport { ImportAnchor } from './processImportDeclaration';\n\n/**\n * Process program for runtime translate pass:\n * - On exit, reads collected strings and JSX content from StringCollector\n * - Filters out derive entries (hash === '')\n * - Injects import and await Promise.all([...]) with runtime translate calls\n */\nexport function processProgram({\n state,\n isStringAlreadyImported,\n isJsxAlreadyImported,\n importAnchor,\n}: {\n state: TransformState;\n isStringAlreadyImported: () => boolean;\n isJsxAlreadyImported: () => boolean;\n importAnchor: ImportAnchor;\n}): VisitNode<t.Node, t.Program> {\n return {\n exit(path) {\n // Read collected content, filtered by granular devHotReload config\n const allStrings = state.settings.devHotReload.strings\n ? [\n ...state.stringCollector.getAllTranslationContent(),\n ...state.stringCollector.getRuntimeOnlyContent(),\n ].filter((entry) => entry.hash !== '')\n : [];\n const allJsx = state.settings.devHotReload.jsx\n ? state.stringCollector\n .getAllTranslationJsx()\n .filter((entry) => entry.hash !== '')\n : [];\n\n // Nothing to inject\n if (allStrings.length === 0 && allJsx.length === 0) return;\n\n // Build the await Promise.all([...]) statement\n const promiseAllStatement = buildRuntimeTranslateCalls({\n strings: allStrings,\n jsx: allJsx,\n });\n\n // Inject import with only the specifiers that are needed and not already imported\n const needsString = allStrings.length > 0 && !isStringAlreadyImported();\n const needsJsx = allJsx.length > 0 && !isJsxAlreadyImported();\n\n if (needsString || needsJsx) {\n const injectedPath = injectRuntimeTranslateImport(path, {\n needsString,\n needsJsx,\n legacyGtReactImportSource: state.settings.legacyGtReactImportSource,\n });\n if (injectedPath) {\n importAnchor.path = injectedPath;\n }\n }\n\n // Insert the Promise.all statement right after the runtime translate import\n if (importAnchor.path) {\n importAnchor.path.insertAfter(promiseAllStatement);\n } else {\n path.unshiftContainer('body', promiseAllStatement);\n }\n\n // Track that we injected runtime translate calls\n state.statistics.runtimeTranslateCount =\n allStrings.length + allJsx.length;\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,eAAe,EAC7B,OACA,yBACA,sBACA,gBAM+B;AAC/B,QAAO,EACL,KAAK,MAAM;EAET,MAAM,aAAa,MAAM,SAAS,aAAa,UAC3C,CACE,GAAG,MAAM,gBAAgB,0BAA0B,EACnD,GAAG,MAAM,gBAAgB,uBAAuB,CACjD,CAAC,QAAQ,UAAU,MAAM,SAAS,GAAG,GACtC,EAAE;EACN,MAAM,SAAS,MAAM,SAAS,aAAa,MACvC,MAAM,gBACH,sBAAsB,CACtB,QAAQ,UAAU,MAAM,SAAS,GAAG,GACvC,EAAE;AAGN,MAAI,WAAW,WAAW,KAAK,OAAO,WAAW,EAAG;EAGpD,MAAM,sBAAsBA,+DAAAA,2BAA2B;GACrD,SAAS;GACT,KAAK;GACN,CAAC;EAGF,MAAM,cAAc,WAAW,SAAS,KAAK,CAAC,yBAAyB;EACvE,MAAM,WAAW,OAAO,SAAS,KAAK,CAAC,sBAAsB;AAE7D,MAAI,eAAe,UAAU;GAC3B,MAAM,eAAeC,iEAAAA,6BAA6B,MAAM;IACtD;IACA;IACA,2BAA2B,MAAM,SAAS;IAC3C,CAAC;AACF,OAAI,aACF,cAAa,OAAO;;AAKxB,MAAI,aAAa,KACf,cAAa,KAAK,YAAY,oBAAoB;MAElD,MAAK,iBAAiB,QAAQ,oBAAoB;AAIpD,QAAM,WAAW,wBACf,WAAW,SAAS,OAAO;IAEhC"}
@@ -12,11 +12,11 @@ export interface TranslationContent {
12
12
  message: string;
13
13
  /** Pre-calculated hash for this content */
14
14
  hash: string;
15
- /** Optional ID from options: t("text", {id: "greeting"}) → "greeting" */
15
+ /** Optional ID from options: t("text", {$id: "greeting"}) → "greeting" */
16
16
  id?: string;
17
- /** Optional context from options: t("text", {context: "nav"}) → "nav" */
17
+ /** Optional context from options: t("text", {$context: "nav"}) → "nav" */
18
18
  context?: string;
19
- /** Optional maxChars from options: t("text", {maxChars: 10}) → 10 */
19
+ /** Optional maxChars from options: t("text", {$maxChars: 10}) → 10 */
20
20
  maxChars?: number;
21
21
  /** Optional format from options: t("text", {$format: "STRING"}) → "STRING" */
22
22
  format?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"StringCollector.d.ts","sourceRoot":"","sources":["../../src/state/StringCollector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StringCollector.d.ts","sourceRoot":"","sources":["../../src/state/StringCollector.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"StringCollector.js","names":[],"sources":["../../src/state/StringCollector.ts"],"sourcesContent":["/**\n * String Collector - Manages translation content across two-pass transformation\n *\n * Pass 1: Collects translation strings, JSX content, and hash data\n * Pass 2: Injects collected data back into useGT()/getGT() calls\n */\n\n/**\n * Content extracted from a t() function call\n */\nexport interface TranslationContent {\n /** The string message: t(\"Hello world\") → \"Hello world\" */\n message: string;\n /** Pre-calculated hash for this content */\n hash: string;\n /** Optional ID from options: t(\"text\", {id: \"greeting\"}) → \"greeting\" */\n id?: string;\n /** Optional context from options: t(\"text\", {context: \"nav\"}) → \"nav\" */\n context?: string;\n /** Optional maxChars from options: t(\"text\", {maxChars: 10}) → 10 */\n maxChars?: number;\n /** Optional format from options: t(\"text\", {$format: \"STRING\"}) → \"STRING\" */\n format?: string;\n /** Optional requiresReview from options: t(\"text\", {$requiresReview: true}) → true */\n requiresReview?: boolean;\n}\n\n/**\n * Content extracted from JSX translation components like <T>\n */\nexport interface TranslationJsx {\n /** Pre-calculated hash for this JSX content */\n hash: string;\n /** JSX children structure (serializable) */\n children?: unknown;\n /** Optional ID from props */\n id?: string;\n /** Optional context from props */\n context?: string;\n /** Optional requiresReview from props */\n requiresReview?: boolean;\n}\n\n/**\n * Just a hash value for simple hash injection\n */\nexport interface TranslationHash {\n /** The hash value to inject */\n hash: string;\n}\n\ntype SerializedStringCollector = {\n contentAggregators: Record<string, TranslationContent[]>;\n jsxAggregators: Record<string, TranslationJsx>;\n hashAggregators: Record<string, TranslationHash>;\n globalCallCounter: number;\n};\n\n/**\n * String collector for two-pass transformation system\n */\nexport class StringCollector {\n /** Vector of translation calls indexed by counter ID */\n private contentAggregators: Map<number, TranslationContent[]> = new Map();\n private jsxAggregators: Map<number, TranslationJsx> = new Map();\n private hashAggregators: Map<number, TranslationHash> = new Map();\n /** Global counter incremented for each useGT/getGT call encountered */\n private globalCallCounter: number = 0;\n /** Runtime-only entries for standalone strings consumed by runtime translate */\n private runtimeOnlyEntries: TranslationContent[] = [];\n\n /**\n * Increment counter and return the current counter ID for a useGT/getGT call\n * These IDs are deterministic\n */\n incrementCounter(): number {\n this.globalCallCounter += 1;\n return this.globalCallCounter;\n }\n\n /**\n * Get current global counter value\n */\n getCounter(): number {\n return this.globalCallCounter;\n }\n\n /**\n * Pass 1: Add translation content from a gt() call to a specific useGT/getGT aggregator\n * Multiple content items can be added to the same call\n */\n pushTranslationContent(counterId: number, content: TranslationContent): void {\n if (counterId === -1) {\n throw new Error(\n 'Cannot have a counterId of -1. This likely means you are trying to register content from a namespace method invocation.'\n );\n }\n // Get the agreggator\n let aggregator = this.contentAggregators.get(counterId);\n if (!aggregator) {\n aggregator = [content];\n this.contentAggregators.set(counterId, aggregator);\n } else {\n aggregator.push(content);\n }\n }\n\n /**\n * Pass 1: Set JSX translation content for a specific useGT/getGT\n * Only one JSX item can be set per call (overwrites if called multiple times)\n */\n setTranslationJsx(counterId: number, jsx: TranslationJsx): void {\n this.jsxAggregators.set(counterId, jsx);\n }\n\n /**\n * Pass 1: Set hash-only content for a specific useGT/getGT\n * Only one hash can be set per call (overwrites if called multiple times)\n */\n setTranslationHash(counterId: number, hash: TranslationHash): void {\n this.hashAggregators.set(counterId, hash);\n }\n\n /**\n * Pass 2: Get translation call data for injection into a specific useGT/getGT call\n */\n getTranslationData(counterId: number):\n | {\n type: 'content' | 'jsx' | 'hash';\n value: TranslationContent[] | TranslationJsx | TranslationHash;\n }\n | undefined {\n if (this.contentAggregators.has(counterId)) {\n return {\n type: 'content',\n value: this.contentAggregators.get(counterId)!,\n };\n } else if (this.jsxAggregators.has(counterId)) {\n return { type: 'jsx', value: this.jsxAggregators.get(counterId)! };\n } else if (this.hashAggregators.has(counterId)) {\n return { type: 'hash', value: this.hashAggregators.get(counterId)! };\n }\n }\n\n /**\n * Get the translation content for a specific useGT/getGT call\n */\n getTranslationContent(counterId: number): TranslationContent[] | undefined {\n return this.contentAggregators.get(counterId);\n }\n\n /**\n * Get the translation JSX for a specific <T> component\n */\n getTranslationJsx(counterId: number): TranslationJsx | undefined {\n return this.jsxAggregators.get(counterId);\n }\n\n /**\n * Get the translation hash for a specific other call\n */\n getTranslationHash(counterId: number): TranslationHash | undefined {\n return this.hashAggregators.get(counterId);\n }\n\n /**\n * Reset all state (useful for testing)\n */\n clear(): void {\n this.contentAggregators.clear();\n this.jsxAggregators.clear();\n this.hashAggregators.clear();\n this.runtimeOnlyEntries = [];\n this.globalCallCounter = 0;\n }\n\n /**\n * Reset the counter to zero\n */\n resetCounter(): void {\n this.globalCallCounter = 0;\n }\n\n /**\n * Has content\n */\n hasContent(): boolean {\n return (\n this.contentAggregators.size +\n this.jsxAggregators.size +\n this.hashAggregators.size +\n this.runtimeOnlyEntries.length >\n 0\n );\n }\n\n /**\n * Get all translation content entries (flattened across all aggregators)\n */\n getAllTranslationContent(): TranslationContent[] {\n return Array.from(this.contentAggregators.values()).flat();\n }\n\n /**\n * Get all translation JSX entries\n */\n getAllTranslationJsx(): TranslationJsx[] {\n return Array.from(this.jsxAggregators.values());\n }\n\n /**\n * Add a runtime-only translation entry for the runtime translate pass.\n */\n pushRuntimeOnlyContent(content: TranslationContent): void {\n this.runtimeOnlyEntries.push(content);\n }\n\n /**\n * Get all runtime-only translation entries\n */\n getRuntimeOnlyContent(): TranslationContent[] {\n return this.runtimeOnlyEntries;\n }\n\n /**\n * Helper convert to string\n */\n serialize(): SerializedStringCollector {\n const output = {\n contentAggregators: Object.fromEntries(this.contentAggregators),\n jsxAggregators: Object.fromEntries(this.jsxAggregators),\n hashAggregators: Object.fromEntries(this.hashAggregators),\n globalCallCounter: this.globalCallCounter,\n };\n return output;\n }\n\n /**\n * Helper to repopulate\n */\n unserialize(input: SerializedStringCollector): void {\n this.contentAggregators = Object.entries(\n input.contentAggregators as Record<number, TranslationContent[]>\n ).reduce((acc, [key, value]) => {\n acc.set(Number(key), value);\n return acc;\n }, new Map<number, TranslationContent[]>());\n this.jsxAggregators = Object.entries(\n input.jsxAggregators as Record<number, TranslationJsx>\n ).reduce((acc, [key, value]) => {\n acc.set(Number(key), value);\n return acc;\n }, new Map<number, TranslationJsx>());\n this.hashAggregators = Object.entries(\n input.hashAggregators as Record<number, TranslationHash>\n ).reduce((acc, [key, value]) => {\n acc.set(Number(key), value);\n return acc;\n }, new Map<number, TranslationHash>());\n this.globalCallCounter = input.globalCallCounter;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"StringCollector.js","names":[],"sources":["../../src/state/StringCollector.ts"],"sourcesContent":["/**\n * String Collector - Manages translation content across two-pass transformation\n *\n * Pass 1: Collects translation strings, JSX content, and hash data\n * Pass 2: Injects collected data back into useGT()/getGT() calls\n */\n\n/**\n * Content extracted from a t() function call\n */\nexport interface TranslationContent {\n /** The string message: t(\"Hello world\") → \"Hello world\" */\n message: string;\n /** Pre-calculated hash for this content */\n hash: string;\n /** Optional ID from options: t(\"text\", {$id: \"greeting\"}) → \"greeting\" */\n id?: string;\n /** Optional context from options: t(\"text\", {$context: \"nav\"}) → \"nav\" */\n context?: string;\n /** Optional maxChars from options: t(\"text\", {$maxChars: 10}) → 10 */\n maxChars?: number;\n /** Optional format from options: t(\"text\", {$format: \"STRING\"}) → \"STRING\" */\n format?: string;\n /** Optional requiresReview from options: t(\"text\", {$requiresReview: true}) → true */\n requiresReview?: boolean;\n}\n\n/**\n * Content extracted from JSX translation components like <T>\n */\nexport interface TranslationJsx {\n /** Pre-calculated hash for this JSX content */\n hash: string;\n /** JSX children structure (serializable) */\n children?: unknown;\n /** Optional ID from props */\n id?: string;\n /** Optional context from props */\n context?: string;\n /** Optional requiresReview from props */\n requiresReview?: boolean;\n}\n\n/**\n * Just a hash value for simple hash injection\n */\nexport interface TranslationHash {\n /** The hash value to inject */\n hash: string;\n}\n\ntype SerializedStringCollector = {\n contentAggregators: Record<string, TranslationContent[]>;\n jsxAggregators: Record<string, TranslationJsx>;\n hashAggregators: Record<string, TranslationHash>;\n globalCallCounter: number;\n};\n\n/**\n * String collector for two-pass transformation system\n */\nexport class StringCollector {\n /** Vector of translation calls indexed by counter ID */\n private contentAggregators: Map<number, TranslationContent[]> = new Map();\n private jsxAggregators: Map<number, TranslationJsx> = new Map();\n private hashAggregators: Map<number, TranslationHash> = new Map();\n /** Global counter incremented for each useGT/getGT call encountered */\n private globalCallCounter: number = 0;\n /** Runtime-only entries for standalone strings consumed by runtime translate */\n private runtimeOnlyEntries: TranslationContent[] = [];\n\n /**\n * Increment counter and return the current counter ID for a useGT/getGT call\n * These IDs are deterministic\n */\n incrementCounter(): number {\n this.globalCallCounter += 1;\n return this.globalCallCounter;\n }\n\n /**\n * Get current global counter value\n */\n getCounter(): number {\n return this.globalCallCounter;\n }\n\n /**\n * Pass 1: Add translation content from a gt() call to a specific useGT/getGT aggregator\n * Multiple content items can be added to the same call\n */\n pushTranslationContent(counterId: number, content: TranslationContent): void {\n if (counterId === -1) {\n throw new Error(\n 'Cannot have a counterId of -1. This likely means you are trying to register content from a namespace method invocation.'\n );\n }\n // Get the agreggator\n let aggregator = this.contentAggregators.get(counterId);\n if (!aggregator) {\n aggregator = [content];\n this.contentAggregators.set(counterId, aggregator);\n } else {\n aggregator.push(content);\n }\n }\n\n /**\n * Pass 1: Set JSX translation content for a specific useGT/getGT\n * Only one JSX item can be set per call (overwrites if called multiple times)\n */\n setTranslationJsx(counterId: number, jsx: TranslationJsx): void {\n this.jsxAggregators.set(counterId, jsx);\n }\n\n /**\n * Pass 1: Set hash-only content for a specific useGT/getGT\n * Only one hash can be set per call (overwrites if called multiple times)\n */\n setTranslationHash(counterId: number, hash: TranslationHash): void {\n this.hashAggregators.set(counterId, hash);\n }\n\n /**\n * Pass 2: Get translation call data for injection into a specific useGT/getGT call\n */\n getTranslationData(counterId: number):\n | {\n type: 'content' | 'jsx' | 'hash';\n value: TranslationContent[] | TranslationJsx | TranslationHash;\n }\n | undefined {\n if (this.contentAggregators.has(counterId)) {\n return {\n type: 'content',\n value: this.contentAggregators.get(counterId)!,\n };\n } else if (this.jsxAggregators.has(counterId)) {\n return { type: 'jsx', value: this.jsxAggregators.get(counterId)! };\n } else if (this.hashAggregators.has(counterId)) {\n return { type: 'hash', value: this.hashAggregators.get(counterId)! };\n }\n }\n\n /**\n * Get the translation content for a specific useGT/getGT call\n */\n getTranslationContent(counterId: number): TranslationContent[] | undefined {\n return this.contentAggregators.get(counterId);\n }\n\n /**\n * Get the translation JSX for a specific <T> component\n */\n getTranslationJsx(counterId: number): TranslationJsx | undefined {\n return this.jsxAggregators.get(counterId);\n }\n\n /**\n * Get the translation hash for a specific other call\n */\n getTranslationHash(counterId: number): TranslationHash | undefined {\n return this.hashAggregators.get(counterId);\n }\n\n /**\n * Reset all state (useful for testing)\n */\n clear(): void {\n this.contentAggregators.clear();\n this.jsxAggregators.clear();\n this.hashAggregators.clear();\n this.runtimeOnlyEntries = [];\n this.globalCallCounter = 0;\n }\n\n /**\n * Reset the counter to zero\n */\n resetCounter(): void {\n this.globalCallCounter = 0;\n }\n\n /**\n * Has content\n */\n hasContent(): boolean {\n return (\n this.contentAggregators.size +\n this.jsxAggregators.size +\n this.hashAggregators.size +\n this.runtimeOnlyEntries.length >\n 0\n );\n }\n\n /**\n * Get all translation content entries (flattened across all aggregators)\n */\n getAllTranslationContent(): TranslationContent[] {\n return Array.from(this.contentAggregators.values()).flat();\n }\n\n /**\n * Get all translation JSX entries\n */\n getAllTranslationJsx(): TranslationJsx[] {\n return Array.from(this.jsxAggregators.values());\n }\n\n /**\n * Add a runtime-only translation entry for the runtime translate pass.\n */\n pushRuntimeOnlyContent(content: TranslationContent): void {\n this.runtimeOnlyEntries.push(content);\n }\n\n /**\n * Get all runtime-only translation entries\n */\n getRuntimeOnlyContent(): TranslationContent[] {\n return this.runtimeOnlyEntries;\n }\n\n /**\n * Helper convert to string\n */\n serialize(): SerializedStringCollector {\n const output = {\n contentAggregators: Object.fromEntries(this.contentAggregators),\n jsxAggregators: Object.fromEntries(this.jsxAggregators),\n hashAggregators: Object.fromEntries(this.hashAggregators),\n globalCallCounter: this.globalCallCounter,\n };\n return output;\n }\n\n /**\n * Helper to repopulate\n */\n unserialize(input: SerializedStringCollector): void {\n this.contentAggregators = Object.entries(\n input.contentAggregators as Record<number, TranslationContent[]>\n ).reduce((acc, [key, value]) => {\n acc.set(Number(key), value);\n return acc;\n }, new Map<number, TranslationContent[]>());\n this.jsxAggregators = Object.entries(\n input.jsxAggregators as Record<number, TranslationJsx>\n ).reduce((acc, [key, value]) => {\n acc.set(Number(key), value);\n return acc;\n }, new Map<number, TranslationJsx>());\n this.hashAggregators = Object.entries(\n input.hashAggregators as Record<number, TranslationHash>\n ).reduce((acc, [key, value]) => {\n acc.set(Number(key), value);\n return acc;\n }, new Map<number, TranslationHash>());\n this.globalCallCounter = input.globalCallCounter;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"initializeState.d.ts","sourceRoot":"","sources":["../../../src/state/utils/initializeState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AA4B1C;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,MAAM,GACf,cAAc,CAwDhB"}
1
+ {"version":3,"file":"initializeState.d.ts","sourceRoot":"","sources":["../../../src/state/utils/initializeState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAgC1C;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,MAAM,GACf,cAAc,CAsDhB"}
@@ -1,14 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_config = require("../../config.js");
3
- require("../../utils/constants/gt/constants.js");
4
3
  const require_state_ScopeTracker = require("../ScopeTracker.js");
4
+ require("../../utils/constants/gt/constants.js");
5
5
  const require_state_StringCollector = require("../StringCollector.js");
6
6
  const require_state_Logger = require("../Logger.js");
7
7
  const require_state_ErrorTracker = require("../ErrorTracker.js");
8
8
  //#region src/state/utils/initializeState.ts
9
9
  const DEFAULT_SETTINGS = {
10
10
  logLevel: "warn",
11
- compileTimeHash: false,
11
+ compileTimeHash: true,
12
12
  disableBuildChecks: false,
13
13
  enableMacroTransform: true,
14
14
  stringTranslationMacro: "t",
@@ -21,6 +21,7 @@ const DEFAULT_SETTINGS = {
21
21
  jsx: false,
22
22
  strings: false
23
23
  },
24
+ legacyGtReactImportSource: false,
24
25
  _debugHashManifest: false,
25
26
  devHotReload: {
26
27
  strings: false,
@@ -35,14 +36,16 @@ function initializeState(options, filename) {
35
36
  const gtConfig = options.gtConfig;
36
37
  const enableAutoJsxInjection = (gtConfig === null || gtConfig === void 0 || (_gtConfig$files = gtConfig.files) === null || _gtConfig$files === void 0 || (_gtConfig$files = _gtConfig$files.gt) === null || _gtConfig$files === void 0 || (_gtConfig$files = _gtConfig$files.parsingFlags) === null || _gtConfig$files === void 0 ? void 0 : _gtConfig$files.enableAutoJsxInjection) ?? false;
37
38
  const rawDevHotReload = (gtConfig === null || gtConfig === void 0 || (_gtConfig$files2 = gtConfig.files) === null || _gtConfig$files2 === void 0 || (_gtConfig$files2 = _gtConfig$files2.gt) === null || _gtConfig$files2 === void 0 || (_gtConfig$files2 = _gtConfig$files2.parsingFlags) === null || _gtConfig$files2 === void 0 ? void 0 : _gtConfig$files2.devHotReload) ?? false;
38
- const rawAutoderive = (gtConfig === null || gtConfig === void 0 || (_gtConfig$files3 = gtConfig.files) === null || _gtConfig$files3 === void 0 || (_gtConfig$files3 = _gtConfig$files3.gt) === null || _gtConfig$files3 === void 0 || (_gtConfig$files3 = _gtConfig$files3.parsingFlags) === null || _gtConfig$files3 === void 0 ? void 0 : _gtConfig$files3.autoderive) ?? (gtConfig === null || gtConfig === void 0 || (_gtConfig$files4 = gtConfig.files) === null || _gtConfig$files4 === void 0 || (_gtConfig$files4 = _gtConfig$files4.gt) === null || _gtConfig$files4 === void 0 || (_gtConfig$files4 = _gtConfig$files4.parsingFlags) === null || _gtConfig$files4 === void 0 ? void 0 : _gtConfig$files4.autoDerive) ?? false;
39
- const autoderive = require_config.resolveAutoderive(options.autoderive ?? options.autoDerive ?? void 0 ?? rawAutoderive);
39
+ const rawAutoderive = (gtConfig === null || gtConfig === void 0 || (_gtConfig$files3 = gtConfig.files) === null || _gtConfig$files3 === void 0 || (_gtConfig$files3 = _gtConfig$files3.gt) === null || _gtConfig$files3 === void 0 || (_gtConfig$files3 = _gtConfig$files3.parsingFlags) === null || _gtConfig$files3 === void 0 ? void 0 : _gtConfig$files3.autoderive) ?? false;
40
+ const legacyGtReactImportSource = options.legacyGtReactImportSource ?? (gtConfig === null || gtConfig === void 0 || (_gtConfig$files4 = gtConfig.files) === null || _gtConfig$files4 === void 0 || (_gtConfig$files4 = _gtConfig$files4.gt) === null || _gtConfig$files4 === void 0 || (_gtConfig$files4 = _gtConfig$files4.parsingFlags) === null || _gtConfig$files4 === void 0 ? void 0 : _gtConfig$files4.legacyGtReactImportSource) ?? false;
41
+ const autoderive = require_config.resolveAutoderive(options.autoderive ?? rawAutoderive);
40
42
  const devHotReload = require_config.resolveDevHotReload(options.devHotReload ?? void 0 ?? rawDevHotReload);
41
- const { autoderive: _a, autoDerive: _b, devHotReload: _c, ...restOptions } = options;
43
+ const { autoderive: _a, devHotReload: _b, legacyGtReactImportSource: _c, ...restOptions } = options;
42
44
  const settings = {
43
45
  ...DEFAULT_SETTINGS,
44
46
  enableAutoJsxInjection,
45
47
  autoderive,
48
+ legacyGtReactImportSource,
46
49
  devHotReload,
47
50
  ...restOptions,
48
51
  filename
@@ -1 +1 @@
1
- {"version":3,"file":"initializeState.js","names":["resolveAutoderive","resolveDevHotReload","StringCollector","ScopeTracker","Logger","ErrorTracker"],"sources":["../../../src/state/utils/initializeState.ts"],"sourcesContent":["import { GTUnpluginOptions } from '../..';\nimport { TransformState } from '../types';\nimport {\n PluginSettings,\n resolveAutoderive,\n resolveDevHotReload,\n} from '../../config';\nimport { StringCollector } from '../StringCollector';\nimport { ScopeTracker } from '../ScopeTracker';\nimport { Logger } from '../Logger';\nimport { ErrorTracker } from '../ErrorTracker';\nimport { GT_OTHER_FUNCTIONS } from '../../utils/constants/gt/constants';\n\nconst DEFAULT_SETTINGS: PluginSettings = {\n logLevel: 'warn',\n compileTimeHash: false,\n disableBuildChecks: false,\n enableMacroTransform: true,\n stringTranslationMacro: GT_OTHER_FUNCTIONS.t,\n enableTaggedTemplate: true,\n enableTemplateLiteralArg: true,\n enableConcatenationArg: true,\n enableMacroImportInjection: true,\n enableAutoJsxInjection: false,\n autoderive: { jsx: false, strings: false },\n _debugHashManifest: false,\n devHotReload: { strings: false, jsx: false },\n};\n\n/**\n * Initialize processing state for a file\n */\nexport function initializeState(\n options: GTUnpluginOptions,\n filename: string\n): TransformState {\n // Pull enableAutoJsxInjection from gtConfig if provided\n const gtConfig = options.gtConfig;\n const enableAutoJsxInjection =\n gtConfig?.files?.gt?.parsingFlags?.enableAutoJsxInjection ?? false;\n const rawDevHotReload =\n gtConfig?.files?.gt?.parsingFlags?.devHotReload ?? false;\n const rawAutoderive =\n gtConfig?.files?.gt?.parsingFlags?.autoderive ??\n gtConfig?.files?.gt?.parsingFlags?.autoDerive ??\n false;\n\n // Backwards compat: normalize deprecated autoDerive → autoderive from options\n const rawOptionsAutoderive =\n options.autoderive ?? options.autoDerive ?? undefined;\n\n const autoderive = resolveAutoderive(rawOptionsAutoderive ?? rawAutoderive);\n\n // Resolve devHotReload (options override gtConfig)\n const rawOptionsDevHotReload = options.devHotReload ?? undefined;\n const devHotReload = resolveDevHotReload(\n rawOptionsDevHotReload ?? rawDevHotReload\n );\n\n // Spread options but exclude already-resolved fields\n // eslint-disable-next-line no-unused-vars\n const {\n autoderive: _a,\n autoDerive: _b,\n devHotReload: _c,\n ...restOptions\n } = options;\n\n const settings: PluginSettings = {\n ...DEFAULT_SETTINGS,\n enableAutoJsxInjection, // can be overridden by options.enableAutoJsxInjection\n autoderive,\n devHotReload,\n ...restOptions,\n filename,\n };\n\n return {\n settings,\n stringCollector: new StringCollector(),\n scopeTracker: new ScopeTracker(),\n logger: new Logger(settings.logLevel),\n errorTracker: new ErrorTracker(),\n statistics: {\n jsxElementCount: 0,\n dynamicContentViolations: 0,\n macroExpansionsCount: 0,\n jsxInsertionsCount: 0,\n runtimeTranslateCount: 0,\n },\n };\n}\n"],"mappings":";;;;;;;;AAaA,MAAM,mBAAmC;CACvC,UAAU;CACV,iBAAiB;CACjB,oBAAoB;CACpB,sBAAsB;CACtB,wBAAA;CACA,sBAAsB;CACtB,0BAA0B;CAC1B,wBAAwB;CACxB,4BAA4B;CAC5B,wBAAwB;CACxB,YAAY;EAAE,KAAK;EAAO,SAAS;EAAO;CAC1C,oBAAoB;CACpB,cAAc;EAAE,SAAS;EAAO,KAAK;EAAO;CAC7C;;;;AAKD,SAAgB,gBACd,SACA,UACgB;;CAEhB,MAAM,WAAW,QAAQ;CACzB,MAAM,0BAAA,aAAA,QAAA,aAAA,KAAA,MAAA,kBACJ,SAAU,WAAA,QAAA,oBAAA,KAAA,MAAA,kBAAA,gBAAO,QAAA,QAAA,oBAAA,KAAA,MAAA,kBAAA,gBAAI,kBAAA,QAAA,oBAAA,KAAA,IAAA,KAAA,IAAA,gBAAc,2BAA0B;CAC/D,MAAM,mBAAA,aAAA,QAAA,aAAA,KAAA,MAAA,mBACJ,SAAU,WAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAO,QAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAI,kBAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAc,iBAAgB;CACrD,MAAM,iBAAA,aAAA,QAAA,aAAA,KAAA,MAAA,mBACJ,SAAU,WAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAO,QAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAI,kBAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAc,gBAAA,aAAA,QAAA,aAAA,KAAA,MAAA,mBACnC,SAAU,WAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAO,QAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAI,kBAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAc,eACnC;CAMF,MAAM,aAAaA,eAAAA,kBAFjB,QAAQ,cAAc,QAAQ,cAAc,KAAA,KAEe,cAAc;CAI3E,MAAM,eAAeC,eAAAA,oBADU,QAAQ,gBAAgB,KAAA,KAE3B,gBAC3B;CAID,MAAM,EACJ,YAAY,IACZ,YAAY,IACZ,cAAc,IACd,GAAG,gBACD;CAEJ,MAAM,WAA2B;EAC/B,GAAG;EACH;EACA;EACA;EACA,GAAG;EACH;EACD;AAED,QAAO;EACL;EACA,iBAAiB,IAAIC,8BAAAA,iBAAiB;EACtC,cAAc,IAAIC,2BAAAA,cAAc;EAChC,QAAQ,IAAIC,qBAAAA,OAAO,SAAS,SAAS;EACrC,cAAc,IAAIC,2BAAAA,cAAc;EAChC,YAAY;GACV,iBAAiB;GACjB,0BAA0B;GAC1B,sBAAsB;GACtB,oBAAoB;GACpB,uBAAuB;GACxB;EACF"}
1
+ {"version":3,"file":"initializeState.js","names":["resolveAutoderive","resolveDevHotReload","StringCollector","ScopeTracker","Logger","ErrorTracker"],"sources":["../../../src/state/utils/initializeState.ts"],"sourcesContent":["import { GTUnpluginOptions } from '../..';\nimport { TransformState } from '../types';\nimport {\n PluginSettings,\n resolveAutoderive,\n resolveDevHotReload,\n} from '../../config';\nimport { StringCollector } from '../StringCollector';\nimport { ScopeTracker } from '../ScopeTracker';\nimport { Logger } from '../Logger';\nimport { ErrorTracker } from '../ErrorTracker';\nimport { GT_OTHER_FUNCTIONS } from '../../utils/constants/gt/constants';\n\nconst DEFAULT_SETTINGS: PluginSettings = {\n logLevel: 'warn',\n // Hash injection is the plugin's default optimization; matches the gt-next\n // default, which historically matched observed behavior because injection\n // ran unconditionally\n compileTimeHash: true,\n disableBuildChecks: false,\n enableMacroTransform: true,\n stringTranslationMacro: GT_OTHER_FUNCTIONS.t,\n enableTaggedTemplate: true,\n enableTemplateLiteralArg: true,\n enableConcatenationArg: true,\n enableMacroImportInjection: true,\n enableAutoJsxInjection: false,\n autoderive: { jsx: false, strings: false },\n legacyGtReactImportSource: false,\n _debugHashManifest: false,\n devHotReload: { strings: false, jsx: false },\n};\n\n/**\n * Initialize processing state for a file\n */\nexport function initializeState(\n options: GTUnpluginOptions,\n filename: string\n): TransformState {\n // Pull enableAutoJsxInjection from gtConfig if provided\n const gtConfig = options.gtConfig;\n const enableAutoJsxInjection =\n gtConfig?.files?.gt?.parsingFlags?.enableAutoJsxInjection ?? false;\n const rawDevHotReload =\n gtConfig?.files?.gt?.parsingFlags?.devHotReload ?? false;\n const rawAutoderive = gtConfig?.files?.gt?.parsingFlags?.autoderive ?? false;\n const legacyGtReactImportSource =\n options.legacyGtReactImportSource ??\n gtConfig?.files?.gt?.parsingFlags?.legacyGtReactImportSource ??\n false;\n\n const autoderive = resolveAutoderive(options.autoderive ?? rawAutoderive);\n\n // Resolve devHotReload (options override gtConfig)\n const rawOptionsDevHotReload = options.devHotReload ?? undefined;\n const devHotReload = resolveDevHotReload(\n rawOptionsDevHotReload ?? rawDevHotReload\n );\n\n // Spread options but exclude already-resolved fields\n // eslint-disable-next-line no-unused-vars\n const {\n autoderive: _a,\n devHotReload: _b,\n legacyGtReactImportSource: _c,\n ...restOptions\n } = options;\n\n const settings: PluginSettings = {\n ...DEFAULT_SETTINGS,\n enableAutoJsxInjection, // can be overridden by options.enableAutoJsxInjection\n autoderive,\n legacyGtReactImportSource,\n devHotReload,\n ...restOptions,\n filename,\n };\n\n return {\n settings,\n stringCollector: new StringCollector(),\n scopeTracker: new ScopeTracker(),\n logger: new Logger(settings.logLevel),\n errorTracker: new ErrorTracker(),\n statistics: {\n jsxElementCount: 0,\n dynamicContentViolations: 0,\n macroExpansionsCount: 0,\n jsxInsertionsCount: 0,\n runtimeTranslateCount: 0,\n },\n };\n}\n"],"mappings":";;;;;;;;AAaA,MAAM,mBAAmC;CACvC,UAAU;CAIV,iBAAiB;CACjB,oBAAoB;CACpB,sBAAsB;CACtB,wBAAA;CACA,sBAAsB;CACtB,0BAA0B;CAC1B,wBAAwB;CACxB,4BAA4B;CAC5B,wBAAwB;CACxB,YAAY;EAAE,KAAK;EAAO,SAAS;EAAO;CAC1C,2BAA2B;CAC3B,oBAAoB;CACpB,cAAc;EAAE,SAAS;EAAO,KAAK;EAAO;CAC7C;;;;AAKD,SAAgB,gBACd,SACA,UACgB;;CAEhB,MAAM,WAAW,QAAQ;CACzB,MAAM,0BAAA,aAAA,QAAA,aAAA,KAAA,MAAA,kBACJ,SAAU,WAAA,QAAA,oBAAA,KAAA,MAAA,kBAAA,gBAAO,QAAA,QAAA,oBAAA,KAAA,MAAA,kBAAA,gBAAI,kBAAA,QAAA,oBAAA,KAAA,IAAA,KAAA,IAAA,gBAAc,2BAA0B;CAC/D,MAAM,mBAAA,aAAA,QAAA,aAAA,KAAA,MAAA,mBACJ,SAAU,WAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAO,QAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAI,kBAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAc,iBAAgB;CACrD,MAAM,iBAAA,aAAA,QAAA,aAAA,KAAA,MAAA,mBAAgB,SAAU,WAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAO,QAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAI,kBAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAc,eAAc;CACvE,MAAM,4BACJ,QAAQ,8BAAA,aAAA,QAAA,aAAA,KAAA,MAAA,mBACR,SAAU,WAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAO,QAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAI,kBAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAc,8BACnC;CAEF,MAAM,aAAaA,eAAAA,kBAAkB,QAAQ,cAAc,cAAc;CAIzE,MAAM,eAAeC,eAAAA,oBADU,QAAQ,gBAAgB,KAAA,KAE3B,gBAC3B;CAID,MAAM,EACJ,YAAY,IACZ,cAAc,IACd,2BAA2B,IAC3B,GAAG,gBACD;CAEJ,MAAM,WAA2B;EAC/B,GAAG;EACH;EACA;EACA;EACA;EACA,GAAG;EACH;EACD;AAED,QAAO;EACL;EACA,iBAAiB,IAAIC,8BAAAA,iBAAiB;EACtC,cAAc,IAAIC,2BAAAA,cAAc;EAChC,QAAQ,IAAIC,qBAAAA,OAAO,SAAS,SAAS;EACrC,cAAc,IAAIC,2BAAAA,cAAc;EAChC,YAAY;GACV,iBAAiB;GACjB,0BAA0B;GAC1B,sBAAsB;GACtB,oBAAoB;GACpB,uBAAuB;GACxB;EACF"}
@@ -2,7 +2,7 @@ import { TransformState } from '../../state/types';
2
2
  import * as t from '@babel/types';
3
3
  /**
4
4
  * inject parameters into invocation of translation function
5
- * - useGT(messages=[{hash, message, id, context, maxChars}])
5
+ * - useGT(messages=[{$_hash, message, $id, $context, $maxChars, $format}])
6
6
  */
7
7
  export declare function injectCallbackDeclaratorFunctionParameters(varDeclarator: t.VariableDeclarator, state: TransformState): void;
8
8
  //# sourceMappingURL=injectCallbackDeclaratorFunctionParameters.d.ts.map
@@ -12,7 +12,7 @@ _babel_types = require_runtime.__toESM(_babel_types);
12
12
  //#region src/transform/injection/injectCallbackDeclaratorFunctionParameters.ts
13
13
  /**
14
14
  * inject parameters into invocation of translation function
15
- * - useGT(messages=[{hash, message, id, context, maxChars}])
15
+ * - useGT(messages=[{$_hash, message, $id, $context, $maxChars, $format}])
16
16
  */
17
17
  function injectCallbackDeclaratorFunctionParameters(varDeclarator, state) {
18
18
  var _state$scopeTracker$g;
@@ -61,11 +61,12 @@ function injectUseGTParameters(expression, state, id) {
61
61
  const translationContent = state.stringCollector.getTranslationContent(id);
62
62
  if (!translationContent) return;
63
63
  expression.arguments = [_babel_types.arrayExpression(translationContent.map((content) => _babel_types.objectExpression([
64
- _babel_types.objectProperty(_babel_types.identifier("hash"), _babel_types.stringLiteral(content.hash)),
64
+ _babel_types.objectProperty(_babel_types.identifier("$_hash"), _babel_types.stringLiteral(content.hash)),
65
65
  _babel_types.objectProperty(_babel_types.identifier("message"), _babel_types.stringLiteral(content.message)),
66
- ...content.id ? [_babel_types.objectProperty(_babel_types.identifier("id"), _babel_types.stringLiteral(content.id))] : [],
67
- ...content.context ? [_babel_types.objectProperty(_babel_types.identifier("context"), _babel_types.stringLiteral(content.context))] : [],
68
- ...content.maxChars != null ? [_babel_types.objectProperty(_babel_types.identifier("maxChars"), _babel_types.numericLiteral(content.maxChars))] : []
66
+ ...content.id ? [_babel_types.objectProperty(_babel_types.identifier("$id"), _babel_types.stringLiteral(content.id))] : [],
67
+ ...content.context ? [_babel_types.objectProperty(_babel_types.identifier("$context"), _babel_types.stringLiteral(content.context))] : [],
68
+ ...content.maxChars != null ? [_babel_types.objectProperty(_babel_types.identifier("$maxChars"), _babel_types.numericLiteral(content.maxChars))] : [],
69
+ ...content.format ? [_babel_types.objectProperty(_babel_types.identifier("$format"), _babel_types.stringLiteral(content.format))] : []
69
70
  ])))];
70
71
  }
71
72
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"injectCallbackDeclaratorFunctionParameters.js","names":["t","getCalleeNameFromExpressionWrapper","getTrackedVariable","extractIdentifiersFromLVal","isGTFunctionWithCallbacks","createErrorLocation"],"sources":["../../../src/transform/injection/injectCallbackDeclaratorFunctionParameters.ts"],"sourcesContent":["import { TransformState } from '../../state/types';\nimport * as t from '@babel/types';\nimport { getTrackedVariable } from '../getTrackedVariable';\nimport { getCalleeNameFromExpressionWrapper } from '../../utils/parsing/getCalleeNameFromExpressionWrapper';\nimport { isGTFunctionWithCallbacks } from '../../utils/constants/gt/helpers';\nimport { GT_FUNCTIONS_WITH_CALLBACKS } from '../../utils/constants/gt/constants';\nimport { extractIdentifiersFromLVal } from '../../utils/parsing/extractIdentifiersFromLVal';\nimport { trackOverridingVariable } from '../tracking/trackOverridingVariable';\nimport { createErrorLocation } from '../../utils/errors';\n\n/**\n * inject parameters into invocation of translation function\n * - useGT(messages=[{hash, message, id, context, maxChars}])\n */\nexport function injectCallbackDeclaratorFunctionParameters(\n varDeclarator: t.VariableDeclarator,\n state: TransformState\n): void {\n // Ignore non-LVal assignments\n if (!t.isLVal(varDeclarator.id)) {\n return;\n }\n\n // Get function name from callee\n const { namespaceName, functionName } = getCalleeNameFromExpressionWrapper(\n varDeclarator.init\n );\n if (!functionName) {\n return;\n }\n\n // Get the canonical function name\n const { canonicalName, type } = getTrackedVariable(\n state.scopeTracker,\n namespaceName,\n functionName\n );\n if (!canonicalName) {\n return;\n }\n\n // Extract identifiers from the LVal\n const identifiers = extractIdentifiersFromLVal(varDeclarator.id);\n\n // Validate the type\n if (\n type !== 'generaltranslation' ||\n !isGTFunctionWithCallbacks(canonicalName)\n ) {\n // Track as an overriding variable\n for (const identifier of identifiers) {\n trackOverridingVariable(identifier, state.scopeTracker);\n }\n return;\n }\n\n // There can only be one callback defined for const gt = useGT()\n if (identifiers.length !== 1) {\n state.logger.logError(\n `Multiple identifiers found for GT function with callbacks: ${canonicalName}. Parameter injection failed.` +\n createErrorLocation(varDeclarator.id)\n );\n return;\n }\n const identifier = identifiers[0];\n\n // Inject the parameters into the call expression\n const expression = getFunctionInvocation(varDeclarator);\n if (!expression) {\n state.logger.logError(\n `No valid function invocation found for ${functionName}. Parameter injection failed.` +\n createErrorLocation(varDeclarator.id)\n );\n return;\n }\n if (expression.arguments.length > 0) {\n // Found existing arguments, skip injection\n return;\n }\n\n // Look up identifier\n const id = state.scopeTracker.getVariable(identifier)?.identifier;\n if (!id) {\n state.logger.logError(\n `No translation callback variable found for ${identifier}. Parameter injection failed.` +\n createErrorLocation(varDeclarator.id)\n );\n return;\n }\n // Inject into the callees\n switch (canonicalName) {\n case GT_FUNCTIONS_WITH_CALLBACKS.useGT:\n case GT_FUNCTIONS_WITH_CALLBACKS.getGT:\n injectUseGTParameters(expression, state, id);\n break;\n default:\n return;\n }\n}\n\n/**\n * Inject the parameters into the useGT/getGT call\n * @param arguments - The arguments\n * @param state - The state\n * @param identifier - The identifier\n * @param translationContent - The translation content\n */\nfunction injectUseGTParameters(\n expression: t.CallExpression,\n state: TransformState,\n id: number\n) {\n // Get the corresponding callback injection data\n const translationContent = state.stringCollector.getTranslationContent(id);\n if (!translationContent) {\n return;\n }\n\n // Inject the parameters into the call expression\n expression.arguments = [\n t.arrayExpression(\n translationContent.map((content) =>\n t.objectExpression([\n t.objectProperty(t.identifier('hash'), t.stringLiteral(content.hash)),\n t.objectProperty(\n t.identifier('message'),\n t.stringLiteral(content.message)\n ),\n ...(content.id\n ? [\n t.objectProperty(\n t.identifier('id'),\n t.stringLiteral(content.id)\n ),\n ]\n : []),\n ...(content.context\n ? [\n t.objectProperty(\n t.identifier('context'),\n t.stringLiteral(content.context)\n ),\n ]\n : []),\n ...(content.maxChars != null\n ? [\n t.objectProperty(\n t.identifier('maxChars'),\n t.numericLiteral(content.maxChars)\n ),\n ]\n : []),\n ])\n )\n ),\n ];\n}\n\n/**\n * Get the function invocation from the variable declarator\n * @param varDeclarator - The variable declarator\n */\nfunction getFunctionInvocation(\n varDeclarator: t.VariableDeclarator\n): t.CallExpression | undefined {\n const expression = varDeclarator.init;\n if (!expression) {\n // failed\n return;\n }\n if (t.isCallExpression(expression)) {\n return expression;\n }\n if (\n t.isAwaitExpression(expression) &&\n t.isCallExpression(expression.argument)\n ) {\n return expression.argument;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,SAAgB,2CACd,eACA,OACM;;AAEN,KAAI,CAACA,aAAE,OAAO,cAAc,GAAG,CAC7B;CAIF,MAAM,EAAE,eAAe,iBAAiBC,yDAAAA,mCACtC,cAAc,KACf;AACD,KAAI,CAAC,aACH;CAIF,MAAM,EAAE,eAAe,SAASC,qCAAAA,mBAC9B,MAAM,cACN,eACA,aACD;AACD,KAAI,CAAC,cACH;CAIF,MAAM,cAAcC,iDAAAA,2BAA2B,cAAc,GAAG;AAGhE,KACE,SAAS,wBACT,CAACC,mCAAAA,0BAA0B,cAAc,EACzC;AAEA,OAAK,MAAM,cAAc,YACvB,oDAAA,wBAAwB,YAAY,MAAM,aAAa;AAEzD;;AAIF,KAAI,YAAY,WAAW,GAAG;AAC5B,QAAM,OAAO,SACX,8DAA8D,cAAc,iCAC1EC,qBAAAA,oBAAoB,cAAc,GAAG,CACxC;AACD;;CAEF,MAAM,aAAa,YAAY;CAG/B,MAAM,aAAa,sBAAsB,cAAc;AACvD,KAAI,CAAC,YAAY;AACf,QAAM,OAAO,SACX,0CAA0C,aAAa,iCACrDA,qBAAAA,oBAAoB,cAAc,GAAG,CACxC;AACD;;AAEF,KAAI,WAAW,UAAU,SAAS,EAEhC;CAIF,MAAM,MAAA,wBAAK,MAAM,aAAa,YAAY,WAAW,MAAA,QAAA,0BAAA,KAAA,IAAA,KAAA,IAAA,sBAAE;AACvD,KAAI,CAAC,IAAI;AACP,QAAM,OAAO,SACX,8CAA8C,WAAW,iCACvDA,qBAAAA,oBAAoB,cAAc,GAAG,CACxC;AACD;;AAGF,SAAQ,eAAR;EACE,KAAA;EACA,KAAA;AACE,yBAAsB,YAAY,OAAO,GAAG;AAC5C;EACF,QACE;;;;;;;;;;AAWN,SAAS,sBACP,YACA,OACA,IACA;CAEA,MAAM,qBAAqB,MAAM,gBAAgB,sBAAsB,GAAG;AAC1E,KAAI,CAAC,mBACH;AAIF,YAAW,YAAY,CACrBL,aAAE,gBACA,mBAAmB,KAAK,YACtBA,aAAE,iBAAiB;EACjBA,aAAE,eAAeA,aAAE,WAAW,OAAO,EAAEA,aAAE,cAAc,QAAQ,KAAK,CAAC;EACrEA,aAAE,eACAA,aAAE,WAAW,UAAU,EACvBA,aAAE,cAAc,QAAQ,QAAQ,CACjC;EACD,GAAI,QAAQ,KACR,CACEA,aAAE,eACAA,aAAE,WAAW,KAAK,EAClBA,aAAE,cAAc,QAAQ,GAAG,CAC5B,CACF,GACD,EAAE;EACN,GAAI,QAAQ,UACR,CACEA,aAAE,eACAA,aAAE,WAAW,UAAU,EACvBA,aAAE,cAAc,QAAQ,QAAQ,CACjC,CACF,GACD,EAAE;EACN,GAAI,QAAQ,YAAY,OACpB,CACEA,aAAE,eACAA,aAAE,WAAW,WAAW,EACxBA,aAAE,eAAe,QAAQ,SAAS,CACnC,CACF,GACD,EAAE;EACP,CAAC,CACH,CACF,CACF;;;;;;AAOH,SAAS,sBACP,eAC8B;CAC9B,MAAM,aAAa,cAAc;AACjC,KAAI,CAAC,WAEH;AAEF,KAAIA,aAAE,iBAAiB,WAAW,CAChC,QAAO;AAET,KACEA,aAAE,kBAAkB,WAAW,IAC/BA,aAAE,iBAAiB,WAAW,SAAS,CAEvC,QAAO,WAAW"}
1
+ {"version":3,"file":"injectCallbackDeclaratorFunctionParameters.js","names":["t","getCalleeNameFromExpressionWrapper","getTrackedVariable","extractIdentifiersFromLVal","isGTFunctionWithCallbacks","createErrorLocation"],"sources":["../../../src/transform/injection/injectCallbackDeclaratorFunctionParameters.ts"],"sourcesContent":["import { TransformState } from '../../state/types';\nimport * as t from '@babel/types';\nimport { getTrackedVariable } from '../getTrackedVariable';\nimport { getCalleeNameFromExpressionWrapper } from '../../utils/parsing/getCalleeNameFromExpressionWrapper';\nimport { isGTFunctionWithCallbacks } from '../../utils/constants/gt/helpers';\nimport { GT_FUNCTIONS_WITH_CALLBACKS } from '../../utils/constants/gt/constants';\nimport { extractIdentifiersFromLVal } from '../../utils/parsing/extractIdentifiersFromLVal';\nimport { trackOverridingVariable } from '../tracking/trackOverridingVariable';\nimport { createErrorLocation } from '../../utils/errors';\n\n/**\n * inject parameters into invocation of translation function\n * - useGT(messages=[{$_hash, message, $id, $context, $maxChars, $format}])\n */\nexport function injectCallbackDeclaratorFunctionParameters(\n varDeclarator: t.VariableDeclarator,\n state: TransformState\n): void {\n // Ignore non-LVal assignments\n if (!t.isLVal(varDeclarator.id)) {\n return;\n }\n\n // Get function name from callee\n const { namespaceName, functionName } = getCalleeNameFromExpressionWrapper(\n varDeclarator.init\n );\n if (!functionName) {\n return;\n }\n\n // Get the canonical function name\n const { canonicalName, type } = getTrackedVariable(\n state.scopeTracker,\n namespaceName,\n functionName\n );\n if (!canonicalName) {\n return;\n }\n\n // Extract identifiers from the LVal\n const identifiers = extractIdentifiersFromLVal(varDeclarator.id);\n\n // Validate the type\n if (\n type !== 'generaltranslation' ||\n !isGTFunctionWithCallbacks(canonicalName)\n ) {\n // Track as an overriding variable\n for (const identifier of identifiers) {\n trackOverridingVariable(identifier, state.scopeTracker);\n }\n return;\n }\n\n // There can only be one callback defined for const gt = useGT()\n if (identifiers.length !== 1) {\n state.logger.logError(\n `Multiple identifiers found for GT function with callbacks: ${canonicalName}. Parameter injection failed.` +\n createErrorLocation(varDeclarator.id)\n );\n return;\n }\n const identifier = identifiers[0];\n\n // Inject the parameters into the call expression\n const expression = getFunctionInvocation(varDeclarator);\n if (!expression) {\n state.logger.logError(\n `No valid function invocation found for ${functionName}. Parameter injection failed.` +\n createErrorLocation(varDeclarator.id)\n );\n return;\n }\n if (expression.arguments.length > 0) {\n // Found existing arguments, skip injection\n return;\n }\n\n // Look up identifier\n const id = state.scopeTracker.getVariable(identifier)?.identifier;\n if (!id) {\n state.logger.logError(\n `No translation callback variable found for ${identifier}. Parameter injection failed.` +\n createErrorLocation(varDeclarator.id)\n );\n return;\n }\n // Inject into the callees\n switch (canonicalName) {\n case GT_FUNCTIONS_WITH_CALLBACKS.useGT:\n case GT_FUNCTIONS_WITH_CALLBACKS.getGT:\n injectUseGTParameters(expression, state, id);\n break;\n default:\n return;\n }\n}\n\n/**\n * Inject the parameters into the useGT/getGT call\n * @param arguments - The arguments\n * @param state - The state\n * @param identifier - The identifier\n * @param translationContent - The translation content\n */\nfunction injectUseGTParameters(\n expression: t.CallExpression,\n state: TransformState,\n id: number\n) {\n // Get the corresponding callback injection data\n const translationContent = state.stringCollector.getTranslationContent(id);\n if (!translationContent) {\n return;\n }\n\n // Inject the parameters into the call expression\n expression.arguments = [\n t.arrayExpression(\n translationContent.map((content) =>\n t.objectExpression([\n t.objectProperty(\n t.identifier('$_hash'),\n t.stringLiteral(content.hash)\n ),\n t.objectProperty(\n t.identifier('message'),\n t.stringLiteral(content.message)\n ),\n ...(content.id\n ? [\n t.objectProperty(\n t.identifier('$id'),\n t.stringLiteral(content.id)\n ),\n ]\n : []),\n ...(content.context\n ? [\n t.objectProperty(\n t.identifier('$context'),\n t.stringLiteral(content.context)\n ),\n ]\n : []),\n ...(content.maxChars != null\n ? [\n t.objectProperty(\n t.identifier('$maxChars'),\n t.numericLiteral(content.maxChars)\n ),\n ]\n : []),\n ...(content.format\n ? [\n t.objectProperty(\n t.identifier('$format'),\n t.stringLiteral(content.format)\n ),\n ]\n : []),\n ])\n )\n ),\n ];\n}\n\n/**\n * Get the function invocation from the variable declarator\n * @param varDeclarator - The variable declarator\n */\nfunction getFunctionInvocation(\n varDeclarator: t.VariableDeclarator\n): t.CallExpression | undefined {\n const expression = varDeclarator.init;\n if (!expression) {\n // failed\n return;\n }\n if (t.isCallExpression(expression)) {\n return expression;\n }\n if (\n t.isAwaitExpression(expression) &&\n t.isCallExpression(expression.argument)\n ) {\n return expression.argument;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,SAAgB,2CACd,eACA,OACM;;AAEN,KAAI,CAACA,aAAE,OAAO,cAAc,GAAG,CAC7B;CAIF,MAAM,EAAE,eAAe,iBAAiBC,yDAAAA,mCACtC,cAAc,KACf;AACD,KAAI,CAAC,aACH;CAIF,MAAM,EAAE,eAAe,SAASC,qCAAAA,mBAC9B,MAAM,cACN,eACA,aACD;AACD,KAAI,CAAC,cACH;CAIF,MAAM,cAAcC,iDAAAA,2BAA2B,cAAc,GAAG;AAGhE,KACE,SAAS,wBACT,CAACC,mCAAAA,0BAA0B,cAAc,EACzC;AAEA,OAAK,MAAM,cAAc,YACvB,oDAAA,wBAAwB,YAAY,MAAM,aAAa;AAEzD;;AAIF,KAAI,YAAY,WAAW,GAAG;AAC5B,QAAM,OAAO,SACX,8DAA8D,cAAc,iCAC1EC,qBAAAA,oBAAoB,cAAc,GAAG,CACxC;AACD;;CAEF,MAAM,aAAa,YAAY;CAG/B,MAAM,aAAa,sBAAsB,cAAc;AACvD,KAAI,CAAC,YAAY;AACf,QAAM,OAAO,SACX,0CAA0C,aAAa,iCACrDA,qBAAAA,oBAAoB,cAAc,GAAG,CACxC;AACD;;AAEF,KAAI,WAAW,UAAU,SAAS,EAEhC;CAIF,MAAM,MAAA,wBAAK,MAAM,aAAa,YAAY,WAAW,MAAA,QAAA,0BAAA,KAAA,IAAA,KAAA,IAAA,sBAAE;AACvD,KAAI,CAAC,IAAI;AACP,QAAM,OAAO,SACX,8CAA8C,WAAW,iCACvDA,qBAAAA,oBAAoB,cAAc,GAAG,CACxC;AACD;;AAGF,SAAQ,eAAR;EACE,KAAA;EACA,KAAA;AACE,yBAAsB,YAAY,OAAO,GAAG;AAC5C;EACF,QACE;;;;;;;;;;AAWN,SAAS,sBACP,YACA,OACA,IACA;CAEA,MAAM,qBAAqB,MAAM,gBAAgB,sBAAsB,GAAG;AAC1E,KAAI,CAAC,mBACH;AAIF,YAAW,YAAY,CACrBL,aAAE,gBACA,mBAAmB,KAAK,YACtBA,aAAE,iBAAiB;EACjBA,aAAE,eACAA,aAAE,WAAW,SAAS,EACtBA,aAAE,cAAc,QAAQ,KAAK,CAC9B;EACDA,aAAE,eACAA,aAAE,WAAW,UAAU,EACvBA,aAAE,cAAc,QAAQ,QAAQ,CACjC;EACD,GAAI,QAAQ,KACR,CACEA,aAAE,eACAA,aAAE,WAAW,MAAM,EACnBA,aAAE,cAAc,QAAQ,GAAG,CAC5B,CACF,GACD,EAAE;EACN,GAAI,QAAQ,UACR,CACEA,aAAE,eACAA,aAAE,WAAW,WAAW,EACxBA,aAAE,cAAc,QAAQ,QAAQ,CACjC,CACF,GACD,EAAE;EACN,GAAI,QAAQ,YAAY,OACpB,CACEA,aAAE,eACAA,aAAE,WAAW,YAAY,EACzBA,aAAE,eAAe,QAAQ,SAAS,CACnC,CACF,GACD,EAAE;EACN,GAAI,QAAQ,SACR,CACEA,aAAE,eACAA,aAAE,WAAW,UAAU,EACvBA,aAAE,cAAc,QAAQ,OAAO,CAChC,CACF,GACD,EAAE;EACP,CAAC,CACH,CACF,CACF;;;;;;AAOH,SAAS,sBACP,eAC8B;CAC9B,MAAM,aAAa,cAAc;AACjC,KAAI,CAAC,WAEH;AAEF,KAAIA,aAAE,iBAAiB,WAAW,CAChC,QAAO;AAET,KACEA,aAAE,kBAAkB,WAAW,IAC/BA,aAAE,iBAAiB,WAAW,SAAS,CAEvC,QAAO,WAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"injectHashIntoTranslationOptions.d.ts","sourceRoot":"","sources":["../../../src/transform/injection/injectHashIntoTranslationOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,CAAC,CAAC,cAAc,EAC1B,IAAI,EAAE,MAAM,GACX,IAAI,CA0BN"}
1
+ {"version":3,"file":"injectHashIntoTranslationOptions.d.ts","sourceRoot":"","sources":["../../../src/transform/injection/injectHashIntoTranslationOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,CAAC,CAAC,cAAc,EAC1B,IAAI,EAAE,MAAM,GACX,IAAI,CAgCN"}
@@ -8,6 +8,7 @@ _babel_types = require_runtime.__toESM(_babel_types);
8
8
  * Inject $_hash into the second options argument for string translation calls.
9
9
  */
10
10
  function injectHashIntoTranslationOptions(callExpr, hash) {
11
+ if (!hash) return;
11
12
  const newEntry = _babel_types.objectProperty(_babel_types.stringLiteral("$_hash"), _babel_types.stringLiteral(hash));
12
13
  if (callExpr.arguments.length === 1) {
13
14
  callExpr.arguments.push(_babel_types.objectExpression([newEntry]));
@@ -1 +1 @@
1
- {"version":3,"file":"injectHashIntoTranslationOptions.js","names":["t"],"sources":["../../../src/transform/injection/injectHashIntoTranslationOptions.ts"],"sourcesContent":["import * as t from '@babel/types';\nimport { USEGT_CALLBACK_OPTIONS } from '../../utils/constants/gt/constants';\n\n/**\n * Inject $_hash into the second options argument for string translation calls.\n */\nexport function injectHashIntoTranslationOptions(\n callExpr: t.CallExpression,\n hash: string\n): void {\n const newEntry = t.objectProperty(\n t.stringLiteral(USEGT_CALLBACK_OPTIONS.$_hash),\n t.stringLiteral(hash)\n );\n\n if (callExpr.arguments.length === 1) {\n callExpr.arguments.push(t.objectExpression([newEntry]));\n return;\n }\n\n if (callExpr.arguments.length !== 2) {\n return;\n }\n\n const optionsArg = callExpr.arguments[1];\n if (t.isObjectExpression(optionsArg)) {\n optionsArg.properties.push(newEntry);\n } else if (t.isExpression(optionsArg)) {\n callExpr.arguments[1] = t.objectExpression([\n t.spreadElement(optionsArg),\n newEntry,\n ]);\n } else if (t.isArgumentPlaceholder(optionsArg)) {\n callExpr.arguments[1] = t.objectExpression([newEntry]);\n }\n}\n"],"mappings":";;;;;;;;;AAMA,SAAgB,iCACd,UACA,MACM;CACN,MAAM,WAAWA,aAAE,eACjBA,aAAE,cAAA,SAA4C,EAC9CA,aAAE,cAAc,KAAK,CACtB;AAED,KAAI,SAAS,UAAU,WAAW,GAAG;AACnC,WAAS,UAAU,KAAKA,aAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACvD;;AAGF,KAAI,SAAS,UAAU,WAAW,EAChC;CAGF,MAAM,aAAa,SAAS,UAAU;AACtC,KAAIA,aAAE,mBAAmB,WAAW,CAClC,YAAW,WAAW,KAAK,SAAS;UAC3BA,aAAE,aAAa,WAAW,CACnC,UAAS,UAAU,KAAKA,aAAE,iBAAiB,CACzCA,aAAE,cAAc,WAAW,EAC3B,SACD,CAAC;UACOA,aAAE,sBAAsB,WAAW,CAC5C,UAAS,UAAU,KAAKA,aAAE,iBAAiB,CAAC,SAAS,CAAC"}
1
+ {"version":3,"file":"injectHashIntoTranslationOptions.js","names":["t"],"sources":["../../../src/transform/injection/injectHashIntoTranslationOptions.ts"],"sourcesContent":["import * as t from '@babel/types';\nimport { USEGT_CALLBACK_OPTIONS } from '../../utils/constants/gt/constants';\n\n/**\n * Inject $_hash into the second options argument for string translation calls.\n */\nexport function injectHashIntoTranslationOptions(\n callExpr: t.CallExpression,\n hash: string\n): void {\n // Never inject an empty hash — the runtime reads $_hash with ?? so an\n // empty string would be used for the lookup instead of a computed hash\n if (!hash) {\n return;\n }\n\n const newEntry = t.objectProperty(\n t.stringLiteral(USEGT_CALLBACK_OPTIONS.$_hash),\n t.stringLiteral(hash)\n );\n\n if (callExpr.arguments.length === 1) {\n callExpr.arguments.push(t.objectExpression([newEntry]));\n return;\n }\n\n if (callExpr.arguments.length !== 2) {\n return;\n }\n\n const optionsArg = callExpr.arguments[1];\n if (t.isObjectExpression(optionsArg)) {\n optionsArg.properties.push(newEntry);\n } else if (t.isExpression(optionsArg)) {\n callExpr.arguments[1] = t.objectExpression([\n t.spreadElement(optionsArg),\n newEntry,\n ]);\n } else if (t.isArgumentPlaceholder(optionsArg)) {\n callExpr.arguments[1] = t.objectExpression([newEntry]);\n }\n}\n"],"mappings":";;;;;;;;;AAMA,SAAgB,iCACd,UACA,MACM;AAGN,KAAI,CAAC,KACH;CAGF,MAAM,WAAWA,aAAE,eACjBA,aAAE,cAAA,SAA4C,EAC9CA,aAAE,cAAc,KAAK,CACtB;AAED,KAAI,SAAS,UAAU,WAAW,GAAG;AACnC,WAAS,UAAU,KAAKA,aAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACvD;;AAGF,KAAI,SAAS,UAAU,WAAW,EAChC;CAGF,MAAM,aAAa,SAAS,UAAU;AACtC,KAAIA,aAAE,mBAAmB,WAAW,CAClC,YAAW,WAAW,KAAK,SAAS;UAC3BA,aAAE,aAAa,WAAW,CACnC,UAAS,UAAU,KAAKA,aAAE,iBAAiB,CACzCA,aAAE,cAAc,WAAW,EAC3B,SACD,CAAC;UACOA,aAAE,sBAAsB,WAAW,CAC5C,UAAS,UAAU,KAAKA,aAAE,iBAAiB,CAAC,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"injectTComponentParameters.d.ts","sourceRoot":"","sources":["../../../src/transform/injection/injectTComponentParameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,CAAC,CAAC,cAAc,EAC1B,KAAK,EAAE,cAAc,QAuCtB"}
1
+ {"version":3,"file":"injectTComponentParameters.d.ts","sourceRoot":"","sources":["../../../src/transform/injection/injectTComponentParameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,CAAC,CAAC,cAAc,EAC1B,KAAK,EAAE,cAAc,QA8CtB"}
@@ -12,6 +12,7 @@ function injectTComponentParameters(callExpr, state) {
12
12
  const identifier = state.stringCollector.incrementCounter();
13
13
  const translationJsx = state.stringCollector.getTranslationJsx(identifier);
14
14
  if (!translationJsx) return;
15
+ if (!translationJsx.hash) return;
15
16
  if (callExpr.arguments.length < 2 || !callExpr.arguments[1]) {
16
17
  state.logger.logError("T component jsx invocation is missing its second argument. Parameter injection failed." + require_utils_errors.createErrorLocation(callExpr));
17
18
  return;
@@ -20,7 +21,7 @@ function injectTComponentParameters(callExpr, state) {
20
21
  state.logger.logError("T component jsx invocation's second argument is not an object expression. Parameter injection failed." + require_utils_errors.createErrorLocation(callExpr));
21
22
  return;
22
23
  }
23
- if (require_utils_parsing_getObjectPropertyFromObjectExpression.getObjectPropertyFromObjectExpression(callExpr.arguments[1], "hash")) return;
24
+ if (require_utils_parsing_getObjectPropertyFromObjectExpression.getObjectPropertyFromObjectExpression(callExpr.arguments[1], "_hash")) return;
24
25
  callExpr.arguments[1].properties.push(_babel_types.objectProperty(_babel_types.identifier("_hash"), _babel_types.stringLiteral(translationJsx.hash)));
25
26
  }
26
27
  //#endregion