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

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 (338) hide show
  1. package/README.md +1 -0
  2. package/package.json +82 -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/client/link-intent.js +55 -39
  249. package/src/router/client/link-intent.test.browser.js +49 -49
  250. package/src/router/client/link-navigation-policy.js +114 -93
  251. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  252. package/src/router/client/navigation-coordinator.js +235 -211
  253. package/src/router/server/route-registry.js +237 -242
  254. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  255. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  256. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  257. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  258. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  259. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  260. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  261. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  262. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  263. package/src/services/assets/asset-processing-service/index.js +8 -8
  264. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  265. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  266. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  267. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  268. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  269. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  270. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  271. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  272. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  273. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  274. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  275. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  276. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  277. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  278. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  279. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  280. package/src/services/assets/browser-bundle.service.js +52 -47
  281. package/src/services/cache/cache.types.js +5 -0
  282. package/src/services/cache/index.js +6 -7
  283. package/src/services/cache/memory-cache-store.js +101 -89
  284. package/src/services/cache/page-cache-service.js +156 -145
  285. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  286. package/src/services/html/html-rewriter-provider.service.js +61 -61
  287. package/src/services/html/html-transformer.service.js +249 -266
  288. package/src/services/invalidation/development-invalidation.service.js +252 -241
  289. package/src/services/module-loading/app-module-loader.service.js +1 -0
  290. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  291. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  292. package/src/services/module-loading/module-loading-types.js +1 -0
  293. package/src/services/module-loading/page-module-import.service.js +235 -243
  294. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  295. package/src/services/module-loading/route-module-build-cache.js +3 -38
  296. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  297. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  298. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  299. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  300. package/src/services/module-loading/source-module-support.js +15 -7
  301. package/src/services/runtime-state/dev-graph.service.js +165 -157
  302. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  303. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  304. package/src/services/validation/schema-validation-service.js +157 -95
  305. package/src/services/validation/standard-schema.types.js +1 -0
  306. package/src/services/validation/validate-standard-schema.js +13 -13
  307. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  308. package/src/static-site-generator/sitemap-routes.js +33 -28
  309. package/src/static-site-generator/sitemap.js +38 -29
  310. package/src/static-site-generator/static-build-invalidation.js +34 -56
  311. package/src/static-site-generator/static-export-context.js +1 -0
  312. package/src/static-site-generator/static-site-generator.js +517 -553
  313. package/src/types/internal-types.d.ts +19 -3
  314. package/src/types/internal-types.js +1 -0
  315. package/src/types/public-types.d.ts +16 -46
  316. package/src/types/public-types.js +1 -0
  317. package/src/utils/deep-merge.js +39 -26
  318. package/src/utils/ecopages-route-info.js +27 -23
  319. package/src/utils/hash.js +3 -6
  320. package/src/utils/html-escaping.js +21 -8
  321. package/src/utils/html.js +1 -4
  322. package/src/utils/invariant.js +11 -10
  323. package/src/utils/locals-utils.js +32 -22
  324. package/src/utils/parse-cli-args.js +73 -65
  325. package/src/utils/path-pattern.js +38 -23
  326. package/src/utils/path-utils.module.js +8 -11
  327. package/src/utils/resolve-entry-file.js +70 -38
  328. package/src/utils/resolve-work-dir.js +23 -27
  329. package/src/utils/runtime.js +24 -33
  330. package/src/utils/server-utils.module.js +60 -52
  331. package/src/utils/static-file-extensions.js +52 -46
  332. package/src/watchers/project-watcher-ignore.js +16 -15
  333. package/src/watchers/project-watcher.js +385 -366
  334. package/src/watchers/project-watcher.test-helpers.js +45 -50
  335. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  336. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  337. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  338. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,91 +1,90 @@
1
- import { isDevelopmentRuntime } from "../../../utils/runtime.js";
2
- import { finalizeProcessedAsset } from "./finalize-processed-asset.js";
1
+ import { isDevelopmentRuntime } from '../../../utils/runtime.js';
2
+ import { finalizeProcessedAsset } from './finalize-processed-asset.js';
3
3
  function getGroupedBundleAssetKey(groupedBundle) {
4
- return `${groupedBundle.id}:${groupedBundle.entryName}`;
4
+ return `${groupedBundle.id}:${groupedBundle.entryName}`;
5
5
  }
6
- function ensureGroupedContentScriptsBundle(dependencies) {
7
- if (isDevelopmentRuntime()) {
8
- return;
9
- }
10
- for (const dependency of dependencies) {
11
- if (dependency.kind !== "script" || dependency.source !== "content" || !dependency.groupedBundle?.id) {
12
- continue;
6
+ /** Forces grouped content scripts to run through the bundler in production builds. */
7
+ export function ensureGroupedContentScriptsBundle(dependencies) {
8
+ if (isDevelopmentRuntime()) {
9
+ return;
13
10
  }
14
- if (dependency.bundle === false) {
15
- dependency.bundle = true;
11
+ for (const dependency of dependencies) {
12
+ if (dependency.kind !== 'script' || dependency.source !== 'content' || !dependency.groupedBundle?.id) {
13
+ continue;
14
+ }
15
+ if (dependency.bundle === false) {
16
+ dependency.bundle = true;
17
+ }
16
18
  }
17
- }
18
19
  }
19
- function partitionGroupedContentScriptDependencies(typeDeps) {
20
- const groupedBundleDeps = /* @__PURE__ */ new Map();
21
- const ungroupedDeps = [];
22
- for (const dep of typeDeps) {
23
- if (dep.kind === "script" && dep.source === "content" && dep.groupedBundle?.id) {
24
- const existing = groupedBundleDeps.get(dep.groupedBundle.id) ?? [];
25
- existing.push(dep);
26
- groupedBundleDeps.set(dep.groupedBundle.id, existing);
27
- continue;
20
+ /**
21
+ * Splits grouped content-script dependencies from ordinary dependencies so callers can
22
+ * route them through `processGrouped` without changing ordering for the remaining assets.
23
+ */
24
+ export function partitionGroupedContentScriptDependencies(typeDeps) {
25
+ const groupedBundleDeps = new Map();
26
+ const ungroupedDeps = [];
27
+ for (const dep of typeDeps) {
28
+ if (dep.kind === 'script' && dep.source === 'content' && dep.groupedBundle?.id) {
29
+ const existing = groupedBundleDeps.get(dep.groupedBundle.id) ?? [];
30
+ existing.push(dep);
31
+ groupedBundleDeps.set(dep.groupedBundle.id, existing);
32
+ continue;
33
+ }
34
+ ungroupedDeps.push(dep);
28
35
  }
29
- ungroupedDeps.push(dep);
30
- }
31
- return {
32
- groupedBundleDeps,
33
- ungroupedDeps
34
- };
36
+ return {
37
+ groupedBundleDeps,
38
+ ungroupedDeps,
39
+ };
35
40
  }
36
- async function processGroupedDependencyBundles(options) {
37
- const {
38
- bundles,
39
- getCachedAsset,
40
- getDependencyKey,
41
- getGroupedProcessor,
42
- resolveProcessedAssetSrcUrl,
43
- setCachedAsset,
44
- logError
45
- } = options;
46
- const groupedPromises = bundles.map(async (bundleDeps) => {
47
- const cachedResults = bundleDeps.map((dep) => {
48
- const cached = getCachedAsset(dep, getDependencyKey(dep));
49
- return cached ? finalizeProcessedAsset(cached, resolveProcessedAssetSrcUrl) : null;
50
- });
51
- if (cachedResults.every((result) => result !== null)) {
52
- return cachedResults.filter((result) => result !== null);
53
- }
54
- const processor = getGroupedProcessor();
55
- if (!processor?.processGrouped) {
56
- return [];
57
- }
58
- try {
59
- const processedResults = await processor.processGrouped(bundleDeps);
60
- const processedByEntryKey = /* @__PURE__ */ new Map();
61
- for (const processed of processedResults) {
62
- if (!processed.groupedBundle) {
63
- continue;
41
+ /**
42
+ * Processes grouped content-script bundles while preserving per-entry cache keys.
43
+ *
44
+ * When every dependency in a bundle already has a cached processed asset, the cached
45
+ * entries are returned directly and the grouped processor is skipped.
46
+ */
47
+ export async function processGroupedDependencyBundles(options) {
48
+ const { bundles, getCachedAsset, getDependencyKey, getGroupedProcessor, resolveProcessedAssetSrcUrl, setCachedAsset, logError, } = options;
49
+ const groupedPromises = bundles.map(async (bundleDeps) => {
50
+ const cachedResults = bundleDeps.map((dep) => {
51
+ const cached = getCachedAsset(dep, getDependencyKey(dep));
52
+ return cached ? finalizeProcessedAsset(cached, resolveProcessedAssetSrcUrl) : null;
53
+ });
54
+ if (cachedResults.every((result) => result !== null)) {
55
+ return cachedResults.filter((result) => result !== null);
64
56
  }
65
- processedByEntryKey.set(getGroupedBundleAssetKey(processed.groupedBundle), processed);
66
- }
67
- return bundleDeps.flatMap((dep) => {
68
- if (dep.kind !== "script" || dep.source !== "content" || !dep.groupedBundle) {
69
- return [];
57
+ const processor = getGroupedProcessor();
58
+ if (!processor?.processGrouped) {
59
+ return [];
70
60
  }
71
- const processed = processedByEntryKey.get(getGroupedBundleAssetKey(dep.groupedBundle));
72
- if (!processed) {
73
- return [];
61
+ try {
62
+ const processedResults = await processor.processGrouped(bundleDeps);
63
+ const processedByEntryKey = new Map();
64
+ for (const processed of processedResults) {
65
+ if (!processed.groupedBundle) {
66
+ continue;
67
+ }
68
+ processedByEntryKey.set(getGroupedBundleAssetKey(processed.groupedBundle), processed);
69
+ }
70
+ return bundleDeps.flatMap((dep) => {
71
+ if (dep.kind !== 'script' || dep.source !== 'content' || !dep.groupedBundle) {
72
+ return [];
73
+ }
74
+ const processed = processedByEntryKey.get(getGroupedBundleAssetKey(dep.groupedBundle));
75
+ if (!processed) {
76
+ return [];
77
+ }
78
+ const depKey = getDependencyKey(dep);
79
+ const finalized = finalizeProcessedAsset(processed, resolveProcessedAssetSrcUrl);
80
+ setCachedAsset(dep, depKey, finalized);
81
+ return [finalized];
82
+ });
74
83
  }
75
- const depKey = getDependencyKey(dep);
76
- const finalized = finalizeProcessedAsset(processed, resolveProcessedAssetSrcUrl);
77
- setCachedAsset(dep, depKey, finalized);
78
- return [finalized];
79
- });
80
- } catch (error) {
81
- logError(error);
82
- return [];
83
- }
84
- });
85
- return (await Promise.all(groupedPromises)).flat();
84
+ catch (error) {
85
+ logError(error);
86
+ return [];
87
+ }
88
+ });
89
+ return (await Promise.all(groupedPromises)).flat();
86
90
  }
87
- export {
88
- ensureGroupedContentScriptsBundle,
89
- partitionGroupedContentScriptDependencies,
90
- processGroupedDependencyBundles
91
- };
@@ -1,8 +1,8 @@
1
- export * from "./asset.factory.js";
2
- export * from "./grouped-content-bundles.js";
3
- export * from "./page-package.js";
4
- export * from "./asset-processing.service.js";
5
- export * from "./assets.types.js";
6
- export * from "./browser-runtime-asset.factory.js";
7
- export * from "./browser-runtime-entry.factory.js";
8
- export * from "./browser-runtime-entry-resolution.js";
1
+ export * from './asset.factory.js';
2
+ export * from './grouped-content-bundles.js';
3
+ export * from './page-package.js';
4
+ export * from './asset-processing.service.js';
5
+ export * from './assets.types.js';
6
+ export * from './browser-runtime-asset.factory.js';
7
+ export * from './browser-runtime-entry.factory.js';
8
+ export * from './browser-runtime-entry-resolution.js';
@@ -1,17 +1,23 @@
1
- import { fileSystem } from "@ecopages/file-system";
2
- import { appLogger } from "../../../global/app-logger.js";
3
- function resolveInlineContentScriptBody(dep, filepath) {
4
- if (!dep.inline) {
5
- return void 0;
6
- }
7
- if (dep.bundle !== false && fileSystem.exists(filepath)) {
8
- return fileSystem.readFileSync(filepath);
9
- }
10
- if (dep.bundle !== false) {
11
- appLogger.warn(`Missing bundled inline script output at ${filepath}; falling back to declaration source.`);
12
- }
13
- return dep.content;
1
+ import { fileSystem } from '@ecopages/file-system';
2
+ import { appLogger } from '../../../global/app-logger.js';
3
+ /**
4
+ * Resolves the script body to embed when a content script is marked inline.
5
+ *
6
+ * @remarks
7
+ * `inline` means embed in HTML, not "use declaration source." When bundling has
8
+ * already run, only the output file is valid browser script; `dep.content` may
9
+ * still contain build-time import paths. Processor emission and cache
10
+ * materialization must share this rule so they cannot drift.
11
+ */
12
+ export function resolveInlineContentScriptBody(dep, filepath) {
13
+ if (!dep.inline) {
14
+ return undefined;
15
+ }
16
+ if (dep.bundle !== false && fileSystem.exists(filepath)) {
17
+ return fileSystem.readFileSync(filepath);
18
+ }
19
+ if (dep.bundle !== false) {
20
+ appLogger.warn(`Missing bundled inline script output at ${filepath}; falling back to declaration source.`);
21
+ }
22
+ return dep.content;
14
23
  }
15
- export {
16
- resolveInlineContentScriptBody
17
- };
@@ -1,18 +1,22 @@
1
- import { resolveInlineContentScriptBody } from "./inline-content-script-body.js";
2
- function materializeContentScriptAsset(dep, filepath) {
3
- return {
4
- filepath,
5
- kind: "script",
6
- inline: dep.inline ?? false,
7
- content: resolveInlineContentScriptBody(dep, filepath),
8
- position: dep.position,
9
- attributes: dep.attributes,
10
- excludeFromHtml: dep.excludeFromHtml,
11
- packageRole: dep.packageRole,
12
- groupedBundle: dep.groupedBundle,
13
- bundledSourceFilepaths: dep.bundledSourceFilepaths
14
- };
1
+ import { resolveInlineContentScriptBody } from './inline-content-script-body.js';
2
+ /**
3
+ * @remarks
4
+ * {@link AssetProcessingService} cache and dev disk cache entries usually keep
5
+ * only an output path. Dependency declarations still carry the metadata HTML and
6
+ * page-browser graph assembly need (`groupedBundle`, attributes, roles), so cache
7
+ * hits must be rehydrated from both sources rather than returned verbatim.
8
+ */
9
+ export function materializeContentScriptAsset(dep, filepath) {
10
+ return {
11
+ filepath,
12
+ kind: 'script',
13
+ inline: dep.inline ?? false,
14
+ content: resolveInlineContentScriptBody(dep, filepath),
15
+ position: dep.position,
16
+ attributes: dep.attributes,
17
+ excludeFromHtml: dep.excludeFromHtml,
18
+ packageRole: dep.packageRole,
19
+ groupedBundle: dep.groupedBundle,
20
+ bundledSourceFilepaths: dep.bundledSourceFilepaths,
21
+ };
15
22
  }
16
- export {
17
- materializeContentScriptAsset
18
- };
@@ -1,80 +1,78 @@
1
1
  function getSuppressedSourceFilepaths(assets) {
2
- const suppressed = /* @__PURE__ */ new Set();
3
- for (const asset of assets) {
4
- if ((asset.packageRole === "page-style" || asset.packageRole === "page-script") && Array.isArray(asset.bundledSourceFilepaths)) {
5
- for (const filepath of asset.bundledSourceFilepaths) {
6
- suppressed.add(filepath);
7
- }
2
+ const suppressed = new Set();
3
+ for (const asset of assets) {
4
+ if ((asset.packageRole === 'page-style' || asset.packageRole === 'page-script') &&
5
+ Array.isArray(asset.bundledSourceFilepaths)) {
6
+ for (const filepath of asset.bundledSourceFilepaths) {
7
+ suppressed.add(filepath);
8
+ }
9
+ }
8
10
  }
9
- }
10
- return suppressed;
11
+ return suppressed;
11
12
  }
12
- function createPagePackage(assets, options = {}) {
13
- const allAssets = [
14
- ...assets,
15
- ...options.pageBrowserGraph?.entryAssets ?? [],
16
- ...options.pageBrowserGraph?.chunkAssets ?? []
17
- ];
18
- const inlineAssets = [];
19
- const separateAssets = [];
20
- const dynamicChunks = [];
21
- let pageScript;
22
- let pageStylesheet;
23
- const suppressedSourceFilepaths = getSuppressedSourceFilepaths(allAssets);
24
- for (const asset of allAssets) {
25
- if (asset.inline) {
26
- inlineAssets.push(asset);
27
- continue;
13
+ export function createPagePackage(assets, options = {}) {
14
+ const allAssets = [
15
+ ...assets,
16
+ ...(options.pageBrowserGraph?.entryAssets ?? []),
17
+ ...(options.pageBrowserGraph?.chunkAssets ?? []),
18
+ ];
19
+ const inlineAssets = [];
20
+ const separateAssets = [];
21
+ const dynamicChunks = [];
22
+ let pageScript;
23
+ let pageStylesheet;
24
+ const suppressedSourceFilepaths = getSuppressedSourceFilepaths(allAssets);
25
+ for (const asset of allAssets) {
26
+ if (asset.inline) {
27
+ inlineAssets.push(asset);
28
+ continue;
29
+ }
30
+ if (asset.packageRole === 'dynamic-chunk') {
31
+ dynamicChunks.push(asset);
32
+ continue;
33
+ }
34
+ if (!pageScript && asset.packageRole === 'page-script') {
35
+ pageScript = asset;
36
+ continue;
37
+ }
38
+ if (!pageStylesheet && asset.packageRole === 'page-style') {
39
+ pageStylesheet = asset;
40
+ continue;
41
+ }
42
+ if (asset.packageRole === 'keep-separate' || asset.packageRole === 'runtime') {
43
+ separateAssets.push(asset);
44
+ continue;
45
+ }
46
+ if (!pageScript && asset.kind === 'script' && !asset.excludeFromHtml) {
47
+ pageScript = asset;
48
+ continue;
49
+ }
50
+ if (!pageStylesheet && asset.kind === 'stylesheet') {
51
+ pageStylesheet = asset;
52
+ continue;
53
+ }
54
+ separateAssets.push(asset);
28
55
  }
29
- if (asset.packageRole === "dynamic-chunk") {
30
- dynamicChunks.push(asset);
31
- continue;
32
- }
33
- if (!pageScript && asset.packageRole === "page-script") {
34
- pageScript = asset;
35
- continue;
36
- }
37
- if (!pageStylesheet && asset.packageRole === "page-style") {
38
- pageStylesheet = asset;
39
- continue;
40
- }
41
- if (asset.packageRole === "keep-separate" || asset.packageRole === "runtime") {
42
- separateAssets.push(asset);
43
- continue;
56
+ return {
57
+ assets: allAssets,
58
+ pageBrowserGraph: options.pageBrowserGraph,
59
+ htmlAssets: allAssets.filter((asset) => shouldIncludeInHtml(asset, suppressedSourceFilepaths)),
60
+ pageScript,
61
+ pageStylesheet,
62
+ inlineAssets,
63
+ separateAssets,
64
+ dynamicChunks,
65
+ };
66
+ }
67
+ function shouldIncludeInHtml(asset, suppressedSourceFilepaths) {
68
+ if (asset.excludeFromHtml) {
69
+ return false;
44
70
  }
45
- if (!pageScript && asset.kind === "script" && !asset.excludeFromHtml) {
46
- pageScript = asset;
47
- continue;
71
+ if (asset.packageRole === 'runtime') {
72
+ return false;
48
73
  }
49
- if (!pageStylesheet && asset.kind === "stylesheet") {
50
- pageStylesheet = asset;
51
- continue;
74
+ if (asset.sourceFilepath && suppressedSourceFilepaths.has(asset.sourceFilepath)) {
75
+ return false;
52
76
  }
53
- separateAssets.push(asset);
54
- }
55
- return {
56
- assets: allAssets,
57
- pageBrowserGraph: options.pageBrowserGraph,
58
- htmlAssets: allAssets.filter((asset) => shouldIncludeInHtml(asset, suppressedSourceFilepaths)),
59
- pageScript,
60
- pageStylesheet,
61
- inlineAssets,
62
- separateAssets,
63
- dynamicChunks
64
- };
65
- }
66
- function shouldIncludeInHtml(asset, suppressedSourceFilepaths) {
67
- if (asset.excludeFromHtml) {
68
- return false;
69
- }
70
- if (asset.packageRole === "runtime") {
71
- return false;
72
- }
73
- if (asset.sourceFilepath && suppressedSourceFilepaths.has(asset.sourceFilepath)) {
74
- return false;
75
- }
76
- return true;
77
+ return true;
77
78
  }
78
- export {
79
- createPagePackage
80
- };
@@ -1,6 +1,8 @@
1
- function isHmrAware(processor) {
2
- return "setHmrManager" in processor && typeof processor.setHmrManager === "function";
1
+ /**
2
+ * Type guard to check if a processor supports HMR.
3
+ * @param processor - The processor to check
4
+ * @returns True if the processor implements HmrAwareProcessor
5
+ */
6
+ export function isHmrAware(processor) {
7
+ return 'setHmrManager' in processor && typeof processor.setHmrManager === 'function';
3
8
  }
4
- export {
5
- isHmrAware
6
- };
@@ -1,15 +1,12 @@
1
- class ProcessorRegistry {
2
- processors = /* @__PURE__ */ new Map();
3
- register(kind, variant, processor) {
4
- this.processors.set(`${kind}-${variant}`, processor);
5
- }
6
- getProcessor(kind, variant) {
7
- return this.processors.get(`${kind}-${variant}`);
8
- }
9
- getAllProcessors() {
10
- return this.processors;
11
- }
1
+ export class ProcessorRegistry {
2
+ processors = new Map();
3
+ register(kind, variant, processor) {
4
+ this.processors.set(`${kind}-${variant}`, processor);
5
+ }
6
+ getProcessor(kind, variant) {
7
+ return this.processors.get(`${kind}-${variant}`);
8
+ }
9
+ getAllProcessors() {
10
+ return this.processors;
11
+ }
12
12
  }
13
- export {
14
- ProcessorRegistry
15
- };
@@ -1,65 +1,62 @@
1
- import path from "node:path";
2
- import { RESOLVED_ASSETS_DIR } from "../../../../../config/constants.js";
3
- import { rapidhash } from "../../../../../utils/hash.js";
4
- import { isDevelopmentRuntime, isProductionRuntime } from "../../../../../utils/runtime.js";
5
- import { fileSystem } from "@ecopages/file-system";
6
- class BaseProcessor {
7
- appConfig;
8
- /**
9
- * Cache for processed assets to avoid reprocessing the same asset multiple times.
10
- * The cache key is a combination of the asset name and its hash.
11
- * The cache value is the processed asset.
12
- */
13
- cache = /* @__PURE__ */ new Map();
14
- constructor({ appConfig }) {
15
- this.appConfig = appConfig;
16
- }
17
- get isDevelopment() {
18
- return isDevelopmentRuntime();
19
- }
20
- get isProduction() {
21
- return isProductionRuntime();
22
- }
23
- getAssetsDir() {
24
- return path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR);
25
- }
26
- writeCacheFile(key, path2) {
27
- this.cache.set(key, path2);
28
- }
29
- getCacheFile(key) {
30
- return this.cache.get(key);
31
- }
32
- hasCacheFile(key) {
33
- return this.cache.has(key);
34
- }
35
- generateHash(content) {
36
- return rapidhash(content).toString();
37
- }
38
- buildCacheKey(identifier, contentHash, dep) {
39
- const attrsHash = dep.attributes ? this.generateHash(JSON.stringify(dep.attributes)) : "";
40
- const position = dep.position ?? "";
41
- const packageRole = dep.packageRole ?? "";
42
- return `${identifier}:${contentHash}:${position}:${attrsHash}:${packageRole}`;
43
- }
44
- getOrProcess(cacheKey, processFn) {
45
- if (this.hasCacheFile(cacheKey)) {
46
- const cached = this.getCacheFile(cacheKey);
47
- if (!cached.filepath || fileSystem.exists(cached.filepath)) {
48
- return Promise.resolve(cached);
49
- }
50
- this.cache.delete(cacheKey);
1
+ import path from 'node:path';
2
+ import { RESOLVED_ASSETS_DIR } from '../../../../../config/constants.js';
3
+ import { rapidhash } from '../../../../../utils/hash.js';
4
+ import { isDevelopmentRuntime, isProductionRuntime } from '../../../../../utils/runtime.js';
5
+ import { fileSystem } from '@ecopages/file-system';
6
+ export class BaseProcessor {
7
+ appConfig;
8
+ /**
9
+ * Cache for processed assets to avoid reprocessing the same asset multiple times.
10
+ * The cache key is a combination of the asset name and its hash.
11
+ * The cache value is the processed asset.
12
+ */
13
+ cache = new Map();
14
+ constructor({ appConfig }) {
15
+ this.appConfig = appConfig;
51
16
  }
52
- const result = processFn();
53
- if (result instanceof Promise) {
54
- return result.then((asset) => {
55
- this.writeCacheFile(cacheKey, asset);
56
- return asset;
57
- });
17
+ get isDevelopment() {
18
+ return isDevelopmentRuntime();
19
+ }
20
+ get isProduction() {
21
+ return isProductionRuntime();
22
+ }
23
+ getAssetsDir() {
24
+ return path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR);
25
+ }
26
+ writeCacheFile(key, path) {
27
+ this.cache.set(key, path);
28
+ }
29
+ getCacheFile(key) {
30
+ return this.cache.get(key);
31
+ }
32
+ hasCacheFile(key) {
33
+ return this.cache.has(key);
34
+ }
35
+ generateHash(content) {
36
+ return rapidhash(content).toString();
37
+ }
38
+ buildCacheKey(identifier, contentHash, dep) {
39
+ const attrsHash = dep.attributes ? this.generateHash(JSON.stringify(dep.attributes)) : '';
40
+ const position = dep.position ?? '';
41
+ const packageRole = dep.packageRole ?? '';
42
+ return `${identifier}:${contentHash}:${position}:${attrsHash}:${packageRole}`;
43
+ }
44
+ getOrProcess(cacheKey, processFn) {
45
+ if (this.hasCacheFile(cacheKey)) {
46
+ const cached = this.getCacheFile(cacheKey);
47
+ if (!cached.filepath || fileSystem.exists(cached.filepath)) {
48
+ return Promise.resolve(cached);
49
+ }
50
+ this.cache.delete(cacheKey);
51
+ }
52
+ const result = processFn();
53
+ if (result instanceof Promise) {
54
+ return result.then((asset) => {
55
+ this.writeCacheFile(cacheKey, asset);
56
+ return asset;
57
+ });
58
+ }
59
+ this.writeCacheFile(cacheKey, result);
60
+ return Promise.resolve(result);
58
61
  }
59
- this.writeCacheFile(cacheKey, result);
60
- return Promise.resolve(result);
61
- }
62
62
  }
63
- export {
64
- BaseProcessor
65
- };