@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,262 +1,257 @@
1
- import path from "node:path";
2
- import { existsSync } from "node:fs";
3
- import { fileSystem } from "@ecopages/file-system";
4
- import { appLogger } from "../../global/app-logger.js";
5
- import { invariant } from "../../utils/invariant.js";
1
+ import path from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ import { appLogger } from '../../global/app-logger.js';
5
+ import { invariant } from '../../utils/invariant.js';
6
6
  const ROUTE_PRIORITY = {
7
- exact: 0,
8
- dynamic: 1,
9
- "catch-all": 2
7
+ exact: 0,
8
+ dynamic: 1,
9
+ 'catch-all': 2,
10
10
  };
11
- class RouteRegistry {
12
- origin;
13
- appConfig;
14
- pagesDir;
15
- templatesExt;
16
- buildMode;
17
- pageModuleAdapter;
18
- templateRouteList = [];
19
- reloadListeners = /* @__PURE__ */ new Set();
20
- constructor(options) {
21
- this.origin = options.origin;
22
- this.appConfig = options.appConfig;
23
- this.pagesDir = options.pagesDir;
24
- this.templatesExt = options.templatesExt;
25
- this.buildMode = options.buildMode;
26
- this.pageModuleAdapter = options.pageModuleAdapter;
27
- }
28
- get templateRoutes() {
29
- return this.templateRouteList;
30
- }
31
- async init() {
32
- this.templateRouteList = await this.scanTemplateRoutes();
33
- appLogger.debug("RouteRegistry initialized", this.templateRouteList);
34
- }
35
- async reload() {
36
- await this.init();
37
- for (const listener of this.reloadListeners) {
38
- listener();
11
+ export class RouteRegistry {
12
+ origin;
13
+ appConfig;
14
+ pagesDir;
15
+ templatesExt;
16
+ buildMode;
17
+ pageModuleAdapter;
18
+ templateRouteList = [];
19
+ reloadListeners = new Set();
20
+ constructor(options) {
21
+ this.origin = options.origin;
22
+ this.appConfig = options.appConfig;
23
+ this.pagesDir = options.pagesDir;
24
+ this.templatesExt = options.templatesExt;
25
+ this.buildMode = options.buildMode;
26
+ this.pageModuleAdapter = options.pageModuleAdapter;
39
27
  }
40
- }
41
- onReload(listener) {
42
- this.reloadListeners.add(listener);
43
- return () => {
44
- this.reloadListeners.delete(listener);
45
- };
46
- }
47
- matchRequest(requestUrl) {
48
- const url = new URL(requestUrl);
49
- const requestedPathname = normalizePathname(url.pathname);
50
- const query = this.getSearchParams(url);
51
- for (const route of this.templateRouteList) {
52
- if (route.kind !== "exact") {
53
- continue;
54
- }
55
- if (requestedPathname === route.pathname || requestedPathname === `${route.pathname}/`) {
56
- return {
57
- requestedPathname,
58
- templateRoute: route,
59
- params: {},
60
- query
61
- };
62
- }
28
+ get templateRoutes() {
29
+ return this.templateRouteList;
63
30
  }
64
- for (const route of this.templateRouteList) {
65
- if (route.kind !== "dynamic") {
66
- continue;
67
- }
68
- const params = this.tryExtractParams(route, requestedPathname);
69
- if (!params) {
70
- continue;
71
- }
72
- return {
73
- requestedPathname,
74
- templateRoute: route,
75
- params,
76
- query
77
- };
31
+ async init() {
32
+ this.templateRouteList = await this.scanTemplateRoutes();
33
+ appLogger.debug('RouteRegistry initialized', this.templateRouteList);
78
34
  }
79
- for (const route of this.templateRouteList) {
80
- if (route.kind !== "catch-all") {
81
- continue;
82
- }
83
- const params = this.tryExtractParams(route, requestedPathname);
84
- if (!params) {
85
- continue;
86
- }
87
- return {
88
- requestedPathname,
89
- templateRoute: route,
90
- params,
91
- query
92
- };
35
+ async reload() {
36
+ await this.init();
37
+ for (const listener of this.reloadListeners) {
38
+ listener();
39
+ }
93
40
  }
94
- return null;
95
- }
96
- async listStaticPathExpansions(input) {
97
- const expansions = [];
98
- for (const route of this.templateRouteList) {
99
- if (route.kind === "exact") {
100
- continue;
101
- }
102
- const pageModule = await this.pageModuleAdapter.loadPageModule(route.filePath);
103
- const staticPaths = pageModule.staticPaths;
104
- if (this.buildMode) {
105
- invariant(staticPaths !== void 0, `[ecopages] Missing getStaticPaths in ${route.filePath}`);
106
- invariant(
107
- pageModule.staticProps !== void 0,
108
- `[ecopages] Missing getStaticProps in ${route.filePath}`
109
- );
110
- }
111
- if (!staticPaths) {
112
- continue;
113
- }
114
- const result = await staticPaths({
115
- appConfig: this.appConfig,
116
- runtimeOrigin: input.runtimeOrigin
117
- });
118
- for (const { params } of result.paths) {
119
- expansions.push({
120
- pathname: this.resolveTemplatePath(route.pathname, params),
121
- templateRoute: route,
122
- params
123
- });
124
- }
41
+ onReload(listener) {
42
+ this.reloadListeners.add(listener);
43
+ return () => {
44
+ this.reloadListeners.delete(listener);
45
+ };
125
46
  }
126
- return expansions;
127
- }
128
- async listStaticGenerationRoutes(input) {
129
- const staticPathExpansions = await this.listStaticPathExpansions(input);
130
- return [
131
- ...this.templateRouteList.filter((route) => route.kind === "exact").map((route) => ({
132
- requestUrl: `${input.runtimeOrigin}${route.pathname}`,
133
- pathname: route.pathname,
134
- templateRoute: route,
135
- params: {}
136
- })),
137
- ...staticPathExpansions.map((route) => ({
138
- requestUrl: `${input.runtimeOrigin}${route.pathname}`,
139
- pathname: route.pathname,
140
- templateRoute: route.templateRoute,
141
- params: route.params
142
- }))
143
- ];
144
- }
145
- async scanTemplateRoutes() {
146
- if (!existsSync(this.pagesDir)) {
147
- return [];
47
+ matchRequest(requestUrl) {
48
+ const url = new URL(requestUrl);
49
+ const requestedPathname = normalizePathname(url.pathname);
50
+ const query = this.getSearchParams(url);
51
+ for (const route of this.templateRouteList) {
52
+ if (route.kind !== 'exact') {
53
+ continue;
54
+ }
55
+ if (requestedPathname === route.pathname || requestedPathname === `${route.pathname}/`) {
56
+ return {
57
+ requestedPathname,
58
+ templateRoute: route,
59
+ params: {},
60
+ query,
61
+ };
62
+ }
63
+ }
64
+ for (const route of this.templateRouteList) {
65
+ if (route.kind !== 'dynamic') {
66
+ continue;
67
+ }
68
+ const params = this.tryExtractParams(route, requestedPathname);
69
+ if (!params) {
70
+ continue;
71
+ }
72
+ return {
73
+ requestedPathname,
74
+ templateRoute: route,
75
+ params,
76
+ query,
77
+ };
78
+ }
79
+ for (const route of this.templateRouteList) {
80
+ if (route.kind !== 'catch-all') {
81
+ continue;
82
+ }
83
+ const params = this.tryExtractParams(route, requestedPathname);
84
+ if (!params) {
85
+ continue;
86
+ }
87
+ return {
88
+ requestedPathname,
89
+ templateRoute: route,
90
+ params,
91
+ query,
92
+ };
93
+ }
94
+ return null;
148
95
  }
149
- const scannedFiles = await fileSystem.glob(
150
- this.templatesExt.map((ext) => `**/*${ext}`),
151
- {
152
- cwd: this.pagesDir
153
- }
154
- );
155
- const templateRoutes = [];
156
- for await (const file of scannedFiles) {
157
- if (file.includes(".ecopages-node.")) {
158
- continue;
159
- }
160
- const routePathname = this.getRoutePath(file);
161
- const filePath = path.join(this.pagesDir, file);
162
- const kind = this.classifyRouteKind(filePath);
163
- templateRoutes.push({
164
- pathname: routePathname,
165
- kind,
166
- filePath,
167
- paramNames: this.getParamNames(routePathname)
168
- });
96
+ async listStaticPathExpansions(input) {
97
+ const expansions = [];
98
+ for (const route of this.templateRouteList) {
99
+ if (route.kind === 'exact') {
100
+ continue;
101
+ }
102
+ const pageModule = await this.pageModuleAdapter.loadPageModule(route.filePath);
103
+ const staticPaths = pageModule.staticPaths;
104
+ if (this.buildMode) {
105
+ invariant(staticPaths !== undefined, `[ecopages] Missing getStaticPaths in ${route.filePath}`);
106
+ invariant(pageModule.staticProps !== undefined, `[ecopages] Missing getStaticProps in ${route.filePath}`);
107
+ }
108
+ if (!staticPaths) {
109
+ continue;
110
+ }
111
+ const result = await staticPaths({
112
+ appConfig: this.appConfig,
113
+ runtimeOrigin: input.runtimeOrigin,
114
+ });
115
+ for (const { params } of result.paths) {
116
+ expansions.push({
117
+ pathname: this.resolveTemplatePath(route.pathname, params),
118
+ templateRoute: route,
119
+ params,
120
+ });
121
+ }
122
+ }
123
+ return expansions;
169
124
  }
170
- return templateRoutes.sort((left, right) => {
171
- const priorityDifference = ROUTE_PRIORITY[left.kind] - ROUTE_PRIORITY[right.kind];
172
- if (priorityDifference !== 0) {
173
- return priorityDifference;
174
- }
175
- if (left.pathname === "/") {
176
- return -1;
177
- }
178
- if (right.pathname === "/") {
179
- return 1;
180
- }
181
- return left.pathname.localeCompare(right.pathname);
182
- });
183
- }
184
- getRoutePath(file) {
185
- const cleanedRoute = this.templatesExt.reduce((route, ext) => route.replace(ext, ""), file).replace(/\/?index$/, "");
186
- return normalizePathname(`/${cleanedRoute}`);
187
- }
188
- classifyRouteKind(filePath) {
189
- if (filePath.includes("[...")) {
190
- return "catch-all";
125
+ async listStaticGenerationRoutes(input) {
126
+ const staticPathExpansions = await this.listStaticPathExpansions(input);
127
+ return [
128
+ ...this.templateRouteList
129
+ .filter((route) => route.kind === 'exact')
130
+ .map((route) => ({
131
+ requestUrl: `${input.runtimeOrigin}${route.pathname}`,
132
+ pathname: route.pathname,
133
+ templateRoute: route,
134
+ params: {},
135
+ })),
136
+ ...staticPathExpansions.map((route) => ({
137
+ requestUrl: `${input.runtimeOrigin}${route.pathname}`,
138
+ pathname: route.pathname,
139
+ templateRoute: route.templateRoute,
140
+ params: route.params,
141
+ })),
142
+ ];
191
143
  }
192
- if (filePath.includes("[") && filePath.includes("]")) {
193
- return "dynamic";
144
+ async scanTemplateRoutes() {
145
+ if (!existsSync(this.pagesDir)) {
146
+ return [];
147
+ }
148
+ const scannedFiles = await fileSystem.glob(this.templatesExt.map((ext) => `**/*${ext}`), {
149
+ cwd: this.pagesDir,
150
+ });
151
+ const templateRoutes = [];
152
+ for await (const file of scannedFiles) {
153
+ if (file.includes('.ecopages-node.')) {
154
+ continue;
155
+ }
156
+ const routePathname = this.getRoutePath(file);
157
+ const filePath = path.join(this.pagesDir, file);
158
+ const kind = this.classifyRouteKind(filePath);
159
+ templateRoutes.push({
160
+ pathname: routePathname,
161
+ kind,
162
+ filePath,
163
+ paramNames: this.getParamNames(routePathname),
164
+ });
165
+ }
166
+ return templateRoutes.sort((left, right) => {
167
+ const priorityDifference = ROUTE_PRIORITY[left.kind] - ROUTE_PRIORITY[right.kind];
168
+ if (priorityDifference !== 0) {
169
+ return priorityDifference;
170
+ }
171
+ if (left.pathname === '/') {
172
+ return -1;
173
+ }
174
+ if (right.pathname === '/') {
175
+ return 1;
176
+ }
177
+ return left.pathname.localeCompare(right.pathname);
178
+ });
194
179
  }
195
- return "exact";
196
- }
197
- getParamNames(routePathname) {
198
- const matches = routePathname.match(/\[(?:\.\.\.)?([^\]]+)\]/g);
199
- return matches ? matches.map((match) => match.replace(/^\[(?:\.\.\.)?/, "").replace(/\]$/, "")) : [];
200
- }
201
- tryExtractParams(route, requestedPathname) {
202
- const routeParts = route.pathname.split("/");
203
- const pathnameParts = requestedPathname.split("/");
204
- if (route.kind === "dynamic" && routeParts.length !== pathnameParts.length) {
205
- return null;
180
+ getRoutePath(file) {
181
+ const cleanedRoute = this.templatesExt
182
+ .reduce((route, ext) => route.replace(ext, ''), file)
183
+ .replace(/\/?index$/, '');
184
+ return normalizePathname(`/${cleanedRoute}`);
206
185
  }
207
- const params = {};
208
- for (let i = 0; i < routeParts.length; i++) {
209
- const routePart = routeParts[i];
210
- const pathnamePart = pathnameParts[i];
211
- if (!routePart) {
212
- continue;
213
- }
214
- if (routePart.startsWith("[...") && routePart.endsWith("]")) {
215
- const paramName = routePart.slice(4, -1);
216
- params[paramName] = pathnameParts.slice(i).filter(Boolean);
217
- return params;
218
- }
219
- if (routePart.startsWith("[") && routePart.endsWith("]")) {
220
- if (pathnamePart === void 0) {
221
- return null;
186
+ classifyRouteKind(filePath) {
187
+ if (filePath.includes('[...')) {
188
+ return 'catch-all';
222
189
  }
223
- params[routePart.slice(1, -1)] = pathnamePart;
224
- continue;
225
- }
226
- if (routePart !== pathnamePart) {
227
- return null;
228
- }
190
+ if (filePath.includes('[') && filePath.includes(']')) {
191
+ return 'dynamic';
192
+ }
193
+ return 'exact';
229
194
  }
230
- if (route.kind === "catch-all") {
231
- const cleanPathname = route.pathname.replace(/\[.*?\]/g, "");
232
- return requestedPathname.includes(cleanPathname) ? params : null;
195
+ getParamNames(routePathname) {
196
+ const matches = routePathname.match(/\[(?:\.\.\.)?([^\]]+)\]/g);
197
+ return matches ? matches.map((match) => match.replace(/^\[(?:\.\.\.)?/, '').replace(/\]$/, '')) : [];
198
+ }
199
+ tryExtractParams(route, requestedPathname) {
200
+ const routeParts = route.pathname.split('/');
201
+ const pathnameParts = requestedPathname.split('/');
202
+ if (route.kind === 'dynamic' && routeParts.length !== pathnameParts.length) {
203
+ return null;
204
+ }
205
+ const params = {};
206
+ for (let i = 0; i < routeParts.length; i++) {
207
+ const routePart = routeParts[i];
208
+ const pathnamePart = pathnameParts[i];
209
+ if (!routePart) {
210
+ continue;
211
+ }
212
+ if (routePart.startsWith('[...') && routePart.endsWith(']')) {
213
+ const paramName = routePart.slice(4, -1);
214
+ params[paramName] = pathnameParts.slice(i).filter(Boolean);
215
+ return params;
216
+ }
217
+ if (routePart.startsWith('[') && routePart.endsWith(']')) {
218
+ if (pathnamePart === undefined) {
219
+ return null;
220
+ }
221
+ params[routePart.slice(1, -1)] = pathnamePart;
222
+ continue;
223
+ }
224
+ if (routePart !== pathnamePart) {
225
+ return null;
226
+ }
227
+ }
228
+ if (route.kind === 'catch-all') {
229
+ const cleanPathname = route.pathname.replace(/\[.*?\]/g, '');
230
+ return requestedPathname.includes(cleanPathname) ? params : null;
231
+ }
232
+ return params;
233
233
  }
234
- return params;
235
- }
236
- getSearchParams(url) {
237
- const query = {};
238
- for (const [key, value] of url.searchParams) {
239
- query[key] = value;
234
+ getSearchParams(url) {
235
+ const query = {};
236
+ for (const [key, value] of url.searchParams) {
237
+ query[key] = value;
238
+ }
239
+ return query;
240
240
  }
241
- return query;
242
- }
243
- resolveTemplatePath(pathname, params) {
244
- let resolvedPath = pathname;
245
- for (const [key, value] of Object.entries(params)) {
246
- const serializedValue = Array.isArray(value) ? value.join("/") : value;
247
- resolvedPath = resolvedPath.replace(`[...${key}]`, serializedValue);
248
- resolvedPath = resolvedPath.replace(`[${key}]`, serializedValue);
241
+ resolveTemplatePath(pathname, params) {
242
+ let resolvedPath = pathname;
243
+ for (const [key, value] of Object.entries(params)) {
244
+ const serializedValue = Array.isArray(value) ? value.join('/') : value;
245
+ resolvedPath = resolvedPath.replace(`[...${key}]`, serializedValue);
246
+ resolvedPath = resolvedPath.replace(`[${key}]`, serializedValue);
247
+ }
248
+ return normalizePathname(resolvedPath);
249
249
  }
250
- return normalizePathname(resolvedPath);
251
- }
252
250
  }
253
251
  function normalizePathname(pathname) {
254
- if (!pathname || pathname === "/") {
255
- return "/";
256
- }
257
- const normalized = pathname.startsWith("/") ? pathname : `/${pathname}`;
258
- return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
252
+ if (!pathname || pathname === '/') {
253
+ return '/';
254
+ }
255
+ const normalized = pathname.startsWith('/') ? pathname : `/${pathname}`;
256
+ return normalized.endsWith('/') ? normalized.slice(0, -1) : normalized;
259
257
  }
260
- export {
261
- RouteRegistry
262
- };
@@ -1,59 +1,70 @@
1
- import { rapidhash } from "../../../utils/hash.js";
1
+ import { rapidhash } from '../../../utils/hash.js';
2
2
  function generateHash(content) {
3
- return rapidhash(content).toString();
3
+ return rapidhash(content).toString();
4
4
  }
5
5
  function getScriptDependencyBuildSignature(dep) {
6
- if (dep.kind !== "script") {
7
- return void 0;
8
- }
9
- const pluginNames = dep.bundleOptions?.plugins?.map((plugin) => plugin.name) ?? [];
10
- const signature = {
11
- bundle: dep.bundle,
12
- inline: dep.inline,
13
- excludeFromHtml: dep.excludeFromHtml,
14
- groupedBundle: dep.groupedBundle,
15
- naming: dep.bundleOptions?.naming,
16
- external: dep.bundleOptions?.external,
17
- minify: dep.bundleOptions?.minify,
18
- plugins: pluginNames
19
- };
20
- return generateHash(JSON.stringify(signature));
6
+ if (dep.kind !== 'script') {
7
+ return undefined;
8
+ }
9
+ const pluginNames = dep.bundleOptions?.plugins?.map((plugin) => plugin.name) ?? [];
10
+ const signature = {
11
+ bundle: dep.bundle,
12
+ inline: dep.inline,
13
+ excludeFromHtml: dep.excludeFromHtml,
14
+ groupedBundle: dep.groupedBundle,
15
+ naming: dep.bundleOptions?.naming,
16
+ external: dep.bundleOptions?.external,
17
+ minify: dep.bundleOptions?.minify,
18
+ plugins: pluginNames,
19
+ };
20
+ return generateHash(JSON.stringify(signature));
21
21
  }
22
- function getAssetDependencyKey(dep) {
23
- const parts = [dep.kind, dep.source];
24
- if ("filepath" in dep) {
25
- parts.push(dep.filepath);
26
- } else if ("content" in dep) {
27
- parts.push(`content:${generateHash(dep.content)}`);
28
- } else if ("importPath" in dep) {
29
- parts.push(dep.importPath);
30
- }
31
- if ("position" in dep && dep.position) {
32
- parts.push(dep.position);
33
- }
34
- if ("packageRole" in dep && dep.packageRole) {
35
- parts.push(`package:${dep.packageRole}`);
36
- }
37
- if (dep.kind === "script" && dep.attributes) {
38
- parts.push(`attrs:${generateHash(JSON.stringify(dep.attributes))}`);
39
- }
40
- const scriptBuildSignature = getScriptDependencyBuildSignature(dep);
41
- if (scriptBuildSignature) {
42
- parts.push(`build:${scriptBuildSignature}`);
43
- }
44
- return parts.join(":");
22
+ /**
23
+ * Stable identity for dependency deduplication and {@link AssetProcessingService} cache lookups.
24
+ *
25
+ * @remarks
26
+ * Script dependencies include a build signature derived from bundle flags, grouped-bundle
27
+ * metadata, and selected `bundleOptions` fields (`naming`, `external`, `minify`, plugin names).
28
+ * HTML-affecting script `attributes` are hashed into the key so dedupe and cache reuse do not
29
+ * collapse declarations that would emit different `<script>` tags. Full plugin objects and
30
+ * `NODE_ENV` are excluded from the key.
31
+ *
32
+ * Runtime minify in {@link ContentScriptProcessor} still follows `NODE_ENV` via
33
+ * `isProduction`, not `bundleOptions.minify`.
34
+ */
35
+ export function getAssetDependencyKey(dep) {
36
+ const parts = [dep.kind, dep.source];
37
+ if ('filepath' in dep) {
38
+ parts.push(dep.filepath);
39
+ }
40
+ else if ('content' in dep) {
41
+ parts.push(`content:${generateHash(dep.content)}`);
42
+ }
43
+ else if ('importPath' in dep) {
44
+ parts.push(dep.importPath);
45
+ }
46
+ if ('position' in dep && dep.position) {
47
+ parts.push(dep.position);
48
+ }
49
+ if ('packageRole' in dep && dep.packageRole) {
50
+ parts.push(`package:${dep.packageRole}`);
51
+ }
52
+ if (dep.kind === 'script' && dep.attributes) {
53
+ parts.push(`attrs:${generateHash(JSON.stringify(dep.attributes))}`);
54
+ }
55
+ const scriptBuildSignature = getScriptDependencyBuildSignature(dep);
56
+ if (scriptBuildSignature) {
57
+ parts.push(`build:${scriptBuildSignature}`);
58
+ }
59
+ return parts.join(':');
45
60
  }
46
- function deduplicateAssetDependencies(deps) {
47
- const seen = /* @__PURE__ */ new Map();
48
- for (const dep of deps) {
49
- const key = getAssetDependencyKey(dep);
50
- if (!seen.has(key)) {
51
- seen.set(key, dep);
52
- }
53
- }
54
- return Array.from(seen.values());
61
+ export function deduplicateAssetDependencies(deps) {
62
+ const seen = new Map();
63
+ for (const dep of deps) {
64
+ const key = getAssetDependencyKey(dep);
65
+ if (!seen.has(key)) {
66
+ seen.set(key, dep);
67
+ }
68
+ }
69
+ return Array.from(seen.values());
55
70
  }
56
- export {
57
- deduplicateAssetDependencies,
58
- getAssetDependencyKey
59
- };