@ecopages/core 0.2.0-beta.9 → 0.2.0-rc.0
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.
- package/README.md +42 -13
- package/package.json +360 -57
- package/src/adapters/README.md +6 -2
- package/src/adapters/abstract/application-adapter.d.ts +57 -5
- package/src/adapters/abstract/application-adapter.js +261 -203
- package/src/adapters/abstract/router-adapter.js +12 -4
- package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
- package/src/adapters/abstract/segment-path-matcher.js +147 -0
- package/src/adapters/abstract/server-adapter.d.ts +13 -2
- package/src/adapters/abstract/server-adapter.js +22 -14
- package/src/adapters/abstract/ws-pattern-matcher.d.ts +2 -50
- package/src/adapters/abstract/ws-pattern-matcher.js +24 -57
- package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
- package/src/adapters/bun/client-bridge.js +51 -50
- package/src/adapters/bun/create-app.d.ts +4 -6
- package/src/adapters/bun/create-app.js +169 -154
- package/src/adapters/bun/hmr-manager.d.ts +2 -3
- package/src/adapters/bun/hmr-manager.js +62 -57
- package/src/adapters/bun/index.d.ts +1 -1
- package/src/adapters/bun/index.js +2 -8
- package/src/adapters/bun/runtime-host.d.ts +1 -1
- package/src/adapters/bun/runtime-host.js +61 -54
- package/src/adapters/bun/server-adapter.d.ts +34 -53
- package/src/adapters/bun/server-adapter.js +557 -637
- package/src/adapters/bun/static-preview-host.d.ts +1 -1
- package/src/adapters/bun/static-preview-host.js +43 -41
- package/src/adapters/create-app.d.ts +1 -12
- package/src/adapters/create-app.js +11 -72
- package/src/adapters/index.d.ts +2 -2
- package/src/adapters/index.js +2 -8
- package/src/adapters/node/create-app.d.ts +4 -3
- package/src/adapters/node/create-app.js +123 -98
- package/src/adapters/node/http-request-bridge.js +147 -106
- package/src/adapters/node/node-client-bridge.js +62 -64
- package/src/adapters/node/node-hmr-manager.d.ts +2 -3
- package/src/adapters/node/node-hmr-manager.js +58 -48
- package/src/adapters/node/runtime-host.d.ts +1 -1
- package/src/adapters/node/runtime-host.js +96 -89
- package/src/adapters/node/server-adapter-dependencies.js +18 -17
- package/src/adapters/node/server-adapter.d.ts +28 -8
- package/src/adapters/node/server-adapter.js +349 -302
- package/src/adapters/node/static-content-server.js +172 -186
- package/src/adapters/node/static-preview-host.d.ts +1 -1
- package/src/adapters/node/static-preview-host.js +88 -64
- package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
- package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
- package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
- package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
- package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
- package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
- package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
- package/src/adapters/shared/http/api-request-pipeline.js +132 -0
- package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
- package/src/adapters/shared/http/api-response.js +79 -0
- package/src/adapters/shared/http/create-body-response.d.ts +12 -0
- package/src/adapters/shared/http/create-body-response.js +26 -0
- package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
- package/src/adapters/shared/http/define-api-handler.js +49 -0
- package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
- package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
- package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
- package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
- package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
- package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
- package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
- package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
- package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
- package/src/adapters/shared/http/fs-server-response-matcher.js +260 -0
- package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
- package/src/adapters/shared/http/run-middleware-chain.js +17 -0
- package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
- package/src/adapters/shared/runtime/application-adapter.js +75 -0
- package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
- package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
- package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
- package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
- package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
- package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
- package/src/adapters/shared/runtime/port-manager.js +226 -0
- package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
- package/src/adapters/shared/runtime/render-context.js +99 -0
- package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -2
- package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
- package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
- package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
- package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
- package/src/adapters/shared/runtime/server-adapter.js +301 -0
- package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
- package/src/adapters/shared/runtime/server-route-handler.js +77 -0
- package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +26 -31
- package/src/adapters/shared/runtime/server-static-builder.js +172 -0
- package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
- package/src/adapters/shared/{node-http-websocket-upgrades.d.ts → ws/node-http-websocket-upgrades.d.ts} +1 -1
- package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
- package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
- package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
- package/src/build/README.md +165 -45
- package/src/build/app-build-manifest-runtime.d.ts +39 -0
- package/src/build/app-build-manifest-runtime.js +145 -0
- package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +4 -0
- package/src/build/browser/browser-runtime-manifest.js +65 -0
- package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +3 -5
- package/src/build/browser/browser-runtime-plugin-helpers.js +32 -0
- package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +12 -13
- package/src/build/browser/browser-runtime-plugin.js +218 -0
- package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
- package/src/build/browser/jsx-ownership-plugins.js +55 -0
- package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
- package/src/build/browser/lit-static-render-worker-context.js +4 -0
- package/src/build/build-adapter.d.ts +25 -355
- package/src/build/build-adapter.js +258 -265
- package/src/build/{build-input-fingerprint.d.ts → cache/build-input-fingerprint.d.ts} +3 -3
- package/src/build/cache/build-input-fingerprint.js +33 -0
- package/src/build/cache/cache-constants.d.ts +4 -0
- package/src/build/cache/cache-constants.js +4 -0
- package/src/build/cache/cache-keys.d.ts +22 -0
- package/src/build/cache/cache-keys.js +71 -0
- package/src/build/{pages-unified-graph-build.d.ts → cache/pages-unified-graph-build.d.ts} +1 -1
- package/src/build/cache/pages-unified-graph-build.js +199 -0
- package/src/build/cache/production-build-cache.d.ts +21 -0
- package/src/build/cache/production-build-cache.js +56 -0
- package/src/build/{server-entry-build-cache.d.ts → cache/server-entry-build-cache.d.ts} +3 -4
- package/src/build/cache/server-entry-build-cache.js +153 -0
- package/src/build/contracts/build-contracts.d.ts +96 -0
- package/src/build/contracts/build-contracts.js +1 -0
- package/src/build/contracts/build-manifest.d.ts +90 -0
- package/src/build/contracts/build-manifest.js +64 -0
- package/src/build/contracts/build-types.js +1 -0
- package/src/build/contracts/content-virtual-modules.d.ts +12 -0
- package/src/build/contracts/content-virtual-modules.js +29 -0
- package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
- package/src/build/rolldown/rolldown-adapter-helpers.js +463 -0
- package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
- package/src/build/rolldown/rolldown-build-adapter.js +57 -0
- package/src/build/{rolldown-build-invocation-metrics.d.ts → rolldown/rolldown-build-invocation-metrics.d.ts} +1 -1
- package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
- package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +7 -2
- package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
- package/src/build/{rolldown-source-transform-pass.d.ts → rolldown/rolldown-source-transform-pass.d.ts} +1 -1
- package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
- package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
- package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
- package/src/build/runtime/build-profile-options.d.ts +7 -0
- package/src/build/runtime/build-profile-options.js +37 -0
- package/src/build/runtime/build-request-identity.d.ts +17 -0
- package/src/build/runtime/build-request-identity.js +79 -0
- package/src/build/runtime/build-request-policy.d.ts +58 -0
- package/src/build/runtime/build-request-policy.js +84 -0
- package/src/build/runtime/build-runtime.d.ts +28 -0
- package/src/build/runtime/build-runtime.js +75 -0
- package/src/build/runtime/deduping-build-executor.d.ts +21 -0
- package/src/build/runtime/deduping-build-executor.js +40 -0
- package/src/build/{parallel-build-executor.d.ts → runtime/parallel-build-executor.d.ts} +1 -1
- package/src/build/runtime/parallel-build-executor.js +60 -0
- package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
- package/src/build/runtime/serialized-build-executor.js +79 -0
- package/src/cache/index.d.ts +2 -1
- package/src/cache/index.js +7 -6
- package/src/cache/module-parse-cache.d.ts +5 -0
- package/src/cache/module-parse-cache.js +122 -67
- package/src/cache/module-transform-profiler.d.ts +8 -0
- package/src/cache/module-transform-profiler.js +8 -0
- package/src/client/navigation-scripts/classification.d.ts +16 -0
- package/src/client/navigation-scripts/classification.js +49 -0
- package/src/client/navigation-scripts/index.d.ts +3 -0
- package/src/client/navigation-scripts/index.js +3 -0
- package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
- package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
- package/src/client/navigation-scripts/registry.d.ts +11 -0
- package/src/client/navigation-scripts/registry.js +16 -0
- package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
- package/src/client/navigation-scripts/rerun-queue.js +90 -0
- package/src/client/scroll.d.ts +17 -0
- package/src/client/scroll.js +33 -0
- package/src/client/scroll.test.browser.d.ts +1 -0
- package/src/client/scroll.test.browser.js +31 -0
- package/src/client/view-transitions.d.ts +32 -0
- package/src/client/view-transitions.js +120 -0
- package/src/client/view-transitions.test.browser.d.ts +1 -0
- package/src/client/view-transitions.test.browser.js +56 -0
- package/src/config/README.md +1 -1
- package/src/config/config-builder.d.ts +40 -20
- package/src/config/config-builder.js +645 -610
- package/src/config/constants.d.ts +1 -0
- package/src/config/constants.js +44 -23
- package/src/declarations.d.ts +1 -0
- package/src/dev/README.md +24 -0
- package/src/dev/client-bridge-registry.d.ts +5 -0
- package/src/dev/client-bridge-registry.js +10 -0
- package/src/dev/dev-client-ownership.d.ts +7 -0
- package/src/dev/dev-client-ownership.js +8 -0
- package/src/dev/hmr-manager-registry.d.ts +8 -0
- package/src/dev/hmr-manager-registry.js +10 -0
- package/src/dev/host-runtime.d.ts +3 -0
- package/src/dev/host-runtime.js +25 -23
- package/src/dev/runtime-server-started-message.d.ts +2 -0
- package/src/dev/runtime-server-started-message.js +3 -0
- package/src/dev/sc-server.js +106 -103
- package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
- package/src/dev/transform-server/dev-transform-bundler.js +79 -0
- package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
- package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
- package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
- package/src/dev/transform-server/dev-transform-import-rewriter.js +127 -0
- package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
- package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
- package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
- package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
- package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
- package/src/dev/transform-server/dev-transform-server.js +191 -0
- package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
- package/src/dev/transform-server/dev-transform-url.js +58 -0
- package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
- package/src/dev/transform-server/dev-transform-vendor-registry.js +166 -0
- package/src/dev/transform-server/index.d.ts +6 -0
- package/src/dev/transform-server/index.js +4 -0
- package/src/dev/transform-server/types.d.ts +15 -0
- package/src/dev/transform-server/types.js +1 -0
- package/src/dev-toolbar/README.md +52 -0
- package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
- package/src/dev-toolbar/define-dev-tool.js +9 -0
- package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
- package/src/dev-toolbar/dev-toolbar-config.js +19 -0
- package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
- package/src/dev-toolbar/dev-toolbar-host.js +117 -0
- package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
- package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
- package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
- package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
- package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
- package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
- package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
- package/src/dev-toolbar/dev-toolbar-package.js +78 -0
- package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
- package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
- package/src/diagnostics/request-build-dedupe.d.ts +18 -0
- package/src/diagnostics/request-build-dedupe.js +39 -0
- package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
- package/src/diagnostics/request-pipeline-metrics.js +121 -0
- package/src/diagnostics/startup-trace.d.ts +81 -0
- package/src/diagnostics/startup-trace.js +281 -0
- package/src/eco/README.md +17 -0
- package/src/eco/component-identity.d.ts +13 -0
- package/src/eco/component-identity.js +18 -0
- package/src/eco/eco-declared-component.d.ts +15 -0
- package/src/eco/eco-declared-component.js +23 -0
- package/src/eco/eco.browser.js +63 -70
- package/src/eco/eco.js +163 -97
- package/src/eco/eco.types.d.ts +47 -8
- package/src/eco/eco.types.js +5 -0
- package/src/eco/eco.utils.d.ts +1 -1
- package/src/eco/eco.utils.js +1 -10
- package/src/eco/global-injector-map.js +55 -41
- package/src/eco/lazy-injector-map.js +90 -60
- package/src/eco/module-dependencies.js +52 -44
- package/src/eco/page-layout-normalization.d.ts +21 -0
- package/src/eco/page-layout-normalization.js +69 -0
- package/src/env.d.ts +2 -0
- package/src/errors/http-error.d.ts +8 -0
- package/src/errors/http-error.js +66 -49
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +3 -6
- package/src/errors/locals-access-error.js +5 -8
- package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
- package/src/errors/undeclared-component-dependency-error.js +17 -0
- package/src/global/app-logger.js +3 -6
- package/src/hmr/README.md +21 -0
- package/src/hmr/client/hmr-runtime.js +119 -110
- package/src/hmr/client/module-update.d.ts +13 -0
- package/src/hmr/client/module-update.js +39 -0
- package/src/hmr/hmr-asset-paths.d.ts +14 -0
- package/src/hmr/hmr-asset-paths.js +22 -0
- package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
- package/src/hmr/hmr-entrypoint-output.js +34 -0
- package/src/hmr/hmr-file-change-prep.d.ts +10 -0
- package/src/hmr/hmr-file-change-prep.js +14 -0
- package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
- package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
- package/src/hmr/hmr-runtime-paths.d.ts +10 -0
- package/src/hmr/hmr-runtime-paths.js +13 -0
- package/src/hmr/hmr-strategy.d.ts +9 -0
- package/src/hmr/hmr-strategy.js +113 -42
- package/src/hmr/strategies/default-hmr-strategy.js +55 -33
- package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
- package/src/hmr/strategies/js-hmr-strategy.js +107 -167
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
- package/src/index.browser.d.ts +1 -0
- package/src/index.browser.js +2 -4
- package/src/index.d.ts +4 -1
- package/src/index.js +7 -21
- package/src/islands/README.md +25 -0
- package/src/islands/island-host.d.ts +37 -0
- package/src/islands/island-host.js +55 -0
- package/src/plugins/README.md +2 -1
- package/src/plugins/alias-resolver-cache.d.ts +6 -9
- package/src/plugins/alias-resolver-cache.js +114 -97
- package/src/plugins/alias-resolver-plugin.d.ts +3 -3
- package/src/plugins/alias-resolver-plugin.js +35 -62
- package/src/plugins/define-integration.d.ts +26 -0
- package/src/plugins/define-integration.js +20 -0
- package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
- package/src/plugins/eco-component-meta-plugin.js +123 -162
- package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
- package/src/plugins/foreign-jsx-override-plugin.js +49 -37
- package/src/plugins/integration-plugin.d.ts +24 -6
- package/src/plugins/integration-plugin.js +212 -195
- package/src/plugins/jsx-import-source.utils.d.ts +8 -0
- package/src/plugins/jsx-import-source.utils.js +21 -0
- package/src/plugins/package-specifier.d.ts +12 -0
- package/src/plugins/package-specifier.js +33 -0
- package/src/plugins/processor.d.ts +66 -12
- package/src/plugins/processor.js +168 -137
- package/src/plugins/runtime-capability.js +1 -0
- package/src/plugins/source-transform.d.ts +1 -1
- package/src/plugins/source-transform.js +109 -79
- package/src/plugins/tsconfig-import-resolver.d.ts +37 -0
- package/src/plugins/tsconfig-import-resolver.js +262 -0
- package/src/route-renderer/GRAPH.md +24 -30
- package/src/route-renderer/README.md +52 -32
- package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
- package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
- package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
- package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
- package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
- package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
- package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +20 -7
- package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +195 -0
- package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
- package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
- package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
- package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +37 -153
- package/src/route-renderer/orchestration/integration-renderer.js +803 -1008
- package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
- package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
- package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
- package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
- package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
- package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
- package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
- package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +248 -0
- package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
- package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
- package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
- package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
- package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
- package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
- package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
- package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +44 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
- package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
- package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
- package/src/{integrations/ghtml/ghtml-renderer.d.ts → route-renderer/orchestration/string-markup-renderer.d.ts} +8 -10
- package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
- package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
- package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
- package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
- package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
- package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
- package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
- package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
- package/src/route-renderer/page-loading/page-module-loader.js +136 -124
- package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
- package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
- package/src/route-renderer/route-renderer.js +74 -76
- package/src/router/README.md +31 -0
- package/src/router/client/link-intent.d.ts +11 -21
- package/src/router/client/link-intent.js +56 -30
- package/src/router/client/link-intent.test.browser.js +50 -39
- package/src/router/client/link-navigation-policy.d.ts +45 -0
- package/src/router/client/link-navigation-policy.js +122 -0
- package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
- package/src/router/client/link-navigation-policy.test.browser.js +82 -0
- package/src/router/client/navigation-coordinator.d.ts +1 -1
- package/src/router/client/navigation-coordinator.js +235 -211
- package/src/router/client/navigation-lifecycle.d.ts +55 -0
- package/src/router/client/navigation-lifecycle.js +50 -0
- package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
- package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
- package/src/router/server/route-registry.js +237 -242
- package/src/services/README.md +5 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +12 -1
- package/src/services/assets/asset-processing-service/asset-processing.service.js +335 -268
- package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
- package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
- package/src/services/assets/asset-processing-service/assets.types.js +1 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
- package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -58
- package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
- package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
- package/src/services/assets/asset-processing-service/index.d.ts +2 -0
- package/src/services/assets/asset-processing-service/index.js +8 -6
- package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
- package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
- package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
- package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
- package/src/services/assets/asset-processing-service/page-package.js +70 -72
- package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
- package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
- package/src/services/assets/asset-processing-service/processors/index.js +5 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
- package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
- package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
- package/src/services/assets/browser-bundle.service.d.ts +27 -31
- package/src/services/assets/browser-bundle.service.js +54 -49
- package/src/services/assets/browser-runtime-asset-generation.d.ts +17 -0
- package/src/services/assets/browser-runtime-asset-generation.js +28 -0
- package/src/services/cache/cache.types.d.ts +4 -2
- package/src/services/cache/cache.types.js +5 -0
- package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
- package/src/services/cache/html-page-cache-dependency-index.js +88 -0
- package/src/services/cache/index.d.ts +2 -0
- package/src/services/cache/index.js +8 -7
- package/src/services/cache/memory-cache-store.js +101 -89
- package/src/services/cache/page-cache-service.d.ts +31 -1
- package/src/services/cache/page-cache-service.js +237 -150
- package/src/services/cache/page-request-cache-coordinator.service.d.ts +2 -1
- package/src/services/cache/page-request-cache-coordinator.service.js +112 -102
- package/src/services/html/html-rewriter-provider.service.js +61 -61
- package/src/services/html/html-transformer.service.js +249 -266
- package/src/services/invalidation/development-invalidation.service.d.ts +15 -1
- package/src/services/invalidation/development-invalidation.service.js +241 -204
- package/src/services/module-loading/README.md +9 -6
- package/src/services/module-loading/app-module-loader.service.js +1 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +104 -106
- package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
- package/src/services/module-loading/collection-server-module-build.service.js +83 -0
- package/src/services/module-loading/host-module-loader-registry.js +6 -11
- package/src/services/module-loading/module-loading-types.js +1 -0
- package/src/services/module-loading/page-module-import.service.d.ts +7 -12
- package/src/services/module-loading/page-module-import.service.js +232 -206
- package/src/services/module-loading/route-module-build-cache-registry.d.ts +2 -0
- package/src/services/module-loading/route-module-build-cache-registry.js +59 -33
- package/src/services/module-loading/route-module-build-cache.js +3 -38
- package/src/services/module-loading/route-module-build-cache.store.d.ts +10 -0
- package/src/services/module-loading/route-module-build-cache.store.js +213 -196
- package/src/services/module-loading/route-module-build-manifest.d.ts +10 -14
- package/src/services/module-loading/route-module-build-manifest.js +54 -118
- package/src/services/module-loading/route-module-dependency-hasher.d.ts +2 -2
- package/src/services/module-loading/route-module-dependency-hasher.js +136 -109
- package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
- package/src/services/module-loading/server-module-transpiler.service.js +65 -62
- package/src/services/module-loading/source-module-support.js +15 -7
- package/src/services/runtime-state/dev-graph.service.js +165 -157
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
- package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
- package/src/services/validation/schema-validation-service.d.ts +1 -4
- package/src/services/validation/schema-validation-service.js +156 -95
- package/src/services/validation/standard-schema.types.d.ts +9 -62
- package/src/services/validation/standard-schema.types.js +1 -0
- package/src/services/validation/validate-standard-schema.d.ts +7 -0
- package/src/services/validation/validate-standard-schema.js +14 -0
- package/src/static-site-generator/README.md +10 -2
- package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
- package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
- package/src/static-site-generator/sitemap-routes.d.ts +14 -0
- package/src/static-site-generator/sitemap-routes.js +36 -0
- package/src/static-site-generator/sitemap.d.ts +15 -0
- package/src/static-site-generator/sitemap.js +42 -0
- package/src/static-site-generator/static-build-invalidation.d.ts +2 -2
- package/src/static-site-generator/static-build-invalidation.js +33 -74
- package/src/static-site-generator/static-export-context.d.ts +9 -1
- package/src/static-site-generator/static-export-context.js +1 -0
- package/src/static-site-generator/static-site-generator.d.ts +27 -6
- package/src/static-site-generator/static-site-generator.js +528 -389
- package/src/types/internal-types.d.ts +55 -17
- package/src/types/internal-types.js +1 -0
- package/src/types/public-types.d.ts +236 -95
- package/src/types/public-types.js +1 -0
- package/src/utils/deep-merge.js +39 -26
- package/src/utils/ecopages-route-info.d.ts +26 -0
- package/src/utils/ecopages-route-info.js +30 -0
- package/src/utils/hash.js +3 -6
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +22 -5
- package/src/utils/invariant.js +11 -10
- package/src/utils/locals-utils.js +32 -22
- package/src/utils/parse-cli-args.d.ts +1 -0
- package/src/utils/parse-cli-args.js +73 -62
- package/src/utils/path-pattern.d.ts +23 -0
- package/src/utils/path-pattern.js +42 -0
- package/src/utils/path-utils.module.js +8 -11
- package/src/utils/resolve-entry-file.js +70 -38
- package/src/utils/resolve-work-dir.js +23 -27
- package/src/utils/runtime.js +24 -33
- package/src/utils/server-utils.module.d.ts +3 -2
- package/src/utils/server-utils.module.js +60 -53
- package/src/utils/static-file-extensions.d.ts +12 -0
- package/src/utils/static-file-extensions.js +54 -0
- package/src/watchers/project-watcher-ignore.d.ts +11 -0
- package/src/watchers/project-watcher-ignore.js +17 -0
- package/src/watchers/project-watcher.d.ts +21 -6
- package/src/watchers/project-watcher.js +402 -277
- package/src/watchers/project-watcher.test-helpers.js +45 -50
- package/src/adapters/shared/api-response.js +0 -96
- package/src/adapters/shared/application-adapter.js +0 -90
- package/src/adapters/shared/bun-user-websocket-lifecycle.js +0 -102
- package/src/adapters/shared/copy-runtime-public-dir.js +0 -24
- package/src/adapters/shared/define-api-handler.d.ts +0 -25
- package/src/adapters/shared/define-api-handler.js +0 -15
- package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
- package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
- package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
- package/src/adapters/shared/fs-server-response-factory.js +0 -81
- package/src/adapters/shared/fs-server-response-matcher.js +0 -186
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
- package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
- package/src/adapters/shared/hmr-html-response.js +0 -33
- package/src/adapters/shared/node-http-websocket-upgrades.js +0 -125
- package/src/adapters/shared/render-context.js +0 -93
- package/src/adapters/shared/runtime-app-bootstrap.js +0 -41
- package/src/adapters/shared/runtime-host.js +0 -0
- package/src/adapters/shared/server-adapter.js +0 -436
- package/src/adapters/shared/server-route-handler.js +0 -111
- package/src/adapters/shared/server-static-builder.js +0 -202
- package/src/adapters/shared/shared-hmr-manager.d.ts +0 -61
- package/src/adapters/shared/shared-hmr-manager.js +0 -273
- package/src/adapters/shared/static-preview-host.js +0 -0
- package/src/adapters/shared/websocket-lifecycle.d.ts +0 -3
- package/src/adapters/shared/websocket-lifecycle.js +0 -19
- package/src/build/browser-runtime-manifest.js +0 -61
- package/src/build/browser-runtime-plugin-helpers.js +0 -14
- package/src/build/browser-runtime-plugin.js +0 -173
- package/src/build/build-input-fingerprint.js +0 -31
- package/src/build/build-manifest.d.ts +0 -33
- package/src/build/build-manifest.js +0 -49
- package/src/build/build-types.js +0 -0
- package/src/build/jsx-ownership-plugins.d.ts +0 -10
- package/src/build/jsx-ownership-plugins.js +0 -17
- package/src/build/pages-unified-graph-build.js +0 -208
- package/src/build/parallel-build-executor.js +0 -52
- package/src/build/rolldown-adapter-helpers.js +0 -310
- package/src/build/rolldown-build-adapter.js +0 -67
- package/src/build/rolldown-build-invocation-metrics.js +0 -43
- package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
- package/src/build/rolldown-dev-build-adapter.js +0 -182
- package/src/build/rolldown-plugin-bridge.js +0 -211
- package/src/build/rolldown-source-transform-pass.js +0 -58
- package/src/build/runtime-build-executor.d.ts +0 -15
- package/src/build/runtime-build-executor.js +0 -43
- package/src/build/runtime-build-output-normalizer.js +0 -203
- package/src/build/serialized-build-executor.js +0 -63
- package/src/build/server-entry-build-cache.js +0 -169
- package/src/build/server-side-css-shim-plugin.js +0 -35
- package/src/hmr/hmr.postcss.test.e2e.js +0 -31
- package/src/hmr/hmr.test.e2e.js +0 -54
- package/src/integrations/ghtml/ghtml-renderer.js +0 -57
- package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
- package/src/integrations/ghtml/ghtml.constants.js +0 -4
- package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
- package/src/integrations/ghtml/ghtml.plugin.js +0 -20
- package/src/route-renderer/orchestration/component-render-context.js +0 -147
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
- package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -231
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
- package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
- package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
- package/src/route-renderer/orchestration/render-output.utils.js +0 -175
- package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -578
- package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
- package/src/route-renderer/orchestration/template-serialization.js +0 -45
- package/src/utils/html.d.ts +0 -1
- package/src/utils/html.js +0 -4
- /package/src/adapters/{shared → bun}/bun-user-websocket-lifecycle.d.ts +0 -0
- /package/src/adapters/shared/{copy-runtime-public-dir.d.ts → runtime/copy-runtime-public-dir.d.ts} +0 -0
- /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
- /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
- /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
- /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
- /package/src/build/{runtime-build-output-normalizer.d.ts → rolldown/runtime-build-output-normalizer.d.ts} +0 -0
- /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
|
@@ -0,0 +1,132 @@
|
|
|
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
|
+
export 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
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof Response)
|
|
53
|
+
return error;
|
|
54
|
+
if (errorHandler) {
|
|
55
|
+
try {
|
|
56
|
+
if (!context) {
|
|
57
|
+
context = this.createContext(request, params, serverInstance);
|
|
58
|
+
}
|
|
59
|
+
return await errorHandler(error, context);
|
|
60
|
+
}
|
|
61
|
+
catch (handlerError) {
|
|
62
|
+
appLogger.error(`[ecopages] Error in custom error handler: ${handlerError}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (error instanceof HttpError)
|
|
66
|
+
return error.toResponse();
|
|
67
|
+
appLogger.error(`[ecopages] Error handling API request: ${error}`);
|
|
68
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
createContext(request, params, serverInstance) {
|
|
72
|
+
const locals = {};
|
|
73
|
+
const normalizedParams = this.normalizeParams(params);
|
|
74
|
+
return {
|
|
75
|
+
request,
|
|
76
|
+
params: normalizedParams,
|
|
77
|
+
response: new ApiResponseBuilder(),
|
|
78
|
+
server: serverInstance,
|
|
79
|
+
locals,
|
|
80
|
+
require: createRequire(() => locals),
|
|
81
|
+
services: {
|
|
82
|
+
cache: this.getCacheService(),
|
|
83
|
+
},
|
|
84
|
+
...this.getRenderContext(),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
normalizeParams(params) {
|
|
88
|
+
return Object.fromEntries(Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join('/') : value]));
|
|
89
|
+
}
|
|
90
|
+
async applyRequestSchema(context, schema) {
|
|
91
|
+
if (!schema) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
const url = new URL(context.request.url);
|
|
95
|
+
const queryParams = Object.fromEntries(url.searchParams);
|
|
96
|
+
const headers = Object.fromEntries(context.request.headers);
|
|
97
|
+
let body;
|
|
98
|
+
if (schema.body) {
|
|
99
|
+
try {
|
|
100
|
+
const contentType = context.request.headers.get('Content-Type') || '';
|
|
101
|
+
if (contentType.includes('application/json'))
|
|
102
|
+
body = await context.request.clone().json();
|
|
103
|
+
else if (contentType.includes('text/plain'))
|
|
104
|
+
body = await context.request.clone().text();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return context.response.status(400).json({ error: 'Invalid request body' });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const validationResult = await this.schemaValidator.validateRequest({ body, query: queryParams, headers, params: context.params }, schema);
|
|
111
|
+
if (!validationResult.success) {
|
|
112
|
+
return context.response.status(400).json({
|
|
113
|
+
error: 'Validation failed',
|
|
114
|
+
issues: validationResult.errors,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const validated = validationResult.data;
|
|
118
|
+
if (validated.body !== undefined)
|
|
119
|
+
context.body = validated.body;
|
|
120
|
+
if (validated.query !== undefined)
|
|
121
|
+
context.query = validated.query;
|
|
122
|
+
if (validated.headers !== undefined)
|
|
123
|
+
context.headers = validated.headers;
|
|
124
|
+
if (validated.params !== undefined)
|
|
125
|
+
context.params = validated.params;
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
async runMiddlewareChain(context, routeConfig) {
|
|
129
|
+
const middleware = routeConfig.middleware ?? [];
|
|
130
|
+
return runMiddlewareChain(middleware, context, async () => await routeConfig.handler(context));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -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:
|
|
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.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { createBodyResponse } from './create-body-response.js';
|
|
2
|
+
/**
|
|
3
|
+
* A builder class for creating Response objects fluently.
|
|
4
|
+
*/
|
|
5
|
+
export class ApiResponseBuilder {
|
|
6
|
+
_status = 200;
|
|
7
|
+
_headers = new Headers();
|
|
8
|
+
/**
|
|
9
|
+
* Sets the HTTP status code for the response.
|
|
10
|
+
* @param code - The HTTP status code.
|
|
11
|
+
* @returns The builder instance for chaining.
|
|
12
|
+
*/
|
|
13
|
+
status(code) {
|
|
14
|
+
this._status = code;
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Adds or merges headers for the response.
|
|
19
|
+
* @param headersInit - Headers to add or merge.
|
|
20
|
+
* @returns The builder instance for chaining.
|
|
21
|
+
*/
|
|
22
|
+
headers(headersInit) {
|
|
23
|
+
const inputHeaders = new Headers(headersInit);
|
|
24
|
+
inputHeaders.forEach((value, key) => {
|
|
25
|
+
this._headers.set(key, value);
|
|
26
|
+
});
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Creates a JSON response using the configured status and headers.
|
|
31
|
+
* @param data - The data to serialize.
|
|
32
|
+
* @returns A Response object.
|
|
33
|
+
*/
|
|
34
|
+
json(data) {
|
|
35
|
+
return createBodyResponse('json', data, { status: this._status, headers: this._headers });
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Creates a plain text response using the configured status and headers.
|
|
39
|
+
* @param data - The text content.
|
|
40
|
+
* @returns A Response object.
|
|
41
|
+
*/
|
|
42
|
+
text(data) {
|
|
43
|
+
return createBodyResponse('text', data, { status: this._status, headers: this._headers });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Creates an HTML response using the configured status and headers.
|
|
47
|
+
* @param data - The HTML content.
|
|
48
|
+
* @returns A Response object.
|
|
49
|
+
*/
|
|
50
|
+
html(data) {
|
|
51
|
+
return createBodyResponse('html', data, { status: this._status, headers: this._headers });
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Creates a redirect response.
|
|
55
|
+
* @param url - The URL to redirect to.
|
|
56
|
+
* @param explicitStatus - Optional explicit status code (overrides status() if provided). Defaults to 302 if not set via status().
|
|
57
|
+
* @returns A Response object.
|
|
58
|
+
*/
|
|
59
|
+
redirect(url, explicitStatus) {
|
|
60
|
+
const redirectStatus = explicitStatus ?? (this._status === 200 ? 302 : this._status); // Default to 302 if status wasn't explicitly set
|
|
61
|
+
this._headers.set('Location', url);
|
|
62
|
+
return new Response(null, { status: redirectStatus, headers: this._headers });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates an error response using the configured status and headers.
|
|
66
|
+
* If data is an object, it's treated as JSON, otherwise as text.
|
|
67
|
+
* @param data - The error data (string or object).
|
|
68
|
+
* @param explicitStatus - Optional explicit status code (overrides status() if provided). Defaults to 500 if not set via status().
|
|
69
|
+
* @returns A Response object.
|
|
70
|
+
*/
|
|
71
|
+
error(data, explicitStatus) {
|
|
72
|
+
const errorStatus = explicitStatus ?? (this._status === 200 ? 500 : this._status); // Default to 500 if status wasn't explicitly set
|
|
73
|
+
this.status(errorStatus);
|
|
74
|
+
if (typeof data === 'object' && data !== null) {
|
|
75
|
+
return createBodyResponse('json', { error: data }, { status: this._status, headers: this._headers });
|
|
76
|
+
}
|
|
77
|
+
return createBodyResponse('text', String(data), { status: this._status, headers: this._headers });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -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,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a typed HTTP response body for JSON, HTML, or plain text.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Sole internal emission path for adapter response helpers. Not exported from `@ecopages/core`.
|
|
6
|
+
*/
|
|
7
|
+
export function createBodyResponse(kind, data, init) {
|
|
8
|
+
const headers = new Headers(init?.headers);
|
|
9
|
+
const status = init?.status ?? 200;
|
|
10
|
+
if (kind === 'json') {
|
|
11
|
+
if (!headers.has('Content-Type')) {
|
|
12
|
+
headers.set('Content-Type', 'application/json; charset=utf-8');
|
|
13
|
+
}
|
|
14
|
+
return new Response(JSON.stringify(data), { status, headers });
|
|
15
|
+
}
|
|
16
|
+
if (kind === 'html') {
|
|
17
|
+
if (!headers.has('Content-Type')) {
|
|
18
|
+
headers.set('Content-Type', 'text/html; charset=utf-8');
|
|
19
|
+
}
|
|
20
|
+
return new Response(String(data), { status, headers });
|
|
21
|
+
}
|
|
22
|
+
if (!headers.has('Content-Type')) {
|
|
23
|
+
headers.set('Content-Type', 'text/plain; charset=utf-8');
|
|
24
|
+
}
|
|
25
|
+
return new Response(String(data), { status, headers });
|
|
26
|
+
}
|
|
@@ -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,49 @@
|
|
|
1
|
+
import { createBodyResponse } from './create-body-response.js';
|
|
2
|
+
export function defineApiHandler(handler) {
|
|
3
|
+
return handler;
|
|
4
|
+
}
|
|
5
|
+
const defineApiMethod = (method) => (handler) => defineApiHandler({ ...handler, method });
|
|
6
|
+
export const defineGet = defineApiMethod('GET');
|
|
7
|
+
export const definePost = defineApiMethod('POST');
|
|
8
|
+
export const definePut = defineApiMethod('PUT');
|
|
9
|
+
export const defineDelete = defineApiMethod('DELETE');
|
|
10
|
+
export const definePatch = defineApiMethod('PATCH');
|
|
11
|
+
export const defineOptions = defineApiMethod('OPTIONS');
|
|
12
|
+
export const defineHead = defineApiMethod('HEAD');
|
|
13
|
+
export function json(data, options) {
|
|
14
|
+
return createBodyResponse('json', data, {
|
|
15
|
+
status: options?.status,
|
|
16
|
+
headers: options?.headers,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function html(content, options) {
|
|
20
|
+
return createBodyResponse('html', content, {
|
|
21
|
+
status: options?.status,
|
|
22
|
+
headers: options?.headers,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export 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
|
+
export function defineGroupHandler(config) {
|
|
44
|
+
return {
|
|
45
|
+
prefix: config.prefix,
|
|
46
|
+
middleware: config.middleware,
|
|
47
|
+
routes: config.routes(createGroupApi()),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '
|
|
2
|
-
import type { EcoFunctionComponent, EcoPageComponent } from '
|
|
3
|
-
import type { ExplicitViewRenderer, ExplicitViewRendererResolver } from '
|
|
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>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function getViewIntegrationName(view) {
|
|
2
|
+
return view.config?.integration ?? view.config?.identity?.integration;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the renderer and static props needed to render one explicit static
|
|
6
|
+
* view at runtime or during static generation.
|
|
7
|
+
*/
|
|
8
|
+
export async function prepareExplicitStaticRender(input) {
|
|
9
|
+
const integrationName = getViewIntegrationName(input.view);
|
|
10
|
+
if (!integrationName) {
|
|
11
|
+
throw new Error(input.errors.missingIntegration(input.routePath));
|
|
12
|
+
}
|
|
13
|
+
const renderer = input.routeRendererFactory.getExplicitViewRenderer(integrationName);
|
|
14
|
+
if (!renderer) {
|
|
15
|
+
throw new Error(input.errors.noRendererForIntegration(integrationName));
|
|
16
|
+
}
|
|
17
|
+
const props = input.view.staticProps
|
|
18
|
+
? (await input.view.staticProps({
|
|
19
|
+
pathname: { params: input.params },
|
|
20
|
+
appConfig: input.appConfig,
|
|
21
|
+
runtimeOrigin: input.runtimeOrigin,
|
|
22
|
+
})).props
|
|
23
|
+
: {};
|
|
24
|
+
return {
|
|
25
|
+
renderer,
|
|
26
|
+
props,
|
|
27
|
+
view: input.view,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '
|
|
2
|
-
import type { StaticRoute } from '
|
|
3
|
-
import type { ExplicitViewRendererResolver } from '
|
|
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.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { appLogger } from '../../../global/app-logger.js';
|
|
2
|
+
import { prepareExplicitStaticRender } from './explicit-static-render-preparation.js';
|
|
3
|
+
import { matchExplicitStaticPathPattern } from '../../abstract/segment-path-matcher.js';
|
|
4
|
+
export const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
|
|
5
|
+
missingIntegration: (routePath) => `View at ${routePath} is missing component identity integration. Ensure it's defined with eco.page() and exported as default.`,
|
|
6
|
+
noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`,
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Matches and renders explicit static routes declared through `app.static()`.
|
|
10
|
+
*/
|
|
11
|
+
export class ExplicitStaticRouteMatcher {
|
|
12
|
+
appConfig;
|
|
13
|
+
routeRendererFactory;
|
|
14
|
+
staticRoutes;
|
|
15
|
+
constructor({ appConfig, routeRendererFactory, staticRoutes }) {
|
|
16
|
+
this.appConfig = appConfig;
|
|
17
|
+
this.routeRendererFactory = routeRendererFactory;
|
|
18
|
+
this.staticRoutes = staticRoutes;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Match a request URL against explicit static routes.
|
|
22
|
+
* Returns the matched route and extracted params, or null if no match.
|
|
23
|
+
*/
|
|
24
|
+
match(url) {
|
|
25
|
+
const pathname = new URL(url).pathname;
|
|
26
|
+
for (const route of this.staticRoutes) {
|
|
27
|
+
const params = matchExplicitStaticPathPattern(route.path, pathname);
|
|
28
|
+
if (params !== null) {
|
|
29
|
+
return { route, params };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Handle a matched explicit static route.
|
|
36
|
+
* Resolves the loader and renders the view using the appropriate integration renderer.
|
|
37
|
+
*/
|
|
38
|
+
async handleMatch(match) {
|
|
39
|
+
const { route, params } = match;
|
|
40
|
+
try {
|
|
41
|
+
const mod = await route.loader();
|
|
42
|
+
const view = mod.default;
|
|
43
|
+
const { renderer, props, view: renderableView, } = await prepareExplicitStaticRender({
|
|
44
|
+
routePath: route.path,
|
|
45
|
+
view,
|
|
46
|
+
params,
|
|
47
|
+
appConfig: this.appConfig,
|
|
48
|
+
runtimeOrigin: this.appConfig.baseUrl,
|
|
49
|
+
routeRendererFactory: this.routeRendererFactory,
|
|
50
|
+
errors: EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS,
|
|
51
|
+
});
|
|
52
|
+
return renderer.renderToResponse(renderableView, props, {});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
appLogger.error(`Error rendering explicit static route ${route.path}:`, error instanceof Error ? error : String(error));
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { FileRouteMiddleware, FileRouteMiddlewareContext, RequestLocals } from '
|
|
2
|
-
import type { PageCacheService } from '
|
|
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
|
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createRequire } from '../../../utils/locals-utils.js';
|
|
2
|
+
import { ApiResponseBuilder } from './api-response.js';
|
|
3
|
+
import { runMiddlewareChain } from './run-middleware-chain.js';
|
|
4
|
+
import { LocalsAccessError } from '../../../errors/locals-access-error.js';
|
|
5
|
+
export const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS = {
|
|
6
|
+
middlewareRequiresDynamic: (filePath) => `[ecopages] Page middleware requires cache: 'dynamic'. Page: ${filePath}`,
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Executes middleware for file-based page routes.
|
|
10
|
+
*
|
|
11
|
+
* This pipeline owns the middleware-specific rules that are distinct from route
|
|
12
|
+
* matching and rendering, including request-local storage, the middleware
|
|
13
|
+
* execution context, and the invariant that page middleware only runs for
|
|
14
|
+
* request-time dynamic rendering.
|
|
15
|
+
*/
|
|
16
|
+
export class FileRouteMiddlewarePipeline {
|
|
17
|
+
cacheService;
|
|
18
|
+
constructor(cacheService) {
|
|
19
|
+
this.cacheService = cacheService;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Enforces the current middleware contract for file-routed pages.
|
|
23
|
+
*
|
|
24
|
+
* Middleware depends on request-scoped locals and therefore must not run when
|
|
25
|
+
* the page is treated as statically cacheable.
|
|
26
|
+
*
|
|
27
|
+
* @param input Middleware list, effective cache strategy, and page path.
|
|
28
|
+
* @throws LocalsAccessError When middleware is configured for a non-dynamic page.
|
|
29
|
+
*/
|
|
30
|
+
assertValidConfiguration(input) {
|
|
31
|
+
if (input.middleware.length > 0 && input.pageCacheStrategy !== 'dynamic') {
|
|
32
|
+
throw new LocalsAccessError(FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS.middlewareRequiresDynamic(input.filePath));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Creates the request-scoped middleware context used by page middleware.
|
|
37
|
+
*
|
|
38
|
+
* The context intentionally omits `render()` and `renderPartial()` because
|
|
39
|
+
* rendering is owned by the page route pipeline, not by middleware stages.
|
|
40
|
+
*
|
|
41
|
+
* @param input Request details and the mutable locals store.
|
|
42
|
+
* @returns Middleware execution context.
|
|
43
|
+
*/
|
|
44
|
+
createContext(input) {
|
|
45
|
+
const context = {
|
|
46
|
+
request: input.request,
|
|
47
|
+
params: input.params,
|
|
48
|
+
response: new ApiResponseBuilder(),
|
|
49
|
+
server: null,
|
|
50
|
+
services: {
|
|
51
|
+
cache: this.cacheService,
|
|
52
|
+
},
|
|
53
|
+
locals: input.locals,
|
|
54
|
+
require: createRequire(() => context.locals),
|
|
55
|
+
json: (data, options) => {
|
|
56
|
+
if (options?.status)
|
|
57
|
+
context.response.status(options.status);
|
|
58
|
+
if (options?.headers)
|
|
59
|
+
context.response.headers(options.headers);
|
|
60
|
+
return context.response.json(data);
|
|
61
|
+
},
|
|
62
|
+
html: (content, options) => {
|
|
63
|
+
if (options?.status)
|
|
64
|
+
context.response.status(options.status);
|
|
65
|
+
if (options?.headers)
|
|
66
|
+
context.response.headers(options.headers);
|
|
67
|
+
return context.response.html(content);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
return context;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Runs the middleware chain and eventually delegates to the render callback.
|
|
74
|
+
*
|
|
75
|
+
* Middleware may short-circuit by returning a response directly. If the chain
|
|
76
|
+
* completes, the supplied `renderResponse` callback is executed exactly once.
|
|
77
|
+
*
|
|
78
|
+
* @param input Middleware context, chain, and terminal render callback.
|
|
79
|
+
* @returns Response from middleware or final render stage.
|
|
80
|
+
*/
|
|
81
|
+
async run(input) {
|
|
82
|
+
return runMiddlewareChain(input.middleware, input.context, input.renderResponse);
|
|
83
|
+
}
|
|
84
|
+
}
|
package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { FileSystemServerOptions } from '
|
|
2
|
-
import type { RouteRendererBody } from '
|
|
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
|
*/
|