@ecopages/core 0.2.0-beta.4 → 0.2.0-beta.41

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 (611) hide show
  1. package/README.md +40 -9
  2. package/package.json +371 -33
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +115 -6
  5. package/src/adapters/abstract/application-adapter.js +261 -120
  6. package/src/adapters/abstract/router-adapter.js +12 -4
  7. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  8. package/src/adapters/abstract/segment-path-matcher.js +147 -0
  9. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  12. package/src/adapters/abstract/ws-pattern-matcher.js +28 -0
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  14. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  15. package/src/adapters/bun/client-bridge.d.ts +1 -0
  16. package/src/adapters/bun/client-bridge.js +51 -47
  17. package/src/adapters/bun/create-app.d.ts +9 -6
  18. package/src/adapters/bun/create-app.js +171 -130
  19. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  20. package/src/adapters/bun/hmr-manager.js +62 -57
  21. package/src/adapters/bun/index.d.ts +1 -1
  22. package/src/adapters/bun/index.js +2 -8
  23. package/src/adapters/bun/runtime-host.d.ts +1 -1
  24. package/src/adapters/bun/runtime-host.js +61 -54
  25. package/src/adapters/bun/server-adapter.d.ts +91 -41
  26. package/src/adapters/bun/server-adapter.js +566 -426
  27. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  28. package/src/adapters/bun/static-preview-host.js +43 -41
  29. package/src/adapters/create-app.d.ts +13 -11
  30. package/src/adapters/create-app.js +11 -63
  31. package/src/adapters/index.d.ts +2 -2
  32. package/src/adapters/index.js +2 -8
  33. package/src/adapters/node/create-app.d.ts +8 -3
  34. package/src/adapters/node/create-app.js +126 -84
  35. package/src/adapters/node/http-request-bridge.js +147 -106
  36. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  37. package/src/adapters/node/node-client-bridge.js +62 -61
  38. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  39. package/src/adapters/node/node-hmr-manager.js +58 -48
  40. package/src/adapters/node/runtime-host.d.ts +1 -1
  41. package/src/adapters/node/runtime-host.js +96 -89
  42. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  43. package/src/adapters/node/server-adapter.d.ts +63 -23
  44. package/src/adapters/node/server-adapter.js +346 -297
  45. package/src/adapters/node/static-content-server.d.ts +1 -0
  46. package/src/adapters/node/static-content-server.js +172 -183
  47. package/src/adapters/node/static-preview-host.d.ts +1 -1
  48. package/src/adapters/node/static-preview-host.js +88 -64
  49. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  50. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  51. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  52. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  53. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  54. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  55. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  56. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  57. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  58. package/src/adapters/shared/http/api-response.js +79 -0
  59. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  60. package/src/adapters/shared/http/create-body-response.js +26 -0
  61. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  62. package/src/adapters/shared/http/define-api-handler.js +49 -0
  63. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  64. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  65. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  66. package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
  67. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  68. package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
  69. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  70. package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
  71. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  72. package/src/adapters/shared/http/fs-server-response-matcher.js +258 -0
  73. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  74. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  75. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  76. package/src/adapters/shared/runtime/application-adapter.js +75 -0
  77. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  78. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  79. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  80. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  81. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  82. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  83. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  84. package/src/adapters/shared/runtime/port-manager.js +226 -0
  85. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  86. package/src/adapters/shared/runtime/render-context.js +99 -0
  87. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  88. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  89. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  90. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  91. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  92. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  93. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  94. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  95. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  96. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  97. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  98. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  99. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  100. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  101. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  102. package/src/build/README.md +191 -31
  103. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  104. package/src/build/app-build-manifest-runtime.js +145 -0
  105. package/src/build/browser/browser-runtime-manifest.js +58 -0
  106. package/src/build/browser/browser-runtime-plugin-helpers.js +34 -0
  107. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  108. package/src/build/browser/browser-runtime-plugin.js +216 -0
  109. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  110. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  111. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  112. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  113. package/src/build/build-adapter.d.ts +29 -334
  114. package/src/build/build-adapter.js +273 -237
  115. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  116. package/src/build/cache/build-input-fingerprint.js +33 -0
  117. package/src/build/cache/cache-constants.d.ts +4 -0
  118. package/src/build/cache/cache-constants.js +4 -0
  119. package/src/build/cache/cache-keys.d.ts +22 -0
  120. package/src/build/cache/cache-keys.js +71 -0
  121. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  122. package/src/build/cache/pages-unified-graph-build.js +199 -0
  123. package/src/build/cache/production-build-cache.d.ts +21 -0
  124. package/src/build/cache/production-build-cache.js +56 -0
  125. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  126. package/src/build/cache/server-entry-build-cache.js +153 -0
  127. package/src/build/contracts/build-contracts.d.ts +96 -0
  128. package/src/build/contracts/build-contracts.js +1 -0
  129. package/src/build/contracts/build-manifest.d.ts +90 -0
  130. package/src/build/contracts/build-manifest.js +64 -0
  131. package/src/build/contracts/build-types.js +1 -0
  132. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  133. package/src/build/contracts/content-virtual-modules.js +29 -0
  134. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  135. package/src/build/rolldown/rolldown-adapter-helpers.js +458 -0
  136. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  137. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  138. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  139. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  140. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  141. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  142. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  143. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  144. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  145. package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
  146. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  147. package/src/build/runtime/build-profile-options.d.ts +7 -0
  148. package/src/build/runtime/build-profile-options.js +37 -0
  149. package/src/build/runtime/build-request-identity.d.ts +17 -0
  150. package/src/build/runtime/build-request-identity.js +79 -0
  151. package/src/build/runtime/build-request-policy.d.ts +58 -0
  152. package/src/build/runtime/build-request-policy.js +84 -0
  153. package/src/build/runtime/build-runtime.d.ts +28 -0
  154. package/src/build/runtime/build-runtime.js +75 -0
  155. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  156. package/src/build/runtime/deduping-build-executor.js +40 -0
  157. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  158. package/src/build/runtime/parallel-build-executor.js +60 -0
  159. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  160. package/src/build/runtime/serialized-build-executor.js +79 -0
  161. package/src/cache/index.d.ts +2 -1
  162. package/src/cache/index.js +7 -6
  163. package/src/cache/module-parse-cache.d.ts +5 -0
  164. package/src/cache/module-parse-cache.js +122 -67
  165. package/src/cache/module-transform-profiler.d.ts +8 -0
  166. package/src/cache/module-transform-profiler.js +8 -0
  167. package/src/client/navigation-scripts/classification.d.ts +16 -0
  168. package/src/client/navigation-scripts/classification.js +49 -0
  169. package/src/client/navigation-scripts/index.d.ts +3 -0
  170. package/src/client/navigation-scripts/index.js +3 -0
  171. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  172. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  173. package/src/client/navigation-scripts/registry.d.ts +11 -0
  174. package/src/client/navigation-scripts/registry.js +16 -0
  175. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  176. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  177. package/src/client/scroll.d.ts +17 -0
  178. package/src/client/scroll.js +33 -0
  179. package/src/client/scroll.test.browser.d.ts +1 -0
  180. package/src/client/scroll.test.browser.js +31 -0
  181. package/src/client/view-transitions.d.ts +32 -0
  182. package/src/client/view-transitions.js +120 -0
  183. package/src/client/view-transitions.test.browser.d.ts +1 -0
  184. package/src/client/view-transitions.test.browser.js +56 -0
  185. package/src/config/config-builder.d.ts +40 -10
  186. package/src/config/config-builder.js +647 -600
  187. package/src/config/constants.d.ts +1 -0
  188. package/src/config/constants.js +44 -23
  189. package/src/declarations.d.ts +1 -0
  190. package/src/dev/README.md +24 -0
  191. package/src/dev/client-bridge-registry.d.ts +5 -0
  192. package/src/dev/client-bridge-registry.js +10 -0
  193. package/src/dev/dev-client-ownership.d.ts +7 -0
  194. package/src/dev/dev-client-ownership.js +8 -0
  195. package/src/dev/hmr-manager-registry.d.ts +8 -0
  196. package/src/dev/hmr-manager-registry.js +10 -0
  197. package/src/dev/host-runtime.d.ts +3 -0
  198. package/src/dev/host-runtime.js +25 -23
  199. package/src/dev/runtime-server-started-message.d.ts +2 -0
  200. package/src/dev/runtime-server-started-message.js +3 -0
  201. package/src/dev/sc-server.js +106 -103
  202. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  203. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  204. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  205. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  206. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  207. package/src/dev/transform-server/dev-transform-import-rewriter.js +126 -0
  208. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  209. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  210. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  211. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  212. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  213. package/src/dev/transform-server/dev-transform-server.js +191 -0
  214. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  215. package/src/dev/transform-server/dev-transform-url.js +58 -0
  216. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  217. package/src/dev/transform-server/dev-transform-vendor-registry.js +158 -0
  218. package/src/dev/transform-server/index.d.ts +6 -0
  219. package/src/dev/transform-server/index.js +4 -0
  220. package/src/dev/transform-server/types.d.ts +15 -0
  221. package/src/dev/transform-server/types.js +1 -0
  222. package/src/dev-toolbar/README.md +52 -0
  223. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  224. package/src/dev-toolbar/define-dev-tool.js +9 -0
  225. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  226. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  227. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  228. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  229. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  230. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  232. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  233. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  234. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  235. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  236. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  237. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  238. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  239. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  240. package/src/diagnostics/request-build-dedupe.js +39 -0
  241. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  242. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  243. package/src/diagnostics/startup-trace.d.ts +81 -0
  244. package/src/diagnostics/startup-trace.js +281 -0
  245. package/src/eco/README.md +17 -0
  246. package/src/eco/component-identity.d.ts +13 -0
  247. package/src/eco/component-identity.js +18 -0
  248. package/src/eco/eco-declared-component.d.ts +15 -0
  249. package/src/eco/eco-declared-component.js +23 -0
  250. package/src/eco/eco.browser.js +63 -70
  251. package/src/eco/eco.js +163 -97
  252. package/src/eco/eco.types.d.ts +47 -8
  253. package/src/eco/eco.types.js +5 -0
  254. package/src/eco/eco.utils.d.ts +1 -1
  255. package/src/eco/eco.utils.js +1 -10
  256. package/src/eco/global-injector-map.js +55 -41
  257. package/src/eco/lazy-injector-map.js +90 -60
  258. package/src/eco/module-dependencies.js +52 -44
  259. package/src/eco/page-layout-normalization.d.ts +21 -0
  260. package/src/eco/page-layout-normalization.js +69 -0
  261. package/src/env.d.ts +2 -0
  262. package/src/errors/http-error.d.ts +8 -0
  263. package/src/errors/http-error.js +66 -49
  264. package/src/errors/index.d.ts +1 -0
  265. package/src/errors/index.js +3 -6
  266. package/src/errors/locals-access-error.js +5 -8
  267. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  268. package/src/errors/undeclared-component-dependency-error.js +17 -0
  269. package/src/global/app-logger.js +3 -6
  270. package/src/hmr/README.md +21 -0
  271. package/src/hmr/client/hmr-runtime.js +119 -110
  272. package/src/hmr/client/module-update.d.ts +13 -0
  273. package/src/hmr/client/module-update.js +39 -0
  274. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  275. package/src/hmr/hmr-asset-paths.js +22 -0
  276. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  277. package/src/hmr/hmr-entrypoint-output.js +34 -0
  278. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  279. package/src/hmr/hmr-file-change-prep.js +14 -0
  280. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  281. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  282. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  283. package/src/hmr/hmr-runtime-paths.js +13 -0
  284. package/src/hmr/hmr-strategy.d.ts +9 -0
  285. package/src/hmr/hmr-strategy.js +113 -42
  286. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  287. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  288. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  289. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  290. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  291. package/src/index.browser.d.ts +1 -0
  292. package/src/index.browser.js +2 -4
  293. package/src/index.d.ts +4 -1
  294. package/src/index.js +7 -21
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  296. package/src/integrations/ghtml/ghtml-renderer.js +12 -56
  297. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  298. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  299. package/src/integrations/ghtml/ghtml.plugin.js +10 -20
  300. package/src/islands/README.md +25 -0
  301. package/src/islands/island-host.d.ts +37 -0
  302. package/src/islands/island-host.js +55 -0
  303. package/src/plugins/README.md +2 -1
  304. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  305. package/src/plugins/alias-resolver-cache.js +114 -97
  306. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  307. package/src/plugins/alias-resolver-plugin.js +35 -62
  308. package/src/plugins/define-integration.d.ts +26 -0
  309. package/src/plugins/define-integration.js +20 -0
  310. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  311. package/src/plugins/eco-component-meta-plugin.js +120 -162
  312. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  313. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  314. package/src/plugins/integration-plugin.d.ts +43 -14
  315. package/src/plugins/integration-plugin.js +212 -190
  316. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  317. package/src/plugins/jsx-import-source.utils.js +21 -0
  318. package/src/plugins/processor.d.ts +71 -12
  319. package/src/plugins/processor.js +168 -130
  320. package/src/plugins/runtime-capability.js +1 -0
  321. package/src/plugins/source-transform.d.ts +32 -1
  322. package/src/plugins/source-transform.js +112 -60
  323. package/src/plugins/tsconfig-import-resolver.d.ts +35 -0
  324. package/src/plugins/tsconfig-import-resolver.js +235 -0
  325. package/src/route-renderer/GRAPH.md +26 -32
  326. package/src/route-renderer/README.md +54 -33
  327. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  328. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  329. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  330. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
  331. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  332. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  333. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  334. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +191 -0
  335. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  336. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  337. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  338. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  339. package/src/route-renderer/orchestration/integration-renderer.d.ts +41 -151
  340. package/src/route-renderer/orchestration/integration-renderer.js +798 -988
  341. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  342. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  343. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  344. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  345. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  346. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  347. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  348. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  355. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  356. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  359. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  360. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +232 -0
  361. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  362. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  363. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  364. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  365. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  366. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  367. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  368. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  369. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  370. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  371. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  372. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  373. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  374. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  375. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  376. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  377. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  378. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  379. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  380. package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
  381. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  382. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  383. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  384. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  385. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  386. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  387. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  388. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  389. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  390. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  391. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  392. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  393. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  394. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  395. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  396. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  397. package/src/route-renderer/route-renderer.js +74 -76
  398. package/src/router/README.md +31 -0
  399. package/src/router/client/link-intent.d.ts +11 -21
  400. package/src/router/client/link-intent.js +56 -30
  401. package/src/router/client/link-intent.test.browser.js +50 -39
  402. package/src/router/client/link-navigation-policy.d.ts +45 -0
  403. package/src/router/client/link-navigation-policy.js +122 -0
  404. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  405. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  406. package/src/router/client/navigation-coordinator.d.ts +1 -1
  407. package/src/router/client/navigation-coordinator.js +235 -201
  408. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  409. package/src/router/client/navigation-lifecycle.js +50 -0
  410. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  411. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  412. package/src/router/server/route-registry.js +237 -242
  413. package/src/services/README.md +5 -0
  414. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  415. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  416. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +7 -1
  417. package/src/services/assets/asset-processing-service/asset-processing.service.js +308 -268
  418. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  419. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  420. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  421. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  422. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -45
  423. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  424. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  425. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  426. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -38
  427. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  428. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  429. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  430. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  431. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  432. package/src/services/assets/asset-processing-service/index.js +8 -6
  433. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  434. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  435. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  436. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  437. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  438. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  439. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  440. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  441. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  442. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  443. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  444. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  445. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  446. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  447. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  448. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -121
  449. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  450. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  451. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  452. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  453. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  454. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  455. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  456. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  457. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  458. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  459. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  460. package/src/services/assets/browser-bundle.service.js +54 -40
  461. package/src/services/cache/cache.types.d.ts +4 -2
  462. package/src/services/cache/cache.types.js +5 -0
  463. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  464. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  465. package/src/services/cache/index.d.ts +2 -0
  466. package/src/services/cache/index.js +8 -7
  467. package/src/services/cache/memory-cache-store.js +101 -89
  468. package/src/services/cache/page-cache-service.d.ts +31 -1
  469. package/src/services/cache/page-cache-service.js +237 -150
  470. package/src/services/cache/page-request-cache-coordinator.service.js +106 -102
  471. package/src/services/html/html-rewriter-provider.service.js +61 -61
  472. package/src/services/html/html-transformer.service.d.ts +1 -1
  473. package/src/services/html/html-transformer.service.js +249 -266
  474. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  475. package/src/services/invalidation/development-invalidation.service.js +239 -175
  476. package/src/services/module-loading/README.md +52 -0
  477. package/src/services/module-loading/app-module-loader.service.js +1 -0
  478. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  479. package/src/services/module-loading/app-server-module-transpiler.service.js +103 -118
  480. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  481. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  482. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  483. package/src/services/module-loading/module-loading-types.js +1 -0
  484. package/src/services/module-loading/page-module-import.service.d.ts +11 -13
  485. package/src/services/module-loading/page-module-import.service.js +222 -184
  486. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  487. package/src/services/module-loading/route-module-build-cache-registry.js +51 -0
  488. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  489. package/src/services/module-loading/route-module-build-cache.js +3 -0
  490. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  491. package/src/services/module-loading/route-module-build-cache.store.js +202 -0
  492. package/src/services/module-loading/route-module-build-manifest.d.ts +57 -0
  493. package/src/services/module-loading/route-module-build-manifest.js +60 -0
  494. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  495. package/src/services/module-loading/route-module-dependency-hasher.js +148 -0
  496. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  497. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  498. package/src/services/module-loading/source-module-support.js +15 -7
  499. package/src/services/runtime-state/dev-graph.service.js +165 -157
  500. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  501. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  502. package/src/services/validation/schema-validation-service.d.ts +1 -4
  503. package/src/services/validation/schema-validation-service.js +156 -95
  504. package/src/services/validation/standard-schema.types.d.ts +9 -62
  505. package/src/services/validation/standard-schema.types.js +1 -0
  506. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  507. package/src/services/validation/validate-standard-schema.js +14 -0
  508. package/src/static-site-generator/README.md +41 -0
  509. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  510. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  511. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  512. package/src/static-site-generator/sitemap-routes.js +36 -0
  513. package/src/static-site-generator/sitemap.d.ts +15 -0
  514. package/src/static-site-generator/sitemap.js +42 -0
  515. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  516. package/src/static-site-generator/static-build-invalidation.js +37 -0
  517. package/src/static-site-generator/static-export-context.d.ts +30 -0
  518. package/src/static-site-generator/static-export-context.js +1 -0
  519. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  520. package/src/static-site-generator/static-site-generator.js +536 -294
  521. package/src/types/internal-types.d.ts +59 -13
  522. package/src/types/internal-types.js +1 -0
  523. package/src/types/public-types.d.ts +310 -95
  524. package/src/types/public-types.js +1 -0
  525. package/src/utils/deep-merge.js +39 -26
  526. package/src/utils/ecopages-route-info.d.ts +26 -0
  527. package/src/utils/ecopages-route-info.js +30 -0
  528. package/src/utils/hash.js +3 -6
  529. package/src/utils/html-escaping.d.ts +7 -0
  530. package/src/utils/html-escaping.js +22 -5
  531. package/src/utils/html.js +1 -4
  532. package/src/utils/invariant.js +11 -10
  533. package/src/utils/locals-utils.js +32 -22
  534. package/src/utils/parse-cli-args.d.ts +2 -0
  535. package/src/utils/parse-cli-args.js +73 -59
  536. package/src/utils/path-pattern.d.ts +23 -0
  537. package/src/utils/path-pattern.js +42 -0
  538. package/src/utils/path-utils.module.js +8 -11
  539. package/src/utils/resolve-entry-file.js +70 -38
  540. package/src/utils/resolve-work-dir.js +23 -27
  541. package/src/utils/runtime.js +24 -33
  542. package/src/utils/server-utils.module.d.ts +3 -2
  543. package/src/utils/server-utils.module.js +60 -53
  544. package/src/utils/static-file-extensions.d.ts +12 -0
  545. package/src/utils/static-file-extensions.js +54 -0
  546. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  547. package/src/watchers/project-watcher-ignore.js +17 -0
  548. package/src/watchers/project-watcher.d.ts +29 -6
  549. package/src/watchers/project-watcher.js +402 -257
  550. package/src/watchers/project-watcher.test-helpers.js +45 -50
  551. package/src/adapters/shared/api-response.js +0 -96
  552. package/src/adapters/shared/application-adapter.js +0 -90
  553. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  554. package/src/adapters/shared/define-api-handler.js +0 -15
  555. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  556. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  557. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  558. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  559. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  560. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  561. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  562. package/src/adapters/shared/hmr-html-response.js +0 -33
  563. package/src/adapters/shared/render-context.js +0 -93
  564. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  565. package/src/adapters/shared/runtime-host.js +0 -0
  566. package/src/adapters/shared/server-adapter.js +0 -436
  567. package/src/adapters/shared/server-route-handler.js +0 -111
  568. package/src/adapters/shared/server-static-builder.js +0 -162
  569. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  570. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  571. package/src/adapters/shared/static-preview-host.js +0 -0
  572. package/src/build/browser-runtime-manifest.js +0 -61
  573. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  574. package/src/build/browser-runtime-plugin.js +0 -173
  575. package/src/build/build-manifest.d.ts +0 -33
  576. package/src/build/build-manifest.js +0 -49
  577. package/src/build/build-types.js +0 -0
  578. package/src/build/rolldown-adapter-helpers.js +0 -265
  579. package/src/build/rolldown-build-adapter.js +0 -65
  580. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  581. package/src/build/rolldown-dev-build-adapter.js +0 -166
  582. package/src/build/rolldown-plugin-bridge.js +0 -199
  583. package/src/build/runtime-build-executor.d.ts +0 -21
  584. package/src/build/runtime-build-executor.js +0 -19
  585. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  586. package/src/build/runtime-build-output-normalizer.js +0 -111
  587. package/src/build/serialized-build-executor.js +0 -63
  588. package/src/build/server-side-css-shim-plugin.js +0 -35
  589. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  590. package/src/hmr/hmr.test.e2e.js +0 -43
  591. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  592. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  593. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  594. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  595. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  596. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  597. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  598. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  599. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  600. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  601. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  602. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  603. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  604. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  605. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  606. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  607. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  608. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  609. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  610. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  611. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -0,0 +1,106 @@
1
+ import { STATUS_MESSAGE } from '../../../config/constants.js';
2
+ import { appLogger } from '../../../global/app-logger.js';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ /**
5
+ * Builds HTTP responses for static files and shared file-system fallbacks.
6
+ */
7
+ export class FileSystemServerResponseFactory {
8
+ options;
9
+ constructor({ options }) {
10
+ this.options = options;
11
+ }
12
+ isHtml(contentType) {
13
+ return contentType === 'text/html';
14
+ }
15
+ shouldEnableGzip(contentType) {
16
+ if (this.options.watchMode)
17
+ return false;
18
+ const gzipEnabledExtensions = ['text/javascript', 'text/css'];
19
+ return gzipEnabledExtensions.includes(contentType);
20
+ }
21
+ async createResponseWithBody(body, init = {
22
+ headers: {
23
+ 'Content-Type': 'text/html',
24
+ },
25
+ }) {
26
+ return new Response(body, init);
27
+ }
28
+ async createDefaultNotFoundResponse() {
29
+ return new Response(STATUS_MESSAGE[404], {
30
+ status: 404,
31
+ });
32
+ }
33
+ /**
34
+ * Wraps already-rendered HTML in a 404 response envelope.
35
+ */
36
+ async createHtmlNotFoundResponse(body) {
37
+ return await this.createResponseWithBody(body, {
38
+ status: 404,
39
+ statusText: STATUS_MESSAGE[404],
40
+ headers: {
41
+ 'Content-Type': 'text/html',
42
+ },
43
+ });
44
+ }
45
+ async createDefaultServerErrorResponse() {
46
+ return new Response(STATUS_MESSAGE[500], {
47
+ status: 500,
48
+ headers: {
49
+ 'Content-Type': 'text/plain; charset=utf-8',
50
+ },
51
+ });
52
+ }
53
+ /**
54
+ * Wraps already-rendered HTML in a 500 response envelope.
55
+ */
56
+ async createHtmlServerErrorResponse(body) {
57
+ return await this.createResponseWithBody(body, {
58
+ status: 500,
59
+ statusText: STATUS_MESSAGE[500],
60
+ headers: {
61
+ 'Content-Type': 'text/html',
62
+ },
63
+ });
64
+ }
65
+ /**
66
+ * Reads a static file response, returning `null` when the file is missing.
67
+ */
68
+ async createFileResponse(filePath, contentType) {
69
+ try {
70
+ let file;
71
+ const contentEncodingHeader = {};
72
+ if (this.shouldEnableGzip(contentType)) {
73
+ const gzipPath = `${filePath}.gz`;
74
+ if (fileSystem.exists(gzipPath)) {
75
+ file = fileSystem.readFileAsBuffer(gzipPath);
76
+ contentEncodingHeader['Content-Encoding'] = 'gzip';
77
+ contentEncodingHeader['Vary'] = 'Accept-Encoding';
78
+ }
79
+ else {
80
+ appLogger.debug('Gzip file not found, serving uncompressed', gzipPath);
81
+ file = fileSystem.readFileAsBuffer(filePath);
82
+ }
83
+ }
84
+ else {
85
+ file = fileSystem.readFileAsBuffer(filePath);
86
+ }
87
+ return await this.createResponseWithBody(file, {
88
+ headers: {
89
+ 'Content-Type': contentType,
90
+ ...contentEncodingHeader,
91
+ },
92
+ });
93
+ }
94
+ catch (error) {
95
+ const err = error;
96
+ const code = err.code || err.cause?.code;
97
+ if (code === 'ENOENT') {
98
+ appLogger.debug('File not found', filePath);
99
+ }
100
+ else {
101
+ appLogger.error('Error reading file', filePath, err);
102
+ }
103
+ return null;
104
+ }
105
+ }
106
+ }
@@ -1,8 +1,8 @@
1
- import type { EcoPagesAppConfig, MatchResult } from '../../types/internal-types.js';
2
- import type { PageRendererResolver } from '../../route-renderer/route-renderer.js';
3
- import type { RouteRegistry } from '../../router/server/route-registry.js';
4
- import type { PageCacheService } from '../../services/cache/page-cache-service.js';
5
- import type { CacheStrategy } from '../../services/cache/cache.types.js';
1
+ import type { EcoPagesAppConfig, MatchResult } from '../../../types/internal-types.js';
2
+ import type { PageRendererResolver } from '../../../route-renderer/route-renderer.js';
3
+ import type { RouteRegistry } from '../../../router/server/route-registry.js';
4
+ import type { PageCacheService } from '../../../services/cache/page-cache-service.js';
5
+ import type { CacheStrategy } from '../../../services/cache/cache.types.js';
6
6
  import type { FileSystemServerResponseFactory } from './fs-server-response-factory.js';
7
7
  export interface FileSystemResponseMatcherOptions {
8
8
  appConfig: EcoPagesAppConfig;
@@ -55,6 +55,26 @@ export declare class FileSystemResponseMatcher {
55
55
  * when the page template cannot be resolved.
56
56
  */
57
57
  private renderCustomNotFoundResponse;
58
+ /**
59
+ * Renders the app-owned custom 500 page, falling back to the default text 500
60
+ * when the page template cannot be resolved.
61
+ */
62
+ private renderCustomServerErrorResponse;
63
+ /**
64
+ * Builds development-only error details for the custom 500 page.
65
+ * @remarks Production omits these fields so stacks are not serialized into HTML.
66
+ */
67
+ private buildServerErrorPageProps;
68
+ private renderCustomErrorPageResponse;
69
+ private renderCustomNotFoundResponseOrServerError;
70
+ /**
71
+ * Logs the original render failure, then tries the custom 500 page once.
72
+ * @remarks Any failure while rendering the custom 500 page falls back to the
73
+ * default plain-text response and never re-enters the custom page path.
74
+ * In development the thrown error's `message` and `stack` are passed into the
75
+ * custom 500 page props.
76
+ */
77
+ private createInternalServerErrorResponse;
58
78
  private createExecutionPlan;
59
79
  /**
60
80
  * Loads the matched page module for request-time inspection.
@@ -0,0 +1,258 @@
1
+ import path from 'node:path';
2
+ import { appLogger } from '../../../global/app-logger.js';
3
+ import { PageRequestCacheCoordinator } from '../../../services/cache/page-request-cache-coordinator.service.js';
4
+ import { ServerUtils } from '../../../utils/server-utils.module.js';
5
+ import { FileRouteMiddlewarePipeline } from './file-route-middleware-pipeline.js';
6
+ import { HttpError } from '../../../errors/http-error.js';
7
+ import { LocalsAccessError } from '../../../errors/locals-access-error.js';
8
+ import { isDevelopmentRuntime } from '../../../utils/runtime.js';
9
+ /**
10
+ * Matches file-system routes to rendered HTML responses.
11
+ *
12
+ * This render pipeline coordinates page module inspection, request-local policy,
13
+ * renderer invocation, middleware execution, cache integration, and fallback
14
+ * error translation.
15
+ */
16
+ export class FileSystemResponseMatcher {
17
+ appConfig;
18
+ assetPrefix;
19
+ router;
20
+ routeRendererFactory;
21
+ fileSystemResponseFactory;
22
+ pageRequestCacheCoordinator;
23
+ fileRouteMiddlewarePipeline;
24
+ constructor({ appConfig, assetPrefix, router, routeRendererFactory, fileSystemResponseFactory, cacheService = null, defaultCacheStrategy = 'static', }) {
25
+ this.appConfig = appConfig;
26
+ this.assetPrefix = assetPrefix;
27
+ this.router = router;
28
+ this.routeRendererFactory = routeRendererFactory;
29
+ this.fileSystemResponseFactory = fileSystemResponseFactory;
30
+ this.pageRequestCacheCoordinator = new PageRequestCacheCoordinator(cacheService, defaultCacheStrategy);
31
+ this.fileRouteMiddlewarePipeline = new FileRouteMiddlewarePipeline(cacheService);
32
+ }
33
+ /**
34
+ * Resolves unmatched paths either as static asset requests or as the custom
35
+ * not-found page.
36
+ * @param requestUrl Incoming pathname.
37
+ * @returns Static file response or rendered 404 response.
38
+ */
39
+ async handleNoMatch(requestUrl) {
40
+ const isStaticFileRequest = ServerUtils.hasKnownStaticExtension(requestUrl);
41
+ if (!isStaticFileRequest) {
42
+ return this.renderCustomNotFoundResponseOrServerError(requestUrl);
43
+ }
44
+ const relativeUrl = requestUrl.startsWith('/') ? requestUrl.slice(1) : requestUrl;
45
+ const filePath = path.join(this.assetPrefix, relativeUrl);
46
+ const contentType = ServerUtils.getContentType(filePath);
47
+ const response = await this.fileSystemResponseFactory.createFileResponse(filePath, contentType);
48
+ return response ?? this.renderCustomNotFoundResponseOrServerError(requestUrl);
49
+ }
50
+ /**
51
+ * Handles a matched file-system page route.
52
+ *
53
+ * The method inspects page metadata needed for request-time execution,
54
+ * prepares the renderer invocation, validates middleware/cache constraints,
55
+ * and delegates caching plus middleware execution to dedicated collaborators.
56
+ *
57
+ * @param match Router match result.
58
+ * @param request Optional incoming request. A synthetic GET request is created when omitted.
59
+ * @returns Final response for the matched route.
60
+ */
61
+ async handleMatch(match, request) {
62
+ try {
63
+ const executionPlan = await this.createExecutionPlan(match, request);
64
+ this.fileRouteMiddlewarePipeline.assertValidConfiguration({
65
+ middleware: executionPlan.pageMiddleware,
66
+ pageCacheStrategy: executionPlan.pageCacheStrategy,
67
+ filePath: executionPlan.pageFilePath,
68
+ });
69
+ const routeRenderer = this.routeRendererFactory.getPageRenderer(executionPlan.pageFilePath);
70
+ const middlewareContext = this.fileRouteMiddlewarePipeline.createContext({
71
+ request: executionPlan.request,
72
+ params: match.params,
73
+ locals: executionPlan.localsStore,
74
+ });
75
+ const renderFn = async () => {
76
+ const result = await routeRenderer.execute({
77
+ file: executionPlan.pageFilePath,
78
+ pageModule: executionPlan.pageModule,
79
+ params: match.params,
80
+ query: match.query,
81
+ locals: executionPlan.localsForRender,
82
+ });
83
+ const html = await this.pageRequestCacheCoordinator.bodyToString(result.body);
84
+ const strategy = result.cacheStrategy ?? this.pageRequestCacheCoordinator.getDefaultCacheStrategy();
85
+ return {
86
+ html,
87
+ strategy,
88
+ sourceDependencyPaths: result.sourceDependencyPaths,
89
+ };
90
+ };
91
+ const renderResponse = async () => {
92
+ return this.pageRequestCacheCoordinator.render({
93
+ cacheKey: executionPlan.cacheKey,
94
+ pageCacheStrategy: executionPlan.pageCacheStrategy,
95
+ renderFn,
96
+ });
97
+ };
98
+ return await this.fileRouteMiddlewarePipeline.run({
99
+ middleware: executionPlan.pageMiddleware,
100
+ context: middlewareContext,
101
+ renderResponse,
102
+ });
103
+ }
104
+ catch (error) {
105
+ if (error instanceof Response) {
106
+ return error;
107
+ }
108
+ if (HttpError.isHttpError(error) && error.status === 404) {
109
+ return await this.renderCustomNotFoundResponseOrServerError(match.requestedPathname);
110
+ }
111
+ if (error instanceof LocalsAccessError) {
112
+ return await this.createInternalServerErrorResponse(error.message, match.requestedPathname, error);
113
+ }
114
+ return await this.createInternalServerErrorResponse(error instanceof Error ? error.message : 'Internal Server Error', match.requestedPathname, error);
115
+ }
116
+ }
117
+ /**
118
+ * Renders the app-owned custom 404 page, falling back to the default text 404
119
+ * when the page template cannot be resolved.
120
+ */
121
+ async renderCustomNotFoundResponse() {
122
+ return this.renderCustomErrorPageResponse({
123
+ templatePath: this.appConfig.absolutePaths.error404TemplatePath,
124
+ label: '404',
125
+ createDefaultResponse: () => this.fileSystemResponseFactory.createDefaultNotFoundResponse(),
126
+ createHtmlResponse: (body) => this.fileSystemResponseFactory.createHtmlNotFoundResponse(body),
127
+ });
128
+ }
129
+ /**
130
+ * Renders the app-owned custom 500 page, falling back to the default text 500
131
+ * when the page template cannot be resolved.
132
+ */
133
+ async renderCustomServerErrorResponse(error) {
134
+ return this.renderCustomErrorPageResponse({
135
+ templatePath: this.appConfig.absolutePaths.error500TemplatePath,
136
+ label: '500',
137
+ props: this.buildServerErrorPageProps(error),
138
+ createDefaultResponse: () => this.fileSystemResponseFactory.createDefaultServerErrorResponse(),
139
+ createHtmlResponse: (body) => this.fileSystemResponseFactory.createHtmlServerErrorResponse(body),
140
+ });
141
+ }
142
+ /**
143
+ * Builds development-only error details for the custom 500 page.
144
+ * @remarks Production omits these fields so stacks are not serialized into HTML.
145
+ */
146
+ buildServerErrorPageProps(error) {
147
+ if (!isDevelopmentRuntime()) {
148
+ return undefined;
149
+ }
150
+ if (error instanceof Error) {
151
+ return {
152
+ message: error.message,
153
+ stack: error.stack,
154
+ };
155
+ }
156
+ return {
157
+ message: String(error),
158
+ };
159
+ }
160
+ async renderCustomErrorPageResponse({ templatePath, label, props, createDefaultResponse, createHtmlResponse, }) {
161
+ let routeRenderer;
162
+ try {
163
+ routeRenderer = this.routeRendererFactory.getPageRenderer(templatePath);
164
+ }
165
+ catch {
166
+ appLogger.debug(`Custom ${label} template not found, falling back to default ${label} response`, templatePath);
167
+ return createDefaultResponse();
168
+ }
169
+ const result = await routeRenderer.execute({
170
+ file: templatePath,
171
+ props,
172
+ });
173
+ return createHtmlResponse(result.body);
174
+ }
175
+ async renderCustomNotFoundResponseOrServerError(pathname) {
176
+ try {
177
+ return await this.renderCustomNotFoundResponse();
178
+ }
179
+ catch (error) {
180
+ if (error instanceof Response) {
181
+ return error;
182
+ }
183
+ return await this.createInternalServerErrorResponse(error instanceof Error ? error.message : 'Internal Server Error', pathname, error);
184
+ }
185
+ }
186
+ /**
187
+ * Logs the original render failure, then tries the custom 500 page once.
188
+ * @remarks Any failure while rendering the custom 500 page falls back to the
189
+ * default plain-text response and never re-enters the custom page path.
190
+ * In development the thrown error's `message` and `stack` are passed into the
191
+ * custom 500 page props.
192
+ */
193
+ async createInternalServerErrorResponse(message, pathname, error) {
194
+ if (isDevelopmentRuntime() || appLogger.isDebugEnabled()) {
195
+ appLogger.error(`[FileSystemResponseMatcher] ${message} at ${pathname}`, error);
196
+ }
197
+ else {
198
+ appLogger.error(`[FileSystemResponseMatcher] Render error at ${pathname}`, error);
199
+ }
200
+ try {
201
+ return await this.renderCustomServerErrorResponse(error);
202
+ }
203
+ catch (serverErrorPageError) {
204
+ if (serverErrorPageError instanceof Response) {
205
+ return serverErrorPageError;
206
+ }
207
+ appLogger.error(`[FileSystemResponseMatcher] Custom 500 template failed at ${pathname}`, serverErrorPageError);
208
+ return this.fileSystemResponseFactory.createDefaultServerErrorResponse();
209
+ }
210
+ }
211
+ async createExecutionPlan(match, request) {
212
+ const cacheKey = this.pageRequestCacheCoordinator.buildCacheKey({
213
+ pathname: match.requestedPathname,
214
+ query: match.query,
215
+ });
216
+ const resolvedRequest = request ??
217
+ new Request(new URL(cacheKey, this.router.origin).toString(), {
218
+ method: 'GET',
219
+ });
220
+ const localsStore = {};
221
+ const pageFilePath = match.templateRoute.filePath;
222
+ const pageModule = await this.importPageModule(pageFilePath);
223
+ const pageComponent = pageModule.default;
224
+ const pageMiddleware = pageComponent.middleware ?? [];
225
+ const pageCacheStrategy = pageModule.cache ?? pageComponent.cache ?? this.pageRequestCacheCoordinator.getDefaultCacheStrategy();
226
+ return {
227
+ cacheKey,
228
+ request: resolvedRequest,
229
+ pageFilePath,
230
+ pageModule,
231
+ pageMiddleware,
232
+ pageCacheStrategy,
233
+ localsStore,
234
+ localsForRender: pageCacheStrategy === 'dynamic' ? localsStore : undefined,
235
+ };
236
+ }
237
+ /**
238
+ * Loads the matched page module for request-time inspection.
239
+ *
240
+ * The matcher needs access to page-level metadata such as `cache` and
241
+ * `middleware` before full rendering starts, so it asks the owning route
242
+ * renderer to load the page module. That preserves integration-specific page
243
+ * import setup for request-time inspection as well as for full rendering.
244
+ *
245
+ * @param filePath Absolute page module path.
246
+ * @returns Imported page module.
247
+ */
248
+ async importPageModule(filePath) {
249
+ const routeRenderer = this.routeRendererFactory.getPageRenderer(filePath);
250
+ return routeRenderer.loadPageModule(filePath);
251
+ }
252
+ /**
253
+ * Get the underlying cache service for external invalidation.
254
+ */
255
+ getCacheService() {
256
+ return this.pageRequestCacheCoordinator.getCacheService();
257
+ }
258
+ }
@@ -0,0 +1,5 @@
1
+ export type MiddlewareHandler<TContext> = (context: TContext, next: () => Promise<Response>) => Response | Promise<Response>;
2
+ /**
3
+ * Runs an onion middleware chain and invokes the terminal handler when the chain completes.
4
+ */
5
+ export declare function runMiddlewareChain<TContext>(middleware: readonly MiddlewareHandler<TContext>[], context: TContext, terminal: () => Promise<Response>): Promise<Response>;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Runs an onion middleware chain and invokes the terminal handler when the chain completes.
3
+ */
4
+ export async function runMiddlewareChain(middleware, context, terminal) {
5
+ if (middleware.length === 0) {
6
+ return terminal();
7
+ }
8
+ let index = 0;
9
+ const executeNext = async () => {
10
+ if (index < middleware.length) {
11
+ const current = middleware[index++];
12
+ return await current(context, executeNext);
13
+ }
14
+ return terminal();
15
+ };
16
+ return executeNext();
17
+ }
@@ -1,5 +1,5 @@
1
- import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../types/public-types.js';
2
- import { AbstractApplicationAdapter, type ApplicationAdapterOptions, type RouteGroupDefinition, type RouteHandler } from '../abstract/application-adapter.js';
1
+ import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../../types/public-types.js';
2
+ import { AbstractApplicationAdapter, type ApplicationAdapterOptions, type RouteGroupDefinition, type RouteHandler } from '../../abstract/application-adapter.js';
3
3
  export declare abstract class SharedApplicationAdapter<TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions, TServer = any, TRequest extends Request = Request> extends AbstractApplicationAdapter<TOptions, TServer, TRequest> {
4
4
  protected register<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, method: ApiHandler['method'], handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
5
5
  get<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
@@ -0,0 +1,75 @@
1
+ import { AbstractApplicationAdapter, } from '../../abstract/application-adapter.js';
2
+ export class SharedApplicationAdapter extends AbstractApplicationAdapter {
3
+ register(path, method, handler, options) {
4
+ return this.addRouteHandler(path, method, handler, options?.middleware, options?.schema);
5
+ }
6
+ get(path, handler, options) {
7
+ return this.register(path, 'GET', handler, options);
8
+ }
9
+ post(path, handler, options) {
10
+ return this.register(path, 'POST', handler, options);
11
+ }
12
+ put(path, handler, options) {
13
+ return this.register(path, 'PUT', handler, options);
14
+ }
15
+ delete(path, handler, options) {
16
+ return this.register(path, 'DELETE', handler, options);
17
+ }
18
+ patch(path, handler, options) {
19
+ return this.register(path, 'PATCH', handler, options);
20
+ }
21
+ options(path, handler, options) {
22
+ return this.register(path, 'OPTIONS', handler, options);
23
+ }
24
+ head(path, handler, options) {
25
+ return this.register(path, 'HEAD', handler, options);
26
+ }
27
+ route(path, method, handler, options) {
28
+ return this.register(path, method, handler, options);
29
+ }
30
+ add(handler) {
31
+ return this.addRouteHandler(handler.path, handler.method, handler.handler, handler.middleware, handler.schema);
32
+ }
33
+ group(prefixOrGroup, callback, options) {
34
+ if (typeof prefixOrGroup === 'object') {
35
+ return this.registerGroup(prefixOrGroup);
36
+ }
37
+ const normalizedPrefix = prefixOrGroup.endsWith('/') ? prefixOrGroup.slice(0, -1) : prefixOrGroup;
38
+ const groupMiddleware = (options?.middleware ?? []);
39
+ const createHandler = (method) => {
40
+ return ((path, handler, routeOptions) => {
41
+ const combinedMiddleware = [
42
+ ...groupMiddleware,
43
+ ...(routeOptions?.middleware ?? []),
44
+ ];
45
+ const fullPath = path === '/' ? normalizedPrefix : `${normalizedPrefix}${path}`;
46
+ this.addRouteHandler(fullPath, method, handler, combinedMiddleware.length > 0
47
+ ? combinedMiddleware
48
+ : undefined, routeOptions?.schema);
49
+ return builder;
50
+ });
51
+ };
52
+ const builder = {
53
+ get: createHandler('GET'),
54
+ post: createHandler('POST'),
55
+ put: createHandler('PUT'),
56
+ delete: createHandler('DELETE'),
57
+ patch: createHandler('PATCH'),
58
+ options: createHandler('OPTIONS'),
59
+ head: createHandler('HEAD'),
60
+ };
61
+ callback?.(builder);
62
+ return this;
63
+ }
64
+ registerGroup(group) {
65
+ const normalizedPrefix = group.prefix.endsWith('/') ? group.prefix.slice(0, -1) : group.prefix;
66
+ const groupMiddleware = group.middleware ?? [];
67
+ for (const route of group.routes) {
68
+ const normalizedPath = route.path.startsWith('/') ? route.path : `/${route.path}`;
69
+ const fullPath = route.path === '/' ? normalizedPrefix : `${normalizedPrefix}${normalizedPath}`;
70
+ const combinedMiddleware = [...groupMiddleware, ...(route.middleware ?? [])];
71
+ this.addRouteHandler(fullPath, route.method, route.handler, combinedMiddleware.length > 0 ? combinedMiddleware : undefined, route.schema);
72
+ }
73
+ return this;
74
+ }
75
+ }
@@ -0,0 +1,11 @@
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { DevPrewarmReadiness } from './dev-static-route-prewarm.js';
3
+ export type DevPrewarmPlan = {
4
+ pathnames: readonly string[];
5
+ beforeReadyPathnames: readonly string[];
6
+ readiness: DevPrewarmReadiness;
7
+ };
8
+ /**
9
+ * Aggregates processor-declared dev prewarm pathnames and readiness into one plan.
10
+ */
11
+ export declare function collectAppDevPrewarmPlan(appConfig: EcoPagesAppConfig): Promise<DevPrewarmPlan>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Aggregates processor-declared dev prewarm pathnames and readiness into one plan.
3
+ */
4
+ export async function collectAppDevPrewarmPlan(appConfig) {
5
+ const pathnames = new Set(appConfig.devPrewarmPaths ?? []);
6
+ const beforeReadyPathnames = new Set(appConfig.devPrewarmBeforeReadyPaths ?? []);
7
+ let readiness = 'background';
8
+ for (const processor of appConfig.processors.values()) {
9
+ const contributor = processor;
10
+ const plan = await contributor.collectDevPrewarmPlan();
11
+ for (const pathname of plan.pathnames) {
12
+ pathnames.add(pathname);
13
+ }
14
+ if (plan.readiness === 'beforeReady') {
15
+ readiness = 'beforeReady';
16
+ for (const pathname of plan.pathnames) {
17
+ beforeReadyPathnames.add(pathname);
18
+ }
19
+ }
20
+ }
21
+ for (const pathname of beforeReadyPathnames) {
22
+ pathnames.add(pathname);
23
+ }
24
+ return {
25
+ pathnames: [...pathnames],
26
+ beforeReadyPathnames: [...beforeReadyPathnames],
27
+ readiness,
28
+ };
29
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copies a source public directory into the runtime dist dir, skipping unchanged files.
3
+ *
4
+ * Dev restarts call this on every boot; byte comparison avoids rewriting identical assets.
5
+ */
6
+ export declare function copyRuntimePublicDirIfChanged(sourceDir: string, destinationDir: string): void;
@@ -0,0 +1,27 @@
1
+ import { readdirSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ /**
5
+ * Copies a source public directory into the runtime dist dir, skipping unchanged files.
6
+ *
7
+ * Dev restarts call this on every boot; byte comparison avoids rewriting identical assets.
8
+ */
9
+ export function copyRuntimePublicDirIfChanged(sourceDir, destinationDir) {
10
+ fileSystem.ensureDir(destinationDir);
11
+ for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {
12
+ const sourcePath = path.join(sourceDir, entry.name);
13
+ const destinationPath = path.join(destinationDir, entry.name);
14
+ if (entry.isDirectory()) {
15
+ copyRuntimePublicDirIfChanged(sourcePath, destinationPath);
16
+ continue;
17
+ }
18
+ if (!entry.isFile()) {
19
+ continue;
20
+ }
21
+ if (fileSystem.exists(destinationPath) &&
22
+ Buffer.compare(fileSystem.readFileAsBuffer(sourcePath), fileSystem.readFileAsBuffer(destinationPath)) === 0) {
23
+ continue;
24
+ }
25
+ fileSystem.copyFile(sourcePath, destinationPath);
26
+ }
27
+ }
@@ -0,0 +1,16 @@
1
+ export type DevPrewarmReadiness = 'background' | 'beforeReady';
2
+ export type DevStaticRoutePrewarmOptions = {
3
+ pathnames: readonly string[];
4
+ readiness?: DevPrewarmReadiness;
5
+ renderPath: (pathname: string) => Promise<void>;
6
+ /** Invoked with the pathname list before rendering begins. */
7
+ onPathnamesResolved?: (pathnames: readonly string[]) => void;
8
+ };
9
+ /**
10
+ * Renders declared pathnames so first client navigations hit warm graphs and scoped watch HTML cache.
11
+ */
12
+ export declare function runDevStaticRoutePrewarm(options: DevStaticRoutePrewarmOptions): Promise<void>;
13
+ /**
14
+ * Fire-and-forget wrapper around {@link runDevStaticRoutePrewarm}.
15
+ */
16
+ export declare function startDevStaticRoutePrewarm(options: DevStaticRoutePrewarmOptions): void;