gt 2.14.58 → 2.14.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +279 -0
- package/dist/cli/base.d.ts +8 -0
- package/dist/cli/base.js +44 -1
- package/dist/cli/base.js.map +1 -1
- package/dist/cli/commands/download.js +1 -2
- package/dist/cli/commands/download.js.map +1 -1
- package/dist/cli/commands/enqueue.js +1 -2
- package/dist/cli/commands/enqueue.js.map +1 -1
- package/dist/cli/commands/stage.js +6 -2
- package/dist/cli/commands/stage.js.map +1 -1
- package/dist/cli/flags.js +1 -1
- package/dist/cli/flags.js.map +1 -1
- package/dist/cli/inline.js +2 -3
- package/dist/cli/inline.js.map +1 -1
- package/dist/cli/node.js +2 -1
- package/dist/cli/node.js.map +1 -1
- package/dist/cli/react.js +2 -1
- package/dist/cli/react.js.map +1 -1
- package/dist/config/defaults.js +2 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/generateSettings.d.ts +1 -0
- package/dist/config/generateSettings.js +2 -0
- package/dist/config/generateSettings.js.map +1 -1
- package/dist/console/index.d.ts +0 -2
- package/dist/console/index.js +4 -6
- package/dist/console/index.js.map +1 -1
- package/dist/extraction/postProcess.js +0 -1
- package/dist/extraction/postProcess.js.map +1 -1
- package/dist/formats/files/aggregateFiles.d.ts +0 -1
- package/dist/formats/files/aggregateFiles.js +1 -6
- package/dist/formats/files/aggregateFiles.js.map +1 -1
- package/dist/formats/files/collectFiles.js +2 -5
- package/dist/formats/files/collectFiles.js.map +1 -1
- package/dist/fs/config/parseFilesConfig.js +0 -4
- package/dist/fs/config/parseFilesConfig.js.map +1 -1
- package/dist/fs/config/updateConfig.d.ts +1 -0
- package/dist/fs/config/updateConfig.js +3 -2
- package/dist/fs/config/updateConfig.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/generated/version.js.map +1 -1
- package/dist/git/mergeDrivers.d.ts +11 -0
- package/dist/git/mergeDrivers.js +281 -0
- package/dist/git/mergeDrivers.js.map +1 -0
- package/dist/git/setupMergeDrivers.d.ts +27 -0
- package/dist/git/setupMergeDrivers.js +147 -0
- package/dist/git/setupMergeDrivers.js.map +1 -0
- package/dist/next/parse/handleInitGT.js +1 -6
- package/dist/next/parse/handleInitGT.js.map +1 -1
- package/dist/react/jsx/utils/constants.d.ts +3 -9
- package/dist/react/jsx/utils/constants.js +7 -14
- package/dist/react/jsx/utils/constants.js.map +1 -1
- package/dist/react/jsx/utils/jsxParsing/autoInsertion.d.ts +2 -2
- package/dist/react/jsx/utils/jsxParsing/autoInsertion.js +7 -7
- package/dist/react/jsx/utils/jsxParsing/autoInsertion.js.map +1 -1
- package/dist/react/jsx/utils/jsxParsing/parseJsx.js +2 -2
- package/dist/react/jsx/utils/jsxParsing/parseJsx.js.map +1 -1
- package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.d.ts +1 -1
- package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js +1 -1
- package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js.map +1 -1
- package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js.map +1 -1
- package/dist/react/parse/createDictionaryUpdates.js +0 -1
- package/dist/react/parse/createDictionaryUpdates.js.map +1 -1
- package/dist/react/parse/createInlineUpdates.js +1 -1
- package/dist/react/parse/createInlineUpdates.js.map +1 -1
- package/dist/translation/parse.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/parsing.d.ts +2 -0
- package/dist/types/parsing.js.map +1 -1
- package/dist/utils/fetch.js +1 -1
- package/dist/utils/fetch.js.map +1 -1
- package/package.json +7 -7
- package/dist/extraction/index.d.ts +0 -3
- package/dist/extraction/index.js +0 -3
- package/dist/extraction/types.d.ts +0 -1
- package/dist/extraction/types.js +0 -1
- package/dist/utils/headers.d.ts +0 -1
- package/dist/utils/headers.js +0 -10
- package/dist/utils/headers.js.map +0 -1
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
//#region src/react/jsx/utils/constants.ts
|
|
2
2
|
const DECLARE_VAR_FUNCTION = "declareVar";
|
|
3
|
-
/**
|
|
4
|
-
* COMPAT: Legacy support for declareStatic function.
|
|
5
|
-
*/
|
|
6
|
-
const DECLARE_STATIC_FUNCTION = "declareStatic";
|
|
7
3
|
const DERIVE_FUNCTION = "derive";
|
|
8
4
|
const MSG_REGISTRATION_FUNCTION = "msg";
|
|
9
5
|
const T_REGISTRATION_FUNCTION = "t";
|
|
@@ -13,15 +9,15 @@ const INLINE_TRANSLATION_HOOK_ASYNC = "getGT";
|
|
|
13
9
|
const INLINE_MESSAGE_HOOK = "useMessages";
|
|
14
10
|
const INLINE_MESSAGE_HOOK_ASYNC = "getMessages";
|
|
15
11
|
const TRANSLATION_COMPONENT = "T";
|
|
16
|
-
/**
|
|
17
|
-
* COMPAT: Legacy support for Static component.
|
|
18
|
-
*/
|
|
19
|
-
const STATIC_COMPONENT = "Static";
|
|
20
12
|
const DERIVE_COMPONENT = "Derive";
|
|
21
13
|
const BRANCH_COMPONENT = "Branch";
|
|
22
|
-
const DEFAULT_GT_IMPORT_SOURCE = "gt-react
|
|
14
|
+
const DEFAULT_GT_IMPORT_SOURCE = "gt-react";
|
|
15
|
+
const LEGACY_GT_IMPORT_SOURCE = "gt-react/browser";
|
|
23
16
|
const INTERNAL_TRANSLATION_COMPONENT = "GtInternalTranslateJsx";
|
|
24
17
|
const INTERNAL_VAR_COMPONENT = "GtInternalVar";
|
|
18
|
+
function getGtReactImportSource(legacyGtReactImportSource) {
|
|
19
|
+
return legacyGtReactImportSource ? LEGACY_GT_IMPORT_SOURCE : DEFAULT_GT_IMPORT_SOURCE;
|
|
20
|
+
}
|
|
25
21
|
const VAR_COMPONENT = "Var";
|
|
26
22
|
const DATETIME_COMPONENT = "DateTime";
|
|
27
23
|
const RELATIVE_TIME_COMPONENT = "RelativeTime";
|
|
@@ -36,10 +32,8 @@ const GT_TRANSLATION_FUNCS = [
|
|
|
36
32
|
"msg",
|
|
37
33
|
"t",
|
|
38
34
|
DECLARE_VAR_FUNCTION,
|
|
39
|
-
DECLARE_STATIC_FUNCTION,
|
|
40
35
|
DERIVE_FUNCTION,
|
|
41
36
|
"T",
|
|
42
|
-
STATIC_COMPONENT,
|
|
43
37
|
DERIVE_COMPONENT,
|
|
44
38
|
"Var",
|
|
45
39
|
DATETIME_COMPONENT,
|
|
@@ -52,14 +46,13 @@ const GT_TRANSLATION_FUNCS = [
|
|
|
52
46
|
PLURAL_COMPONENT
|
|
53
47
|
];
|
|
54
48
|
const STRING_REGISTRATION_FUNCS = ["msg", "t"];
|
|
55
|
-
const GT_DERIVE_STRING_FUNCTIONS = [
|
|
49
|
+
const GT_DERIVE_STRING_FUNCTIONS = [DERIVE_FUNCTION];
|
|
56
50
|
const VARIABLE_COMPONENTS = [
|
|
57
51
|
"Var",
|
|
58
52
|
DATETIME_COMPONENT,
|
|
59
53
|
RELATIVE_TIME_COMPONENT,
|
|
60
54
|
CURRENCY_COMPONENT,
|
|
61
55
|
"Num",
|
|
62
|
-
STATIC_COMPONENT,
|
|
63
56
|
DERIVE_COMPONENT,
|
|
64
57
|
INTERNAL_VAR_COMPONENT
|
|
65
58
|
];
|
|
@@ -84,6 +77,6 @@ const BRANCH_CONTROL_PROPS = new Set(["branch"]);
|
|
|
84
77
|
const PLURAL_CONTROL_PROPS = new Set(["n", "locales"]);
|
|
85
78
|
const T_GLOBAL_REGISTRATION_FUNCTION_MARKER = "_gt_internal_t_global_registration_marker";
|
|
86
79
|
//#endregion
|
|
87
|
-
export { BRANCH_COMPONENT, BRANCH_CONTROL_PROPS, CURRENCY_COMPONENT, DATA_ATTR_PREFIX, DATETIME_COMPONENT,
|
|
80
|
+
export { BRANCH_COMPONENT, BRANCH_CONTROL_PROPS, CURRENCY_COMPONENT, DATA_ATTR_PREFIX, DATETIME_COMPONENT, DECLARE_VAR_FUNCTION, DEFAULT_GT_IMPORT_SOURCE, DERIVE_COMPONENT, DERIVE_FUNCTION, GT_ATTRIBUTES, GT_ATTRIBUTES_WITH_SUGAR, GT_DERIVE_STRING_FUNCTIONS, GT_TRANSLATION_FUNCS, INLINE_MESSAGE_HOOK, INLINE_MESSAGE_HOOK_ASYNC, INLINE_TRANSLATION_HOOK, INLINE_TRANSLATION_HOOK_ASYNC, INTERNAL_TRANSLATION_COMPONENT, INTERNAL_VAR_COMPONENT, LEGACY_GT_IMPORT_SOURCE, MSG_REGISTRATION_FUNCTION, NUM_COMPONENT, PLURAL_COMPONENT, PLURAL_CONTROL_PROPS, RELATIVE_TIME_COMPONENT, STRING_REGISTRATION_FUNCS, TRANSLATION_COMPONENT, T_GLOBAL_REGISTRATION_FUNCTION, T_GLOBAL_REGISTRATION_FUNCTION_MARKER, T_REGISTRATION_FUNCTION, VARIABLE_COMPONENTS, VAR_COMPONENT, getGtReactImportSource };
|
|
88
81
|
|
|
89
82
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":[],"sources":["../../../../src/react/jsx/utils/constants.ts"],"sourcesContent":["export const DECLARE_VAR_FUNCTION = 'declareVar';\
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../../../src/react/jsx/utils/constants.ts"],"sourcesContent":["export const DECLARE_VAR_FUNCTION = 'declareVar';\nexport const DERIVE_FUNCTION = 'derive';\nexport const MSG_REGISTRATION_FUNCTION = 'msg';\nexport const T_REGISTRATION_FUNCTION = 't';\nexport const T_GLOBAL_REGISTRATION_FUNCTION = T_REGISTRATION_FUNCTION;\nexport const INLINE_TRANSLATION_HOOK = 'useGT';\nexport const INLINE_TRANSLATION_HOOK_ASYNC = 'getGT';\nexport const INLINE_MESSAGE_HOOK = 'useMessages';\nexport const INLINE_MESSAGE_HOOK_ASYNC = 'getMessages';\nexport const TRANSLATION_COMPONENT = 'T';\nexport const DERIVE_COMPONENT = 'Derive';\nexport const BRANCH_COMPONENT = 'Branch';\nexport const DEFAULT_GT_IMPORT_SOURCE = 'gt-react';\nexport const LEGACY_GT_IMPORT_SOURCE = 'gt-react/browser';\nexport const INTERNAL_TRANSLATION_COMPONENT = 'GtInternalTranslateJsx';\nexport const INTERNAL_VAR_COMPONENT = 'GtInternalVar';\n\nexport function getGtReactImportSource(\n legacyGtReactImportSource: boolean\n): typeof DEFAULT_GT_IMPORT_SOURCE | typeof LEGACY_GT_IMPORT_SOURCE {\n return legacyGtReactImportSource\n ? LEGACY_GT_IMPORT_SOURCE\n : DEFAULT_GT_IMPORT_SOURCE;\n}\n\n// Variable components\nexport const VAR_COMPONENT = 'Var';\nexport const DATETIME_COMPONENT = 'DateTime';\nexport const RELATIVE_TIME_COMPONENT = 'RelativeTime';\nexport const CURRENCY_COMPONENT = 'Currency';\nexport const NUM_COMPONENT = 'Num';\nexport const PLURAL_COMPONENT = 'Plural';\n\n// GT translation functions\nexport const GT_TRANSLATION_FUNCS = [\n INLINE_TRANSLATION_HOOK,\n INLINE_TRANSLATION_HOOK_ASYNC,\n INLINE_MESSAGE_HOOK,\n INLINE_MESSAGE_HOOK_ASYNC,\n MSG_REGISTRATION_FUNCTION,\n T_REGISTRATION_FUNCTION,\n DECLARE_VAR_FUNCTION,\n DERIVE_FUNCTION,\n TRANSLATION_COMPONENT,\n DERIVE_COMPONENT,\n VAR_COMPONENT,\n DATETIME_COMPONENT,\n RELATIVE_TIME_COMPONENT,\n CURRENCY_COMPONENT,\n NUM_COMPONENT,\n BRANCH_COMPONENT,\n INTERNAL_TRANSLATION_COMPONENT,\n INTERNAL_VAR_COMPONENT,\n PLURAL_COMPONENT,\n];\n// GT String translation functions\nexport const STRING_REGISTRATION_FUNCS = [\n MSG_REGISTRATION_FUNCTION,\n T_REGISTRATION_FUNCTION,\n] as const;\n\n// Derive functions that are imported from GT\nexport const GT_DERIVE_STRING_FUNCTIONS = [DERIVE_FUNCTION];\n\n// Valid variable components\nexport const VARIABLE_COMPONENTS = [\n VAR_COMPONENT,\n DATETIME_COMPONENT,\n RELATIVE_TIME_COMPONENT,\n CURRENCY_COMPONENT,\n NUM_COMPONENT,\n DERIVE_COMPONENT,\n INTERNAL_VAR_COMPONENT,\n];\n\nexport const GT_ATTRIBUTES_WITH_SUGAR = [\n '$id',\n '$context',\n '$maxChars',\n '$format',\n '$requiresReview',\n] as const;\n\nexport const GT_ATTRIBUTES = [\n 'id',\n 'context',\n 'maxChars',\n 'requiresReview',\n ...GT_ATTRIBUTES_WITH_SUGAR,\n] as const;\n\n// Data attribute prefix injected by build tools\nexport const DATA_ATTR_PREFIX = 'data-' as const;\n\n/** Branch control props — not translatable content. */\nexport const BRANCH_CONTROL_PROPS = new Set(['branch']);\n\n/** Plural control props — not translatable content. */\nexport const PLURAL_CONTROL_PROPS = new Set(['n', 'locales']);\n\n// demarcation for global t macro\nexport const T_GLOBAL_REGISTRATION_FUNCTION_MARKER =\n '_gt_internal_t_global_registration_marker';\n"],"mappings":";AAAA,MAAa,uBAAuB;AACpC,MAAa,kBAAkB;AAC/B,MAAa,4BAA4B;AACzC,MAAa,0BAA0B;AACvC,MAAa,iCAAA;AACb,MAAa,0BAA0B;AACvC,MAAa,gCAAgC;AAC7C,MAAa,sBAAsB;AACnC,MAAa,4BAA4B;AACzC,MAAa,wBAAwB;AACrC,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,2BAA2B;AACxC,MAAa,0BAA0B;AACvC,MAAa,iCAAiC;AAC9C,MAAa,yBAAyB;AAEtC,SAAgB,uBACd,2BACkE;AAClE,QAAO,4BACH,0BACA;;AAIN,MAAa,gBAAgB;AAC7B,MAAa,qBAAqB;AAClC,MAAa,0BAA0B;AACvC,MAAa,qBAAqB;AAClC,MAAa,gBAAgB;AAC7B,MAAa,mBAAmB;AAGhC,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;;;CAGA;CACA;;CAEA;;CAEA;CACA;CACA;;CAEA;CACA;CACA;CACA;CACD;AAED,MAAa,4BAA4B,CAAA,OAAA,IAGxC;AAGD,MAAa,6BAA6B,CAAC,gBAAgB;AAG3D,MAAa,sBAAsB;;CAEjC;CACA;CACA;;CAEA;CACA;CACD;AAED,MAAa,2BAA2B;CACtC;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,gBAAgB;CAC3B;CACA;CACA;CACA;CACA,GAAG;CACJ;AAGD,MAAa,mBAAmB;;AAGhC,MAAa,uBAAuB,IAAI,IAAI,CAAC,SAAS,CAAC;;AAGvD,MAAa,uBAAuB,IAAI,IAAI,CAAC,KAAK,UAAU,CAAC;AAG7D,MAAa,wCACX"}
|
|
@@ -12,12 +12,12 @@ import * as t from '@babel/types';
|
|
|
12
12
|
export declare function isAutoInserted(node: t.Node): boolean;
|
|
13
13
|
/**
|
|
14
14
|
* Ensure GtInternalTranslateJsx and GtInternalVar are imported in the AST.
|
|
15
|
-
*
|
|
15
|
+
* Adds: import { GtInternalTranslateJsx, GtInternalVar } from 'gt-react';
|
|
16
16
|
* These are distinct from user T/Var so there's no ambiguity.
|
|
17
17
|
*
|
|
18
18
|
* Updates importAliases in-place.
|
|
19
19
|
*/
|
|
20
|
-
export declare function ensureTAndVarImported(ast: t.File, importAliases: Record<string, string
|
|
20
|
+
export declare function ensureTAndVarImported(ast: t.File, importAliases: Record<string, string>, legacyGtReactImportSource?: boolean): void;
|
|
21
21
|
/**
|
|
22
22
|
* Traverse the AST and insert GtInternalTranslateJsx and GtInternalVar JSX elements following
|
|
23
23
|
* the insertion rules. Uses deliberate children traversal.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isStaticExpression } from "../../evaluateJsx.js";
|
|
2
|
-
import { BRANCH_CONTROL_PROPS,
|
|
2
|
+
import { BRANCH_CONTROL_PROPS, INTERNAL_TRANSLATION_COMPONENT, INTERNAL_VAR_COMPONENT, PLURAL_CONTROL_PROPS, VARIABLE_COMPONENTS, getGtReactImportSource } from "../constants.js";
|
|
3
3
|
import * as t from "@babel/types";
|
|
4
4
|
import traverseModule from "@babel/traverse";
|
|
5
5
|
//#region src/react/jsx/utils/jsxParsing/autoInsertion.ts
|
|
@@ -21,12 +21,12 @@ function isAutoInserted(node) {
|
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Ensure GtInternalTranslateJsx and GtInternalVar are imported in the AST.
|
|
24
|
-
*
|
|
24
|
+
* Adds: import { GtInternalTranslateJsx, GtInternalVar } from 'gt-react';
|
|
25
25
|
* These are distinct from user T/Var so there's no ambiguity.
|
|
26
26
|
*
|
|
27
27
|
* Updates importAliases in-place.
|
|
28
28
|
*/
|
|
29
|
-
function ensureTAndVarImported(ast, importAliases) {
|
|
29
|
+
function ensureTAndVarImported(ast, importAliases, legacyGtReactImportSource = false) {
|
|
30
30
|
const hasInternalT = Object.values(importAliases).includes(INTERNAL_TRANSLATION_COMPONENT);
|
|
31
31
|
const hasInternalVar = Object.values(importAliases).includes(INTERNAL_VAR_COMPONENT);
|
|
32
32
|
if (hasInternalT && hasInternalVar) return;
|
|
@@ -39,7 +39,7 @@ function ensureTAndVarImported(ast, importAliases) {
|
|
|
39
39
|
specifiers.push(t.importSpecifier(t.identifier(INTERNAL_VAR_COMPONENT), t.identifier(INTERNAL_VAR_COMPONENT)));
|
|
40
40
|
importAliases[INTERNAL_VAR_COMPONENT] = INTERNAL_VAR_COMPONENT;
|
|
41
41
|
}
|
|
42
|
-
const importDecl = t.importDeclaration(specifiers, t.stringLiteral(
|
|
42
|
+
const importDecl = t.importDeclaration(specifiers, t.stringLiteral(getGtReactImportSource(legacyGtReactImportSource)));
|
|
43
43
|
traverse(ast, { Program(path) {
|
|
44
44
|
path.unshiftContainer("body", importDecl);
|
|
45
45
|
path.stop();
|
|
@@ -88,7 +88,7 @@ function processJsxElement({ path, insideAutoT, importAliases, processedNodes, t
|
|
|
88
88
|
markDescendantJsx(path, processedNodes);
|
|
89
89
|
return;
|
|
90
90
|
}
|
|
91
|
-
if (canonicalName === "Branch" || canonicalName === "Plural" || canonicalName === "Derive"
|
|
91
|
+
if (canonicalName === "Branch" || canonicalName === "Plural" || canonicalName === "Derive") {
|
|
92
92
|
if (!insideAutoT) {
|
|
93
93
|
const tWrapper = createTWrapper([path.node], tLocalName);
|
|
94
94
|
processedNodes.add(tWrapper);
|
|
@@ -254,7 +254,7 @@ function processOpaqueComponentProps({ path, insideAutoT, importAliases, process
|
|
|
254
254
|
processedNodes.add(varWrapper);
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
|
-
if (canonicalName === "Derive"
|
|
257
|
+
if (canonicalName === "Derive") for (const attrPath of path.get("openingElement").get("attributes")) attrPath.traverse({
|
|
258
258
|
JSXElement(childPath) {
|
|
259
259
|
processedNodes.add(childPath.node);
|
|
260
260
|
},
|
|
@@ -288,7 +288,7 @@ function hasOpaqueGTChild(children, importAliases) {
|
|
|
288
288
|
const typeName = getElementTypeName(child);
|
|
289
289
|
if (!typeName) return false;
|
|
290
290
|
const canonical = importAliases[typeName];
|
|
291
|
-
return canonical === "Branch" || canonical === "Plural" || canonical === "Derive"
|
|
291
|
+
return canonical === "Branch" || canonical === "Plural" || canonical === "Derive";
|
|
292
292
|
});
|
|
293
293
|
}
|
|
294
294
|
function needsVarWrapping(container) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoInsertion.js","names":[],"sources":["../../../../../src/react/jsx/utils/jsxParsing/autoInsertion.ts"],"sourcesContent":["/**\n * Auto JSX Insertion for CLI extraction.\n *\n * Inserts <T> and <Var> JSX elements into the AST so the extraction pipeline\n * can process them as if the user wrote them. This operates on raw JSX syntax\n * (JSXElement, JSXText, JSXExpressionContainer) — NOT compiled jsx() calls.\n *\n * Rules follow JSX_INSERTION_RULES.md from the compiler package.\n */\nimport * as t from '@babel/types';\nimport traverseModule, { NodePath } from '@babel/traverse';\n\nconst traverse: typeof traverseModule.default =\n traverseModule.default || traverseModule;\nimport { isStaticExpression } from '../../evaluateJsx.js';\nimport {\n TRANSLATION_COMPONENT,\n INTERNAL_TRANSLATION_COMPONENT,\n INTERNAL_VAR_COMPONENT,\n VARIABLE_COMPONENTS,\n BRANCH_COMPONENT,\n PLURAL_COMPONENT,\n DEFAULT_GT_IMPORT_SOURCE,\n DERIVE_COMPONENT,\n STATIC_COMPONENT,\n BRANCH_CONTROL_PROPS,\n PLURAL_CONTROL_PROPS,\n} from '../constants.js';\n\n/** Tracks which AST nodes were auto-inserted by this module */\nconst autoInsertedNodes = new WeakSet<t.Node>();\n\n/** Check if a node was auto-inserted */\nexport function isAutoInserted(node: t.Node): boolean {\n return autoInsertedNodes.has(node);\n}\n\n// ===== Public API ===== //\n\n/**\n * Ensure GtInternalTranslateJsx and GtInternalVar are imported in the AST.\n * Always adds: import { GtInternalTranslateJsx, GtInternalVar } from 'gt-react/browser';\n * These are distinct from user T/Var so there's no ambiguity.\n *\n * Updates importAliases in-place.\n */\nexport function ensureTAndVarImported(\n ast: t.File,\n importAliases: Record<string, string>\n): void {\n // Check if internal components are already imported\n const hasInternalT = Object.values(importAliases).includes(\n INTERNAL_TRANSLATION_COMPONENT\n );\n const hasInternalVar = Object.values(importAliases).includes(\n INTERNAL_VAR_COMPONENT\n );\n\n if (hasInternalT && hasInternalVar) return;\n\n const specifiers: t.ImportSpecifier[] = [];\n if (!hasInternalT) {\n specifiers.push(\n t.importSpecifier(\n t.identifier(INTERNAL_TRANSLATION_COMPONENT),\n t.identifier(INTERNAL_TRANSLATION_COMPONENT)\n )\n );\n importAliases[INTERNAL_TRANSLATION_COMPONENT] =\n INTERNAL_TRANSLATION_COMPONENT;\n }\n if (!hasInternalVar) {\n specifiers.push(\n t.importSpecifier(\n t.identifier(INTERNAL_VAR_COMPONENT),\n t.identifier(INTERNAL_VAR_COMPONENT)\n )\n );\n importAliases[INTERNAL_VAR_COMPONENT] = INTERNAL_VAR_COMPONENT;\n }\n\n const importDecl = t.importDeclaration(\n specifiers,\n t.stringLiteral(DEFAULT_GT_IMPORT_SOURCE)\n );\n\n traverse(ast, {\n Program(path) {\n path.unshiftContainer('body', importDecl);\n path.stop();\n },\n });\n}\n\n/**\n * Traverse the AST and insert GtInternalTranslateJsx and GtInternalVar JSX elements following\n * the insertion rules. Uses deliberate children traversal.\n *\n * Every inserted node gets node._autoInserted = true.\n */\nexport function autoInsertJsxComponents(\n ast: t.File,\n importAliases: Record<string, string>\n): void {\n const processedNodes = new WeakSet<t.Node>();\n const tLocalName = getLocalName(\n importAliases,\n INTERNAL_TRANSLATION_COMPONENT\n );\n const varLocalName = getLocalName(importAliases, INTERNAL_VAR_COMPONENT);\n\n traverse(ast, {\n JSXElement(path) {\n if (processedNodes.has(path.node)) return;\n processJsxElement({\n path,\n insideAutoT: false,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n },\n JSXFragment(path) {\n if (processedNodes.has(path.node)) return;\n processJsxFragment({\n path,\n insideAutoT: false,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n },\n });\n}\n\n// ===== Core recursive functions ===== //\n\ninterface InsertionContext {\n insideAutoT: boolean;\n importAliases: Record<string, string>;\n processedNodes: WeakSet<t.Node>;\n tLocalName: string;\n varLocalName: string;\n}\n\nfunction processJsxElement({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n}: { path: NodePath<t.JSXElement> } & InsertionContext): void {\n processedNodes.add(path.node);\n\n // Get component type\n const typeName = getElementTypeName(path.node);\n const canonicalName = typeName ? importAliases[typeName] : undefined;\n\n // User T → mark all descendants, hands off\n if (canonicalName === TRANSLATION_COMPONENT) {\n markDescendantJsx(path, processedNodes);\n return;\n }\n\n // Branch/Plural/Derive/Static → opaque, process props for dynamic Var\n // Must be checked BEFORE user variable check because Derive/Static are in VARIABLE_COMPONENTS\n if (\n canonicalName === BRANCH_COMPONENT ||\n canonicalName === PLURAL_COMPONENT ||\n canonicalName === DERIVE_COMPONENT ||\n canonicalName === STATIC_COMPONENT\n ) {\n if (!insideAutoT) {\n // Root-level opaque component — wrap in _T\n const tWrapper = createTWrapper([path.node], tLocalName);\n processedNodes.add(tWrapper);\n path.replaceWith(tWrapper);\n }\n processOpaqueComponentProps({\n path,\n insideAutoT: true,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n canonicalName,\n });\n return;\n }\n\n // User Var/Num/Currency/DateTime → mark descendants, hands off\n if (canonicalName && VARIABLE_COMPONENTS.includes(canonicalName)) {\n markDescendantJsx(path, processedNodes);\n return;\n }\n\n // Process children\n processElementChildren({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n}\n\nfunction processJsxFragment({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n}: { path: NodePath<t.JSXFragment> } & InsertionContext): void {\n processedNodes.add(path.node);\n\n // Fragments are treated like regular elements\n processFragmentChildren({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n}\n\n// ===== Children processing ===== //\n\nfunction processElementChildren({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n}: { path: NodePath<t.JSXElement> } & InsertionContext): void {\n const children = path.node.children;\n const ctx: InsertionContext = {\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n };\n\n const hasText = hasTranslatableText(children);\n const hasOpaque = hasOpaqueGTChild(children, importAliases);\n const shouldClaimT = !insideAutoT && (hasText || hasOpaque);\n\n if (shouldClaimT) {\n // Process children: wrap dynamic expressions in Var, recurse into child elements\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, { ...ctx, insideAutoT: true });\n }\n // Wrap all children in <T>\n wrapChildrenInT(path, tLocalName, processedNodes);\n } else if (insideAutoT) {\n // Inside a T region: wrap dynamic expressions, recurse\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, ctx);\n }\n } else {\n // No text, no opaque, not inside T: just recurse into child elements\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n if (childPath.isJSXElement() && !processedNodes.has(childPath.node)) {\n processJsxElement({ path: childPath, ...ctx });\n } else if (\n childPath.isJSXFragment() &&\n !processedNodes.has(childPath.node)\n ) {\n processJsxFragment({ path: childPath, ...ctx });\n }\n }\n }\n}\n\nfunction processFragmentChildren({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n}: { path: NodePath<t.JSXFragment> } & InsertionContext): void {\n const children = path.node.children;\n const ctx: InsertionContext = {\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n };\n\n const hasText = hasTranslatableText(children);\n const hasOpaque = hasOpaqueGTChild(children, importAliases);\n const shouldClaimT = !insideAutoT && (hasText || hasOpaque);\n\n if (shouldClaimT) {\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, { ...ctx, insideAutoT: true });\n }\n wrapFragmentChildrenInT(path, tLocalName, processedNodes);\n } else if (insideAutoT) {\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, ctx);\n }\n } else {\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n if (childPath.isJSXElement() && !processedNodes.has(childPath.node)) {\n processJsxElement({ path: childPath, ...ctx });\n } else if (\n childPath.isJSXFragment() &&\n !processedNodes.has(childPath.node)\n ) {\n processJsxFragment({ path: childPath, ...ctx });\n }\n }\n }\n}\n\nfunction processChild(childPath: NodePath, ctx: InsertionContext): void {\n if (childPath.isJSXElement() && !ctx.processedNodes.has(childPath.node)) {\n processJsxElement({ path: childPath, ...ctx });\n } else if (\n childPath.isJSXFragment() &&\n !ctx.processedNodes.has(childPath.node)\n ) {\n processJsxFragment({ path: childPath, ...ctx });\n } else if (\n childPath.isJSXExpressionContainer() &&\n ctx.insideAutoT &&\n needsVarWrapping(childPath.node)\n ) {\n // Wrap dynamic expression in <Var>\n const varWrapper = createVarWrapper(\n childPath.node,\n ctx.varLocalName,\n ctx.processedNodes\n );\n childPath.replaceWith(varWrapper);\n ctx.processedNodes.add(varWrapper);\n }\n}\n\n// ===== Opaque component props ===== //\n\nfunction processOpaqueComponentProps({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n canonicalName,\n}: {\n path: NodePath<t.JSXElement>;\n canonicalName: string | undefined;\n} & InsertionContext): void {\n // Branch/Plural children (fallback content) — process element-by-element before marking\n if (\n insideAutoT &&\n (canonicalName === BRANCH_COMPONENT || canonicalName === PLURAL_COMPONENT)\n ) {\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, {\n insideAutoT: true,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n }\n }\n\n if (!insideAutoT) {\n markDescendantJsx(path, processedNodes);\n return;\n }\n\n const ctx: InsertionContext = {\n insideAutoT: true,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n };\n\n // Wrap dynamic prop values in <Var>, skipping control props.\n // This must happen BEFORE markDescendantJsx so that JSX inside auto-inserted\n // _Var wrappers stays unmarked for the top-level visitor to process independently.\n const attrs = path.get('openingElement').get('attributes');\n for (const attrPath of attrs) {\n if (!attrPath.isJSXAttribute()) continue;\n\n // Determine prop name and skip control props\n const nameNode = attrPath.node.name;\n const propName = t.isJSXIdentifier(nameNode) ? nameNode.name : null;\n if (isControlProp(canonicalName, propName)) continue;\n\n const valuePath = attrPath.get('value');\n if (!valuePath.isJSXExpressionContainer()) continue;\n\n const expr = valuePath.node.expression;\n\n // Content prop with JSX value — recurse into children for Var-wrapping\n if (t.isJSXElement(expr) || t.isJSXFragment(expr)) {\n const exprPath = (valuePath as NodePath<t.JSXExpressionContainer>).get(\n 'expression'\n );\n if (exprPath.isJSXElement() || exprPath.isJSXFragment()) {\n const childPaths = (\n exprPath as NodePath<t.JSXElement | t.JSXFragment>\n ).get('children');\n for (const childPath of childPaths) {\n processChild(childPath, ctx);\n }\n }\n continue;\n }\n\n // Non-JSX dynamic value — wrap in Var\n if (needsVarWrapping(valuePath.node)) {\n const varWrapper = createVarWrapper(\n valuePath.node,\n varLocalName,\n processedNodes\n );\n valuePath.replaceWith(varWrapper);\n processedNodes.add(varWrapper);\n }\n }\n\n // Mark remaining descendant JSX as processed, but skip auto-inserted nodes\n // so the top-level visitor can still discover JSX inside _Var wrappers.\n // For Derive/Static, only mark props — leave children unmarked so the\n // top-level visitor can independently process them (e.g. Branch/Plural\n // inside Derive should get their own _T, matching compiler behavior).\n if (\n canonicalName === DERIVE_COMPONENT ||\n canonicalName === STATIC_COMPONENT\n ) {\n for (const attrPath of path.get('openingElement').get('attributes')) {\n attrPath.traverse({\n JSXElement(childPath) {\n processedNodes.add(childPath.node);\n },\n JSXFragment(childPath) {\n processedNodes.add(childPath.node);\n },\n });\n }\n } else {\n markDescendantJsx(path, processedNodes);\n }\n}\n\nfunction isControlProp(\n canonicalName: string | undefined,\n propName: string | null\n): boolean {\n if (!propName) return false;\n if (canonicalName === BRANCH_COMPONENT) {\n return BRANCH_CONTROL_PROPS.has(propName) || propName.startsWith('data-');\n }\n if (canonicalName === PLURAL_COMPONENT) {\n return PLURAL_CONTROL_PROPS.has(propName);\n }\n return false;\n}\n\n// ===== Helper functions ===== //\n\nfunction getElementTypeName(element: t.JSXElement): string | null {\n const name = element.openingElement.name;\n if (t.isJSXIdentifier(name)) return name.name;\n return null;\n}\n\nfunction getLocalName(\n importAliases: Record<string, string>,\n canonicalName: string\n): string {\n const entry = Object.entries(importAliases).find(\n ([, v]) => v === canonicalName\n );\n return entry ? entry[0] : canonicalName;\n}\n\nfunction hasTranslatableText(children: t.Node[]): boolean {\n return children.some(\n (child) => t.isJSXText(child) && child.value.trim().length > 0\n );\n}\n\nfunction hasOpaqueGTChild(\n children: t.Node[],\n importAliases: Record<string, string>\n): boolean {\n return children.some((child) => {\n if (!t.isJSXElement(child)) return false;\n const typeName = getElementTypeName(child);\n if (!typeName) return false;\n const canonical = importAliases[typeName];\n return (\n canonical === BRANCH_COMPONENT ||\n canonical === PLURAL_COMPONENT ||\n canonical === DERIVE_COMPONENT ||\n canonical === STATIC_COMPONENT\n );\n });\n}\n\nfunction needsVarWrapping(container: t.JSXExpressionContainer): boolean {\n const expr = container.expression;\n if (t.isJSXEmptyExpression(expr)) return false;\n\n // Use isStaticExpression to check — if static, no wrapping needed\n const analysis = isStaticExpression(expr, true);\n if (analysis.isStatic) return false;\n\n // JSX elements/fragments inside expressions are not dynamic — they're valid children\n if (t.isJSXElement(expr) || t.isJSXFragment(expr)) return false;\n\n return true;\n}\n\n// ===== AST construction ===== //\n\nfunction createTWrapper(\n children: t.JSXElement['children'],\n tName: string\n): t.JSXElement {\n const element = t.jsxElement(\n t.jsxOpeningElement(t.jsxIdentifier(tName), []),\n t.jsxClosingElement(t.jsxIdentifier(tName)),\n children\n );\n autoInsertedNodes.add(element);\n return element;\n}\n\nfunction createVarWrapper(\n child: t.JSXExpressionContainer,\n varName: string,\n processedNodes: WeakSet<t.Node>\n): t.JSXExpressionContainer {\n const varElement = t.jsxElement(\n t.jsxOpeningElement(t.jsxIdentifier(varName), []),\n t.jsxClosingElement(t.jsxIdentifier(varName)),\n [child]\n );\n autoInsertedNodes.add(varElement);\n processedNodes.add(varElement);\n return t.jsxExpressionContainer(varElement);\n}\n\nfunction wrapChildrenInT(\n elementPath: NodePath<t.JSXElement>,\n tName: string,\n processedNodes: WeakSet<t.Node>\n): void {\n const children = [...elementPath.node.children];\n const tWrapper = createTWrapper(children, tName);\n processedNodes.add(tWrapper);\n elementPath.node.children = [tWrapper];\n}\n\nfunction wrapFragmentChildrenInT(\n fragmentPath: NodePath<t.JSXFragment>,\n tName: string,\n processedNodes: WeakSet<t.Node>\n): void {\n const children = [...fragmentPath.node.children];\n const tWrapper = createTWrapper(children, tName);\n processedNodes.add(tWrapper);\n fragmentPath.node.children = [tWrapper];\n}\n\n// ===== Marking descendants as processed ===== //\n\nfunction markDescendantJsx(\n path: NodePath<t.JSXElement | t.JSXFragment>,\n processedNodes: WeakSet<t.Node>\n): void {\n path.traverse({\n JSXElement(childPath) {\n // Don't mark JSX inside auto-inserted _Var — the top-level visitor\n // needs to find and process those independently\n if (autoInsertedNodes.has(childPath.node)) {\n childPath.skip();\n return;\n }\n processedNodes.add(childPath.node);\n },\n JSXFragment(childPath) {\n if (autoInsertedNodes.has(childPath.node)) {\n childPath.skip();\n return;\n }\n processedNodes.add(childPath.node);\n },\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"autoInsertion.js","names":[],"sources":["../../../../../src/react/jsx/utils/jsxParsing/autoInsertion.ts"],"sourcesContent":["/**\n * Auto JSX Insertion for CLI extraction.\n *\n * Inserts <T> and <Var> JSX elements into the AST so the extraction pipeline\n * can process them as if the user wrote them. This operates on raw JSX syntax\n * (JSXElement, JSXText, JSXExpressionContainer) — NOT compiled jsx() calls.\n *\n * Rules follow JSX_INSERTION_RULES.md from the compiler package.\n */\nimport * as t from '@babel/types';\nimport traverseModule, { NodePath } from '@babel/traverse';\n\nconst traverse: typeof traverseModule.default =\n traverseModule.default || traverseModule;\nimport { isStaticExpression } from '../../evaluateJsx.js';\nimport {\n TRANSLATION_COMPONENT,\n INTERNAL_TRANSLATION_COMPONENT,\n INTERNAL_VAR_COMPONENT,\n VARIABLE_COMPONENTS,\n BRANCH_COMPONENT,\n PLURAL_COMPONENT,\n getGtReactImportSource,\n DERIVE_COMPONENT,\n BRANCH_CONTROL_PROPS,\n PLURAL_CONTROL_PROPS,\n} from '../constants.js';\n\n/** Tracks which AST nodes were auto-inserted by this module */\nconst autoInsertedNodes = new WeakSet<t.Node>();\n\n/** Check if a node was auto-inserted */\nexport function isAutoInserted(node: t.Node): boolean {\n return autoInsertedNodes.has(node);\n}\n\n// ===== Public API ===== //\n\n/**\n * Ensure GtInternalTranslateJsx and GtInternalVar are imported in the AST.\n * Adds: import { GtInternalTranslateJsx, GtInternalVar } from 'gt-react';\n * These are distinct from user T/Var so there's no ambiguity.\n *\n * Updates importAliases in-place.\n */\nexport function ensureTAndVarImported(\n ast: t.File,\n importAliases: Record<string, string>,\n legacyGtReactImportSource = false\n): void {\n // Check if internal components are already imported\n const hasInternalT = Object.values(importAliases).includes(\n INTERNAL_TRANSLATION_COMPONENT\n );\n const hasInternalVar = Object.values(importAliases).includes(\n INTERNAL_VAR_COMPONENT\n );\n\n if (hasInternalT && hasInternalVar) return;\n\n const specifiers: t.ImportSpecifier[] = [];\n if (!hasInternalT) {\n specifiers.push(\n t.importSpecifier(\n t.identifier(INTERNAL_TRANSLATION_COMPONENT),\n t.identifier(INTERNAL_TRANSLATION_COMPONENT)\n )\n );\n importAliases[INTERNAL_TRANSLATION_COMPONENT] =\n INTERNAL_TRANSLATION_COMPONENT;\n }\n if (!hasInternalVar) {\n specifiers.push(\n t.importSpecifier(\n t.identifier(INTERNAL_VAR_COMPONENT),\n t.identifier(INTERNAL_VAR_COMPONENT)\n )\n );\n importAliases[INTERNAL_VAR_COMPONENT] = INTERNAL_VAR_COMPONENT;\n }\n\n const importDecl = t.importDeclaration(\n specifiers,\n t.stringLiteral(getGtReactImportSource(legacyGtReactImportSource))\n );\n\n traverse(ast, {\n Program(path) {\n path.unshiftContainer('body', importDecl);\n path.stop();\n },\n });\n}\n\n/**\n * Traverse the AST and insert GtInternalTranslateJsx and GtInternalVar JSX elements following\n * the insertion rules. Uses deliberate children traversal.\n *\n * Every inserted node gets node._autoInserted = true.\n */\nexport function autoInsertJsxComponents(\n ast: t.File,\n importAliases: Record<string, string>\n): void {\n const processedNodes = new WeakSet<t.Node>();\n const tLocalName = getLocalName(\n importAliases,\n INTERNAL_TRANSLATION_COMPONENT\n );\n const varLocalName = getLocalName(importAliases, INTERNAL_VAR_COMPONENT);\n\n traverse(ast, {\n JSXElement(path) {\n if (processedNodes.has(path.node)) return;\n processJsxElement({\n path,\n insideAutoT: false,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n },\n JSXFragment(path) {\n if (processedNodes.has(path.node)) return;\n processJsxFragment({\n path,\n insideAutoT: false,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n },\n });\n}\n\n// ===== Core recursive functions ===== //\n\ninterface InsertionContext {\n insideAutoT: boolean;\n importAliases: Record<string, string>;\n processedNodes: WeakSet<t.Node>;\n tLocalName: string;\n varLocalName: string;\n}\n\nfunction processJsxElement({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n}: { path: NodePath<t.JSXElement> } & InsertionContext): void {\n processedNodes.add(path.node);\n\n // Get component type\n const typeName = getElementTypeName(path.node);\n const canonicalName = typeName ? importAliases[typeName] : undefined;\n\n // User T → mark all descendants, hands off\n if (canonicalName === TRANSLATION_COMPONENT) {\n markDescendantJsx(path, processedNodes);\n return;\n }\n\n // Branch/Plural/Derive → opaque, process props for dynamic Var\n // Must be checked BEFORE user variable check because Derive is in VARIABLE_COMPONENTS\n if (\n canonicalName === BRANCH_COMPONENT ||\n canonicalName === PLURAL_COMPONENT ||\n canonicalName === DERIVE_COMPONENT\n ) {\n if (!insideAutoT) {\n // Root-level opaque component — wrap in _T\n const tWrapper = createTWrapper([path.node], tLocalName);\n processedNodes.add(tWrapper);\n path.replaceWith(tWrapper);\n }\n processOpaqueComponentProps({\n path,\n insideAutoT: true,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n canonicalName,\n });\n return;\n }\n\n // User Var/Num/Currency/DateTime → mark descendants, hands off\n if (canonicalName && VARIABLE_COMPONENTS.includes(canonicalName)) {\n markDescendantJsx(path, processedNodes);\n return;\n }\n\n // Process children\n processElementChildren({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n}\n\nfunction processJsxFragment({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n}: { path: NodePath<t.JSXFragment> } & InsertionContext): void {\n processedNodes.add(path.node);\n\n // Fragments are treated like regular elements\n processFragmentChildren({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n}\n\n// ===== Children processing ===== //\n\nfunction processElementChildren({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n}: { path: NodePath<t.JSXElement> } & InsertionContext): void {\n const children = path.node.children;\n const ctx: InsertionContext = {\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n };\n\n const hasText = hasTranslatableText(children);\n const hasOpaque = hasOpaqueGTChild(children, importAliases);\n const shouldClaimT = !insideAutoT && (hasText || hasOpaque);\n\n if (shouldClaimT) {\n // Process children: wrap dynamic expressions in Var, recurse into child elements\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, { ...ctx, insideAutoT: true });\n }\n // Wrap all children in <T>\n wrapChildrenInT(path, tLocalName, processedNodes);\n } else if (insideAutoT) {\n // Inside a T region: wrap dynamic expressions, recurse\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, ctx);\n }\n } else {\n // No text, no opaque, not inside T: just recurse into child elements\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n if (childPath.isJSXElement() && !processedNodes.has(childPath.node)) {\n processJsxElement({ path: childPath, ...ctx });\n } else if (\n childPath.isJSXFragment() &&\n !processedNodes.has(childPath.node)\n ) {\n processJsxFragment({ path: childPath, ...ctx });\n }\n }\n }\n}\n\nfunction processFragmentChildren({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n}: { path: NodePath<t.JSXFragment> } & InsertionContext): void {\n const children = path.node.children;\n const ctx: InsertionContext = {\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n };\n\n const hasText = hasTranslatableText(children);\n const hasOpaque = hasOpaqueGTChild(children, importAliases);\n const shouldClaimT = !insideAutoT && (hasText || hasOpaque);\n\n if (shouldClaimT) {\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, { ...ctx, insideAutoT: true });\n }\n wrapFragmentChildrenInT(path, tLocalName, processedNodes);\n } else if (insideAutoT) {\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, ctx);\n }\n } else {\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n if (childPath.isJSXElement() && !processedNodes.has(childPath.node)) {\n processJsxElement({ path: childPath, ...ctx });\n } else if (\n childPath.isJSXFragment() &&\n !processedNodes.has(childPath.node)\n ) {\n processJsxFragment({ path: childPath, ...ctx });\n }\n }\n }\n}\n\nfunction processChild(childPath: NodePath, ctx: InsertionContext): void {\n if (childPath.isJSXElement() && !ctx.processedNodes.has(childPath.node)) {\n processJsxElement({ path: childPath, ...ctx });\n } else if (\n childPath.isJSXFragment() &&\n !ctx.processedNodes.has(childPath.node)\n ) {\n processJsxFragment({ path: childPath, ...ctx });\n } else if (\n childPath.isJSXExpressionContainer() &&\n ctx.insideAutoT &&\n needsVarWrapping(childPath.node)\n ) {\n // Wrap dynamic expression in <Var>\n const varWrapper = createVarWrapper(\n childPath.node,\n ctx.varLocalName,\n ctx.processedNodes\n );\n childPath.replaceWith(varWrapper);\n ctx.processedNodes.add(varWrapper);\n }\n}\n\n// ===== Opaque component props ===== //\n\nfunction processOpaqueComponentProps({\n path,\n insideAutoT,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n canonicalName,\n}: {\n path: NodePath<t.JSXElement>;\n canonicalName: string | undefined;\n} & InsertionContext): void {\n // Branch/Plural children (fallback content) — process element-by-element before marking\n if (\n insideAutoT &&\n (canonicalName === BRANCH_COMPONENT || canonicalName === PLURAL_COMPONENT)\n ) {\n const childPaths = path.get('children');\n for (const childPath of childPaths) {\n processChild(childPath, {\n insideAutoT: true,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n });\n }\n }\n\n if (!insideAutoT) {\n markDescendantJsx(path, processedNodes);\n return;\n }\n\n const ctx: InsertionContext = {\n insideAutoT: true,\n importAliases,\n processedNodes,\n tLocalName,\n varLocalName,\n };\n\n // Wrap dynamic prop values in <Var>, skipping control props.\n // This must happen BEFORE markDescendantJsx so that JSX inside auto-inserted\n // _Var wrappers stays unmarked for the top-level visitor to process independently.\n const attrs = path.get('openingElement').get('attributes');\n for (const attrPath of attrs) {\n if (!attrPath.isJSXAttribute()) continue;\n\n // Determine prop name and skip control props\n const nameNode = attrPath.node.name;\n const propName = t.isJSXIdentifier(nameNode) ? nameNode.name : null;\n if (isControlProp(canonicalName, propName)) continue;\n\n const valuePath = attrPath.get('value');\n if (!valuePath.isJSXExpressionContainer()) continue;\n\n const expr = valuePath.node.expression;\n\n // Content prop with JSX value — recurse into children for Var-wrapping\n if (t.isJSXElement(expr) || t.isJSXFragment(expr)) {\n const exprPath = (valuePath as NodePath<t.JSXExpressionContainer>).get(\n 'expression'\n );\n if (exprPath.isJSXElement() || exprPath.isJSXFragment()) {\n const childPaths = (\n exprPath as NodePath<t.JSXElement | t.JSXFragment>\n ).get('children');\n for (const childPath of childPaths) {\n processChild(childPath, ctx);\n }\n }\n continue;\n }\n\n // Non-JSX dynamic value — wrap in Var\n if (needsVarWrapping(valuePath.node)) {\n const varWrapper = createVarWrapper(\n valuePath.node,\n varLocalName,\n processedNodes\n );\n valuePath.replaceWith(varWrapper);\n processedNodes.add(varWrapper);\n }\n }\n\n // Mark remaining descendant JSX as processed, but skip auto-inserted nodes\n // so the top-level visitor can still discover JSX inside _Var wrappers.\n // For Derive, only mark props — leave children unmarked so the\n // top-level visitor can independently process them (e.g. Branch/Plural\n // inside Derive should get their own _T, matching compiler behavior).\n if (canonicalName === DERIVE_COMPONENT) {\n for (const attrPath of path.get('openingElement').get('attributes')) {\n attrPath.traverse({\n JSXElement(childPath) {\n processedNodes.add(childPath.node);\n },\n JSXFragment(childPath) {\n processedNodes.add(childPath.node);\n },\n });\n }\n } else {\n markDescendantJsx(path, processedNodes);\n }\n}\n\nfunction isControlProp(\n canonicalName: string | undefined,\n propName: string | null\n): boolean {\n if (!propName) return false;\n if (canonicalName === BRANCH_COMPONENT) {\n return BRANCH_CONTROL_PROPS.has(propName) || propName.startsWith('data-');\n }\n if (canonicalName === PLURAL_COMPONENT) {\n return PLURAL_CONTROL_PROPS.has(propName);\n }\n return false;\n}\n\n// ===== Helper functions ===== //\n\nfunction getElementTypeName(element: t.JSXElement): string | null {\n const name = element.openingElement.name;\n if (t.isJSXIdentifier(name)) return name.name;\n return null;\n}\n\nfunction getLocalName(\n importAliases: Record<string, string>,\n canonicalName: string\n): string {\n const entry = Object.entries(importAliases).find(\n ([, v]) => v === canonicalName\n );\n return entry ? entry[0] : canonicalName;\n}\n\nfunction hasTranslatableText(children: t.Node[]): boolean {\n return children.some(\n (child) => t.isJSXText(child) && child.value.trim().length > 0\n );\n}\n\nfunction hasOpaqueGTChild(\n children: t.Node[],\n importAliases: Record<string, string>\n): boolean {\n return children.some((child) => {\n if (!t.isJSXElement(child)) return false;\n const typeName = getElementTypeName(child);\n if (!typeName) return false;\n const canonical = importAliases[typeName];\n return (\n canonical === BRANCH_COMPONENT ||\n canonical === PLURAL_COMPONENT ||\n canonical === DERIVE_COMPONENT\n );\n });\n}\n\nfunction needsVarWrapping(container: t.JSXExpressionContainer): boolean {\n const expr = container.expression;\n if (t.isJSXEmptyExpression(expr)) return false;\n\n // Use isStaticExpression to check — if static, no wrapping needed\n const analysis = isStaticExpression(expr, true);\n if (analysis.isStatic) return false;\n\n // JSX elements/fragments inside expressions are not dynamic — they're valid children\n if (t.isJSXElement(expr) || t.isJSXFragment(expr)) return false;\n\n return true;\n}\n\n// ===== AST construction ===== //\n\nfunction createTWrapper(\n children: t.JSXElement['children'],\n tName: string\n): t.JSXElement {\n const element = t.jsxElement(\n t.jsxOpeningElement(t.jsxIdentifier(tName), []),\n t.jsxClosingElement(t.jsxIdentifier(tName)),\n children\n );\n autoInsertedNodes.add(element);\n return element;\n}\n\nfunction createVarWrapper(\n child: t.JSXExpressionContainer,\n varName: string,\n processedNodes: WeakSet<t.Node>\n): t.JSXExpressionContainer {\n const varElement = t.jsxElement(\n t.jsxOpeningElement(t.jsxIdentifier(varName), []),\n t.jsxClosingElement(t.jsxIdentifier(varName)),\n [child]\n );\n autoInsertedNodes.add(varElement);\n processedNodes.add(varElement);\n return t.jsxExpressionContainer(varElement);\n}\n\nfunction wrapChildrenInT(\n elementPath: NodePath<t.JSXElement>,\n tName: string,\n processedNodes: WeakSet<t.Node>\n): void {\n const children = [...elementPath.node.children];\n const tWrapper = createTWrapper(children, tName);\n processedNodes.add(tWrapper);\n elementPath.node.children = [tWrapper];\n}\n\nfunction wrapFragmentChildrenInT(\n fragmentPath: NodePath<t.JSXFragment>,\n tName: string,\n processedNodes: WeakSet<t.Node>\n): void {\n const children = [...fragmentPath.node.children];\n const tWrapper = createTWrapper(children, tName);\n processedNodes.add(tWrapper);\n fragmentPath.node.children = [tWrapper];\n}\n\n// ===== Marking descendants as processed ===== //\n\nfunction markDescendantJsx(\n path: NodePath<t.JSXElement | t.JSXFragment>,\n processedNodes: WeakSet<t.Node>\n): void {\n path.traverse({\n JSXElement(childPath) {\n // Don't mark JSX inside auto-inserted _Var — the top-level visitor\n // needs to find and process those independently\n if (autoInsertedNodes.has(childPath.node)) {\n childPath.skip();\n return;\n }\n processedNodes.add(childPath.node);\n },\n JSXFragment(childPath) {\n if (autoInsertedNodes.has(childPath.node)) {\n childPath.skip();\n return;\n }\n processedNodes.add(childPath.node);\n },\n });\n}\n"],"mappings":"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"}
|
|
@@ -182,7 +182,7 @@ function buildJSXTree({ node, helperPath, scopeNode, insideT, inDerive, config,
|
|
|
182
182
|
}
|
|
183
183
|
});
|
|
184
184
|
if (elementIsVariable) {
|
|
185
|
-
if (componentType === "
|
|
185
|
+
if (componentType === "Derive") {
|
|
186
186
|
const helperElement = helperPath.get("children");
|
|
187
187
|
const results = {
|
|
188
188
|
nodeType: "element",
|
|
@@ -352,7 +352,7 @@ function parseJSXElement({ node, originalName, scopeNode, updates, config, state
|
|
|
352
352
|
const multipliedTrees = multiplyJsxTree(handleChildrenWhitespace(jsxTree));
|
|
353
353
|
const minifiedTress = [];
|
|
354
354
|
for (const multipliedTree of multipliedTrees) {
|
|
355
|
-
const minifiedTree = addGTIdentifierToSyntaxTree(multipliedTree, 0, config.enableAutoJsxInjection ? new Set(Object.values(config.importAliases).filter((name) => VARIABLE_COMPONENTS.includes(name) && name !== "Derive"
|
|
355
|
+
const minifiedTree = addGTIdentifierToSyntaxTree(multipliedTree, 0, config.enableAutoJsxInjection ? new Set(Object.values(config.importAliases).filter((name) => VARIABLE_COMPONENTS.includes(name) && name !== "Derive")) : void 0);
|
|
356
356
|
minifiedTress.push(Array.isArray(minifiedTree) && minifiedTree.length === 1 ? minifiedTree[0] : minifiedTree);
|
|
357
357
|
}
|
|
358
358
|
if (unwrappedExpressions.length > 0) {
|