@ecopages/core 0.2.0-beta.4 → 0.2.0-beta.40
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 +40 -9
- package/package.json +371 -33
- package/src/adapters/README.md +6 -2
- package/src/adapters/abstract/application-adapter.d.ts +115 -6
- package/src/adapters/abstract/application-adapter.js +261 -120
- 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 +16 -2
- package/src/adapters/abstract/server-adapter.js +22 -14
- package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
- package/src/adapters/abstract/ws-pattern-matcher.js +28 -0
- package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
- package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
- package/src/adapters/bun/client-bridge.d.ts +1 -0
- package/src/adapters/bun/client-bridge.js +51 -47
- package/src/adapters/bun/create-app.d.ts +9 -6
- package/src/adapters/bun/create-app.js +171 -130
- package/src/adapters/bun/hmr-manager.d.ts +1 -1
- 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 +91 -41
- package/src/adapters/bun/server-adapter.js +566 -426
- 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 +13 -11
- package/src/adapters/create-app.js +11 -63
- package/src/adapters/index.d.ts +2 -2
- package/src/adapters/index.js +2 -8
- package/src/adapters/node/create-app.d.ts +8 -3
- package/src/adapters/node/create-app.js +126 -84
- package/src/adapters/node/http-request-bridge.js +147 -106
- package/src/adapters/node/node-client-bridge.d.ts +1 -0
- package/src/adapters/node/node-client-bridge.js +62 -61
- package/src/adapters/node/node-hmr-manager.d.ts +1 -1
- 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 +63 -23
- package/src/adapters/node/server-adapter.js +346 -297
- package/src/adapters/node/static-content-server.d.ts +1 -0
- package/src/adapters/node/static-content-server.js +172 -183
- 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 +258 -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.d.ts +6 -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 -3
- 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} +27 -35
- 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/ws/node-http-websocket-upgrades.d.ts +21 -0
- 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 +191 -31
- 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/browser-runtime-manifest.js +58 -0
- package/src/build/browser/browser-runtime-plugin-helpers.js +34 -0
- package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
- package/src/build/browser/browser-runtime-plugin.js +216 -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 +29 -334
- package/src/build/build-adapter.js +273 -237
- package/src/build/cache/build-input-fingerprint.d.ts +28 -0
- 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/cache/pages-unified-graph-build.d.ts +31 -0
- 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/cache/server-entry-build-cache.d.ts +43 -0
- 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 +458 -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/rolldown-build-invocation-metrics.d.ts +12 -0
- 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} +16 -2
- package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
- package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
- package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
- package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -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/runtime/parallel-build-executor.d.ts +21 -0
- 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/config-builder.d.ts +40 -10
- package/src/config/config-builder.js +647 -600
- 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 +126 -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 +158 -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/integrations/ghtml/ghtml-renderer.d.ts +2 -6
- package/src/integrations/ghtml/ghtml-renderer.js +12 -56
- package/src/integrations/ghtml/ghtml.constants.js +1 -4
- package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
- package/src/integrations/ghtml/ghtml.plugin.js +10 -20
- 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 +120 -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 +43 -14
- package/src/plugins/integration-plugin.js +212 -190
- package/src/plugins/jsx-import-source.utils.d.ts +8 -0
- package/src/plugins/jsx-import-source.utils.js +21 -0
- package/src/plugins/processor.d.ts +71 -12
- package/src/plugins/processor.js +168 -130
- package/src/plugins/runtime-capability.js +1 -0
- package/src/plugins/source-transform.d.ts +32 -1
- package/src/plugins/source-transform.js +112 -60
- package/src/plugins/tsconfig-import-resolver.d.ts +35 -0
- package/src/plugins/tsconfig-import-resolver.js +235 -0
- package/src/route-renderer/GRAPH.md +26 -32
- package/src/route-renderer/README.md +54 -33
- 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} +17 -7
- package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +191 -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 +41 -151
- package/src/route-renderer/orchestration/integration-renderer.js +798 -988
- 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 +232 -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 +49 -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/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
- 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 -201
- 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 +7 -1
- package/src/services/assets/asset-processing-service/asset-processing.service.js +308 -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 +2 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -45
- 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.d.ts +4 -2
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -38
- 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 -121
- 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 +28 -30
- package/src/services/assets/browser-bundle.service.js +54 -40
- 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.js +106 -102
- package/src/services/html/html-rewriter-provider.service.js +61 -61
- package/src/services/html/html-transformer.service.d.ts +1 -1
- package/src/services/html/html-transformer.service.js +249 -266
- package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
- package/src/services/invalidation/development-invalidation.service.js +239 -175
- package/src/services/module-loading/README.md +52 -0
- 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 +103 -118
- 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 +11 -13
- package/src/services/module-loading/page-module-import.service.js +222 -184
- package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
- package/src/services/module-loading/route-module-build-cache-registry.js +51 -0
- package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
- package/src/services/module-loading/route-module-build-cache.js +3 -0
- package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
- package/src/services/module-loading/route-module-build-cache.store.js +202 -0
- package/src/services/module-loading/route-module-build-manifest.d.ts +57 -0
- package/src/services/module-loading/route-module-build-manifest.js +60 -0
- package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
- package/src/services/module-loading/route-module-dependency-hasher.js +148 -0
- 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 +41 -0
- 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 +10 -0
- package/src/static-site-generator/static-build-invalidation.js +37 -0
- package/src/static-site-generator/static-export-context.d.ts +30 -0
- package/src/static-site-generator/static-export-context.js +1 -0
- package/src/static-site-generator/static-site-generator.d.ts +43 -25
- package/src/static-site-generator/static-site-generator.js +536 -294
- package/src/types/internal-types.d.ts +59 -13
- package/src/types/internal-types.js +1 -0
- package/src/types/public-types.d.ts +310 -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/html.js +1 -4
- package/src/utils/invariant.js +11 -10
- package/src/utils/locals-utils.js +32 -22
- package/src/utils/parse-cli-args.d.ts +2 -0
- package/src/utils/parse-cli-args.js +73 -59
- 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 +29 -6
- package/src/watchers/project-watcher.js +402 -257
- 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/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/render-context.js +0 -93
- package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
- 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 -162
- package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
- package/src/adapters/shared/shared-hmr-manager.js +0 -241
- package/src/adapters/shared/static-preview-host.js +0 -0
- 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-manifest.d.ts +0 -33
- package/src/build/build-manifest.js +0 -49
- package/src/build/build-types.js +0 -0
- package/src/build/rolldown-adapter-helpers.js +0 -265
- package/src/build/rolldown-build-adapter.js +0 -65
- package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
- package/src/build/rolldown-dev-build-adapter.js +0 -166
- package/src/build/rolldown-plugin-bridge.js +0 -199
- package/src/build/runtime-build-executor.d.ts +0 -21
- package/src/build/runtime-build-executor.js +0 -19
- package/src/build/runtime-build-output-normalizer.d.ts +0 -3
- package/src/build/runtime-build-output-normalizer.js +0 -111
- package/src/build/serialized-build-executor.js +0 -63
- 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 -43
- 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 -233
- 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 -171
- package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
- package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
- package/src/route-renderer/orchestration/template-serialization.js +0 -45
- /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/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
- /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
- /package/src/build/{build-types.d.ts → contracts/build-types.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,106 @@
|
|
|
1
|
+
import { STATUS_MESSAGE } from '../../../config/constants.js';
|
|
2
|
+
import { appLogger } from '../../../global/app-logger.js';
|
|
3
|
+
import { fileSystem } from '@ecopages/file-system';
|
|
4
|
+
/**
|
|
5
|
+
* Builds HTTP responses for static files and shared file-system fallbacks.
|
|
6
|
+
*/
|
|
7
|
+
export class FileSystemServerResponseFactory {
|
|
8
|
+
options;
|
|
9
|
+
constructor({ options }) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
isHtml(contentType) {
|
|
13
|
+
return contentType === 'text/html';
|
|
14
|
+
}
|
|
15
|
+
shouldEnableGzip(contentType) {
|
|
16
|
+
if (this.options.watchMode)
|
|
17
|
+
return false;
|
|
18
|
+
const gzipEnabledExtensions = ['text/javascript', 'text/css'];
|
|
19
|
+
return gzipEnabledExtensions.includes(contentType);
|
|
20
|
+
}
|
|
21
|
+
async createResponseWithBody(body, init = {
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-Type': 'text/html',
|
|
24
|
+
},
|
|
25
|
+
}) {
|
|
26
|
+
return new Response(body, init);
|
|
27
|
+
}
|
|
28
|
+
async createDefaultNotFoundResponse() {
|
|
29
|
+
return new Response(STATUS_MESSAGE[404], {
|
|
30
|
+
status: 404,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Wraps already-rendered HTML in a 404 response envelope.
|
|
35
|
+
*/
|
|
36
|
+
async createHtmlNotFoundResponse(body) {
|
|
37
|
+
return await this.createResponseWithBody(body, {
|
|
38
|
+
status: 404,
|
|
39
|
+
statusText: STATUS_MESSAGE[404],
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'text/html',
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async createDefaultServerErrorResponse() {
|
|
46
|
+
return new Response(STATUS_MESSAGE[500], {
|
|
47
|
+
status: 500,
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'text/plain; charset=utf-8',
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Wraps already-rendered HTML in a 500 response envelope.
|
|
55
|
+
*/
|
|
56
|
+
async createHtmlServerErrorResponse(body) {
|
|
57
|
+
return await this.createResponseWithBody(body, {
|
|
58
|
+
status: 500,
|
|
59
|
+
statusText: STATUS_MESSAGE[500],
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'text/html',
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reads a static file response, returning `null` when the file is missing.
|
|
67
|
+
*/
|
|
68
|
+
async createFileResponse(filePath, contentType) {
|
|
69
|
+
try {
|
|
70
|
+
let file;
|
|
71
|
+
const contentEncodingHeader = {};
|
|
72
|
+
if (this.shouldEnableGzip(contentType)) {
|
|
73
|
+
const gzipPath = `${filePath}.gz`;
|
|
74
|
+
if (fileSystem.exists(gzipPath)) {
|
|
75
|
+
file = fileSystem.readFileAsBuffer(gzipPath);
|
|
76
|
+
contentEncodingHeader['Content-Encoding'] = 'gzip';
|
|
77
|
+
contentEncodingHeader['Vary'] = 'Accept-Encoding';
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
appLogger.debug('Gzip file not found, serving uncompressed', gzipPath);
|
|
81
|
+
file = fileSystem.readFileAsBuffer(filePath);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
file = fileSystem.readFileAsBuffer(filePath);
|
|
86
|
+
}
|
|
87
|
+
return await this.createResponseWithBody(file, {
|
|
88
|
+
headers: {
|
|
89
|
+
'Content-Type': contentType,
|
|
90
|
+
...contentEncodingHeader,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const err = error;
|
|
96
|
+
const code = err.code || err.cause?.code;
|
|
97
|
+
if (code === 'ENOENT') {
|
|
98
|
+
appLogger.debug('File not found', filePath);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
appLogger.error('Error reading file', filePath, err);
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig, MatchResult } from '
|
|
2
|
-
import type { PageRendererResolver } from '
|
|
3
|
-
import type { RouteRegistry } from '
|
|
4
|
-
import type { PageCacheService } from '
|
|
5
|
-
import type { CacheStrategy } from '
|
|
1
|
+
import type { EcoPagesAppConfig, MatchResult } from '../../../types/internal-types.js';
|
|
2
|
+
import type { PageRendererResolver } from '../../../route-renderer/route-renderer.js';
|
|
3
|
+
import type { RouteRegistry } from '../../../router/server/route-registry.js';
|
|
4
|
+
import type { PageCacheService } from '../../../services/cache/page-cache-service.js';
|
|
5
|
+
import type { CacheStrategy } from '../../../services/cache/cache.types.js';
|
|
6
6
|
import type { FileSystemServerResponseFactory } from './fs-server-response-factory.js';
|
|
7
7
|
export interface FileSystemResponseMatcherOptions {
|
|
8
8
|
appConfig: EcoPagesAppConfig;
|
|
@@ -55,6 +55,26 @@ export declare class FileSystemResponseMatcher {
|
|
|
55
55
|
* when the page template cannot be resolved.
|
|
56
56
|
*/
|
|
57
57
|
private renderCustomNotFoundResponse;
|
|
58
|
+
/**
|
|
59
|
+
* Renders the app-owned custom 500 page, falling back to the default text 500
|
|
60
|
+
* when the page template cannot be resolved.
|
|
61
|
+
*/
|
|
62
|
+
private renderCustomServerErrorResponse;
|
|
63
|
+
/**
|
|
64
|
+
* Builds development-only error details for the custom 500 page.
|
|
65
|
+
* @remarks Production omits these fields so stacks are not serialized into HTML.
|
|
66
|
+
*/
|
|
67
|
+
private buildServerErrorPageProps;
|
|
68
|
+
private renderCustomErrorPageResponse;
|
|
69
|
+
private renderCustomNotFoundResponseOrServerError;
|
|
70
|
+
/**
|
|
71
|
+
* Logs the original render failure, then tries the custom 500 page once.
|
|
72
|
+
* @remarks Any failure while rendering the custom 500 page falls back to the
|
|
73
|
+
* default plain-text response and never re-enters the custom page path.
|
|
74
|
+
* In development the thrown error's `message` and `stack` are passed into the
|
|
75
|
+
* custom 500 page props.
|
|
76
|
+
*/
|
|
77
|
+
private createInternalServerErrorResponse;
|
|
58
78
|
private createExecutionPlan;
|
|
59
79
|
/**
|
|
60
80
|
* Loads the matched page module for request-time inspection.
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { appLogger } from '../../../global/app-logger.js';
|
|
3
|
+
import { PageRequestCacheCoordinator } from '../../../services/cache/page-request-cache-coordinator.service.js';
|
|
4
|
+
import { ServerUtils } from '../../../utils/server-utils.module.js';
|
|
5
|
+
import { FileRouteMiddlewarePipeline } from './file-route-middleware-pipeline.js';
|
|
6
|
+
import { HttpError } from '../../../errors/http-error.js';
|
|
7
|
+
import { LocalsAccessError } from '../../../errors/locals-access-error.js';
|
|
8
|
+
import { isDevelopmentRuntime } from '../../../utils/runtime.js';
|
|
9
|
+
/**
|
|
10
|
+
* Matches file-system routes to rendered HTML responses.
|
|
11
|
+
*
|
|
12
|
+
* This render pipeline coordinates page module inspection, request-local policy,
|
|
13
|
+
* renderer invocation, middleware execution, cache integration, and fallback
|
|
14
|
+
* error translation.
|
|
15
|
+
*/
|
|
16
|
+
export class FileSystemResponseMatcher {
|
|
17
|
+
appConfig;
|
|
18
|
+
assetPrefix;
|
|
19
|
+
router;
|
|
20
|
+
routeRendererFactory;
|
|
21
|
+
fileSystemResponseFactory;
|
|
22
|
+
pageRequestCacheCoordinator;
|
|
23
|
+
fileRouteMiddlewarePipeline;
|
|
24
|
+
constructor({ appConfig, assetPrefix, router, routeRendererFactory, fileSystemResponseFactory, cacheService = null, defaultCacheStrategy = 'static', }) {
|
|
25
|
+
this.appConfig = appConfig;
|
|
26
|
+
this.assetPrefix = assetPrefix;
|
|
27
|
+
this.router = router;
|
|
28
|
+
this.routeRendererFactory = routeRendererFactory;
|
|
29
|
+
this.fileSystemResponseFactory = fileSystemResponseFactory;
|
|
30
|
+
this.pageRequestCacheCoordinator = new PageRequestCacheCoordinator(cacheService, defaultCacheStrategy);
|
|
31
|
+
this.fileRouteMiddlewarePipeline = new FileRouteMiddlewarePipeline(cacheService);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolves unmatched paths either as static asset requests or as the custom
|
|
35
|
+
* not-found page.
|
|
36
|
+
* @param requestUrl Incoming pathname.
|
|
37
|
+
* @returns Static file response or rendered 404 response.
|
|
38
|
+
*/
|
|
39
|
+
async handleNoMatch(requestUrl) {
|
|
40
|
+
const isStaticFileRequest = ServerUtils.hasKnownStaticExtension(requestUrl);
|
|
41
|
+
if (!isStaticFileRequest) {
|
|
42
|
+
return this.renderCustomNotFoundResponseOrServerError(requestUrl);
|
|
43
|
+
}
|
|
44
|
+
const relativeUrl = requestUrl.startsWith('/') ? requestUrl.slice(1) : requestUrl;
|
|
45
|
+
const filePath = path.join(this.assetPrefix, relativeUrl);
|
|
46
|
+
const contentType = ServerUtils.getContentType(filePath);
|
|
47
|
+
const response = await this.fileSystemResponseFactory.createFileResponse(filePath, contentType);
|
|
48
|
+
return response ?? this.renderCustomNotFoundResponseOrServerError(requestUrl);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Handles a matched file-system page route.
|
|
52
|
+
*
|
|
53
|
+
* The method inspects page metadata needed for request-time execution,
|
|
54
|
+
* prepares the renderer invocation, validates middleware/cache constraints,
|
|
55
|
+
* and delegates caching plus middleware execution to dedicated collaborators.
|
|
56
|
+
*
|
|
57
|
+
* @param match Router match result.
|
|
58
|
+
* @param request Optional incoming request. A synthetic GET request is created when omitted.
|
|
59
|
+
* @returns Final response for the matched route.
|
|
60
|
+
*/
|
|
61
|
+
async handleMatch(match, request) {
|
|
62
|
+
try {
|
|
63
|
+
const executionPlan = await this.createExecutionPlan(match, request);
|
|
64
|
+
this.fileRouteMiddlewarePipeline.assertValidConfiguration({
|
|
65
|
+
middleware: executionPlan.pageMiddleware,
|
|
66
|
+
pageCacheStrategy: executionPlan.pageCacheStrategy,
|
|
67
|
+
filePath: executionPlan.pageFilePath,
|
|
68
|
+
});
|
|
69
|
+
const routeRenderer = this.routeRendererFactory.getPageRenderer(executionPlan.pageFilePath);
|
|
70
|
+
const middlewareContext = this.fileRouteMiddlewarePipeline.createContext({
|
|
71
|
+
request: executionPlan.request,
|
|
72
|
+
params: match.params,
|
|
73
|
+
locals: executionPlan.localsStore,
|
|
74
|
+
});
|
|
75
|
+
const renderFn = async () => {
|
|
76
|
+
const result = await routeRenderer.execute({
|
|
77
|
+
file: executionPlan.pageFilePath,
|
|
78
|
+
pageModule: executionPlan.pageModule,
|
|
79
|
+
params: match.params,
|
|
80
|
+
query: match.query,
|
|
81
|
+
locals: executionPlan.localsForRender,
|
|
82
|
+
});
|
|
83
|
+
const html = await this.pageRequestCacheCoordinator.bodyToString(result.body);
|
|
84
|
+
const strategy = result.cacheStrategy ?? this.pageRequestCacheCoordinator.getDefaultCacheStrategy();
|
|
85
|
+
return {
|
|
86
|
+
html,
|
|
87
|
+
strategy,
|
|
88
|
+
sourceDependencyPaths: result.sourceDependencyPaths,
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
const renderResponse = async () => {
|
|
92
|
+
return this.pageRequestCacheCoordinator.render({
|
|
93
|
+
cacheKey: executionPlan.cacheKey,
|
|
94
|
+
pageCacheStrategy: executionPlan.pageCacheStrategy,
|
|
95
|
+
renderFn,
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
return await this.fileRouteMiddlewarePipeline.run({
|
|
99
|
+
middleware: executionPlan.pageMiddleware,
|
|
100
|
+
context: middlewareContext,
|
|
101
|
+
renderResponse,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (error instanceof Response) {
|
|
106
|
+
return error;
|
|
107
|
+
}
|
|
108
|
+
if (HttpError.isHttpError(error) && error.status === 404) {
|
|
109
|
+
return await this.renderCustomNotFoundResponseOrServerError(match.requestedPathname);
|
|
110
|
+
}
|
|
111
|
+
if (error instanceof LocalsAccessError) {
|
|
112
|
+
return await this.createInternalServerErrorResponse(error.message, match.requestedPathname, error);
|
|
113
|
+
}
|
|
114
|
+
return await this.createInternalServerErrorResponse(error instanceof Error ? error.message : 'Internal Server Error', match.requestedPathname, error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Renders the app-owned custom 404 page, falling back to the default text 404
|
|
119
|
+
* when the page template cannot be resolved.
|
|
120
|
+
*/
|
|
121
|
+
async renderCustomNotFoundResponse() {
|
|
122
|
+
return this.renderCustomErrorPageResponse({
|
|
123
|
+
templatePath: this.appConfig.absolutePaths.error404TemplatePath,
|
|
124
|
+
label: '404',
|
|
125
|
+
createDefaultResponse: () => this.fileSystemResponseFactory.createDefaultNotFoundResponse(),
|
|
126
|
+
createHtmlResponse: (body) => this.fileSystemResponseFactory.createHtmlNotFoundResponse(body),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Renders the app-owned custom 500 page, falling back to the default text 500
|
|
131
|
+
* when the page template cannot be resolved.
|
|
132
|
+
*/
|
|
133
|
+
async renderCustomServerErrorResponse(error) {
|
|
134
|
+
return this.renderCustomErrorPageResponse({
|
|
135
|
+
templatePath: this.appConfig.absolutePaths.error500TemplatePath,
|
|
136
|
+
label: '500',
|
|
137
|
+
props: this.buildServerErrorPageProps(error),
|
|
138
|
+
createDefaultResponse: () => this.fileSystemResponseFactory.createDefaultServerErrorResponse(),
|
|
139
|
+
createHtmlResponse: (body) => this.fileSystemResponseFactory.createHtmlServerErrorResponse(body),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Builds development-only error details for the custom 500 page.
|
|
144
|
+
* @remarks Production omits these fields so stacks are not serialized into HTML.
|
|
145
|
+
*/
|
|
146
|
+
buildServerErrorPageProps(error) {
|
|
147
|
+
if (!isDevelopmentRuntime()) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
if (error instanceof Error) {
|
|
151
|
+
return {
|
|
152
|
+
message: error.message,
|
|
153
|
+
stack: error.stack,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
message: String(error),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async renderCustomErrorPageResponse({ templatePath, label, props, createDefaultResponse, createHtmlResponse, }) {
|
|
161
|
+
let routeRenderer;
|
|
162
|
+
try {
|
|
163
|
+
routeRenderer = this.routeRendererFactory.getPageRenderer(templatePath);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
appLogger.debug(`Custom ${label} template not found, falling back to default ${label} response`, templatePath);
|
|
167
|
+
return createDefaultResponse();
|
|
168
|
+
}
|
|
169
|
+
const result = await routeRenderer.execute({
|
|
170
|
+
file: templatePath,
|
|
171
|
+
props,
|
|
172
|
+
});
|
|
173
|
+
return createHtmlResponse(result.body);
|
|
174
|
+
}
|
|
175
|
+
async renderCustomNotFoundResponseOrServerError(pathname) {
|
|
176
|
+
try {
|
|
177
|
+
return await this.renderCustomNotFoundResponse();
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (error instanceof Response) {
|
|
181
|
+
return error;
|
|
182
|
+
}
|
|
183
|
+
return await this.createInternalServerErrorResponse(error instanceof Error ? error.message : 'Internal Server Error', pathname, error);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Logs the original render failure, then tries the custom 500 page once.
|
|
188
|
+
* @remarks Any failure while rendering the custom 500 page falls back to the
|
|
189
|
+
* default plain-text response and never re-enters the custom page path.
|
|
190
|
+
* In development the thrown error's `message` and `stack` are passed into the
|
|
191
|
+
* custom 500 page props.
|
|
192
|
+
*/
|
|
193
|
+
async createInternalServerErrorResponse(message, pathname, error) {
|
|
194
|
+
if (isDevelopmentRuntime() || appLogger.isDebugEnabled()) {
|
|
195
|
+
appLogger.error(`[FileSystemResponseMatcher] ${message} at ${pathname}`, error);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
appLogger.error(`[FileSystemResponseMatcher] Render error at ${pathname}`, error);
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
return await this.renderCustomServerErrorResponse(error);
|
|
202
|
+
}
|
|
203
|
+
catch (serverErrorPageError) {
|
|
204
|
+
if (serverErrorPageError instanceof Response) {
|
|
205
|
+
return serverErrorPageError;
|
|
206
|
+
}
|
|
207
|
+
appLogger.error(`[FileSystemResponseMatcher] Custom 500 template failed at ${pathname}`, serverErrorPageError);
|
|
208
|
+
return this.fileSystemResponseFactory.createDefaultServerErrorResponse();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async createExecutionPlan(match, request) {
|
|
212
|
+
const cacheKey = this.pageRequestCacheCoordinator.buildCacheKey({
|
|
213
|
+
pathname: match.requestedPathname,
|
|
214
|
+
query: match.query,
|
|
215
|
+
});
|
|
216
|
+
const resolvedRequest = request ??
|
|
217
|
+
new Request(new URL(cacheKey, this.router.origin).toString(), {
|
|
218
|
+
method: 'GET',
|
|
219
|
+
});
|
|
220
|
+
const localsStore = {};
|
|
221
|
+
const pageFilePath = match.templateRoute.filePath;
|
|
222
|
+
const pageModule = await this.importPageModule(pageFilePath);
|
|
223
|
+
const pageComponent = pageModule.default;
|
|
224
|
+
const pageMiddleware = pageComponent.middleware ?? [];
|
|
225
|
+
const pageCacheStrategy = pageModule.cache ?? pageComponent.cache ?? this.pageRequestCacheCoordinator.getDefaultCacheStrategy();
|
|
226
|
+
return {
|
|
227
|
+
cacheKey,
|
|
228
|
+
request: resolvedRequest,
|
|
229
|
+
pageFilePath,
|
|
230
|
+
pageModule,
|
|
231
|
+
pageMiddleware,
|
|
232
|
+
pageCacheStrategy,
|
|
233
|
+
localsStore,
|
|
234
|
+
localsForRender: pageCacheStrategy === 'dynamic' ? localsStore : undefined,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Loads the matched page module for request-time inspection.
|
|
239
|
+
*
|
|
240
|
+
* The matcher needs access to page-level metadata such as `cache` and
|
|
241
|
+
* `middleware` before full rendering starts, so it asks the owning route
|
|
242
|
+
* renderer to load the page module. That preserves integration-specific page
|
|
243
|
+
* import setup for request-time inspection as well as for full rendering.
|
|
244
|
+
*
|
|
245
|
+
* @param filePath Absolute page module path.
|
|
246
|
+
* @returns Imported page module.
|
|
247
|
+
*/
|
|
248
|
+
async importPageModule(filePath) {
|
|
249
|
+
const routeRenderer = this.routeRendererFactory.getPageRenderer(filePath);
|
|
250
|
+
return routeRenderer.loadPageModule(filePath);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get the underlying cache service for external invalidation.
|
|
254
|
+
*/
|
|
255
|
+
getCacheService() {
|
|
256
|
+
return this.pageRequestCacheCoordinator.getCacheService();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type MiddlewareHandler<TContext> = (context: TContext, next: () => Promise<Response>) => Response | Promise<Response>;
|
|
2
|
+
/**
|
|
3
|
+
* Runs an onion middleware chain and invokes the terminal handler when the chain completes.
|
|
4
|
+
*/
|
|
5
|
+
export declare function runMiddlewareChain<TContext>(middleware: readonly MiddlewareHandler<TContext>[], context: TContext, terminal: () => Promise<Response>): Promise<Response>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs an onion middleware chain and invokes the terminal handler when the chain completes.
|
|
3
|
+
*/
|
|
4
|
+
export async function runMiddlewareChain(middleware, context, terminal) {
|
|
5
|
+
if (middleware.length === 0) {
|
|
6
|
+
return terminal();
|
|
7
|
+
}
|
|
8
|
+
let index = 0;
|
|
9
|
+
const executeNext = async () => {
|
|
10
|
+
if (index < middleware.length) {
|
|
11
|
+
const current = middleware[index++];
|
|
12
|
+
return await current(context, executeNext);
|
|
13
|
+
}
|
|
14
|
+
return terminal();
|
|
15
|
+
};
|
|
16
|
+
return executeNext();
|
|
17
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '
|
|
2
|
-
import { AbstractApplicationAdapter, type ApplicationAdapterOptions, type RouteGroupDefinition, type RouteHandler } from '
|
|
1
|
+
import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../../types/public-types.js';
|
|
2
|
+
import { AbstractApplicationAdapter, type ApplicationAdapterOptions, type RouteGroupDefinition, type RouteHandler } from '../../abstract/application-adapter.js';
|
|
3
3
|
export declare abstract class SharedApplicationAdapter<TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions, TServer = any, TRequest extends Request = Request> extends AbstractApplicationAdapter<TOptions, TServer, TRequest> {
|
|
4
4
|
protected register<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, method: ApiHandler['method'], handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
5
5
|
get<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { AbstractApplicationAdapter, } from '../../abstract/application-adapter.js';
|
|
2
|
+
export class SharedApplicationAdapter extends AbstractApplicationAdapter {
|
|
3
|
+
register(path, method, handler, options) {
|
|
4
|
+
return this.addRouteHandler(path, method, handler, options?.middleware, options?.schema);
|
|
5
|
+
}
|
|
6
|
+
get(path, handler, options) {
|
|
7
|
+
return this.register(path, 'GET', handler, options);
|
|
8
|
+
}
|
|
9
|
+
post(path, handler, options) {
|
|
10
|
+
return this.register(path, 'POST', handler, options);
|
|
11
|
+
}
|
|
12
|
+
put(path, handler, options) {
|
|
13
|
+
return this.register(path, 'PUT', handler, options);
|
|
14
|
+
}
|
|
15
|
+
delete(path, handler, options) {
|
|
16
|
+
return this.register(path, 'DELETE', handler, options);
|
|
17
|
+
}
|
|
18
|
+
patch(path, handler, options) {
|
|
19
|
+
return this.register(path, 'PATCH', handler, options);
|
|
20
|
+
}
|
|
21
|
+
options(path, handler, options) {
|
|
22
|
+
return this.register(path, 'OPTIONS', handler, options);
|
|
23
|
+
}
|
|
24
|
+
head(path, handler, options) {
|
|
25
|
+
return this.register(path, 'HEAD', handler, options);
|
|
26
|
+
}
|
|
27
|
+
route(path, method, handler, options) {
|
|
28
|
+
return this.register(path, method, handler, options);
|
|
29
|
+
}
|
|
30
|
+
add(handler) {
|
|
31
|
+
return this.addRouteHandler(handler.path, handler.method, handler.handler, handler.middleware, handler.schema);
|
|
32
|
+
}
|
|
33
|
+
group(prefixOrGroup, callback, options) {
|
|
34
|
+
if (typeof prefixOrGroup === 'object') {
|
|
35
|
+
return this.registerGroup(prefixOrGroup);
|
|
36
|
+
}
|
|
37
|
+
const normalizedPrefix = prefixOrGroup.endsWith('/') ? prefixOrGroup.slice(0, -1) : prefixOrGroup;
|
|
38
|
+
const groupMiddleware = (options?.middleware ?? []);
|
|
39
|
+
const createHandler = (method) => {
|
|
40
|
+
return ((path, handler, routeOptions) => {
|
|
41
|
+
const combinedMiddleware = [
|
|
42
|
+
...groupMiddleware,
|
|
43
|
+
...(routeOptions?.middleware ?? []),
|
|
44
|
+
];
|
|
45
|
+
const fullPath = path === '/' ? normalizedPrefix : `${normalizedPrefix}${path}`;
|
|
46
|
+
this.addRouteHandler(fullPath, method, handler, combinedMiddleware.length > 0
|
|
47
|
+
? combinedMiddleware
|
|
48
|
+
: undefined, routeOptions?.schema);
|
|
49
|
+
return builder;
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
const builder = {
|
|
53
|
+
get: createHandler('GET'),
|
|
54
|
+
post: createHandler('POST'),
|
|
55
|
+
put: createHandler('PUT'),
|
|
56
|
+
delete: createHandler('DELETE'),
|
|
57
|
+
patch: createHandler('PATCH'),
|
|
58
|
+
options: createHandler('OPTIONS'),
|
|
59
|
+
head: createHandler('HEAD'),
|
|
60
|
+
};
|
|
61
|
+
callback?.(builder);
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
registerGroup(group) {
|
|
65
|
+
const normalizedPrefix = group.prefix.endsWith('/') ? group.prefix.slice(0, -1) : group.prefix;
|
|
66
|
+
const groupMiddleware = group.middleware ?? [];
|
|
67
|
+
for (const route of group.routes) {
|
|
68
|
+
const normalizedPath = route.path.startsWith('/') ? route.path : `/${route.path}`;
|
|
69
|
+
const fullPath = route.path === '/' ? normalizedPrefix : `${normalizedPrefix}${normalizedPath}`;
|
|
70
|
+
const combinedMiddleware = [...groupMiddleware, ...(route.middleware ?? [])];
|
|
71
|
+
this.addRouteHandler(fullPath, route.method, route.handler, combinedMiddleware.length > 0 ? combinedMiddleware : undefined, route.schema);
|
|
72
|
+
}
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
|
|
2
|
+
import type { DevPrewarmReadiness } from './dev-static-route-prewarm.js';
|
|
3
|
+
export type DevPrewarmPlan = {
|
|
4
|
+
pathnames: readonly string[];
|
|
5
|
+
beforeReadyPathnames: readonly string[];
|
|
6
|
+
readiness: DevPrewarmReadiness;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Aggregates processor-declared dev prewarm pathnames and readiness into one plan.
|
|
10
|
+
*/
|
|
11
|
+
export declare function collectAppDevPrewarmPlan(appConfig: EcoPagesAppConfig): Promise<DevPrewarmPlan>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregates processor-declared dev prewarm pathnames and readiness into one plan.
|
|
3
|
+
*/
|
|
4
|
+
export async function collectAppDevPrewarmPlan(appConfig) {
|
|
5
|
+
const pathnames = new Set(appConfig.devPrewarmPaths ?? []);
|
|
6
|
+
const beforeReadyPathnames = new Set(appConfig.devPrewarmBeforeReadyPaths ?? []);
|
|
7
|
+
let readiness = 'background';
|
|
8
|
+
for (const processor of appConfig.processors.values()) {
|
|
9
|
+
const contributor = processor;
|
|
10
|
+
const plan = await contributor.collectDevPrewarmPlan();
|
|
11
|
+
for (const pathname of plan.pathnames) {
|
|
12
|
+
pathnames.add(pathname);
|
|
13
|
+
}
|
|
14
|
+
if (plan.readiness === 'beforeReady') {
|
|
15
|
+
readiness = 'beforeReady';
|
|
16
|
+
for (const pathname of plan.pathnames) {
|
|
17
|
+
beforeReadyPathnames.add(pathname);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
for (const pathname of beforeReadyPathnames) {
|
|
22
|
+
pathnames.add(pathname);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
pathnames: [...pathnames],
|
|
26
|
+
beforeReadyPathnames: [...beforeReadyPathnames],
|
|
27
|
+
readiness,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copies a source public directory into the runtime dist dir, skipping unchanged files.
|
|
3
|
+
*
|
|
4
|
+
* Dev restarts call this on every boot; byte comparison avoids rewriting identical assets.
|
|
5
|
+
*/
|
|
6
|
+
export declare function copyRuntimePublicDirIfChanged(sourceDir: string, destinationDir: string): void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readdirSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileSystem } from '@ecopages/file-system';
|
|
4
|
+
/**
|
|
5
|
+
* Copies a source public directory into the runtime dist dir, skipping unchanged files.
|
|
6
|
+
*
|
|
7
|
+
* Dev restarts call this on every boot; byte comparison avoids rewriting identical assets.
|
|
8
|
+
*/
|
|
9
|
+
export function copyRuntimePublicDirIfChanged(sourceDir, destinationDir) {
|
|
10
|
+
fileSystem.ensureDir(destinationDir);
|
|
11
|
+
for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {
|
|
12
|
+
const sourcePath = path.join(sourceDir, entry.name);
|
|
13
|
+
const destinationPath = path.join(destinationDir, entry.name);
|
|
14
|
+
if (entry.isDirectory()) {
|
|
15
|
+
copyRuntimePublicDirIfChanged(sourcePath, destinationPath);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (!entry.isFile()) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (fileSystem.exists(destinationPath) &&
|
|
22
|
+
Buffer.compare(fileSystem.readFileAsBuffer(sourcePath), fileSystem.readFileAsBuffer(destinationPath)) === 0) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
fileSystem.copyFile(sourcePath, destinationPath);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type DevPrewarmReadiness = 'background' | 'beforeReady';
|
|
2
|
+
export type DevStaticRoutePrewarmOptions = {
|
|
3
|
+
pathnames: readonly string[];
|
|
4
|
+
readiness?: DevPrewarmReadiness;
|
|
5
|
+
renderPath: (pathname: string) => Promise<void>;
|
|
6
|
+
/** Invoked with the pathname list before rendering begins. */
|
|
7
|
+
onPathnamesResolved?: (pathnames: readonly string[]) => void;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Renders declared pathnames so first client navigations hit warm graphs and scoped watch HTML cache.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runDevStaticRoutePrewarm(options: DevStaticRoutePrewarmOptions): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Fire-and-forget wrapper around {@link runDevStaticRoutePrewarm}.
|
|
15
|
+
*/
|
|
16
|
+
export declare function startDevStaticRoutePrewarm(options: DevStaticRoutePrewarmOptions): void;
|