@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
@@ -1,7 +1,53 @@
1
- /* eslint-disable no-continue,no-await-in-loop,require-yield */
2
1
  import { getFileIdx } from "../../utils/getFileIdx.js";
3
2
  import { getStack, isSuperSet, mergeOnly } from "../Entrypoint.helpers.js";
4
3
  import { applyImportOverrideToOnly, getImportOverride, resolveMockSpecifier, toImportKey } from "../../utils/importOverrides.js";
4
+ import { resolveWithNativeResolver } from "../../utils/nativeResolver.js";
5
+ const DEFAULT_EVAL_OPTIONS = {
6
+ errors: "strict",
7
+ require: "warn-and-run",
8
+ resolver: "bundler"
9
+ };
10
+ const getEvalOptions = (services) => ({
11
+ ...DEFAULT_EVAL_OPTIONS,
12
+ ...services.options.pluginOptions.eval ?? {}
13
+ });
14
+ const resolveWithConfiguredEvalResolver = async (services, source, importer, stack, resolve) => {
15
+ const evalOptions = getEvalOptions(services);
16
+ if (evalOptions.customResolver) {
17
+ const customResolved = await evalOptions.customResolver(source, importer, "import");
18
+ if (customResolved) {
19
+ return customResolved.external ? null : customResolved.id;
20
+ }
21
+ if (evalOptions.resolver === "custom") {
22
+ return null;
23
+ }
24
+ }
25
+ if (evalOptions.resolver === "hybrid") {
26
+ try {
27
+ return resolveWithNativeResolver({
28
+ conditionNames: services.options.pluginOptions.conditionNames,
29
+ extensions: services.options.pluginOptions.extensions,
30
+ importer,
31
+ kind: "import",
32
+ oxcOptions: services.options.pluginOptions.oxcOptions,
33
+ specifier: source
34
+ });
35
+ } catch {
36
+ return resolve(source, importer, stack);
37
+ }
38
+ }
39
+ if (evalOptions.resolver === "native") {
40
+ return resolveWithNativeResolver({
41
+ conditionNames: services.options.pluginOptions.conditionNames,
42
+ extensions: services.options.pluginOptions.extensions,
43
+ importer,
44
+ kind: "import",
45
+ oxcOptions: services.options.pluginOptions.oxcOptions,
46
+ specifier: source
47
+ });
48
+ }
49
+ return resolve(source, importer, stack);
50
+ };
5
51
  function applyImportOverrides(services, entrypoint, resolvedImports) {
6
52
  const overrides = services.options.pluginOptions.importOverrides;
7
53
  if (!overrides || Object.keys(overrides).length === 0) {
@@ -117,7 +163,7 @@ export async function* asyncResolveImports(resolve) {
117
163
  const getResolveTask = async (source, only) => {
118
164
  let resolved = null;
119
165
  try {
120
- resolved = await resolve(source, entrypoint.name, getStack(entrypoint));
166
+ resolved = await resolveWithConfiguredEvalResolver(this.services, source, entrypoint.name, getStack(entrypoint), resolve);
121
167
  } catch (err) {
122
168
  log("[async-resolve] ❌ cannot resolve %s in %s: %O", source, entrypoint.name, err);
123
169
  }
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../src/transform/generators/resolveImports.ts"],"version":3,"sourcesContent":["/* eslint-disable no-continue,no-await-in-loop,require-yield */\nimport { getFileIdx } from '../../utils/getFileIdx';\nimport type { Entrypoint } from '../Entrypoint';\nimport { getStack, isSuperSet, mergeOnly } from '../Entrypoint.helpers';\nimport type { IEntrypointDependency } from '../Entrypoint.types';\nimport {\n applyImportOverrideToOnly,\n getImportOverride,\n resolveMockSpecifier,\n toImportKey,\n} from '../../utils/importOverrides';\nimport type {\n AsyncScenarioForAction,\n IResolveImportsAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\nfunction applyImportOverrides(\n services: Services,\n entrypoint: Entrypoint,\n resolvedImports: IEntrypointDependency[]\n): IEntrypointDependency[] {\n const overrides = services.options.pluginOptions.importOverrides;\n if (!overrides || Object.keys(overrides).length === 0) {\n return resolvedImports;\n }\n\n const { root } = services.options;\n const importer = entrypoint.name;\n const stack = getStack(entrypoint);\n\n return resolvedImports.map((dependency) => {\n const { key } = toImportKey({\n source: dependency.source,\n resolved: dependency.resolved,\n root,\n });\n const override = getImportOverride(overrides, key);\n if (!override) {\n return dependency;\n }\n\n const nextOnly = applyImportOverrideToOnly(dependency.only, override);\n const nextResolved = override.mock\n ? resolveMockSpecifier({\n mock: override.mock,\n importer,\n root,\n stack,\n })\n : dependency.resolved;\n\n return {\n ...dependency,\n only: nextOnly,\n resolved: nextResolved,\n };\n });\n}\n\nfunction emitDependency(\n emitter: Services['eventEmitter'],\n entrypoint: IResolveImportsAction['entrypoint'],\n imports: IEntrypointDependency[],\n phase?: IResolveImportsAction['data']['phase']\n) {\n emitter.single({\n type: 'dependency',\n file: entrypoint.name,\n only: entrypoint.only,\n phase,\n imports: imports.map(({ resolved, only }) => ({\n from: resolved,\n what: only,\n })),\n fileIdx: getFileIdx(entrypoint.name),\n });\n}\n\nfunction filterUnresolved(\n entrypoint: Entrypoint,\n resolvedImports: IEntrypointDependency[]\n): IEntrypointDependency[] {\n return resolvedImports.filter((i): i is IEntrypointDependency => {\n if (i.resolved === null) {\n entrypoint.log(\n `[resolve] ✅ %s in %s is ignored`,\n i.source,\n entrypoint.name\n );\n return false;\n }\n\n return true;\n });\n}\n\nfunction getPreResolvedImports(\n preResolved: IResolveImportsAction['data']['preResolved']\n): Map<string, IEntrypointDependency> {\n return new Map(\n (preResolved ?? []).map((dependency) => [dependency.source, dependency])\n );\n}\n\n/**\n * Synchronously resolves specified imports with a provided resolver.\n */\nexport function* syncResolveImports(\n this: IResolveImportsAction,\n resolve: (what: string, importer: string, stack: string[]) => string\n): SyncScenarioForAction<IResolveImportsAction> {\n const {\n data: { imports },\n entrypoint,\n services: { eventEmitter },\n } = this;\n const listOfImports = Array.from(imports?.entries() ?? []);\n const preResolvedImports = getPreResolvedImports(this.data.preResolved);\n const { log } = entrypoint;\n\n if (listOfImports.length === 0) {\n emitDependency(eventEmitter, entrypoint, [], this.data.phase);\n\n log('%s has no imports', entrypoint.name);\n return [];\n }\n\n const resolvedImports = listOfImports.map(([source, only]) => {\n const preResolved = preResolvedImports.get(source);\n if (preResolved) {\n const mergedOnly = mergeOnly(preResolved.only, only);\n log(\n '[sync-resolve] ♻️ %s -> %s (only: %o)',\n source,\n preResolved.resolved,\n mergedOnly\n );\n return {\n ...preResolved,\n only: mergedOnly,\n };\n }\n\n let resolved: string | null = null;\n try {\n resolved = resolve(source, entrypoint.name, getStack(entrypoint));\n log('[sync-resolve] ✅ %s -> %s (only: %o)', source, resolved, only);\n } catch (err) {\n log('[sync-resolve] ❌ cannot resolve %s: %O', source, err);\n }\n\n return {\n source,\n only,\n resolved,\n };\n });\n\n const overriddenImports = applyImportOverrides(\n this.services,\n entrypoint,\n resolvedImports\n );\n const filteredImports = filterUnresolved(entrypoint, overriddenImports);\n emitDependency(eventEmitter, entrypoint, filteredImports, this.data.phase);\n\n return filteredImports;\n}\n\n/**\n * Asynchronously resolves specified imports with a provided resolver.\n */\nexport async function* asyncResolveImports(\n this: IResolveImportsAction,\n resolve: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>\n): AsyncScenarioForAction<IResolveImportsAction> {\n const {\n data: { imports },\n entrypoint,\n services: { eventEmitter },\n } = this;\n const listOfImports = Array.from(imports?.entries() ?? []);\n const preResolvedImports = getPreResolvedImports(this.data.preResolved);\n const { log } = entrypoint;\n\n if (listOfImports.length === 0) {\n emitDependency(eventEmitter, entrypoint, [], this.data.phase);\n\n log('%s has no imports', entrypoint.name);\n return [];\n }\n\n log('resolving %d imports', listOfImports.length);\n\n const getResolveTask = async (\n source: string,\n only: string[]\n ): Promise<IEntrypointDependency> => {\n let resolved: string | null = null;\n try {\n resolved = await resolve(source, entrypoint.name, getStack(entrypoint));\n } catch (err) {\n log(\n '[async-resolve] ❌ cannot resolve %s in %s: %O',\n source,\n entrypoint.name,\n err\n );\n }\n\n if (resolved !== null) {\n log(\n '[async-resolve] ✅ %s (%o) in %s -> %s',\n source,\n only,\n entrypoint.name,\n resolved\n );\n }\n\n return {\n source,\n only,\n resolved,\n };\n };\n\n const resolvedImports = await Promise.all<IEntrypointDependency>(\n listOfImports.map(([source, importsOnly]) => {\n const preResolved = preResolvedImports.get(source);\n if (preResolved) {\n const mergedOnly = mergeOnly(preResolved.only, importsOnly);\n log(\n '[async-resolve] ♻️ %s (%o) in %s -> %s',\n source,\n mergedOnly,\n entrypoint.name,\n preResolved.resolved\n );\n return {\n ...preResolved,\n only: mergedOnly,\n };\n }\n\n const cached = entrypoint.getDependency(source);\n if (cached) {\n return {\n source,\n only: mergeOnly(cached.only, importsOnly),\n resolved: cached.resolved,\n };\n }\n\n const task = entrypoint.getResolveTask(source);\n if (task) {\n // If we have cached task, we need to merge only…\n const newTask = task.then((res) => {\n if (isSuperSet(res.only, importsOnly)) {\n return res;\n }\n\n // Is this branch even possible?\n const merged = mergeOnly(res.only, importsOnly);\n\n log('merging imports %o and %o: %o', importsOnly, res.only, merged);\n\n return { ...res, only: merged };\n });\n\n // … and update the cache\n entrypoint.addResolveTask(source, newTask);\n return newTask;\n }\n\n const resolveTask = getResolveTask(source, importsOnly);\n\n entrypoint.addResolveTask(source, resolveTask);\n\n return resolveTask;\n })\n );\n\n log('resolved %d imports', resolvedImports.length);\n\n const overriddenImports = applyImportOverrides(\n this.services,\n entrypoint,\n resolvedImports\n );\n const filteredImports = filterUnresolved(entrypoint, overriddenImports);\n emitDependency(eventEmitter, entrypoint, filteredImports, this.data.phase);\n return filteredImports;\n}\n"],"file":"resolveImports.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../src/transform/generators/resolveImports.ts"],"version":3,"sourcesContent":["/* eslint-disable no-continue,no-await-in-loop,require-yield */\nimport type { EvalOptionsV2 } from '@wyw-in-js/shared';\n\nimport { getFileIdx } from '../../utils/getFileIdx';\nimport type { Entrypoint } from '../Entrypoint';\nimport { getStack, isSuperSet, mergeOnly } from '../Entrypoint.helpers';\nimport type { IEntrypointDependency } from '../Entrypoint.types';\nimport {\n applyImportOverrideToOnly,\n getImportOverride,\n resolveMockSpecifier,\n toImportKey,\n} from '../../utils/importOverrides';\nimport { resolveWithNativeResolver } from '../../utils/nativeResolver';\nimport type {\n AsyncScenarioForAction,\n IResolveImportsAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\ntype AsyncResolve = (\n what: string,\n importer: string,\n stack: string[]\n) => Promise<string | null>;\n\nconst DEFAULT_EVAL_OPTIONS: Required<\n Pick<EvalOptionsV2, 'errors' | 'require' | 'resolver'>\n> = {\n errors: 'strict',\n require: 'warn-and-run',\n resolver: 'bundler',\n};\n\nconst getEvalOptions = (services: Services): EvalOptionsV2 => ({\n ...DEFAULT_EVAL_OPTIONS,\n ...(services.options.pluginOptions.eval ?? {}),\n});\n\nconst resolveWithConfiguredEvalResolver = async (\n services: Services,\n source: string,\n importer: string,\n stack: string[],\n resolve: AsyncResolve\n): Promise<string | null> => {\n const evalOptions = getEvalOptions(services);\n\n if (evalOptions.customResolver) {\n const customResolved = await evalOptions.customResolver(\n source,\n importer,\n 'import'\n );\n if (customResolved) {\n return customResolved.external ? null : customResolved.id;\n }\n\n if (evalOptions.resolver === 'custom') {\n return null;\n }\n }\n\n if (evalOptions.resolver === 'hybrid') {\n try {\n return resolveWithNativeResolver({\n conditionNames: services.options.pluginOptions.conditionNames,\n extensions: services.options.pluginOptions.extensions,\n importer,\n kind: 'import',\n oxcOptions: services.options.pluginOptions.oxcOptions,\n specifier: source,\n });\n } catch {\n return resolve(source, importer, stack);\n }\n }\n\n if (evalOptions.resolver === 'native') {\n return resolveWithNativeResolver({\n conditionNames: services.options.pluginOptions.conditionNames,\n extensions: services.options.pluginOptions.extensions,\n importer,\n kind: 'import',\n oxcOptions: services.options.pluginOptions.oxcOptions,\n specifier: source,\n });\n }\n\n return resolve(source, importer, stack);\n};\n\nfunction applyImportOverrides(\n services: Services,\n entrypoint: Entrypoint,\n resolvedImports: IEntrypointDependency[]\n): IEntrypointDependency[] {\n const overrides = services.options.pluginOptions.importOverrides;\n if (!overrides || Object.keys(overrides).length === 0) {\n return resolvedImports;\n }\n\n const { root } = services.options;\n const importer = entrypoint.name;\n const stack = getStack(entrypoint);\n\n return resolvedImports.map((dependency) => {\n const { key } = toImportKey({\n source: dependency.source,\n resolved: dependency.resolved,\n root,\n });\n const override = getImportOverride(overrides, key);\n if (!override) {\n return dependency;\n }\n\n const nextOnly = applyImportOverrideToOnly(dependency.only, override);\n const nextResolved = override.mock\n ? resolveMockSpecifier({\n mock: override.mock,\n importer,\n root,\n stack,\n })\n : dependency.resolved;\n\n return {\n ...dependency,\n only: nextOnly,\n resolved: nextResolved,\n };\n });\n}\n\nfunction emitDependency(\n emitter: Services['eventEmitter'],\n entrypoint: IResolveImportsAction['entrypoint'],\n imports: IEntrypointDependency[],\n phase?: IResolveImportsAction['data']['phase']\n) {\n emitter.single({\n type: 'dependency',\n file: entrypoint.name,\n only: entrypoint.only,\n phase,\n imports: imports.map(({ resolved, only }) => ({\n from: resolved,\n what: only,\n })),\n fileIdx: getFileIdx(entrypoint.name),\n });\n}\n\nfunction filterUnresolved(\n entrypoint: Entrypoint,\n resolvedImports: IEntrypointDependency[]\n): IEntrypointDependency[] {\n return resolvedImports.filter((i): i is IEntrypointDependency => {\n if (i.resolved === null) {\n entrypoint.log(\n `[resolve] ✅ %s in %s is ignored`,\n i.source,\n entrypoint.name\n );\n return false;\n }\n\n return true;\n });\n}\n\nfunction getPreResolvedImports(\n preResolved: IResolveImportsAction['data']['preResolved']\n): Map<string, IEntrypointDependency> {\n return new Map(\n (preResolved ?? []).map((dependency) => [dependency.source, dependency])\n );\n}\n\n/**\n * Synchronously resolves specified imports with a provided resolver.\n */\nexport function* syncResolveImports(\n this: IResolveImportsAction,\n resolve: (what: string, importer: string, stack: string[]) => string\n): SyncScenarioForAction<IResolveImportsAction> {\n const {\n data: { imports },\n entrypoint,\n services: { eventEmitter },\n } = this;\n const listOfImports = Array.from(imports?.entries() ?? []);\n const preResolvedImports = getPreResolvedImports(this.data.preResolved);\n const { log } = entrypoint;\n\n if (listOfImports.length === 0) {\n emitDependency(eventEmitter, entrypoint, [], this.data.phase);\n\n log('%s has no imports', entrypoint.name);\n return [];\n }\n\n const resolvedImports = listOfImports.map(([source, only]) => {\n const preResolved = preResolvedImports.get(source);\n if (preResolved) {\n const mergedOnly = mergeOnly(preResolved.only, only);\n log(\n '[sync-resolve] ♻️ %s -> %s (only: %o)',\n source,\n preResolved.resolved,\n mergedOnly\n );\n return {\n ...preResolved,\n only: mergedOnly,\n };\n }\n\n let resolved: string | null = null;\n try {\n resolved = resolve(source, entrypoint.name, getStack(entrypoint));\n log('[sync-resolve] ✅ %s -> %s (only: %o)', source, resolved, only);\n } catch (err) {\n log('[sync-resolve] ❌ cannot resolve %s: %O', source, err);\n }\n\n return {\n source,\n only,\n resolved,\n };\n });\n\n const overriddenImports = applyImportOverrides(\n this.services,\n entrypoint,\n resolvedImports\n );\n const filteredImports = filterUnresolved(entrypoint, overriddenImports);\n emitDependency(eventEmitter, entrypoint, filteredImports, this.data.phase);\n\n return filteredImports;\n}\n\n/**\n * Asynchronously resolves specified imports with a provided resolver.\n */\nexport async function* asyncResolveImports(\n this: IResolveImportsAction,\n resolve: AsyncResolve\n): AsyncScenarioForAction<IResolveImportsAction> {\n const {\n data: { imports },\n entrypoint,\n services: { eventEmitter },\n } = this;\n const listOfImports = Array.from(imports?.entries() ?? []);\n const preResolvedImports = getPreResolvedImports(this.data.preResolved);\n const { log } = entrypoint;\n\n if (listOfImports.length === 0) {\n emitDependency(eventEmitter, entrypoint, [], this.data.phase);\n\n log('%s has no imports', entrypoint.name);\n return [];\n }\n\n log('resolving %d imports', listOfImports.length);\n\n const getResolveTask = async (\n source: string,\n only: string[]\n ): Promise<IEntrypointDependency> => {\n let resolved: string | null = null;\n try {\n resolved = await resolveWithConfiguredEvalResolver(\n this.services,\n source,\n entrypoint.name,\n getStack(entrypoint),\n resolve\n );\n } catch (err) {\n log(\n '[async-resolve] ❌ cannot resolve %s in %s: %O',\n source,\n entrypoint.name,\n err\n );\n }\n\n if (resolved !== null) {\n log(\n '[async-resolve] ✅ %s (%o) in %s -> %s',\n source,\n only,\n entrypoint.name,\n resolved\n );\n }\n\n return {\n source,\n only,\n resolved,\n };\n };\n\n const resolvedImports = await Promise.all<IEntrypointDependency>(\n listOfImports.map(([source, importsOnly]) => {\n const preResolved = preResolvedImports.get(source);\n if (preResolved) {\n const mergedOnly = mergeOnly(preResolved.only, importsOnly);\n log(\n '[async-resolve] ♻️ %s (%o) in %s -> %s',\n source,\n mergedOnly,\n entrypoint.name,\n preResolved.resolved\n );\n return {\n ...preResolved,\n only: mergedOnly,\n };\n }\n\n const cached = entrypoint.getDependency(source);\n if (cached) {\n return {\n source,\n only: mergeOnly(cached.only, importsOnly),\n resolved: cached.resolved,\n };\n }\n\n const task = entrypoint.getResolveTask(source);\n if (task) {\n // If we have cached task, we need to merge only…\n const newTask = task.then((res) => {\n if (isSuperSet(res.only, importsOnly)) {\n return res;\n }\n\n // Is this branch even possible?\n const merged = mergeOnly(res.only, importsOnly);\n\n log('merging imports %o and %o: %o', importsOnly, res.only, merged);\n\n return { ...res, only: merged };\n });\n\n // … and update the cache\n entrypoint.addResolveTask(source, newTask);\n return newTask;\n }\n\n const resolveTask = getResolveTask(source, importsOnly);\n\n entrypoint.addResolveTask(source, resolveTask);\n\n return resolveTask;\n })\n );\n\n log('resolved %d imports', resolvedImports.length);\n\n const overriddenImports = applyImportOverrides(\n this.services,\n entrypoint,\n resolvedImports\n );\n const filteredImports = filterUnresolved(entrypoint, overriddenImports);\n emitDependency(eventEmitter, entrypoint, filteredImports, this.data.phase);\n return filteredImports;\n}\n"],"file":"resolveImports.js"}
@@ -0,0 +1,182 @@
1
+ /* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */
2
+ import { createHash } from "crypto";
3
+ import { readFileSync, statSync } from "fs";
4
+ import { isAbsolute } from "path";
5
+ import { oxcShaker } from "../../../shaker.js";
6
+ import { runOxcPreevalStage } from "../../../utils/oxcPreevalStage.js";
7
+ import { stripQueryAndHash } from "../../../utils/parseRequest.js";
8
+ import { isEnvDisabled, parseProgram } from "./environment.js";
9
+ import { STATIC_EXPORT_MAX_NULL_ATTEMPTS } from "./types.js";
10
+ export const staticFileAnalysisCaches = new WeakMap();
11
+ export const staticFileHashCaches = new WeakMap();
12
+ export const staticExportResultCaches = new WeakMap();
13
+ export const staticMetadataPreevalCaches = new WeakMap();
14
+ export const hashStaticContent = (content) => createHash("sha256").update(content).digest("hex");
15
+ export const getWeakCacheMap = (caches, key) => {
16
+ let cache = caches.get(key);
17
+ if (!cache) {
18
+ cache = new Map();
19
+ caches.set(key, cache);
20
+ }
21
+ return cache;
22
+ };
23
+ export const isStaticResolveCacheEnabled = () => {
24
+ const envValue = process.env.WYW_STATIC_RESOLVE_CACHE?.trim().toLowerCase();
25
+ if (envValue) {
26
+ return !isEnvDisabled(envValue);
27
+ }
28
+ return true;
29
+ };
30
+ export const staticCachePrefix = (action) => `${action.services.cache.getKeySalt() ?? ""}\0${action.services.options.root ?? ""}`;
31
+ export const staticFileAnalysisCache = (action) => getWeakCacheMap(staticFileAnalysisCaches, action.services.cache);
32
+ export const staticFileHashCache = (action) => getWeakCacheMap(staticFileHashCaches, action.services.cache);
33
+ export const staticExportResultCache = (action) => getWeakCacheMap(staticExportResultCaches, action.services.cache);
34
+ export const staticMetadataPreevalCache = (action) => getWeakCacheMap(staticMetadataPreevalCaches, action.services.cache);
35
+ export const staticFileAnalysisCacheKey = (action, filename, codeHash) => `${staticCachePrefix(action)}\0${filename}\0${codeHash}`;
36
+ export const staticExportCacheKey = (action, filename, exportedName, codeHash) => `${staticCachePrefix(action)}\0${filename}\0${exportedName}\0${codeHash}`;
37
+ export const staticMetadataPreevalCacheKey = (action, filename, codeHash) => `${staticCachePrefix(action)}\0${filename}\0${codeHash}`;
38
+ export const getStaticFileContentHash = (action, dependency) => {
39
+ const filename = stripQueryAndHash(dependency);
40
+ if (!isAbsolute(filename)) {
41
+ return null;
42
+ }
43
+ let stat;
44
+ try {
45
+ stat = statSync(filename);
46
+ } catch {
47
+ return null;
48
+ }
49
+ if (!stat.isFile()) {
50
+ return null;
51
+ }
52
+ const cache = staticFileHashCache(action);
53
+ const cached = cache.get(filename);
54
+ if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
55
+ return cached.hash;
56
+ }
57
+ let hash;
58
+ try {
59
+ hash = hashStaticContent(readFileSync(filename));
60
+ } catch {
61
+ return null;
62
+ }
63
+ cache.set(filename, {
64
+ hash,
65
+ mtimeMs: stat.mtimeMs,
66
+ size: stat.size
67
+ });
68
+ return hash;
69
+ };
70
+ export const collectStaticDependencyHashes = (action, dependencies) => {
71
+ const hashes = new Map();
72
+ for (const dependency of dependencies) {
73
+ const hash = getStaticFileContentHash(action, dependency);
74
+ if (!hash) {
75
+ return null;
76
+ }
77
+ hashes.set(stripQueryAndHash(dependency), hash);
78
+ }
79
+ return hashes;
80
+ };
81
+ export const areStaticDependencyHashesCurrent = (action, dependencyHashes) => {
82
+ for (const [dependency, expectedHash] of dependencyHashes) {
83
+ if (getStaticFileContentHash(action, dependency) !== expectedHash) {
84
+ return false;
85
+ }
86
+ }
87
+ return true;
88
+ };
89
+ export const getStaticExportCachedResult = (action, filename, exportedName, codeHash) => {
90
+ if (!isStaticResolveCacheEnabled()) {
91
+ return undefined;
92
+ }
93
+ const cache = staticExportResultCache(action);
94
+ const cacheKey = staticExportCacheKey(action, filename, exportedName, codeHash);
95
+ const cached = cache.get(cacheKey);
96
+ if (!cached) {
97
+ return undefined;
98
+ }
99
+ if (cached.result === null) {
100
+ // Bounded retry: until the attempt counter has been bumped enough times
101
+ // that we accept the null as stable, treat it as a cache miss so the
102
+ // caller re-walks. The counter is updated in setStaticExportCachedResult.
103
+ if (cached.attempts < STATIC_EXPORT_MAX_NULL_ATTEMPTS) {
104
+ return undefined;
105
+ }
106
+ return null;
107
+ }
108
+ if (areStaticDependencyHashesCurrent(action, cached.dependencyHashes)) {
109
+ return cached.result;
110
+ }
111
+ cache.delete(cacheKey);
112
+ return undefined;
113
+ };
114
+ export const setStaticExportCachedResult = (action, filename, exportedName, codeHash, result) => {
115
+ if (!isStaticResolveCacheEnabled()) {
116
+ return;
117
+ }
118
+ const cache = staticExportResultCache(action);
119
+ const cacheKey = staticExportCacheKey(action, filename, exportedName, codeHash);
120
+ if (!result) {
121
+ const existing = cache.get(cacheKey);
122
+ const attempts = existing && existing.result === null ? existing.attempts + 1 : 1;
123
+ cache.set(cacheKey, {
124
+ attempts,
125
+ result: null
126
+ });
127
+ return;
128
+ }
129
+ const dependencyHashes = collectStaticDependencyHashes(action, result.dependencies);
130
+ if (!dependencyHashes) {
131
+ return;
132
+ }
133
+ cache.set(cacheKey, {
134
+ dependencyHashes,
135
+ result
136
+ });
137
+ };
138
+ export const getStaticFileAnalysis = (action, filename) => {
139
+ const loadedAndParsed = action.services.loadAndParseFn(action.services, filename, undefined, action.services.log);
140
+ if (loadedAndParsed.evaluator === "ignored" || loadedAndParsed.evaluator !== oxcShaker) {
141
+ return null;
142
+ }
143
+ const { code } = loadedAndParsed;
144
+ const codeHash = hashStaticContent(code);
145
+ const cache = staticFileAnalysisCache(action);
146
+ const cacheKey = staticFileAnalysisCacheKey(action, filename, codeHash);
147
+ const cached = cache.get(cacheKey);
148
+ if (cached) {
149
+ return cached;
150
+ }
151
+ const analysis = {
152
+ code,
153
+ codeHash,
154
+ program: parseProgram(code, filename)
155
+ };
156
+ cache.set(cacheKey, analysis);
157
+ return analysis;
158
+ };
159
+ export const getStaticMetadataPreevalResult = (action, filename, code, codeHash) => {
160
+ const cache = staticMetadataPreevalCache(action);
161
+ const cacheKey = staticMetadataPreevalCacheKey(action, filename, codeHash);
162
+ const cached = cache.get(cacheKey);
163
+ if (cached) {
164
+ return cached.result;
165
+ }
166
+ const root = action.services.options.root ?? process.cwd();
167
+ try {
168
+ const result = action.services.eventEmitter.perf("transform:preeval:staticMetadata", () => runOxcPreevalStage(code, {
169
+ filename,
170
+ root
171
+ }, {
172
+ ...action.services.options.pluginOptions,
173
+ eventEmitter: action.services.eventEmitter
174
+ }));
175
+ cache.set(cacheKey, { result });
176
+ return result;
177
+ } catch {
178
+ cache.set(cacheKey, { result: null });
179
+ return null;
180
+ }
181
+ };
182
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/cache.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport { createHash } from 'crypto';\nimport { readFileSync, statSync } from 'fs';\nimport { isAbsolute } from 'path';\n\nimport { oxcShaker } from '../../../shaker';\nimport { runOxcPreevalStage } from '../../../utils/oxcPreevalStage';\nimport { stripQueryAndHash } from '../../../utils/parseRequest';\nimport type { ITransformAction } from '../../types';\nimport { isEnvDisabled, parseProgram } from './environment';\nimport type {\n StaticExportCacheEntry,\n StaticExportResult,\n StaticFileAnalysis,\n StaticFileHashCacheEntry,\n StaticMetadataPreevalCacheEntry,\n} from './types';\nimport { STATIC_EXPORT_MAX_NULL_ATTEMPTS } from './types';\n\nexport const staticFileAnalysisCaches = new WeakMap<\n object,\n Map<string, StaticFileAnalysis>\n>();\n\nexport const staticFileHashCaches = new WeakMap<\n object,\n Map<string, StaticFileHashCacheEntry>\n>();\n\nexport const staticExportResultCaches = new WeakMap<\n object,\n Map<string, StaticExportCacheEntry>\n>();\n\nexport const staticMetadataPreevalCaches = new WeakMap<\n object,\n Map<string, StaticMetadataPreevalCacheEntry>\n>();\n\nexport const hashStaticContent = (content: string | Buffer): string =>\n createHash('sha256').update(content).digest('hex');\n\nexport const getWeakCacheMap = <TValue>(\n caches: WeakMap<object, Map<string, TValue>>,\n key: object\n): Map<string, TValue> => {\n let cache = caches.get(key);\n if (!cache) {\n cache = new Map();\n caches.set(key, cache);\n }\n\n return cache;\n};\n\nexport const isStaticResolveCacheEnabled = (): boolean => {\n const envValue = process.env.WYW_STATIC_RESOLVE_CACHE?.trim().toLowerCase();\n if (envValue) {\n return !isEnvDisabled(envValue);\n }\n\n return true;\n};\n\nexport const staticCachePrefix = (action: ITransformAction): string =>\n `${action.services.cache.getKeySalt() ?? ''}\\0${\n action.services.options.root ?? ''\n }`;\n\nexport const staticFileAnalysisCache = (\n action: ITransformAction\n): Map<string, StaticFileAnalysis> =>\n getWeakCacheMap(staticFileAnalysisCaches, action.services.cache);\n\nexport const staticFileHashCache = (\n action: ITransformAction\n): Map<string, StaticFileHashCacheEntry> =>\n getWeakCacheMap(staticFileHashCaches, action.services.cache);\n\nexport const staticExportResultCache = (\n action: ITransformAction\n): Map<string, StaticExportCacheEntry> =>\n getWeakCacheMap(staticExportResultCaches, action.services.cache);\n\nexport const staticMetadataPreevalCache = (\n action: ITransformAction\n): Map<string, StaticMetadataPreevalCacheEntry> =>\n getWeakCacheMap(staticMetadataPreevalCaches, action.services.cache);\n\nexport const staticFileAnalysisCacheKey = (\n action: ITransformAction,\n filename: string,\n codeHash: string\n): string => `${staticCachePrefix(action)}\\0${filename}\\0${codeHash}`;\n\nexport const staticExportCacheKey = (\n action: ITransformAction,\n filename: string,\n exportedName: string,\n codeHash: string\n): string =>\n `${staticCachePrefix(action)}\\0${filename}\\0${exportedName}\\0${codeHash}`;\n\nexport const staticMetadataPreevalCacheKey = (\n action: ITransformAction,\n filename: string,\n codeHash: string\n): string => `${staticCachePrefix(action)}\\0${filename}\\0${codeHash}`;\n\nexport const getStaticFileContentHash = (\n action: ITransformAction,\n dependency: string\n): string | null => {\n const filename = stripQueryAndHash(dependency);\n if (!isAbsolute(filename)) {\n return null;\n }\n\n let stat;\n try {\n stat = statSync(filename);\n } catch {\n return null;\n }\n\n if (!stat.isFile()) {\n return null;\n }\n\n const cache = staticFileHashCache(action);\n const cached = cache.get(filename);\n if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {\n return cached.hash;\n }\n\n let hash: string;\n try {\n hash = hashStaticContent(readFileSync(filename));\n } catch {\n return null;\n }\n\n cache.set(filename, {\n hash,\n mtimeMs: stat.mtimeMs,\n size: stat.size,\n });\n return hash;\n};\n\nexport const collectStaticDependencyHashes = (\n action: ITransformAction,\n dependencies: string[]\n): Map<string, string> | null => {\n const hashes = new Map<string, string>();\n for (const dependency of dependencies) {\n const hash = getStaticFileContentHash(action, dependency);\n if (!hash) {\n return null;\n }\n\n hashes.set(stripQueryAndHash(dependency), hash);\n }\n\n return hashes;\n};\n\nexport const areStaticDependencyHashesCurrent = (\n action: ITransformAction,\n dependencyHashes: Map<string, string>\n): boolean => {\n for (const [dependency, expectedHash] of dependencyHashes) {\n if (getStaticFileContentHash(action, dependency) !== expectedHash) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const getStaticExportCachedResult = (\n action: ITransformAction,\n filename: string,\n exportedName: string,\n codeHash: string\n): StaticExportResult | null | undefined => {\n if (!isStaticResolveCacheEnabled()) {\n return undefined;\n }\n\n const cache = staticExportResultCache(action);\n const cacheKey = staticExportCacheKey(\n action,\n filename,\n exportedName,\n codeHash\n );\n const cached = cache.get(cacheKey);\n if (!cached) {\n return undefined;\n }\n\n if (cached.result === null) {\n // Bounded retry: until the attempt counter has been bumped enough times\n // that we accept the null as stable, treat it as a cache miss so the\n // caller re-walks. The counter is updated in setStaticExportCachedResult.\n if (cached.attempts < STATIC_EXPORT_MAX_NULL_ATTEMPTS) {\n return undefined;\n }\n return null;\n }\n\n if (areStaticDependencyHashesCurrent(action, cached.dependencyHashes)) {\n return cached.result;\n }\n\n cache.delete(cacheKey);\n return undefined;\n};\n\nexport const setStaticExportCachedResult = (\n action: ITransformAction,\n filename: string,\n exportedName: string,\n codeHash: string,\n result: StaticExportResult | null\n): void => {\n if (!isStaticResolveCacheEnabled()) {\n return;\n }\n\n const cache = staticExportResultCache(action);\n const cacheKey = staticExportCacheKey(\n action,\n filename,\n exportedName,\n codeHash\n );\n if (!result) {\n const existing = cache.get(cacheKey);\n const attempts =\n existing && existing.result === null ? existing.attempts + 1 : 1;\n cache.set(cacheKey, { attempts, result: null });\n return;\n }\n\n const dependencyHashes = collectStaticDependencyHashes(\n action,\n result.dependencies\n );\n if (!dependencyHashes) {\n return;\n }\n\n cache.set(cacheKey, {\n dependencyHashes,\n result,\n });\n};\n\nexport const getStaticFileAnalysis = (\n action: ITransformAction,\n filename: string\n): StaticFileAnalysis | null => {\n const loadedAndParsed = action.services.loadAndParseFn(\n action.services,\n filename,\n undefined,\n action.services.log\n );\n if (\n loadedAndParsed.evaluator === 'ignored' ||\n loadedAndParsed.evaluator !== oxcShaker\n ) {\n return null;\n }\n\n const { code } = loadedAndParsed;\n const codeHash = hashStaticContent(code);\n const cache = staticFileAnalysisCache(action);\n const cacheKey = staticFileAnalysisCacheKey(action, filename, codeHash);\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const analysis = {\n code,\n codeHash,\n program: parseProgram(code, filename),\n };\n cache.set(cacheKey, analysis);\n return analysis;\n};\n\nexport const getStaticMetadataPreevalResult = (\n action: ITransformAction,\n filename: string,\n code: string,\n codeHash: string\n): ReturnType<typeof runOxcPreevalStage> | null => {\n const cache = staticMetadataPreevalCache(action);\n const cacheKey = staticMetadataPreevalCacheKey(action, filename, codeHash);\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached.result;\n }\n\n const root = action.services.options.root ?? process.cwd();\n try {\n const result = action.services.eventEmitter.perf(\n 'transform:preeval:staticMetadata',\n () =>\n runOxcPreevalStage(\n code,\n {\n filename,\n root,\n },\n {\n ...action.services.options.pluginOptions,\n eventEmitter: action.services.eventEmitter,\n }\n )\n );\n cache.set(cacheKey, { result });\n return result;\n } catch {\n cache.set(cacheKey, { result: null });\n return null;\n }\n};\n"],"file":"cache.js"}
@@ -0,0 +1,146 @@
1
+ import { evaluateOxcStaticExpression, isOxcStaticSerializableValue, lookupStaticBinding } from "../../../utils/collectOxcTemplateDependencies.js";
2
+ import { resolveDependency } from "./dependencies.js";
3
+ import { debugStaticResolve, getStaticBindings } from "./environment.js";
4
+ import { resolveImportValue } from "./exportResolver.js";
5
+ import { resolveImportAsOpaqueRuntime } from "./opaqueRuntime.js";
6
+ import { bindStaticResolvedValue, isRuntimeCallbackExpression, parseStaticExpressionSource } from "./staticExpression.js";
7
+ export function* resolveCandidateValue(action, candidate, filename, memo) {
8
+ const env = new Map();
9
+ const dependencies = new Set();
10
+ const sideEffectDependencies = new Set();
11
+ const sideEffectImportLocals = new Set();
12
+ let candidateExpression;
13
+ if (candidate.inlineConstants) {
14
+ for (const [name, value] of Object.entries(candidate.inlineConstants)) {
15
+ env.set(name, value);
16
+ }
17
+ }
18
+ const staticBindingsForCandidate = getStaticBindings(action);
19
+ for (const item of candidate.imports) {
20
+ // staticBindings overrides take precedence over actual import
21
+ // resolution: a registered value (or function) replaces whatever
22
+ // the source module would otherwise provide. Useful for prototyping
23
+ // / SSR theming and for opaque utilities like `cx`.
24
+ //
25
+ // Match the override map first by the raw specifier as written
26
+ // (`@linaria/core`, `./flags`, …). If that misses, resolve to an
27
+ // absolute path and try again — this lets the host key by
28
+ // absolute file path so a single entry covers every relative
29
+ // variant of the same module.
30
+ let override = lookupStaticBinding(staticBindingsForCandidate, item.source, item.imported);
31
+ if (!override.found && staticBindingsForCandidate) {
32
+ const dep = yield* resolveDependency(action, filename, item.source, item.imported);
33
+ if (dep?.resolved) {
34
+ override = lookupStaticBinding(staticBindingsForCandidate, dep.resolved, item.imported);
35
+ }
36
+ }
37
+ if (override.found) {
38
+ env.set(item.local, override.value);
39
+ continue;
40
+ }
41
+ const resolved = yield* resolveImportValue(action, filename, item, new Set(), memo);
42
+ if (!resolved) {
43
+ debugStaticResolve(action, {
44
+ candidate: candidate.name,
45
+ filename,
46
+ imported: item.imported,
47
+ phase: "candidate",
48
+ reason: "candidate-import-unresolved",
49
+ source: item.source,
50
+ status: "rejected"
51
+ });
52
+ return null;
53
+ }
54
+ if (resolved.callable === "zero-arg" && candidateExpression === undefined) {
55
+ candidateExpression = parseStaticExpressionSource(candidate.source, filename);
56
+ }
57
+ const expressionForBinding = resolved.callable === "zero-arg" ? candidateExpression : null;
58
+ if (resolved.callable === "zero-arg" && !expressionForBinding || expressionForBinding && !bindStaticResolvedValue(env, expressionForBinding, item.local, resolved)) {
59
+ debugStaticResolve(action, {
60
+ candidate: candidate.name,
61
+ filename,
62
+ imported: item.imported,
63
+ phase: "candidate",
64
+ reason: "candidate-callable-usage-unsupported",
65
+ source: item.source,
66
+ status: "rejected"
67
+ });
68
+ return null;
69
+ }
70
+ if (!expressionForBinding) {
71
+ env.set(item.local, resolved.value);
72
+ }
73
+ resolved.dependencies.forEach((dependency) => dependencies.add(dependency));
74
+ resolved.sideEffectDependencies?.forEach((dependency) => {
75
+ sideEffectDependencies.add(dependency);
76
+ sideEffectImportLocals.add(item.importLocal ?? item.local);
77
+ });
78
+ }
79
+ if (candidateExpression === undefined) {
80
+ candidateExpression = parseStaticExpressionSource(candidate.source, filename);
81
+ }
82
+ const value = evaluateOxcStaticExpression(candidate.source, filename, env, getStaticBindings(action));
83
+ // Function-valued candidates are runtime callbacks (e.g. styled-
84
+ // component dynamic prop interpolations like `${props => ...}`). The
85
+ // value isn't serializable, but the candidate IS resolved — the
86
+ // local `_exp = () => target` arrow already lives in the bundle, so
87
+ // the file does not need evalFile to compute it. Mark the result as
88
+ // runtimeOnly so the helper declaration survives pruning.
89
+ if (typeof value === "function" || value === undefined && isRuntimeCallbackExpression(candidateExpression)) {
90
+ debugStaticResolve(action, {
91
+ candidate: candidate.name,
92
+ filename,
93
+ phase: "candidate",
94
+ reason: "runtime-callback",
95
+ status: "resolved"
96
+ });
97
+ return {
98
+ dependencies: [...dependencies],
99
+ runtimeOnly: true,
100
+ sideEffectDependencies: [...sideEffectDependencies],
101
+ sideEffectImportLocals: [...sideEffectImportLocals],
102
+ value
103
+ };
104
+ }
105
+ if (!isOxcStaticSerializableValue(value)) {
106
+ debugStaticResolve(action, {
107
+ candidate: candidate.name,
108
+ filename,
109
+ phase: "candidate",
110
+ reason: "candidate-expression-non-serializable",
111
+ status: "rejected"
112
+ });
113
+ return null;
114
+ }
115
+ debugStaticResolve(action, {
116
+ candidate: candidate.name,
117
+ filename,
118
+ phase: "candidate",
119
+ status: "resolved"
120
+ });
121
+ return {
122
+ dependencies: [...dependencies],
123
+ sideEffectDependencies: [...sideEffectDependencies],
124
+ sideEffectImportLocals: [...sideEffectImportLocals],
125
+ value
126
+ };
127
+ }
128
+ export function* resolveOpaqueRuntimeCandidateValue(action, candidate, filename) {
129
+ if (candidate.imports.length === 0) {
130
+ return null;
131
+ }
132
+ const dependencies = new Set();
133
+ const memo = new Map();
134
+ for (const item of candidate.imports) {
135
+ const proof = yield* resolveImportAsOpaqueRuntime(action, filename, item, new Set(), memo);
136
+ if (!proof) {
137
+ return null;
138
+ }
139
+ proof.dependencies.forEach((dependency) => dependencies.add(dependency));
140
+ }
141
+ return {
142
+ dependencies: [...dependencies],
143
+ value: null
144
+ };
145
+ }
146
+ //# sourceMappingURL=candidateResolver.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/candidateResolver.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport type { Expression } from 'oxc-parser';\n\nimport {\n evaluateOxcStaticExpression,\n isOxcStaticSerializableValue,\n lookupStaticBinding,\n type OxcStaticValueCandidate,\n} from '../../../utils/collectOxcTemplateDependencies';\nimport type { ITransformAction, SyncScenarioFor } from '../../types';\nimport { resolveDependency } from './dependencies';\nimport { debugStaticResolve, getStaticBindings } from './environment';\nimport { resolveImportValue } from './exportResolver';\nimport { resolveImportAsOpaqueRuntime } from './opaqueRuntime';\nimport {\n bindStaticResolvedValue,\n isRuntimeCallbackExpression,\n parseStaticExpressionSource,\n} from './staticExpression';\nimport type { OpaqueRuntimeImportProof, StaticExportResult } from './types';\n\nexport function* resolveCandidateValue(\n action: ITransformAction,\n candidate: OxcStaticValueCandidate,\n filename: string,\n memo: Map<string, StaticExportResult | null>\n): SyncScenarioFor<StaticExportResult | null> {\n const env = new Map<string, unknown>();\n const dependencies = new Set<string>();\n const sideEffectDependencies = new Set<string>();\n const sideEffectImportLocals = new Set<string>();\n let candidateExpression: Expression | null | undefined;\n\n if (candidate.inlineConstants) {\n for (const [name, value] of Object.entries(candidate.inlineConstants)) {\n env.set(name, value);\n }\n }\n\n const staticBindingsForCandidate = getStaticBindings(action);\n\n for (const item of candidate.imports) {\n // staticBindings overrides take precedence over actual import\n // resolution: a registered value (or function) replaces whatever\n // the source module would otherwise provide. Useful for prototyping\n // / SSR theming and for opaque utilities like `cx`.\n //\n // Match the override map first by the raw specifier as written\n // (`@linaria/core`, `./flags`, …). If that misses, resolve to an\n // absolute path and try again — this lets the host key by\n // absolute file path so a single entry covers every relative\n // variant of the same module.\n let override = lookupStaticBinding(\n staticBindingsForCandidate,\n item.source,\n item.imported\n );\n if (!override.found && staticBindingsForCandidate) {\n const dep = yield* resolveDependency(\n action,\n filename,\n item.source,\n item.imported\n );\n if (dep?.resolved) {\n override = lookupStaticBinding(\n staticBindingsForCandidate,\n dep.resolved,\n item.imported\n );\n }\n }\n if (override.found) {\n env.set(item.local, override.value);\n continue;\n }\n\n const resolved = yield* resolveImportValue(\n action,\n filename,\n item,\n new Set(),\n memo\n );\n if (!resolved) {\n debugStaticResolve(action, {\n candidate: candidate.name,\n filename,\n imported: item.imported,\n phase: 'candidate',\n reason: 'candidate-import-unresolved',\n source: item.source,\n status: 'rejected',\n });\n return null;\n }\n\n if (resolved.callable === 'zero-arg' && candidateExpression === undefined) {\n candidateExpression = parseStaticExpressionSource(\n candidate.source,\n filename\n );\n }\n\n const expressionForBinding =\n resolved.callable === 'zero-arg' ? candidateExpression : null;\n if (\n (resolved.callable === 'zero-arg' && !expressionForBinding) ||\n (expressionForBinding &&\n !bindStaticResolvedValue(\n env,\n expressionForBinding,\n item.local,\n resolved\n ))\n ) {\n debugStaticResolve(action, {\n candidate: candidate.name,\n filename,\n imported: item.imported,\n phase: 'candidate',\n reason: 'candidate-callable-usage-unsupported',\n source: item.source,\n status: 'rejected',\n });\n return null;\n }\n\n if (!expressionForBinding) {\n env.set(item.local, resolved.value);\n }\n\n resolved.dependencies.forEach((dependency) => dependencies.add(dependency));\n resolved.sideEffectDependencies?.forEach((dependency) => {\n sideEffectDependencies.add(dependency);\n sideEffectImportLocals.add(item.importLocal ?? item.local);\n });\n }\n\n if (candidateExpression === undefined) {\n candidateExpression = parseStaticExpressionSource(\n candidate.source,\n filename\n );\n }\n\n const value = evaluateOxcStaticExpression(\n candidate.source,\n filename,\n env,\n getStaticBindings(action)\n );\n // Function-valued candidates are runtime callbacks (e.g. styled-\n // component dynamic prop interpolations like `${props => ...}`). The\n // value isn't serializable, but the candidate IS resolved — the\n // local `_exp = () => target` arrow already lives in the bundle, so\n // the file does not need evalFile to compute it. Mark the result as\n // runtimeOnly so the helper declaration survives pruning.\n if (\n typeof value === 'function' ||\n (value === undefined && isRuntimeCallbackExpression(candidateExpression))\n ) {\n debugStaticResolve(action, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n reason: 'runtime-callback',\n status: 'resolved',\n });\n return {\n dependencies: [...dependencies],\n runtimeOnly: true,\n sideEffectDependencies: [...sideEffectDependencies],\n sideEffectImportLocals: [...sideEffectImportLocals],\n value,\n };\n }\n\n if (!isOxcStaticSerializableValue(value)) {\n debugStaticResolve(action, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n reason: 'candidate-expression-non-serializable',\n status: 'rejected',\n });\n return null;\n }\n\n debugStaticResolve(action, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n status: 'resolved',\n });\n\n return {\n dependencies: [...dependencies],\n sideEffectDependencies: [...sideEffectDependencies],\n sideEffectImportLocals: [...sideEffectImportLocals],\n value,\n };\n}\n\nexport function* resolveOpaqueRuntimeCandidateValue(\n action: ITransformAction,\n candidate: OxcStaticValueCandidate,\n filename: string\n): SyncScenarioFor<StaticExportResult | null> {\n if (candidate.imports.length === 0) {\n return null;\n }\n\n const dependencies = new Set<string>();\n const memo = new Map<string, OpaqueRuntimeImportProof | null>();\n\n for (const item of candidate.imports) {\n const proof = yield* resolveImportAsOpaqueRuntime(\n action,\n filename,\n item,\n new Set(),\n memo\n );\n if (!proof) {\n return null;\n }\n\n proof.dependencies.forEach((dependency) => dependencies.add(dependency));\n }\n\n return {\n dependencies: [...dependencies],\n value: null,\n };\n}\n"],"file":"candidateResolver.js"}
@@ -0,0 +1,33 @@
1
+ /* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */
2
+ import { Entrypoint } from "../../Entrypoint.js";
3
+ import { getWeakCacheMap } from "./cache.js";
4
+ export const isRelativeSource = (source) => source.startsWith("./") || source.startsWith("../") || source === "." || source === "..";
5
+ export const dependencyResolutionCaches = new WeakMap();
6
+ // Bare package and alias resolution can depend on the importer through nested
7
+ // packages, package boundaries, tsconfig paths, or bundler aliases.
8
+ export const dependencyResolutionCacheKey = (importer, source, imported) => `${importer}\0${source}\0${imported}`;
9
+ export function* resolveDependency(action, importer, source, imported) {
10
+ const entrypoint = importer === action.entrypoint.name ? action.entrypoint : Entrypoint.createRoot(action.services, importer, [imported], undefined);
11
+ const imports = new Map([[source, [imported]]]);
12
+ const [resolved] = yield* action.getNext("resolveImports", entrypoint, {
13
+ imports,
14
+ phase: "initial"
15
+ });
16
+ // Non-relative sources (package names, aliases) can still be importer-
17
+ // dependent because of nested packages, tsconfig boundaries, and bundler
18
+ // aliases. Cache only within the same importer context.
19
+ if (!isRelativeSource(source)) {
20
+ const cache = getWeakCacheMap(dependencyResolutionCaches, action.services.cache);
21
+ const cacheKey = dependencyResolutionCacheKey(importer, source, imported);
22
+ if (resolved?.resolved) {
23
+ cache.set(cacheKey, resolved);
24
+ return resolved;
25
+ }
26
+ const cached = cache.get(cacheKey);
27
+ if (cached?.resolved) {
28
+ return cached;
29
+ }
30
+ }
31
+ return resolved ?? null;
32
+ }
33
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"mappings":";AAEA,SAAS,kBAAkB;AAG3B,SAAS,uBAAuB;AAEhC,OAAO,MAAM,oBAAoB,WAC/B,OAAO,WAAW,KAAK,IACvB,OAAO,WAAW,MAAM,IACxB,WAAW,OACX,WAAW;AAEb,OAAO,MAAM,6BAA6B,IAAI,SAG3C;;;AAIH,OAAO,MAAM,gCACX,UACA,QACA,aACW,GAAG,SAAS,IAAI,OAAO,IAAI;AAExC,OAAO,UAAU,kBACf,QACA,UACA,QACA,UAC+C;CAC/C,MAAM,aACJ,aAAa,OAAO,WAAW,OAC3B,OAAO,aACP,WAAW,WAAW,OAAO,UAAU,UAAU,CAAC,SAAS,EAAE,UAAU;CAC7E,MAAM,UAAU,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;CAC/C,MAAM,CAAC,YAAY,OAAO,OAAO,QAAQ,kBAAkB,YAAY;EACrE;EACA,OAAO;EACR,CAAC;;;;AAKF,KAAI,CAAC,iBAAiB,OAAO,EAAE;EAC7B,MAAM,QAAQ,gBACZ,4BACA,OAAO,SAAS,MACjB;EACD,MAAM,WAAW,6BAA6B,UAAU,QAAQ,SAAS;AACzE,MAAI,UAAU,UAAU;AACtB,SAAM,IAAI,UAAU,SAAS;AAC7B,UAAO;;EAGT,MAAM,SAAS,MAAM,IAAI,SAAS;AAClC,MAAI,QAAQ,UAAU;AACpB,UAAO;;;AAIX,QAAO,YAAY","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/dependencies.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport { Entrypoint } from '../../Entrypoint';\nimport type { IEntrypointDependency } from '../../Entrypoint.types';\nimport type { ITransformAction, SyncScenarioFor } from '../../types';\nimport { getWeakCacheMap } from './cache';\n\nexport const isRelativeSource = (source: string): boolean =>\n source.startsWith('./') ||\n source.startsWith('../') ||\n source === '.' ||\n source === '..';\n\nexport const dependencyResolutionCaches = new WeakMap<\n object,\n Map<string, IEntrypointDependency>\n>();\n\n// Bare package and alias resolution can depend on the importer through nested\n// packages, package boundaries, tsconfig paths, or bundler aliases.\nexport const dependencyResolutionCacheKey = (\n importer: string,\n source: string,\n imported: string\n): string => `${importer}\\0${source}\\0${imported}`;\n\nexport function* resolveDependency(\n action: ITransformAction,\n importer: string,\n source: string,\n imported: string\n): SyncScenarioFor<IEntrypointDependency | null> {\n const entrypoint =\n importer === action.entrypoint.name\n ? action.entrypoint\n : Entrypoint.createRoot(action.services, importer, [imported], undefined);\n const imports = new Map([[source, [imported]]]);\n const [resolved] = yield* action.getNext('resolveImports', entrypoint, {\n imports,\n phase: 'initial',\n });\n\n // Non-relative sources (package names, aliases) can still be importer-\n // dependent because of nested packages, tsconfig boundaries, and bundler\n // aliases. Cache only within the same importer context.\n if (!isRelativeSource(source)) {\n const cache = getWeakCacheMap(\n dependencyResolutionCaches,\n action.services.cache\n );\n const cacheKey = dependencyResolutionCacheKey(importer, source, imported);\n if (resolved?.resolved) {\n cache.set(cacheKey, resolved);\n return resolved;\n }\n\n const cached = cache.get(cacheKey);\n if (cached?.resolved) {\n return cached;\n }\n }\n\n return resolved ?? null;\n}\n"],"file":"dependencies.js"}
@@ -0,0 +1,29 @@
1
+ /* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */
2
+ import { isAbsolute, relative } from "path";
3
+ import { parseOxcProgram } from "../../../utils/oxc/parse.js";
4
+ import { stripQueryAndHash } from "../../../utils/parseRequest.js";
5
+ export const isInsideRoot = (filename, root) => {
6
+ const relativePath = relative(root, filename);
7
+ return relativePath === "" || !!relativePath && !relativePath.startsWith("..") && !isAbsolute(relativePath);
8
+ };
9
+ export const nodeModulesPattern = /[\\/]node_modules[\\/]/;
10
+ export const isLocalStaticMetadataFile = (filename, root) => {
11
+ const strippedFilename = stripQueryAndHash(filename);
12
+ if (isInsideRoot(strippedFilename, root)) {
13
+ return true;
14
+ }
15
+ return isAbsolute(strippedFilename) && !nodeModulesPattern.test(strippedFilename);
16
+ };
17
+ export const isEnvDisabled = (value) => value === "0" || value === "false" || value === "no" || value === "off";
18
+ export const getEvalStrategy = (action) => action.services.options.pluginOptions.eval?.strategy ?? "execute";
19
+ export const getStaticStrategyFailure = (filename, dependencyNames) => new Error(`[wyw-in-js] eval.strategy: "static" cannot fall back to the build-time evaluator for ${filename}. ` + `Unresolved values: ${[...dependencyNames].join(", ")}.`);
20
+ export const debugStaticResolve = (action, event) => {
21
+ const labels = Object.fromEntries(Object.entries({
22
+ ...event,
23
+ type: "staticResolve"
24
+ }).filter(([, value]) => value !== undefined));
25
+ action.services.eventEmitter.single(labels);
26
+ };
27
+ export const parseProgram = (code, filename) => parseOxcProgram(code, filename, "unambiguous");
28
+ export const getStaticBindings = (action) => action.services.options.pluginOptions?.staticBindings;
29
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"mappings":";AAEA,SAAS,YAAY,gBAAgB;AAIrC,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAIlC,OAAO,MAAM,gBAAgB,UAAkB,SAA0B;CACvE,MAAM,eAAe,SAAS,MAAM,SAAS;AAC7C,QACE,iBAAiB,MAChB,CAAC,CAAC,gBACD,CAAC,aAAa,WAAW,KAAK,IAC9B,CAAC,WAAW,aAAa;;AAI/B,OAAO,MAAM,qBAAqB;AAElC,OAAO,MAAM,6BACX,UACA,SACY;CACZ,MAAM,mBAAmB,kBAAkB,SAAS;AACpD,KAAI,aAAa,kBAAkB,KAAK,EAAE;AACxC,SAAO;;AAGT,QACE,WAAW,iBAAiB,IAAI,CAAC,mBAAmB,KAAK,iBAAiB;;AAI9E,OAAO,MAAM,iBAAiB,UAC5B,UAAU,OAAO,UAAU,WAAW,UAAU,QAAQ,UAAU;AAEpE,OAAO,MAAM,mBAAmB,WAC9B,OAAO,SAAS,QAAQ,cAAc,MAAM,YAAY;AAE1D,OAAO,MAAM,4BACX,UACA,oBAEA,IAAI,MACF,wFAAwF,SAAS,MAC/F,sBAAsB,CAAC,GAAG,gBAAgB,CAAC,KAAK,KAAK,CAAC,GACzD;AAEH,OAAO,MAAM,sBACX,QACA,UACS;CACT,MAAM,SAAS,OAAO,YACpB,OAAO,QAAQ;EACb,GAAG;EACH,MAAM;EACP,CAAC,CAAC,QAAQ,GAAG,WAAW,UAAU,UAAU,CAC9C;AAED,QAAO,SAAS,aAAa,OAAO,OAAO;;AAG7C,OAAO,MAAM,gBAAgB,MAAc,aACzC,gBAAgB,MAAM,UAAU,cAAc;AAEhD,OAAO,MAAM,qBACX,WAEA,OAAO,SAAS,QAAQ,eAAe","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/environment.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport { isAbsolute, relative } from 'path';\n\nimport type { Program } from 'oxc-parser';\n\nimport { parseOxcProgram } from '../../../utils/oxc/parse';\nimport { stripQueryAndHash } from '../../../utils/parseRequest';\nimport type { ITransformAction } from '../../types';\nimport type { StaticResolveDebugEvent } from './types';\n\nexport const isInsideRoot = (filename: string, root: string): boolean => {\n const relativePath = relative(root, filename);\n return (\n relativePath === '' ||\n (!!relativePath &&\n !relativePath.startsWith('..') &&\n !isAbsolute(relativePath))\n );\n};\n\nexport const nodeModulesPattern = /[\\\\/]node_modules[\\\\/]/;\n\nexport const isLocalStaticMetadataFile = (\n filename: string,\n root: string\n): boolean => {\n const strippedFilename = stripQueryAndHash(filename);\n if (isInsideRoot(strippedFilename, root)) {\n return true;\n }\n\n return (\n isAbsolute(strippedFilename) && !nodeModulesPattern.test(strippedFilename)\n );\n};\n\nexport const isEnvDisabled = (value: string): boolean =>\n value === '0' || value === 'false' || value === 'no' || value === 'off';\n\nexport const getEvalStrategy = (action: ITransformAction) =>\n action.services.options.pluginOptions.eval?.strategy ?? 'execute';\n\nexport const getStaticStrategyFailure = (\n filename: string,\n dependencyNames: Iterable<string>\n): Error =>\n new Error(\n `[wyw-in-js] eval.strategy: \"static\" cannot fall back to the build-time evaluator for ${filename}. ` +\n `Unresolved values: ${[...dependencyNames].join(', ')}.`\n );\n\nexport const debugStaticResolve = (\n action: ITransformAction,\n event: StaticResolveDebugEvent\n): void => {\n const labels = Object.fromEntries(\n Object.entries({\n ...event,\n type: 'staticResolve',\n }).filter(([, value]) => value !== undefined)\n );\n\n action.services.eventEmitter.single(labels);\n};\n\nexport const parseProgram = (code: string, filename: string): Program =>\n parseOxcProgram(code, filename, 'unambiguous');\n\nexport const getStaticBindings = (\n action: ITransformAction\n): Record<string, Record<string, unknown>> | undefined =>\n action.services.options.pluginOptions?.staticBindings;\n"],"file":"environment.js"}