@ecopages/core 0.2.0-beta.3 → 0.2.0-beta.30

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 (433) hide show
  1. package/README.md +38 -9
  2. package/package.json +241 -30
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +123 -6
  5. package/src/adapters/abstract/application-adapter.js +151 -1
  6. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  7. package/src/adapters/abstract/segment-path-matcher.js +149 -0
  8. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  9. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  10. package/src/adapters/abstract/ws-pattern-matcher.js +30 -0
  11. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  12. package/src/adapters/bun/bun-user-websocket-lifecycle.js +96 -0
  13. package/src/adapters/bun/client-bridge.d.ts +1 -0
  14. package/src/adapters/bun/client-bridge.js +3 -0
  15. package/src/adapters/bun/create-app.d.ts +9 -6
  16. package/src/adapters/bun/create-app.js +76 -45
  17. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  18. package/src/adapters/bun/hmr-manager.js +1 -1
  19. package/src/adapters/bun/index.d.ts +1 -1
  20. package/src/adapters/bun/index.js +25 -2
  21. package/src/adapters/bun/runtime-host.d.ts +1 -1
  22. package/src/adapters/bun/runtime-host.js +1 -1
  23. package/src/adapters/bun/server-adapter.d.ts +92 -41
  24. package/src/adapters/bun/server-adapter.js +256 -117
  25. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  26. package/src/adapters/bun/static-preview-host.js +25 -20
  27. package/src/adapters/create-app.d.ts +13 -11
  28. package/src/adapters/create-app.js +2 -51
  29. package/src/adapters/index.d.ts +2 -2
  30. package/src/adapters/index.js +26 -4
  31. package/src/adapters/node/create-app.d.ts +8 -3
  32. package/src/adapters/node/create-app.js +61 -13
  33. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  34. package/src/adapters/node/node-client-bridge.js +3 -0
  35. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  36. package/src/adapters/node/node-hmr-manager.js +1 -1
  37. package/src/adapters/node/runtime-host.d.ts +1 -1
  38. package/src/adapters/node/runtime-host.js +1 -1
  39. package/src/adapters/node/server-adapter-dependencies.js +4 -0
  40. package/src/adapters/node/server-adapter.d.ts +64 -23
  41. package/src/adapters/node/server-adapter.js +169 -142
  42. package/src/adapters/node/static-content-server.d.ts +1 -0
  43. package/src/adapters/node/static-content-server.js +10 -2
  44. package/src/adapters/node/static-preview-host.d.ts +1 -1
  45. package/src/adapters/node/static-preview-host.js +27 -12
  46. package/src/adapters/shared/{hmr-entrypoint-registrar.d.ts → hmr/hmr-entrypoint-registrar.d.ts} +31 -30
  47. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +106 -0
  48. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  49. package/src/adapters/shared/{hmr-html-response.js → hmr/hmr-html-response.js} +4 -1
  50. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +101 -0
  51. package/src/adapters/shared/hmr/shared-hmr-manager.js +432 -0
  52. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  53. package/src/adapters/shared/http/api-request-pipeline.js +129 -0
  54. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  55. package/src/adapters/shared/{api-response.js → http/api-response.js} +6 -23
  56. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  57. package/src/adapters/shared/http/create-body-response.js +23 -0
  58. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  59. package/src/adapters/shared/http/define-api-handler.js +63 -0
  60. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  61. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  62. package/src/adapters/shared/{explicit-static-route-matcher.js → http/explicit-static-route-matcher.js} +3 -38
  63. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  64. package/src/adapters/shared/{file-route-middleware-pipeline.js → http/file-route-middleware-pipeline.js} +10 -22
  65. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  66. package/src/adapters/shared/{fs-server-response-factory.js → http/fs-server-response-factory.js} +22 -2
  67. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  68. package/src/adapters/shared/{fs-server-response-matcher.js → http/fs-server-response-matcher.js} +109 -27
  69. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  70. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  71. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  72. package/src/adapters/shared/{application-adapter.js → runtime/application-adapter.js} +1 -1
  73. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  74. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +24 -0
  75. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  76. package/src/adapters/shared/runtime/port-manager.js +196 -0
  77. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  78. package/src/adapters/shared/{render-context.js → runtime/render-context.js} +8 -17
  79. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  80. package/src/adapters/shared/{runtime-app-bootstrap.js → runtime/runtime-app-bootstrap.js} +4 -7
  81. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +46 -0
  82. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +57 -0
  83. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +23 -49
  84. package/src/adapters/shared/runtime/server-adapter.js +226 -0
  85. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  86. package/src/adapters/shared/{server-route-handler.js → runtime/server-route-handler.js} +5 -43
  87. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  88. package/src/adapters/shared/runtime/server-static-builder.js +191 -0
  89. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  90. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  91. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +100 -0
  92. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  93. package/src/adapters/shared/ws/websocket-lifecycle.js +55 -0
  94. package/src/build/README.md +140 -31
  95. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  96. package/src/build/app-build-manifest-runtime.js +124 -0
  97. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  98. package/src/build/{browser-runtime-plugin.js → browser/browser-runtime-plugin.js} +1 -1
  99. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  100. package/src/build/browser/jsx-ownership-plugins.js +41 -0
  101. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  102. package/src/build/browser/lit-static-render-worker-context.js +6 -0
  103. package/src/build/build-adapter.d.ts +29 -334
  104. package/src/build/build-adapter.js +32 -133
  105. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  106. package/src/build/cache/build-input-fingerprint.js +31 -0
  107. package/src/build/cache/cache-constants.d.ts +4 -0
  108. package/src/build/cache/cache-constants.js +6 -0
  109. package/src/build/cache/cache-keys.d.ts +22 -0
  110. package/src/build/cache/cache-keys.js +63 -0
  111. package/src/build/cache/dev-browser-script-cache.d.ts +34 -0
  112. package/src/build/cache/dev-browser-script-cache.js +90 -0
  113. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  114. package/src/build/cache/pages-unified-graph-build.js +198 -0
  115. package/src/build/cache/production-build-cache.d.ts +20 -0
  116. package/src/build/cache/production-build-cache.js +63 -0
  117. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  118. package/src/build/cache/server-entry-build-cache.js +165 -0
  119. package/src/build/contracts/build-contracts.d.ts +96 -0
  120. package/src/build/contracts/build-manifest.d.ts +90 -0
  121. package/src/build/{build-manifest.js → contracts/build-manifest.js} +2 -2
  122. package/src/build/contracts/build-types.js +0 -0
  123. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +23 -9
  124. package/src/build/{rolldown-adapter-helpers.js → rolldown/rolldown-adapter-helpers.js} +99 -13
  125. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  126. package/src/build/{rolldown-build-adapter.js → rolldown/rolldown-build-adapter.js} +3 -3
  127. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  128. package/src/build/rolldown/rolldown-build-invocation-metrics.js +43 -0
  129. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  130. package/src/build/{rolldown-plugin-bridge.js → rolldown/rolldown-plugin-bridge.js} +21 -6
  131. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  132. package/src/build/rolldown/rolldown-source-transform-pass.js +61 -0
  133. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  134. package/src/build/rolldown/runtime-build-output-normalizer.js +201 -0
  135. package/src/build/runtime/build-profile-options.d.ts +7 -0
  136. package/src/build/runtime/build-profile-options.js +37 -0
  137. package/src/build/runtime/build-request-identity.d.ts +17 -0
  138. package/src/build/runtime/build-request-identity.js +54 -0
  139. package/src/build/runtime/build-request-policy.d.ts +59 -0
  140. package/src/build/runtime/build-request-policy.js +46 -0
  141. package/src/build/runtime/build-runtime.d.ts +28 -0
  142. package/src/build/runtime/build-runtime.js +65 -0
  143. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  144. package/src/build/runtime/deduping-build-executor.js +34 -0
  145. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  146. package/src/build/runtime/parallel-build-executor.js +52 -0
  147. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  148. package/src/client/navigation-scripts/classification.d.ts +16 -0
  149. package/src/client/navigation-scripts/classification.js +41 -0
  150. package/src/client/navigation-scripts/index.d.ts +3 -0
  151. package/src/client/navigation-scripts/index.js +23 -0
  152. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
  153. package/src/client/navigation-scripts/registry.d.ts +11 -0
  154. package/src/client/navigation-scripts/registry.js +12 -0
  155. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  156. package/src/client/navigation-scripts/rerun-queue.js +73 -0
  157. package/src/client/scroll.d.ts +17 -0
  158. package/src/client/scroll.js +25 -0
  159. package/src/client/scroll.test.browser.js +37 -0
  160. package/src/client/view-transitions.d.ts +16 -0
  161. package/src/client/view-transitions.js +63 -0
  162. package/src/config/config-builder.d.ts +25 -10
  163. package/src/config/config-builder.js +53 -11
  164. package/src/config/constants.d.ts +1 -0
  165. package/src/config/constants.js +2 -1
  166. package/src/dev/client-bridge-registry.d.ts +5 -0
  167. package/src/dev/client-bridge-registry.js +15 -0
  168. package/src/dev/dev-client-ownership.d.ts +7 -0
  169. package/src/dev/dev-client-ownership.js +6 -0
  170. package/src/dev/hmr-manager-registry.d.ts +8 -0
  171. package/src/dev/hmr-manager-registry.js +15 -0
  172. package/src/dev/host-runtime.d.ts +3 -0
  173. package/src/dev/host-runtime.js +7 -0
  174. package/src/dev/runtime-server-started-message.d.ts +2 -0
  175. package/src/dev/runtime-server-started-message.js +6 -0
  176. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  177. package/src/diagnostics/request-build-dedupe.js +33 -0
  178. package/src/diagnostics/startup-trace.d.ts +72 -0
  179. package/src/diagnostics/startup-trace.js +253 -0
  180. package/src/eco/README.md +11 -0
  181. package/src/eco/eco-declared-component.d.ts +14 -0
  182. package/src/eco/eco-declared-component.js +16 -0
  183. package/src/eco/eco.browser.js +5 -6
  184. package/src/eco/eco.js +7 -8
  185. package/src/eco/eco.types.d.ts +14 -3
  186. package/src/eco/eco.utils.d.ts +1 -1
  187. package/src/eco/eco.utils.js +1 -1
  188. package/src/eco/page-layout-normalization.d.ts +21 -0
  189. package/src/eco/page-layout-normalization.js +59 -0
  190. package/src/env.d.ts +2 -0
  191. package/src/errors/index.d.ts +1 -0
  192. package/src/errors/index.js +7 -1
  193. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  194. package/src/errors/undeclared-component-dependency-error.js +17 -0
  195. package/src/hmr/client/hmr-runtime.js +7 -4
  196. package/src/hmr/hmr-entrypoint-output.d.ts +49 -0
  197. package/src/hmr/hmr-entrypoint-output.js +60 -0
  198. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  199. package/src/hmr/hmr-file-change-prep.js +17 -0
  200. package/src/hmr/hmr-strategy.d.ts +15 -0
  201. package/src/hmr/hmr-strategy.js +19 -0
  202. package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -5
  203. package/src/hmr/strategies/js-hmr-strategy.js +72 -19
  204. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  205. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  206. package/src/index.d.ts +2 -1
  207. package/src/index.js +28 -2
  208. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  209. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  210. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  211. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  212. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  213. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  214. package/src/plugins/alias-resolver-plugin.js +38 -51
  215. package/src/plugins/define-integration.d.ts +26 -0
  216. package/src/plugins/define-integration.js +19 -0
  217. package/src/plugins/eco-component-meta-plugin.d.ts +1 -1
  218. package/src/plugins/eco-component-meta-plugin.js +5 -8
  219. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  220. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  221. package/src/plugins/integration-plugin.d.ts +43 -14
  222. package/src/plugins/integration-plugin.js +18 -5
  223. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  224. package/src/plugins/jsx-import-source.utils.js +26 -0
  225. package/src/plugins/processor.d.ts +61 -12
  226. package/src/plugins/processor.js +24 -5
  227. package/src/plugins/source-transform.d.ts +32 -1
  228. package/src/plugins/source-transform.js +23 -1
  229. package/src/plugins/tsconfig-import-resolver.d.ts +18 -0
  230. package/src/plugins/tsconfig-import-resolver.js +159 -0
  231. package/src/route-renderer/GRAPH.md +26 -32
  232. package/src/route-renderer/README.md +38 -31
  233. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  234. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +148 -0
  235. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  236. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +31 -0
  237. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  238. package/src/route-renderer/orchestration/{component-render-context.js → foreign-child/component-render-context.js} +4 -2
  239. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  240. package/src/route-renderer/orchestration/{render-output.utils.js → foreign-child/foreign-child-output.utils.js} +35 -26
  241. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  242. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.js → foreign-child/foreign-subtree-execution.service.js} +170 -37
  243. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  244. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +35 -0
  245. package/src/route-renderer/orchestration/integration-renderer.d.ts +24 -143
  246. package/src/route-renderer/orchestration/integration-renderer.js +163 -402
  247. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  248. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +177 -0
  249. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  250. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +143 -0
  251. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  252. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +96 -0
  253. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +7 -2
  254. package/src/route-renderer/orchestration/{ownership-validation.service.js → ownership-graph/ownership-validation.service.js} +30 -3
  255. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  256. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +32 -0
  257. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.d.ts +9 -0
  258. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +7 -0
  259. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  260. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +29 -0
  261. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +106 -0
  262. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +436 -0
  263. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +31 -0
  264. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +229 -0
  265. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  266. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +31 -0
  267. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +25 -0
  268. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  269. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +27 -0
  270. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  271. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +36 -0
  272. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +20 -0
  273. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +24 -0
  274. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +25 -0
  275. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  276. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  277. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +33 -0
  278. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +13 -53
  279. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +162 -0
  280. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  281. package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
  282. package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
  283. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +6 -0
  284. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +7 -2
  285. package/src/route-renderer/page-loading/module-declaration-aggregation.js +4 -0
  286. package/src/router/client/link-intent.d.ts +11 -21
  287. package/src/router/client/link-intent.js +10 -0
  288. package/src/router/client/link-intent.test.browser.js +12 -1
  289. package/src/router/client/link-navigation-policy.d.ts +45 -0
  290. package/src/router/client/link-navigation-policy.js +101 -0
  291. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  292. package/src/router/client/link-navigation-policy.test.browser.js +92 -0
  293. package/src/router/client/navigation-coordinator.d.ts +1 -1
  294. package/src/router/client/navigation-coordinator.js +12 -2
  295. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  296. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +3 -0
  297. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +6 -1
  298. package/src/services/assets/asset-processing-service/asset-processing.service.js +44 -5
  299. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  300. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  301. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  302. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  303. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +78 -0
  304. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  305. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +28 -13
  306. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  307. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +7 -0
  308. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  309. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +38 -12
  310. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  311. package/src/services/assets/asset-processing-service/index.js +2 -0
  312. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  313. package/src/services/assets/asset-processing-service/inline-content-script-body.js +17 -0
  314. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  315. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +18 -0
  316. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  317. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +2 -15
  318. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  319. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +73 -68
  320. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  321. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +18 -15
  322. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  323. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  324. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  325. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  326. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  327. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  328. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  329. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  330. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +17 -0
  331. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  332. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +5 -10
  333. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  334. package/src/services/assets/browser-bundle.service.js +28 -19
  335. package/src/services/html/html-transformer.service.d.ts +1 -1
  336. package/src/services/html/html-transformer.service.js +5 -5
  337. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  338. package/src/services/invalidation/development-invalidation.service.js +64 -11
  339. package/src/services/module-loading/README.md +49 -0
  340. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  341. package/src/services/module-loading/app-server-module-transpiler.service.js +3 -21
  342. package/src/services/module-loading/page-module-import.service.d.ts +6 -2
  343. package/src/services/module-loading/page-module-import.service.js +110 -47
  344. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  345. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  346. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  347. package/src/services/module-loading/route-module-build-cache.js +38 -0
  348. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  349. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  350. package/src/services/module-loading/route-module-build-manifest.d.ts +54 -0
  351. package/src/services/module-loading/route-module-build-manifest.js +85 -0
  352. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  353. package/src/services/module-loading/route-module-dependency-hasher.js +122 -0
  354. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -1
  355. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  356. package/src/services/validation/schema-validation-service.d.ts +1 -4
  357. package/src/services/validation/schema-validation-service.js +12 -13
  358. package/src/services/validation/standard-schema.types.d.ts +9 -62
  359. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  360. package/src/services/validation/validate-standard-schema.js +14 -0
  361. package/src/static-site-generator/README.md +41 -0
  362. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +28 -0
  363. package/src/static-site-generator/production-page-browser-graph-prebuild.js +22 -0
  364. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  365. package/src/static-site-generator/sitemap-routes.js +31 -0
  366. package/src/static-site-generator/sitemap.d.ts +15 -0
  367. package/src/static-site-generator/sitemap.js +33 -0
  368. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  369. package/src/static-site-generator/static-build-invalidation.js +59 -0
  370. package/src/static-site-generator/static-export-context.d.ts +30 -0
  371. package/src/static-site-generator/static-export-context.js +0 -0
  372. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  373. package/src/static-site-generator/static-site-generator.js +381 -106
  374. package/src/types/internal-types.d.ts +39 -13
  375. package/src/types/public-types.d.ts +289 -52
  376. package/src/utils/ecopages-route-info.d.ts +26 -0
  377. package/src/utils/ecopages-route-info.js +26 -0
  378. package/src/utils/html-escaping.d.ts +7 -0
  379. package/src/utils/html-escaping.js +5 -1
  380. package/src/utils/parse-cli-args.d.ts +2 -0
  381. package/src/utils/parse-cli-args.js +6 -0
  382. package/src/utils/path-pattern.d.ts +23 -0
  383. package/src/utils/path-pattern.js +27 -0
  384. package/src/utils/server-utils.module.d.ts +3 -2
  385. package/src/utils/server-utils.module.js +5 -6
  386. package/src/utils/static-file-extensions.d.ts +12 -0
  387. package/src/utils/static-file-extensions.js +48 -0
  388. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  389. package/src/watchers/project-watcher-ignore.js +16 -0
  390. package/src/watchers/project-watcher.d.ts +29 -6
  391. package/src/watchers/project-watcher.js +146 -34
  392. package/src/watchers/project-watcher.test-helpers.js +5 -5
  393. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  394. package/src/adapters/shared/define-api-handler.js +0 -15
  395. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  396. package/src/adapters/shared/server-adapter.js +0 -436
  397. package/src/adapters/shared/server-static-builder.js +0 -162
  398. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  399. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  400. package/src/build/build-manifest.d.ts +0 -33
  401. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  402. package/src/build/rolldown-dev-build-adapter.js +0 -166
  403. package/src/build/runtime-build-executor.d.ts +0 -21
  404. package/src/build/runtime-build-executor.js +0 -19
  405. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  406. package/src/build/runtime-build-output-normalizer.js +0 -111
  407. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  408. package/src/hmr/hmr.test.e2e.js +0 -43
  409. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  410. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  411. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  412. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  413. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  414. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  415. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  416. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  417. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  418. /package/src/adapters/shared/{explicit-static-render-preparation.js → http/explicit-static-render-preparation.js} +0 -0
  419. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  420. /package/src/adapters/shared/{runtime-host.js → runtime/runtime-host.js} +0 -0
  421. /package/src/adapters/shared/{static-preview-host.js → runtime/static-preview-host.js} +0 -0
  422. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  423. /package/src/build/{browser-runtime-manifest.js → browser/browser-runtime-manifest.js} +0 -0
  424. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  425. /package/src/build/{browser-runtime-plugin-helpers.js → browser/browser-runtime-plugin-helpers.js} +0 -0
  426. /package/src/build/{build-types.js → contracts/build-contracts.js} +0 -0
  427. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  428. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
  429. /package/src/build/{server-side-css-shim-plugin.js → rolldown/server-side-css-shim-plugin.js} +0 -0
  430. /package/src/build/{serialized-build-executor.js → runtime/serialized-build-executor.js} +0 -0
  431. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
  432. /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
  433. /package/src/route-renderer/orchestration/{processed-asset-dedupe.js → page-browser-graph/processed-asset-dedupe.js} +0 -0
@@ -0,0 +1,129 @@
1
+ import { createRequire } from "../../../utils/locals-utils.js";
2
+ import { HttpError } from "../../../errors/http-error.js";
3
+ import { ApiResponseBuilder } from "./api-response.js";
4
+ import { runMiddlewareChain } from "./run-middleware-chain.js";
5
+ import { matchApiPathPattern, scoreApiPathPattern } from "../../abstract/segment-path-matcher.js";
6
+ import { appLogger } from "../../../global/app-logger.js";
7
+ class ApiRequestPipeline {
8
+ schemaValidator;
9
+ getRenderContext;
10
+ getCacheService;
11
+ constructor(options) {
12
+ this.schemaValidator = options.schemaValidator;
13
+ this.getRenderContext = options.getRenderContext;
14
+ this.getCacheService = options.getCacheService;
15
+ }
16
+ match(request, apiHandlers) {
17
+ const pathname = new URL(request.url).pathname;
18
+ const method = request.method.toUpperCase();
19
+ const sortedHandlers = [...apiHandlers].sort((a, b) => {
20
+ return scoreApiPathPattern(b.path) - scoreApiPathPattern(a.path);
21
+ });
22
+ for (const routeConfig of sortedHandlers) {
23
+ const routeMethod = (routeConfig.method || "GET").toUpperCase();
24
+ if (routeMethod !== method) {
25
+ continue;
26
+ }
27
+ const params = matchApiPathPattern(routeConfig.path, pathname);
28
+ if (params) {
29
+ return { routeConfig, params };
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ async tryHandle(request, apiHandlers, serverInstance, errorHandler) {
35
+ const apiMatch = this.match(request, apiHandlers);
36
+ if (!apiMatch) {
37
+ return null;
38
+ }
39
+ return await this.execute(request, apiMatch.params, apiMatch.routeConfig, serverInstance, errorHandler);
40
+ }
41
+ async execute(request, params, routeConfig, serverInstance, errorHandler) {
42
+ let context;
43
+ try {
44
+ context = this.createContext(request, params, serverInstance);
45
+ const schemaResponse = await this.applyRequestSchema(context, routeConfig.schema);
46
+ if (schemaResponse) {
47
+ return schemaResponse;
48
+ }
49
+ return await this.runMiddlewareChain(context, routeConfig);
50
+ } catch (error) {
51
+ if (error instanceof Response) return error;
52
+ if (errorHandler) {
53
+ try {
54
+ if (!context) {
55
+ context = this.createContext(request, params, serverInstance);
56
+ }
57
+ return await errorHandler(error, context);
58
+ } catch (handlerError) {
59
+ appLogger.error(`[ecopages] Error in custom error handler: ${handlerError}`);
60
+ }
61
+ }
62
+ if (error instanceof HttpError) return error.toResponse();
63
+ appLogger.error(`[ecopages] Error handling API request: ${error}`);
64
+ return new Response("Internal Server Error", { status: 500 });
65
+ }
66
+ }
67
+ createContext(request, params, serverInstance) {
68
+ const locals = {};
69
+ const normalizedParams = this.normalizeParams(params);
70
+ return {
71
+ request,
72
+ params: normalizedParams,
73
+ response: new ApiResponseBuilder(),
74
+ server: serverInstance,
75
+ locals,
76
+ require: createRequire(() => locals),
77
+ services: {
78
+ cache: this.getCacheService()
79
+ },
80
+ ...this.getRenderContext()
81
+ };
82
+ }
83
+ normalizeParams(params) {
84
+ return Object.fromEntries(
85
+ Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join("/") : value])
86
+ );
87
+ }
88
+ async applyRequestSchema(context, schema) {
89
+ if (!schema) {
90
+ return void 0;
91
+ }
92
+ const url = new URL(context.request.url);
93
+ const queryParams = Object.fromEntries(url.searchParams);
94
+ const headers = Object.fromEntries(context.request.headers);
95
+ let body;
96
+ if (schema.body) {
97
+ try {
98
+ const contentType = context.request.headers.get("Content-Type") || "";
99
+ if (contentType.includes("application/json")) body = await context.request.clone().json();
100
+ else if (contentType.includes("text/plain")) body = await context.request.clone().text();
101
+ } catch {
102
+ return context.response.status(400).json({ error: "Invalid request body" });
103
+ }
104
+ }
105
+ const validationResult = await this.schemaValidator.validateRequest(
106
+ { body, query: queryParams, headers, params: context.params },
107
+ schema
108
+ );
109
+ if (!validationResult.success) {
110
+ return context.response.status(400).json({
111
+ error: "Validation failed",
112
+ issues: validationResult.errors
113
+ });
114
+ }
115
+ const validated = validationResult.data;
116
+ if (validated.body !== void 0) context.body = validated.body;
117
+ if (validated.query !== void 0) context.query = validated.query;
118
+ if (validated.headers !== void 0) context.headers = validated.headers;
119
+ if (validated.params !== void 0) context.params = validated.params;
120
+ return void 0;
121
+ }
122
+ async runMiddlewareChain(context, routeConfig) {
123
+ const middleware = routeConfig.middleware ?? [];
124
+ return runMiddlewareChain(middleware, context, async () => await routeConfig.handler(context));
125
+ }
126
+ }
127
+ export {
128
+ ApiRequestPipeline
129
+ };
@@ -21,7 +21,7 @@ export declare class ApiResponseBuilder {
21
21
  * @param data - The data to serialize.
22
22
  * @returns A Response object.
23
23
  */
24
- json(data: any): Response;
24
+ json(data: unknown): Response;
25
25
  /**
26
26
  * Creates a plain text response using the configured status and headers.
27
27
  * @param data - The text content.
@@ -1,3 +1,4 @@
1
+ import { createBodyResponse } from "./create-body-response.js";
1
2
  class ApiResponseBuilder {
2
3
  _status = 200;
3
4
  _headers = new Headers();
@@ -28,10 +29,7 @@ class ApiResponseBuilder {
28
29
  * @returns A Response object.
29
30
  */
30
31
  json(data) {
31
- if (!this._headers.has("Content-Type")) {
32
- this._headers.set("Content-Type", "application/json; charset=utf-8");
33
- }
34
- return new Response(JSON.stringify(data), { status: this._status, headers: this._headers });
32
+ return createBodyResponse("json", data, { status: this._status, headers: this._headers });
35
33
  }
36
34
  /**
37
35
  * Creates a plain text response using the configured status and headers.
@@ -39,10 +37,7 @@ class ApiResponseBuilder {
39
37
  * @returns A Response object.
40
38
  */
41
39
  text(data) {
42
- if (!this._headers.has("Content-Type")) {
43
- this._headers.set("Content-Type", "text/plain; charset=utf-8");
44
- }
45
- return new Response(data, { status: this._status, headers: this._headers });
40
+ return createBodyResponse("text", data, { status: this._status, headers: this._headers });
46
41
  }
47
42
  /**
48
43
  * Creates an HTML response using the configured status and headers.
@@ -50,10 +45,7 @@ class ApiResponseBuilder {
50
45
  * @returns A Response object.
51
46
  */
52
47
  html(data) {
53
- if (!this._headers.has("Content-Type")) {
54
- this._headers.set("Content-Type", "text/html; charset=utf-8");
55
- }
56
- return new Response(data, { status: this._status, headers: this._headers });
48
+ return createBodyResponse("html", data, { status: this._status, headers: this._headers });
57
49
  }
58
50
  /**
59
51
  * Creates a redirect response.
@@ -77,18 +69,9 @@ class ApiResponseBuilder {
77
69
  const errorStatus = explicitStatus ?? (this._status === 200 ? 500 : this._status);
78
70
  this.status(errorStatus);
79
71
  if (typeof data === "object" && data !== null) {
80
- if (!this._headers.has("Content-Type")) {
81
- this._headers.set("Content-Type", "application/json; charset=utf-8");
82
- }
83
- return new Response(JSON.stringify({ error: data }), {
84
- status: this._status,
85
- headers: this._headers
86
- });
87
- }
88
- if (!this._headers.has("Content-Type")) {
89
- this._headers.set("Content-Type", "text/plain; charset=utf-8");
72
+ return createBodyResponse("json", { error: data }, { status: this._status, headers: this._headers });
90
73
  }
91
- return new Response(String(data), { status: this._status, headers: this._headers });
74
+ return createBodyResponse("text", String(data), { status: this._status, headers: this._headers });
92
75
  }
93
76
  }
94
77
  export {
@@ -0,0 +1,12 @@
1
+ export type BodyResponseKind = 'json' | 'html' | 'text';
2
+ export type CreateBodyResponseInit = {
3
+ status?: Response['status'];
4
+ headers?: HeadersInit;
5
+ };
6
+ /**
7
+ * Builds a typed HTTP response body for JSON, HTML, or plain text.
8
+ *
9
+ * @remarks
10
+ * Sole internal emission path for adapter response helpers. Not exported from `@ecopages/core`.
11
+ */
12
+ export declare function createBodyResponse(kind: BodyResponseKind, data: unknown, init?: CreateBodyResponseInit): Response;
@@ -0,0 +1,23 @@
1
+ function createBodyResponse(kind, data, init) {
2
+ const headers = new Headers(init?.headers);
3
+ const status = init?.status ?? 200;
4
+ if (kind === "json") {
5
+ if (!headers.has("Content-Type")) {
6
+ headers.set("Content-Type", "application/json; charset=utf-8");
7
+ }
8
+ return new Response(JSON.stringify(data), { status, headers });
9
+ }
10
+ if (kind === "html") {
11
+ if (!headers.has("Content-Type")) {
12
+ headers.set("Content-Type", "text/html; charset=utf-8");
13
+ }
14
+ return new Response(String(data), { status, headers });
15
+ }
16
+ if (!headers.has("Content-Type")) {
17
+ headers.set("Content-Type", "text/plain; charset=utf-8");
18
+ }
19
+ return new Response(String(data), { status, headers });
20
+ }
21
+ export {
22
+ createBodyResponse
23
+ };
@@ -0,0 +1,90 @@
1
+ import type { ApiHandler, ApiHandlerContext, Middleware, ResponseOptions, RouteSchema, TypedGroupHandlerContext } from '../../../types/public-types.js';
2
+ type UniversalContext = ApiHandlerContext<Request, unknown>;
3
+ type SchemaHandlerContext<TSchema extends RouteSchema | undefined, TContext extends UniversalContext> = TSchema extends RouteSchema ? TypedGroupHandlerContext<TSchema, TContext> : TContext;
4
+ type DefineApiHandlerInput<TPath extends string, TSchema extends RouteSchema | undefined, TContext extends UniversalContext> = Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema' | 'method'> & {
5
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
6
+ middleware?: Middleware<Request, unknown, TContext>[];
7
+ schema?: TSchema;
8
+ };
9
+ export declare function defineApiHandler<TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: DefineApiHandlerInput<TPath, TSchema, TContext> & {
10
+ method: ApiHandler<TPath, Request, unknown>['method'];
11
+ }): ApiHandler<TPath, Request, unknown>;
12
+ declare const defineApiMethod: <M extends ApiHandler["method"]>(method: M) => <const TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: DefineApiHandlerInput<TPath, TSchema, TContext> & {
13
+ path: TPath;
14
+ }) => ApiHandler<TPath, Request, unknown>;
15
+ export declare const defineGet: <const TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, "middleware" | "method" | "schema" | "handler"> & {
16
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
17
+ middleware?: Middleware<Request, unknown, TContext>[] | undefined;
18
+ schema?: TSchema | undefined;
19
+ } & {
20
+ path: TPath;
21
+ }) => ApiHandler<TPath, Request, unknown>;
22
+ export declare const definePost: <const TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, "middleware" | "method" | "schema" | "handler"> & {
23
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
24
+ middleware?: Middleware<Request, unknown, TContext>[] | undefined;
25
+ schema?: TSchema | undefined;
26
+ } & {
27
+ path: TPath;
28
+ }) => ApiHandler<TPath, Request, unknown>;
29
+ export declare const definePut: <const TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, "middleware" | "method" | "schema" | "handler"> & {
30
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
31
+ middleware?: Middleware<Request, unknown, TContext>[] | undefined;
32
+ schema?: TSchema | undefined;
33
+ } & {
34
+ path: TPath;
35
+ }) => ApiHandler<TPath, Request, unknown>;
36
+ export declare const defineDelete: <const TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, "middleware" | "method" | "schema" | "handler"> & {
37
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
38
+ middleware?: Middleware<Request, unknown, TContext>[] | undefined;
39
+ schema?: TSchema | undefined;
40
+ } & {
41
+ path: TPath;
42
+ }) => ApiHandler<TPath, Request, unknown>;
43
+ export declare const definePatch: <const TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, "middleware" | "method" | "schema" | "handler"> & {
44
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
45
+ middleware?: Middleware<Request, unknown, TContext>[] | undefined;
46
+ schema?: TSchema | undefined;
47
+ } & {
48
+ path: TPath;
49
+ }) => ApiHandler<TPath, Request, unknown>;
50
+ export declare const defineOptions: <const TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, "middleware" | "method" | "schema" | "handler"> & {
51
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
52
+ middleware?: Middleware<Request, unknown, TContext>[] | undefined;
53
+ schema?: TSchema | undefined;
54
+ } & {
55
+ path: TPath;
56
+ }) => ApiHandler<TPath, Request, unknown>;
57
+ export declare const defineHead: <const TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, "middleware" | "method" | "schema" | "handler"> & {
58
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
59
+ middleware?: Middleware<Request, unknown, TContext>[] | undefined;
60
+ schema?: TSchema | undefined;
61
+ } & {
62
+ path: TPath;
63
+ }) => ApiHandler<TPath, Request, unknown>;
64
+ export declare function json(data: unknown, options?: ResponseOptions): Response;
65
+ export declare function html(content: string, options?: ResponseOptions): Response;
66
+ export declare function redirect(url: string, status?: number): Response;
67
+ export interface GroupHandler<TPrefix extends string = string> {
68
+ prefix: TPrefix;
69
+ middleware?: readonly Middleware<Request, unknown, any>[];
70
+ routes: readonly ApiHandler<string, Request, unknown>[];
71
+ }
72
+ type GroupDefineHandler<TContext extends UniversalContext> = {
73
+ <const TPath extends string, TSchema extends RouteSchema | undefined = undefined>(handler: DefineApiHandlerInput<TPath, TSchema, TContext> & {
74
+ path: TPath;
75
+ method: ApiHandler<TPath, Request, unknown>['method'];
76
+ }): ApiHandler<TPath, Request, unknown>;
77
+ get: ReturnType<typeof defineApiMethod<'GET'>>;
78
+ post: ReturnType<typeof defineApiMethod<'POST'>>;
79
+ put: ReturnType<typeof defineApiMethod<'PUT'>>;
80
+ delete: ReturnType<typeof defineApiMethod<'DELETE'>>;
81
+ patch: ReturnType<typeof defineApiMethod<'PATCH'>>;
82
+ options: ReturnType<typeof defineApiMethod<'OPTIONS'>>;
83
+ head: ReturnType<typeof defineApiMethod<'HEAD'>>;
84
+ };
85
+ export declare function defineGroupHandler<TPrefix extends string, TMiddleware extends readonly Middleware<Request, unknown, any>[] = [], TContext extends UniversalContext = TMiddleware extends readonly Middleware<Request, unknown, infer TGroupContext>[] ? TGroupContext : UniversalContext>(config: {
86
+ prefix: TPrefix;
87
+ middleware?: TMiddleware;
88
+ routes: (api: GroupDefineHandler<TContext>) => readonly ApiHandler<string, Request, unknown>[];
89
+ }): GroupHandler<TPrefix>;
90
+ export {};
@@ -0,0 +1,63 @@
1
+ import { createBodyResponse } from "./create-body-response.js";
2
+ function defineApiHandler(handler) {
3
+ return handler;
4
+ }
5
+ const defineApiMethod = (method) => (handler) => defineApiHandler({ ...handler, method });
6
+ const defineGet = defineApiMethod("GET");
7
+ const definePost = defineApiMethod("POST");
8
+ const definePut = defineApiMethod("PUT");
9
+ const defineDelete = defineApiMethod("DELETE");
10
+ const definePatch = defineApiMethod("PATCH");
11
+ const defineOptions = defineApiMethod("OPTIONS");
12
+ const defineHead = defineApiMethod("HEAD");
13
+ function json(data, options) {
14
+ return createBodyResponse("json", data, {
15
+ status: options?.status,
16
+ headers: options?.headers
17
+ });
18
+ }
19
+ function html(content, options) {
20
+ return createBodyResponse("html", content, {
21
+ status: options?.status,
22
+ headers: options?.headers
23
+ });
24
+ }
25
+ function redirect(url, status = 302) {
26
+ return new Response(null, {
27
+ status,
28
+ headers: { Location: url }
29
+ });
30
+ }
31
+ function createGroupApi() {
32
+ const define = ((handler) => handler);
33
+ return Object.assign(define, {
34
+ get: defineApiMethod("GET"),
35
+ post: defineApiMethod("POST"),
36
+ put: defineApiMethod("PUT"),
37
+ delete: defineApiMethod("DELETE"),
38
+ patch: defineApiMethod("PATCH"),
39
+ options: defineApiMethod("OPTIONS"),
40
+ head: defineApiMethod("HEAD")
41
+ });
42
+ }
43
+ function defineGroupHandler(config) {
44
+ return {
45
+ prefix: config.prefix,
46
+ middleware: config.middleware,
47
+ routes: config.routes(createGroupApi())
48
+ };
49
+ }
50
+ export {
51
+ defineApiHandler,
52
+ defineDelete,
53
+ defineGet,
54
+ defineGroupHandler,
55
+ defineHead,
56
+ defineOptions,
57
+ definePatch,
58
+ definePost,
59
+ definePut,
60
+ html,
61
+ json,
62
+ redirect
63
+ };
@@ -1,6 +1,6 @@
1
- import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
- import type { EcoFunctionComponent, EcoPageComponent } from '../../types/public-types.js';
3
- import type { ExplicitViewRenderer, ExplicitViewRendererResolver } from '../../route-renderer/route-renderer.js';
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { EcoFunctionComponent, EcoPageComponent } from '../../../types/public-types.js';
3
+ import type { ExplicitViewRenderer, ExplicitViewRendererResolver } from '../../../route-renderer/route-renderer.js';
4
4
  type ExplicitStaticRenderPreparationResult = {
5
5
  renderer: ExplicitViewRenderer;
6
6
  props: Record<string, unknown>;
@@ -1,6 +1,6 @@
1
- import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
- import type { StaticRoute } from '../../types/public-types.js';
3
- import type { ExplicitViewRendererResolver } from '../../route-renderer/route-renderer.js';
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { StaticRoute } from '../../../types/public-types.js';
3
+ import type { ExplicitViewRendererResolver } from '../../../route-renderer/route-renderer.js';
4
4
  export declare const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS: {
5
5
  readonly missingIntegration: (routePath: string) => string;
6
6
  readonly noRendererForIntegration: (integrationName: string) => string;
@@ -27,12 +27,6 @@ export declare class ExplicitStaticRouteMatcher {
27
27
  * Returns the matched route and extracted params, or null if no match.
28
28
  */
29
29
  match(url: string): ExplicitRouteMatch | null;
30
- /**
31
- * Match a route pattern against a pathname.
32
- * Supports :param and [param] syntax.
33
- * Returns extracted params or null if no match.
34
- */
35
- private matchRoute;
36
30
  /**
37
31
  * Handle a matched explicit static route.
38
32
  * Resolves the loader and renders the view using the appropriate integration renderer.
@@ -1,5 +1,6 @@
1
- import { appLogger } from "../../global/app-logger.js";
1
+ import { appLogger } from "../../../global/app-logger.js";
2
2
  import { prepareExplicitStaticRender } from "./explicit-static-render-preparation.js";
3
+ import { matchExplicitStaticPathPattern } from "../../abstract/segment-path-matcher.js";
3
4
  const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
4
5
  missingIntegration: (routePath) => `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
5
6
  noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`
@@ -20,49 +21,13 @@ class ExplicitStaticRouteMatcher {
20
21
  match(url) {
21
22
  const pathname = new URL(url).pathname;
22
23
  for (const route of this.staticRoutes) {
23
- const params = this.matchRoute(route.path, pathname);
24
+ const params = matchExplicitStaticPathPattern(route.path, pathname);
24
25
  if (params !== null) {
25
26
  return { route, params };
26
27
  }
27
28
  }
28
29
  return null;
29
30
  }
30
- /**
31
- * Match a route pattern against a pathname.
32
- * Supports :param and [param] syntax.
33
- * Returns extracted params or null if no match.
34
- */
35
- matchRoute(pattern, pathname) {
36
- const patternSegments = pattern.split("/").filter(Boolean);
37
- const pathSegments = pathname.split("/").filter(Boolean);
38
- if (patternSegments.length !== pathSegments.length) {
39
- const lastPattern = patternSegments[patternSegments.length - 1];
40
- const isCatchAll = lastPattern?.startsWith("[...") || lastPattern?.startsWith(":...");
41
- if (!isCatchAll) {
42
- return null;
43
- }
44
- }
45
- const params = {};
46
- for (let i = 0; i < patternSegments.length; i++) {
47
- const patternPart = patternSegments[i];
48
- const pathPart = pathSegments[i];
49
- if (patternPart.startsWith(":...") || patternPart.startsWith("[...")) {
50
- const paramName = patternPart.replace(/^(:\.\.\.|\[\.\.\.)/, "").replace(/\]$/, "");
51
- params[paramName] = pathSegments.slice(i).join("/");
52
- return params;
53
- }
54
- if (patternPart.startsWith(":")) {
55
- const paramName = patternPart.slice(1);
56
- params[paramName] = pathPart;
57
- } else if (patternPart.startsWith("[") && patternPart.endsWith("]")) {
58
- const paramName = patternPart.slice(1, -1);
59
- params[paramName] = pathPart;
60
- } else if (patternPart !== pathPart) {
61
- return null;
62
- }
63
- }
64
- return params;
65
- }
66
31
  /**
67
32
  * Handle a matched explicit static route.
68
33
  * Resolves the loader and renders the view using the appropriate integration renderer.
@@ -1,5 +1,5 @@
1
- import type { FileRouteMiddleware, FileRouteMiddlewareContext, RequestLocals } from '../../types/public-types.js';
2
- import type { PageCacheService } from '../../services/cache/page-cache-service.js';
1
+ import type { FileRouteMiddleware, FileRouteMiddlewareContext, RequestLocals } from '../../../types/public-types.js';
2
+ import type { PageCacheService } from '../../../services/cache/page-cache-service.js';
3
3
  export declare const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS: {
4
4
  readonly middlewareRequiresDynamic: (filePath: string) => string;
5
5
  };
@@ -1,6 +1,7 @@
1
- import { createRequire } from "../../utils/locals-utils.js";
1
+ import { createRequire } from "../../../utils/locals-utils.js";
2
2
  import { ApiResponseBuilder } from "./api-response.js";
3
- import { LocalsAccessError } from "../../errors/locals-access-error.js";
3
+ import { runMiddlewareChain } from "./run-middleware-chain.js";
4
+ import { LocalsAccessError } from "../../../errors/locals-access-error.js";
4
5
  const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS = {
5
6
  middlewareRequiresDynamic: (filePath) => `[ecopages] Page middleware requires cache: 'dynamic'. Page: ${filePath}`
6
7
  };
@@ -46,16 +47,14 @@ class FileRouteMiddlewarePipeline {
46
47
  locals: input.locals,
47
48
  require: createRequire(() => context.locals),
48
49
  json: (data, options) => {
49
- const builder = new ApiResponseBuilder();
50
- if (options?.status) builder.status(options.status);
51
- if (options?.headers) builder.headers(options.headers);
52
- return builder.json(data);
50
+ if (options?.status) context.response.status(options.status);
51
+ if (options?.headers) context.response.headers(options.headers);
52
+ return context.response.json(data);
53
53
  },
54
54
  html: (content, options) => {
55
- const builder = new ApiResponseBuilder();
56
- if (options?.status) builder.status(options.status);
57
- if (options?.headers) builder.headers(options.headers);
58
- return builder.html(content);
55
+ if (options?.status) context.response.status(options.status);
56
+ if (options?.headers) context.response.headers(options.headers);
57
+ return context.response.html(content);
59
58
  }
60
59
  };
61
60
  return context;
@@ -70,18 +69,7 @@ class FileRouteMiddlewarePipeline {
70
69
  * @returns Response from middleware or final render stage.
71
70
  */
72
71
  async run(input) {
73
- if (input.middleware.length === 0) {
74
- return input.renderResponse();
75
- }
76
- let index = 0;
77
- const executeNext = async () => {
78
- if (index < input.middleware.length) {
79
- const current = input.middleware[index++];
80
- return current(input.context, executeNext);
81
- }
82
- return input.renderResponse();
83
- };
84
- return executeNext();
72
+ return runMiddlewareChain(input.middleware, input.context, input.renderResponse);
85
73
  }
86
74
  }
87
75
  export {
@@ -1,5 +1,5 @@
1
- import type { FileSystemServerOptions } from '../../types/internal-types.js';
2
- import type { RouteRendererBody } from '../../types/public-types.js';
1
+ import type { FileSystemServerOptions } from '../../../types/internal-types.js';
2
+ import type { RouteRendererBody } from '../../../types/public-types.js';
3
3
  /**
4
4
  * Builds HTTP responses for static files and shared file-system fallbacks.
5
5
  */
@@ -16,6 +16,11 @@ export declare class FileSystemServerResponseFactory {
16
16
  * Wraps already-rendered HTML in a 404 response envelope.
17
17
  */
18
18
  createHtmlNotFoundResponse(body: RouteRendererBody): Promise<Response>;
19
+ createDefaultServerErrorResponse(): Promise<Response>;
20
+ /**
21
+ * Wraps already-rendered HTML in a 500 response envelope.
22
+ */
23
+ createHtmlServerErrorResponse(body: RouteRendererBody): Promise<Response>;
19
24
  /**
20
25
  * Reads a static file response, returning `null` when the file is missing.
21
26
  */
@@ -1,5 +1,5 @@
1
- import { STATUS_MESSAGE } from "../../config/constants.js";
2
- import { appLogger } from "../../global/app-logger.js";
1
+ import { STATUS_MESSAGE } from "../../../config/constants.js";
2
+ import { appLogger } from "../../../global/app-logger.js";
3
3
  import { fileSystem } from "@ecopages/file-system";
4
4
  class FileSystemServerResponseFactory {
5
5
  options;
@@ -38,6 +38,26 @@ class FileSystemServerResponseFactory {
38
38
  }
39
39
  });
40
40
  }
41
+ async createDefaultServerErrorResponse() {
42
+ return new Response(STATUS_MESSAGE[500], {
43
+ status: 500,
44
+ headers: {
45
+ "Content-Type": "text/plain; charset=utf-8"
46
+ }
47
+ });
48
+ }
49
+ /**
50
+ * Wraps already-rendered HTML in a 500 response envelope.
51
+ */
52
+ async createHtmlServerErrorResponse(body) {
53
+ return await this.createResponseWithBody(body, {
54
+ status: 500,
55
+ statusText: STATUS_MESSAGE[500],
56
+ headers: {
57
+ "Content-Type": "text/html"
58
+ }
59
+ });
60
+ }
41
61
  /**
42
62
  * Reads a static file response, returning `null` when the file is missing.
43
63
  */
@@ -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.