@wyw-in-js/transform 2.0.0-alpha.0 → 2.0.0-alpha.1

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 (270) hide show
  1. package/esm/cache.js +7 -0
  2. package/esm/cache.js.map +1 -1
  3. package/esm/debug/fileReporter.js +35 -1
  4. package/esm/debug/fileReporter.js.map +1 -1
  5. package/esm/eval/broker.js +230 -89
  6. package/esm/eval/broker.js.map +1 -1
  7. package/esm/eval/protocol.js.map +1 -1
  8. package/esm/eval/runner.js +143 -24
  9. package/esm/eval/runner.js.map +1 -1
  10. package/esm/module.js +70 -43
  11. package/esm/module.js.map +1 -1
  12. package/esm/transform/Entrypoint.types.js.map +1 -1
  13. package/esm/transform/generators/processEntrypoint.js +35 -20
  14. package/esm/transform/generators/processEntrypoint.js.map +1 -1
  15. package/esm/transform/generators/resolveImports.js +48 -2
  16. package/esm/transform/generators/resolveImports.js.map +1 -1
  17. package/esm/transform/generators/resolveStaticOxcValues/cache.js +182 -0
  18. package/esm/transform/generators/resolveStaticOxcValues/cache.js.map +1 -0
  19. package/esm/transform/generators/resolveStaticOxcValues/candidateResolver.js +146 -0
  20. package/esm/transform/generators/resolveStaticOxcValues/candidateResolver.js.map +1 -0
  21. package/esm/transform/generators/resolveStaticOxcValues/dependencies.js +33 -0
  22. package/esm/transform/generators/resolveStaticOxcValues/dependencies.js.map +1 -0
  23. package/esm/transform/generators/resolveStaticOxcValues/environment.js +29 -0
  24. package/esm/transform/generators/resolveStaticOxcValues/environment.js.map +1 -0
  25. package/esm/transform/generators/resolveStaticOxcValues/exportResolver.js +351 -0
  26. package/esm/transform/generators/resolveStaticOxcValues/exportResolver.js.map +1 -0
  27. package/esm/transform/generators/resolveStaticOxcValues/exportTargets.js +253 -0
  28. package/esm/transform/generators/resolveStaticOxcValues/exportTargets.js.map +1 -0
  29. package/esm/transform/generators/resolveStaticOxcValues/objectAssign.js +310 -0
  30. package/esm/transform/generators/resolveStaticOxcValues/objectAssign.js.map +1 -0
  31. package/esm/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js +74 -0
  32. package/esm/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js.map +1 -0
  33. package/esm/transform/generators/resolveStaticOxcValues/opaqueRuntime.js +229 -0
  34. package/esm/transform/generators/resolveStaticOxcValues/opaqueRuntime.js.map +1 -0
  35. package/esm/transform/generators/resolveStaticOxcValues/processorStaticExport.js +172 -0
  36. package/esm/transform/generators/resolveStaticOxcValues/processorStaticExport.js.map +1 -0
  37. package/esm/transform/generators/resolveStaticOxcValues/processorStaticModel.js +476 -0
  38. package/esm/transform/generators/resolveStaticOxcValues/processorStaticModel.js.map +1 -0
  39. package/esm/transform/generators/resolveStaticOxcValues/processorTarget.js +55 -0
  40. package/esm/transform/generators/resolveStaticOxcValues/processorTarget.js.map +1 -0
  41. package/esm/transform/generators/resolveStaticOxcValues/programAnalysis.js +123 -0
  42. package/esm/transform/generators/resolveStaticOxcValues/programAnalysis.js.map +1 -0
  43. package/esm/transform/generators/resolveStaticOxcValues/prune.js +186 -0
  44. package/esm/transform/generators/resolveStaticOxcValues/prune.js.map +1 -0
  45. package/esm/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js +183 -0
  46. package/esm/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js.map +1 -0
  47. package/esm/transform/generators/resolveStaticOxcValues/staticExpression.js +298 -0
  48. package/esm/transform/generators/resolveStaticOxcValues/staticExpression.js.map +1 -0
  49. package/esm/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js +298 -0
  50. package/esm/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js.map +1 -0
  51. package/esm/transform/generators/resolveStaticOxcValues/types.js +3 -0
  52. package/esm/transform/generators/resolveStaticOxcValues/types.js.map +1 -0
  53. package/esm/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js +59 -0
  54. package/esm/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js.map +1 -0
  55. package/esm/transform/generators/resolveStaticOxcValues.js +1 -2910
  56. package/esm/transform/generators/resolveStaticOxcValues.js.map +1 -1
  57. package/esm/transform/generators/transform.js +57 -45
  58. package/esm/transform/generators/transform.js.map +1 -1
  59. package/esm/transform/helpers/loadWywOptions.js +33 -4
  60. package/esm/transform/helpers/loadWywOptions.js.map +1 -1
  61. package/esm/transform.js +3 -1
  62. package/esm/transform.js.map +1 -1
  63. package/esm/utils/EventEmitter.js +42 -9
  64. package/esm/utils/EventEmitter.js.map +1 -1
  65. package/esm/utils/applyOxcProcessors/applyOxcProcessors.js +160 -0
  66. package/esm/utils/applyOxcProcessors/applyOxcProcessors.js.map +1 -0
  67. package/esm/utils/applyOxcProcessors/cleanupBindings.js +157 -0
  68. package/esm/utils/applyOxcProcessors/cleanupBindings.js.map +1 -0
  69. package/esm/utils/applyOxcProcessors/cleanupRemovals.js +431 -0
  70. package/esm/utils/applyOxcProcessors/cleanupRemovals.js.map +1 -0
  71. package/esm/utils/applyOxcProcessors/displayName.js +93 -0
  72. package/esm/utils/applyOxcProcessors/displayName.js.map +1 -0
  73. package/esm/utils/applyOxcProcessors/expressionValues.js +152 -0
  74. package/esm/utils/applyOxcProcessors/expressionValues.js.map +1 -0
  75. package/esm/utils/applyOxcProcessors/processorFactory.js +62 -0
  76. package/esm/utils/applyOxcProcessors/processorFactory.js.map +1 -0
  77. package/esm/utils/applyOxcProcessors/processorUsages.js +143 -0
  78. package/esm/utils/applyOxcProcessors/processorUsages.js.map +1 -0
  79. package/esm/utils/applyOxcProcessors/sameFileStaticValues.js +207 -0
  80. package/esm/utils/applyOxcProcessors/sameFileStaticValues.js.map +1 -0
  81. package/esm/utils/applyOxcProcessors/shared.js +29 -0
  82. package/esm/utils/applyOxcProcessors/shared.js.map +1 -0
  83. package/esm/utils/applyOxcProcessors/types.js +2 -0
  84. package/esm/utils/applyOxcProcessors/types.js.map +1 -0
  85. package/esm/utils/applyOxcProcessors.js +1 -1216
  86. package/esm/utils/applyOxcProcessors.js.map +1 -1
  87. package/esm/utils/collectOxcRuntime/normalizeRuntimeCode.js +157 -0
  88. package/esm/utils/collectOxcRuntime/normalizeRuntimeCode.js.map +1 -0
  89. package/esm/utils/collectOxcRuntime/sourceMap.js +36 -0
  90. package/esm/utils/collectOxcRuntime/sourceMap.js.map +1 -0
  91. package/esm/utils/collectOxcRuntime/types.js +2 -0
  92. package/esm/utils/collectOxcRuntime/types.js.map +1 -0
  93. package/esm/utils/collectOxcRuntime.js +5 -193
  94. package/esm/utils/collectOxcRuntime.js.map +1 -1
  95. package/esm/utils/collectOxcTemplateDependencies/expressionExtraction.js +496 -0
  96. package/esm/utils/collectOxcTemplateDependencies/expressionExtraction.js.map +1 -0
  97. package/esm/utils/collectOxcTemplateDependencies/expressionReplacements.js +113 -0
  98. package/esm/utils/collectOxcTemplateDependencies/expressionReplacements.js.map +1 -0
  99. package/esm/utils/collectOxcTemplateDependencies/scopeAnalysis.js +387 -0
  100. package/esm/utils/collectOxcTemplateDependencies/scopeAnalysis.js.map +1 -0
  101. package/esm/utils/collectOxcTemplateDependencies/staticBindings.js +17 -0
  102. package/esm/utils/collectOxcTemplateDependencies/staticBindings.js.map +1 -0
  103. package/esm/utils/collectOxcTemplateDependencies/staticEvaluator.js +540 -0
  104. package/esm/utils/collectOxcTemplateDependencies/staticEvaluator.js.map +1 -0
  105. package/esm/utils/collectOxcTemplateDependencies/types.js +2 -0
  106. package/esm/utils/collectOxcTemplateDependencies/types.js.map +1 -0
  107. package/esm/utils/collectOxcTemplateDependencies.js +3 -1397
  108. package/esm/utils/collectOxcTemplateDependencies.js.map +1 -1
  109. package/esm/utils/nativeResolver.js +93 -0
  110. package/esm/utils/nativeResolver.js.map +1 -0
  111. package/esm/utils/oxc/ast.js +28 -0
  112. package/esm/utils/oxc/ast.js.map +1 -0
  113. package/esm/utils/oxc/parse.js +3 -0
  114. package/esm/utils/oxc/parse.js.map +1 -0
  115. package/esm/utils/oxc/replacements.js +14 -0
  116. package/esm/utils/oxc/replacements.js.map +1 -0
  117. package/esm/utils/oxc/sourceLocations.js +59 -0
  118. package/esm/utils/oxc/sourceLocations.js.map +1 -0
  119. package/esm/utils/oxcPreevalStage/evalStrategy.js +3 -0
  120. package/esm/utils/oxcPreevalStage/evalStrategy.js.map +1 -0
  121. package/esm/utils/oxcPreevalStage/prepareCode.js +21 -0
  122. package/esm/utils/oxcPreevalStage/prepareCode.js.map +1 -0
  123. package/esm/utils/oxcPreevalStage/prevalExport.js +23 -0
  124. package/esm/utils/oxcPreevalStage/prevalExport.js.map +1 -0
  125. package/esm/utils/oxcPreevalStage/processors.js +17 -0
  126. package/esm/utils/oxcPreevalStage/processors.js.map +1 -0
  127. package/esm/utils/oxcPreevalStage/staticOverlay.js +18 -0
  128. package/esm/utils/oxcPreevalStage/staticOverlay.js.map +1 -0
  129. package/esm/utils/oxcPreevalStage/types.js +2 -0
  130. package/esm/utils/oxcPreevalStage/types.js.map +1 -0
  131. package/esm/utils/oxcPreevalStage.js +17 -73
  132. package/esm/utils/oxcPreevalStage.js.map +1 -1
  133. package/esm/utils/oxcPreevalTransforms.js +12 -1
  134. package/esm/utils/oxcPreevalTransforms.js.map +1 -1
  135. package/esm/utils/processorStaticSemantics.js +157 -0
  136. package/esm/utils/processorStaticSemantics.js.map +1 -0
  137. package/esm/utils/resolveWithConditions.js +3 -3
  138. package/esm/utils/resolveWithConditions.js.map +1 -1
  139. package/package.json +4 -3
  140. package/types/cache.js +8 -0
  141. package/types/debug/fileReporter.js +46 -1
  142. package/types/eval/broker.d.ts +6 -2
  143. package/types/eval/broker.js +244 -95
  144. package/types/eval/protocol.d.ts +15 -1
  145. package/types/module.d.ts +4 -1
  146. package/types/module.js +97 -48
  147. package/types/transform/Entrypoint.types.d.ts +3 -0
  148. package/types/transform/generators/resolveImports.d.ts +3 -1
  149. package/types/transform/generators/resolveImports.js +49 -2
  150. package/types/transform/generators/resolveStaticOxcValues/cache.d.ts +25 -0
  151. package/types/transform/generators/resolveStaticOxcValues/cache.js +182 -0
  152. package/types/transform/generators/resolveStaticOxcValues/candidateResolver.d.ts +5 -0
  153. package/types/transform/generators/resolveStaticOxcValues/candidateResolver.js +149 -0
  154. package/types/transform/generators/resolveStaticOxcValues/dependencies.d.ts +6 -0
  155. package/types/transform/generators/resolveStaticOxcValues/dependencies.js +37 -0
  156. package/types/transform/generators/resolveStaticOxcValues/environment.d.ts +12 -0
  157. package/types/transform/generators/resolveStaticOxcValues/environment.js +32 -0
  158. package/types/transform/generators/resolveStaticOxcValues/exportResolver.d.ts +4 -0
  159. package/types/transform/generators/resolveStaticOxcValues/exportResolver.js +358 -0
  160. package/types/transform/generators/resolveStaticOxcValues/exportTargets.d.ts +20 -0
  161. package/types/transform/generators/resolveStaticOxcValues/exportTargets.js +285 -0
  162. package/types/transform/generators/resolveStaticOxcValues/objectAssign.d.ts +41 -0
  163. package/types/transform/generators/resolveStaticOxcValues/objectAssign.js +352 -0
  164. package/types/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.d.ts +6 -0
  165. package/types/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js +88 -0
  166. package/types/transform/generators/resolveStaticOxcValues/opaqueRuntime.d.ts +13 -0
  167. package/types/transform/generators/resolveStaticOxcValues/opaqueRuntime.js +263 -0
  168. package/types/transform/generators/resolveStaticOxcValues/processorStaticExport.d.ts +4 -0
  169. package/types/transform/generators/resolveStaticOxcValues/processorStaticExport.js +191 -0
  170. package/types/transform/generators/resolveStaticOxcValues/processorStaticModel.d.ts +40 -0
  171. package/types/transform/generators/resolveStaticOxcValues/processorStaticModel.js +516 -0
  172. package/types/transform/generators/resolveStaticOxcValues/processorTarget.d.ts +5 -0
  173. package/types/transform/generators/resolveStaticOxcValues/processorTarget.js +62 -0
  174. package/types/transform/generators/resolveStaticOxcValues/programAnalysis.d.ts +11 -0
  175. package/types/transform/generators/resolveStaticOxcValues/programAnalysis.js +133 -0
  176. package/types/transform/generators/resolveStaticOxcValues/prune.d.ts +15 -0
  177. package/types/transform/generators/resolveStaticOxcValues/prune.js +220 -0
  178. package/types/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.d.ts +2 -0
  179. package/types/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js +197 -0
  180. package/types/transform/generators/resolveStaticOxcValues/staticExpression.d.ts +25 -0
  181. package/types/transform/generators/resolveStaticOxcValues/staticExpression.js +391 -0
  182. package/types/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.d.ts +14 -0
  183. package/types/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js +304 -0
  184. package/types/transform/generators/resolveStaticOxcValues/types.d.ts +99 -0
  185. package/types/transform/generators/resolveStaticOxcValues/types.js +2 -0
  186. package/types/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.d.ts +7 -0
  187. package/types/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js +64 -0
  188. package/types/transform/generators/resolveStaticOxcValues.d.ts +1 -2
  189. package/types/transform/generators/resolveStaticOxcValues.js +1 -3235
  190. package/types/transform/generators/transform.js +63 -49
  191. package/types/transform/helpers/loadWywOptions.js +23 -3
  192. package/types/transform.js +3 -1
  193. package/types/utils/EventEmitter.d.ts +16 -1
  194. package/types/utils/EventEmitter.js +44 -9
  195. package/types/utils/applyOxcProcessors/applyOxcProcessors.d.ts +8 -0
  196. package/types/utils/applyOxcProcessors/applyOxcProcessors.js +167 -0
  197. package/types/utils/applyOxcProcessors/cleanupBindings.d.ts +12 -0
  198. package/types/utils/applyOxcProcessors/cleanupBindings.js +189 -0
  199. package/types/utils/applyOxcProcessors/cleanupRemovals.d.ts +16 -0
  200. package/types/utils/applyOxcProcessors/cleanupRemovals.js +482 -0
  201. package/types/utils/applyOxcProcessors/displayName.d.ts +9 -0
  202. package/types/utils/applyOxcProcessors/displayName.js +113 -0
  203. package/types/utils/applyOxcProcessors/expressionValues.d.ts +11 -0
  204. package/types/utils/applyOxcProcessors/expressionValues.js +170 -0
  205. package/types/utils/applyOxcProcessors/processorFactory.d.ts +7 -0
  206. package/types/utils/applyOxcProcessors/processorFactory.js +70 -0
  207. package/types/utils/applyOxcProcessors/processorUsages.d.ts +16 -0
  208. package/types/utils/applyOxcProcessors/processorUsages.js +163 -0
  209. package/types/utils/applyOxcProcessors/sameFileStaticValues.d.ts +23 -0
  210. package/types/utils/applyOxcProcessors/sameFileStaticValues.js +211 -0
  211. package/types/utils/applyOxcProcessors/shared.d.ts +10 -0
  212. package/types/utils/applyOxcProcessors/shared.js +37 -0
  213. package/types/utils/applyOxcProcessors/types.d.ts +88 -0
  214. package/types/utils/applyOxcProcessors/types.js +1 -0
  215. package/types/utils/applyOxcProcessors.d.ts +1 -16
  216. package/types/utils/applyOxcProcessors.js +1 -1391
  217. package/types/utils/collectOxcRuntime/normalizeRuntimeCode.d.ts +1 -0
  218. package/types/utils/collectOxcRuntime/normalizeRuntimeCode.js +185 -0
  219. package/types/utils/collectOxcRuntime/sourceMap.d.ts +2 -0
  220. package/types/utils/collectOxcRuntime/sourceMap.js +37 -0
  221. package/types/utils/collectOxcRuntime/types.d.ts +16 -0
  222. package/types/utils/collectOxcRuntime/types.js +1 -0
  223. package/types/utils/collectOxcRuntime.d.ts +2 -12
  224. package/types/utils/collectOxcRuntime.js +5 -224
  225. package/types/utils/collectOxcTemplateDependencies/expressionExtraction.d.ts +6 -0
  226. package/types/utils/collectOxcTemplateDependencies/expressionExtraction.js +550 -0
  227. package/types/utils/collectOxcTemplateDependencies/expressionReplacements.d.ts +11 -0
  228. package/types/utils/collectOxcTemplateDependencies/expressionReplacements.js +131 -0
  229. package/types/utils/collectOxcTemplateDependencies/scopeAnalysis.d.ts +20 -0
  230. package/types/utils/collectOxcTemplateDependencies/scopeAnalysis.js +434 -0
  231. package/types/utils/collectOxcTemplateDependencies/staticBindings.d.ts +7 -0
  232. package/types/utils/collectOxcTemplateDependencies/staticBindings.js +13 -0
  233. package/types/utils/collectOxcTemplateDependencies/staticEvaluator.d.ts +13 -0
  234. package/types/utils/collectOxcTemplateDependencies/staticEvaluator.js +626 -0
  235. package/types/utils/collectOxcTemplateDependencies/types.d.ts +116 -0
  236. package/types/utils/collectOxcTemplateDependencies/types.js +1 -0
  237. package/types/utils/collectOxcTemplateDependencies.d.ts +4 -38
  238. package/types/utils/collectOxcTemplateDependencies.js +3 -1580
  239. package/types/utils/nativeResolver.d.ts +13 -0
  240. package/types/utils/nativeResolver.js +91 -0
  241. package/types/utils/oxc/ast.d.ts +4 -0
  242. package/types/utils/oxc/ast.js +37 -0
  243. package/types/utils/oxc/parse.d.ts +3 -0
  244. package/types/utils/oxc/parse.js +2 -0
  245. package/types/utils/oxc/replacements.d.ts +12 -0
  246. package/types/utils/oxc/replacements.js +18 -0
  247. package/types/utils/oxc/sourceLocations.d.ts +5 -0
  248. package/types/utils/oxc/sourceLocations.js +63 -0
  249. package/types/utils/oxcPreevalStage/evalStrategy.d.ts +3 -0
  250. package/types/utils/oxcPreevalStage/evalStrategy.js +2 -0
  251. package/types/utils/oxcPreevalStage/prepareCode.d.ts +3 -0
  252. package/types/utils/oxcPreevalStage/prepareCode.js +20 -0
  253. package/types/utils/oxcPreevalStage/prevalExport.d.ts +1 -0
  254. package/types/utils/oxcPreevalStage/prevalExport.js +22 -0
  255. package/types/utils/oxcPreevalStage/processors.d.ts +10 -0
  256. package/types/utils/oxcPreevalStage/processors.js +16 -0
  257. package/types/utils/oxcPreevalStage/staticOverlay.d.ts +3 -0
  258. package/types/utils/oxcPreevalStage/staticOverlay.js +23 -0
  259. package/types/utils/oxcPreevalStage/types.d.ts +22 -0
  260. package/types/utils/oxcPreevalStage/types.js +1 -0
  261. package/types/utils/oxcPreevalStage.d.ts +2 -18
  262. package/types/utils/oxcPreevalStage.js +17 -79
  263. package/types/utils/oxcPreevalTransforms.js +14 -1
  264. package/types/utils/processorStaticSemantics.d.ts +13 -0
  265. package/types/utils/processorStaticSemantics.js +191 -0
  266. package/types/utils/resolveWithConditions.js +3 -3
  267. package/esm/eval/resolverStrategy.js +0 -51
  268. package/esm/eval/resolverStrategy.js.map +0 -1
  269. package/types/eval/resolverStrategy.d.ts +0 -13
  270. package/types/eval/resolverStrategy.js +0 -46
@@ -0,0 +1,298 @@
1
+ import { createOxcStaticCallableValue } from "../../../utils/collectOxcTemplateDependencies.js";
2
+ import { getOxcNodeChildren } from "../../../utils/oxc/ast.js";
3
+ import { parseProgram } from "./environment.js";
4
+ export const moduleExportName = (node) => node.type === "Literal" ? String(node.value) : node.name;
5
+ export const unwrapExpression = (expr) => {
6
+ let current = expr;
7
+ for (;;) {
8
+ if (current.type === "TSAsExpression" || current.type === "TSSatisfiesExpression" || current.type === "TSNonNullExpression" || current.type === "TSInstantiationExpression" || current.type === "TSTypeAssertion" || current.type === "ParenthesizedExpression") {
9
+ current = current.expression;
10
+ continue;
11
+ }
12
+ return current;
13
+ }
14
+ };
15
+ export const isProcessEnvMember = (node) => {
16
+ if (node.type !== "MemberExpression" || node.computed) {
17
+ return false;
18
+ }
19
+ if (node.property.type !== "Identifier" || node.property.name !== "env") {
20
+ return false;
21
+ }
22
+ return node.object.type === "Identifier" && node.object.name === "process";
23
+ };
24
+ export const isSafeLiteral = (node) => {
25
+ if (node.type !== "Literal") {
26
+ return false;
27
+ }
28
+ const { value } = node;
29
+ return value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean";
30
+ };
31
+ export const isSafeStaticExpression = (expr, options = {}) => {
32
+ const unwrapped = unwrapExpression(expr);
33
+ if (isSafeLiteral(unwrapped)) {
34
+ return true;
35
+ }
36
+ if (unwrapped.type === "Identifier") {
37
+ return true;
38
+ }
39
+ if (unwrapped.type === "TemplateLiteral") {
40
+ return unwrapped.expressions.every((item) => isSafeStaticExpression(item, options));
41
+ }
42
+ if (unwrapped.type === "UnaryExpression") {
43
+ return isSafeStaticExpression(unwrapped.argument, options);
44
+ }
45
+ if (unwrapped.type === "BinaryExpression" || unwrapped.type === "LogicalExpression") {
46
+ return isSafeStaticExpression(unwrapped.left, options) && isSafeStaticExpression(unwrapped.right, options);
47
+ }
48
+ if (unwrapped.type === "ConditionalExpression") {
49
+ return isSafeStaticExpression(unwrapped.test, options) && isSafeStaticExpression(unwrapped.consequent, options) && isSafeStaticExpression(unwrapped.alternate, options);
50
+ }
51
+ if (unwrapped.type === "MemberExpression") {
52
+ return isSafeStaticExpression(unwrapped.object, options) && (unwrapped.computed ? isSafeStaticExpression(unwrapped.property, options) : unwrapped.property.type === "Identifier");
53
+ }
54
+ if (options.allowMetadataCalls && unwrapped.type === "CallExpression") {
55
+ return unwrapped.callee.type === "Identifier" && unwrapped.arguments.length === 0;
56
+ }
57
+ if (unwrapped.type === "CallExpression" && options.staticHelperLocals && unwrapped.callee.type === "Identifier" && options.staticHelperLocals.has(unwrapped.callee.name)) {
58
+ return unwrapped.arguments.every((argument) => argument.type === "SpreadElement" ? isSafeStaticExpression(argument.argument, options) : isSafeStaticExpression(argument, options));
59
+ }
60
+ if (options.allowMetadataCalls && (unwrapped.type === "ArrowFunctionExpression" || unwrapped.type === "FunctionExpression")) {
61
+ return !unwrapped.async && unwrapped.params.length === 0 && !!unwrapped.body && isSafeFunctionBodyExpression(unwrapped.body, options);
62
+ }
63
+ if (unwrapped.type === "ArrayExpression") {
64
+ return unwrapped.elements.every((item) => {
65
+ if (!item) {
66
+ return false;
67
+ }
68
+ return item.type === "SpreadElement" ? isSafeStaticExpression(item.argument, options) : isSafeStaticExpression(item, options);
69
+ });
70
+ }
71
+ if (unwrapped.type === "ObjectExpression") {
72
+ return unwrapped.properties.every((property) => {
73
+ if (property.type === "SpreadElement") {
74
+ return isSafeStaticExpression(property.argument);
75
+ }
76
+ const propertyNode = property;
77
+ if (propertyNode.method) {
78
+ return false;
79
+ }
80
+ // Computed keys are admissible as long as the key expression
81
+ // itself is safe-static — the downstream evaluator already folds
82
+ // them against the env. Common shape: `[\`${imp} &\`]: { ... }`.
83
+ if (propertyNode.computed && (!propertyNode.key || typeof propertyNode.key !== "object" || !isSafeStaticExpression(propertyNode.key, options))) {
84
+ return false;
85
+ }
86
+ return propertyNode.value && typeof propertyNode.value === "object" && isSafeStaticExpression(propertyNode.value, options);
87
+ });
88
+ }
89
+ return false;
90
+ };
91
+ export const isTypeOnlyImport = (statement) => {
92
+ if (statement.importKind === "type") {
93
+ return true;
94
+ }
95
+ return statement.specifiers.every((specifier) => specifier.type === "ImportSpecifier" && specifier.importKind === "type");
96
+ };
97
+ export const getImportBinding = (statement, specifier, options = {}) => {
98
+ const local = specifier.local?.name;
99
+ if (!local) {
100
+ return null;
101
+ }
102
+ if (specifier.type === "ImportNamespaceSpecifier") {
103
+ return options.includeNamespace ? {
104
+ imported: "*",
105
+ local,
106
+ source: statement.source.value
107
+ } : null;
108
+ }
109
+ if (specifier.type === "ImportDefaultSpecifier") {
110
+ return {
111
+ imported: "default",
112
+ local,
113
+ source: statement.source.value
114
+ };
115
+ }
116
+ if (specifier.type !== "ImportSpecifier") {
117
+ return null;
118
+ }
119
+ if (statement.importKind === "type" || specifier.importKind === "type") {
120
+ return null;
121
+ }
122
+ return {
123
+ imported: moduleExportName(specifier.imported),
124
+ local,
125
+ source: statement.source.value
126
+ };
127
+ };
128
+ export const collectImportBindings = (program, options = {}) => {
129
+ const result = new Map();
130
+ program.body.forEach((statement) => {
131
+ if (statement.type !== "ImportDeclaration" || isTypeOnlyImport(statement)) {
132
+ return;
133
+ }
134
+ statement.specifiers.forEach((specifier) => {
135
+ const binding = getImportBinding(statement, specifier, options);
136
+ if (binding) {
137
+ result.set(binding.local, binding);
138
+ }
139
+ });
140
+ });
141
+ return result;
142
+ };
143
+ export const parseStaticExpressionSource = (source, filename) => {
144
+ try {
145
+ const program = parseProgram(`const __wyw_static_value = ${source};`, filename);
146
+ const declaration = program.body[0];
147
+ if (declaration?.type !== "VariableDeclaration") {
148
+ return null;
149
+ }
150
+ const [declarator] = declaration.declarations;
151
+ return declarator?.init ?? null;
152
+ } catch {
153
+ return null;
154
+ }
155
+ };
156
+ export const isRuntimeCallbackExpression = (expression) => {
157
+ const unwrapped = expression ? unwrapExpression(expression) : null;
158
+ return unwrapped?.type === "ArrowFunctionExpression" || unwrapped?.type === "FunctionExpression";
159
+ };
160
+ export const runtimeCallbackPlaceholder = () => undefined;
161
+ export const isIdentifierBindingPosition = (node, parent) => {
162
+ if (node.type !== "Identifier" || !parent) {
163
+ return false;
164
+ }
165
+ if (parent.type === "VariableDeclarator" && parent.id === node || parent.type === "FunctionDeclaration" && parent.id === node || parent.type === "FunctionExpression" && parent.id === node || parent.type === "ClassDeclaration" && parent.id === node || parent.type === "ClassExpression" && parent.id === node) {
166
+ return true;
167
+ }
168
+ if ((parent.type === "ArrowFunctionExpression" || parent.type === "FunctionDeclaration" || parent.type === "FunctionExpression") && parent.params.some((param) => param === node)) {
169
+ return true;
170
+ }
171
+ return parent.type === "ImportSpecifier" && parent.local === node || parent.type === "ImportDefaultSpecifier" && parent.local === node || parent.type === "ImportNamespaceSpecifier" && parent.local === node;
172
+ };
173
+ export const isPropertyKeyOnlyIdentifier = (node, parent) => node.type === "Identifier" && !!parent && (parent.type === "MemberExpression" && parent.property === node && !parent.computed || parent.type === "Property" && parent.key === node && !parent.computed && !parent.shorthand);
174
+ export const expressionUsesNameOnlyAsZeroArgCalls = (expression, name) => {
175
+ let seen = false;
176
+ let valid = true;
177
+ const walk = (node, parent) => {
178
+ if (!valid) {
179
+ return;
180
+ }
181
+ if (node.type === "Identifier" && node.name === name && !isIdentifierBindingPosition(node, parent) && !isPropertyKeyOnlyIdentifier(node, parent)) {
182
+ if (parent?.type === "CallExpression" && parent.callee === node && parent.arguments.length === 0) {
183
+ seen = true;
184
+ } else {
185
+ valid = false;
186
+ return;
187
+ }
188
+ }
189
+ getOxcNodeChildren(node).forEach((child) => walk(child, node));
190
+ };
191
+ walk(expression, null);
192
+ return seen && valid;
193
+ };
194
+ export const bindStaticResolvedValue = (env, expression, local, resolved, options = {}) => {
195
+ if (resolved.callable === "zero-arg") {
196
+ if (!expressionUsesNameOnlyAsZeroArgCalls(expression, local)) {
197
+ return false;
198
+ }
199
+ env.set(local, createOxcStaticCallableValue(resolved.value));
200
+ return true;
201
+ }
202
+ env.set(local, options.wrapNonCallable ? createOxcStaticCallableValue(resolved.value) : resolved.value);
203
+ return true;
204
+ };
205
+ export const isSafeFunctionBodyExpression = (body, options) => {
206
+ if (body.type !== "BlockStatement") {
207
+ return isSafeStaticExpression(body, options);
208
+ }
209
+ return body.body.every((statement) => {
210
+ if (statement.type === "VariableDeclaration") {
211
+ return statement.kind === "const" && statement.declarations.every((declarator) => declarator.init && declarator.id.type === "Identifier" && isSafeStaticExpression(declarator.init, options));
212
+ }
213
+ return statement.type === "ReturnStatement" && !!statement.argument && isSafeStaticExpression(statement.argument, options);
214
+ });
215
+ };
216
+ export const collectStaticFunctionBodyReferences = (body, references, options) => {
217
+ if (body.type !== "BlockStatement") {
218
+ return collectStaticExpressionReferences(body, references, options);
219
+ }
220
+ return body.body.every((statement) => {
221
+ if (statement.type === "VariableDeclaration") {
222
+ return statement.kind === "const" && statement.declarations.every((declarator) => declarator.init && declarator.id.type === "Identifier" && collectStaticExpressionReferences(declarator.init, references, options));
223
+ }
224
+ return statement.type === "ReturnStatement" && !!statement.argument && collectStaticExpressionReferences(statement.argument, references, options);
225
+ });
226
+ };
227
+ export const collectStaticExpressionReferences = (expr, references, options = {}) => {
228
+ const unwrapped = unwrapExpression(expr);
229
+ if (isSafeLiteral(unwrapped)) {
230
+ return true;
231
+ }
232
+ if (unwrapped.type === "Identifier") {
233
+ references.add(unwrapped.name);
234
+ return true;
235
+ }
236
+ if (unwrapped.type === "TemplateLiteral") {
237
+ return unwrapped.expressions.every((item) => collectStaticExpressionReferences(item, references, options));
238
+ }
239
+ if (unwrapped.type === "UnaryExpression") {
240
+ return collectStaticExpressionReferences(unwrapped.argument, references, options);
241
+ }
242
+ if (unwrapped.type === "BinaryExpression" || unwrapped.type === "LogicalExpression") {
243
+ return collectStaticExpressionReferences(unwrapped.left, references, options) && collectStaticExpressionReferences(unwrapped.right, references, options);
244
+ }
245
+ if (unwrapped.type === "ConditionalExpression") {
246
+ return collectStaticExpressionReferences(unwrapped.test, references, options) && collectStaticExpressionReferences(unwrapped.consequent, references, options) && collectStaticExpressionReferences(unwrapped.alternate, references, options);
247
+ }
248
+ if (unwrapped.type === "MemberExpression") {
249
+ if (isProcessEnvMember(unwrapped) || isProcessEnvMember(unwrapped.object)) {
250
+ // process.env / process.env.X is an opaque build-time global —
251
+ // don't treat `process` as an unresolved local reference.
252
+ return true;
253
+ }
254
+ return collectStaticExpressionReferences(unwrapped.object, references, options) && (!unwrapped.computed || collectStaticExpressionReferences(unwrapped.property, references, options));
255
+ }
256
+ if (options.allowMetadataCalls && unwrapped.type === "CallExpression") {
257
+ if (unwrapped.callee.type !== "Identifier" || unwrapped.arguments.length !== 0) {
258
+ return false;
259
+ }
260
+ references.add(unwrapped.callee.name);
261
+ return true;
262
+ }
263
+ if (unwrapped.type === "CallExpression" && options.staticHelperLocals && unwrapped.callee.type === "Identifier" && options.staticHelperLocals.has(unwrapped.callee.name)) {
264
+ references.add(unwrapped.callee.name);
265
+ return unwrapped.arguments.every((argument) => argument.type === "SpreadElement" ? collectStaticExpressionReferences(argument.argument, references, options) : collectStaticExpressionReferences(argument, references, options));
266
+ }
267
+ if (options.allowMetadataCalls && (unwrapped.type === "ArrowFunctionExpression" || unwrapped.type === "FunctionExpression")) {
268
+ if (unwrapped.async || unwrapped.params.length !== 0) {
269
+ return false;
270
+ }
271
+ return !!unwrapped.body && collectStaticFunctionBodyReferences(unwrapped.body, references, options);
272
+ }
273
+ if (unwrapped.type === "ArrayExpression") {
274
+ return unwrapped.elements.every((item) => {
275
+ if (!item) {
276
+ return false;
277
+ }
278
+ return item.type === "SpreadElement" ? collectStaticExpressionReferences(item.argument, references, options) : collectStaticExpressionReferences(item, references, options);
279
+ });
280
+ }
281
+ if (unwrapped.type === "ObjectExpression") {
282
+ return unwrapped.properties.every((property) => {
283
+ if (property.type === "SpreadElement") {
284
+ return collectStaticExpressionReferences(property.argument, references, options);
285
+ }
286
+ const propertyNode = property;
287
+ if (!propertyNode.value || typeof propertyNode.value !== "object") {
288
+ return false;
289
+ }
290
+ if (propertyNode.computed && (!propertyNode.key || typeof propertyNode.key !== "object" || !collectStaticExpressionReferences(propertyNode.key, references, options))) {
291
+ return false;
292
+ }
293
+ return collectStaticExpressionReferences(propertyNode.value, references, options);
294
+ });
295
+ }
296
+ return false;
297
+ };
298
+ //# sourceMappingURL=staticExpression.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/staticExpression.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport type {\n Expression,\n ImportDeclaration,\n ImportSpecifier,\n ModuleExportName,\n Node,\n Program,\n} from 'oxc-parser';\n\nimport { createOxcStaticCallableValue } from '../../../utils/collectOxcTemplateDependencies';\nimport { getOxcNodeChildren } from '../../../utils/oxc/ast';\nimport { parseProgram } from './environment';\nimport type {\n AnyNode,\n CollectImportBindingsOptions,\n ImportBinding,\n StaticExportResult,\n StaticExpressionOptions,\n} from './types';\n\nexport const moduleExportName = (node: ModuleExportName): string =>\n node.type === 'Literal' ? String(node.value) : node.name;\n\nexport const unwrapExpression = (expr: Node): Node => {\n let current = expr;\n\n for (;;) {\n if (\n current.type === 'TSAsExpression' ||\n current.type === 'TSSatisfiesExpression' ||\n current.type === 'TSNonNullExpression' ||\n current.type === 'TSInstantiationExpression' ||\n current.type === 'TSTypeAssertion' ||\n current.type === 'ParenthesizedExpression'\n ) {\n current = current.expression;\n continue;\n }\n\n return current;\n }\n};\n\nexport const isProcessEnvMember = (node: Node): boolean => {\n if (node.type !== 'MemberExpression' || node.computed) {\n return false;\n }\n\n if (node.property.type !== 'Identifier' || node.property.name !== 'env') {\n return false;\n }\n\n return node.object.type === 'Identifier' && node.object.name === 'process';\n};\n\nexport const isSafeLiteral = (\n node: Node\n): node is Node & {\n type: 'Literal';\n value: boolean | null | number | string;\n} => {\n if (node.type !== 'Literal') {\n return false;\n }\n\n const { value } = node as AnyNode;\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n );\n};\n\nexport const isSafeStaticExpression = (\n expr: Node,\n options: StaticExpressionOptions = {}\n): boolean => {\n const unwrapped = unwrapExpression(expr);\n\n if (isSafeLiteral(unwrapped)) {\n return true;\n }\n\n if (unwrapped.type === 'Identifier') {\n return true;\n }\n\n if (unwrapped.type === 'TemplateLiteral') {\n return unwrapped.expressions.every((item) =>\n isSafeStaticExpression(item, options)\n );\n }\n\n if (unwrapped.type === 'UnaryExpression') {\n return isSafeStaticExpression(unwrapped.argument, options);\n }\n\n if (\n unwrapped.type === 'BinaryExpression' ||\n unwrapped.type === 'LogicalExpression'\n ) {\n return (\n isSafeStaticExpression(unwrapped.left, options) &&\n isSafeStaticExpression(unwrapped.right, options)\n );\n }\n\n if (unwrapped.type === 'ConditionalExpression') {\n return (\n isSafeStaticExpression(unwrapped.test, options) &&\n isSafeStaticExpression(unwrapped.consequent, options) &&\n isSafeStaticExpression(unwrapped.alternate, options)\n );\n }\n\n if (unwrapped.type === 'MemberExpression') {\n return (\n isSafeStaticExpression(unwrapped.object, options) &&\n (unwrapped.computed\n ? isSafeStaticExpression(unwrapped.property, options)\n : unwrapped.property.type === 'Identifier')\n );\n }\n\n if (options.allowMetadataCalls && unwrapped.type === 'CallExpression') {\n return (\n unwrapped.callee.type === 'Identifier' && unwrapped.arguments.length === 0\n );\n }\n\n if (\n unwrapped.type === 'CallExpression' &&\n options.staticHelperLocals &&\n unwrapped.callee.type === 'Identifier' &&\n options.staticHelperLocals.has(unwrapped.callee.name)\n ) {\n return unwrapped.arguments.every((argument) =>\n argument.type === 'SpreadElement'\n ? isSafeStaticExpression(argument.argument, options)\n : isSafeStaticExpression(argument as Node, options)\n );\n }\n\n if (\n options.allowMetadataCalls &&\n (unwrapped.type === 'ArrowFunctionExpression' ||\n unwrapped.type === 'FunctionExpression')\n ) {\n return (\n !unwrapped.async &&\n unwrapped.params.length === 0 &&\n !!unwrapped.body &&\n isSafeFunctionBodyExpression(unwrapped.body, options)\n );\n }\n\n if (unwrapped.type === 'ArrayExpression') {\n return unwrapped.elements.every((item) => {\n if (!item) {\n return false;\n }\n\n return item.type === 'SpreadElement'\n ? isSafeStaticExpression(item.argument, options)\n : isSafeStaticExpression(item, options);\n });\n }\n\n if (unwrapped.type === 'ObjectExpression') {\n return unwrapped.properties.every((property) => {\n if (property.type === 'SpreadElement') {\n return isSafeStaticExpression(property.argument);\n }\n\n const propertyNode = property as AnyNode;\n if (propertyNode.method) {\n return false;\n }\n\n // Computed keys are admissible as long as the key expression\n // itself is safe-static — the downstream evaluator already folds\n // them against the env. Common shape: `[\\`${imp} &\\`]: { ... }`.\n if (\n propertyNode.computed &&\n (!propertyNode.key ||\n typeof propertyNode.key !== 'object' ||\n !isSafeStaticExpression(propertyNode.key as Node, options))\n ) {\n return false;\n }\n\n return (\n propertyNode.value &&\n typeof propertyNode.value === 'object' &&\n isSafeStaticExpression(propertyNode.value as Node, options)\n );\n });\n }\n\n return false;\n};\n\nexport const isTypeOnlyImport = (statement: ImportDeclaration): boolean => {\n if (statement.importKind === 'type') {\n return true;\n }\n\n return statement.specifiers.every(\n (specifier) =>\n specifier.type === 'ImportSpecifier' &&\n (specifier as ImportSpecifier).importKind === 'type'\n );\n};\n\nexport const getImportBinding = (\n statement: ImportDeclaration,\n specifier: ImportDeclaration['specifiers'][number],\n options: CollectImportBindingsOptions = {}\n): ImportBinding | null => {\n const local = specifier.local?.name;\n if (!local) {\n return null;\n }\n\n if (specifier.type === 'ImportNamespaceSpecifier') {\n return options.includeNamespace\n ? {\n imported: '*',\n local,\n source: statement.source.value,\n }\n : null;\n }\n\n if (specifier.type === 'ImportDefaultSpecifier') {\n return {\n imported: 'default',\n local,\n source: statement.source.value,\n };\n }\n\n if (specifier.type !== 'ImportSpecifier') {\n return null;\n }\n\n if (\n statement.importKind === 'type' ||\n (specifier as ImportSpecifier).importKind === 'type'\n ) {\n return null;\n }\n\n return {\n imported: moduleExportName((specifier as ImportSpecifier).imported),\n local,\n source: statement.source.value,\n };\n};\n\nexport const collectImportBindings = (\n program: Program,\n options: CollectImportBindingsOptions = {}\n): Map<string, ImportBinding> => {\n const result = new Map<string, ImportBinding>();\n\n program.body.forEach((statement) => {\n if (statement.type !== 'ImportDeclaration' || isTypeOnlyImport(statement)) {\n return;\n }\n\n statement.specifiers.forEach((specifier) => {\n const binding = getImportBinding(statement, specifier, options);\n if (binding) {\n result.set(binding.local, binding);\n }\n });\n });\n\n return result;\n};\nexport const parseStaticExpressionSource = (\n source: string,\n filename: string\n): Expression | null => {\n try {\n const program = parseProgram(\n `const __wyw_static_value = ${source};`,\n filename\n );\n const declaration = program.body[0];\n if (declaration?.type !== 'VariableDeclaration') {\n return null;\n }\n\n const [declarator] = declaration.declarations;\n return declarator?.init ?? null;\n } catch {\n return null;\n }\n};\n\nexport const isRuntimeCallbackExpression = (\n expression: Expression | null\n): boolean => {\n const unwrapped = expression ? unwrapExpression(expression) : null;\n return (\n unwrapped?.type === 'ArrowFunctionExpression' ||\n unwrapped?.type === 'FunctionExpression'\n );\n};\n\nexport const runtimeCallbackPlaceholder = (): undefined => undefined;\n\nexport const isIdentifierBindingPosition = (\n node: Node,\n parent: Node | null\n): boolean => {\n if (node.type !== 'Identifier' || !parent) {\n return false;\n }\n\n if (\n (parent.type === 'VariableDeclarator' && parent.id === node) ||\n (parent.type === 'FunctionDeclaration' && parent.id === node) ||\n (parent.type === 'FunctionExpression' && parent.id === node) ||\n (parent.type === 'ClassDeclaration' && parent.id === node) ||\n (parent.type === 'ClassExpression' && parent.id === node)\n ) {\n return true;\n }\n\n if (\n (parent.type === 'ArrowFunctionExpression' ||\n parent.type === 'FunctionDeclaration' ||\n parent.type === 'FunctionExpression') &&\n parent.params.some((param) => param === node)\n ) {\n return true;\n }\n\n return (\n (parent.type === 'ImportSpecifier' && parent.local === node) ||\n (parent.type === 'ImportDefaultSpecifier' && parent.local === node) ||\n (parent.type === 'ImportNamespaceSpecifier' && parent.local === node)\n );\n};\n\nexport const isPropertyKeyOnlyIdentifier = (\n node: Node,\n parent: Node | null\n): boolean =>\n node.type === 'Identifier' &&\n !!parent &&\n ((parent.type === 'MemberExpression' &&\n parent.property === node &&\n !parent.computed) ||\n (parent.type === 'Property' &&\n parent.key === node &&\n !parent.computed &&\n !parent.shorthand));\n\nexport const expressionUsesNameOnlyAsZeroArgCalls = (\n expression: Node,\n name: string\n): boolean => {\n let seen = false;\n let valid = true;\n\n const walk = (node: Node, parent: Node | null): void => {\n if (!valid) {\n return;\n }\n\n if (\n node.type === 'Identifier' &&\n node.name === name &&\n !isIdentifierBindingPosition(node, parent) &&\n !isPropertyKeyOnlyIdentifier(node, parent)\n ) {\n if (\n parent?.type === 'CallExpression' &&\n parent.callee === node &&\n parent.arguments.length === 0\n ) {\n seen = true;\n } else {\n valid = false;\n return;\n }\n }\n\n getOxcNodeChildren(node).forEach((child) => walk(child, node));\n };\n\n walk(expression, null);\n return seen && valid;\n};\n\nexport const bindStaticResolvedValue = (\n env: Map<string, unknown>,\n expression: Node,\n local: string,\n resolved: StaticExportResult,\n options: { wrapNonCallable?: boolean } = {}\n): boolean => {\n if (resolved.callable === 'zero-arg') {\n if (!expressionUsesNameOnlyAsZeroArgCalls(expression, local)) {\n return false;\n }\n\n env.set(local, createOxcStaticCallableValue(resolved.value));\n return true;\n }\n\n env.set(\n local,\n options.wrapNonCallable\n ? createOxcStaticCallableValue(resolved.value)\n : resolved.value\n );\n return true;\n};\nexport const isSafeFunctionBodyExpression = (\n body: Node,\n options: StaticExpressionOptions\n): boolean => {\n if (body.type !== 'BlockStatement') {\n return isSafeStaticExpression(body, options);\n }\n\n return body.body.every((statement) => {\n if (statement.type === 'VariableDeclaration') {\n return (\n statement.kind === 'const' &&\n statement.declarations.every(\n (declarator) =>\n declarator.init &&\n declarator.id.type === 'Identifier' &&\n isSafeStaticExpression(declarator.init, options)\n )\n );\n }\n\n return (\n statement.type === 'ReturnStatement' &&\n !!statement.argument &&\n isSafeStaticExpression(statement.argument, options)\n );\n });\n};\n\nexport const collectStaticFunctionBodyReferences = (\n body: Node,\n references: Set<string>,\n options: StaticExpressionOptions\n): boolean => {\n if (body.type !== 'BlockStatement') {\n return collectStaticExpressionReferences(body, references, options);\n }\n\n return body.body.every((statement) => {\n if (statement.type === 'VariableDeclaration') {\n return (\n statement.kind === 'const' &&\n statement.declarations.every(\n (declarator) =>\n declarator.init &&\n declarator.id.type === 'Identifier' &&\n collectStaticExpressionReferences(\n declarator.init,\n references,\n options\n )\n )\n );\n }\n\n return (\n statement.type === 'ReturnStatement' &&\n !!statement.argument &&\n collectStaticExpressionReferences(statement.argument, references, options)\n );\n });\n};\n\nexport const collectStaticExpressionReferences = (\n expr: Node,\n references: Set<string>,\n options: StaticExpressionOptions = {}\n): boolean => {\n const unwrapped = unwrapExpression(expr);\n\n if (isSafeLiteral(unwrapped)) {\n return true;\n }\n\n if (unwrapped.type === 'Identifier') {\n references.add(unwrapped.name);\n return true;\n }\n\n if (unwrapped.type === 'TemplateLiteral') {\n return unwrapped.expressions.every((item) =>\n collectStaticExpressionReferences(item, references, options)\n );\n }\n\n if (unwrapped.type === 'UnaryExpression') {\n return collectStaticExpressionReferences(\n unwrapped.argument,\n references,\n options\n );\n }\n\n if (\n unwrapped.type === 'BinaryExpression' ||\n unwrapped.type === 'LogicalExpression'\n ) {\n return (\n collectStaticExpressionReferences(unwrapped.left, references, options) &&\n collectStaticExpressionReferences(unwrapped.right, references, options)\n );\n }\n\n if (unwrapped.type === 'ConditionalExpression') {\n return (\n collectStaticExpressionReferences(unwrapped.test, references, options) &&\n collectStaticExpressionReferences(\n unwrapped.consequent,\n references,\n options\n ) &&\n collectStaticExpressionReferences(\n unwrapped.alternate,\n references,\n options\n )\n );\n }\n\n if (unwrapped.type === 'MemberExpression') {\n if (isProcessEnvMember(unwrapped) || isProcessEnvMember(unwrapped.object)) {\n // process.env / process.env.X is an opaque build-time global —\n // don't treat `process` as an unresolved local reference.\n return true;\n }\n\n return (\n collectStaticExpressionReferences(\n unwrapped.object,\n references,\n options\n ) &&\n (!unwrapped.computed ||\n collectStaticExpressionReferences(\n unwrapped.property,\n references,\n options\n ))\n );\n }\n\n if (options.allowMetadataCalls && unwrapped.type === 'CallExpression') {\n if (\n unwrapped.callee.type !== 'Identifier' ||\n unwrapped.arguments.length !== 0\n ) {\n return false;\n }\n\n references.add(unwrapped.callee.name);\n return true;\n }\n\n if (\n unwrapped.type === 'CallExpression' &&\n options.staticHelperLocals &&\n unwrapped.callee.type === 'Identifier' &&\n options.staticHelperLocals.has(unwrapped.callee.name)\n ) {\n references.add(unwrapped.callee.name);\n return unwrapped.arguments.every((argument) =>\n argument.type === 'SpreadElement'\n ? collectStaticExpressionReferences(\n argument.argument,\n references,\n options\n )\n : collectStaticExpressionReferences(\n argument as Node,\n references,\n options\n )\n );\n }\n\n if (\n options.allowMetadataCalls &&\n (unwrapped.type === 'ArrowFunctionExpression' ||\n unwrapped.type === 'FunctionExpression')\n ) {\n if (unwrapped.async || unwrapped.params.length !== 0) {\n return false;\n }\n\n return (\n !!unwrapped.body &&\n collectStaticFunctionBodyReferences(unwrapped.body, references, options)\n );\n }\n\n if (unwrapped.type === 'ArrayExpression') {\n return unwrapped.elements.every((item) => {\n if (!item) {\n return false;\n }\n\n return item.type === 'SpreadElement'\n ? collectStaticExpressionReferences(item.argument, references, options)\n : collectStaticExpressionReferences(item, references, options);\n });\n }\n\n if (unwrapped.type === 'ObjectExpression') {\n return unwrapped.properties.every((property) => {\n if (property.type === 'SpreadElement') {\n return collectStaticExpressionReferences(\n property.argument,\n references,\n options\n );\n }\n\n const propertyNode = property as AnyNode;\n if (!propertyNode.value || typeof propertyNode.value !== 'object') {\n return false;\n }\n\n if (\n propertyNode.computed &&\n (!propertyNode.key ||\n typeof propertyNode.key !== 'object' ||\n !collectStaticExpressionReferences(\n propertyNode.key as Node,\n references,\n options\n ))\n ) {\n return false;\n }\n\n return collectStaticExpressionReferences(\n propertyNode.value as Node,\n references,\n options\n );\n });\n }\n\n return false;\n};\n"],"file":"staticExpression.js"}
@@ -0,0 +1,298 @@
1
+ import { collectLocalConstExpressions } from "./programAnalysis.js";
2
+ import { collectImportBindings, collectStaticExpressionReferences, isSafeLiteral, isSafeStaticExpression, unwrapExpression } from "./staticExpression.js";
3
+ export const mutatingMethodNames = new Set([
4
+ "add",
5
+ "clear",
6
+ "copyWithin",
7
+ "delete",
8
+ "fill",
9
+ "pop",
10
+ "push",
11
+ "reverse",
12
+ "set",
13
+ "shift",
14
+ "sort",
15
+ "splice",
16
+ "unshift"
17
+ ]);
18
+ export const rootIdentifierName = (expr) => {
19
+ const unwrapped = unwrapExpression(expr);
20
+ if (unwrapped.type === "Identifier") {
21
+ return unwrapped.name;
22
+ }
23
+ if (unwrapped.type === "MemberExpression") {
24
+ return rootIdentifierName(unwrapped.object);
25
+ }
26
+ if (unwrapped.type === "ChainExpression") {
27
+ return rootIdentifierName(unwrapped.expression);
28
+ }
29
+ return null;
30
+ };
31
+ export const staticMemberName = (expr) => {
32
+ const unwrapped = unwrapExpression(expr);
33
+ if (unwrapped.type === "Identifier") {
34
+ return unwrapped.name;
35
+ }
36
+ if (isSafeLiteral(unwrapped) && typeof unwrapped.value === "string") {
37
+ return unwrapped.value;
38
+ }
39
+ return null;
40
+ };
41
+ export const expressionMayProduceMutableValue = (expr, locals, visiting) => {
42
+ const unwrapped = unwrapExpression(expr);
43
+ if (unwrapped.type === "ObjectExpression" || unwrapped.type === "ArrayExpression") {
44
+ return true;
45
+ }
46
+ if (unwrapped.type === "Identifier") {
47
+ const local = locals.get(unwrapped.name);
48
+ if (!local || visiting.has(unwrapped.name)) {
49
+ return true;
50
+ }
51
+ visiting.add(unwrapped.name);
52
+ const result = expressionMayProduceMutableValue(local, locals, visiting);
53
+ visiting.delete(unwrapped.name);
54
+ return result;
55
+ }
56
+ if (unwrapped.type === "ConditionalExpression") {
57
+ return expressionMayProduceMutableValue(unwrapped.consequent, locals, visiting) || expressionMayProduceMutableValue(unwrapped.alternate, locals, visiting);
58
+ }
59
+ if (unwrapped.type === "LogicalExpression" || unwrapped.type === "MemberExpression") {
60
+ return true;
61
+ }
62
+ return false;
63
+ };
64
+ export const collectExpressionMutationHints = (expr, mutatedNames, callArgumentNames) => {
65
+ const unwrapped = unwrapExpression(expr);
66
+ if (unwrapped.type === "AssignmentExpression") {
67
+ const rootName = rootIdentifierName(unwrapped.left);
68
+ if (rootName) {
69
+ mutatedNames.add(rootName);
70
+ }
71
+ collectExpressionMutationHints(unwrapped.right, mutatedNames, callArgumentNames);
72
+ return;
73
+ }
74
+ if (unwrapped.type === "UpdateExpression") {
75
+ const rootName = rootIdentifierName(unwrapped.argument);
76
+ if (rootName) {
77
+ mutatedNames.add(rootName);
78
+ }
79
+ return;
80
+ }
81
+ if (unwrapped.type === "UnaryExpression") {
82
+ if (unwrapped.operator === "delete") {
83
+ const rootName = rootIdentifierName(unwrapped.argument);
84
+ if (rootName) {
85
+ mutatedNames.add(rootName);
86
+ }
87
+ }
88
+ collectExpressionMutationHints(unwrapped.argument, mutatedNames, callArgumentNames);
89
+ return;
90
+ }
91
+ if (unwrapped.type === "CallExpression") {
92
+ const callee = unwrapExpression(unwrapped.callee);
93
+ if (callee.type === "MemberExpression") {
94
+ const methodName = staticMemberName(callee.property);
95
+ const rootName = rootIdentifierName(callee.object);
96
+ if (rootName && methodName && mutatingMethodNames.has(methodName)) {
97
+ mutatedNames.add(rootName);
98
+ }
99
+ collectExpressionMutationHints(callee.object, mutatedNames, callArgumentNames);
100
+ if (callee.computed) {
101
+ collectExpressionMutationHints(callee.property, mutatedNames, callArgumentNames);
102
+ }
103
+ } else {
104
+ collectExpressionMutationHints(unwrapped.callee, mutatedNames, callArgumentNames);
105
+ }
106
+ unwrapped.arguments.forEach((argument) => {
107
+ const argumentNode = argument.type === "SpreadElement" ? argument.argument : argument;
108
+ const rootName = rootIdentifierName(argumentNode);
109
+ if (rootName) {
110
+ callArgumentNames.add(rootName);
111
+ }
112
+ collectExpressionMutationHints(argumentNode, mutatedNames, callArgumentNames);
113
+ });
114
+ return;
115
+ }
116
+ if (unwrapped.type === "TaggedTemplateExpression") {
117
+ collectExpressionMutationHints(unwrapped.tag, mutatedNames, callArgumentNames);
118
+ unwrapped.quasi.expressions.forEach((item) => collectExpressionMutationHints(item, mutatedNames, callArgumentNames));
119
+ return;
120
+ }
121
+ if (unwrapped.type === "ConditionalExpression") {
122
+ collectExpressionMutationHints(unwrapped.test, mutatedNames, callArgumentNames);
123
+ collectExpressionMutationHints(unwrapped.consequent, mutatedNames, callArgumentNames);
124
+ collectExpressionMutationHints(unwrapped.alternate, mutatedNames, callArgumentNames);
125
+ return;
126
+ }
127
+ if (unwrapped.type === "BinaryExpression" || unwrapped.type === "LogicalExpression") {
128
+ collectExpressionMutationHints(unwrapped.left, mutatedNames, callArgumentNames);
129
+ collectExpressionMutationHints(unwrapped.right, mutatedNames, callArgumentNames);
130
+ return;
131
+ }
132
+ if (unwrapped.type === "MemberExpression") {
133
+ collectExpressionMutationHints(unwrapped.object, mutatedNames, callArgumentNames);
134
+ if (unwrapped.computed) {
135
+ collectExpressionMutationHints(unwrapped.property, mutatedNames, callArgumentNames);
136
+ }
137
+ return;
138
+ }
139
+ if (unwrapped.type === "ArrayExpression") {
140
+ unwrapped.elements.forEach((item) => {
141
+ if (!item) {
142
+ return;
143
+ }
144
+ collectExpressionMutationHints(item.type === "SpreadElement" ? item.argument : item, mutatedNames, callArgumentNames);
145
+ });
146
+ return;
147
+ }
148
+ if (unwrapped.type === "ObjectExpression") {
149
+ unwrapped.properties.forEach((property) => {
150
+ if (property.type === "SpreadElement") {
151
+ collectExpressionMutationHints(property.argument, mutatedNames, callArgumentNames);
152
+ return;
153
+ }
154
+ const propertyNode = property;
155
+ if (propertyNode.computed && propertyNode.key) {
156
+ collectExpressionMutationHints(propertyNode.key, mutatedNames, callArgumentNames);
157
+ }
158
+ if (propertyNode.value && typeof propertyNode.value === "object") {
159
+ collectExpressionMutationHints(propertyNode.value, mutatedNames, callArgumentNames);
160
+ }
161
+ });
162
+ }
163
+ };
164
+ export const collectTopLevelMutationHints = (program, closureNames = null) => {
165
+ const callArgumentNames = new Set();
166
+ const mutatedNames = new Set();
167
+ const collectDeclaration = (declaration) => {
168
+ declaration.declarations.forEach((declarator) => {
169
+ if (closureNames) {
170
+ const declaredName = declarator.id.type === "Identifier" ? declarator.id.name : null;
171
+ if (!declaredName || !closureNames.has(declaredName)) {
172
+ return;
173
+ }
174
+ }
175
+ if (declarator.init) {
176
+ collectExpressionMutationHints(declarator.init, mutatedNames, callArgumentNames);
177
+ }
178
+ });
179
+ };
180
+ program.body.forEach((statement) => {
181
+ if (statement.type === "VariableDeclaration") {
182
+ collectDeclaration(statement);
183
+ return;
184
+ }
185
+ if (statement.type === "ExpressionStatement") {
186
+ collectExpressionMutationHints(statement.expression, mutatedNames, callArgumentNames);
187
+ return;
188
+ }
189
+ if (statement.type === "ExportNamedDeclaration") {
190
+ if (statement.declaration?.type === "VariableDeclaration") {
191
+ collectDeclaration(statement.declaration);
192
+ }
193
+ return;
194
+ }
195
+ if (statement.type === "ExportDefaultDeclaration") {
196
+ if (statement.declaration.type !== "FunctionDeclaration" && statement.declaration.type !== "ClassDeclaration") {
197
+ collectExpressionMutationHints(statement.declaration, mutatedNames, callArgumentNames);
198
+ }
199
+ }
200
+ });
201
+ return {
202
+ callArgumentNames,
203
+ mutatedNames
204
+ };
205
+ };
206
+ export const collectStaticExpressionDependencies = (program, target, options = {}) => {
207
+ const imports = collectImportBindings(program);
208
+ const locals = collectLocalConstExpressions(program);
209
+ const collectedImports = new Map();
210
+ const referencedNames = new Set();
211
+ const mutableReferencedNames = new Set();
212
+ const visitedLocals = new Set();
213
+ const visitingLocals = new Set();
214
+ const markMutable = (name, expression) => {
215
+ if (expressionMayProduceMutableValue(expression, locals, new Set())) {
216
+ mutableReferencedNames.add(name);
217
+ }
218
+ };
219
+ const collectLocal = (name) => {
220
+ // Pre-resolved locals (e.g. `const x = css\`\``) have a known value
221
+ // (the className string). Skip walking their init — its
222
+ // TaggedTemplateExpression isn't safe-static by itself, but the
223
+ // value is already determined.
224
+ if (options.preResolvedLocals?.has(name)) {
225
+ referencedNames.add(name);
226
+ visitedLocals.add(name);
227
+ return true;
228
+ }
229
+ const expression = locals.get(name);
230
+ if (!expression || visitingLocals.has(name)) {
231
+ return false;
232
+ }
233
+ referencedNames.add(name);
234
+ markMutable(name, expression);
235
+ if (visitedLocals.has(name)) {
236
+ return true;
237
+ }
238
+ visitingLocals.add(name);
239
+ const result = collectExpression(expression);
240
+ visitingLocals.delete(name);
241
+ if (result) {
242
+ visitedLocals.add(name);
243
+ }
244
+ return result;
245
+ };
246
+ const collectExpression = (expr) => {
247
+ if (!isSafeStaticExpression(expr, options)) {
248
+ return false;
249
+ }
250
+ const references = new Set();
251
+ if (!collectStaticExpressionReferences(expr, references, options)) {
252
+ return false;
253
+ }
254
+ for (const reference of references) {
255
+ referencedNames.add(reference);
256
+ const importBinding = imports.get(reference);
257
+ if (importBinding) {
258
+ collectedImports.set(`${importBinding.source}\0${importBinding.imported}\0${importBinding.local}`, importBinding);
259
+ mutableReferencedNames.add(reference);
260
+ continue;
261
+ }
262
+ if (!collectLocal(reference)) {
263
+ // Unknown identifier — neither an import nor a same-file local.
264
+ // Common case: undeclared globals like __DEV__ used in
265
+ // `typeof __DEV__ !== "undefined"` short-circuit guards. The
266
+ // evaluator returns undefined for unknowns, which the outer
267
+ // expression's logical short-circuits handle correctly. Don't
268
+ // reject the whole walk upfront — let the evaluator decide.
269
+ continue;
270
+ }
271
+ }
272
+ return true;
273
+ };
274
+ if (target.localName) {
275
+ referencedNames.add(target.localName);
276
+ markMutable(target.localName, target.expression);
277
+ }
278
+ if (!collectExpression(target.expression)) {
279
+ return null;
280
+ }
281
+ const closureNames = new Set(referencedNames);
282
+ if (target.localName) {
283
+ closureNames.add(target.localName);
284
+ }
285
+ const mutationHints = collectTopLevelMutationHints(program, closureNames);
286
+ for (const name of referencedNames) {
287
+ if (mutationHints.mutatedNames.has(name)) {
288
+ return null;
289
+ }
290
+ }
291
+ for (const name of mutableReferencedNames) {
292
+ if (mutationHints.callArgumentNames.has(name) && !options.ignoredMutableCallArgumentNames?.has(name)) {
293
+ return null;
294
+ }
295
+ }
296
+ return { imports: [...collectedImports.values()] };
297
+ };
298
+ //# sourceMappingURL=staticExpressionDependencies.js.map