@ecopages/core 0.2.0-beta.30 → 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,226 +1,242 @@
1
- import path from "node:path";
2
- import { AbstractServerAdapter } from "../../abstract/server-adapter.js";
3
- import { RouteRendererFactory } from "../../../route-renderer/route-renderer.js";
4
- import { RouteRegistry } from "../../../router/server/route-registry.js";
5
- import { startupTrace } from "../../../diagnostics/startup-trace.js";
6
- import { requestBuildDedupe } from "../../../diagnostics/request-build-dedupe.js";
7
- import { MemoryCacheStore } from "../../../services/cache/memory-cache-store.js";
8
- import { PageCacheService } from "../../../services/cache/page-cache-service.js";
9
- import { SchemaValidationService } from "../../../services/validation/schema-validation-service.js";
10
- import { StaticSiteGenerator } from "../../../static-site-generator/static-site-generator.js";
11
- import { ServerStaticBuilder } from "./server-static-builder.js";
12
- import { ExplicitStaticRouteMatcher } from "../http/explicit-static-route-matcher.js";
13
- import { FileSystemServerResponseFactory } from "../http/fs-server-response-factory.js";
14
- import { FileSystemResponseMatcher } from "../http/fs-server-response-matcher.js";
15
- import { ServerRouteHandler } from "./server-route-handler.js";
16
- import { createRenderContext } from "./render-context.js";
17
- import { ApiRequestPipeline } from "../http/api-request-pipeline.js";
18
- import {
19
- injectHmrRuntimeIntoHtmlResponse,
20
- isHtmlResponse,
21
- shouldInjectHmrHtmlResponse
22
- } from "../hmr/hmr-html-response.js";
23
- import { getAppServerModuleTranspiler } from "../../../services/module-loading/app-server-module-transpiler.service.js";
24
- import { resolveInternalExecutionDir } from "../../../utils/resolve-work-dir.js";
25
- class SharedServerAdapter extends AbstractServerAdapter {
26
- router;
27
- fileSystemResponseMatcher;
28
- routeRendererFactory;
29
- routeHandler;
30
- staticSiteGenerator;
31
- staticBuilder;
32
- schemaValidator = new SchemaValidationService();
33
- apiRequestPipeline = new ApiRequestPipeline({
34
- schemaValidator: this.schemaValidator,
35
- getRenderContext: () => this.getRenderContext(),
36
- getCacheService: () => this.getCacheService()
37
- });
38
- hostOwnsDevClient = false;
39
- async initializeSharedRouteHandling(options) {
40
- this.ensureRouteRendererFactory();
41
- await this.initSharedRouter();
42
- this.configureSharedResponseHandlers(options.staticRoutes, options.hmrManager);
43
- }
44
- ensureRouteRendererFactory() {
45
- if (this.routeRendererFactory) {
46
- return;
47
- }
48
- this.routeRendererFactory = new RouteRendererFactory({
49
- appConfig: this.appConfig,
50
- rendererModules: this.appConfig.runtime?.rendererModuleContext,
51
- runtimeOrigin: this.runtimeOrigin
1
+ import path from 'node:path';
2
+ import { AbstractServerAdapter } from '../../abstract/server-adapter.js';
3
+ import { RouteRendererFactory } from '../../../route-renderer/route-renderer.js';
4
+ import { RouteRegistry } from '../../../router/server/route-registry.js';
5
+ import { startupTrace } from '../../../diagnostics/startup-trace.js';
6
+ import { requestBuildDedupe } from '../../../diagnostics/request-build-dedupe.js';
7
+ import { MemoryCacheStore } from '../../../services/cache/memory-cache-store.js';
8
+ import { PageCacheService } from '../../../services/cache/page-cache-service.js';
9
+ import { SchemaValidationService } from '../../../services/validation/schema-validation-service.js';
10
+ import { StaticSiteGenerator } from '../../../static-site-generator/static-site-generator.js';
11
+ import { ServerStaticBuilder } from './server-static-builder.js';
12
+ import { ExplicitStaticRouteMatcher } from '../http/explicit-static-route-matcher.js';
13
+ import { FileSystemServerResponseFactory } from '../http/fs-server-response-factory.js';
14
+ import { FileSystemResponseMatcher } from '../http/fs-server-response-matcher.js';
15
+ import { ServerRouteHandler } from './server-route-handler.js';
16
+ import { createRenderContext } from './render-context.js';
17
+ import { ApiRequestPipeline } from '../http/api-request-pipeline.js';
18
+ import { injectDevToolbarIntoHtmlResponse, shouldInjectDevToolbarHtmlResponse, } from '../../../dev-toolbar/dev-toolbar-html-response.js';
19
+ import { injectHmrRuntimeIntoHtmlResponse, isHtmlResponse, shouldInjectHmrHtmlResponse, } from '../hmr/hmr-html-response.js';
20
+ import { getAppServerModuleTranspiler } from '../../../services/module-loading/app-server-module-transpiler.service.js';
21
+ import { resolveInternalExecutionDir } from '../../../utils/resolve-work-dir.js';
22
+ export class SharedServerAdapter extends AbstractServerAdapter {
23
+ router;
24
+ fileSystemResponseMatcher;
25
+ routeRendererFactory;
26
+ routeHandler;
27
+ staticSiteGenerator;
28
+ staticBuilder;
29
+ schemaValidator = new SchemaValidationService();
30
+ apiRequestPipeline = new ApiRequestPipeline({
31
+ schemaValidator: this.schemaValidator,
32
+ getRenderContext: () => this.getRenderContext(),
33
+ getCacheService: () => this.getCacheService(),
52
34
  });
53
- }
54
- createSharedWatchRefreshCallback(options) {
55
- return async () => {
56
- try {
57
- await this.initializeSharedRouteHandling({
58
- staticRoutes: options.staticRoutes,
59
- hmrManager: options.hmrManager
60
- });
61
- if (options.onRoutesReady) {
62
- await options.onRoutesReady();
63
- }
64
- } catch (error) {
65
- if (options.onError) {
66
- await options.onError(error instanceof Error ? error : new Error(String(error)));
67
- return;
35
+ hostOwnsDevClient = false;
36
+ async initializeSharedRouteHandling(options) {
37
+ this.ensureRouteRendererFactory();
38
+ await this.initSharedRouter();
39
+ this.configureSharedResponseHandlers(options.staticRoutes, options.hmrManager);
40
+ }
41
+ ensureRouteRendererFactory() {
42
+ if (this.routeRendererFactory) {
43
+ return;
68
44
  }
69
- throw error;
70
- }
71
- };
72
- }
73
- /**
74
- * Scans the filesystem and dynamically constructs the Route Registry.
75
- *
76
- * This process runs identically across both Bun and Node wrappers. It analyzes the configured pages
77
- * directory, building a map of all available UI routes and API endpoints.
78
- * The resulting `RouteRegistry` instance becomes the central nervous system for mapping WinterCG incoming
79
- * Web Requests (`Request`) to their corresponding internal execution paths.
80
- */
81
- async initSharedRouter() {
82
- startupTrace.markPhaseStart("route-registry");
83
- this.router = new RouteRegistry({
84
- pagesDir: path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.pagesDir),
85
- appConfig: this.appConfig,
86
- origin: this.runtimeOrigin,
87
- templatesExt: this.appConfig.templatesExt,
88
- buildMode: !this.options?.watch,
89
- pageModuleAdapter: this.createRouteRegistryPageModuleAdapter()
90
- });
91
- await this.router.init();
92
- startupTrace.markPhaseEnd("route-registry");
93
- }
94
- createRouteRegistryPageModuleAdapter() {
95
- this.ensureRouteRendererFactory();
96
- return {
97
- loadPageModule: async (filePath) => {
98
- const module = await this.routeRendererFactory.getPageRenderer(filePath).loadPageModule(filePath);
99
- const page = module.default;
45
+ this.routeRendererFactory = new RouteRendererFactory({
46
+ appConfig: this.appConfig,
47
+ rendererModules: this.appConfig.runtime?.rendererModuleContext,
48
+ runtimeOrigin: this.runtimeOrigin,
49
+ });
50
+ }
51
+ createSharedWatchRefreshCallback(options) {
52
+ return async () => {
53
+ try {
54
+ await this.initializeSharedRouteHandling({
55
+ staticRoutes: options.staticRoutes,
56
+ hmrManager: options.hmrManager,
57
+ });
58
+ if (options.onRoutesReady) {
59
+ await options.onRoutesReady();
60
+ }
61
+ }
62
+ catch (error) {
63
+ if (options.onError) {
64
+ await options.onError(error instanceof Error ? error : new Error(String(error)));
65
+ return;
66
+ }
67
+ throw error;
68
+ }
69
+ };
70
+ }
71
+ /**
72
+ * Scans the filesystem and dynamically constructs the Route Registry.
73
+ *
74
+ * This process runs identically across both Bun and Node wrappers. It analyzes the configured pages
75
+ * directory, building a map of all available UI routes and API endpoints.
76
+ * The resulting `RouteRegistry` instance becomes the central nervous system for mapping WinterCG incoming
77
+ * Web Requests (`Request`) to their corresponding internal execution paths.
78
+ */
79
+ async initSharedRouter() {
80
+ startupTrace.markPhaseStart('route-registry');
81
+ this.router = new RouteRegistry({
82
+ pagesDir: path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.pagesDir),
83
+ appConfig: this.appConfig,
84
+ origin: this.runtimeOrigin,
85
+ templatesExt: this.appConfig.templatesExt,
86
+ buildMode: !this.options?.watch,
87
+ pageModuleAdapter: this.createRouteRegistryPageModuleAdapter(),
88
+ });
89
+ await this.router.init();
90
+ startupTrace.markPhaseEnd('route-registry');
91
+ }
92
+ createRouteRegistryPageModuleAdapter() {
93
+ this.ensureRouteRendererFactory();
100
94
  return {
101
- staticPaths: page?.staticPaths ?? module.getStaticPaths,
102
- staticProps: page?.staticProps ?? module.getStaticProps
95
+ loadPageModule: async (filePath) => {
96
+ const module = (await this.routeRendererFactory
97
+ .getPageRenderer(filePath)
98
+ .loadPageModule(filePath));
99
+ const page = module.default;
100
+ return {
101
+ staticPaths: page?.staticPaths ?? module.getStaticPaths,
102
+ staticProps: page?.staticProps ?? module.getStaticProps,
103
+ };
104
+ },
103
105
  };
104
- }
105
- };
106
- }
107
- /**
108
- * Sets up the unified rendering pipeline and response matching chain.
109
- *
110
- * It bridges several sub-systems together so that when an incoming request is received, the adapter knows:
111
- * 1. How to render React/Lit pages via `RouteRendererFactory`
112
- * 2. How to match logical routes to physical filesystem artifacts via `FileSystemResponseMatcher`
113
- * 3. Whether to serve the response from the embedded `PageCacheService` or generate it fresh on the fly.
114
- *
115
- * @param staticRoutes - A map of explicitly served static assets.
116
- * @param hmrManager - The runtime-specific Hot Module Replacement orchestrator (if watching).
117
- */
118
- configureSharedResponseHandlers(staticRoutes, hmrManager) {
119
- this.ensureRouteRendererFactory();
120
- const { fileSystemResponseMatcher, explicitStaticRouteMatcher } = this.createSharedResponseHandlerDependencies(staticRoutes);
121
- this.fileSystemResponseMatcher = fileSystemResponseMatcher;
122
- this.routeHandler = new ServerRouteHandler({
123
- router: this.router,
124
- fileSystemResponseMatcher: this.fileSystemResponseMatcher,
125
- explicitStaticRouteMatcher,
126
- hmrManager
127
- });
128
- }
129
- createSharedResponseHandlerDependencies(staticRoutes) {
130
- const fileSystemResponseFactory = new FileSystemServerResponseFactory({
131
- options: {
132
- watchMode: !!this.options?.watch
133
- }
134
- });
135
- const cacheService = this.createSharedPageCacheService();
136
- const fileSystemResponseMatcher = new FileSystemResponseMatcher({
137
- appConfig: this.appConfig,
138
- assetPrefix: path.join(this.appConfig.rootDir, this.appConfig.distDir),
139
- router: this.router,
140
- routeRendererFactory: this.routeRendererFactory,
141
- fileSystemResponseFactory,
142
- cacheService,
143
- defaultCacheStrategy: this.appConfig.cache?.defaultStrategy ?? "static"
144
- });
145
- return {
146
- cacheService,
147
- fileSystemResponseMatcher,
148
- explicitStaticRouteMatcher: staticRoutes.length > 0 ? new ExplicitStaticRouteMatcher({
149
- appConfig: this.appConfig,
150
- routeRendererFactory: this.routeRendererFactory,
151
- staticRoutes
152
- }) : void 0
153
- };
154
- }
155
- createSharedPageCacheService() {
156
- const cacheConfig = this.appConfig.cache;
157
- const isCacheEnabled = cacheConfig?.enabled ?? !this.options?.watch;
158
- if (!isCacheEnabled) {
159
- return null;
160
106
  }
161
- const store = cacheConfig?.store === "memory" || !cacheConfig?.store ? new MemoryCacheStore({ maxEntries: cacheConfig?.maxEntries }) : cacheConfig.store;
162
- return new PageCacheService({ store, enabled: true });
163
- }
164
- getCacheService() {
165
- return this.fileSystemResponseMatcher?.getCacheService() ?? null;
166
- }
167
- getRenderContext() {
168
- const serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
169
- return createRenderContext({
170
- integrations: this.appConfig.integrations,
171
- rendererModules: this.appConfig.runtime?.rendererModuleContext,
172
- importServerModule: async (filePath) => await serverModuleTranspiler.importModule({
173
- filePath,
174
- outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-modules"),
175
- externalPackages: true
176
- })
177
- });
178
- }
179
- tryHandleSharedHmrRequest(request, context) {
180
- return context.hmrManager?.tryHandleAssetRequest(request) ?? null;
181
- }
182
- async injectSharedHmrHtmlResponse(response, context) {
183
- if (shouldInjectHmrHtmlResponse(this.options?.watch ?? false, context.hmrManager, this.hostOwnsDevClient) && isHtmlResponse(response)) {
184
- return injectHmrRuntimeIntoHtmlResponse(response);
107
+ /**
108
+ * Sets up the unified rendering pipeline and response matching chain.
109
+ *
110
+ * It bridges several sub-systems together so that when an incoming request is received, the adapter knows:
111
+ * 1. How to render React/Lit pages via `RouteRendererFactory`
112
+ * 2. How to match logical routes to physical filesystem artifacts via `FileSystemResponseMatcher`
113
+ * 3. Whether to serve the response from the embedded `PageCacheService` or generate it fresh on the fly.
114
+ *
115
+ * @param staticRoutes - A map of explicitly served static assets.
116
+ * @param hmrManager - The runtime-specific Hot Module Replacement orchestrator (if watching).
117
+ */
118
+ configureSharedResponseHandlers(staticRoutes, hmrManager) {
119
+ this.ensureRouteRendererFactory();
120
+ const { fileSystemResponseMatcher, explicitStaticRouteMatcher } = this.createSharedResponseHandlerDependencies(staticRoutes);
121
+ this.fileSystemResponseMatcher = fileSystemResponseMatcher;
122
+ this.routeHandler = new ServerRouteHandler({
123
+ router: this.router,
124
+ fileSystemResponseMatcher: this.fileSystemResponseMatcher,
125
+ explicitStaticRouteMatcher,
126
+ hmrManager,
127
+ });
185
128
  }
186
- return response;
187
- }
188
- async tryHandleSharedApiRequest(request, context) {
189
- return await this.apiRequestPipeline.tryHandle(
190
- request,
191
- context.apiHandlers,
192
- context.serverInstance,
193
- context.errorHandler
194
- );
195
- }
196
- /**
197
- * Universally processes an incoming WinterCG Web standard Request.
198
- *
199
- * 1. Resolves static Hot Module Replacement runtime blobs if development.
200
- * 2. Checks if the incoming request matches any parsed API route schemas.
201
- * - Routes through `ApiRequestPipeline` which performs strict validation.
202
- * 3. Falls through to standard `ServerRouteHandler` for React/Lit filesystem pages.
203
- *
204
- * Both Bun and Node bindings fall back to this exact function once they have mapped their
205
- * native HTTP objects into Web Standard Requests.
206
- */
207
- async handleSharedRequest(request, context) {
208
- return requestBuildDedupe.run(
209
- () => startupTrace.traceFirstRequest(request, async () => {
210
- const hmrResponse = this.tryHandleSharedHmrRequest(request, context);
211
- if (hmrResponse) {
212
- return hmrResponse;
129
+ createSharedResponseHandlerDependencies(staticRoutes) {
130
+ const fileSystemResponseFactory = new FileSystemServerResponseFactory({
131
+ options: {
132
+ watchMode: !!this.options?.watch,
133
+ },
134
+ });
135
+ const cacheService = this.createSharedPageCacheService();
136
+ const fileSystemResponseMatcher = new FileSystemResponseMatcher({
137
+ appConfig: this.appConfig,
138
+ assetPrefix: path.join(this.appConfig.rootDir, this.appConfig.distDir),
139
+ router: this.router,
140
+ routeRendererFactory: this.routeRendererFactory,
141
+ fileSystemResponseFactory,
142
+ cacheService,
143
+ defaultCacheStrategy: this.appConfig.cache?.defaultStrategy ?? 'static',
144
+ });
145
+ return {
146
+ cacheService,
147
+ fileSystemResponseMatcher,
148
+ explicitStaticRouteMatcher: staticRoutes.length > 0
149
+ ? new ExplicitStaticRouteMatcher({
150
+ appConfig: this.appConfig,
151
+ routeRendererFactory: this.routeRendererFactory,
152
+ staticRoutes,
153
+ })
154
+ : undefined,
155
+ };
156
+ }
157
+ createSharedPageCacheService() {
158
+ const cacheConfig = this.appConfig.cache;
159
+ const isCacheEnabled = cacheConfig?.enabled ?? !this.options?.watch;
160
+ if (!isCacheEnabled) {
161
+ return null;
162
+ }
163
+ const store = cacheConfig?.store === 'memory' || !cacheConfig?.store
164
+ ? new MemoryCacheStore({ maxEntries: cacheConfig?.maxEntries })
165
+ : cacheConfig.store;
166
+ return new PageCacheService({ store, enabled: true });
167
+ }
168
+ getCacheService() {
169
+ return this.fileSystemResponseMatcher?.getCacheService() ?? null;
170
+ }
171
+ getRenderContext() {
172
+ const serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
173
+ return createRenderContext({
174
+ integrations: this.appConfig.integrations,
175
+ rendererModules: this.appConfig.runtime?.rendererModuleContext,
176
+ importServerModule: async (filePath) => await serverModuleTranspiler.importModule({
177
+ filePath,
178
+ outdir: path.join(resolveInternalExecutionDir(this.appConfig), '.server-modules'),
179
+ externalPackages: true,
180
+ }),
181
+ });
182
+ }
183
+ async tryHandleSharedDevClientRequest(request, context) {
184
+ const manager = context.hmrManager;
185
+ return (await manager?.tryHandleDevClientRequest?.(request)) ?? null;
186
+ }
187
+ tryHandleSharedHmrRequest(request, context) {
188
+ return context.hmrManager?.tryHandleAssetRequest(request) ?? null;
189
+ }
190
+ async injectSharedHmrHtmlResponse(response, context) {
191
+ if (!isHtmlResponse(response)) {
192
+ return response;
213
193
  }
214
- const apiResponse = await this.tryHandleSharedApiRequest(request, context);
215
- if (apiResponse) {
216
- return await this.injectSharedHmrHtmlResponse(apiResponse, context);
194
+ let nextResponse = response;
195
+ if (shouldInjectHmrHtmlResponse(this.options?.watch ?? false, context.hmrManager, this.hostOwnsDevClient) &&
196
+ isHtmlResponse(nextResponse)) {
197
+ nextResponse = await injectHmrRuntimeIntoHtmlResponse(nextResponse);
217
198
  }
218
- const routeResponse = await this.routeHandler.handleResponse(request);
219
- return await this.injectSharedHmrHtmlResponse(routeResponse, context);
220
- })
221
- );
222
- }
199
+ if (shouldInjectDevToolbarHtmlResponse(this.appConfig, {
200
+ watch: this.options?.watch ?? false,
201
+ hostOwnsDevClient: this.hostOwnsDevClient,
202
+ })) {
203
+ nextResponse = await injectDevToolbarIntoHtmlResponse(this.appConfig, {
204
+ watch: this.options?.watch ?? false,
205
+ hostOwnsDevClient: this.hostOwnsDevClient,
206
+ }, nextResponse);
207
+ }
208
+ return nextResponse;
209
+ }
210
+ async tryHandleSharedApiRequest(request, context) {
211
+ return await this.apiRequestPipeline.tryHandle(request, context.apiHandlers, context.serverInstance, context.errorHandler);
212
+ }
213
+ /**
214
+ * Universally processes an incoming WinterCG Web standard Request.
215
+ *
216
+ * 1. Resolves static Hot Module Replacement runtime blobs if development.
217
+ * 2. Checks if the incoming request matches any parsed API route schemas.
218
+ * - Routes through `ApiRequestPipeline` which performs strict validation.
219
+ * 3. Falls through to standard `ServerRouteHandler` for React/Lit filesystem pages.
220
+ *
221
+ * Both Bun and Node bindings fall back to this exact function once they have mapped their
222
+ * native HTTP objects into Web Standard Requests.
223
+ */
224
+ async handleSharedRequest(request, context) {
225
+ return requestBuildDedupe.run(() => startupTrace.traceFirstRequest(request, async () => {
226
+ const devClientResponse = await this.tryHandleSharedDevClientRequest(request, context);
227
+ if (devClientResponse) {
228
+ return devClientResponse;
229
+ }
230
+ const hmrResponse = this.tryHandleSharedHmrRequest(request, context);
231
+ if (hmrResponse) {
232
+ return hmrResponse;
233
+ }
234
+ const apiResponse = await this.tryHandleSharedApiRequest(request, context);
235
+ if (apiResponse) {
236
+ return await this.injectSharedHmrHtmlResponse(apiResponse, context);
237
+ }
238
+ const routeResponse = await this.routeHandler.handleResponse(request);
239
+ return await this.injectSharedHmrHtmlResponse(routeResponse, context);
240
+ }));
241
+ }
223
242
  }
224
- export {
225
- SharedServerAdapter
226
- };
@@ -1,73 +1,77 @@
1
- import { appLogger } from "../../../global/app-logger.js";
2
- import { HttpError } from "../../../errors/http-error.js";
3
- class ServerRouteHandler {
4
- router;
5
- fileSystemResponseMatcher;
6
- explicitStaticRouteMatcher;
7
- hmrManager;
8
- /**
9
- * Creates a new ServerRouteHandler instance.
10
- *
11
- * @param params - Configuration parameters
12
- */
13
- constructor({
14
- router,
15
- fileSystemResponseMatcher,
16
- explicitStaticRouteMatcher,
17
- hmrManager
18
- }) {
19
- this.router = router;
20
- this.fileSystemResponseMatcher = fileSystemResponseMatcher;
21
- this.explicitStaticRouteMatcher = explicitStaticRouteMatcher;
22
- this.hmrManager = hmrManager;
23
- }
24
- /**
25
- * Handles HTTP requests from the router adapter.
26
- *
27
- * Priority-based routing flow:
28
- * 1. Check explicit static routes first (e.g., /sitemap.xml, /image.webp from plugins)
29
- * 2. Match file-based routes without extensions (application routes)
30
- * 3. Fall back to static file serving from disk
31
- *
32
- * @param request - The incoming HTTP request
33
- * @returns HTTP response for the matched route
34
- */
35
- async handleResponse(request) {
36
- const pathname = new URL(request.url).pathname;
37
- const explicitMatch = this.explicitStaticRouteMatcher?.match(request.url);
38
- if (explicitMatch) {
39
- return await this.explicitStaticRouteMatcher.handleMatch(explicitMatch);
1
+ import { appLogger } from '../../../global/app-logger.js';
2
+ import { HttpError } from '../../../errors/http-error.js';
3
+ /**
4
+ * Handles HTTP requests and routing for the server.
5
+ *
6
+ * This class manages the request routing flow with a priority-based approach:
7
+ * 1. Explicit static routes (highest priority - intentional mappings like /sitemap.xml)
8
+ * 2. File-based routes without extensions (application routes)
9
+ * 3. Static file fallback (lowest priority - disk serving)
10
+ *
11
+ */
12
+ export class ServerRouteHandler {
13
+ router;
14
+ fileSystemResponseMatcher;
15
+ explicitStaticRouteMatcher;
16
+ hmrManager;
17
+ /**
18
+ * Creates a new ServerRouteHandler instance.
19
+ *
20
+ * @param params - Configuration parameters
21
+ */
22
+ constructor({ router, fileSystemResponseMatcher, explicitStaticRouteMatcher, hmrManager, }) {
23
+ this.router = router;
24
+ this.fileSystemResponseMatcher = fileSystemResponseMatcher;
25
+ this.explicitStaticRouteMatcher = explicitStaticRouteMatcher;
26
+ this.hmrManager = hmrManager;
40
27
  }
41
- const fsMatch = !pathname.includes(".") && this.router.matchRequest(request.url);
42
- return await (fsMatch ? this.fileSystemResponseMatcher.handleMatch(fsMatch, request) : this.handleNoMatch(request));
43
- }
44
- /**
45
- * Handles requests that do not match any routes.
46
- *
47
- * This is the final fallback that attempts to serve static files from disk.
48
- * If the requested path corresponds to an HTML file or no file is found,
49
- * a custom 404 response is returned.
50
- *
51
- * @param request - The HTTP request to handle
52
- * @returns Response from file system or error response
53
- * @throws HttpError for standard HTTP errors
54
- */
55
- async handleNoMatch(request) {
56
- try {
57
- const pathname = new URL(request.url).pathname;
58
- return await this.fileSystemResponseMatcher.handleNoMatch(pathname);
59
- } catch (error) {
60
- if (error instanceof HttpError) {
61
- return error.toResponse();
62
- }
63
- if (error instanceof Error) {
64
- this.hmrManager?.broadcast({ type: "error", message: error.message });
65
- appLogger.error("Error handling no match:", error);
66
- }
67
- return new Response("Internal Server Error", { status: 500 });
28
+ /**
29
+ * Handles HTTP requests from the router adapter.
30
+ *
31
+ * Priority-based routing flow:
32
+ * 1. Check explicit static routes first (e.g., /sitemap.xml, /image.webp from plugins)
33
+ * 2. Match file-based routes without extensions (application routes)
34
+ * 3. Fall back to static file serving from disk
35
+ *
36
+ * @param request - The incoming HTTP request
37
+ * @returns HTTP response for the matched route
38
+ */
39
+ async handleResponse(request) {
40
+ const pathname = new URL(request.url).pathname;
41
+ const explicitMatch = this.explicitStaticRouteMatcher?.match(request.url);
42
+ if (explicitMatch) {
43
+ return await this.explicitStaticRouteMatcher.handleMatch(explicitMatch);
44
+ }
45
+ const fsMatch = !pathname.includes('.') && this.router.matchRequest(request.url);
46
+ return await (fsMatch
47
+ ? this.fileSystemResponseMatcher.handleMatch(fsMatch, request)
48
+ : this.handleNoMatch(request));
49
+ }
50
+ /**
51
+ * Handles requests that do not match any routes.
52
+ *
53
+ * This is the final fallback that attempts to serve static files from disk.
54
+ * If the requested path corresponds to an HTML file or no file is found,
55
+ * a custom 404 response is returned.
56
+ *
57
+ * @param request - The HTTP request to handle
58
+ * @returns Response from file system or error response
59
+ * @throws HttpError for standard HTTP errors
60
+ */
61
+ async handleNoMatch(request) {
62
+ try {
63
+ const pathname = new URL(request.url).pathname;
64
+ return await this.fileSystemResponseMatcher.handleNoMatch(pathname);
65
+ }
66
+ catch (error) {
67
+ if (error instanceof HttpError) {
68
+ return error.toResponse();
69
+ }
70
+ if (error instanceof Error) {
71
+ this.hmrManager?.broadcast({ type: 'error', message: error.message });
72
+ appLogger.error('Error handling no match:', error);
73
+ }
74
+ return new Response('Internal Server Error', { status: 500 });
75
+ }
68
76
  }
69
- }
70
77
  }
71
- export {
72
- ServerRouteHandler
73
- };