@generaltranslation/compiler 1.3.27 → 1.3.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +8 -6
- 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/injection/injectHashIntoTranslationOptions.d.ts.map +1 -1
- package/dist/transform/injection/injectHashIntoTranslationOptions.js +1 -0
- package/dist/transform/injection/injectHashIntoTranslationOptions.js.map +1 -1
- package/dist/transform/injection/injectTComponentParameters.d.ts.map +1 -1
- package/dist/transform/injection/injectTComponentParameters.js +2 -1
- package/dist/transform/injection/injectTComponentParameters.js.map +1 -1
- package/dist/transform/jsx-children/constructJsxChildren.d.ts +1 -0
- package/dist/transform/jsx-children/constructJsxChildren.d.ts.map +1 -1
- package/dist/transform/jsx-children/constructJsxChildren.js +17 -5
- 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.d.ts +2 -0
- package/dist/transform/validation/validateTranslationComponentArgs.d.ts.map +1 -1
- package/dist/transform/validation/validateTranslationComponentArgs.js +4 -3
- 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":";;;;;;;;;;;;;;;;;;;;;;;;AAkEA,MAAa,4BACX;AAEF,MAAa,gCACX,YACA,UAEA,mEAAmE,WAAW,iFAE3E,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAE3D,SAAS,WAAW,UAA6C;AAC/D,QAAO,aAAa,YAAY,aAAa;;AAiB/C,SAAS,sBAA0C;CACjD,MAAM,aAAaA,UAAAA,QAAK,KAAK,QAAQ,KAAK,EAAE,iBAAiB;AAC7D,KAAI,CAACC,QAAAA,QAAG,WAAW,WAAW,CAC5B,QAAO,EAAE,QAAQ,WAAW;AAG9B,KAAI;AACF,SAAO;GACL,UAAU,KAAK,MAAMA,QAAAA,QAAG,aAAa,YAAY,QAAQ,CAAC;GAG1D,QAAQ;GACT;UACM,OAAO;AACd,SAAO;GAAE;GAAY;GAAO,QAAQ;GAAW;;;AAInD,SAAS,kBAAkB,SAAqC;AAC9D,QACE,QAAQ,kBAAkB,KAAA,KAC1B,QAAQ,YAAY,KAAA,KACpB,QAAQ,cAAc,KAAA,KACtB,QAAQ,eAAe,KAAA,KACvB,QAAQ,UAAU,KAAA;;AAItB,SAAS,kBAAkB,SAAkD;AAC3E,KAAI,CAAC,kBAAkB,QAAQ,CAAE,QAAO,KAAA;AAExC,QAAO;EACL,GAAI,QAAQ,kBAAkB,KAAA,IAC1B,EAAE,eAAe,QAAQ,eAAe,GACxC,EAAE;EACN,GAAI,QAAQ,YAAY,KAAA,IAAY,EAAE,SAAS,QAAQ,SAAS,GAAG,EAAE;EACrE,GAAI,QAAQ,cAAc,KAAA,IACtB,EAAE,WAAW,QAAQ,WAAW,GAChC,EAAE;EACN,GAAI,QAAQ,eAAe,KAAA,IACvB,EAAE,YAAY,QAAQ,YAAY,GAClC,EAAE;EACN,GAAI,QAAQ,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,OAAO,GAAG,EAAE;EAChE;;AAGH,SAAS,eAAe,MAAgB,UAA8B;;CACpE,MAAM,eAAe;EAAE,GAAG;EAAM,GAAG;EAAU;AAC7C,KAAI,CAAC,KAAK,SAAS,CAAC,SAAS,MAAO,QAAO;CAE3C,MAAM,QAAQ;EAAE,GAAG,KAAK;EAAO,GAAG,SAAS;EAAO;AAClD,OAAA,cAAI,KAAK,WAAA,QAAA,gBAAA,KAAA,IAAA,KAAA,IAAA,YAAO,SAAA,kBAAM,SAAS,WAAA,QAAA,oBAAA,KAAA,IAAA,KAAA,IAAA,gBAAO,KAAI;;EACxC,MAAM,KAAK;GAAE,IAAA,eAAG,KAAK,WAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAA,aAAO;GAAI,IAAA,mBAAG,SAAS,WAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAO;GAAI;AACvD,QAAA,eAAI,KAAK,WAAA,QAAA,iBAAA,KAAA,MAAA,eAAA,aAAO,QAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAA,aAAI,mBAAA,mBAAgB,SAAS,WAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAO,QAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAI,eAAc;;AACpE,MAAG,eAAe;IAChB,IAAA,eAAG,KAAK,WAAA,QAAA,iBAAA,KAAA,MAAA,eAAA,aAAO,QAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAA,aAAI;IACnB,IAAA,mBAAG,SAAS,WAAA,QAAA,qBAAA,KAAA,MAAA,mBAAA,iBAAO,QAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAI;IACxB;;AAEH,QAAM,KAAK;;AAGb,QAAO;EAAE,GAAG;EAAc;EAAO;;AAGnC,SAAS,gBAAgB,SAAgD;AACvE,KAAI,QAAQ,SACV,QAAO;EAAE,UAAU,QAAQ;EAAU,QAAQ;EAAU;CAGzD,MAAM,iBAAiB,kBAAkB,QAAQ;CACjD,MAAM,eAAe,qBAAqB;AAC1C,KAAI,CAAC,eAAgB,QAAO;AAE5B,QAAO;EACL,UACE,aAAa,WAAW,WACpB,eAAe,aAAa,UAAU,eAAe,GACrD;EACN,QAAQ;EACT;;;;;;;;AASH,MAAM,cAAA,GAAA,SAAA,iBACH,UAAU,EAAE,KAAK;CAChB,MAAM,qBAAqB,gBAAgB,QAAQ;CACnD,MAAM,iBACJ,mBAAmB,WAAW,WAC1B,mBAAmB,WACnB,KAAA;CACN,MAAM,kBAAqC;EACzC,GAAG;EACH,GAAI,iBAAiB,EAAE,UAAU,gBAAgB,GAAG,EAAE;EACvD;AAED,KAAI,WAAW,QAAQ,SAAS;MAC1B,mBAAmB,WAAW,UAChC,SAAQ,KAAK,0BAA0B;WAC9B,mBAAmB,WAAW,UACvC,SAAQ,KACN,6BACE,mBAAmB,YACnB,mBAAmB,MACpB,CACF;;CAKL,MAAM,gBAAgB,gBAAgB,qCAClC,IAAI,KAAsB,GAC1B,KAAA;AAEJ,QAAO;EACL,MAAM;EACN,iBAAiB,IAAY;AAE3B,UACE,GAAG,SAAS,OAAO,IACnB,GAAG,SAAS,OAAO,IACnB,GAAG,SAAS,MAAM,IAClB,GAAG,SAAS,MAAM;;EAGtB,UAAU,MAAc,IAAY;GAElC,MAAM,QAAQC,oCAAAA,gBAAgB,iBAAiB,GAAG;AAClD,OAAI,cAAe,OAAM,gBAAgB;AACzC,OAAI;AAEF,QACE,MAAM,SAAS,sBACf,CAAC,MAAM,SAAS,gBAEhB,QAAO;IAIT,MAAM,MAAMC,cAAO,MAAM,MAAM;KAC7B,YAAY;KACZ,SAAS;MAAC;MAAO;MAAc;MAAoB;KACnD,6BAA6B;KAC7B,4BAA4B;KAC7B,CAAC;AAGF,QAAI,MAAM,SAAS,uBACjB,EAAA,GAAA,gBAAA,SAAS,KAAKC,gCAAAA,iBAAiB,MAAM,CAAC;AAIxC,QAAI,MAAM,SAAS,qBACjB,EAAA,GAAA,gBAAA,SAAS,KAAKC,kCAAAA,mBAAmB,MAAM,CAAC;AAI1C,KAAA,GAAA,gBAAA,SAAS,KAAKC,8BAAAA,eAAe,MAAM,CAAC;AAGpC,QAAIC,4BAAAA,aAAa,MAAM,CACrB,QAAO;IAKT,MAAM,uBAAuB,MAAM,gBAAgB,YAAY;IAC/D,MAAM,eACJ,wBAAwB,MAAM,SAAS;AAEzC,QAAI,aACF,EAAA,GAAA,gBAAA,SAAS,KAAKC,6BAAAA,cAAc,MAAM,CAAC;AAOrC,SAFE,MAAM,SAAS,aAAa,WAC5B,MAAM,SAAS,aAAa,QACJ,qBACxB,EAAA,GAAA,gBAAA,SAAS,KAAKC,oCAAAA,qBAAqB,MAAM,CAAC;AAI5C,QACE,CAAC,gBACD,MAAM,WAAW,yBAAyB,KAC1C,MAAM,WAAW,uBAAuB,KACxC,MAAM,WAAW,0BAA0B,EAE3C,QAAO;AAGT,YAAA,GAAA,iBAAA,SAAgB,KAAK;KACnB,aAAa;KACb,SAAS;KACV,CAAC;YACK,OAAO;AAEd,QAAI,iBAAiBC,4BAAAA,yBACnB,OAAM;AAIR,UAAM,OAAO,SAAS,oBAAoB,GAAG,IAAI,QAAQ;AACzD,WAAO;;;EAGX,WAAW;AACT,OAAI,iBAAiB,cAAc,OAAO,GAAG;IAC3C,MAAM,KAAK,QAAQ,KAAK;IAExB,MAAM,UADO,QAAQ,OACD,CAAC,QACnB,QAAQ,KAAK,EACb,+BACD;IACD,MAAM,WAAW,OAAO,YAAY,cAAc;AAClD,OAAG,cAAc,SAAS,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;AAE5D,YAAQ,IACN,gDAAgD,QAAQ,IAAI,cAAc,KAAK,WAChF;;;EAGN;EAEJ;AAID,MAAa,UAAU,WAAW;AAClC,MAAa,OAAO,WAAW;AAC/B,MAAa,SAAS,WAAW;AACjC,MAAa,UAAU,WAAW"}
|
|
@@ -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"}
|
|
@@ -65,8 +65,11 @@ function handleTranslationCallbackInvocation(callExprPath, state, canonicalName,
|
|
|
65
65
|
function handleUseGTCallback(callExprPath, state, identifier) {
|
|
66
66
|
const useGTCallbackParams = require_transform_validation_validateTranslationFunction.validateTranslationFunction(callExprPath, state);
|
|
67
67
|
state.errorTracker.addErrors(useGTCallbackParams.errors);
|
|
68
|
-
if (useGTCallbackParams.errors.length > 0
|
|
69
|
-
|
|
68
|
+
if (useGTCallbackParams.errors.length > 0) return;
|
|
69
|
+
if (useGTCallbackParams.content === void 0 || useGTCallbackParams.hasDeriveContext) {
|
|
70
|
+
state.stringCollector.incrementCounter();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
70
73
|
require_transform_registration_callbacks_registerUseGTCallback.registerUseGTCallback({
|
|
71
74
|
identifier,
|
|
72
75
|
state,
|
|
@@ -75,7 +78,7 @@ function handleUseGTCallback(callExprPath, state, identifier) {
|
|
|
75
78
|
id: useGTCallbackParams.id,
|
|
76
79
|
maxChars: useGTCallbackParams.maxChars,
|
|
77
80
|
requiresReview: useGTCallbackParams.requiresReview,
|
|
78
|
-
hash,
|
|
81
|
+
hash: useGTCallbackParams.hash,
|
|
79
82
|
format: useGTCallbackParams.format
|
|
80
83
|
});
|
|
81
84
|
}
|
|
@@ -122,15 +125,14 @@ function handleReactInvocation(callExprPath, state) {
|
|
|
122
125
|
const { canonicalName, type } = require_transform_getTrackedVariable.getTrackedVariable(state.scopeTracker, namespaceName, functionName);
|
|
123
126
|
if (!canonicalName) return;
|
|
124
127
|
if (type !== "generaltranslation" || !require_utils_constants_gt_helpers.isTranslationComponent(canonicalName)) return;
|
|
125
|
-
const { errors, _hash, id, context, children, maxChars, requiresReview, hasDeriveContext } = require_transform_validation_validateTranslationComponentArgs.validateTranslationComponentArgs(callExprPath, canonicalName, state);
|
|
128
|
+
const { errors, _hash, id, context, children, maxChars, requiresReview, hasDeriveContext, hasDeriveChildren } = require_transform_validation_validateTranslationComponentArgs.validateTranslationComponentArgs(callExprPath, canonicalName, state);
|
|
126
129
|
if (errors.length > 0) {
|
|
127
130
|
state.errorTracker.addErrors(errors);
|
|
128
131
|
return;
|
|
129
132
|
}
|
|
130
|
-
const hash = hasDeriveContext ? "" : _hash || require_utils_calculateHash.default({
|
|
133
|
+
const hash = hasDeriveContext || hasDeriveChildren ? "" : _hash || require_utils_calculateHash.default({
|
|
131
134
|
source: children,
|
|
132
135
|
...context && { context },
|
|
133
|
-
...id && { id },
|
|
134
136
|
...maxChars != null && { maxChars },
|
|
135
137
|
...requiresReview === true && { requiresReview: true },
|
|
136
138
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,SAAgB,sBACd,OACqC;AACrC,SAAQ,iBAAiB;EAEvB,MAAM,WAAW,aAAa;EAG9B,MAAM,EAAE,eAAe,iBACrBA,kDAAAA,4BAA4B,SAAS;AACvC,MAAI,CAAC,aACH;EAIF,MAAM,EAAE,eAAe,YAAY,SAASC,qCAAAA,mBAC1C,MAAM,cACN,eACA,aACD;AACD,MAAI,CAAC,cACH;AAIF,MACE,SAAS,wBACTC,mCAAAA,8BAA8B,cAAc,CAG5C,qCACE,cACA,OACA,eACA,WACD;WACQ,SAAS,WAAWC,sCAAAA,gBAAgB,cAAc,CAE3D,uBAAsB,cAAc,MAAM;WAE1C,SAAS,wBACT,kBAAA,MAGA,6BAA4B,cAAc,OAAO,EAAE,YAAY,OAAO,CAAC;WAEvE,SAAS,wBACT,kBAAA,IAIA,6BAA4B,cAAc,OAAO,EAAE,YAAY,MAAM,CAAC;;;;;;;AAa5E,SAAS,oCACP,cACA,OACA,eACA,YACA;AAEA,SAAQ,eAAR;EACE,KAAA;EACA,KAAA;AACE,uBAAoB,cAAc,OAAO,WAAW;AACpD;EACF,KAAA;EACA,KAAA;AACE,iCAA8B,cAAc,OAAO,WAAW;AAC9D;EACF,KAAA;EACA,KAAA;AACE,6BAA0B,cAAc,OAAO,WAAW;AAC1D;EACF,QACE;;;;;;AAON,SAAS,oBACP,cACA,OACA,YACA;CAEA,MAAM,sBAAsBC,yDAAAA,4BAA4B,cAAc,MAAM;AAC5E,OAAM,aAAa,UAAU,oBAAoB,OAAO;AACxD,KACE,oBAAoB,OAAO,SAAS,KACpC,oBAAoB,YAAY,KAAA,EAEhC;CAKF,MAAM,OAAO,oBAAoB,mBAC7B,KACA,oBAAoB;AAExB,gEAAA,sBAAsB;EACpB;EACA;EACA,SAAS,oBAAoB;EAC7B,SAAS,oBAAoB;EAC7B,IAAI,oBAAoB;EACxB,UAAU,oBAAoB;EAC9B,gBAAgB,oBAAoB;EACpC;EACA,QAAQ,oBAAoB;EAC7B,CAAC;;;;;AAMJ,SAAS,8BACP,cACA,OACA,YACA;CAEA,MAAM,WAAW,aAAa;CAC9B,MAAM,gCACJC,yDAAAA,gCAAgC,SAAS;AAC3C,OAAM,aAAa,UAAU,8BAA8B,OAAO;AAClE,KAAI,8BAA8B,OAAO,SAAS,EAChD;;;;;AAaJ,SAAS,0BACP,cACA,OACA,YACA;CAEA,MAAM,WAAW,aAAa;CAC9B,MAAM,4BAA4BC,yDAAAA,4BAA4B,SAAS;AAGvE,OAAM,aAAa,UAAU,0BAA0B,OAAO;AAC9D,KAAI,0BAA0B,OAAO,SAAS,EAC5C;;;;;;;;AAgBJ,SAAS,sBACP,cACA,OACA;CACA,MAAM,WAAW,aAAa;AAE9B,KAAI,SAAS,UAAU,WAAW,GAAG;AACnC,QAAM,aAAa,SACjB,qDACEC,qBAAAA,oBAAoB,SAAS,CAChC;AACD;;CAEF,MAAM,WAAW,SAAS,UAAU;AACpC,KAAI,CAACC,aAAE,aAAa,SAAS,EAAE;AAC7B,QAAM,aAAa,SACjB,0DACED,qBAAAA,oBAAoB,SAAS,CAChC;AACD;;CAIF,MAAM,EAAE,eAAe,iBACrBE,yEAAAA,oCAAoC,SAAS;AAC/C,KAAI,CAAC,cAAc;AACjB,QAAM,aAAa,SACjB,uDACEF,qBAAAA,oBAAoB,SAAS,CAChC;AACD;;CAGF,MAAM,EAAE,eAAe,SAASN,qCAAAA,mBAC9B,MAAM,cACN,eACA,aACD;AACD,KAAI,CAAC,cACH;AAIF,KAAI,SAAS,wBAAwB,CAACS,mCAAAA,uBAAuB,cAAc,CACzE;CAIF,MAAM,EACJ,QACA,OACA,IACA,SACA,UACA,UACA,gBACA,qBACEC,8DAAAA,iCAAiC,cAAc,eAAe,MAAM;AAExE,KAAI,OAAO,SAAS,GAAG;AACrB,QAAM,aAAa,UAAU,OAAO;AACpC;;CAIF,MAAM,OAAO,mBACT,KACA,SACAC,4BAAAA,QAAW;EACT,QAAQ;EACR,GAAI,WAAW,EAAE,SAAS;EAC1B,GAAI,MAAM,EAAE,IAAI;EAChB,GAAI,YAAY,QAAQ,EAAE,UAAU;EACpC,GAAI,mBAAmB,QAAQ,EAAE,gBAAgB,MAAM;EACvD,YAAY;EACb,CAAC;AAMN,KAAI,MAAM,cACR,OAAM,cAAc,IAAI,MAAM,YAAY,KAAK;AAIjD,6DAAA,6BAA6B,OAAO,MAAM;EACxC;EACA;EACA;EACA;EACD,CAAC;;;;;;AAOJ,SAAS,4BACP,cACA,OACA,EAAE,cACF;CAEA,MAAM,SAASR,yDAAAA,4BAA4B,cAAc,MAAM;AAC/D,OAAM,aAAa,UAAU,OAAO,OAAO;AAC3C,KAAI,OAAO,OAAO,SAAS,KAAK,OAAO,YAAY,KAAA,EACjD;AAIF,KAAI,OAAO,iBACT;AAGF,8DAAA,8BAA8B;EAC5B;EACA,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,IAAI,OAAO;EACX,SAAS,OAAO;EAChB,UAAU,OAAO;EACjB,gBAAgB,OAAO;EACvB,QAAQ,OAAO;EACf;EACD,CAAC"}
|
|
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 (useGTCallbackParams.errors.length > 0) {\n return;\n }\n\n // Derive content (explicit derive() in the message, autoderive dynamic\n // content) and derive $context cannot be hashed at compile time — the CLI\n // resolves the variants and the runtime hashes the resolved values.\n // Reserve the counter slot without a hash so the injection pass stays\n // aligned and skips this call; register no prefetch entry.\n if (\n useGTCallbackParams.content === undefined ||\n useGTCallbackParams.hasDeriveContext\n ) {\n state.stringCollector.incrementCounter();\n return;\n }\n\n // Track the function call\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: useGTCallbackParams.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 hasDeriveChildren,\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 or children contain a\n // <Derive> element — one hash per resolved variant, so the runtime computes\n // it; the CLI handles variant resolution)\n const hash =\n hasDeriveContext || hasDeriveChildren\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"}
|