@generaltranslation/compiler 1.3.27 → 1.3.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +12 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +61 -6
- package/dist/index.js.map +1 -1
- package/dist/passes/basePass.d.ts.map +1 -1
- package/dist/passes/basePass.js +9 -10
- package/dist/passes/basePass.js.map +1 -1
- package/dist/processing/collection/processCallExpression.js +0 -1
- package/dist/processing/collection/processCallExpression.js.map +1 -1
- package/dist/processing/collection/processTaggedTemplateExpression.d.ts +1 -1
- package/dist/processing/collection/processTaggedTemplateExpression.js +1 -1
- package/dist/processing/collection/processTaggedTemplateExpression.js.map +1 -1
- package/dist/processing/jsx-insertion/processCallExpression.js.map +1 -1
- package/dist/processing/jsx-insertion/processProgram.d.ts.map +1 -1
- package/dist/processing/jsx-insertion/processProgram.js +1 -1
- package/dist/processing/jsx-insertion/processProgram.js.map +1 -1
- package/dist/processing/macro-expansion/processProgram.js +1 -1
- package/dist/processing/macro-expansion/processProgram.js.map +1 -1
- package/dist/processing/macro-expansion/processTaggedTemplateExpression.d.ts +1 -1
- package/dist/processing/macro-expansion/processTaggedTemplateExpression.js +1 -1
- package/dist/processing/macro-expansion/processTaggedTemplateExpression.js.map +1 -1
- package/dist/processing/processFunctionDeclaration.js +1 -1
- package/dist/processing/processFunctionExpression.js +1 -1
- package/dist/processing/runtime-translate/processProgram.d.ts.map +1 -1
- package/dist/processing/runtime-translate/processProgram.js +2 -1
- package/dist/processing/runtime-translate/processProgram.js.map +1 -1
- package/dist/state/StringCollector.d.ts +3 -3
- package/dist/state/StringCollector.d.ts.map +1 -1
- package/dist/state/StringCollector.js.map +1 -1
- package/dist/state/utils/initializeState.d.ts.map +1 -1
- package/dist/state/utils/initializeState.js +8 -5
- package/dist/state/utils/initializeState.js.map +1 -1
- package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.d.ts +1 -1
- package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.js +6 -5
- package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.js.map +1 -1
- package/dist/transform/jsx-children/constructJsxChildren.js.map +1 -1
- package/dist/transform/jsx-insertion/injectJsxInsertionImport.d.ts +2 -2
- package/dist/transform/jsx-insertion/injectJsxInsertionImport.d.ts.map +1 -1
- package/dist/transform/jsx-insertion/injectJsxInsertionImport.js +4 -3
- package/dist/transform/jsx-insertion/injectJsxInsertionImport.js.map +1 -1
- package/dist/transform/macro-expansion/injectMacroImport.d.ts +2 -2
- package/dist/transform/macro-expansion/injectMacroImport.d.ts.map +1 -1
- package/dist/transform/macro-expansion/injectMacroImport.js +4 -3
- package/dist/transform/macro-expansion/injectMacroImport.js.map +1 -1
- package/dist/transform/registration/callbacks/registerUseGTCallback.d.ts.map +1 -1
- package/dist/transform/registration/callbacks/registerUseGTCallback.js +0 -1
- package/dist/transform/registration/callbacks/registerUseGTCallback.js.map +1 -1
- package/dist/transform/registration/registerStandaloneTranslation.d.ts.map +1 -1
- package/dist/transform/registration/registerStandaloneTranslation.js +0 -1
- package/dist/transform/registration/registerStandaloneTranslation.js.map +1 -1
- package/dist/transform/runtime-translate/injectRuntimeTranslateImport.d.ts +3 -2
- package/dist/transform/runtime-translate/injectRuntimeTranslateImport.d.ts.map +1 -1
- package/dist/transform/runtime-translate/injectRuntimeTranslateImport.js +4 -3
- package/dist/transform/runtime-translate/injectRuntimeTranslateImport.js.map +1 -1
- package/dist/transform/validation/validateTranslationComponentArgs.js +0 -1
- package/dist/transform/validation/validateTranslationComponentArgs.js.map +1 -1
- package/dist/transform/validation/validateTranslationFunction.d.ts.map +1 -1
- package/dist/transform/validation/validateTranslationFunction.js +3 -3
- package/dist/transform/validation/validateTranslationFunction.js.map +1 -1
- package/dist/utils/calculateHash.d.ts +1 -2
- package/dist/utils/calculateHash.d.ts.map +1 -1
- package/dist/utils/calculateHash.js +1 -3
- package/dist/utils/calculateHash.js.map +1 -1
- package/dist/utils/constants/gt/constants.d.ts +1 -5
- package/dist/utils/constants/gt/constants.d.ts.map +1 -1
- package/dist/utils/constants/gt/constants.js +1 -5
- package/dist/utils/constants/gt/constants.js.map +1 -1
- package/dist/utils/constants/gt/helpers.d.ts +2 -1
- package/dist/utils/constants/gt/helpers.d.ts.map +1 -1
- package/dist/utils/constants/gt/helpers.js +15 -5
- package/dist/utils/constants/gt/helpers.js.map +1 -1
- package/dist/utils/constants/resolveIdentifier/isGTComponent.d.ts +1 -1
- package/dist/utils/constants/resolveIdentifier/isGTComponent.d.ts.map +1 -1
- package/dist/utils/constants/resolveIdentifier/isGTComponent.js +2 -3
- package/dist/utils/constants/resolveIdentifier/isGTComponent.js.map +1 -1
- package/dist/utils/parsing/isStringTranslationTaggedTemplate.d.ts +1 -1
- package/dist/utils/parsing/isStringTranslationTaggedTemplate.js +3 -3
- package/dist/utils/parsing/isStringTranslationTaggedTemplate.js.map +1 -1
- package/package.json +3 -3
- package/dist/processing/index.d.ts +0 -15
- package/dist/processing/index.d.ts.map +0 -1
- package/dist/processing/index.js +0 -29
- package/dist/transform/jsx-children/index.d.ts +0 -2
- package/dist/transform/jsx-children/index.d.ts.map +0 -1
- package/dist/transform/jsx-children/index.js +0 -3
package/dist/config.d.ts
CHANGED
|
@@ -5,17 +5,21 @@ export type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug';
|
|
|
5
5
|
/**
|
|
6
6
|
* The only relevant parts of the GT config that we are concerned with
|
|
7
7
|
*/
|
|
8
|
-
type GTConfig = {
|
|
8
|
+
export type GTConfig = {
|
|
9
|
+
defaultLocale?: string;
|
|
10
|
+
locales?: string[];
|
|
11
|
+
projectId?: string;
|
|
12
|
+
_versionId?: string;
|
|
9
13
|
files?: {
|
|
10
14
|
gt?: {
|
|
15
|
+
output?: string;
|
|
11
16
|
parsingFlags?: {
|
|
12
17
|
enableAutoJsxInjection?: boolean;
|
|
13
18
|
autoderive?: boolean | {
|
|
14
19
|
jsx?: boolean;
|
|
15
20
|
strings?: boolean;
|
|
16
21
|
};
|
|
17
|
-
|
|
18
|
-
autoDerive?: boolean;
|
|
22
|
+
legacyGtReactImportSource?: boolean;
|
|
19
23
|
/** Dev hot reload: inject runtime translate calls and enable Suspense-based <T> */
|
|
20
24
|
devHotReload?: boolean | {
|
|
21
25
|
strings?: boolean;
|
|
@@ -33,7 +37,7 @@ export interface PluginConfig {
|
|
|
33
37
|
logLevel?: LogLevel;
|
|
34
38
|
/** GT Configuration object — pass the parsed gt.config.json to sync settings */
|
|
35
39
|
gtConfig?: GTConfig;
|
|
36
|
-
/** Enable compile-time hash generation */
|
|
40
|
+
/** Enable compile-time hash generation (default: true) */
|
|
37
41
|
compileTimeHash?: boolean;
|
|
38
42
|
/** Disable dynamic content validation checks */
|
|
39
43
|
disableBuildChecks?: boolean;
|
|
@@ -48,8 +52,8 @@ export interface PluginConfig {
|
|
|
48
52
|
jsx?: boolean;
|
|
49
53
|
strings?: boolean;
|
|
50
54
|
};
|
|
51
|
-
/**
|
|
52
|
-
|
|
55
|
+
/** Emit compiler-injected gt-react imports from gt-react/browser */
|
|
56
|
+
legacyGtReactImportSource?: boolean;
|
|
53
57
|
/** Debug: write a hash → jsxChildren manifest file on build */
|
|
54
58
|
_debugHashManifest?: boolean;
|
|
55
59
|
/** Dev hot reload: inject runtime translate calls and enable Suspense-based <T> */
|
|
@@ -79,6 +83,8 @@ export interface PluginSettings {
|
|
|
79
83
|
jsx: boolean;
|
|
80
84
|
strings: boolean;
|
|
81
85
|
};
|
|
86
|
+
/** Emit compiler-injected gt-react imports from gt-react/browser */
|
|
87
|
+
legacyGtReactImportSource: boolean;
|
|
82
88
|
/** Debug: write a hash → jsxChildren manifest file on build */
|
|
83
89
|
_debugHashManifest: boolean;
|
|
84
90
|
/** Dev hot reload: inject runtime translate calls and enable Suspense-based <T> */
|
|
@@ -113,5 +119,4 @@ export declare function resolveDevHotReload(value: boolean | {
|
|
|
113
119
|
strings: boolean;
|
|
114
120
|
jsx: boolean;
|
|
115
121
|
};
|
|
116
|
-
export {};
|
|
117
122
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtE;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["/**\n * Configuration types for the GT Babel plugin\n */\n\nexport type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug';\n\n/**\n * The only relevant parts of the GT config that we are concerned with\n */\
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["/**\n * Configuration types for the GT Babel plugin\n */\n\nexport type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug';\n\n/**\n * The only relevant parts of the GT config that we are concerned with\n */\nexport type GTConfig = {\n defaultLocale?: string;\n locales?: string[];\n projectId?: string;\n _versionId?: string;\n files?: {\n gt?: {\n output?: string;\n parsingFlags?: {\n enableAutoJsxInjection?: boolean;\n autoderive?: boolean | { jsx?: boolean; strings?: boolean };\n legacyGtReactImportSource?: boolean;\n /** Dev hot reload: inject runtime translate calls and enable Suspense-based <T> */\n devHotReload?: boolean | { strings?: boolean; jsx?: boolean };\n };\n };\n };\n};\n\n/**\n * Plugin configuration options (from babel config)\n */\nexport interface PluginConfig {\n /** Log level for the plugin */\n logLevel?: LogLevel;\n /** GT Configuration object — pass the parsed gt.config.json to sync settings */\n gtConfig?: GTConfig;\n /** Enable compile-time hash generation (default: true) */\n compileTimeHash?: boolean;\n /** Disable dynamic content validation checks */\n disableBuildChecks?: boolean;\n /** Enable macro transform (t`...`, t(`...`), t(\"a\" + b)) */\n enableMacroTransform?: boolean;\n /** Name of the string translation macro function */\n stringTranslationMacro?: string;\n /** Enable Auto Jsx Injection (e.g. <div>Hello</div> -> <div><T>Hello</T></div>) */\n enableAutoJsxInjection?: boolean;\n /** Automatically treat interpolated/concatenated values as derive() calls */\n autoderive?: boolean | { jsx?: boolean; strings?: boolean };\n /** Emit compiler-injected gt-react imports from gt-react/browser */\n legacyGtReactImportSource?: boolean;\n /** Debug: write a hash → jsxChildren manifest file on build */\n _debugHashManifest?: boolean;\n /** Dev hot reload: inject runtime translate calls and enable Suspense-based <T> */\n devHotReload?: boolean | { strings?: boolean; jsx?: boolean };\n}\n\n/**\n * Internal plugin settings (processed config)\n */\nexport interface PluginSettings {\n logLevel: LogLevel;\n compileTimeHash: boolean;\n disableBuildChecks: boolean;\n filename?: string;\n enableMacroTransform: boolean;\n stringTranslationMacro: string;\n enableTaggedTemplate: boolean;\n enableTemplateLiteralArg: boolean;\n enableConcatenationArg: boolean;\n enableMacroImportInjection: boolean;\n /** Enable Auto Jsx Injection (e.g. <div>Hello</div> -> <div><T>Hello</T></div>) */\n enableAutoJsxInjection: boolean;\n /** Automatically treat interpolated/concatenated values as derive() calls */\n autoderive: { jsx: boolean; strings: boolean };\n /** Emit compiler-injected gt-react imports from gt-react/browser */\n legacyGtReactImportSource: boolean;\n /** Debug: write a hash → jsxChildren manifest file on build */\n _debugHashManifest: boolean;\n /** Dev hot reload: inject runtime translate calls and enable Suspense-based <T> */\n devHotReload: { strings: boolean; jsx: boolean };\n}\n\n/**\n * Resolves the autoderive config value into separate jsx and strings flags.\n * - `true` enables both (backward compatible)\n * - `false` disables both (backward compatible)\n * - `{ jsx?: boolean; strings?: boolean }` enables selectively (missing keys default to false)\n */\nexport function resolveAutoderive(\n value: boolean | { jsx?: boolean; strings?: boolean } | undefined\n): { jsx: boolean; strings: boolean } {\n if (value === undefined || typeof value === 'boolean') {\n return { jsx: !!value, strings: !!value };\n }\n return { jsx: value.jsx ?? false, strings: value.strings ?? false };\n}\n\n/**\n * Resolves the devHotReload config value into separate strings and jsx flags.\n * - `true` enables strings only (JSX is handled at runtime via Suspense, no compiler injection needed)\n * - `false` disables both\n * - `{ strings?: boolean; jsx?: boolean }` enables selectively (missing keys default to false)\n */\nexport function resolveDevHotReload(\n value: boolean | { strings?: boolean; jsx?: boolean } | undefined\n): { strings: boolean; jsx: boolean } {\n if (value === undefined || typeof value === 'boolean') {\n return { strings: !!value, jsx: false };\n }\n return { strings: value.strings ?? false, jsx: value.jsx ?? false };\n}\n"],"mappings":";;;;;;;;AAwFA,SAAgB,kBACd,OACoC;AACpC,KAAI,UAAU,KAAA,KAAa,OAAO,UAAU,UAC1C,QAAO;EAAE,KAAK,CAAC,CAAC;EAAO,SAAS,CAAC,CAAC;EAAO;AAE3C,QAAO;EAAE,KAAK,MAAM,OAAO;EAAO,SAAS,MAAM,WAAW;EAAO;;;;;;;;AASrE,SAAgB,oBACd,OACoC;AACpC,KAAI,UAAU,KAAA,KAAa,OAAO,UAAU,UAC1C,QAAO;EAAE,SAAS,CAAC,CAAC;EAAO,KAAK;EAAO;AAEzC,QAAO;EAAE,SAAS,MAAM,WAAW;EAAO,KAAK,MAAM,OAAO;EAAO"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PluginConfig } from './config';
|
|
1
|
+
import { GTConfig, PluginConfig } from './config';
|
|
2
2
|
/**
|
|
3
3
|
* Architecture:
|
|
4
4
|
*
|
|
@@ -43,7 +43,7 @@ import { PluginConfig } from './config';
|
|
|
43
43
|
/**
|
|
44
44
|
* GT Universal Plugin Options
|
|
45
45
|
*/
|
|
46
|
-
export interface GTUnpluginOptions extends PluginConfig {
|
|
46
|
+
export interface GTUnpluginOptions extends PluginConfig, GTConfig {
|
|
47
47
|
}
|
|
48
48
|
export declare const MISSING_GT_CONFIG_WARNING = "[@generaltranslation/compiler] No gtConfig found. Auto JSX injection and parsingFlags features require a gt.config.json. See https://generaltranslation.com/en/docs/react/concepts/compiler.";
|
|
49
49
|
export declare const createInvalidGTConfigWarning: (configPath: string, error: unknown) => string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAWlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,YAAY,EAAE,QAAQ;CAAG;AAEpE,eAAO,MAAM,yBAAyB,iMAC0J,CAAC;AAEjM,eAAO,MAAM,4BAA4B,GACvC,YAAY,MAAM,EAClB,OAAO,OAAO,WAI6C,CAAC;AAuG9D;;;;;GAKG;AACH,QAAA,MAAM,UAAU,6EA6If,CAAC;AAGF,eAAe,UAAU,CAAC;AAC1B,eAAO,MAAM,OAAO,oEAAqB,CAAC;AAC1C,eAAO,MAAM,IAAI,wGAAkB,CAAC;AACpC,eAAO,MAAM,MAAM,kDAAoB,CAAC;AACxC,eAAO,MAAM,OAAO,4DAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -43,6 +43,63 @@ function loadGTConfigFromCwd() {
|
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
+
function hasInlineGTConfig(options) {
|
|
47
|
+
return options.defaultLocale !== void 0 || options.locales !== void 0 || options.projectId !== void 0 || options._versionId !== void 0 || options.files !== void 0;
|
|
48
|
+
}
|
|
49
|
+
function getInlineGTConfig(options) {
|
|
50
|
+
if (!hasInlineGTConfig(options)) return void 0;
|
|
51
|
+
return {
|
|
52
|
+
...options.defaultLocale !== void 0 ? { defaultLocale: options.defaultLocale } : {},
|
|
53
|
+
...options.locales !== void 0 ? { locales: options.locales } : {},
|
|
54
|
+
...options.projectId !== void 0 ? { projectId: options.projectId } : {},
|
|
55
|
+
...options._versionId !== void 0 ? { _versionId: options._versionId } : {},
|
|
56
|
+
...options.files !== void 0 ? { files: options.files } : {}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function mergeGTConfigs(base, override) {
|
|
60
|
+
var _base$files, _override$files;
|
|
61
|
+
const mergedConfig = {
|
|
62
|
+
...base,
|
|
63
|
+
...override
|
|
64
|
+
};
|
|
65
|
+
if (!base.files && !override.files) return mergedConfig;
|
|
66
|
+
const files = {
|
|
67
|
+
...base.files,
|
|
68
|
+
...override.files
|
|
69
|
+
};
|
|
70
|
+
if (((_base$files = base.files) === null || _base$files === void 0 ? void 0 : _base$files.gt) || ((_override$files = override.files) === null || _override$files === void 0 ? void 0 : _override$files.gt)) {
|
|
71
|
+
var _base$files2, _override$files2, _base$files3, _override$files3;
|
|
72
|
+
const gt = {
|
|
73
|
+
...(_base$files2 = base.files) === null || _base$files2 === void 0 ? void 0 : _base$files2.gt,
|
|
74
|
+
...(_override$files2 = override.files) === null || _override$files2 === void 0 ? void 0 : _override$files2.gt
|
|
75
|
+
};
|
|
76
|
+
if (((_base$files3 = base.files) === null || _base$files3 === void 0 || (_base$files3 = _base$files3.gt) === null || _base$files3 === void 0 ? void 0 : _base$files3.parsingFlags) || ((_override$files3 = override.files) === null || _override$files3 === void 0 || (_override$files3 = _override$files3.gt) === null || _override$files3 === void 0 ? void 0 : _override$files3.parsingFlags)) {
|
|
77
|
+
var _base$files4, _override$files4;
|
|
78
|
+
gt.parsingFlags = {
|
|
79
|
+
...(_base$files4 = base.files) === null || _base$files4 === void 0 || (_base$files4 = _base$files4.gt) === null || _base$files4 === void 0 ? void 0 : _base$files4.parsingFlags,
|
|
80
|
+
...(_override$files4 = override.files) === null || _override$files4 === void 0 || (_override$files4 = _override$files4.gt) === null || _override$files4 === void 0 ? void 0 : _override$files4.parsingFlags
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
files.gt = gt;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
...mergedConfig,
|
|
87
|
+
files
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function resolveGTConfig(options) {
|
|
91
|
+
if (options.gtConfig) return {
|
|
92
|
+
gtConfig: options.gtConfig,
|
|
93
|
+
status: "loaded"
|
|
94
|
+
};
|
|
95
|
+
const inlineGTConfig = getInlineGTConfig(options);
|
|
96
|
+
const diskGTConfig = loadGTConfigFromCwd();
|
|
97
|
+
if (!inlineGTConfig) return diskGTConfig;
|
|
98
|
+
return {
|
|
99
|
+
gtConfig: diskGTConfig.status === "loaded" ? mergeGTConfigs(diskGTConfig.gtConfig, inlineGTConfig) : inlineGTConfig,
|
|
100
|
+
status: "loaded"
|
|
101
|
+
};
|
|
102
|
+
}
|
|
46
103
|
/**
|
|
47
104
|
* GT Universal Plugin - Main entry point
|
|
48
105
|
*
|
|
@@ -50,10 +107,7 @@ function loadGTConfigFromCwd() {
|
|
|
50
107
|
* that works across webpack, Vite, Rollup, and other bundlers.
|
|
51
108
|
*/
|
|
52
109
|
const gtUnplugin = (0, unplugin.createUnplugin)((options = {}) => {
|
|
53
|
-
const gtConfigLoadResult = options
|
|
54
|
-
gtConfig: options.gtConfig,
|
|
55
|
-
status: "loaded"
|
|
56
|
-
} : loadGTConfigFromCwd();
|
|
110
|
+
const gtConfigLoadResult = resolveGTConfig(options);
|
|
57
111
|
const loadedGTConfig = gtConfigLoadResult.status === "loaded" ? gtConfigLoadResult.gtConfig : void 0;
|
|
58
112
|
const resolvedOptions = {
|
|
59
113
|
...options,
|
|
@@ -89,9 +143,10 @@ const gtUnplugin = (0, unplugin.createUnplugin)((options = {}) => {
|
|
|
89
143
|
(0, _babel_traverse.default)(ast, require_passes_collectionPass.collectionPass(state));
|
|
90
144
|
if (require_passes_handleErrors.handleErrors(state)) return null;
|
|
91
145
|
const hasCollectionContent = state.stringCollector.hasContent();
|
|
92
|
-
|
|
146
|
+
const injectionRan = hasCollectionContent && state.settings.compileTimeHash;
|
|
147
|
+
if (injectionRan) (0, _babel_traverse.default)(ast, require_passes_injectionPass.injectionPass(state));
|
|
93
148
|
if ((state.settings.devHotReload.strings || state.settings.devHotReload.jsx) && hasCollectionContent) (0, _babel_traverse.default)(ast, require_passes_runtimeTranslatePass.runtimeTranslatePass(state));
|
|
94
|
-
if (!
|
|
149
|
+
if (!injectionRan && state.statistics.macroExpansionsCount === 0 && state.statistics.jsxInsertionsCount === 0 && state.statistics.runtimeTranslateCount === 0) return null;
|
|
95
150
|
return (0, _babel_generator.default)(ast, {
|
|
96
151
|
retainLines: true,
|
|
97
152
|
compact: false
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["path","fs","initializeState","parser","jsxInsertionPass","macroExpansionPass","collectionPass","handleErrors","injectionPass","runtimeTranslatePass","InvalidLibraryUsageError"],"sources":["../src/index.ts"],"sourcesContent":["import { createUnplugin } from 'unplugin';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as parser from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse from '@babel/traverse';\n\n// Core modules\nimport { PluginConfig } from './config';\n\n// Import passes\nimport { collectionPass } from './passes/collectionPass';\nimport { injectionPass } from './passes/injectionPass';\nimport { macroExpansionPass } from './passes/macroExpansionPass';\nimport { handleErrors, InvalidLibraryUsageError } from './passes/handleErrors';\nimport { initializeState } from './state/utils/initializeState';\nimport { jsxInsertionPass } from './passes/jsxInsertionPass';\nimport { runtimeTranslatePass } from './passes/runtimeTranslatePass';\n\n/**\n * Architecture:\n *\n * Pass Pipeline:\n * - Pass 0: Macro expansion — transforms t`...` tagged templates and t(`...`) template/concatenation args\n * - Pass 1: Collection — collect + calculate all data, check for violations, register + track\n * - Pass 2: Injection — inject all data (hashes, messages, etc.)\n *\n * Babel functions:\n * - 1-to-1 relationship with processing functions\n * - Handle (1) enter/exit scope (2) invoking processing function\n * - ex) JSXElement()\n *\n * Processing functions:\n * - Are dependent on the pass, so they have three categories: (1) collection, (2) injection, (3) shared/general\n * - Invoke transformation functions and utility functions\n * - ex) processJSXElement()\n * - Has the following file structure:\n * + processing\n * | sharedProcessingFunction.ts\n * | + collection\n * | | collectionProcessingFunction.ts\n * | + injection\n * | | injectionProcessingFunction.ts\n *\n * Transformation functions:\n * - Are AGNOSTIC to pass number\n * - MUST be stateful in some way\n * - ex) trackImportDeclaration()\n *\n * Utility functions:\n * - Are AGNOSTIC to pass number\n * - Are stateless\n * - ex) extractIdentifiersFromLVal()\n *\n * State:\n * - Includes classes for tracking state\n *\n * Currently no support for:\n * - namespaces and and modules\n */\n\n/**\n * GT Universal Plugin Options\n */\nexport interface GTUnpluginOptions extends PluginConfig {\n // Inherits from PluginConfig\n}\n\nexport const MISSING_GT_CONFIG_WARNING =\n '[@generaltranslation/compiler] No gtConfig found. Auto JSX injection and parsingFlags features require a gt.config.json. See https://generaltranslation.com/en/docs/react/concepts/compiler.';\n\nexport const createInvalidGTConfigWarning = (\n configPath: string,\n error: unknown\n) =>\n `[@generaltranslation/compiler] Failed to load gt.config.json at ${configPath}. ` +\n `Auto JSX injection and parsingFlags features require a valid gt.config.json. ` +\n `${error instanceof Error ? error.message : String(error)}`;\n\nfunction shouldWarn(logLevel: PluginConfig['logLevel']): boolean {\n return logLevel !== 'silent' && logLevel !== 'error';\n}\n\ntype GTConfigLoadResult =\n | {\n gtConfig: NonNullable<PluginConfig['gtConfig']>;\n status: 'loaded';\n }\n | {\n status: 'missing';\n }\n | {\n configPath: string;\n error: unknown;\n status: 'invalid';\n };\n\nfunction loadGTConfigFromCwd(): GTConfigLoadResult {\n const configPath = path.join(process.cwd(), 'gt.config.json');\n if (!fs.existsSync(configPath)) {\n return { status: 'missing' };\n }\n\n try {\n return {\n gtConfig: JSON.parse(fs.readFileSync(configPath, 'utf-8')) as NonNullable<\n PluginConfig['gtConfig']\n >,\n status: 'loaded',\n };\n } catch (error) {\n return { configPath, error, status: 'invalid' };\n }\n}\n\n/**\n * GT Universal Plugin - Main entry point\n *\n * Universal plugin for compile-time optimization of GT translation components\n * that works across webpack, Vite, Rollup, and other bundlers.\n */\nconst gtUnplugin = createUnplugin<GTUnpluginOptions | undefined>(\n (options = {}) => {\n const gtConfigLoadResult = options.gtConfig\n ? ({ gtConfig: options.gtConfig, status: 'loaded' } as const)\n : loadGTConfigFromCwd();\n const loadedGTConfig =\n gtConfigLoadResult.status === 'loaded'\n ? gtConfigLoadResult.gtConfig\n : undefined;\n const resolvedOptions: GTUnpluginOptions = {\n ...options,\n ...(loadedGTConfig ? { gtConfig: loadedGTConfig } : {}),\n };\n\n if (shouldWarn(options.logLevel)) {\n if (gtConfigLoadResult.status === 'missing') {\n console.warn(MISSING_GT_CONFIG_WARNING);\n } else if (gtConfigLoadResult.status === 'invalid') {\n console.warn(\n createInvalidGTConfigWarning(\n gtConfigLoadResult.configPath,\n gtConfigLoadResult.error\n )\n );\n }\n }\n\n // Debug manifest: accumulates hash → jsxChildren across all files\n const debugManifest = resolvedOptions._debugHashManifest\n ? new Map<string, unknown>()\n : undefined;\n\n return {\n name: '@generaltranslation/GT_PLUGIN',\n transformInclude(id: string) {\n // Only transform TSX and JSX files\n return (\n id.endsWith('.tsx') ||\n id.endsWith('.jsx') ||\n id.endsWith('.ts') ||\n id.endsWith('.js')\n );\n },\n transform(code: string, id: string) {\n // Initialize processing state\n const state = initializeState(resolvedOptions, id);\n if (debugManifest) state.debugManifest = debugManifest;\n try {\n // Skip transformation if not needed\n if (\n state.settings.disableBuildChecks &&\n !state.settings.compileTimeHash\n ) {\n return null;\n }\n\n // Parse the code into AST\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', 'decorators-legacy'],\n allowImportExportEverywhere: true,\n allowReturnOutsideFunction: true,\n });\n\n // Pass 1: Jsx insertion\n if (state.settings.enableAutoJsxInjection) {\n traverse(ast, jsxInsertionPass(state));\n }\n\n // Pass 2: Macro expansion\n if (state.settings.enableMacroTransform) {\n traverse(ast, macroExpansionPass(state));\n }\n\n // Pass 3: Collection\n traverse(ast, collectionPass(state));\n\n // Handle errors\n if (handleErrors(state)) {\n return null;\n }\n\n // Pass 4: Injection\n const hasCollectionContent = state.stringCollector.hasContent();\n\n if (hasCollectionContent) {\n traverse(ast, injectionPass(state));\n }\n\n // Pass 5: Runtime translate (dev hot reload)\n const devHotReloadActive =\n state.settings.devHotReload.strings ||\n state.settings.devHotReload.jsx;\n if (devHotReloadActive && hasCollectionContent) {\n traverse(ast, runtimeTranslatePass(state));\n }\n\n // Generate code if any pass modified the AST\n if (\n !hasCollectionContent &&\n state.statistics.macroExpansionsCount === 0 &&\n state.statistics.jsxInsertionsCount === 0 &&\n state.statistics.runtimeTranslateCount === 0\n ) {\n return null;\n }\n\n return generate(ast, {\n retainLines: true,\n compact: false,\n });\n } catch (error) {\n // If the error is an instance of InvalidLibraryUsageError, throw it\n if (error instanceof InvalidLibraryUsageError) {\n throw error;\n }\n\n // Otherwise, log the error\n state.logger.logError(`Error processing ${id}: ${error}`);\n return null;\n }\n },\n buildEnd() {\n if (debugManifest && debugManifest.size > 0) {\n const fs = require('fs');\n const path = require('path');\n const outPath = path.resolve(\n process.cwd(),\n '_gt_debug_hash_manifest.json'\n );\n const manifest = Object.fromEntries(debugManifest);\n fs.writeFileSync(outPath, JSON.stringify(manifest, null, 2));\n // eslint-disable-next-line no-console\n console.log(\n `[gt-compiler] Debug hash manifest written to ${outPath} (${debugManifest.size} entries)`\n );\n }\n },\n };\n }\n);\n\n// Export the unplugin with different bundler integrations\nexport default gtUnplugin;\nexport const webpack = gtUnplugin.webpack;\nexport const vite = gtUnplugin.vite;\nexport const rollup = gtUnplugin.rollup;\nexport const esbuild = gtUnplugin.esbuild;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["path","fs","initializeState","parser","jsxInsertionPass","macroExpansionPass","collectionPass","handleErrors","injectionPass","runtimeTranslatePass","InvalidLibraryUsageError"],"sources":["../src/index.ts"],"sourcesContent":["import { createUnplugin } from 'unplugin';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as parser from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse from '@babel/traverse';\n\n// Core modules\nimport { GTConfig, PluginConfig } from './config';\n\n// Import passes\nimport { collectionPass } from './passes/collectionPass';\nimport { injectionPass } from './passes/injectionPass';\nimport { macroExpansionPass } from './passes/macroExpansionPass';\nimport { handleErrors, InvalidLibraryUsageError } from './passes/handleErrors';\nimport { initializeState } from './state/utils/initializeState';\nimport { jsxInsertionPass } from './passes/jsxInsertionPass';\nimport { runtimeTranslatePass } from './passes/runtimeTranslatePass';\n\n/**\n * Architecture:\n *\n * Pass Pipeline:\n * - Pass 0: Macro expansion — transforms t`...` tagged templates and t(`...`) template/concatenation args\n * - Pass 1: Collection — collect + calculate all data, check for violations, register + track\n * - Pass 2: Injection — inject all data (hashes, messages, etc.)\n *\n * Babel functions:\n * - 1-to-1 relationship with processing functions\n * - Handle (1) enter/exit scope (2) invoking processing function\n * - ex) JSXElement()\n *\n * Processing functions:\n * - Are dependent on the pass, so they have three categories: (1) collection, (2) injection, (3) shared/general\n * - Invoke transformation functions and utility functions\n * - ex) processJSXElement()\n * - Has the following file structure:\n * + processing\n * | sharedProcessingFunction.ts\n * | + collection\n * | | collectionProcessingFunction.ts\n * | + injection\n * | | injectionProcessingFunction.ts\n *\n * Transformation functions:\n * - Are AGNOSTIC to pass number\n * - MUST be stateful in some way\n * - ex) trackImportDeclaration()\n *\n * Utility functions:\n * - Are AGNOSTIC to pass number\n * - Are stateless\n * - ex) extractIdentifiersFromLVal()\n *\n * State:\n * - Includes classes for tracking state\n *\n * Currently no support for:\n * - namespaces and and modules\n */\n\n/**\n * GT Universal Plugin Options\n */\nexport interface GTUnpluginOptions extends PluginConfig, GTConfig {}\n\nexport const MISSING_GT_CONFIG_WARNING =\n '[@generaltranslation/compiler] No gtConfig found. Auto JSX injection and parsingFlags features require a gt.config.json. See https://generaltranslation.com/en/docs/react/concepts/compiler.';\n\nexport const createInvalidGTConfigWarning = (\n configPath: string,\n error: unknown\n) =>\n `[@generaltranslation/compiler] Failed to load gt.config.json at ${configPath}. ` +\n `Auto JSX injection and parsingFlags features require a valid gt.config.json. ` +\n `${error instanceof Error ? error.message : String(error)}`;\n\nfunction shouldWarn(logLevel: PluginConfig['logLevel']): boolean {\n return logLevel !== 'silent' && logLevel !== 'error';\n}\n\ntype GTConfigLoadResult =\n | {\n gtConfig: NonNullable<PluginConfig['gtConfig']>;\n status: 'loaded';\n }\n | {\n status: 'missing';\n }\n | {\n configPath: string;\n error: unknown;\n status: 'invalid';\n };\n\nfunction loadGTConfigFromCwd(): GTConfigLoadResult {\n const configPath = path.join(process.cwd(), 'gt.config.json');\n if (!fs.existsSync(configPath)) {\n return { status: 'missing' };\n }\n\n try {\n return {\n gtConfig: JSON.parse(fs.readFileSync(configPath, 'utf-8')) as NonNullable<\n PluginConfig['gtConfig']\n >,\n status: 'loaded',\n };\n } catch (error) {\n return { configPath, error, status: 'invalid' };\n }\n}\n\nfunction hasInlineGTConfig(options: GTUnpluginOptions): boolean {\n return (\n options.defaultLocale !== undefined ||\n options.locales !== undefined ||\n options.projectId !== undefined ||\n options._versionId !== undefined ||\n options.files !== undefined\n );\n}\n\nfunction getInlineGTConfig(options: GTUnpluginOptions): GTConfig | undefined {\n if (!hasInlineGTConfig(options)) return undefined;\n\n return {\n ...(options.defaultLocale !== undefined\n ? { defaultLocale: options.defaultLocale }\n : {}),\n ...(options.locales !== undefined ? { locales: options.locales } : {}),\n ...(options.projectId !== undefined\n ? { projectId: options.projectId }\n : {}),\n ...(options._versionId !== undefined\n ? { _versionId: options._versionId }\n : {}),\n ...(options.files !== undefined ? { files: options.files } : {}),\n };\n}\n\nfunction mergeGTConfigs(base: GTConfig, override: GTConfig): GTConfig {\n const mergedConfig = { ...base, ...override };\n if (!base.files && !override.files) return mergedConfig;\n\n const files = { ...base.files, ...override.files };\n if (base.files?.gt || override.files?.gt) {\n const gt = { ...base.files?.gt, ...override.files?.gt };\n if (base.files?.gt?.parsingFlags || override.files?.gt?.parsingFlags) {\n gt.parsingFlags = {\n ...base.files?.gt?.parsingFlags,\n ...override.files?.gt?.parsingFlags,\n };\n }\n files.gt = gt;\n }\n\n return { ...mergedConfig, files };\n}\n\nfunction resolveGTConfig(options: GTUnpluginOptions): GTConfigLoadResult {\n if (options.gtConfig) {\n return { gtConfig: options.gtConfig, status: 'loaded' };\n }\n\n const inlineGTConfig = getInlineGTConfig(options);\n const diskGTConfig = loadGTConfigFromCwd();\n if (!inlineGTConfig) return diskGTConfig;\n\n return {\n gtConfig:\n diskGTConfig.status === 'loaded'\n ? mergeGTConfigs(diskGTConfig.gtConfig, inlineGTConfig)\n : inlineGTConfig,\n status: 'loaded',\n };\n}\n\n/**\n * GT Universal Plugin - Main entry point\n *\n * Universal plugin for compile-time optimization of GT translation components\n * that works across webpack, Vite, Rollup, and other bundlers.\n */\nconst gtUnplugin = createUnplugin<GTUnpluginOptions | undefined>(\n (options = {}) => {\n const gtConfigLoadResult = resolveGTConfig(options);\n const loadedGTConfig =\n gtConfigLoadResult.status === 'loaded'\n ? gtConfigLoadResult.gtConfig\n : undefined;\n const resolvedOptions: GTUnpluginOptions = {\n ...options,\n ...(loadedGTConfig ? { gtConfig: loadedGTConfig } : {}),\n };\n\n if (shouldWarn(options.logLevel)) {\n if (gtConfigLoadResult.status === 'missing') {\n console.warn(MISSING_GT_CONFIG_WARNING);\n } else if (gtConfigLoadResult.status === 'invalid') {\n console.warn(\n createInvalidGTConfigWarning(\n gtConfigLoadResult.configPath,\n gtConfigLoadResult.error\n )\n );\n }\n }\n\n // Debug manifest: accumulates hash → jsxChildren across all files\n const debugManifest = resolvedOptions._debugHashManifest\n ? new Map<string, unknown>()\n : undefined;\n\n return {\n name: '@generaltranslation/GT_PLUGIN',\n transformInclude(id: string) {\n // Only transform TSX and JSX files\n return (\n id.endsWith('.tsx') ||\n id.endsWith('.jsx') ||\n id.endsWith('.ts') ||\n id.endsWith('.js')\n );\n },\n transform(code: string, id: string) {\n // Initialize processing state\n const state = initializeState(resolvedOptions, id);\n if (debugManifest) state.debugManifest = debugManifest;\n try {\n // Skip transformation if not needed\n if (\n state.settings.disableBuildChecks &&\n !state.settings.compileTimeHash\n ) {\n return null;\n }\n\n // Parse the code into AST\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', 'decorators-legacy'],\n allowImportExportEverywhere: true,\n allowReturnOutsideFunction: true,\n });\n\n // Pass 1: Jsx insertion\n if (state.settings.enableAutoJsxInjection) {\n traverse(ast, jsxInsertionPass(state));\n }\n\n // Pass 2: Macro expansion\n if (state.settings.enableMacroTransform) {\n traverse(ast, macroExpansionPass(state));\n }\n\n // Pass 3: Collection\n traverse(ast, collectionPass(state));\n\n // Handle errors\n if (handleErrors(state)) {\n return null;\n }\n\n // Pass 4: Injection (hashes + useGT prefetch parameters), gated on\n // the compileTimeHash setting\n const hasCollectionContent = state.stringCollector.hasContent();\n const injectionRan =\n hasCollectionContent && state.settings.compileTimeHash;\n\n if (injectionRan) {\n traverse(ast, injectionPass(state));\n }\n\n // Pass 5: Runtime translate (dev hot reload)\n const devHotReloadActive =\n state.settings.devHotReload.strings ||\n state.settings.devHotReload.jsx;\n if (devHotReloadActive && hasCollectionContent) {\n traverse(ast, runtimeTranslatePass(state));\n }\n\n // Generate code if any pass modified the AST\n if (\n !injectionRan &&\n state.statistics.macroExpansionsCount === 0 &&\n state.statistics.jsxInsertionsCount === 0 &&\n state.statistics.runtimeTranslateCount === 0\n ) {\n return null;\n }\n\n return generate(ast, {\n retainLines: true,\n compact: false,\n });\n } catch (error) {\n // If the error is an instance of InvalidLibraryUsageError, throw it\n if (error instanceof InvalidLibraryUsageError) {\n throw error;\n }\n\n // Otherwise, log the error\n state.logger.logError(`Error processing ${id}: ${error}`);\n return null;\n }\n },\n buildEnd() {\n if (debugManifest && debugManifest.size > 0) {\n const fs = require('fs');\n const path = require('path');\n const outPath = path.resolve(\n process.cwd(),\n '_gt_debug_hash_manifest.json'\n );\n const manifest = Object.fromEntries(debugManifest);\n fs.writeFileSync(outPath, JSON.stringify(manifest, null, 2));\n // eslint-disable-next-line no-console\n console.log(\n `[gt-compiler] Debug hash manifest written to ${outPath} (${debugManifest.size} entries)`\n );\n }\n },\n };\n }\n);\n\n// Export the unplugin with different bundler integrations\nexport default gtUnplugin;\nexport const webpack = gtUnplugin.webpack;\nexport const vite = gtUnplugin.vite;\nexport const rollup = gtUnplugin.rollup;\nexport const esbuild = gtUnplugin.esbuild;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basePass.d.ts","sourceRoot":"","sources":["../../src/passes/basePass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"basePass.d.ts","sourceRoot":"","sources":["../../src/passes/basePass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAgBlD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAoD/D"}
|
package/dist/passes/basePass.js
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_processing_processProgram = require("../processing/processProgram.js");
|
|
3
|
+
const require_processing_processScopeChange = require("../processing/processScopeChange.js");
|
|
4
|
+
const require_processing_processFunctionDeclaration = require("../processing/processFunctionDeclaration.js");
|
|
5
|
+
const require_processing_processFunctionExpression = require("../processing/processFunctionExpression.js");
|
|
2
6
|
const require_processing_processArrowFunctionExpression = require("../processing/processArrowFunctionExpression.js");
|
|
3
|
-
const
|
|
4
|
-
const require_processing_processCatchClause = require("../processing/processCatchClause.js");
|
|
5
|
-
const require_processing_processClassDeclaration = require("../processing/processClassDeclaration.js");
|
|
7
|
+
const require_processing_processObjectMethod = require("../processing/processObjectMethod.js");
|
|
6
8
|
const require_processing_processClassMethod = require("../processing/processClassMethod.js");
|
|
7
9
|
const require_processing_processClassPrivateMethod = require("../processing/processClassPrivateMethod.js");
|
|
10
|
+
const require_processing_processImportDeclaration = require("../processing/processImportDeclaration.js");
|
|
11
|
+
const require_processing_processAssignmentExpression = require("../processing/processAssignmentExpression.js");
|
|
12
|
+
const require_processing_processClassDeclaration = require("../processing/processClassDeclaration.js");
|
|
8
13
|
const require_processing_processForInStatement = require("../processing/processForInStatement.js");
|
|
9
14
|
const require_processing_processForOfStatement = require("../processing/processForOfStatement.js");
|
|
10
|
-
const
|
|
11
|
-
const require_processing_processFunctionExpression = require("../processing/processFunctionExpression.js");
|
|
12
|
-
const require_processing_processImportDeclaration = require("../processing/processImportDeclaration.js");
|
|
13
|
-
const require_processing_processObjectMethod = require("../processing/processObjectMethod.js");
|
|
14
|
-
const require_processing_processProgram = require("../processing/processProgram.js");
|
|
15
|
-
const require_processing_processScopeChange = require("../processing/processScopeChange.js");
|
|
16
|
-
require("../processing/index.js");
|
|
15
|
+
const require_processing_processCatchClause = require("../processing/processCatchClause.js");
|
|
17
16
|
//#region src/passes/basePass.ts
|
|
18
17
|
function basePass(state) {
|
|
19
18
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basePass.js","names":[],"sources":["../../src/passes/basePass.ts"],"sourcesContent":["import { TransformState } from '../state/types';\nimport { TraverseOptions } from '@babel/traverse';\nimport
|
|
1
|
+
{"version":3,"file":"basePass.js","names":["processProgram","processScopeChange","processFunctionDeclaration","processFunctionExpression","processArrowFunctionExpression","processObjectMethod","processClassMethod","processClassPrivateMethod","processImportDeclaration","processAssignmentExpression","processClassDeclaration","processForInStatement","processForOfStatement","processCatchClause"],"sources":["../../src/passes/basePass.ts"],"sourcesContent":["import { TransformState } from '../state/types';\nimport { TraverseOptions } from '@babel/traverse';\nimport { processProgram } from '../processing/processProgram';\nimport { processScopeChange } from '../processing/processScopeChange';\nimport { processFunctionDeclaration } from '../processing/processFunctionDeclaration';\nimport { processFunctionExpression } from '../processing/processFunctionExpression';\nimport { processArrowFunctionExpression } from '../processing/processArrowFunctionExpression';\nimport { processObjectMethod } from '../processing/processObjectMethod';\nimport { processClassMethod } from '../processing/processClassMethod';\nimport { processClassPrivateMethod } from '../processing/processClassPrivateMethod';\nimport { processImportDeclaration } from '../processing/processImportDeclaration';\nimport { processAssignmentExpression } from '../processing/processAssignmentExpression';\nimport { processClassDeclaration } from '../processing/processClassDeclaration';\nimport { processForInStatement } from '../processing/processForInStatement';\nimport { processForOfStatement } from '../processing/processForOfStatement';\nimport { processCatchClause } from '../processing/processCatchClause';\n\nexport function basePass(state: TransformState): TraverseOptions {\n return {\n // Initialize trackers for this program\n Program: processProgram(state),\n\n /* ----------------------------- */\n /* Scope management */\n /* ----------------------------- */\n\n // for(let T in obj) { ... }\n ForStatement: processScopeChange(state),\n // while(T) { ... }\n WhileStatement: processScopeChange(state),\n // switch(T) { ... }\n SwitchStatement: processScopeChange(state),\n // { ... }\n BlockStatement: processScopeChange(state),\n // static { ... }\n StaticBlock: processScopeChange(state),\n\n /* ----------------------------- */\n /* Shadowing tracking */\n /* ----------------------------- */\n\n // --- Function Processing --- //\n // function T() { ... }\n FunctionDeclaration: processFunctionDeclaration(state),\n // const a = function T() {...}\n FunctionExpression: processFunctionExpression(state),\n // () => {...}\n ArrowFunctionExpression: processArrowFunctionExpression(state),\n // { T() {} } in objects\n ObjectMethod: processObjectMethod(state),\n // Class GT { T() { ... } } in classes\n ClassMethod: processClassMethod(state),\n // Class GT { #T() {...} }\n ClassPrivateMethod: processClassPrivateMethod(state),\n\n // --- Other Processing --- //\n // import T from '...'\n ImportDeclaration: processImportDeclaration(state),\n // let t = useGT(); t = undefined;\n AssignmentExpression: processAssignmentExpression(state),\n // class T { ... }\n ClassDeclaration: processClassDeclaration(state),\n // for(let T in obj) { ... }\n ForInStatement: processForInStatement(state),\n // for(let T of items) { ... }\n ForOfStatement: processForOfStatement(state),\n // try { ... } catch(T) { ... }\n CatchClause: processCatchClause(state),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,SAAS,OAAwC;AAC/D,QAAO;EAEL,SAASA,kCAAAA,eAAe,MAAM;EAO9B,cAAcC,sCAAAA,mBAAmB,MAAM;EAEvC,gBAAgBA,sCAAAA,mBAAmB,MAAM;EAEzC,iBAAiBA,sCAAAA,mBAAmB,MAAM;EAE1C,gBAAgBA,sCAAAA,mBAAmB,MAAM;EAEzC,aAAaA,sCAAAA,mBAAmB,MAAM;EAQtC,qBAAqBC,8CAAAA,2BAA2B,MAAM;EAEtD,oBAAoBC,6CAAAA,0BAA0B,MAAM;EAEpD,yBAAyBC,kDAAAA,+BAA+B,MAAM;EAE9D,cAAcC,uCAAAA,oBAAoB,MAAM;EAExC,aAAaC,sCAAAA,mBAAmB,MAAM;EAEtC,oBAAoBC,6CAAAA,0BAA0B,MAAM;EAIpD,mBAAmBC,4CAAAA,yBAAyB,MAAM;EAElD,sBAAsBC,+CAAAA,4BAA4B,MAAM;EAExD,kBAAkBC,2CAAAA,wBAAwB,MAAM;EAEhD,gBAAgBC,yCAAAA,sBAAsB,MAAM;EAE5C,gBAAgBC,yCAAAA,sBAAsB,MAAM;EAE5C,aAAaC,sCAAAA,mBAAmB,MAAM;EACvC"}
|
|
@@ -130,7 +130,6 @@ function handleReactInvocation(callExprPath, state) {
|
|
|
130
130
|
const hash = hasDeriveContext ? "" : _hash || require_utils_calculateHash.default({
|
|
131
131
|
source: children,
|
|
132
132
|
...context && { context },
|
|
133
|
-
...id && { id },
|
|
134
133
|
...maxChars != null && { maxChars },
|
|
135
134
|
...requiresReview === true && { requiresReview: true },
|
|
136
135
|
dataFormat: "JSX"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processCallExpression.js","names":["getCalleeNameFromExpression","getTrackedVariable","isTranslationFunctionCallback","isReactFunction","validateTranslationFunction","validateUseTranslationsCallback","validateUseMessagesCallback","createErrorLocation","t","getCalleeNameFromJsxExpressionParam","isTranslationComponent","validateTranslationComponentArgs","hashSource"],"sources":["../../../src/processing/collection/processCallExpression.ts"],"sourcesContent":["import { NodePath, VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { TransformState } from '../../state/types';\nimport {\n isTranslationComponent,\n isTranslationFunctionCallback,\n} from '../../utils/constants/gt/helpers';\nimport { getCalleeNameFromExpression } from '../../utils/parsing/getCalleeNameFromExpression';\nimport {\n GT_ALL_FUNCTIONS,\n GT_CALLBACK_FUNCTIONS,\n GT_OTHER_FUNCTIONS,\n} from '../../utils/constants/gt/constants';\nimport {\n validateTranslationFunction,\n validateUseMessagesCallback,\n validateUseTranslationsCallback,\n} from '../../transform/validation/validateTranslationFunction';\nimport { registerUseGTCallback } from '../../transform/registration/callbacks/registerUseGTCallback';\nimport { registerUseTranslationsCallback } from '../../transform/registration/callbacks/registerUseTranslationsCallback';\nimport { registerUseMessagesCallback } from '../../transform/registration/callbacks/registerUseMessagesCallback';\nimport { getTrackedVariable } from '../../transform/getTrackedVariable';\nimport { isReactFunction } from '../../utils/constants/react/helpers';\nimport { validateTranslationComponentArgs } from '../../transform/validation/validateTranslationComponentArgs';\nimport { registerTranslationComponent } from '../../transform/registration/registerTranslationComponent';\nimport { getCalleeNameFromJsxExpressionParam } from '../../transform/jsx-children/utils/getCalleeNameFromJsxExpressionParam';\nimport { createErrorLocation } from '../../utils/errors';\nimport hashSource from '../../utils/calculateHash';\nimport { registerStandaloneTranslation } from '../../transform/registration/registerStandaloneTranslation';\n\n/**\n * Process call expressions\n * - register content from GT callback functions invocations (useGT_callback, etc.)\n * - register <T> + other component content (via jsxDev, jsx, jsxs invocations)\n * - register msg() function invocations?\n * - generally validate content\n */\nexport function processCallExpression(\n state: TransformState\n): VisitNode<t.Node, t.CallExpression> {\n return (callExprPath) => {\n // Get the call expression\n const callExpr = callExprPath.node;\n\n // Get function name from callee\n const { namespaceName, functionName } =\n getCalleeNameFromExpression(callExpr);\n if (!functionName) {\n return;\n }\n\n // Get the canonical function name\n const { canonicalName, identifier, type } = getTrackedVariable(\n state.scopeTracker,\n namespaceName,\n functionName\n );\n if (!canonicalName) {\n return;\n }\n\n // Handle each respective case\n if (\n type === 'generaltranslation' &&\n isTranslationFunctionCallback(canonicalName)\n ) {\n // Handle translation function callbacks (useGT_callback, etc.)\n handleTranslationCallbackInvocation(\n callExprPath,\n state,\n canonicalName,\n identifier!\n );\n } else if (type === 'react' && isReactFunction(canonicalName)) {\n // Handle react variables (jsxDEV, etc.)\n handleReactInvocation(callExprPath, state);\n } else if (\n type === 'generaltranslation' &&\n canonicalName === GT_OTHER_FUNCTIONS.msg\n ) {\n // msg() is runtime-only content; it must not advance the injection counter.\n handleStandaloneTranslation(callExprPath, state, { injectHash: false });\n } else if (\n type === 'generaltranslation' &&\n canonicalName === GT_OTHER_FUNCTIONS.t\n ) {\n // Standalone t() receives an injected $_hash, so collection reserves a\n // matching counter slot for the injection pass.\n handleStandaloneTranslation(callExprPath, state, { injectHash: true });\n }\n };\n}\n\n/* =============================== */\n/* Handlers */\n/* =============================== */\n\n/**\n * Handle general translation variables\n * useGTCallback(), useTranslationsCallback(), useMessagesCallback(), etc.\n */\nfunction handleTranslationCallbackInvocation(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n canonicalName: GT_ALL_FUNCTIONS,\n identifier: number\n) {\n // Handle translation function callbacks ()\n switch (canonicalName) {\n case GT_CALLBACK_FUNCTIONS.useGT_callback:\n case GT_CALLBACK_FUNCTIONS.getGT_callback:\n handleUseGTCallback(callExprPath, state, identifier);\n break;\n case GT_CALLBACK_FUNCTIONS.useTranslations_callback:\n case GT_CALLBACK_FUNCTIONS.getTranslations_callback:\n handleUseTranslationsCallback(callExprPath, state, identifier);\n break;\n case GT_CALLBACK_FUNCTIONS.useMessages_callback:\n case GT_CALLBACK_FUNCTIONS.getMessages_callback:\n handleUseMessagesCallback(callExprPath, state, identifier);\n break;\n default:\n return;\n }\n}\n\n/**\n * Handle useGT_callback / getGT_callback\n */\nfunction handleUseGTCallback(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n identifier: number\n) {\n // Check for violations\n const useGTCallbackParams = validateTranslationFunction(callExprPath, state);\n state.errorTracker.addErrors(useGTCallbackParams.errors);\n if (\n useGTCallbackParams.errors.length > 0 ||\n useGTCallbackParams.content === undefined\n ) {\n return;\n }\n\n // Track the function call\n // When context contains derive(), skip hash calculation (CLI handles resolution)\n const hash = useGTCallbackParams.hasDeriveContext\n ? ''\n : useGTCallbackParams.hash;\n\n registerUseGTCallback({\n identifier,\n state,\n content: useGTCallbackParams.content,\n context: useGTCallbackParams.context,\n id: useGTCallbackParams.id,\n maxChars: useGTCallbackParams.maxChars,\n requiresReview: useGTCallbackParams.requiresReview,\n hash,\n format: useGTCallbackParams.format,\n });\n}\n\n/**\n * Handle useTranslations_callback / getTranslations_callback\n */\nfunction handleUseTranslationsCallback(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n identifier: number\n) {\n // Check for violations\n const callExpr = callExprPath.node;\n const useTranslationsCallbackParams =\n validateUseTranslationsCallback(callExpr);\n state.errorTracker.addErrors(useTranslationsCallbackParams.errors);\n if (useTranslationsCallbackParams.errors.length > 0) {\n return;\n }\n\n // Track the function call\n registerUseTranslationsCallback({\n identifier,\n state,\n });\n}\n\n/**\n * Handle useMessages_callback / getMessages_callback\n */\nfunction handleUseMessagesCallback(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n identifier: number\n) {\n // Validate parameters\n const callExpr = callExprPath.node;\n const useMessagesCallbackParams = validateUseMessagesCallback(callExpr);\n\n // Check for violations\n state.errorTracker.addErrors(useMessagesCallbackParams.errors);\n if (useMessagesCallbackParams.errors.length > 0) {\n return;\n }\n\n // Track the function call\n registerUseMessagesCallback({\n identifier,\n state,\n });\n}\n\n/**\n * Handle react function invocations\n * jsxDEV, jsx, jsxs, ...\n *\n * We want to check these because they wrap <T> and other components\n */\nfunction handleReactInvocation(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState\n) {\n const callExpr = callExprPath.node;\n // Check if it contains a GT component (first argument)\n if (callExpr.arguments.length === 0) {\n state.errorTracker.addError(\n 'React invocation must have at least one argument' +\n createErrorLocation(callExpr)\n );\n return;\n }\n const firstArg = callExpr.arguments[0];\n if (!t.isExpression(firstArg)) {\n state.errorTracker.addError(\n 'React invocation first argument must be an expression' +\n createErrorLocation(callExpr)\n );\n return;\n }\n\n // Get function name from callee\n const { namespaceName, functionName } =\n getCalleeNameFromJsxExpressionParam(firstArg);\n if (!functionName) {\n state.errorTracker.addError(\n 'React invocation first argument must be a function' +\n createErrorLocation(callExpr)\n );\n return;\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 // Filter out non-GT components\n if (type !== 'generaltranslation' || !isTranslationComponent(canonicalName)) {\n return;\n }\n\n // Validate the arguments\n const {\n errors,\n _hash,\n id,\n context,\n children,\n maxChars,\n requiresReview,\n hasDeriveContext,\n } = validateTranslationComponentArgs(callExprPath, canonicalName, state);\n\n if (errors.length > 0) {\n state.errorTracker.addErrors(errors);\n return;\n }\n\n // Calculate hash (skip when context contains derive — CLI handles resolution)\n const hash = hasDeriveContext\n ? ''\n : _hash ||\n hashSource({\n source: children!,\n ...(context && { context }),\n ...(id && { id }),\n ...(maxChars != null && { maxChars }),\n ...(requiresReview === true && { requiresReview: true }),\n dataFormat: 'JSX',\n });\n\n // Debug: record hash → children mapping\n // Note: children may be undefined when autoderive filters all dynamic-content\n // errors (the early return in constructJsxChildren means value is never set).\n // This is intentional — the compiler signals CLI resolution via hash=''.\n if (state.debugManifest) {\n state.debugManifest.set(hash, children ?? null);\n }\n\n // Track the component (increment counter, initialize aggregator, set hash)\n registerTranslationComponent(state, hash, {\n children,\n id,\n context,\n requiresReview,\n });\n}\n\n/**\n * Handle standalone translation functions: t() and msg()\n * Same argument structure as useGT_callback (message string + options object).\n */\nfunction handleStandaloneTranslation(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n { injectHash }: { injectHash: boolean }\n) {\n // Reuse the same validation as useGT_callback (identical argument structure)\n const params = validateTranslationFunction(callExprPath, state);\n state.errorTracker.addErrors(params.errors);\n if (params.errors.length > 0 || params.content === undefined) {\n return;\n }\n\n // Skip derive content\n if (params.hasDeriveContext) {\n return;\n }\n\n registerStandaloneTranslation({\n state,\n content: params.content,\n hash: params.hash,\n id: params.id,\n context: params.context,\n maxChars: params.maxChars,\n requiresReview: params.requiresReview,\n format: params.format,\n injectHash,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"processCallExpression.js","names":["getCalleeNameFromExpression","getTrackedVariable","isTranslationFunctionCallback","isReactFunction","validateTranslationFunction","validateUseTranslationsCallback","validateUseMessagesCallback","createErrorLocation","t","getCalleeNameFromJsxExpressionParam","isTranslationComponent","validateTranslationComponentArgs","hashSource"],"sources":["../../../src/processing/collection/processCallExpression.ts"],"sourcesContent":["import { NodePath, VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { TransformState } from '../../state/types';\nimport {\n isTranslationComponent,\n isTranslationFunctionCallback,\n} from '../../utils/constants/gt/helpers';\nimport { getCalleeNameFromExpression } from '../../utils/parsing/getCalleeNameFromExpression';\nimport {\n GT_ALL_FUNCTIONS,\n GT_CALLBACK_FUNCTIONS,\n GT_OTHER_FUNCTIONS,\n} from '../../utils/constants/gt/constants';\nimport {\n validateTranslationFunction,\n validateUseMessagesCallback,\n validateUseTranslationsCallback,\n} from '../../transform/validation/validateTranslationFunction';\nimport { registerUseGTCallback } from '../../transform/registration/callbacks/registerUseGTCallback';\nimport { registerUseTranslationsCallback } from '../../transform/registration/callbacks/registerUseTranslationsCallback';\nimport { registerUseMessagesCallback } from '../../transform/registration/callbacks/registerUseMessagesCallback';\nimport { getTrackedVariable } from '../../transform/getTrackedVariable';\nimport { isReactFunction } from '../../utils/constants/react/helpers';\nimport { validateTranslationComponentArgs } from '../../transform/validation/validateTranslationComponentArgs';\nimport { registerTranslationComponent } from '../../transform/registration/registerTranslationComponent';\nimport { getCalleeNameFromJsxExpressionParam } from '../../transform/jsx-children/utils/getCalleeNameFromJsxExpressionParam';\nimport { createErrorLocation } from '../../utils/errors';\nimport hashSource from '../../utils/calculateHash';\nimport { registerStandaloneTranslation } from '../../transform/registration/registerStandaloneTranslation';\n\n/**\n * Process call expressions\n * - register content from GT callback functions invocations (useGT_callback, etc.)\n * - register <T> + other component content (via jsxDev, jsx, jsxs invocations)\n * - register msg() function invocations?\n * - generally validate content\n */\nexport function processCallExpression(\n state: TransformState\n): VisitNode<t.Node, t.CallExpression> {\n return (callExprPath) => {\n // Get the call expression\n const callExpr = callExprPath.node;\n\n // Get function name from callee\n const { namespaceName, functionName } =\n getCalleeNameFromExpression(callExpr);\n if (!functionName) {\n return;\n }\n\n // Get the canonical function name\n const { canonicalName, identifier, type } = getTrackedVariable(\n state.scopeTracker,\n namespaceName,\n functionName\n );\n if (!canonicalName) {\n return;\n }\n\n // Handle each respective case\n if (\n type === 'generaltranslation' &&\n isTranslationFunctionCallback(canonicalName)\n ) {\n // Handle translation function callbacks (useGT_callback, etc.)\n handleTranslationCallbackInvocation(\n callExprPath,\n state,\n canonicalName,\n identifier!\n );\n } else if (type === 'react' && isReactFunction(canonicalName)) {\n // Handle react variables (jsxDEV, etc.)\n handleReactInvocation(callExprPath, state);\n } else if (\n type === 'generaltranslation' &&\n canonicalName === GT_OTHER_FUNCTIONS.msg\n ) {\n // msg() is runtime-only content; it must not advance the injection counter.\n handleStandaloneTranslation(callExprPath, state, { injectHash: false });\n } else if (\n type === 'generaltranslation' &&\n canonicalName === GT_OTHER_FUNCTIONS.t\n ) {\n // Standalone t() receives an injected $_hash, so collection reserves a\n // matching counter slot for the injection pass.\n handleStandaloneTranslation(callExprPath, state, { injectHash: true });\n }\n };\n}\n\n/* =============================== */\n/* Handlers */\n/* =============================== */\n\n/**\n * Handle general translation variables\n * useGTCallback(), useTranslationsCallback(), useMessagesCallback(), etc.\n */\nfunction handleTranslationCallbackInvocation(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n canonicalName: GT_ALL_FUNCTIONS,\n identifier: number\n) {\n // Handle translation function callbacks ()\n switch (canonicalName) {\n case GT_CALLBACK_FUNCTIONS.useGT_callback:\n case GT_CALLBACK_FUNCTIONS.getGT_callback:\n handleUseGTCallback(callExprPath, state, identifier);\n break;\n case GT_CALLBACK_FUNCTIONS.useTranslations_callback:\n case GT_CALLBACK_FUNCTIONS.getTranslations_callback:\n handleUseTranslationsCallback(callExprPath, state, identifier);\n break;\n case GT_CALLBACK_FUNCTIONS.useMessages_callback:\n case GT_CALLBACK_FUNCTIONS.getMessages_callback:\n handleUseMessagesCallback(callExprPath, state, identifier);\n break;\n default:\n return;\n }\n}\n\n/**\n * Handle useGT_callback / getGT_callback\n */\nfunction handleUseGTCallback(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n identifier: number\n) {\n // Check for violations\n const useGTCallbackParams = validateTranslationFunction(callExprPath, state);\n state.errorTracker.addErrors(useGTCallbackParams.errors);\n if (\n useGTCallbackParams.errors.length > 0 ||\n useGTCallbackParams.content === undefined\n ) {\n return;\n }\n\n // Track the function call\n // When context contains derive(), skip hash calculation (CLI handles resolution)\n const hash = useGTCallbackParams.hasDeriveContext\n ? ''\n : useGTCallbackParams.hash;\n\n registerUseGTCallback({\n identifier,\n state,\n content: useGTCallbackParams.content,\n context: useGTCallbackParams.context,\n id: useGTCallbackParams.id,\n maxChars: useGTCallbackParams.maxChars,\n requiresReview: useGTCallbackParams.requiresReview,\n hash,\n format: useGTCallbackParams.format,\n });\n}\n\n/**\n * Handle useTranslations_callback / getTranslations_callback\n */\nfunction handleUseTranslationsCallback(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n identifier: number\n) {\n // Check for violations\n const callExpr = callExprPath.node;\n const useTranslationsCallbackParams =\n validateUseTranslationsCallback(callExpr);\n state.errorTracker.addErrors(useTranslationsCallbackParams.errors);\n if (useTranslationsCallbackParams.errors.length > 0) {\n return;\n }\n\n // Track the function call\n registerUseTranslationsCallback({\n identifier,\n state,\n });\n}\n\n/**\n * Handle useMessages_callback / getMessages_callback\n */\nfunction handleUseMessagesCallback(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n identifier: number\n) {\n // Validate parameters\n const callExpr = callExprPath.node;\n const useMessagesCallbackParams = validateUseMessagesCallback(callExpr);\n\n // Check for violations\n state.errorTracker.addErrors(useMessagesCallbackParams.errors);\n if (useMessagesCallbackParams.errors.length > 0) {\n return;\n }\n\n // Track the function call\n registerUseMessagesCallback({\n identifier,\n state,\n });\n}\n\n/**\n * Handle react function invocations\n * jsxDEV, jsx, jsxs, ...\n *\n * We want to check these because they wrap <T> and other components\n */\nfunction handleReactInvocation(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState\n) {\n const callExpr = callExprPath.node;\n // Check if it contains a GT component (first argument)\n if (callExpr.arguments.length === 0) {\n state.errorTracker.addError(\n 'React invocation must have at least one argument' +\n createErrorLocation(callExpr)\n );\n return;\n }\n const firstArg = callExpr.arguments[0];\n if (!t.isExpression(firstArg)) {\n state.errorTracker.addError(\n 'React invocation first argument must be an expression' +\n createErrorLocation(callExpr)\n );\n return;\n }\n\n // Get function name from callee\n const { namespaceName, functionName } =\n getCalleeNameFromJsxExpressionParam(firstArg);\n if (!functionName) {\n state.errorTracker.addError(\n 'React invocation first argument must be a function' +\n createErrorLocation(callExpr)\n );\n return;\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 // Filter out non-GT components\n if (type !== 'generaltranslation' || !isTranslationComponent(canonicalName)) {\n return;\n }\n\n // Validate the arguments\n const {\n errors,\n _hash,\n id,\n context,\n children,\n maxChars,\n requiresReview,\n hasDeriveContext,\n } = validateTranslationComponentArgs(callExprPath, canonicalName, state);\n\n if (errors.length > 0) {\n state.errorTracker.addErrors(errors);\n return;\n }\n\n // Calculate hash (skip when context contains derive — CLI handles resolution)\n const hash = hasDeriveContext\n ? ''\n : _hash ||\n hashSource({\n source: children!,\n ...(context && { context }),\n ...(maxChars != null && { maxChars }),\n ...(requiresReview === true && { requiresReview: true }),\n dataFormat: 'JSX',\n });\n\n // Debug: record hash → children mapping\n // Note: children may be undefined when autoderive filters all dynamic-content\n // errors (the early return in constructJsxChildren means value is never set).\n // This is intentional — the compiler signals CLI resolution via hash=''.\n if (state.debugManifest) {\n state.debugManifest.set(hash, children ?? null);\n }\n\n // Track the component (increment counter, initialize aggregator, set hash)\n registerTranslationComponent(state, hash, {\n children,\n id,\n context,\n requiresReview,\n });\n}\n\n/**\n * Handle standalone translation functions: t() and msg()\n * Same argument structure as useGT_callback (message string + options object).\n */\nfunction handleStandaloneTranslation(\n callExprPath: NodePath<t.CallExpression>,\n state: TransformState,\n { injectHash }: { injectHash: boolean }\n) {\n // Reuse the same validation as useGT_callback (identical argument structure)\n const params = validateTranslationFunction(callExprPath, state);\n state.errorTracker.addErrors(params.errors);\n if (params.errors.length > 0 || params.content === undefined) {\n return;\n }\n\n // Skip derive content\n if (params.hasDeriveContext) {\n return;\n }\n\n registerStandaloneTranslation({\n state,\n content: params.content,\n hash: params.hash,\n id: params.id,\n context: params.context,\n maxChars: params.maxChars,\n requiresReview: params.requiresReview,\n format: params.format,\n injectHash,\n });\n}\n"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { TransformState } from '../../state/types';
|
|
|
7
7
|
*
|
|
8
8
|
* Only extracts when:
|
|
9
9
|
* - t is unbound (global macro)
|
|
10
|
-
* - t is imported from gt-react
|
|
10
|
+
* - t is imported from a gt-react entrypoint
|
|
11
11
|
*
|
|
12
12
|
* Does NOT transform the AST — read-only extraction.
|
|
13
13
|
* If the message contains derive() (returns TemplateLiteral), it's skipped.
|
|
@@ -12,7 +12,7 @@ _babel_types = require_runtime.__toESM(_babel_types);
|
|
|
12
12
|
*
|
|
13
13
|
* Only extracts when:
|
|
14
14
|
* - t is unbound (global macro)
|
|
15
|
-
* - t is imported from gt-react
|
|
15
|
+
* - t is imported from a gt-react entrypoint
|
|
16
16
|
*
|
|
17
17
|
* Does NOT transform the AST — read-only extraction.
|
|
18
18
|
* If the message contains derive() (returns TemplateLiteral), it's skipped.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processTaggedTemplateExpression.js","names":["isStringTranslationTaggedTemplate","transformTemplateLiteral","t"],"sources":["../../../src/processing/collection/processTaggedTemplateExpression.ts"],"sourcesContent":["import { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { TransformState } from '../../state/types';\nimport { transformTemplateLiteral } from '../../transform/macro-expansion/transformTemplateLiteral';\nimport { registerStandaloneTranslation } from '../../transform/registration/registerStandaloneTranslation';\nimport { isStringTranslationTaggedTemplate } from '../../utils/parsing/isStringTranslationTaggedTemplate';\n\n/**\n * Process tagged template expressions during the collection pass.\n * Extracts the message for runtime-only entries (t`Hello ${name}`).\n *\n * Only extracts when:\n * - t is unbound (global macro)\n * - t is imported from gt-react
|
|
1
|
+
{"version":3,"file":"processTaggedTemplateExpression.js","names":["isStringTranslationTaggedTemplate","transformTemplateLiteral","t"],"sources":["../../../src/processing/collection/processTaggedTemplateExpression.ts"],"sourcesContent":["import { VisitNode } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { TransformState } from '../../state/types';\nimport { transformTemplateLiteral } from '../../transform/macro-expansion/transformTemplateLiteral';\nimport { registerStandaloneTranslation } from '../../transform/registration/registerStandaloneTranslation';\nimport { isStringTranslationTaggedTemplate } from '../../utils/parsing/isStringTranslationTaggedTemplate';\n\n/**\n * Process tagged template expressions during the collection pass.\n * Extracts the message for runtime-only entries (t`Hello ${name}`).\n *\n * Only extracts when:\n * - t is unbound (global macro)\n * - t is imported from a gt-react entrypoint\n *\n * Does NOT transform the AST — read-only extraction.\n * If the message contains derive() (returns TemplateLiteral), it's skipped.\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 (!isStringTranslationTaggedTemplate(path, symbol)) return;\n\n // Extract message from the template literal (reuse macro expansion utility)\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 if (errors.length > 0 || message == null) {\n state.errorTracker.addErrors(errors);\n return;\n }\n\n // If message is a TemplateLiteral, it contains derive() — skip\n // TODO: remove this check once derive is supported\n if (!t.isStringLiteral(message)) {\n return;\n }\n\n // Register as runtime-only content; tagged templates are not hash-injected.\n registerStandaloneTranslation({\n state,\n content: message.value,\n injectHash: false,\n });\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,SAAgB,gCACd,OAC+C;CAC/C,MAAM,SAAS,MAAM,SAAS;AAE9B,SAAQ,SAAS;;AACf,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;AAC5B,MAAI,OAAO,SAAS,KAAK,WAAW,MAAM;AACxC,SAAM,aAAa,UAAU,OAAO;AACpC;;AAKF,MAAI,CAACC,aAAE,gBAAgB,QAAQ,CAC7B;AAIF,+DAAA,8BAA8B;GAC5B;GACA,SAAS,QAAQ;GACjB,YAAY;GACb,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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,
|
|
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"}
|