@ecopages/core 0.2.0-beta.31 → 0.2.0-beta.33

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 (343) hide show
  1. package/README.md +1 -0
  2. package/package.json +90 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/README.md +23 -0
  249. package/src/router/client/link-intent.js +55 -39
  250. package/src/router/client/link-intent.test.browser.js +49 -49
  251. package/src/router/client/link-navigation-policy.js +114 -93
  252. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  253. package/src/router/client/navigation-coordinator.js +235 -211
  254. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  255. package/src/router/client/navigation-lifecycle.js +50 -0
  256. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  257. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  258. package/src/router/server/route-registry.js +237 -242
  259. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  260. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  261. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  262. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  263. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  264. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  265. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  266. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  267. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  268. package/src/services/assets/asset-processing-service/index.js +8 -8
  269. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  270. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  271. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  272. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  273. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  274. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  275. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  276. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  277. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  278. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  279. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  280. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  281. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  282. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  283. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  284. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  285. package/src/services/assets/browser-bundle.service.js +52 -47
  286. package/src/services/cache/cache.types.js +5 -0
  287. package/src/services/cache/index.js +6 -7
  288. package/src/services/cache/memory-cache-store.js +101 -89
  289. package/src/services/cache/page-cache-service.js +156 -145
  290. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  291. package/src/services/html/html-rewriter-provider.service.js +61 -61
  292. package/src/services/html/html-transformer.service.js +249 -266
  293. package/src/services/invalidation/development-invalidation.service.js +252 -241
  294. package/src/services/module-loading/app-module-loader.service.js +1 -0
  295. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  296. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  297. package/src/services/module-loading/module-loading-types.js +1 -0
  298. package/src/services/module-loading/page-module-import.service.js +235 -243
  299. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  300. package/src/services/module-loading/route-module-build-cache.js +3 -38
  301. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  302. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  303. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  304. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  305. package/src/services/module-loading/source-module-support.js +15 -7
  306. package/src/services/runtime-state/dev-graph.service.js +165 -157
  307. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  308. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  309. package/src/services/validation/schema-validation-service.js +157 -95
  310. package/src/services/validation/standard-schema.types.js +1 -0
  311. package/src/services/validation/validate-standard-schema.js +13 -13
  312. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  313. package/src/static-site-generator/sitemap-routes.js +33 -28
  314. package/src/static-site-generator/sitemap.js +38 -29
  315. package/src/static-site-generator/static-build-invalidation.js +34 -56
  316. package/src/static-site-generator/static-export-context.js +1 -0
  317. package/src/static-site-generator/static-site-generator.js +517 -553
  318. package/src/types/internal-types.d.ts +19 -3
  319. package/src/types/internal-types.js +1 -0
  320. package/src/types/public-types.d.ts +16 -46
  321. package/src/types/public-types.js +1 -0
  322. package/src/utils/deep-merge.js +39 -26
  323. package/src/utils/ecopages-route-info.js +27 -23
  324. package/src/utils/hash.js +3 -6
  325. package/src/utils/html-escaping.js +21 -8
  326. package/src/utils/html.js +1 -4
  327. package/src/utils/invariant.js +11 -10
  328. package/src/utils/locals-utils.js +32 -22
  329. package/src/utils/parse-cli-args.js +73 -65
  330. package/src/utils/path-pattern.js +38 -23
  331. package/src/utils/path-utils.module.js +8 -11
  332. package/src/utils/resolve-entry-file.js +70 -38
  333. package/src/utils/resolve-work-dir.js +23 -27
  334. package/src/utils/runtime.js +24 -33
  335. package/src/utils/server-utils.module.js +60 -52
  336. package/src/utils/static-file-extensions.js +52 -46
  337. package/src/watchers/project-watcher-ignore.js +16 -15
  338. package/src/watchers/project-watcher.js +385 -366
  339. package/src/watchers/project-watcher.test-helpers.js +45 -50
  340. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  341. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  342. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  343. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,436 +1,453 @@
1
- import path from "node:path";
2
- import { createHash } from "node:crypto";
3
- import { appLogger } from "../../../global/app-logger.js";
1
+ import path from 'node:path';
2
+ import { createHash } from 'node:crypto';
3
+ import { appLogger } from '../../../global/app-logger.js';
4
4
  function isSkipCacheGroupedOutcome(outcome) {
5
- return "skipCache" in outcome;
5
+ return 'skipCache' in outcome;
6
6
  }
7
7
  function serializeGraphKey(key) {
8
- return `${key.policy}::${key.integrationName}::${key.routeFile}::${key.entryFingerprint}`;
8
+ return `${key.policy}::${key.integrationName}::${key.routeFile}::${key.entryFingerprint}`;
9
9
  }
10
10
  function normalizeDependencyPath(filePath) {
11
- return path.resolve(filePath);
11
+ return path.resolve(filePath);
12
12
  }
13
13
  function parseSerializedGraphKey(serializedKey) {
14
- if (serializedKey.startsWith("grouped::")) {
15
- return void 0;
16
- }
17
- const [policy, integrationName, routeFile, entryFingerprint] = serializedKey.split("::");
18
- if (!policy || !integrationName || !routeFile || entryFingerprint === void 0) {
19
- return void 0;
20
- }
21
- if (policy !== "development" && policy !== "production") {
22
- return void 0;
23
- }
24
- return {
25
- policy,
26
- integrationName,
27
- routeFile,
28
- entryFingerprint
29
- };
14
+ if (serializedKey.startsWith('grouped::')) {
15
+ return undefined;
16
+ }
17
+ const [policy, integrationName, routeFile, entryFingerprint] = serializedKey.split('::');
18
+ if (!policy || !integrationName || !routeFile || entryFingerprint === undefined) {
19
+ return undefined;
20
+ }
21
+ if (policy !== 'development' && policy !== 'production') {
22
+ return undefined;
23
+ }
24
+ return {
25
+ policy,
26
+ integrationName,
27
+ routeFile,
28
+ entryFingerprint,
29
+ };
30
30
  }
31
- class GraphDependencyIndex {
32
- dependencyToGraphKeys = /* @__PURE__ */ new Map();
33
- bindRecord(record) {
34
- const serializedKey = serializeGraphKey(record.key);
35
- for (const dependencyPath of record.dependencyPaths) {
36
- this.addDependencyBinding(normalizeDependencyPath(dependencyPath), serializedKey);
37
- }
38
- }
39
- unbindRecord(record) {
40
- const serializedKey = serializeGraphKey(record.key);
41
- for (const dependencyPath of record.dependencyPaths) {
42
- this.removeDependencyBinding(normalizeDependencyPath(dependencyPath), serializedKey);
43
- }
44
- }
45
- bindGroupedRecord(integrationName, record) {
46
- const serializedKey = `grouped::${integrationName}`;
47
- for (const dependencyPath of record.dependencyPaths) {
48
- this.addDependencyBinding(normalizeDependencyPath(dependencyPath), serializedKey);
49
- }
50
- }
51
- unbindGroupedRecord(integrationName, record) {
52
- const serializedKey = `grouped::${integrationName}`;
53
- for (const dependencyPath of record.dependencyPaths) {
54
- this.removeDependencyBinding(normalizeDependencyPath(dependencyPath), serializedKey);
55
- }
56
- }
57
- getAffectedKeys(filePath) {
58
- return new Set(this.dependencyToGraphKeys.get(normalizeDependencyPath(filePath)) ?? []);
59
- }
60
- resetForTests() {
61
- this.dependencyToGraphKeys.clear();
62
- }
63
- addDependencyBinding(dependencyPath, serializedKey) {
64
- const graphKeys = this.dependencyToGraphKeys.get(dependencyPath) ?? /* @__PURE__ */ new Set();
65
- graphKeys.add(serializedKey);
66
- this.dependencyToGraphKeys.set(dependencyPath, graphKeys);
67
- }
68
- removeDependencyBinding(dependencyPath, serializedKey) {
69
- const graphKeys = this.dependencyToGraphKeys.get(dependencyPath);
70
- if (!graphKeys) {
71
- return;
72
- }
73
- graphKeys.delete(serializedKey);
74
- if (graphKeys.size === 0) {
75
- this.dependencyToGraphKeys.delete(dependencyPath);
76
- }
77
- }
31
+ /**
32
+ * Reverse index from dependency paths to graph cache keys.
33
+ */
34
+ export class GraphDependencyIndex {
35
+ dependencyToGraphKeys = new Map();
36
+ bindRecord(record) {
37
+ const serializedKey = serializeGraphKey(record.key);
38
+ for (const dependencyPath of record.dependencyPaths) {
39
+ this.addDependencyBinding(normalizeDependencyPath(dependencyPath), serializedKey);
40
+ }
41
+ }
42
+ unbindRecord(record) {
43
+ const serializedKey = serializeGraphKey(record.key);
44
+ for (const dependencyPath of record.dependencyPaths) {
45
+ this.removeDependencyBinding(normalizeDependencyPath(dependencyPath), serializedKey);
46
+ }
47
+ }
48
+ bindGroupedRecord(integrationName, record) {
49
+ const serializedKey = `grouped::${integrationName}`;
50
+ for (const dependencyPath of record.dependencyPaths) {
51
+ this.addDependencyBinding(normalizeDependencyPath(dependencyPath), serializedKey);
52
+ }
53
+ }
54
+ unbindGroupedRecord(integrationName, record) {
55
+ const serializedKey = `grouped::${integrationName}`;
56
+ for (const dependencyPath of record.dependencyPaths) {
57
+ this.removeDependencyBinding(normalizeDependencyPath(dependencyPath), serializedKey);
58
+ }
59
+ }
60
+ getAffectedKeys(filePath) {
61
+ return new Set(this.dependencyToGraphKeys.get(normalizeDependencyPath(filePath)) ?? []);
62
+ }
63
+ resetForTests() {
64
+ this.dependencyToGraphKeys.clear();
65
+ }
66
+ addDependencyBinding(dependencyPath, serializedKey) {
67
+ const graphKeys = this.dependencyToGraphKeys.get(dependencyPath) ?? new Set();
68
+ graphKeys.add(serializedKey);
69
+ this.dependencyToGraphKeys.set(dependencyPath, graphKeys);
70
+ }
71
+ removeDependencyBinding(dependencyPath, serializedKey) {
72
+ const graphKeys = this.dependencyToGraphKeys.get(dependencyPath);
73
+ if (!graphKeys) {
74
+ return;
75
+ }
76
+ graphKeys.delete(serializedKey);
77
+ if (graphKeys.size === 0) {
78
+ this.dependencyToGraphKeys.delete(dependencyPath);
79
+ }
80
+ }
78
81
  }
79
- class SessionPageBrowserGraphCache {
80
- records = /* @__PURE__ */ new Map();
81
- inFlight = /* @__PURE__ */ new Map();
82
- groupedRecords = /* @__PURE__ */ new Map();
83
- groupedInFlight = /* @__PURE__ */ new Map();
84
- dependencyIndex = new GraphDependencyIndex();
85
- graphGenerations = /* @__PURE__ */ new Map();
86
- groupedGenerations = /* @__PURE__ */ new Map();
87
- buildCount = 0;
88
- getGraphByRoute(integrationName, routeFile, policy) {
89
- const normalizedRoute = normalizeDependencyPath(routeFile);
90
- for (const record of this.records.values()) {
91
- if (record.key.integrationName !== integrationName) {
92
- continue;
93
- }
94
- if (record.key.policy !== policy) {
95
- continue;
96
- }
97
- if (normalizeDependencyPath(record.key.routeFile) !== normalizedRoute) {
98
- continue;
99
- }
100
- return record.result;
101
- }
102
- return void 0;
103
- }
104
- getBuildCount() {
105
- return this.buildCount;
106
- }
107
- getAffectedGraphIdentities(filePath) {
108
- const identities = [];
109
- for (const serializedKey of this.dependencyIndex.getAffectedKeys(filePath)) {
110
- const identity = parseSerializedGraphKey(serializedKey);
111
- if (identity) {
112
- identities.push(identity);
113
- }
114
- }
115
- return identities;
116
- }
117
- resolveGraph(key, build) {
118
- const serializedKey = serializeGraphKey(key);
119
- const cached = this.records.get(serializedKey);
120
- if (cached) {
121
- return Promise.resolve(cached.result);
122
- }
123
- const pending = this.inFlight.get(serializedKey);
124
- if (pending) {
125
- return pending;
126
- }
127
- const buildGeneration = this.bumpGraphGeneration(serializedKey);
128
- const buildPromise = this.runGraphBuild(serializedKey, key, buildGeneration, build);
129
- this.inFlight.set(serializedKey, buildPromise);
130
- return buildPromise;
131
- }
132
- resolveGroupedGraph(integrationName, build) {
133
- const cached = this.groupedRecords.get(integrationName);
134
- if (cached) {
135
- return Promise.resolve(cached.assetsByRoute);
136
- }
137
- const pending = this.groupedInFlight.get(integrationName);
138
- if (pending) {
139
- return pending;
140
- }
141
- const buildGeneration = this.bumpGroupedGeneration(integrationName);
142
- const buildPromise = this.runGroupedBuild(integrationName, buildGeneration, build);
143
- this.groupedInFlight.set(integrationName, buildPromise);
144
- return buildPromise;
145
- }
146
- peekGroupedGraph(integrationName) {
147
- return this.groupedRecords.get(integrationName)?.assetsByRoute;
148
- }
149
- invalidateByFilePath(filePath) {
150
- const normalizedFilePath = normalizeDependencyPath(filePath);
151
- const affectedKeys = this.dependencyIndex.getAffectedKeys(normalizedFilePath);
152
- let invalidated = 0;
153
- for (const serializedKey of affectedKeys) {
154
- if (serializedKey.startsWith("grouped::")) {
155
- const integrationName = serializedKey.slice("grouped::".length);
156
- invalidated += this.invalidateGroupedRecord(integrationName);
157
- continue;
158
- }
159
- invalidated += this.invalidateSerializedGraphKey(serializedKey);
160
- }
161
- for (const serializedKey of this.inFlight.keys()) {
162
- const identity = parseSerializedGraphKey(serializedKey);
163
- if (!identity) {
164
- continue;
165
- }
166
- if (normalizeDependencyPath(identity.routeFile) !== normalizedFilePath) {
167
- continue;
168
- }
169
- if (affectedKeys.has(serializedKey)) {
170
- continue;
171
- }
172
- this.bumpGraphGeneration(serializedKey);
173
- this.inFlight.delete(serializedKey);
174
- invalidated += 1;
175
- }
176
- if (invalidated > 0) {
177
- appLogger.debug(
178
- `[PageBrowserGraphSession] invalidated ${invalidated} graph record(s) for ${normalizedFilePath}`
179
- );
180
- }
181
- return invalidated;
182
- }
183
- invalidateRoute(integrationName, routeFile) {
184
- const normalizedRoute = normalizeDependencyPath(routeFile);
185
- for (const [serializedKey, record] of this.records) {
186
- if (record.key.integrationName !== integrationName) {
187
- continue;
188
- }
189
- if (normalizeDependencyPath(record.key.routeFile) !== normalizedRoute) {
190
- continue;
191
- }
192
- this.invalidateSerializedGraphKey(serializedKey);
193
- }
194
- }
195
- invalidateByRouteFile(routeFile) {
196
- const normalizedRoute = normalizeDependencyPath(routeFile);
197
- for (const [serializedKey, record] of this.records) {
198
- if (normalizeDependencyPath(record.key.routeFile) !== normalizedRoute) {
199
- continue;
200
- }
201
- this.invalidateSerializedGraphKey(serializedKey);
202
- }
203
- }
204
- resetForTests() {
205
- this.records.clear();
206
- this.inFlight.clear();
207
- this.groupedRecords.clear();
208
- this.groupedInFlight.clear();
209
- this.graphGenerations.clear();
210
- this.groupedGenerations.clear();
211
- this.dependencyIndex.resetForTests();
212
- this.buildCount = 0;
213
- }
214
- exportRecords(policy) {
215
- return [...this.records.values()].filter((record) => record.key.policy === policy);
216
- }
217
- clearPolicyRecords(policy) {
218
- for (const [serializedKey, record] of this.records) {
219
- if (record.key.policy !== policy) {
220
- continue;
221
- }
222
- this.dependencyIndex.unbindRecord(record);
223
- this.records.delete(serializedKey);
224
- this.inFlight.delete(serializedKey);
225
- this.graphGenerations.delete(serializedKey);
226
- }
227
- if (policy === "production") {
228
- for (const integrationName of [...this.groupedRecords.keys()]) {
82
+ /**
83
+ * Session-local Page Browser Graph cache with precise dependency invalidation.
84
+ */
85
+ export class SessionPageBrowserGraphCache {
86
+ records = new Map();
87
+ inFlight = new Map();
88
+ groupedRecords = new Map();
89
+ groupedInFlight = new Map();
90
+ dependencyIndex = new GraphDependencyIndex();
91
+ graphGenerations = new Map();
92
+ groupedGenerations = new Map();
93
+ buildCount = 0;
94
+ getGraphByRoute(integrationName, routeFile, policy) {
95
+ const normalizedRoute = normalizeDependencyPath(routeFile);
96
+ for (const record of this.records.values()) {
97
+ if (record.key.integrationName !== integrationName) {
98
+ continue;
99
+ }
100
+ if (record.key.policy !== policy) {
101
+ continue;
102
+ }
103
+ if (normalizeDependencyPath(record.key.routeFile) !== normalizedRoute) {
104
+ continue;
105
+ }
106
+ return record.result;
107
+ }
108
+ return undefined;
109
+ }
110
+ /**
111
+ * Page Browser Graph compilations in this dev-server session.
112
+ */
113
+ getBuildCount() {
114
+ return this.buildCount;
115
+ }
116
+ getAffectedGraphIdentities(filePath) {
117
+ const identities = [];
118
+ for (const serializedKey of this.dependencyIndex.getAffectedKeys(filePath)) {
119
+ const identity = parseSerializedGraphKey(serializedKey);
120
+ if (identity) {
121
+ identities.push(identity);
122
+ }
123
+ }
124
+ return identities;
125
+ }
126
+ resolveGraph(key, build) {
127
+ const serializedKey = serializeGraphKey(key);
128
+ const cached = this.records.get(serializedKey);
129
+ if (cached) {
130
+ return Promise.resolve(cached.result);
131
+ }
132
+ const pending = this.inFlight.get(serializedKey);
133
+ if (pending) {
134
+ return pending;
135
+ }
136
+ const buildGeneration = this.bumpGraphGeneration(serializedKey);
137
+ const buildPromise = this.runGraphBuild(serializedKey, key, buildGeneration, build);
138
+ this.inFlight.set(serializedKey, buildPromise);
139
+ return buildPromise;
140
+ }
141
+ resolveGroupedGraph(integrationName, build) {
142
+ const cached = this.groupedRecords.get(integrationName);
143
+ if (cached) {
144
+ return Promise.resolve(cached.assetsByRoute);
145
+ }
146
+ const pending = this.groupedInFlight.get(integrationName);
147
+ if (pending) {
148
+ return pending;
149
+ }
150
+ const buildGeneration = this.bumpGroupedGeneration(integrationName);
151
+ const buildPromise = this.runGroupedBuild(integrationName, buildGeneration, build);
152
+ this.groupedInFlight.set(integrationName, buildPromise);
153
+ return buildPromise;
154
+ }
155
+ peekGroupedGraph(integrationName) {
156
+ return this.groupedRecords.get(integrationName)?.assetsByRoute;
157
+ }
158
+ invalidateByFilePath(filePath) {
159
+ const normalizedFilePath = normalizeDependencyPath(filePath);
160
+ const affectedKeys = this.dependencyIndex.getAffectedKeys(normalizedFilePath);
161
+ let invalidated = 0;
162
+ for (const serializedKey of affectedKeys) {
163
+ if (serializedKey.startsWith('grouped::')) {
164
+ const integrationName = serializedKey.slice('grouped::'.length);
165
+ invalidated += this.invalidateGroupedRecord(integrationName);
166
+ continue;
167
+ }
168
+ invalidated += this.invalidateSerializedGraphKey(serializedKey);
169
+ }
170
+ for (const serializedKey of this.inFlight.keys()) {
171
+ const identity = parseSerializedGraphKey(serializedKey);
172
+ if (!identity) {
173
+ continue;
174
+ }
175
+ if (normalizeDependencyPath(identity.routeFile) !== normalizedFilePath) {
176
+ continue;
177
+ }
178
+ if (affectedKeys.has(serializedKey)) {
179
+ continue;
180
+ }
181
+ this.bumpGraphGeneration(serializedKey);
182
+ this.inFlight.delete(serializedKey);
183
+ invalidated += 1;
184
+ }
185
+ if (invalidated > 0) {
186
+ appLogger.debug(`[PageBrowserGraphSession] invalidated ${invalidated} graph record(s) for ${normalizedFilePath}`);
187
+ }
188
+ return invalidated;
189
+ }
190
+ invalidateRoute(integrationName, routeFile) {
191
+ const normalizedRoute = normalizeDependencyPath(routeFile);
192
+ for (const [serializedKey, record] of this.records) {
193
+ if (record.key.integrationName !== integrationName) {
194
+ continue;
195
+ }
196
+ if (normalizeDependencyPath(record.key.routeFile) !== normalizedRoute) {
197
+ continue;
198
+ }
199
+ this.invalidateSerializedGraphKey(serializedKey);
200
+ }
201
+ }
202
+ invalidateByRouteFile(routeFile) {
203
+ const normalizedRoute = normalizeDependencyPath(routeFile);
204
+ for (const [serializedKey, record] of this.records) {
205
+ if (normalizeDependencyPath(record.key.routeFile) !== normalizedRoute) {
206
+ continue;
207
+ }
208
+ this.invalidateSerializedGraphKey(serializedKey);
209
+ }
210
+ }
211
+ resetForTests() {
212
+ this.records.clear();
213
+ this.inFlight.clear();
214
+ this.groupedRecords.clear();
215
+ this.groupedInFlight.clear();
216
+ this.graphGenerations.clear();
217
+ this.groupedGenerations.clear();
218
+ this.dependencyIndex.resetForTests();
219
+ this.buildCount = 0;
220
+ }
221
+ exportRecords(policy) {
222
+ return [...this.records.values()].filter((record) => record.key.policy === policy);
223
+ }
224
+ clearPolicyRecords(policy) {
225
+ for (const [serializedKey, record] of this.records) {
226
+ if (record.key.policy !== policy) {
227
+ continue;
228
+ }
229
+ this.dependencyIndex.unbindRecord(record);
230
+ this.records.delete(serializedKey);
231
+ this.inFlight.delete(serializedKey);
232
+ this.graphGenerations.delete(serializedKey);
233
+ }
234
+ if (policy === 'production') {
235
+ for (const integrationName of [...this.groupedRecords.keys()]) {
236
+ const groupedRecord = this.groupedRecords.get(integrationName);
237
+ if (groupedRecord) {
238
+ this.dependencyIndex.unbindGroupedRecord(integrationName, groupedRecord);
239
+ }
240
+ this.groupedRecords.delete(integrationName);
241
+ this.groupedInFlight.delete(integrationName);
242
+ this.groupedGenerations.delete(integrationName);
243
+ }
244
+ }
245
+ }
246
+ pruneStaleRouteRecords(key) {
247
+ const normalizedRoute = normalizeDependencyPath(key.routeFile);
248
+ for (const [serializedKey, record] of this.records) {
249
+ if (record.key.integrationName !== key.integrationName) {
250
+ continue;
251
+ }
252
+ if (normalizeDependencyPath(record.key.routeFile) !== normalizedRoute) {
253
+ continue;
254
+ }
255
+ if (record.key.entryFingerprint === key.entryFingerprint && record.key.policy === key.policy) {
256
+ continue;
257
+ }
258
+ this.invalidateSerializedGraphKey(serializedKey);
259
+ }
260
+ }
261
+ bumpGraphGeneration(serializedKey) {
262
+ const next = (this.graphGenerations.get(serializedKey) ?? 0) + 1;
263
+ this.graphGenerations.set(serializedKey, next);
264
+ return next;
265
+ }
266
+ bumpGroupedGeneration(integrationName) {
267
+ const next = (this.groupedGenerations.get(integrationName) ?? 0) + 1;
268
+ this.groupedGenerations.set(integrationName, next);
269
+ return next;
270
+ }
271
+ invalidateSerializedGraphKey(serializedKey) {
272
+ const record = this.records.get(serializedKey);
273
+ if (record) {
274
+ this.dependencyIndex.unbindRecord(record);
275
+ this.records.delete(serializedKey);
276
+ }
277
+ this.bumpGraphGeneration(serializedKey);
278
+ this.inFlight.delete(serializedKey);
279
+ return record ? 1 : 0;
280
+ }
281
+ invalidateGroupedRecord(integrationName) {
229
282
  const groupedRecord = this.groupedRecords.get(integrationName);
230
283
  if (groupedRecord) {
231
- this.dependencyIndex.unbindGroupedRecord(integrationName, groupedRecord);
284
+ this.dependencyIndex.unbindGroupedRecord(integrationName, groupedRecord);
285
+ this.groupedRecords.delete(integrationName);
232
286
  }
233
- this.groupedRecords.delete(integrationName);
287
+ this.bumpGroupedGeneration(integrationName);
234
288
  this.groupedInFlight.delete(integrationName);
235
- this.groupedGenerations.delete(integrationName);
236
- }
237
- }
238
- }
239
- pruneStaleRouteRecords(key) {
240
- const normalizedRoute = normalizeDependencyPath(key.routeFile);
241
- for (const [serializedKey, record] of this.records) {
242
- if (record.key.integrationName !== key.integrationName) {
243
- continue;
244
- }
245
- if (normalizeDependencyPath(record.key.routeFile) !== normalizedRoute) {
246
- continue;
247
- }
248
- if (record.key.entryFingerprint === key.entryFingerprint && record.key.policy === key.policy) {
249
- continue;
250
- }
251
- this.invalidateSerializedGraphKey(serializedKey);
252
- }
253
- }
254
- bumpGraphGeneration(serializedKey) {
255
- const next = (this.graphGenerations.get(serializedKey) ?? 0) + 1;
256
- this.graphGenerations.set(serializedKey, next);
257
- return next;
258
- }
259
- bumpGroupedGeneration(integrationName) {
260
- const next = (this.groupedGenerations.get(integrationName) ?? 0) + 1;
261
- this.groupedGenerations.set(integrationName, next);
262
- return next;
263
- }
264
- invalidateSerializedGraphKey(serializedKey) {
265
- const record = this.records.get(serializedKey);
266
- if (record) {
267
- this.dependencyIndex.unbindRecord(record);
268
- this.records.delete(serializedKey);
269
- }
270
- this.bumpGraphGeneration(serializedKey);
271
- this.inFlight.delete(serializedKey);
272
- return record ? 1 : 0;
273
- }
274
- invalidateGroupedRecord(integrationName) {
275
- const groupedRecord = this.groupedRecords.get(integrationName);
276
- if (groupedRecord) {
277
- this.dependencyIndex.unbindGroupedRecord(integrationName, groupedRecord);
278
- this.groupedRecords.delete(integrationName);
279
- }
280
- this.bumpGroupedGeneration(integrationName);
281
- this.groupedInFlight.delete(integrationName);
282
- return groupedRecord ? 1 : 0;
283
- }
284
- async runGraphBuild(serializedKey, key, buildGeneration, build) {
285
- try {
286
- this.buildCount += 1;
287
- const buildResult = await build();
288
- if (!buildResult) {
289
- return void 0;
290
- }
291
- if (!this.canCommitGraphBuild(serializedKey, buildGeneration)) {
292
- const existing = this.records.get(serializedKey);
293
- return existing?.result;
294
- }
295
- this.pruneStaleRouteRecords(key);
296
- const previous = this.records.get(serializedKey);
297
- if (previous) {
298
- this.dependencyIndex.unbindRecord(previous);
299
- }
300
- const record = {
301
- key,
302
- result: buildResult.result,
303
- dependencyPaths: buildResult.dependencyPaths,
304
- committedAt: Date.now(),
305
- generation: buildGeneration
306
- };
307
- this.records.set(serializedKey, record);
308
- this.dependencyIndex.bindRecord(record);
309
- return record.result;
310
- } catch (error) {
311
- return Promise.reject(error);
312
- } finally {
313
- this.inFlight.delete(serializedKey);
314
- }
315
- }
316
- async runGroupedBuild(integrationName, buildGeneration, build) {
317
- try {
318
- this.buildCount += 1;
319
- const buildResult = await build();
320
- if (!buildResult) {
321
- return /* @__PURE__ */ new Map();
322
- }
323
- if (isSkipCacheGroupedOutcome(buildResult)) {
324
- return buildResult.assetsByRoute;
325
- }
326
- if (!this.canCommitGroupedBuild(integrationName, buildGeneration)) {
327
- const existing = this.groupedRecords.get(integrationName);
328
- return existing?.assetsByRoute ?? /* @__PURE__ */ new Map();
329
- }
330
- const previous = this.groupedRecords.get(integrationName);
331
- if (previous) {
332
- this.dependencyIndex.unbindGroupedRecord(integrationName, previous);
333
- }
334
- const record = {
335
- assetsByRoute: buildResult.assetsByRoute,
336
- dependencyPaths: buildResult.dependencyPaths,
337
- generation: buildGeneration
338
- };
339
- this.groupedRecords.set(integrationName, record);
340
- this.dependencyIndex.bindGroupedRecord(integrationName, record);
341
- return record.assetsByRoute;
342
- } catch (error) {
343
- return Promise.reject(error);
344
- } finally {
345
- this.groupedInFlight.delete(integrationName);
346
- }
347
- }
348
- canCommitGraphBuild(serializedKey, buildGeneration) {
349
- return this.graphGenerations.get(serializedKey) === buildGeneration;
350
- }
351
- canCommitGroupedBuild(integrationName, buildGeneration) {
352
- return this.groupedGenerations.get(integrationName) === buildGeneration;
353
- }
289
+ return groupedRecord ? 1 : 0;
290
+ }
291
+ async runGraphBuild(serializedKey, key, buildGeneration, build) {
292
+ try {
293
+ this.buildCount += 1;
294
+ const buildResult = await build();
295
+ if (!buildResult) {
296
+ return undefined;
297
+ }
298
+ if (!this.canCommitGraphBuild(serializedKey, buildGeneration)) {
299
+ const existing = this.records.get(serializedKey);
300
+ return existing?.result;
301
+ }
302
+ this.pruneStaleRouteRecords(key);
303
+ const previous = this.records.get(serializedKey);
304
+ if (previous) {
305
+ this.dependencyIndex.unbindRecord(previous);
306
+ }
307
+ const record = {
308
+ key,
309
+ result: buildResult.result,
310
+ dependencyPaths: buildResult.dependencyPaths,
311
+ committedAt: Date.now(),
312
+ generation: buildGeneration,
313
+ };
314
+ this.records.set(serializedKey, record);
315
+ this.dependencyIndex.bindRecord(record);
316
+ return record.result;
317
+ }
318
+ catch (error) {
319
+ return Promise.reject(error);
320
+ }
321
+ finally {
322
+ this.inFlight.delete(serializedKey);
323
+ }
324
+ }
325
+ async runGroupedBuild(integrationName, buildGeneration, build) {
326
+ try {
327
+ this.buildCount += 1;
328
+ const buildResult = await build();
329
+ if (!buildResult) {
330
+ return new Map();
331
+ }
332
+ if (isSkipCacheGroupedOutcome(buildResult)) {
333
+ return buildResult.assetsByRoute;
334
+ }
335
+ if (!this.canCommitGroupedBuild(integrationName, buildGeneration)) {
336
+ const existing = this.groupedRecords.get(integrationName);
337
+ return existing?.assetsByRoute ?? new Map();
338
+ }
339
+ const previous = this.groupedRecords.get(integrationName);
340
+ if (previous) {
341
+ this.dependencyIndex.unbindGroupedRecord(integrationName, previous);
342
+ }
343
+ const record = {
344
+ assetsByRoute: buildResult.assetsByRoute,
345
+ dependencyPaths: buildResult.dependencyPaths,
346
+ generation: buildGeneration,
347
+ };
348
+ this.groupedRecords.set(integrationName, record);
349
+ this.dependencyIndex.bindGroupedRecord(integrationName, record);
350
+ return record.assetsByRoute;
351
+ }
352
+ catch (error) {
353
+ return Promise.reject(error);
354
+ }
355
+ finally {
356
+ this.groupedInFlight.delete(integrationName);
357
+ }
358
+ }
359
+ canCommitGraphBuild(serializedKey, buildGeneration) {
360
+ return this.graphGenerations.get(serializedKey) === buildGeneration;
361
+ }
362
+ canCommitGroupedBuild(integrationName, buildGeneration) {
363
+ return this.groupedGenerations.get(integrationName) === buildGeneration;
364
+ }
354
365
  }
355
- const sessionByAppConfig = /* @__PURE__ */ new WeakMap();
356
- function getAppPageBrowserGraphSession(appConfig) {
357
- const existing = appConfig.runtime?.pageBrowserGraphSession;
358
- if (existing) {
359
- return existing;
360
- }
361
- const cached = sessionByAppConfig.get(appConfig);
362
- if (cached) {
363
- return cached;
364
- }
365
- const session = new SessionPageBrowserGraphCache();
366
- sessionByAppConfig.set(appConfig, session);
367
- appConfig.runtime = {
368
- ...appConfig.runtime ?? {},
369
- pageBrowserGraphSession: session
370
- };
371
- return session;
366
+ const sessionByAppConfig = new WeakMap();
367
+ /**
368
+ * Returns the session graph cache for one app instance.
369
+ */
370
+ export function getAppPageBrowserGraphSession(appConfig) {
371
+ const existing = appConfig.runtime?.pageBrowserGraphSession;
372
+ if (existing) {
373
+ return existing;
374
+ }
375
+ const cached = sessionByAppConfig.get(appConfig);
376
+ if (cached) {
377
+ return cached;
378
+ }
379
+ const session = new SessionPageBrowserGraphCache();
380
+ sessionByAppConfig.set(appConfig, session);
381
+ appConfig.runtime = {
382
+ ...(appConfig.runtime ?? {}),
383
+ pageBrowserGraphSession: session,
384
+ };
385
+ return session;
372
386
  }
373
- function invalidatePageBrowserGraphSession(appConfig, filePath) {
374
- return getAppPageBrowserGraphSession(appConfig).invalidateByFilePath(filePath);
387
+ /**
388
+ * Invalidates graph records that depend on the changed file path.
389
+ */
390
+ export function invalidatePageBrowserGraphSession(appConfig, filePath) {
391
+ return getAppPageBrowserGraphSession(appConfig).invalidateByFilePath(filePath);
375
392
  }
376
- function getAffectedPageBrowserGraphIdentities(appConfig, filePath) {
377
- return getAppPageBrowserGraphSession(appConfig).getAffectedGraphIdentities(filePath);
393
+ /**
394
+ * Returns graph identities affected by a source file change.
395
+ */
396
+ export function getAffectedPageBrowserGraphIdentities(appConfig, filePath) {
397
+ return getAppPageBrowserGraphSession(appConfig).getAffectedGraphIdentities(filePath);
378
398
  }
379
- function createPageBrowserGraphEntryFingerprint(contribution) {
380
- const descriptors = [
381
- ...(contribution.dependencies ?? []).map((dependency) => describeAssetDependency(dependency)),
382
- ...(contribution.assets ?? []).map((asset) => describeProcessedAsset(asset))
383
- ].sort((left, right) => left.localeCompare(right));
384
- return descriptors.join("|") || "empty";
399
+ /**
400
+ * Builds a stable fingerprint from declared browser-entry dependencies and assets.
401
+ */
402
+ export function createPageBrowserGraphEntryFingerprint(contribution) {
403
+ const descriptors = [
404
+ ...(contribution.dependencies ?? []).map((dependency) => describeAssetDependency(dependency)),
405
+ ...(contribution.assets ?? []).map((asset) => describeProcessedAsset(asset)),
406
+ ].sort((left, right) => left.localeCompare(right));
407
+ return descriptors.join('|') || 'empty';
385
408
  }
386
- function collectPageBrowserGraphDependencyPaths(routeFile, contribution, processedAssets) {
387
- const dependencyPaths = /* @__PURE__ */ new Set([normalizeDependencyPath(routeFile)]);
388
- for (const dependency of contribution.dependencies ?? []) {
389
- if (dependency.source === "file") {
390
- dependencyPaths.add(normalizeDependencyPath(dependency.filepath));
391
- }
392
- }
393
- for (const asset of processedAssets) {
394
- if (asset.sourceFilepath) {
395
- dependencyPaths.add(normalizeDependencyPath(asset.sourceFilepath));
396
- }
397
- for (const bundledSourceFilepath of asset.bundledSourceFilepaths ?? []) {
398
- dependencyPaths.add(normalizeDependencyPath(bundledSourceFilepath));
399
- }
400
- }
401
- return dependencyPaths;
409
+ /**
410
+ * Collects dependency paths used for graph invalidation.
411
+ */
412
+ export function collectPageBrowserGraphDependencyPaths(routeFile, contribution, processedAssets) {
413
+ const dependencyPaths = new Set([normalizeDependencyPath(routeFile)]);
414
+ for (const dependency of contribution.dependencies ?? []) {
415
+ if (dependency.source === 'file') {
416
+ dependencyPaths.add(normalizeDependencyPath(dependency.filepath));
417
+ }
418
+ }
419
+ for (const asset of processedAssets) {
420
+ if (asset.sourceFilepath) {
421
+ dependencyPaths.add(normalizeDependencyPath(asset.sourceFilepath));
422
+ }
423
+ for (const bundledSourceFilepath of asset.bundledSourceFilepaths ?? []) {
424
+ dependencyPaths.add(normalizeDependencyPath(bundledSourceFilepath));
425
+ }
426
+ }
427
+ return dependencyPaths;
402
428
  }
403
429
  function describeProcessedAsset(asset) {
404
- const filepath = asset.filepath ?? "";
405
- const sourceFilepath = asset.sourceFilepath ?? "";
406
- const content = typeof asset.content === "string" ? asset.content : "";
407
- const contentDigest = content ? createHash("sha1").update(content).digest("hex").slice(0, 12) : "";
408
- return `asset:${asset.kind}:${filepath}:${sourceFilepath}:${contentDigest}`;
430
+ const filepath = asset.filepath ?? '';
431
+ const sourceFilepath = asset.sourceFilepath ?? '';
432
+ const content = typeof asset.content === 'string' ? asset.content : '';
433
+ const contentDigest = content ? createHash('sha1').update(content).digest('hex').slice(0, 12) : '';
434
+ return `asset:${asset.kind}:${filepath}:${sourceFilepath}:${contentDigest}`;
409
435
  }
410
436
  function describeAssetDependency(dependency) {
411
- switch (dependency.source) {
412
- case "file":
413
- return `file:${dependency.filepath}`;
414
- case "node-module":
415
- return `module:${dependency.importPath}`;
416
- case "content": {
417
- const content = typeof dependency.content === "string" ? dependency.content : "";
418
- const contentDigest = createHash("sha1").update(content).digest("hex").slice(0, 12);
419
- const name = "name" in dependency && typeof dependency.name === "string" ? dependency.name : "";
420
- return `content:${dependency.kind}:${name}:${contentDigest}`;
421
- }
422
- default: {
423
- const exhaustive = dependency;
424
- return String(exhaustive);
425
- }
426
- }
437
+ switch (dependency.source) {
438
+ case 'file':
439
+ return `file:${dependency.filepath}`;
440
+ case 'node-module':
441
+ return `module:${dependency.importPath}`;
442
+ case 'content': {
443
+ const content = typeof dependency.content === 'string' ? dependency.content : '';
444
+ const contentDigest = createHash('sha1').update(content).digest('hex').slice(0, 12);
445
+ const name = 'name' in dependency && typeof dependency.name === 'string' ? dependency.name : '';
446
+ return `content:${dependency.kind}:${name}:${contentDigest}`;
447
+ }
448
+ default: {
449
+ const exhaustive = dependency;
450
+ return String(exhaustive);
451
+ }
452
+ }
427
453
  }
428
- export {
429
- GraphDependencyIndex,
430
- SessionPageBrowserGraphCache,
431
- collectPageBrowserGraphDependencyPaths,
432
- createPageBrowserGraphEntryFingerprint,
433
- getAffectedPageBrowserGraphIdentities,
434
- getAppPageBrowserGraphSession,
435
- invalidatePageBrowserGraphSession
436
- };