@generaltranslation/compiler 1.3.27 → 1.3.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/config.d.ts +12 -7
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +61 -6
  7. package/dist/index.js.map +1 -1
  8. package/dist/passes/basePass.d.ts.map +1 -1
  9. package/dist/passes/basePass.js +9 -10
  10. package/dist/passes/basePass.js.map +1 -1
  11. package/dist/processing/collection/processCallExpression.js +8 -6
  12. package/dist/processing/collection/processCallExpression.js.map +1 -1
  13. package/dist/processing/collection/processTaggedTemplateExpression.d.ts +1 -1
  14. package/dist/processing/collection/processTaggedTemplateExpression.js +1 -1
  15. package/dist/processing/collection/processTaggedTemplateExpression.js.map +1 -1
  16. package/dist/processing/jsx-insertion/processCallExpression.js.map +1 -1
  17. package/dist/processing/jsx-insertion/processProgram.d.ts.map +1 -1
  18. package/dist/processing/jsx-insertion/processProgram.js +1 -1
  19. package/dist/processing/jsx-insertion/processProgram.js.map +1 -1
  20. package/dist/processing/macro-expansion/processProgram.js +1 -1
  21. package/dist/processing/macro-expansion/processProgram.js.map +1 -1
  22. package/dist/processing/macro-expansion/processTaggedTemplateExpression.d.ts +1 -1
  23. package/dist/processing/macro-expansion/processTaggedTemplateExpression.js +1 -1
  24. package/dist/processing/macro-expansion/processTaggedTemplateExpression.js.map +1 -1
  25. package/dist/processing/processFunctionDeclaration.js +1 -1
  26. package/dist/processing/processFunctionExpression.js +1 -1
  27. package/dist/processing/runtime-translate/processProgram.d.ts.map +1 -1
  28. package/dist/processing/runtime-translate/processProgram.js +2 -1
  29. package/dist/processing/runtime-translate/processProgram.js.map +1 -1
  30. package/dist/state/StringCollector.d.ts +3 -3
  31. package/dist/state/StringCollector.d.ts.map +1 -1
  32. package/dist/state/StringCollector.js.map +1 -1
  33. package/dist/state/utils/initializeState.d.ts.map +1 -1
  34. package/dist/state/utils/initializeState.js +8 -5
  35. package/dist/state/utils/initializeState.js.map +1 -1
  36. package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.d.ts +1 -1
  37. package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.js +6 -5
  38. package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.js.map +1 -1
  39. package/dist/transform/injection/injectHashIntoTranslationOptions.d.ts.map +1 -1
  40. package/dist/transform/injection/injectHashIntoTranslationOptions.js +1 -0
  41. package/dist/transform/injection/injectHashIntoTranslationOptions.js.map +1 -1
  42. package/dist/transform/injection/injectTComponentParameters.d.ts.map +1 -1
  43. package/dist/transform/injection/injectTComponentParameters.js +2 -1
  44. package/dist/transform/injection/injectTComponentParameters.js.map +1 -1
  45. package/dist/transform/jsx-children/constructJsxChildren.d.ts +1 -0
  46. package/dist/transform/jsx-children/constructJsxChildren.d.ts.map +1 -1
  47. package/dist/transform/jsx-children/constructJsxChildren.js +17 -5
  48. package/dist/transform/jsx-children/constructJsxChildren.js.map +1 -1
  49. package/dist/transform/jsx-insertion/injectJsxInsertionImport.d.ts +2 -2
  50. package/dist/transform/jsx-insertion/injectJsxInsertionImport.d.ts.map +1 -1
  51. package/dist/transform/jsx-insertion/injectJsxInsertionImport.js +4 -3
  52. package/dist/transform/jsx-insertion/injectJsxInsertionImport.js.map +1 -1
  53. package/dist/transform/macro-expansion/injectMacroImport.d.ts +2 -2
  54. package/dist/transform/macro-expansion/injectMacroImport.d.ts.map +1 -1
  55. package/dist/transform/macro-expansion/injectMacroImport.js +4 -3
  56. package/dist/transform/macro-expansion/injectMacroImport.js.map +1 -1
  57. package/dist/transform/registration/callbacks/registerUseGTCallback.d.ts.map +1 -1
  58. package/dist/transform/registration/callbacks/registerUseGTCallback.js +0 -1
  59. package/dist/transform/registration/callbacks/registerUseGTCallback.js.map +1 -1
  60. package/dist/transform/registration/registerStandaloneTranslation.d.ts.map +1 -1
  61. package/dist/transform/registration/registerStandaloneTranslation.js +0 -1
  62. package/dist/transform/registration/registerStandaloneTranslation.js.map +1 -1
  63. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.d.ts +3 -2
  64. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.d.ts.map +1 -1
  65. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.js +4 -3
  66. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.js.map +1 -1
  67. package/dist/transform/validation/validateTranslationComponentArgs.d.ts +2 -0
  68. package/dist/transform/validation/validateTranslationComponentArgs.d.ts.map +1 -1
  69. package/dist/transform/validation/validateTranslationComponentArgs.js +4 -3
  70. package/dist/transform/validation/validateTranslationComponentArgs.js.map +1 -1
  71. package/dist/transform/validation/validateTranslationFunction.d.ts.map +1 -1
  72. package/dist/transform/validation/validateTranslationFunction.js +3 -3
  73. package/dist/transform/validation/validateTranslationFunction.js.map +1 -1
  74. package/dist/utils/calculateHash.d.ts +1 -2
  75. package/dist/utils/calculateHash.d.ts.map +1 -1
  76. package/dist/utils/calculateHash.js +1 -3
  77. package/dist/utils/calculateHash.js.map +1 -1
  78. package/dist/utils/constants/gt/constants.d.ts +1 -5
  79. package/dist/utils/constants/gt/constants.d.ts.map +1 -1
  80. package/dist/utils/constants/gt/constants.js +1 -5
  81. package/dist/utils/constants/gt/constants.js.map +1 -1
  82. package/dist/utils/constants/gt/helpers.d.ts +2 -1
  83. package/dist/utils/constants/gt/helpers.d.ts.map +1 -1
  84. package/dist/utils/constants/gt/helpers.js +15 -5
  85. package/dist/utils/constants/gt/helpers.js.map +1 -1
  86. package/dist/utils/constants/resolveIdentifier/isGTComponent.d.ts +1 -1
  87. package/dist/utils/constants/resolveIdentifier/isGTComponent.d.ts.map +1 -1
  88. package/dist/utils/constants/resolveIdentifier/isGTComponent.js +2 -3
  89. package/dist/utils/constants/resolveIdentifier/isGTComponent.js.map +1 -1
  90. package/dist/utils/parsing/isStringTranslationTaggedTemplate.d.ts +1 -1
  91. package/dist/utils/parsing/isStringTranslationTaggedTemplate.js +3 -3
  92. package/dist/utils/parsing/isStringTranslationTaggedTemplate.js.map +1 -1
  93. package/package.json +3 -3
  94. package/dist/processing/index.d.ts +0 -15
  95. package/dist/processing/index.d.ts.map +0 -1
  96. package/dist/processing/index.js +0 -29
  97. package/dist/transform/jsx-children/index.d.ts +0 -2
  98. package/dist/transform/jsx-children/index.d.ts.map +0 -1
  99. package/dist/transform/jsx-children/index.js +0 -3
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
- /** @deprecated Use `autoderive` instead */
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
- /** @deprecated Use `autoderive` instead */
52
- autoDerive?: boolean;
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
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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 */\ntype GTConfig = {\n files?: {\n gt?: {\n parsingFlags?: {\n enableAutoJsxInjection?: boolean;\n autoderive?: boolean | { jsx?: boolean; strings?: boolean };\n /** @deprecated Use `autoderive` instead */\n autoDerive?: 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 */\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 /** @deprecated Use `autoderive` instead */\n autoDerive?: 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 /** 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":";;;;;;;;AAkFA,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"}
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;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAWxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,YAAY;CAEtD;AAED,eAAO,MAAM,yBAAyB,iMAC0J,CAAC;AAEjM,eAAO,MAAM,4BAA4B,GACvC,YAAY,MAAM,EAClB,OAAO,OAAO,WAI6C,CAAC;AAsC9D;;;;;GAKG;AACH,QAAA,MAAM,UAAU,6EA4If,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"}
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.gtConfig ? {
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
- if (hasCollectionContent) (0, _babel_traverse.default)(ast, require_passes_injectionPass.injectionPass(state));
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 (!hasCollectionContent && state.statistics.macroExpansionsCount === 0 && state.statistics.jsxInsertionsCount === 0 && state.statistics.runtimeTranslateCount === 0) return null;
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;AAGlD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAoD/D"}
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"}
@@ -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 require_processing_processAssignmentExpression = require("../processing/processAssignmentExpression.js");
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 require_processing_processFunctionDeclaration = require("../processing/processFunctionDeclaration.js");
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 * as p from '../processing';\n\nexport function basePass(state: TransformState): TraverseOptions {\n return {\n // Initialize trackers for this program\n Program: p.processProgram(state),\n\n /* ----------------------------- */\n /* Scope management */\n /* ----------------------------- */\n\n // for(let T in obj) { ... }\n ForStatement: p.processScopeChange(state),\n // while(T) { ... }\n WhileStatement: p.processScopeChange(state),\n // switch(T) { ... }\n SwitchStatement: p.processScopeChange(state),\n // { ... }\n BlockStatement: p.processScopeChange(state),\n // static { ... }\n StaticBlock: p.processScopeChange(state),\n\n /* ----------------------------- */\n /* Shadowing tracking */\n /* ----------------------------- */\n\n // --- Function Processing --- //\n // function T() { ... }\n FunctionDeclaration: p.processFunctionDeclaration(state),\n // const a = function T() {...}\n FunctionExpression: p.processFunctionExpression(state),\n // () => {...}\n ArrowFunctionExpression: p.processArrowFunctionExpression(state),\n // { T() {} } in objects\n ObjectMethod: p.processObjectMethod(state),\n // Class GT { T() { ... } } in classes\n ClassMethod: p.processClassMethod(state),\n // Class GT { #T() {...} }\n ClassPrivateMethod: p.processClassPrivateMethod(state),\n\n // --- Other Processing --- //\n // import T from '...'\n ImportDeclaration: p.processImportDeclaration(state),\n // let t = useGT(); t = undefined;\n AssignmentExpression: p.processAssignmentExpression(state),\n // class T { ... }\n ClassDeclaration: p.processClassDeclaration(state),\n // for(let T in obj) { ... }\n ForInStatement: p.processForInStatement(state),\n // for(let T of items) { ... }\n ForOfStatement: p.processForOfStatement(state),\n // try { ... } catch(T) { ... }\n CatchClause: p.processCatchClause(state),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAIA,SAAgB,SAAS,OAAwC;AAC/D,QAAO;EAEL,SAAA,kCAAA,eAA0B,MAAM;EAOhC,cAAA,sCAAA,mBAAmC,MAAM;EAEzC,gBAAA,sCAAA,mBAAqC,MAAM;EAE3C,iBAAA,sCAAA,mBAAsC,MAAM;EAE5C,gBAAA,sCAAA,mBAAqC,MAAM;EAE3C,aAAA,sCAAA,mBAAkC,MAAM;EAQxC,qBAAA,8CAAA,2BAAkD,MAAM;EAExD,oBAAA,6CAAA,0BAAgD,MAAM;EAEtD,yBAAA,kDAAA,+BAA0D,MAAM;EAEhE,cAAA,uCAAA,oBAAoC,MAAM;EAE1C,aAAA,sCAAA,mBAAkC,MAAM;EAExC,oBAAA,6CAAA,0BAAgD,MAAM;EAItD,mBAAA,4CAAA,yBAA8C,MAAM;EAEpD,sBAAA,+CAAA,4BAAoD,MAAM;EAE1D,kBAAA,2CAAA,wBAA4C,MAAM;EAElD,gBAAA,yCAAA,sBAAwC,MAAM;EAE9C,gBAAA,yCAAA,sBAAwC,MAAM;EAE9C,aAAA,sCAAA,mBAAkC,MAAM;EACzC"}
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 || useGTCallbackParams.content === void 0) return;
69
- const hash = useGTCallbackParams.hasDeriveContext ? "" : useGTCallbackParams.hash;
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":"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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 (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/browser
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/browser
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/browser\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
+ {"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"}