@generaltranslation/compiler 1.3.22 → 1.3.23

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 (226) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +23 -0
  2. package/dist/config.js +32 -27
  3. package/dist/config.js.map +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +120 -187
  7. package/dist/index.js.map +1 -1
  8. package/dist/passes/basePass.js +40 -83
  9. package/dist/passes/basePass.js.map +1 -1
  10. package/dist/passes/collectionPass.js +18 -11
  11. package/dist/passes/collectionPass.js.map +1 -1
  12. package/dist/passes/handleErrors.js +21 -30
  13. package/dist/passes/handleErrors.js.map +1 -1
  14. package/dist/passes/injectionPass.js +15 -9
  15. package/dist/passes/injectionPass.js.map +1 -1
  16. package/dist/passes/jsxInsertionPass.js +33 -31
  17. package/dist/passes/jsxInsertionPass.js.map +1 -1
  18. package/dist/passes/macroExpansionPass.js +28 -26
  19. package/dist/passes/macroExpansionPass.js.map +1 -1
  20. package/dist/passes/runtimeTranslatePass.js +37 -35
  21. package/dist/passes/runtimeTranslatePass.js.map +1 -1
  22. package/dist/processing/collection/processCallExpression.js +144 -249
  23. package/dist/processing/collection/processCallExpression.js.map +1 -1
  24. package/dist/processing/collection/processTaggedTemplateExpression.js +38 -75
  25. package/dist/processing/collection/processTaggedTemplateExpression.js.map +1 -1
  26. package/dist/processing/collection/processVariableDeclarator.js +20 -18
  27. package/dist/processing/collection/processVariableDeclarator.js.map +1 -1
  28. package/dist/processing/index.js +29 -31
  29. package/dist/processing/injection/processCallExpression.js +69 -142
  30. package/dist/processing/injection/processCallExpression.js.map +1 -1
  31. package/dist/processing/injection/processVariableDeclarator.js +22 -20
  32. package/dist/processing/injection/processVariableDeclarator.js.map +1 -1
  33. package/dist/processing/jsx-insertion/processCallExpression.js +284 -393
  34. package/dist/processing/jsx-insertion/processCallExpression.js.map +1 -1
  35. package/dist/processing/jsx-insertion/processImportDeclaration.js +37 -83
  36. package/dist/processing/jsx-insertion/processImportDeclaration.js.map +1 -1
  37. package/dist/processing/jsx-insertion/processProgram.js +26 -66
  38. package/dist/processing/jsx-insertion/processProgram.js.map +1 -1
  39. package/dist/processing/macro-expansion/processImportDeclaration.js +21 -55
  40. package/dist/processing/macro-expansion/processImportDeclaration.js.map +1 -1
  41. package/dist/processing/macro-expansion/processProgram.js +20 -26
  42. package/dist/processing/macro-expansion/processProgram.js.map +1 -1
  43. package/dist/processing/macro-expansion/processTaggedTemplateExpression.js +33 -69
  44. package/dist/processing/macro-expansion/processTaggedTemplateExpression.js.map +1 -1
  45. package/dist/processing/processArrowFunctionExpression.js +18 -16
  46. package/dist/processing/processArrowFunctionExpression.js.map +1 -1
  47. package/dist/processing/processAssignmentExpression.js +12 -10
  48. package/dist/processing/processAssignmentExpression.js.map +1 -1
  49. package/dist/processing/processCatchClause.js +18 -16
  50. package/dist/processing/processCatchClause.js.map +1 -1
  51. package/dist/processing/processClassDeclaration.js +18 -16
  52. package/dist/processing/processClassDeclaration.js.map +1 -1
  53. package/dist/processing/processClassMethod.js +18 -17
  54. package/dist/processing/processClassMethod.js.map +1 -1
  55. package/dist/processing/processClassPrivateMethod.js +18 -17
  56. package/dist/processing/processClassPrivateMethod.js.map +1 -1
  57. package/dist/processing/processForInStatement.js +18 -16
  58. package/dist/processing/processForInStatement.js.map +1 -1
  59. package/dist/processing/processForOfStatement.js +18 -16
  60. package/dist/processing/processForOfStatement.js.map +1 -1
  61. package/dist/processing/processFunctionDeclaration.js +20 -18
  62. package/dist/processing/processFunctionDeclaration.js.map +1 -1
  63. package/dist/processing/processFunctionExpression.js +26 -24
  64. package/dist/processing/processFunctionExpression.js.map +1 -1
  65. package/dist/processing/processImportDeclaration.js +11 -9
  66. package/dist/processing/processImportDeclaration.js.map +1 -1
  67. package/dist/processing/processObjectMethod.js +19 -18
  68. package/dist/processing/processObjectMethod.js.map +1 -1
  69. package/dist/processing/processProgram.js +13 -13
  70. package/dist/processing/processProgram.js.map +1 -1
  71. package/dist/processing/processScopeChange.js +15 -13
  72. package/dist/processing/processScopeChange.js.map +1 -1
  73. package/dist/processing/runtime-translate/processImportDeclaration.js +30 -63
  74. package/dist/processing/runtime-translate/processImportDeclaration.js.map +1 -1
  75. package/dist/processing/runtime-translate/processProgram.js +34 -57
  76. package/dist/processing/runtime-translate/processProgram.js.map +1 -1
  77. package/dist/state/ErrorTracker.js +18 -17
  78. package/dist/state/ErrorTracker.js.map +1 -1
  79. package/dist/state/Logger.js +42 -52
  80. package/dist/state/Logger.js.map +1 -1
  81. package/dist/state/ScopeTracker.js +154 -209
  82. package/dist/state/ScopeTracker.js.map +1 -1
  83. package/dist/state/StringCollector.js +165 -184
  84. package/dist/state/StringCollector.js.map +1 -1
  85. package/dist/state/types.js +1 -3
  86. package/dist/state/utils/initializeState.js +62 -67
  87. package/dist/state/utils/initializeState.js.map +1 -1
  88. package/dist/transform/getTrackedVariable.js +33 -38
  89. package/dist/transform/getTrackedVariable.js.map +1 -1
  90. package/dist/transform/injection/callbacks/injectUseGTCallbackParameters.js +19 -27
  91. package/dist/transform/injection/callbacks/injectUseGTCallbackParameters.js.map +1 -1
  92. package/dist/transform/injection/callbacks/injectUseMessagesCallbackParameters.js +8 -6
  93. package/dist/transform/injection/callbacks/injectUseMessagesCallbackParameters.js.map +1 -1
  94. package/dist/transform/injection/callbacks/injectUseTranslationsCallbackParameters.js +8 -6
  95. package/dist/transform/injection/callbacks/injectUseTranslationsCallbackParameters.js.map +1 -1
  96. package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.js +74 -155
  97. package/dist/transform/injection/injectCallbackDeclaratorFunctionParameters.js.map +1 -1
  98. package/dist/transform/injection/injectHashIntoTranslationOptions.js +21 -61
  99. package/dist/transform/injection/injectHashIntoTranslationOptions.js.map +1 -1
  100. package/dist/transform/injection/injectStandaloneTFunctionParameters.js +21 -27
  101. package/dist/transform/injection/injectStandaloneTFunctionParameters.js.map +1 -1
  102. package/dist/transform/injection/injectTComponentParameters.js +25 -65
  103. package/dist/transform/injection/injectTComponentParameters.js.map +1 -1
  104. package/dist/transform/jsx-children/constructJsxChildren.js +273 -392
  105. package/dist/transform/jsx-children/constructJsxChildren.js.map +1 -1
  106. package/dist/transform/jsx-children/errors.js +16 -6
  107. package/dist/transform/jsx-children/errors.js.map +1 -1
  108. package/dist/transform/jsx-children/index.js +3 -6
  109. package/dist/transform/jsx-children/utils/getBranchComponentParameters.js +26 -85
  110. package/dist/transform/jsx-children/utils/getBranchComponentParameters.js.map +1 -1
  111. package/dist/transform/jsx-children/utils/getCalleeNameFromJsxExpressionParam.js +33 -66
  112. package/dist/transform/jsx-children/utils/getCalleeNameFromJsxExpressionParam.js.map +1 -1
  113. package/dist/transform/jsx-children/utils/id.js +18 -17
  114. package/dist/transform/jsx-children/utils/id.js.map +1 -1
  115. package/dist/transform/jsx-children/validation/validateChildrenElement.js +13 -47
  116. package/dist/transform/jsx-children/validation/validateChildrenElement.js.map +1 -1
  117. package/dist/transform/jsx-children/validation/validateChildrenFromArgs.js +25 -63
  118. package/dist/transform/jsx-children/validation/validateChildrenFromArgs.js.map +1 -1
  119. package/dist/transform/jsx-children/validation/validateIdentifier.js +38 -41
  120. package/dist/transform/jsx-children/validation/validateIdentifier.js.map +1 -1
  121. package/dist/transform/jsx-children/validation/validateJsxCall.js +15 -26
  122. package/dist/transform/jsx-children/validation/validateJsxCall.js.map +1 -1
  123. package/dist/transform/jsx-children/validation/validateNameFieldForVarComponent.js +33 -61
  124. package/dist/transform/jsx-children/validation/validateNameFieldForVarComponent.js.map +1 -1
  125. package/dist/transform/jsx-children/validation/validateStringLiteralPropertyFromArg.js +38 -66
  126. package/dist/transform/jsx-children/validation/validateStringLiteralPropertyFromArg.js.map +1 -1
  127. package/dist/transform/jsx-children/validation/validateTemplateLiteral.js +17 -13
  128. package/dist/transform/jsx-children/validation/validateTemplateLiteral.js.map +1 -1
  129. package/dist/transform/jsx-children/validation/validateUnaryExpression.js +26 -61
  130. package/dist/transform/jsx-children/validation/validateUnaryExpression.js.map +1 -1
  131. package/dist/transform/jsx-insertion/injectJsxInsertionImport.js +16 -48
  132. package/dist/transform/jsx-insertion/injectJsxInsertionImport.js.map +1 -1
  133. package/dist/transform/macro-expansion/injectMacroImport.js +14 -43
  134. package/dist/transform/macro-expansion/injectMacroImport.js.map +1 -1
  135. package/dist/transform/macro-expansion/transformTemplateLiteral.js +23 -22
  136. package/dist/transform/macro-expansion/transformTemplateLiteral.js.map +1 -1
  137. package/dist/transform/registration/callbacks/registerUseGTCallback.js +27 -34
  138. package/dist/transform/registration/callbacks/registerUseGTCallback.js.map +1 -1
  139. package/dist/transform/registration/callbacks/registerUseMessagesCallback.js +9 -9
  140. package/dist/transform/registration/callbacks/registerUseMessagesCallback.js.map +1 -1
  141. package/dist/transform/registration/callbacks/registerUseTranslationsCallback.js +9 -9
  142. package/dist/transform/registration/callbacks/registerUseTranslationsCallback.js.map +1 -1
  143. package/dist/transform/registration/registerStandaloneTranslation.js +27 -28
  144. package/dist/transform/registration/registerStandaloneTranslation.js.map +1 -1
  145. package/dist/transform/registration/registerTranslationComponent.js +15 -15
  146. package/dist/transform/registration/registerTranslationComponent.js.map +1 -1
  147. package/dist/transform/runtime-translate/buildRuntimeTranslateCalls.js +34 -85
  148. package/dist/transform/runtime-translate/buildRuntimeTranslateCalls.js.map +1 -1
  149. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.js +25 -55
  150. package/dist/transform/runtime-translate/injectRuntimeTranslateImport.js.map +1 -1
  151. package/dist/transform/tracking/trackAssignmentExpression.js +26 -63
  152. package/dist/transform/tracking/trackAssignmentExpression.js.map +1 -1
  153. package/dist/transform/tracking/trackCatchClause.js +17 -48
  154. package/dist/transform/tracking/trackCatchClause.js.map +1 -1
  155. package/dist/transform/tracking/trackClassDeclaration.js +13 -13
  156. package/dist/transform/tracking/trackClassDeclaration.js.map +1 -1
  157. package/dist/transform/tracking/trackForDeclaration.js +17 -53
  158. package/dist/transform/tracking/trackForDeclaration.js.map +1 -1
  159. package/dist/transform/tracking/trackFunctionName.js +10 -10
  160. package/dist/transform/tracking/trackFunctionName.js.map +1 -1
  161. package/dist/transform/tracking/trackFunctionParams.js +19 -54
  162. package/dist/transform/tracking/trackFunctionParams.js.map +1 -1
  163. package/dist/transform/tracking/trackImportDeclaration.js +36 -89
  164. package/dist/transform/tracking/trackImportDeclaration.js.map +1 -1
  165. package/dist/transform/tracking/trackOverridingVariable.js +9 -11
  166. package/dist/transform/tracking/trackOverridingVariable.js.map +1 -1
  167. package/dist/transform/tracking/trackVariableDeclarator.js +51 -102
  168. package/dist/transform/tracking/trackVariableDeclarator.js.map +1 -1
  169. package/dist/transform/validation/validateTranslationComponentArgs.js +156 -232
  170. package/dist/transform/validation/validateTranslationComponentArgs.js.map +1 -1
  171. package/dist/transform/validation/validateTranslationFunction.js +218 -329
  172. package/dist/transform/validation/validateTranslationFunction.js.map +1 -1
  173. package/dist/utils/calculateHash.js +55 -70
  174. package/dist/utils/calculateHash.js.map +1 -1
  175. package/dist/utils/constants/gt/constants.js +142 -132
  176. package/dist/utils/constants/gt/constants.js.map +1 -1
  177. package/dist/utils/constants/gt/helpers.js +147 -149
  178. package/dist/utils/constants/gt/helpers.js.map +1 -1
  179. package/dist/utils/constants/other/constants.js +45 -41
  180. package/dist/utils/constants/other/constants.js.map +1 -1
  181. package/dist/utils/constants/other/helpers.js +13 -11
  182. package/dist/utils/constants/other/helpers.js.map +1 -1
  183. package/dist/utils/constants/react/constants.js +47 -41
  184. package/dist/utils/constants/react/constants.js.map +1 -1
  185. package/dist/utils/constants/react/helpers.js +17 -16
  186. package/dist/utils/constants/react/helpers.js.map +1 -1
  187. package/dist/utils/constants/resolveIdentifier/isGTComponent.js +41 -76
  188. package/dist/utils/constants/resolveIdentifier/isGTComponent.js.map +1 -1
  189. package/dist/utils/constants/resolveIdentifier/isReactJsxFunction.js +33 -83
  190. package/dist/utils/constants/resolveIdentifier/isReactJsxFunction.js.map +1 -1
  191. package/dist/utils/errors.js +18 -20
  192. package/dist/utils/errors.js.map +1 -1
  193. package/dist/utils/multiplication/multiply.js +31 -35
  194. package/dist/utils/multiplication/multiply.js.map +1 -1
  195. package/dist/utils/multiplication/types.js +1 -3
  196. package/dist/utils/parsing/extractIdentifiersFromLVal.js +30 -96
  197. package/dist/utils/parsing/extractIdentifiersFromLVal.js.map +1 -1
  198. package/dist/utils/parsing/getCalleeNameFromExpression.js +31 -65
  199. package/dist/utils/parsing/getCalleeNameFromExpression.js.map +1 -1
  200. package/dist/utils/parsing/getCalleeNameFromExpressionWrapper.js +13 -10
  201. package/dist/utils/parsing/getCalleeNameFromExpressionWrapper.js.map +1 -1
  202. package/dist/utils/parsing/getObjectPropertyFromObjectExpression.js +19 -56
  203. package/dist/utils/parsing/getObjectPropertyFromObjectExpression.js.map +1 -1
  204. package/dist/utils/parsing/getStringLiteralFromExpression.js +18 -49
  205. package/dist/utils/parsing/getStringLiteralFromExpression.js.map +1 -1
  206. package/dist/utils/parsing/isDeriveInvocation.js +25 -61
  207. package/dist/utils/parsing/isDeriveInvocation.js.map +1 -1
  208. package/dist/utils/parsing/isStringTranslationTaggedTemplate.js +23 -59
  209. package/dist/utils/parsing/isStringTranslationTaggedTemplate.js.map +1 -1
  210. package/dist/utils/string-expressions/buildTransformationResult.js +57 -96
  211. package/dist/utils/string-expressions/buildTransformationResult.js.map +1 -1
  212. package/dist/utils/string-expressions/flattenExpressionToParts.js +131 -142
  213. package/dist/utils/string-expressions/flattenExpressionToParts.js.map +1 -1
  214. package/dist/utils/string-expressions/resolveStaticExpression.js +36 -34
  215. package/dist/utils/string-expressions/resolveStaticExpression.js.map +1 -1
  216. package/dist/utils/validation/validateChildrenFromObjectExpression.js +29 -24
  217. package/dist/utils/validation/validateChildrenFromObjectExpression.js.map +1 -1
  218. package/dist/utils/validation/validateExpressionIsNumericLiteral.js +13 -47
  219. package/dist/utils/validation/validateExpressionIsNumericLiteral.js.map +1 -1
  220. package/dist/utils/validation/validateExpressionIsStringLiteral.js +15 -48
  221. package/dist/utils/validation/validateExpressionIsStringLiteral.js.map +1 -1
  222. package/package.json +8 -5
  223. package/dist/processing/index.js.map +0 -1
  224. package/dist/state/types.js.map +0 -1
  225. package/dist/transform/jsx-children/index.js.map +0 -1
  226. package/dist/utils/multiplication/types.js.map +0 -1
@@ -1,212 +1,157 @@
1
- "use strict";
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/state/ScopeTracker.ts
2
3
  /**
3
- * Scope Tracker - Handles variable scoping and import tracking
4
- *
5
- * Tracks useGT/getGT variable assignments across nested scopes
6
- * Manages variable shadowing and GT component imports
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.ScopeTracker = void 0;
10
- /**
11
- * Tracks scope hierarchy and variable assignments within scopes
12
- */
13
- class ScopeTracker {
14
- constructor() {
15
- /** Next scope ID to assign */
16
- this.nextScopeId = 1; // Start at 1, reserve 0 for "no scope"
17
- /** Current scope being processed */
18
- this.currentScope = 0;
19
- /** Stack to track scope nesting for proper exit handling */
20
- this.scopeStack = [];
21
- /** Information about each scope */
22
- this.scopeInfo = new Map();
23
- /** Variables tracked per scope */
24
- this.scopedVariables = new Map();
25
- /** Namespace imports (e.g., GT from 'gt-next') */
26
- this.namespaceImports = new Set();
27
- }
28
- /* =============================== */
29
- /* Scope Tracker Methods */
30
- /* =============================== */
31
- /**
32
- * Enter a new scope and return the new scope ID
33
- */
34
- enterScope() {
35
- const newScopeId = this.nextScopeId;
36
- this.nextScopeId += 1;
37
- const scopeInfo = {
38
- id: newScopeId,
39
- parentId: this.currentScope,
40
- depth: this.currentScope !== 0 ? this.scopeStack.length + 1 : 0,
41
- };
42
- this.scopeInfo.set(newScopeId, scopeInfo);
43
- // Push current scope to stack
44
- this.scopeStack.push(this.currentScope);
45
- this.currentScope = newScopeId;
46
- return newScopeId;
47
- }
48
- /**
49
- * Exit the current scope and return to parent (with aggressive cleanup)
50
- */
51
- exitScope() {
52
- var _a;
53
- if (this.currentScope === 0) {
54
- return;
55
- }
56
- // Remove all variables from the exiting scope immediately
57
- for (const [varName, variables] of this.scopedVariables.entries()) {
58
- // Filter out variables from the current scope
59
- // TODO: there is definitely an O(1) solution here rather than iterating over each entire list
60
- const filteredVars = variables.filter((variable) => variable.scopeId !== this.currentScope);
61
- if (filteredVars.length === 0) {
62
- // Remove empty variable name entries
63
- this.scopedVariables.delete(varName);
64
- }
65
- else {
66
- this.scopedVariables.set(varName, filteredVars);
67
- }
68
- }
69
- // Get parent scope from the scope info before removing it
70
- const parentId = ((_a = this.scopeInfo.get(this.currentScope)) === null || _a === void 0 ? void 0 : _a.parentId) || 0;
71
- // Remove scope info for the exiting scope
72
- this.scopeInfo.delete(this.currentScope);
73
- // Update current scope to parent
74
- this.currentScope = parentId;
75
- // Pop from stack if there are items
76
- if (this.scopeStack.length > 0) {
77
- this.scopeStack.pop();
78
- }
79
- }
80
- /* =============================== */
81
- /* Variable Tracking Methods */
82
- /* =============================== */
83
- /**
84
- * Track a variable assignment in the current scope
85
- */
86
- trackVariable(aliasName, canonicalName, isTranslationFunction, type, identifier) {
87
- const scopedVar = {
88
- scopeId: this.currentScope,
89
- canonicalName,
90
- aliasName,
91
- isTranslationFunction,
92
- type,
93
- identifier,
94
- };
95
- const existingVars = this.scopedVariables.get(aliasName) || [];
96
- existingVars.push(scopedVar);
97
- this.scopedVariables.set(aliasName, existingVars);
98
- }
99
- /**
100
- * Track a translation function variable
101
- */
102
- trackTranslationVariable(aliasName, canonicalName, identifier) {
103
- this.trackVariable(aliasName, canonicalName, true, 'generaltranslation', identifier);
104
- }
105
- /**
106
- * Track a translation callback function variable
107
- * const useGT_callback = useGT()
108
- * @param aliasName - The alias name of callback variable
109
- * @param canonicalName - The canonical name of the callback function
110
- * @param identifier - The identifier of the callback function
111
- * TODO: canonicalName might have to be shifted to the name of the RValue eg useGT in t = useGT() so you can properly map back to the original function
112
- */
113
- trackTranslationCallbackVariable(aliasName, canonicalName, identifier) {
114
- this.trackVariable(aliasName, canonicalName, true, 'generaltranslation', identifier);
115
- }
116
- /**
117
- * Track react variable
118
- */
119
- trackReactVariable(variableName, assignedValue, identifier) {
120
- this.trackVariable(variableName, assignedValue, false, 'react', identifier);
121
- }
122
- /**
123
- * Track a non-translation variable (convenience method)
124
- */
125
- trackRegularVariable(variableName, assignedValue) {
126
- this.trackVariable(variableName, assignedValue, false, 'other', 0); // 0 because we don't care about the identifier
127
- }
128
- /* =============================== */
129
- /* Variable Retrieval Methods */
130
- /* =============================== */
131
- /**
132
- * Find if a variable is accessible in the current scope
133
- */
134
- getVariable(variableName) {
135
- const variables = this.scopedVariables.get(variableName);
136
- if (variables && variables.length > 0) {
137
- // Return the last (most recent) variable - handles shadowing
138
- return variables[variables.length - 1];
139
- }
140
- return undefined;
141
- }
142
- /**
143
- * Get the translation variable info if it exists in current scope
144
- */
145
- getTranslationVariable(variableName) {
146
- const variable = this.getVariable(variableName);
147
- if (!variable) {
148
- return undefined;
149
- }
150
- // Check if the variable is a translation function
151
- if (!this.isScopedGTFunction(variable)) {
152
- return undefined;
153
- }
154
- return variable;
155
- }
156
- isScopedGTFunction(variable) {
157
- return variable.type === 'generaltranslation';
158
- }
159
- /* =============================== */
160
- /* Namespace Import Methods */
161
- /* =============================== */
162
- /**
163
- * Add a namespace import (e.g., GT from 'gt-next')
164
- */
165
- addNamespaceImport(name) {
166
- this.namespaceImports.add(name);
167
- }
168
- /**
169
- * Check if a namespace import exists
170
- */
171
- hasNamespaceImport(name) {
172
- return this.namespaceImports.has(name);
173
- }
174
- /* =============================== */
175
- /* Debugging Methods */
176
- /* =============================== */
177
- /**
178
- * Get scope info for debugging
179
- */
180
- getScopeInfo(scopeId) {
181
- return this.scopeInfo.get(scopeId) || undefined;
182
- }
183
- /**
184
- * Helper convert to string
185
- */
186
- serialize() {
187
- return {
188
- nextScopeId: this.nextScopeId,
189
- currentScope: this.currentScope,
190
- scopeStack: this.scopeStack,
191
- scopeInfo: Object.fromEntries(this.scopeInfo),
192
- scopedVariables: Object.fromEntries(this.scopedVariables),
193
- namespaceImports: Array.from(this.namespaceImports),
194
- };
195
- }
196
- /**
197
- * Helper to repopulate
198
- */
199
- unserialize(input) {
200
- this.nextScopeId = input.nextScopeId;
201
- this.currentScope = input.currentScope;
202
- this.scopeStack = input.scopeStack;
203
- this.scopeInfo = new Map(Object.entries(input.scopeInfo).map(([key, value]) => [
204
- Number(key),
205
- value,
206
- ]));
207
- this.scopedVariables = new Map(Object.entries(input.scopedVariables));
208
- this.namespaceImports = new Set(input.namespaceImports);
209
- }
210
- }
4
+ * Tracks scope hierarchy and variable assignments within scopes
5
+ */
6
+ var ScopeTracker = class {
7
+ constructor() {
8
+ this.nextScopeId = 1;
9
+ this.currentScope = 0;
10
+ this.scopeStack = [];
11
+ this.scopeInfo = /* @__PURE__ */ new Map();
12
+ this.scopedVariables = /* @__PURE__ */ new Map();
13
+ this.namespaceImports = /* @__PURE__ */ new Set();
14
+ }
15
+ /**
16
+ * Enter a new scope and return the new scope ID
17
+ */
18
+ enterScope() {
19
+ const newScopeId = this.nextScopeId;
20
+ this.nextScopeId += 1;
21
+ const scopeInfo = {
22
+ id: newScopeId,
23
+ parentId: this.currentScope,
24
+ depth: this.currentScope !== 0 ? this.scopeStack.length + 1 : 0
25
+ };
26
+ this.scopeInfo.set(newScopeId, scopeInfo);
27
+ this.scopeStack.push(this.currentScope);
28
+ this.currentScope = newScopeId;
29
+ return newScopeId;
30
+ }
31
+ /**
32
+ * Exit the current scope and return to parent (with aggressive cleanup)
33
+ */
34
+ exitScope() {
35
+ var _this$scopeInfo$get;
36
+ if (this.currentScope === 0) return;
37
+ for (const [varName, variables] of this.scopedVariables.entries()) {
38
+ const filteredVars = variables.filter((variable) => variable.scopeId !== this.currentScope);
39
+ if (filteredVars.length === 0) this.scopedVariables.delete(varName);
40
+ else this.scopedVariables.set(varName, filteredVars);
41
+ }
42
+ const parentId = ((_this$scopeInfo$get = this.scopeInfo.get(this.currentScope)) === null || _this$scopeInfo$get === void 0 ? void 0 : _this$scopeInfo$get.parentId) || 0;
43
+ this.scopeInfo.delete(this.currentScope);
44
+ this.currentScope = parentId;
45
+ if (this.scopeStack.length > 0) this.scopeStack.pop();
46
+ }
47
+ /**
48
+ * Track a variable assignment in the current scope
49
+ */
50
+ trackVariable(aliasName, canonicalName, isTranslationFunction, type, identifier) {
51
+ const scopedVar = {
52
+ scopeId: this.currentScope,
53
+ canonicalName,
54
+ aliasName,
55
+ isTranslationFunction,
56
+ type,
57
+ identifier
58
+ };
59
+ const existingVars = this.scopedVariables.get(aliasName) || [];
60
+ existingVars.push(scopedVar);
61
+ this.scopedVariables.set(aliasName, existingVars);
62
+ }
63
+ /**
64
+ * Track a translation function variable
65
+ */
66
+ trackTranslationVariable(aliasName, canonicalName, identifier) {
67
+ this.trackVariable(aliasName, canonicalName, true, "generaltranslation", identifier);
68
+ }
69
+ /**
70
+ * Track a translation callback function variable
71
+ * const useGT_callback = useGT()
72
+ * @param aliasName - The alias name of callback variable
73
+ * @param canonicalName - The canonical name of the callback function
74
+ * @param identifier - The identifier of the callback function
75
+ * TODO: canonicalName might have to be shifted to the name of the RValue eg useGT in t = useGT() so you can properly map back to the original function
76
+ */
77
+ trackTranslationCallbackVariable(aliasName, canonicalName, identifier) {
78
+ this.trackVariable(aliasName, canonicalName, true, "generaltranslation", identifier);
79
+ }
80
+ /**
81
+ * Track react variable
82
+ */
83
+ trackReactVariable(variableName, assignedValue, identifier) {
84
+ this.trackVariable(variableName, assignedValue, false, "react", identifier);
85
+ }
86
+ /**
87
+ * Track a non-translation variable (convenience method)
88
+ */
89
+ trackRegularVariable(variableName, assignedValue) {
90
+ this.trackVariable(variableName, assignedValue, false, "other", 0);
91
+ }
92
+ /**
93
+ * Find if a variable is accessible in the current scope
94
+ */
95
+ getVariable(variableName) {
96
+ const variables = this.scopedVariables.get(variableName);
97
+ if (variables && variables.length > 0) return variables[variables.length - 1];
98
+ }
99
+ /**
100
+ * Get the translation variable info if it exists in current scope
101
+ */
102
+ getTranslationVariable(variableName) {
103
+ const variable = this.getVariable(variableName);
104
+ if (!variable) return;
105
+ if (!this.isScopedGTFunction(variable)) return;
106
+ return variable;
107
+ }
108
+ isScopedGTFunction(variable) {
109
+ return variable.type === "generaltranslation";
110
+ }
111
+ /**
112
+ * Add a namespace import (e.g., GT from 'gt-next')
113
+ */
114
+ addNamespaceImport(name) {
115
+ this.namespaceImports.add(name);
116
+ }
117
+ /**
118
+ * Check if a namespace import exists
119
+ */
120
+ hasNamespaceImport(name) {
121
+ return this.namespaceImports.has(name);
122
+ }
123
+ /**
124
+ * Get scope info for debugging
125
+ */
126
+ getScopeInfo(scopeId) {
127
+ return this.scopeInfo.get(scopeId) || void 0;
128
+ }
129
+ /**
130
+ * Helper convert to string
131
+ */
132
+ serialize() {
133
+ return {
134
+ nextScopeId: this.nextScopeId,
135
+ currentScope: this.currentScope,
136
+ scopeStack: this.scopeStack,
137
+ scopeInfo: Object.fromEntries(this.scopeInfo),
138
+ scopedVariables: Object.fromEntries(this.scopedVariables),
139
+ namespaceImports: Array.from(this.namespaceImports)
140
+ };
141
+ }
142
+ /**
143
+ * Helper to repopulate
144
+ */
145
+ unserialize(input) {
146
+ this.nextScopeId = input.nextScopeId;
147
+ this.currentScope = input.currentScope;
148
+ this.scopeStack = input.scopeStack;
149
+ this.scopeInfo = new Map(Object.entries(input.scopeInfo).map(([key, value]) => [Number(key), value]));
150
+ this.scopedVariables = new Map(Object.entries(input.scopedVariables));
151
+ this.namespaceImports = new Set(input.namespaceImports);
152
+ }
153
+ };
154
+ //#endregion
211
155
  exports.ScopeTracker = ScopeTracker;
156
+
212
157
  //# sourceMappingURL=ScopeTracker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScopeTracker.js","sourceRoot":"","sources":["../../src/state/ScopeTracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScopeTracker.js","names":[],"sources":["../../src/state/ScopeTracker.ts"],"sourcesContent":["/**\n * Scope Tracker - Handles variable scoping and import tracking\n *\n * Tracks useGT/getGT variable assignments across nested scopes\n * Manages variable shadowing and GT component imports\n */\n\nimport {\n GT_ALL_FUNCTIONS,\n GT_CALLBACK_FUNCTIONS,\n} from '../utils/constants/gt/constants';\n\n// TODO: separate callback funtions and imported functions\n\n/**\n * Information about a scope\n */\nexport interface ScopeInfo {\n /** The scope ID */\n id: number;\n /** The parent scope ID */\n parentId: number;\n /** The depth of the scope */\n depth: number;\n}\n\n/**\n * Variable type represents which group the variable belongs to\n */\nexport type VariableType = 'generaltranslation' | 'react' | 'other';\n\n/**\n * Information about a scoped variable assignment\n */\nexport interface ScopedVariable {\n /** The scope ID */\n scopeId: number;\n /** The canonical name of the variable (useGT, getGT, T, etc.) */\n canonicalName: string | GT_ALL_FUNCTIONS;\n /** The variable name (t, translationFunction, etc.) */\n aliasName: string;\n /** Whether the variable is a translation function\n * @deprecated\n */\n isTranslationFunction: boolean;\n type: VariableType;\n /** The identifier for the variable */\n identifier: number;\n}\n\nexport interface ScopedGTFunction extends ScopedVariable {\n /** The canonical name of the GT function (useGT, getGT, etc.) */\n canonicalName: GT_ALL_FUNCTIONS;\n /** The type of GT function */\n type: 'generaltranslation';\n}\n\ntype SerializedScopeTracker = {\n nextScopeId: number;\n currentScope: number;\n scopeStack: number[];\n scopeInfo: Record<string, ScopeInfo>;\n scopedVariables: Record<string, ScopedVariable[]>;\n namespaceImports: string[];\n};\n\n/**\n * Tracks scope hierarchy and variable assignments within scopes\n */\nexport class ScopeTracker {\n /** Next scope ID to assign */\n private nextScopeId: number = 1; // Start at 1, reserve 0 for \"no scope\"\n /** Current scope being processed */\n private currentScope: number = 0;\n /** Stack to track scope nesting for proper exit handling */\n private scopeStack: number[] = [];\n /** Information about each scope */\n private scopeInfo: Map<number, ScopeInfo> = new Map();\n /** Variables tracked per scope */\n private scopedVariables: Map<string, ScopedVariable[]> = new Map();\n /** Namespace imports (e.g., GT from 'gt-next') */\n private namespaceImports: Set<string> = new Set();\n\n /* =============================== */\n /* Scope Tracker Methods */\n /* =============================== */\n\n /**\n * Enter a new scope and return the new scope ID\n */\n enterScope(): number {\n const newScopeId = this.nextScopeId;\n this.nextScopeId += 1;\n\n const scopeInfo: ScopeInfo = {\n id: newScopeId,\n parentId: this.currentScope,\n depth: this.currentScope !== 0 ? this.scopeStack.length + 1 : 0,\n };\n\n this.scopeInfo.set(newScopeId, scopeInfo);\n\n // Push current scope to stack\n this.scopeStack.push(this.currentScope);\n\n this.currentScope = newScopeId;\n return newScopeId;\n }\n\n /**\n * Exit the current scope and return to parent (with aggressive cleanup)\n */\n exitScope(): void {\n if (this.currentScope === 0) {\n return;\n }\n\n // Remove all variables from the exiting scope immediately\n for (const [varName, variables] of this.scopedVariables.entries()) {\n // Filter out variables from the current scope\n // TODO: there is definitely an O(1) solution here rather than iterating over each entire list\n const filteredVars = variables.filter(\n (variable) => variable.scopeId !== this.currentScope\n );\n\n if (filteredVars.length === 0) {\n // Remove empty variable name entries\n this.scopedVariables.delete(varName);\n } else {\n this.scopedVariables.set(varName, filteredVars);\n }\n }\n\n // Get parent scope from the scope info before removing it\n const parentId = this.scopeInfo.get(this.currentScope)?.parentId || 0;\n\n // Remove scope info for the exiting scope\n this.scopeInfo.delete(this.currentScope);\n\n // Update current scope to parent\n this.currentScope = parentId;\n\n // Pop from stack if there are items\n if (this.scopeStack.length > 0) {\n this.scopeStack.pop();\n }\n }\n\n /* =============================== */\n /* Variable Tracking Methods */\n /* =============================== */\n\n /**\n * Track a variable assignment in the current scope\n */\n trackVariable(\n aliasName: string,\n canonicalName: string,\n isTranslationFunction: boolean,\n type: VariableType,\n identifier: number\n ): void {\n const scopedVar: ScopedVariable = {\n scopeId: this.currentScope,\n canonicalName,\n aliasName,\n isTranslationFunction,\n type,\n identifier,\n };\n\n const existingVars = this.scopedVariables.get(aliasName) || [];\n existingVars.push(scopedVar);\n this.scopedVariables.set(aliasName, existingVars);\n }\n\n /**\n * Track a translation function variable\n */\n trackTranslationVariable(\n aliasName: string,\n canonicalName: GT_ALL_FUNCTIONS,\n identifier: number\n ): void {\n this.trackVariable(\n aliasName,\n canonicalName,\n true,\n 'generaltranslation',\n identifier\n );\n }\n\n /**\n * Track a translation callback function variable\n * const useGT_callback = useGT()\n * @param aliasName - The alias name of callback variable\n * @param canonicalName - The canonical name of the callback function\n * @param identifier - The identifier of the callback function\n * TODO: canonicalName might have to be shifted to the name of the RValue eg useGT in t = useGT() so you can properly map back to the original function\n */\n trackTranslationCallbackVariable(\n aliasName: string,\n canonicalName: GT_CALLBACK_FUNCTIONS,\n identifier: number\n ): void {\n this.trackVariable(\n aliasName,\n canonicalName,\n true,\n 'generaltranslation',\n identifier\n );\n }\n\n /**\n * Track react variable\n */\n trackReactVariable(\n variableName: string,\n assignedValue: string,\n identifier: number\n ): void {\n this.trackVariable(variableName, assignedValue, false, 'react', identifier);\n }\n\n /**\n * Track a non-translation variable (convenience method)\n */\n trackRegularVariable(variableName: string, assignedValue: string): void {\n this.trackVariable(variableName, assignedValue, false, 'other', 0); // 0 because we don't care about the identifier\n }\n\n /* =============================== */\n /* Variable Retrieval Methods */\n /* =============================== */\n\n /**\n * Find if a variable is accessible in the current scope\n */\n getVariable(variableName: string): ScopedVariable | undefined {\n const variables = this.scopedVariables.get(variableName);\n if (variables && variables.length > 0) {\n // Return the last (most recent) variable - handles shadowing\n return variables[variables.length - 1];\n }\n return undefined;\n }\n\n /**\n * Get the translation variable info if it exists in current scope\n */\n getTranslationVariable(variableName: string): ScopedGTFunction | undefined {\n const variable = this.getVariable(variableName);\n if (!variable) {\n return undefined;\n }\n\n // Check if the variable is a translation function\n if (!this.isScopedGTFunction(variable)) {\n return undefined;\n }\n return variable;\n }\n\n private isScopedGTFunction(\n variable: ScopedVariable\n ): variable is ScopedGTFunction {\n return variable.type === 'generaltranslation';\n }\n\n /* =============================== */\n /* Namespace Import Methods */\n /* =============================== */\n\n /**\n * Add a namespace import (e.g., GT from 'gt-next')\n */\n addNamespaceImport(name: string): void {\n this.namespaceImports.add(name);\n }\n\n /**\n * Check if a namespace import exists\n */\n hasNamespaceImport(name: string): boolean {\n return this.namespaceImports.has(name);\n }\n\n /* =============================== */\n /* Debugging Methods */\n /* =============================== */\n\n /**\n * Get scope info for debugging\n */\n getScopeInfo(scopeId: number): ScopeInfo | undefined {\n return this.scopeInfo.get(scopeId) || undefined;\n }\n\n /**\n * Helper convert to string\n */\n serialize(): SerializedScopeTracker {\n return {\n nextScopeId: this.nextScopeId,\n currentScope: this.currentScope,\n scopeStack: this.scopeStack,\n scopeInfo: Object.fromEntries(this.scopeInfo),\n scopedVariables: Object.fromEntries(this.scopedVariables),\n namespaceImports: Array.from(this.namespaceImports),\n };\n }\n\n /**\n * Helper to repopulate\n */\n unserialize(input: SerializedScopeTracker): void {\n this.nextScopeId = input.nextScopeId;\n this.currentScope = input.currentScope;\n this.scopeStack = input.scopeStack;\n this.scopeInfo = new Map(\n Object.entries(input.scopeInfo).map(([key, value]) => [\n Number(key),\n value as ScopeInfo,\n ])\n );\n this.scopedVariables = new Map(Object.entries(input.scopedVariables));\n this.namespaceImports = new Set(input.namespaceImports);\n }\n}\n"],"mappings":"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"}