@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
package/esm/cache.js CHANGED
@@ -287,7 +287,14 @@ export class TransformCacheCollection {
287
287
  return true;
288
288
  }
289
289
  // A cached file without a cached entrypoint was invalidated earlier.
290
+ // If the caller forced a content check and the content hash is stable,
291
+ // the missing entrypoint is only cache churn and must not invalidate
292
+ // output-dependent parents.
290
293
  if (!cachedEntrypoint && nestedDependencies.size === 0) {
294
+ if (forceContentCheck && this.contentHashes.get(dependencyFilename)?.fs !== undefined) {
295
+ dependencyChangeMemo.set(dependencyFilename, false);
296
+ return false;
297
+ }
291
298
  dependencyChangeMemo.set(dependencyFilename, true);
292
299
  return true;
293
300
  }
package/esm/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../src/cache.ts"],"version":3,"sourcesContent":["import { createHash } from 'crypto';\nimport fs from 'node:fs';\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { BarrelManifestCacheEntry } from './transform/barrelManifest.types';\nimport type { Entrypoint } from './transform/Entrypoint';\nimport type { IEvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nimport { getFileIdx } from './utils/getFileIdx';\nimport { stripQueryAndHash } from './utils/parseRequest';\n\nfunction hashContent(content: string) {\n return createHash('sha256').update(content).digest('hex');\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { code } = error as NodeJS.ErrnoException;\n return code === 'ENOENT' || code === 'ENOTDIR';\n}\n\ninterface IBaseCachedEntrypoint {\n dependencies: Map<string, { resolved: string | null }>;\n initialCode?: string;\n invalidateOnDependencyChange?: Set<string>;\n invalidationDependencies?: Map<string, { resolved: string | null }>;\n}\n\ninterface ICaches<TEntrypoint extends IBaseCachedEntrypoint> {\n barrelManifests: Map<string, BarrelManifestCacheEntry>;\n entrypoints: Map<string, TEntrypoint>;\n exports: Map<string, string[]>;\n}\n\ntype MapValue<T> = T extends Map<string, infer V> ? V : never;\n\nconst cacheLogger = logger.extend('cache');\n\nconst cacheNames = ['barrelManifests', 'entrypoints', 'exports'] as const;\ntype CacheNames = (typeof cacheNames)[number];\n\nconst loggers = cacheNames.reduce(\n (acc, key) => ({\n ...acc,\n [key]: cacheLogger.extend(key),\n }),\n {} as Record<CacheNames, typeof logger>\n);\n\nexport class TransformCacheCollection<\n TEntrypoint extends IBaseCachedEntrypoint = Entrypoint | IEvaluatedEntrypoint,\n> {\n public readonly barrelManifests: Map<string, BarrelManifestCacheEntry>;\n\n public readonly entrypoints: Map<string, TEntrypoint>;\n\n public readonly exports: Map<string, string[]>;\n\n private readonly barrelManifestDependencies = new Map<string, Set<string>>();\n\n private contentHashes = new Map<string, { fs?: string; loaded?: string }>();\n\n private fileMtimes = new Map<string, number>();\n\n private readonly exportDependencies = new Map<string, Set<string>>();\n\n private keySalt: string | null = null;\n\n private invalidatedFiles = new Map<string, number>();\n\n private consumedInvalidationVersions = new Map<string, number>();\n\n constructor(caches: Partial<ICaches<TEntrypoint>> = {}) {\n this.barrelManifests = caches.barrelManifests || new Map();\n this.entrypoints = caches.entrypoints || new Map();\n this.exports = caches.exports || new Map();\n }\n\n public setKeySalt(keySalt: string | null) {\n if (this.keySalt === keySalt) return;\n\n const prevKeySalt = this.keySalt;\n this.keySalt = keySalt;\n\n if (prevKeySalt === null && keySalt) {\n const migrate = <TValue>(cache: Map<string, TValue>) => {\n const entries = Array.from(cache.entries());\n cache.clear();\n entries.forEach(([key, value]) => {\n cache.set(this.getKey(key), value);\n });\n };\n\n migrate(this.barrelManifests);\n migrate(this.entrypoints);\n migrate(this.exports);\n migrate(this.barrelManifestDependencies);\n migrate(this.exportDependencies);\n return;\n }\n\n this.barrelManifests.clear();\n this.entrypoints.clear();\n this.exports.clear();\n this.clearCacheDependencies('all');\n }\n\n private getKey(key: string) {\n if (!this.keySalt) return key;\n return `${key}::${this.keySalt}`;\n }\n\n public getKeySalt() {\n return this.keySalt;\n }\n\n public add<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string, value: TValue): void {\n const cache = this[cacheName] as Map<string, TValue>;\n const cacheKey = this.getKey(key);\n loggers[cacheName]('%s:add %s %f', getFileIdx(key), key, () => {\n if (value === undefined) {\n return cache.has(cacheKey) ? 'removed' : 'noop';\n }\n\n if (!cache.has(cacheKey)) {\n return 'added';\n }\n\n return cache.get(cacheKey) === value ? 'unchanged' : 'updated';\n });\n\n if (value === undefined) {\n cache.delete(cacheKey);\n this.contentHashes.delete(key);\n this.clearCacheDependencies(cacheName, key);\n return;\n }\n\n this.clearCacheDependencies(cacheName, key);\n cache.set(cacheKey, value);\n\n if ('initialCode' in value) {\n const maybeOriginalCode = (value as unknown as { originalCode?: unknown })\n .originalCode;\n const isLoaded = typeof value.initialCode === 'string';\n const source = isLoaded ? 'loaded' : 'fs';\n\n let resolvedCode: string | undefined;\n if (isLoaded) {\n resolvedCode = value.initialCode;\n } else if (typeof maybeOriginalCode === 'string') {\n resolvedCode = maybeOriginalCode;\n }\n\n if (resolvedCode !== undefined) {\n this.setContentHash(key, source, hashContent(resolvedCode));\n return;\n }\n\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, source, hashContent(fileContent));\n } catch {\n this.setContentHash(key, source, hashContent(''));\n }\n\n return;\n }\n\n if (cacheName === 'barrelManifests' || cacheName === 'exports') {\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, 'fs', hashContent(fileContent));\n } catch {\n this.setContentHash(key, 'fs', hashContent(''));\n }\n }\n }\n\n public clear(cacheName: CacheNames | 'all'): void {\n if (cacheName === 'all') {\n cacheNames.forEach((name) => {\n this.clear(name);\n });\n\n return;\n }\n\n loggers[cacheName]('clear');\n const cache = this[cacheName] as Map<string, unknown>;\n\n cache.clear();\n this.clearCacheDependencies(cacheName);\n }\n\n public delete(cacheName: CacheNames, key: string): void {\n this.invalidate(cacheName, key);\n }\n\n public get<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string): TValue | undefined {\n const cache = this[cacheName] as Map<string, TValue>;\n const res = cache.get(this.getKey(key));\n\n loggers[cacheName]('get', key, res === undefined ? 'miss' : 'hit');\n return res;\n }\n\n public has(cacheName: CacheNames, key: string): boolean {\n const cache = this[cacheName] as Map<string, unknown>;\n const res = cache.has(this.getKey(key));\n\n loggers[cacheName]('has', key, res);\n return res;\n }\n\n public invalidate(cacheName: CacheNames, key: string): void {\n const cache = this[cacheName] as Map<string, unknown>;\n const cacheKey = this.getKey(key);\n\n if (!cache.has(cacheKey)) {\n return;\n }\n\n loggers[cacheName]('invalidate', key);\n\n cache.delete(cacheKey);\n this.clearCacheDependencies(cacheName, key);\n }\n\n public invalidateForFile(filename: string) {\n cacheNames.forEach((cacheName) => {\n this.invalidate(cacheName, filename);\n });\n\n const key = stripQueryAndHash(filename);\n const version = this.invalidatedFiles.get(key) ?? 0;\n this.invalidatedFiles.set(key, version + 1);\n }\n\n public consumeInvalidation(filename: string) {\n const key = stripQueryAndHash(filename);\n const invalidationVersion = this.invalidatedFiles.get(key);\n\n if (invalidationVersion === undefined) {\n return false;\n }\n\n const consumedVersion =\n this.consumedInvalidationVersions.get(filename) ?? 0;\n if (consumedVersion >= invalidationVersion) {\n return false;\n }\n\n this.consumedInvalidationVersions.set(filename, invalidationVersion);\n return true;\n }\n\n public invalidateIfChanged(\n filename: string,\n content: string,\n previousVisitedFiles?: Set<string>,\n source: 'fs' | 'loaded' = 'loaded',\n changedFiles = new Set<string>(),\n dependencyChangeMemo = new Map<string, boolean>(),\n forceContentCheck = false\n ) {\n if (changedFiles.has(filename)) {\n return true;\n }\n\n const visitedFiles = new Set(previousVisitedFiles);\n const fileEntrypoint = this.get('entrypoints', filename);\n let anyDepChanged = false;\n\n if (\n !visitedFiles.has(filename) &&\n (fileEntrypoint || this.hasCachedDependencies(filename))\n ) {\n visitedFiles.add(filename);\n const invalidateOnDependencyChange =\n fileEntrypoint?.invalidateOnDependencyChange;\n const dependenciesToCheck = this.getDependenciesToCheck(\n filename,\n fileEntrypoint\n );\n\n for (const [, dependency] of dependenciesToCheck) {\n const dependencyFilename = dependency.resolved;\n\n if (dependencyFilename) {\n const dependencyChanged = this.didDependencyChange(\n dependencyFilename,\n visitedFiles,\n changedFiles,\n dependencyChangeMemo,\n forceContentCheck ||\n invalidateOnDependencyChange?.has(dependencyFilename) ||\n false\n );\n\n if (\n dependencyChanged &&\n invalidateOnDependencyChange?.has(dependencyFilename)\n ) {\n cacheLogger(\n 'dependency affecting output has changed, invalidate all for %s',\n filename\n );\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n if (dependencyChanged) {\n anyDepChanged = true;\n }\n }\n }\n }\n\n const existing = this.contentHashes.get(filename);\n const previousHash = existing?.[source];\n const newHash = hashContent(content);\n\n if (previousHash === undefined) {\n const otherSource = source === 'fs' ? 'loaded' : 'fs';\n const otherHash = existing?.[otherSource];\n\n if ((otherHash !== undefined && otherHash !== newHash) || anyDepChanged) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n this.setContentHash(filename, source, newHash);\n\n if (anyDepChanged) {\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n return true;\n }\n\n return false;\n }\n\n if (previousHash !== newHash || anyDepChanged) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n return false;\n }\n\n private getDependenciesToCheck(\n filename: string,\n fileEntrypoint?: TEntrypoint\n ): Map<string, { resolved: string | null }> {\n const dependenciesToCheck = new Map<string, { resolved: string | null }>();\n\n for (const [key, dependency] of fileEntrypoint?.dependencies ?? []) {\n dependenciesToCheck.set(key, dependency);\n }\n\n for (const [key, dependency] of fileEntrypoint?.invalidationDependencies ??\n []) {\n if (!dependenciesToCheck.has(key)) {\n dependenciesToCheck.set(key, dependency);\n }\n }\n\n for (const dependencyFilename of this.getCachedDependencies(filename)) {\n if (\n ![...dependenciesToCheck.values()].some(\n (dependency) => dependency.resolved === dependencyFilename\n )\n ) {\n dependenciesToCheck.set(dependencyFilename, {\n resolved: dependencyFilename,\n });\n }\n }\n\n return dependenciesToCheck;\n }\n\n private didDependencyChange(\n dependencyFilename: string,\n visitedFiles: Set<string>,\n changedFiles: Set<string>,\n dependencyChangeMemo: Map<string, boolean>,\n forceContentCheck = false\n ): boolean {\n if (changedFiles.has(dependencyFilename)) {\n return true;\n }\n\n const memoized = dependencyChangeMemo.get(dependencyFilename);\n if (memoized !== undefined) {\n return memoized;\n }\n\n if (visitedFiles.has(dependencyFilename)) {\n return false;\n }\n\n const strippedDependencyFilename = stripQueryAndHash(dependencyFilename);\n const cachedMtime = this.fileMtimes.get(dependencyFilename);\n const cachedEntrypoint = this.get('entrypoints', dependencyFilename);\n\n if (cachedMtime !== undefined) {\n let currentMtime: number;\n\n try {\n currentMtime = fs.statSync(strippedDependencyFilename).mtimeMs;\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(dependencyFilename);\n changedFiles.add(dependencyFilename);\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n\n if (currentMtime === cachedMtime) {\n const nestedDependencies = this.getDependenciesToCheck(\n dependencyFilename,\n cachedEntrypoint\n );\n\n if (\n forceContentCheck &&\n this.didFileContentHashChange(\n dependencyFilename,\n strippedDependencyFilename,\n changedFiles\n )\n ) {\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n\n // A cached file without a cached entrypoint was invalidated earlier.\n if (!cachedEntrypoint && nestedDependencies.size === 0) {\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n\n if (nestedDependencies.size === 0) {\n dependencyChangeMemo.set(dependencyFilename, false);\n return false;\n }\n\n const nextVisitedFiles = new Set(visitedFiles);\n nextVisitedFiles.add(dependencyFilename);\n\n for (const [, nestedDependency] of nestedDependencies) {\n if (\n nestedDependency.resolved &&\n this.didDependencyChange(\n nestedDependency.resolved,\n nextVisitedFiles,\n changedFiles,\n dependencyChangeMemo,\n forceContentCheck\n )\n ) {\n this.invalidateForFile(dependencyFilename);\n changedFiles.add(dependencyFilename);\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n }\n\n dependencyChangeMemo.set(dependencyFilename, false);\n return false;\n }\n }\n\n let dependencyContent: string;\n\n try {\n dependencyContent = fs.readFileSync(strippedDependencyFilename, 'utf8');\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(dependencyFilename);\n changedFiles.add(dependencyFilename);\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n\n const invalidated = this.invalidateIfChanged(\n dependencyFilename,\n dependencyContent,\n visitedFiles,\n 'fs',\n changedFiles,\n dependencyChangeMemo,\n forceContentCheck\n );\n\n dependencyChangeMemo.set(dependencyFilename, invalidated);\n return invalidated;\n }\n\n private didFileContentHashChange(\n filename: string,\n strippedFilename: string,\n changedFiles: Set<string>\n ): boolean {\n const previousHash = this.contentHashes.get(filename)?.fs;\n if (previousHash === undefined) {\n return false;\n }\n\n let content: string;\n try {\n content = fs.readFileSync(strippedFilename, 'utf8');\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n return true;\n }\n\n const nextHash = hashContent(content);\n if (previousHash === nextHash) {\n return false;\n }\n\n this.setContentHash(filename, 'fs', nextHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n return true;\n }\n\n public setCacheDependencies(\n cacheName: 'barrelManifests' | 'exports',\n key: string,\n dependencies: Iterable<string>\n ): void {\n const cache = this.getDependencyCache(cacheName);\n const nextDependencies = new Set(\n [...dependencies].filter((dependency) => dependency.length > 0)\n );\n const cacheKey = this.getKey(key);\n\n if (nextDependencies.size === 0) {\n cache.delete(cacheKey);\n return;\n }\n\n cache.set(cacheKey, nextDependencies);\n }\n\n /**\n * Fast check if a file changed on disk since last seen.\n * Uses mtime as a fast path and only reads the file if mtime differs.\n */\n public checkFreshness(filename: string, strippedFilename: string): boolean {\n try {\n const currentMtime = fs.statSync(strippedFilename).mtimeMs;\n const cachedMtime = this.fileMtimes.get(filename);\n\n if (cachedMtime !== undefined && currentMtime === cachedMtime) {\n return false;\n }\n\n const content = fs.readFileSync(strippedFilename, 'utf8');\n this.fileMtimes.set(filename, currentMtime);\n\n if (this.invalidateIfChanged(filename, content, undefined, 'fs')) {\n return true;\n }\n\n return false;\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(filename);\n return true;\n }\n }\n\n private clearCacheDependencies(cacheName: CacheNames | 'all', key?: string) {\n if (cacheName === 'all') {\n this.barrelManifestDependencies.clear();\n this.exportDependencies.clear();\n return;\n }\n\n if (cacheName === 'barrelManifests') {\n if (key === undefined) {\n this.barrelManifestDependencies.clear();\n } else {\n this.barrelManifestDependencies.delete(this.getKey(key));\n }\n return;\n }\n\n if (cacheName === 'exports') {\n if (key === undefined) {\n this.exportDependencies.clear();\n } else {\n this.exportDependencies.delete(this.getKey(key));\n }\n }\n }\n\n private getCachedDependencies(filename: string): Set<string> {\n const key = this.getKey(filename);\n\n return new Set([\n ...(this.barrelManifestDependencies.get(key) ?? []),\n ...(this.exportDependencies.get(key) ?? []),\n ]);\n }\n\n private getDependencyCache(cacheName: 'barrelManifests' | 'exports') {\n return cacheName === 'barrelManifests'\n ? this.barrelManifestDependencies\n : this.exportDependencies;\n }\n\n private hasCachedDependencies(filename: string): boolean {\n return this.getCachedDependencies(filename).size > 0;\n }\n\n private setContentHash(\n filename: string,\n source: 'fs' | 'loaded',\n hash: string\n ) {\n const current = this.contentHashes.get(filename);\n if (current) {\n current[source] = hash;\n } else {\n this.contentHashes.set(filename, { [source]: hash });\n }\n\n if (source === 'fs') {\n try {\n this.fileMtimes.set(\n filename,\n fs.statSync(stripQueryAndHash(filename)).mtimeMs\n );\n } catch {\n // ignore\n }\n }\n }\n}\n"],"file":"cache.js"}
1
+ {"mappings":"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","names":[],"sources":["../src/cache.ts"],"version":3,"sourcesContent":["import { createHash } from 'crypto';\nimport fs from 'node:fs';\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { BarrelManifestCacheEntry } from './transform/barrelManifest.types';\nimport type { Entrypoint } from './transform/Entrypoint';\nimport type { IEvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nimport { getFileIdx } from './utils/getFileIdx';\nimport { stripQueryAndHash } from './utils/parseRequest';\n\nfunction hashContent(content: string) {\n return createHash('sha256').update(content).digest('hex');\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { code } = error as NodeJS.ErrnoException;\n return code === 'ENOENT' || code === 'ENOTDIR';\n}\n\ninterface IBaseCachedEntrypoint {\n dependencies: Map<string, { resolved: string | null }>;\n initialCode?: string;\n invalidateOnDependencyChange?: Set<string>;\n invalidationDependencies?: Map<string, { resolved: string | null }>;\n}\n\ninterface ICaches<TEntrypoint extends IBaseCachedEntrypoint> {\n barrelManifests: Map<string, BarrelManifestCacheEntry>;\n entrypoints: Map<string, TEntrypoint>;\n exports: Map<string, string[]>;\n}\n\ntype MapValue<T> = T extends Map<string, infer V> ? V : never;\n\nconst cacheLogger = logger.extend('cache');\n\nconst cacheNames = ['barrelManifests', 'entrypoints', 'exports'] as const;\ntype CacheNames = (typeof cacheNames)[number];\n\nconst loggers = cacheNames.reduce(\n (acc, key) => ({\n ...acc,\n [key]: cacheLogger.extend(key),\n }),\n {} as Record<CacheNames, typeof logger>\n);\n\nexport class TransformCacheCollection<\n TEntrypoint extends IBaseCachedEntrypoint = Entrypoint | IEvaluatedEntrypoint,\n> {\n public readonly barrelManifests: Map<string, BarrelManifestCacheEntry>;\n\n public readonly entrypoints: Map<string, TEntrypoint>;\n\n public readonly exports: Map<string, string[]>;\n\n private readonly barrelManifestDependencies = new Map<string, Set<string>>();\n\n private contentHashes = new Map<string, { fs?: string; loaded?: string }>();\n\n private fileMtimes = new Map<string, number>();\n\n private readonly exportDependencies = new Map<string, Set<string>>();\n\n private keySalt: string | null = null;\n\n private invalidatedFiles = new Map<string, number>();\n\n private consumedInvalidationVersions = new Map<string, number>();\n\n constructor(caches: Partial<ICaches<TEntrypoint>> = {}) {\n this.barrelManifests = caches.barrelManifests || new Map();\n this.entrypoints = caches.entrypoints || new Map();\n this.exports = caches.exports || new Map();\n }\n\n public setKeySalt(keySalt: string | null) {\n if (this.keySalt === keySalt) return;\n\n const prevKeySalt = this.keySalt;\n this.keySalt = keySalt;\n\n if (prevKeySalt === null && keySalt) {\n const migrate = <TValue>(cache: Map<string, TValue>) => {\n const entries = Array.from(cache.entries());\n cache.clear();\n entries.forEach(([key, value]) => {\n cache.set(this.getKey(key), value);\n });\n };\n\n migrate(this.barrelManifests);\n migrate(this.entrypoints);\n migrate(this.exports);\n migrate(this.barrelManifestDependencies);\n migrate(this.exportDependencies);\n return;\n }\n\n this.barrelManifests.clear();\n this.entrypoints.clear();\n this.exports.clear();\n this.clearCacheDependencies('all');\n }\n\n private getKey(key: string) {\n if (!this.keySalt) return key;\n return `${key}::${this.keySalt}`;\n }\n\n public getKeySalt() {\n return this.keySalt;\n }\n\n public add<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string, value: TValue): void {\n const cache = this[cacheName] as Map<string, TValue>;\n const cacheKey = this.getKey(key);\n loggers[cacheName]('%s:add %s %f', getFileIdx(key), key, () => {\n if (value === undefined) {\n return cache.has(cacheKey) ? 'removed' : 'noop';\n }\n\n if (!cache.has(cacheKey)) {\n return 'added';\n }\n\n return cache.get(cacheKey) === value ? 'unchanged' : 'updated';\n });\n\n if (value === undefined) {\n cache.delete(cacheKey);\n this.contentHashes.delete(key);\n this.clearCacheDependencies(cacheName, key);\n return;\n }\n\n this.clearCacheDependencies(cacheName, key);\n cache.set(cacheKey, value);\n\n if ('initialCode' in value) {\n const maybeOriginalCode = (value as unknown as { originalCode?: unknown })\n .originalCode;\n const isLoaded = typeof value.initialCode === 'string';\n const source = isLoaded ? 'loaded' : 'fs';\n\n let resolvedCode: string | undefined;\n if (isLoaded) {\n resolvedCode = value.initialCode;\n } else if (typeof maybeOriginalCode === 'string') {\n resolvedCode = maybeOriginalCode;\n }\n\n if (resolvedCode !== undefined) {\n this.setContentHash(key, source, hashContent(resolvedCode));\n return;\n }\n\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, source, hashContent(fileContent));\n } catch {\n this.setContentHash(key, source, hashContent(''));\n }\n\n return;\n }\n\n if (cacheName === 'barrelManifests' || cacheName === 'exports') {\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, 'fs', hashContent(fileContent));\n } catch {\n this.setContentHash(key, 'fs', hashContent(''));\n }\n }\n }\n\n public clear(cacheName: CacheNames | 'all'): void {\n if (cacheName === 'all') {\n cacheNames.forEach((name) => {\n this.clear(name);\n });\n\n return;\n }\n\n loggers[cacheName]('clear');\n const cache = this[cacheName] as Map<string, unknown>;\n\n cache.clear();\n this.clearCacheDependencies(cacheName);\n }\n\n public delete(cacheName: CacheNames, key: string): void {\n this.invalidate(cacheName, key);\n }\n\n public get<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string): TValue | undefined {\n const cache = this[cacheName] as Map<string, TValue>;\n const res = cache.get(this.getKey(key));\n\n loggers[cacheName]('get', key, res === undefined ? 'miss' : 'hit');\n return res;\n }\n\n public has(cacheName: CacheNames, key: string): boolean {\n const cache = this[cacheName] as Map<string, unknown>;\n const res = cache.has(this.getKey(key));\n\n loggers[cacheName]('has', key, res);\n return res;\n }\n\n public invalidate(cacheName: CacheNames, key: string): void {\n const cache = this[cacheName] as Map<string, unknown>;\n const cacheKey = this.getKey(key);\n\n if (!cache.has(cacheKey)) {\n return;\n }\n\n loggers[cacheName]('invalidate', key);\n\n cache.delete(cacheKey);\n this.clearCacheDependencies(cacheName, key);\n }\n\n public invalidateForFile(filename: string) {\n cacheNames.forEach((cacheName) => {\n this.invalidate(cacheName, filename);\n });\n\n const key = stripQueryAndHash(filename);\n const version = this.invalidatedFiles.get(key) ?? 0;\n this.invalidatedFiles.set(key, version + 1);\n }\n\n public consumeInvalidation(filename: string) {\n const key = stripQueryAndHash(filename);\n const invalidationVersion = this.invalidatedFiles.get(key);\n\n if (invalidationVersion === undefined) {\n return false;\n }\n\n const consumedVersion =\n this.consumedInvalidationVersions.get(filename) ?? 0;\n if (consumedVersion >= invalidationVersion) {\n return false;\n }\n\n this.consumedInvalidationVersions.set(filename, invalidationVersion);\n return true;\n }\n\n public invalidateIfChanged(\n filename: string,\n content: string,\n previousVisitedFiles?: Set<string>,\n source: 'fs' | 'loaded' = 'loaded',\n changedFiles = new Set<string>(),\n dependencyChangeMemo = new Map<string, boolean>(),\n forceContentCheck = false\n ) {\n if (changedFiles.has(filename)) {\n return true;\n }\n\n const visitedFiles = new Set(previousVisitedFiles);\n const fileEntrypoint = this.get('entrypoints', filename);\n let anyDepChanged = false;\n\n if (\n !visitedFiles.has(filename) &&\n (fileEntrypoint || this.hasCachedDependencies(filename))\n ) {\n visitedFiles.add(filename);\n const invalidateOnDependencyChange =\n fileEntrypoint?.invalidateOnDependencyChange;\n const dependenciesToCheck = this.getDependenciesToCheck(\n filename,\n fileEntrypoint\n );\n\n for (const [, dependency] of dependenciesToCheck) {\n const dependencyFilename = dependency.resolved;\n\n if (dependencyFilename) {\n const dependencyChanged = this.didDependencyChange(\n dependencyFilename,\n visitedFiles,\n changedFiles,\n dependencyChangeMemo,\n forceContentCheck ||\n invalidateOnDependencyChange?.has(dependencyFilename) ||\n false\n );\n\n if (\n dependencyChanged &&\n invalidateOnDependencyChange?.has(dependencyFilename)\n ) {\n cacheLogger(\n 'dependency affecting output has changed, invalidate all for %s',\n filename\n );\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n if (dependencyChanged) {\n anyDepChanged = true;\n }\n }\n }\n }\n\n const existing = this.contentHashes.get(filename);\n const previousHash = existing?.[source];\n const newHash = hashContent(content);\n\n if (previousHash === undefined) {\n const otherSource = source === 'fs' ? 'loaded' : 'fs';\n const otherHash = existing?.[otherSource];\n\n if ((otherHash !== undefined && otherHash !== newHash) || anyDepChanged) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n this.setContentHash(filename, source, newHash);\n\n if (anyDepChanged) {\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n return true;\n }\n\n return false;\n }\n\n if (previousHash !== newHash || anyDepChanged) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n return false;\n }\n\n private getDependenciesToCheck(\n filename: string,\n fileEntrypoint?: TEntrypoint\n ): Map<string, { resolved: string | null }> {\n const dependenciesToCheck = new Map<string, { resolved: string | null }>();\n\n for (const [key, dependency] of fileEntrypoint?.dependencies ?? []) {\n dependenciesToCheck.set(key, dependency);\n }\n\n for (const [key, dependency] of fileEntrypoint?.invalidationDependencies ??\n []) {\n if (!dependenciesToCheck.has(key)) {\n dependenciesToCheck.set(key, dependency);\n }\n }\n\n for (const dependencyFilename of this.getCachedDependencies(filename)) {\n if (\n ![...dependenciesToCheck.values()].some(\n (dependency) => dependency.resolved === dependencyFilename\n )\n ) {\n dependenciesToCheck.set(dependencyFilename, {\n resolved: dependencyFilename,\n });\n }\n }\n\n return dependenciesToCheck;\n }\n\n private didDependencyChange(\n dependencyFilename: string,\n visitedFiles: Set<string>,\n changedFiles: Set<string>,\n dependencyChangeMemo: Map<string, boolean>,\n forceContentCheck = false\n ): boolean {\n if (changedFiles.has(dependencyFilename)) {\n return true;\n }\n\n const memoized = dependencyChangeMemo.get(dependencyFilename);\n if (memoized !== undefined) {\n return memoized;\n }\n\n if (visitedFiles.has(dependencyFilename)) {\n return false;\n }\n\n const strippedDependencyFilename = stripQueryAndHash(dependencyFilename);\n const cachedMtime = this.fileMtimes.get(dependencyFilename);\n const cachedEntrypoint = this.get('entrypoints', dependencyFilename);\n\n if (cachedMtime !== undefined) {\n let currentMtime: number;\n\n try {\n currentMtime = fs.statSync(strippedDependencyFilename).mtimeMs;\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(dependencyFilename);\n changedFiles.add(dependencyFilename);\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n\n if (currentMtime === cachedMtime) {\n const nestedDependencies = this.getDependenciesToCheck(\n dependencyFilename,\n cachedEntrypoint\n );\n\n if (\n forceContentCheck &&\n this.didFileContentHashChange(\n dependencyFilename,\n strippedDependencyFilename,\n changedFiles\n )\n ) {\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n\n // A cached file without a cached entrypoint was invalidated earlier.\n // If the caller forced a content check and the content hash is stable,\n // the missing entrypoint is only cache churn and must not invalidate\n // output-dependent parents.\n if (!cachedEntrypoint && nestedDependencies.size === 0) {\n if (\n forceContentCheck &&\n this.contentHashes.get(dependencyFilename)?.fs !== undefined\n ) {\n dependencyChangeMemo.set(dependencyFilename, false);\n return false;\n }\n\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n\n if (nestedDependencies.size === 0) {\n dependencyChangeMemo.set(dependencyFilename, false);\n return false;\n }\n\n const nextVisitedFiles = new Set(visitedFiles);\n nextVisitedFiles.add(dependencyFilename);\n\n for (const [, nestedDependency] of nestedDependencies) {\n if (\n nestedDependency.resolved &&\n this.didDependencyChange(\n nestedDependency.resolved,\n nextVisitedFiles,\n changedFiles,\n dependencyChangeMemo,\n forceContentCheck\n )\n ) {\n this.invalidateForFile(dependencyFilename);\n changedFiles.add(dependencyFilename);\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n }\n\n dependencyChangeMemo.set(dependencyFilename, false);\n return false;\n }\n }\n\n let dependencyContent: string;\n\n try {\n dependencyContent = fs.readFileSync(strippedDependencyFilename, 'utf8');\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(dependencyFilename);\n changedFiles.add(dependencyFilename);\n dependencyChangeMemo.set(dependencyFilename, true);\n return true;\n }\n\n const invalidated = this.invalidateIfChanged(\n dependencyFilename,\n dependencyContent,\n visitedFiles,\n 'fs',\n changedFiles,\n dependencyChangeMemo,\n forceContentCheck\n );\n\n dependencyChangeMemo.set(dependencyFilename, invalidated);\n return invalidated;\n }\n\n private didFileContentHashChange(\n filename: string,\n strippedFilename: string,\n changedFiles: Set<string>\n ): boolean {\n const previousHash = this.contentHashes.get(filename)?.fs;\n if (previousHash === undefined) {\n return false;\n }\n\n let content: string;\n try {\n content = fs.readFileSync(strippedFilename, 'utf8');\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n return true;\n }\n\n const nextHash = hashContent(content);\n if (previousHash === nextHash) {\n return false;\n }\n\n this.setContentHash(filename, 'fs', nextHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n return true;\n }\n\n public setCacheDependencies(\n cacheName: 'barrelManifests' | 'exports',\n key: string,\n dependencies: Iterable<string>\n ): void {\n const cache = this.getDependencyCache(cacheName);\n const nextDependencies = new Set(\n [...dependencies].filter((dependency) => dependency.length > 0)\n );\n const cacheKey = this.getKey(key);\n\n if (nextDependencies.size === 0) {\n cache.delete(cacheKey);\n return;\n }\n\n cache.set(cacheKey, nextDependencies);\n }\n\n /**\n * Fast check if a file changed on disk since last seen.\n * Uses mtime as a fast path and only reads the file if mtime differs.\n */\n public checkFreshness(filename: string, strippedFilename: string): boolean {\n try {\n const currentMtime = fs.statSync(strippedFilename).mtimeMs;\n const cachedMtime = this.fileMtimes.get(filename);\n\n if (cachedMtime !== undefined && currentMtime === cachedMtime) {\n return false;\n }\n\n const content = fs.readFileSync(strippedFilename, 'utf8');\n this.fileMtimes.set(filename, currentMtime);\n\n if (this.invalidateIfChanged(filename, content, undefined, 'fs')) {\n return true;\n }\n\n return false;\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(filename);\n return true;\n }\n }\n\n private clearCacheDependencies(cacheName: CacheNames | 'all', key?: string) {\n if (cacheName === 'all') {\n this.barrelManifestDependencies.clear();\n this.exportDependencies.clear();\n return;\n }\n\n if (cacheName === 'barrelManifests') {\n if (key === undefined) {\n this.barrelManifestDependencies.clear();\n } else {\n this.barrelManifestDependencies.delete(this.getKey(key));\n }\n return;\n }\n\n if (cacheName === 'exports') {\n if (key === undefined) {\n this.exportDependencies.clear();\n } else {\n this.exportDependencies.delete(this.getKey(key));\n }\n }\n }\n\n private getCachedDependencies(filename: string): Set<string> {\n const key = this.getKey(filename);\n\n return new Set([\n ...(this.barrelManifestDependencies.get(key) ?? []),\n ...(this.exportDependencies.get(key) ?? []),\n ]);\n }\n\n private getDependencyCache(cacheName: 'barrelManifests' | 'exports') {\n return cacheName === 'barrelManifests'\n ? this.barrelManifestDependencies\n : this.exportDependencies;\n }\n\n private hasCachedDependencies(filename: string): boolean {\n return this.getCachedDependencies(filename).size > 0;\n }\n\n private setContentHash(\n filename: string,\n source: 'fs' | 'loaded',\n hash: string\n ) {\n const current = this.contentHashes.get(filename);\n if (current) {\n current[source] = hash;\n } else {\n this.contentHashes.set(filename, { [source]: hash });\n }\n\n if (source === 'fs') {\n try {\n this.fileMtimes.set(\n filename,\n fs.statSync(stripQueryAndHash(filename)).mtimeMs\n );\n } catch {\n // ignore\n }\n }\n }\n}\n"],"file":"cache.js"}
@@ -4,6 +4,13 @@ import path from "path";
4
4
  import { EventEmitter, isOnActionStartArgs } from "../utils/EventEmitter.js";
5
5
  const workingDir = process.cwd();
6
6
  function replacer(_key, value) {
7
+ if (value instanceof Error) {
8
+ return {
9
+ message: value.message,
10
+ name: value.name,
11
+ stack: value.stack
12
+ };
13
+ }
7
14
  if (typeof value === "string" && path.isAbsolute(value)) {
8
15
  return path.relative(workingDir, value);
9
16
  }
@@ -37,6 +44,18 @@ function printTimings(timings, startedAt, sourceRoot) {
37
44
  const writeJSONl = (stream, data) => {
38
45
  stream.write(`${JSON.stringify(data, replacer)}\n`);
39
46
  };
47
+ const isPerfFinishEvent = (event) => {
48
+ if (!event || typeof event !== "object") {
49
+ return false;
50
+ }
51
+ return "type" in event && event.type === "perf-span" && "method" in event && typeof event.method === "string" && "spanId" in event && typeof event.spanId === "number" && "startedAt" in event && typeof event.startedAt === "number" && "finishedAt" in event && typeof event.finishedAt === "number" && "durationMs" in event && typeof event.durationMs === "number";
52
+ };
53
+ const isPerfStartEvent = (event) => {
54
+ if (!event || typeof event !== "object") {
55
+ return false;
56
+ }
57
+ return "type" in event && event.type === "perf-span-start";
58
+ };
40
59
  export const createFileReporter = (options = false) => {
41
60
  if (!options || !options.dir) {
42
61
  return {
@@ -52,6 +71,8 @@ export const createFileReporter = (options = false) => {
52
71
  const dependenciesStream = createWriteStream(path.join(options.dir, "dependencies.jsonl"));
53
72
  const entrypointStream = createWriteStream(path.join(options.dir, "entrypoints.jsonl"));
54
73
  const staticResolveStream = createWriteStream(path.join(options.dir, "static-resolve.jsonl"));
74
+ const perfSpanStream = createWriteStream(path.join(options.dir, "perf-spans.jsonl"));
75
+ const evalFilesStream = createWriteStream(path.join(options.dir, "eval-files.jsonl"));
55
76
  const startedAt = performance.now();
56
77
  const timings = new Map();
57
78
  const addTiming = (label, key, value) => {
@@ -77,13 +98,24 @@ export const createFileReporter = (options = false) => {
77
98
  if (meta.type === "staticResolve") {
78
99
  writeJSONl(staticResolveStream, meta);
79
100
  }
101
+ if (meta.type === "eval-file") {
102
+ writeJSONl(evalFilesStream, meta);
103
+ }
80
104
  };
81
105
  const startTimes = new Map();
82
- const onEvent = (meta, type) => {
106
+ const onEvent = (meta, type, event) => {
83
107
  if (type === "single") {
84
108
  processSingleEvent(meta);
85
109
  return;
86
110
  }
111
+ if (type === "finish" && isPerfFinishEvent(event)) {
112
+ addTiming("method", event.method, event.durationMs);
113
+ writeJSONl(perfSpanStream, event);
114
+ return;
115
+ }
116
+ if (type === "start" && isPerfStartEvent(event)) {
117
+ return;
118
+ }
87
119
  if (type === "start") {
88
120
  Object.entries(meta).forEach(([label, value]) => {
89
121
  startTimes.set(`${label}\0${value}`, performance.now());
@@ -140,6 +172,8 @@ export const createFileReporter = (options = false) => {
140
172
  dependenciesStream.end();
141
173
  entrypointStream.end();
142
174
  staticResolveStream.end();
175
+ perfSpanStream.end();
176
+ evalFilesStream.end();
143
177
  timings.clear();
144
178
  }
145
179
  };
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../src/debug/fileReporter.ts"],"version":3,"sourcesContent":["/* eslint-disable no-console */\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport path from 'path';\n\nimport type {\n OnAction,\n OnEvent,\n OnActionFinishArgs,\n OnActionStartArgs,\n OnEntrypointEvent,\n} from '../utils/EventEmitter';\nimport { EventEmitter, isOnActionStartArgs } from '../utils/EventEmitter';\n\ntype Timings = Map<string, Map<string, number>>;\n\nexport interface IFileReporterOptions {\n dir?: string;\n print?: boolean;\n}\n\nexport interface IProcessedEvent {\n file: string;\n fileIdx: string;\n imports: { from: string; what: string[] }[];\n only: string[];\n phase?: 'initial' | 'rewritten';\n type: 'dependency';\n}\n\nexport interface IQueueActionEvent {\n action: string;\n args?: string[];\n datetime: Date;\n file: string;\n queueIdx: string;\n type: 'queue-action';\n}\n\nconst workingDir = process.cwd();\n\nfunction replacer(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && path.isAbsolute(value)) {\n return path.relative(workingDir, value);\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries()).reduce((obj, [k, v]) => {\n const key = replacer(k, k) as string;\n return {\n ...obj,\n [key]: replacer(key, v),\n };\n }, {});\n }\n\n return value;\n}\n\nfunction printTimings(timings: Timings, startedAt: number, sourceRoot: string) {\n if (timings.size === 0) {\n return;\n }\n\n console.log(`\\nTimings:`);\n console.log(` Total: ${(performance.now() - startedAt).toFixed()}ms`);\n\n Array.from(timings.entries()).forEach(([label, byLabel]) => {\n console.log(`\\n By ${label}:`);\n\n const array = Array.from(byLabel.entries());\n // array.sort(([, a], [, b]) => b - a);\n array\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(([value, time]) => {\n const name = value.startsWith(sourceRoot)\n ? path.relative(sourceRoot, value)\n : value;\n console.log(` ${name}: ${time}ms`);\n });\n });\n}\n\nconst writeJSONl = (stream: NodeJS.WritableStream, data: unknown) => {\n stream.write(`${JSON.stringify(data, replacer)}\\n`);\n};\n\nexport const createFileReporter = (\n options: IFileReporterOptions | false = false\n) => {\n if (!options || !options.dir) {\n return {\n emitter: EventEmitter.dummy,\n onDone: () => {},\n };\n }\n\n const reportFolder = existsSync(options.dir)\n ? options.dir\n : mkdirSync(options.dir, {\n recursive: true,\n });\n\n if (!reportFolder) {\n throw new Error(`Could not create directory ${options.dir}`);\n }\n\n const actionStream = createWriteStream(\n path.join(options.dir, 'actions.jsonl')\n );\n\n const dependenciesStream = createWriteStream(\n path.join(options.dir, 'dependencies.jsonl')\n );\n\n const entrypointStream = createWriteStream(\n path.join(options.dir, 'entrypoints.jsonl')\n );\n\n const staticResolveStream = createWriteStream(\n path.join(options.dir, 'static-resolve.jsonl')\n );\n\n const startedAt = performance.now();\n const timings: Timings = new Map();\n const addTiming = (label: string, key: string, value: number) => {\n if (!timings.has(label)) {\n timings.set(label, new Map());\n }\n\n const forLabel = timings.get(label)!;\n forLabel.set(key, Math.round((forLabel.get(key) || 0) + value));\n };\n\n const processDependencyEvent = ({\n file,\n only,\n imports,\n fileIdx,\n }: IProcessedEvent) => {\n writeJSONl(dependenciesStream, {\n file,\n only,\n imports,\n fileIdx,\n });\n };\n\n const processSingleEvent = (\n meta: Record<string, unknown> | IProcessedEvent | IQueueActionEvent\n ) => {\n if (meta.type === 'dependency') {\n processDependencyEvent(meta as IProcessedEvent);\n return;\n }\n\n if (meta.type === 'staticResolve') {\n writeJSONl(staticResolveStream, meta);\n }\n };\n\n const startTimes = new Map<string, number>();\n\n const onEvent: OnEvent = (meta, type) => {\n if (type === 'single') {\n processSingleEvent(meta);\n return;\n }\n\n if (type === 'start') {\n Object.entries(meta).forEach(([label, value]) => {\n startTimes.set(`${label}\\0${value}`, performance.now());\n });\n } else {\n Object.entries(meta).forEach(([label, value]) => {\n const startTime = startTimes.get(`${label}\\0${value}`);\n if (startTime) {\n addTiming(label, String(value), performance.now() - startTime);\n }\n });\n }\n };\n\n let actionId = 0;\n const onAction: OnAction = (\n ...args: OnActionStartArgs | OnActionFinishArgs\n ) => {\n if (isOnActionStartArgs(args)) {\n const [, timestamp, type, idx, entrypointRef] = args;\n writeJSONl(actionStream, {\n actionId,\n entrypointRef,\n idx,\n startedAt: timestamp,\n type,\n });\n\n // eslint-disable-next-line no-plusplus\n return actionId++;\n }\n\n const [result, timestamp, id, isAsync, error] = args;\n writeJSONl(actionStream, {\n actionId: id,\n error,\n finishedAt: timestamp,\n isAsync,\n result: `${result}ed`,\n });\n\n return id;\n };\n\n const onEntrypointEvent: OnEntrypointEvent = (\n emitterId,\n timestamp,\n event\n ) => {\n entrypointStream.write(\n `${JSON.stringify([emitterId, timestamp, event])}\\n`\n );\n };\n\n const emitter = new EventEmitter(onEvent, onAction, onEntrypointEvent);\n\n return {\n emitter,\n onDone: (sourceRoot: string) => {\n if (options.print) {\n printTimings(timings, startedAt, sourceRoot);\n\n console.log('\\nMemory usage:', process.memoryUsage());\n }\n\n actionStream.end();\n dependenciesStream.end();\n entrypointStream.end();\n staticResolveStream.end();\n timings.clear();\n },\n };\n};\n"],"file":"fileReporter.js"}
1
+ {"mappings":"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","names":[],"sources":["../../src/debug/fileReporter.ts"],"version":3,"sourcesContent":["/* eslint-disable no-console */\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport path from 'path';\n\nimport type {\n OnAction,\n OnEvent,\n OnActionFinishArgs,\n OnActionStartArgs,\n OnEntrypointEvent,\n PerfFinishEvent,\n} from '../utils/EventEmitter';\nimport { EventEmitter, isOnActionStartArgs } from '../utils/EventEmitter';\n\ntype Timings = Map<string, Map<string, number>>;\n\nexport interface IFileReporterOptions {\n dir?: string;\n print?: boolean;\n}\n\nexport interface IProcessedEvent {\n file: string;\n fileIdx: string;\n imports: { from: string; what: string[] }[];\n only: string[];\n phase?: 'initial' | 'rewritten';\n type: 'dependency';\n}\n\nexport interface IQueueActionEvent {\n action: string;\n args?: string[];\n datetime: Date;\n file: string;\n queueIdx: string;\n type: 'queue-action';\n}\n\nconst workingDir = process.cwd();\n\nfunction replacer(_key: string, value: unknown): unknown {\n if (value instanceof Error) {\n return {\n message: value.message,\n name: value.name,\n stack: value.stack,\n };\n }\n\n if (typeof value === 'string' && path.isAbsolute(value)) {\n return path.relative(workingDir, value);\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries()).reduce((obj, [k, v]) => {\n const key = replacer(k, k) as string;\n return {\n ...obj,\n [key]: replacer(key, v),\n };\n }, {});\n }\n\n return value;\n}\n\nfunction printTimings(timings: Timings, startedAt: number, sourceRoot: string) {\n if (timings.size === 0) {\n return;\n }\n\n console.log(`\\nTimings:`);\n console.log(` Total: ${(performance.now() - startedAt).toFixed()}ms`);\n\n Array.from(timings.entries()).forEach(([label, byLabel]) => {\n console.log(`\\n By ${label}:`);\n\n const array = Array.from(byLabel.entries());\n // array.sort(([, a], [, b]) => b - a);\n array\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(([value, time]) => {\n const name = value.startsWith(sourceRoot)\n ? path.relative(sourceRoot, value)\n : value;\n console.log(` ${name}: ${time}ms`);\n });\n });\n}\n\nconst writeJSONl = (stream: NodeJS.WritableStream, data: unknown) => {\n stream.write(`${JSON.stringify(data, replacer)}\\n`);\n};\n\nconst isPerfFinishEvent = (event: unknown): event is PerfFinishEvent => {\n if (!event || typeof event !== 'object') {\n return false;\n }\n\n return (\n 'type' in event &&\n event.type === 'perf-span' &&\n 'method' in event &&\n typeof event.method === 'string' &&\n 'spanId' in event &&\n typeof event.spanId === 'number' &&\n 'startedAt' in event &&\n typeof event.startedAt === 'number' &&\n 'finishedAt' in event &&\n typeof event.finishedAt === 'number' &&\n 'durationMs' in event &&\n typeof event.durationMs === 'number'\n );\n};\n\nconst isPerfStartEvent = (event: unknown) => {\n if (!event || typeof event !== 'object') {\n return false;\n }\n\n return 'type' in event && event.type === 'perf-span-start';\n};\n\nexport const createFileReporter = (\n options: IFileReporterOptions | false = false\n) => {\n if (!options || !options.dir) {\n return {\n emitter: EventEmitter.dummy,\n onDone: () => {},\n };\n }\n\n const reportFolder = existsSync(options.dir)\n ? options.dir\n : mkdirSync(options.dir, {\n recursive: true,\n });\n\n if (!reportFolder) {\n throw new Error(`Could not create directory ${options.dir}`);\n }\n\n const actionStream = createWriteStream(\n path.join(options.dir, 'actions.jsonl')\n );\n\n const dependenciesStream = createWriteStream(\n path.join(options.dir, 'dependencies.jsonl')\n );\n\n const entrypointStream = createWriteStream(\n path.join(options.dir, 'entrypoints.jsonl')\n );\n\n const staticResolveStream = createWriteStream(\n path.join(options.dir, 'static-resolve.jsonl')\n );\n\n const perfSpanStream = createWriteStream(\n path.join(options.dir, 'perf-spans.jsonl')\n );\n\n const evalFilesStream = createWriteStream(\n path.join(options.dir, 'eval-files.jsonl')\n );\n\n const startedAt = performance.now();\n const timings: Timings = new Map();\n const addTiming = (label: string, key: string, value: number) => {\n if (!timings.has(label)) {\n timings.set(label, new Map());\n }\n\n const forLabel = timings.get(label)!;\n forLabel.set(key, Math.round((forLabel.get(key) || 0) + value));\n };\n\n const processDependencyEvent = ({\n file,\n only,\n imports,\n fileIdx,\n }: IProcessedEvent) => {\n writeJSONl(dependenciesStream, {\n file,\n only,\n imports,\n fileIdx,\n });\n };\n\n const processSingleEvent = (\n meta: Record<string, unknown> | IProcessedEvent | IQueueActionEvent\n ) => {\n if (meta.type === 'dependency') {\n processDependencyEvent(meta as IProcessedEvent);\n return;\n }\n\n if (meta.type === 'staticResolve') {\n writeJSONl(staticResolveStream, meta);\n }\n\n if (meta.type === 'eval-file') {\n writeJSONl(evalFilesStream, meta);\n }\n };\n\n const startTimes = new Map<string, number>();\n\n const onEvent: OnEvent = (meta, type, event) => {\n if (type === 'single') {\n processSingleEvent(meta);\n return;\n }\n\n if (type === 'finish' && isPerfFinishEvent(event)) {\n addTiming('method', event.method, event.durationMs);\n writeJSONl(perfSpanStream, event);\n return;\n }\n\n if (type === 'start' && isPerfStartEvent(event)) {\n return;\n }\n\n if (type === 'start') {\n Object.entries(meta).forEach(([label, value]) => {\n startTimes.set(`${label}\\0${value}`, performance.now());\n });\n } else {\n Object.entries(meta).forEach(([label, value]) => {\n const startTime = startTimes.get(`${label}\\0${value}`);\n if (startTime) {\n addTiming(label, String(value), performance.now() - startTime);\n }\n });\n }\n };\n\n let actionId = 0;\n const onAction: OnAction = (\n ...args: OnActionStartArgs | OnActionFinishArgs\n ) => {\n if (isOnActionStartArgs(args)) {\n const [, timestamp, type, idx, entrypointRef] = args;\n writeJSONl(actionStream, {\n actionId,\n entrypointRef,\n idx,\n startedAt: timestamp,\n type,\n });\n\n // eslint-disable-next-line no-plusplus\n return actionId++;\n }\n\n const [result, timestamp, id, isAsync, error] = args;\n writeJSONl(actionStream, {\n actionId: id,\n error,\n finishedAt: timestamp,\n isAsync,\n result: `${result}ed`,\n });\n\n return id;\n };\n\n const onEntrypointEvent: OnEntrypointEvent = (\n emitterId,\n timestamp,\n event\n ) => {\n entrypointStream.write(\n `${JSON.stringify([emitterId, timestamp, event])}\\n`\n );\n };\n\n const emitter = new EventEmitter(onEvent, onAction, onEntrypointEvent);\n\n return {\n emitter,\n onDone: (sourceRoot: string) => {\n if (options.print) {\n printTimings(timings, startedAt, sourceRoot);\n\n console.log('\\nMemory usage:', process.memoryUsage());\n }\n\n actionStream.end();\n dependenciesStream.end();\n entrypointStream.end();\n staticResolveStream.end();\n perfSpanStream.end();\n evalFilesStream.end();\n timings.clear();\n },\n };\n};\n"],"file":"fileReporter.js"}