@ecopages/core 0.2.0-beta.3 → 0.2.0-beta.31
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 +38 -9
- package/package.json +241 -30
- package/src/adapters/README.md +6 -2
- package/src/adapters/abstract/application-adapter.d.ts +123 -6
- package/src/adapters/abstract/application-adapter.js +151 -1
- package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
- package/src/adapters/abstract/segment-path-matcher.js +149 -0
- package/src/adapters/abstract/server-adapter.d.ts +16 -2
- package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
- package/src/adapters/abstract/ws-pattern-matcher.js +30 -0
- package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
- package/src/adapters/bun/bun-user-websocket-lifecycle.js +96 -0
- package/src/adapters/bun/client-bridge.d.ts +1 -0
- package/src/adapters/bun/client-bridge.js +3 -0
- package/src/adapters/bun/create-app.d.ts +9 -6
- package/src/adapters/bun/create-app.js +76 -45
- package/src/adapters/bun/hmr-manager.d.ts +1 -1
- package/src/adapters/bun/hmr-manager.js +1 -1
- package/src/adapters/bun/index.d.ts +1 -1
- package/src/adapters/bun/index.js +25 -2
- package/src/adapters/bun/runtime-host.d.ts +1 -1
- package/src/adapters/bun/runtime-host.js +1 -1
- package/src/adapters/bun/server-adapter.d.ts +92 -41
- package/src/adapters/bun/server-adapter.js +256 -117
- package/src/adapters/bun/static-preview-host.d.ts +1 -1
- package/src/adapters/bun/static-preview-host.js +25 -20
- package/src/adapters/create-app.d.ts +13 -11
- package/src/adapters/create-app.js +2 -51
- package/src/adapters/index.d.ts +2 -2
- package/src/adapters/index.js +26 -4
- package/src/adapters/node/create-app.d.ts +8 -3
- package/src/adapters/node/create-app.js +61 -13
- package/src/adapters/node/node-client-bridge.d.ts +1 -0
- package/src/adapters/node/node-client-bridge.js +3 -0
- package/src/adapters/node/node-hmr-manager.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.js +1 -1
- package/src/adapters/node/runtime-host.d.ts +1 -1
- package/src/adapters/node/runtime-host.js +1 -1
- package/src/adapters/node/server-adapter-dependencies.js +4 -0
- package/src/adapters/node/server-adapter.d.ts +64 -23
- package/src/adapters/node/server-adapter.js +169 -142
- package/src/adapters/node/static-content-server.d.ts +1 -0
- package/src/adapters/node/static-content-server.js +10 -2
- package/src/adapters/node/static-preview-host.d.ts +1 -1
- package/src/adapters/node/static-preview-host.js +27 -12
- package/src/adapters/shared/{hmr-entrypoint-registrar.d.ts → hmr/hmr-entrypoint-registrar.d.ts} +31 -30
- package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +106 -0
- package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
- package/src/adapters/shared/{hmr-html-response.js → hmr/hmr-html-response.js} +4 -1
- package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +101 -0
- package/src/adapters/shared/hmr/shared-hmr-manager.js +432 -0
- package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
- package/src/adapters/shared/http/api-request-pipeline.js +129 -0
- package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
- package/src/adapters/shared/{api-response.js → http/api-response.js} +6 -23
- package/src/adapters/shared/http/create-body-response.d.ts +12 -0
- package/src/adapters/shared/http/create-body-response.js +23 -0
- package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
- package/src/adapters/shared/http/define-api-handler.js +63 -0
- package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
- package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
- package/src/adapters/shared/{explicit-static-route-matcher.js → http/explicit-static-route-matcher.js} +3 -38
- package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
- package/src/adapters/shared/{file-route-middleware-pipeline.js → http/file-route-middleware-pipeline.js} +10 -22
- package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
- package/src/adapters/shared/{fs-server-response-factory.js → http/fs-server-response-factory.js} +22 -2
- package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
- package/src/adapters/shared/{fs-server-response-matcher.js → http/fs-server-response-matcher.js} +109 -27
- 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/{application-adapter.js → runtime/application-adapter.js} +1 -1
- package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
- package/src/adapters/shared/runtime/copy-runtime-public-dir.js +24 -0
- package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
- package/src/adapters/shared/runtime/port-manager.js +196 -0
- package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
- package/src/adapters/shared/{render-context.js → runtime/render-context.js} +8 -17
- package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
- package/src/adapters/shared/{runtime-app-bootstrap.js → runtime/runtime-app-bootstrap.js} +4 -7
- package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +46 -0
- package/src/adapters/shared/runtime/runtime-server-lifecycle.js +57 -0
- package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +23 -49
- package/src/adapters/shared/runtime/server-adapter.js +226 -0
- package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
- package/src/adapters/shared/{server-route-handler.js → runtime/server-route-handler.js} +5 -43
- 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 +191 -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 +100 -0
- package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
- package/src/adapters/shared/ws/websocket-lifecycle.js +55 -0
- package/src/build/README.md +140 -31
- package/src/build/app-build-manifest-runtime.d.ts +39 -0
- package/src/build/app-build-manifest-runtime.js +124 -0
- package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
- package/src/build/{browser-runtime-plugin.js → browser/browser-runtime-plugin.js} +1 -1
- package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
- package/src/build/browser/jsx-ownership-plugins.js +41 -0
- package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
- package/src/build/browser/lit-static-render-worker-context.js +6 -0
- package/src/build/build-adapter.d.ts +29 -334
- package/src/build/build-adapter.js +32 -133
- package/src/build/cache/build-input-fingerprint.d.ts +28 -0
- package/src/build/cache/build-input-fingerprint.js +31 -0
- package/src/build/cache/cache-constants.d.ts +4 -0
- package/src/build/cache/cache-constants.js +6 -0
- package/src/build/cache/cache-keys.d.ts +22 -0
- package/src/build/cache/cache-keys.js +63 -0
- package/src/build/cache/dev-browser-script-cache.d.ts +34 -0
- package/src/build/cache/dev-browser-script-cache.js +90 -0
- package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
- package/src/build/cache/pages-unified-graph-build.js +198 -0
- package/src/build/cache/production-build-cache.d.ts +20 -0
- package/src/build/cache/production-build-cache.js +63 -0
- package/src/build/cache/server-entry-build-cache.d.ts +43 -0
- package/src/build/cache/server-entry-build-cache.js +165 -0
- package/src/build/contracts/build-contracts.d.ts +96 -0
- package/src/build/contracts/build-manifest.d.ts +90 -0
- package/src/build/{build-manifest.js → contracts/build-manifest.js} +2 -2
- package/src/build/contracts/build-types.js +0 -0
- package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +23 -9
- package/src/build/{rolldown-adapter-helpers.js → rolldown/rolldown-adapter-helpers.js} +99 -13
- package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
- package/src/build/{rolldown-build-adapter.js → rolldown/rolldown-build-adapter.js} +3 -3
- package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
- package/src/build/rolldown/rolldown-build-invocation-metrics.js +43 -0
- package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
- package/src/build/{rolldown-plugin-bridge.js → rolldown/rolldown-plugin-bridge.js} +21 -6
- package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
- package/src/build/rolldown/rolldown-source-transform-pass.js +61 -0
- package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
- package/src/build/rolldown/runtime-build-output-normalizer.js +201 -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 +54 -0
- package/src/build/runtime/build-request-policy.d.ts +59 -0
- package/src/build/runtime/build-request-policy.js +46 -0
- package/src/build/runtime/build-runtime.d.ts +28 -0
- package/src/build/runtime/build-runtime.js +65 -0
- package/src/build/runtime/deduping-build-executor.d.ts +21 -0
- package/src/build/runtime/deduping-build-executor.js +34 -0
- package/src/build/runtime/parallel-build-executor.d.ts +21 -0
- package/src/build/runtime/parallel-build-executor.js +52 -0
- package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
- package/src/client/navigation-scripts/classification.d.ts +16 -0
- package/src/client/navigation-scripts/classification.js +41 -0
- package/src/client/navigation-scripts/index.d.ts +3 -0
- package/src/client/navigation-scripts/index.js +23 -0
- package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
- package/src/client/navigation-scripts/registry.d.ts +11 -0
- package/src/client/navigation-scripts/registry.js +12 -0
- package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
- package/src/client/navigation-scripts/rerun-queue.js +73 -0
- package/src/client/scroll.d.ts +17 -0
- package/src/client/scroll.js +25 -0
- package/src/client/scroll.test.browser.js +37 -0
- package/src/client/view-transitions.d.ts +16 -0
- package/src/client/view-transitions.js +63 -0
- package/src/config/config-builder.d.ts +25 -10
- package/src/config/config-builder.js +53 -11
- package/src/config/constants.d.ts +1 -0
- package/src/config/constants.js +2 -1
- package/src/dev/client-bridge-registry.d.ts +5 -0
- package/src/dev/client-bridge-registry.js +15 -0
- package/src/dev/dev-client-ownership.d.ts +7 -0
- package/src/dev/dev-client-ownership.js +6 -0
- package/src/dev/hmr-manager-registry.d.ts +8 -0
- package/src/dev/hmr-manager-registry.js +15 -0
- package/src/dev/host-runtime.d.ts +3 -0
- package/src/dev/host-runtime.js +7 -0
- package/src/dev/runtime-server-started-message.d.ts +2 -0
- package/src/dev/runtime-server-started-message.js +6 -0
- package/src/diagnostics/request-build-dedupe.d.ts +18 -0
- package/src/diagnostics/request-build-dedupe.js +33 -0
- package/src/diagnostics/startup-trace.d.ts +72 -0
- package/src/diagnostics/startup-trace.js +253 -0
- package/src/eco/README.md +11 -0
- package/src/eco/eco-declared-component.d.ts +14 -0
- package/src/eco/eco-declared-component.js +16 -0
- package/src/eco/eco.browser.js +5 -6
- package/src/eco/eco.js +7 -8
- package/src/eco/eco.types.d.ts +14 -3
- package/src/eco/eco.utils.d.ts +1 -1
- package/src/eco/eco.utils.js +1 -1
- package/src/eco/page-layout-normalization.d.ts +21 -0
- package/src/eco/page-layout-normalization.js +59 -0
- package/src/env.d.ts +2 -0
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +7 -1
- package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
- package/src/errors/undeclared-component-dependency-error.js +17 -0
- package/src/hmr/client/hmr-runtime.js +7 -4
- package/src/hmr/hmr-entrypoint-output.d.ts +49 -0
- package/src/hmr/hmr-entrypoint-output.js +60 -0
- package/src/hmr/hmr-file-change-prep.d.ts +10 -0
- package/src/hmr/hmr-file-change-prep.js +17 -0
- package/src/hmr/hmr-strategy.d.ts +15 -0
- package/src/hmr/hmr-strategy.js +19 -0
- package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -5
- package/src/hmr/strategies/js-hmr-strategy.js +72 -19
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
- package/src/index.d.ts +2 -1
- package/src/index.js +28 -2
- package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
- package/src/integrations/ghtml/ghtml-renderer.js +2 -51
- package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
- package/src/integrations/ghtml/ghtml.plugin.js +7 -14
- package/src/plugins/alias-resolver-cache.d.ts +6 -9
- package/src/plugins/alias-resolver-plugin.d.ts +3 -3
- package/src/plugins/alias-resolver-plugin.js +38 -51
- package/src/plugins/define-integration.d.ts +26 -0
- package/src/plugins/define-integration.js +19 -0
- package/src/plugins/eco-component-meta-plugin.d.ts +1 -1
- package/src/plugins/eco-component-meta-plugin.js +5 -8
- package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
- package/src/plugins/foreign-jsx-override-plugin.js +4 -6
- package/src/plugins/integration-plugin.d.ts +43 -14
- package/src/plugins/integration-plugin.js +18 -5
- package/src/plugins/jsx-import-source.utils.d.ts +8 -0
- package/src/plugins/jsx-import-source.utils.js +26 -0
- package/src/plugins/processor.d.ts +61 -12
- package/src/plugins/processor.js +24 -5
- package/src/plugins/source-transform.d.ts +32 -1
- package/src/plugins/source-transform.js +23 -1
- package/src/plugins/tsconfig-import-resolver.d.ts +18 -0
- package/src/plugins/tsconfig-import-resolver.js +159 -0
- package/src/route-renderer/GRAPH.md +26 -32
- package/src/route-renderer/README.md +38 -31
- 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 +148 -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 +31 -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/{component-render-context.js → foreign-child/component-render-context.js} +4 -2
- 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/{render-output.utils.js → foreign-child/foreign-child-output.utils.js} +35 -26
- 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-subtree-execution.service.js → foreign-child/foreign-subtree-execution.service.js} +170 -37
- 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 +35 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +24 -143
- package/src/route-renderer/orchestration/integration-renderer.js +163 -402
- package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
- package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +177 -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 +143 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph.js +96 -0
- package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +7 -2
- package/src/route-renderer/orchestration/{ownership-validation.service.js → ownership-graph/ownership-validation.service.js} +30 -3
- 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 +32 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.d.ts +9 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +7 -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 +29 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +106 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +436 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +31 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +229 -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/route-pipeline/integration-route-render-adapter.d.ts +31 -0
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +25 -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 +27 -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 +36 -0
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +20 -0
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +24 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +25 -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 +33 -0
- package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +13 -53
- package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +162 -0
- package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
- package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +6 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +7 -2
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +4 -0
- package/src/router/client/link-intent.d.ts +11 -21
- package/src/router/client/link-intent.js +10 -0
- package/src/router/client/link-intent.test.browser.js +12 -1
- package/src/router/client/link-navigation-policy.d.ts +45 -0
- package/src/router/client/link-navigation-policy.js +101 -0
- package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
- package/src/router/client/link-navigation-policy.test.browser.js +92 -0
- package/src/router/client/navigation-coordinator.d.ts +1 -1
- package/src/router/client/navigation-coordinator.js +12 -2
- 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 +3 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +6 -1
- package/src/services/assets/asset-processing-service/asset-processing.service.js +44 -5
- package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
- 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 +1 -0
- 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 +78 -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 +28 -13
- 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 +7 -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 +38 -12
- package/src/services/assets/asset-processing-service/index.d.ts +2 -0
- package/src/services/assets/asset-processing-service/index.js +2 -0
- 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 +17 -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 +18 -0
- 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 +2 -15
- 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 +73 -68
- 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 +18 -15
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
- 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 +2 -31
- 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 +2 -30
- 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 +43 -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 +17 -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 +5 -10
- package/src/services/assets/browser-bundle.service.d.ts +28 -30
- package/src/services/assets/browser-bundle.service.js +28 -19
- package/src/services/html/html-transformer.service.d.ts +1 -1
- package/src/services/html/html-transformer.service.js +5 -5
- package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
- package/src/services/invalidation/development-invalidation.service.js +64 -11
- package/src/services/module-loading/README.md +49 -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 +3 -21
- package/src/services/module-loading/page-module-import.service.d.ts +6 -2
- package/src/services/module-loading/page-module-import.service.js +110 -47
- 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 +37 -0
- package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
- package/src/services/module-loading/route-module-build-cache.js +38 -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 +207 -0
- package/src/services/module-loading/route-module-build-manifest.d.ts +54 -0
- package/src/services/module-loading/route-module-build-manifest.js +85 -0
- package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
- package/src/services/module-loading/route-module-dependency-hasher.js +122 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -1
- package/src/services/module-loading/server-module-transpiler.service.js +1 -1
- package/src/services/validation/schema-validation-service.d.ts +1 -4
- package/src/services/validation/schema-validation-service.js +12 -13
- package/src/services/validation/standard-schema.types.d.ts +9 -62
- 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 +28 -0
- package/src/static-site-generator/production-page-browser-graph-prebuild.js +22 -0
- package/src/static-site-generator/sitemap-routes.d.ts +14 -0
- package/src/static-site-generator/sitemap-routes.js +31 -0
- package/src/static-site-generator/sitemap.d.ts +15 -0
- package/src/static-site-generator/sitemap.js +33 -0
- package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
- package/src/static-site-generator/static-build-invalidation.js +59 -0
- package/src/static-site-generator/static-export-context.d.ts +30 -0
- package/src/static-site-generator/static-export-context.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +43 -25
- package/src/static-site-generator/static-site-generator.js +381 -106
- package/src/types/internal-types.d.ts +39 -13
- package/src/types/public-types.d.ts +289 -52
- package/src/utils/ecopages-route-info.d.ts +26 -0
- package/src/utils/ecopages-route-info.js +26 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +5 -1
- package/src/utils/parse-cli-args.d.ts +2 -0
- package/src/utils/parse-cli-args.js +6 -0
- package/src/utils/path-pattern.d.ts +23 -0
- package/src/utils/path-pattern.js +27 -0
- package/src/utils/server-utils.module.d.ts +3 -2
- package/src/utils/server-utils.module.js +5 -6
- package/src/utils/static-file-extensions.d.ts +12 -0
- package/src/utils/static-file-extensions.js +48 -0
- package/src/watchers/project-watcher-ignore.d.ts +11 -0
- package/src/watchers/project-watcher-ignore.js +16 -0
- package/src/watchers/project-watcher.d.ts +29 -6
- package/src/watchers/project-watcher.js +146 -34
- package/src/watchers/project-watcher.test-helpers.js +5 -5
- 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/hmr-entrypoint-registrar.js +0 -87
- package/src/adapters/shared/server-adapter.js +0 -436
- 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/build/build-manifest.d.ts +0 -33
- package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
- package/src/build/rolldown-dev-build-adapter.js +0 -166
- 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/hmr/hmr.postcss.test.e2e.js +0 -31
- package/src/hmr/hmr.test.e2e.js +0 -43
- 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/ownership-planning.service.d.ts +0 -24
- package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
- 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/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/{explicit-static-render-preparation.js → http/explicit-static-render-preparation.js} +0 -0
- /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
- /package/src/adapters/shared/{runtime-host.js → runtime/runtime-host.js} +0 -0
- /package/src/adapters/shared/{static-preview-host.js → 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-manifest.js → browser/browser-runtime-manifest.js} +0 -0
- /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
- /package/src/build/{browser-runtime-plugin-helpers.js → browser/browser-runtime-plugin-helpers.js} +0 -0
- /package/src/build/{build-types.js → contracts/build-contracts.js} +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
- /package/src/build/{server-side-css-shim-plugin.js → rolldown/server-side-css-shim-plugin.js} +0 -0
- /package/src/build/{serialized-build-executor.js → runtime/serialized-build-executor.js} +0 -0
- /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
- /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
- /package/src/route-renderer/orchestration/{processed-asset-dedupe.js → page-browser-graph/processed-asset-dedupe.js} +0 -0
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { SourceModuleLoader } from '../../services/module-loading/module-loading-types.js';
|
|
10
10
|
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
11
|
-
import type { ApiHandler, ApiHandlerContext, ErrorHandler, Middleware, RouteOptions, StaticRoute, ViewLoader } from '../../types/public-types.js';
|
|
11
|
+
import type { ApiHandler, ApiHandlerContext, ErrorHandler, Middleware, RouteOptions, StaticRoute, ViewLoader, EcopagesRouteInfo } from '../../types/public-types.js';
|
|
12
|
+
import type { EcopagesWebSocketHandler } from '../../types/public-types.js';
|
|
13
|
+
import { type EcopagesRuntimeLabel } from '../../dev/runtime-server-started-message.js';
|
|
12
14
|
import { type ReturnParseCliArgs } from '../../utils/parse-cli-args.js';
|
|
13
15
|
/**
|
|
14
16
|
* Runtime bootstrap options layered on top of the app config.
|
|
@@ -25,6 +27,21 @@ export interface ApplicationRuntimeOptions {
|
|
|
25
27
|
* adapter auto-detects a host module loader from the global scope.
|
|
26
28
|
*/
|
|
27
29
|
embedded?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* When true, full-page reload signaling is owned by the host dev server
|
|
32
|
+
* (for example Vite's `full-reload` websocket event) instead of the Ecopages
|
|
33
|
+
* client bridge.
|
|
34
|
+
*
|
|
35
|
+
* @deprecated Prefer `devClientOwner: 'host'`.
|
|
36
|
+
*/
|
|
37
|
+
delegateBrowserReloadToHost?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Selects which layer injects browser dev-client bootstrap (HMR runtime, reload).
|
|
40
|
+
*
|
|
41
|
+
* `host` disables core injection and reload signaling so embedded hosts like
|
|
42
|
+
* Vite own the full dev-client surface.
|
|
43
|
+
*/
|
|
44
|
+
devClientOwner?: 'core' | 'host';
|
|
28
45
|
/**
|
|
29
46
|
* Explicit source module loader for request-time imports.
|
|
30
47
|
*
|
|
@@ -33,6 +50,27 @@ export interface ApplicationRuntimeOptions {
|
|
|
33
50
|
*/
|
|
34
51
|
hostModuleLoader?: SourceModuleLoader;
|
|
35
52
|
}
|
|
53
|
+
export interface AppStartInfo {
|
|
54
|
+
origin: string;
|
|
55
|
+
/**
|
|
56
|
+
* Static-generation routes available when the runtime becomes ready.
|
|
57
|
+
*
|
|
58
|
+
* @remarks
|
|
59
|
+
* Empty when the server adapter has no route registry yet, or when route
|
|
60
|
+
* resolution fails (failures never block startup). Route resolution completes
|
|
61
|
+
* before the `onAppStart` callback runs.
|
|
62
|
+
*/
|
|
63
|
+
routes: EcopagesRouteInfo[];
|
|
64
|
+
}
|
|
65
|
+
export type OnAppStartCallback = (info: AppStartInfo) => void;
|
|
66
|
+
/** @deprecated Use {@link AppStartInfo}. */
|
|
67
|
+
export type ApplicationListeningInfo = AppStartInfo;
|
|
68
|
+
/** @deprecated Use {@link OnAppStartCallback}. */
|
|
69
|
+
export type StartCallback = OnAppStartCallback;
|
|
70
|
+
/** @deprecated Use {@link OnAppStartCallback}. */
|
|
71
|
+
export type ListenCallback = OnAppStartCallback;
|
|
72
|
+
/** @deprecated Use {@link OnAppStartCallback}. */
|
|
73
|
+
export type ApplicationListeningCallback = OnAppStartCallback;
|
|
36
74
|
/**
|
|
37
75
|
* Configuration options for application adapters
|
|
38
76
|
*/
|
|
@@ -49,8 +87,12 @@ export interface ApplicationAdapterOptions {
|
|
|
49
87
|
/**
|
|
50
88
|
* Common interface for application adapters
|
|
51
89
|
*/
|
|
52
|
-
export interface ApplicationAdapter<T = any> {
|
|
53
|
-
|
|
90
|
+
export interface ApplicationAdapter<T = any> extends AsyncDisposable {
|
|
91
|
+
/** Boot the server. Pass a callback to run when the runtime is ready (optional). */
|
|
92
|
+
start(onAppStart?: OnAppStartCallback): Promise<T | void>;
|
|
93
|
+
/** Invoked by embedded hosts once the app can take traffic. */
|
|
94
|
+
handleListening(origin: string): void | Promise<void>;
|
|
95
|
+
stop(force?: boolean): Promise<void>;
|
|
54
96
|
}
|
|
55
97
|
/**
|
|
56
98
|
* Handler function type for route handlers
|
|
@@ -72,7 +114,14 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
|
|
|
72
114
|
protected apiHandlers: ApiHandler[];
|
|
73
115
|
protected staticRoutes: StaticRoute[];
|
|
74
116
|
protected errorHandler?: ErrorHandler;
|
|
75
|
-
|
|
117
|
+
/**
|
|
118
|
+
* App-level WebSocket handlers keyed by URL path pattern (e.g. '/ws/chat/:id').
|
|
119
|
+
* Both Bun and Node adapters read this map to register upgrade routes.
|
|
120
|
+
*/
|
|
121
|
+
protected websocketHandlers: Map<string, EcopagesWebSocketHandler<any, any>>;
|
|
122
|
+
private onAppStartCallback?;
|
|
123
|
+
protected readonly runtimeLabel: EcopagesRuntimeLabel;
|
|
124
|
+
constructor(options: TOptions, runtimeLabel: EcopagesRuntimeLabel);
|
|
76
125
|
private clearDistFolder;
|
|
77
126
|
/**
|
|
78
127
|
* Register a GET route handler.
|
|
@@ -160,6 +209,46 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
|
|
|
160
209
|
* Get all registered static routes
|
|
161
210
|
*/
|
|
162
211
|
getStaticRoutes(): StaticRoute[];
|
|
212
|
+
/**
|
|
213
|
+
* Register a WebSocket handler for the given path pattern.
|
|
214
|
+
*
|
|
215
|
+
* The runtime adapter handles the HTTP→WebSocket upgrade for this path
|
|
216
|
+
* and routes lifecycle events to `handler`.
|
|
217
|
+
*
|
|
218
|
+
* Supports dynamic segments via `:param` syntax. The handler receives
|
|
219
|
+
* typed `params` and `search` fields, and a typed `context` produced by
|
|
220
|
+
* the optional `context()` factory.
|
|
221
|
+
*
|
|
222
|
+
* One pattern registration matches infinite path variations. For example,
|
|
223
|
+
* `app.websocket('/ws/chat/:roomId', handler)` matches `/ws/chat/abc`,
|
|
224
|
+
* `/ws/chat/xyz`, etc. Each connection receives its own `params.roomId`.
|
|
225
|
+
*
|
|
226
|
+
* Works across both Bun and Node runtimes — no runtime-specific imports needed.
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* app.websocket<ChatContext, { roomId: string }>('/ws/chat/:roomId', {
|
|
231
|
+
* async context({ params, search }) {
|
|
232
|
+
* return { username: search.username ?? 'anonymous', roomId: params.roomId };
|
|
233
|
+
* },
|
|
234
|
+
* onConnect(socket) {
|
|
235
|
+
* socket.send(`Welcome to room ${socket.context.roomId}`);
|
|
236
|
+
* },
|
|
237
|
+
* onMessage(socket, message) {
|
|
238
|
+
* if (message.kind === 'text') {
|
|
239
|
+
* socket.send(message.text);
|
|
240
|
+
* }
|
|
241
|
+
* },
|
|
242
|
+
* });
|
|
243
|
+
* ```
|
|
244
|
+
*/
|
|
245
|
+
websocket<TContext = unknown, TParams extends Record<string, string> = Record<string, string>>(path: string, handler: EcopagesWebSocketHandler<TContext, TParams>): this;
|
|
246
|
+
/**
|
|
247
|
+
* Get the registered WebSocket handlers map.
|
|
248
|
+
*
|
|
249
|
+
* @returns The map of WebSocket route patterns to handlers
|
|
250
|
+
*/
|
|
251
|
+
getWebsocketHandlers(): Map<string, EcopagesWebSocketHandler<any, any>>;
|
|
163
252
|
/**
|
|
164
253
|
* Register a global error handler for all routes.
|
|
165
254
|
* Useful for logging, monitoring integration, and custom error formatting.
|
|
@@ -182,9 +271,37 @@ export declare abstract class AbstractApplicationAdapter<TOptions extends Applic
|
|
|
182
271
|
*/
|
|
183
272
|
protected abstract initializeServerAdapter(): Promise<any>;
|
|
184
273
|
/**
|
|
185
|
-
*
|
|
274
|
+
* Boot the server. When `onAppStart` is passed, it runs once the runtime can take traffic.
|
|
275
|
+
* Embedded apps only register the callback — the host (for example Vite) boots the port.
|
|
276
|
+
*/
|
|
277
|
+
start(onAppStart?: OnAppStartCallback): Promise<TServer | void>;
|
|
278
|
+
/** Runtime-specific server boot (dev, preview, build). */
|
|
279
|
+
protected abstract bootServer(): Promise<TServer | void>;
|
|
280
|
+
protected logServerStarted(origin: string): void;
|
|
281
|
+
/**
|
|
282
|
+
* Invoked by embedded hosts (for example Vite) once the app can take traffic.
|
|
283
|
+
*/
|
|
284
|
+
handleListening(origin: string): Promise<void>;
|
|
285
|
+
protected notifyListening(origin: string): Promise<void>;
|
|
286
|
+
/**
|
|
287
|
+
* Resolves routes exposed on {@link AppStartInfo}.
|
|
288
|
+
*
|
|
289
|
+
* @remarks
|
|
290
|
+
* Default is empty. Runtime adapters override this to read from the
|
|
291
|
+
* initialized server route registry.
|
|
292
|
+
*/
|
|
293
|
+
protected resolveAppRoutes(): Promise<EcopagesRouteInfo[]>;
|
|
294
|
+
private invokeAppStartCallback;
|
|
295
|
+
/**
|
|
296
|
+
* Stops the application server and releases runtime resources.
|
|
297
|
+
*
|
|
298
|
+
* @remarks
|
|
299
|
+
* Subclasses override this to shut down bound servers, watchers, and other
|
|
300
|
+
* dev-time resources. The default implementation is a no-op so embedded
|
|
301
|
+
* adapters that never call `start()` can still be used with `await using`.
|
|
186
302
|
*/
|
|
187
|
-
|
|
303
|
+
stop(_force?: boolean): Promise<void>;
|
|
304
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
188
305
|
/**
|
|
189
306
|
* Handles a standard Web request without requiring a bound network server.
|
|
190
307
|
* This is the primary interoperability surface for embedding Ecopages inside
|
|
@@ -6,7 +6,11 @@ import {
|
|
|
6
6
|
import { getHostModuleLoader } from "../../services/module-loading/host-module-loader-registry.js";
|
|
7
7
|
import { invariant } from "../../utils/invariant.js";
|
|
8
8
|
import { fileSystem } from "@ecopages/file-system";
|
|
9
|
+
import {
|
|
10
|
+
formatRuntimeServerStartedMessage
|
|
11
|
+
} from "../../dev/runtime-server-started-message.js";
|
|
9
12
|
import { parseCliArgs } from "../../utils/parse-cli-args.js";
|
|
13
|
+
import { startupTrace } from "../../diagnostics/startup-trace.js";
|
|
10
14
|
class AbstractApplicationAdapter {
|
|
11
15
|
appConfig;
|
|
12
16
|
serverOptions;
|
|
@@ -15,16 +19,31 @@ class AbstractApplicationAdapter {
|
|
|
15
19
|
apiHandlers = [];
|
|
16
20
|
staticRoutes = [];
|
|
17
21
|
errorHandler;
|
|
18
|
-
|
|
22
|
+
/**
|
|
23
|
+
* App-level WebSocket handlers keyed by URL path pattern (e.g. '/ws/chat/:id').
|
|
24
|
+
* Both Bun and Node adapters read this map to register upgrade routes.
|
|
25
|
+
*/
|
|
26
|
+
websocketHandlers = /* @__PURE__ */ new Map();
|
|
27
|
+
onAppStartCallback;
|
|
28
|
+
runtimeLabel;
|
|
29
|
+
constructor(options, runtimeLabel) {
|
|
30
|
+
this.runtimeLabel = runtimeLabel;
|
|
19
31
|
this.appConfig = options.appConfig;
|
|
20
32
|
this.serverOptions = options.serverOptions || {};
|
|
21
33
|
this.runtimeOptions = options.runtime ?? {};
|
|
34
|
+
if (options.runtime) {
|
|
35
|
+
this.appConfig.runtime = {
|
|
36
|
+
...this.appConfig.runtime ?? {},
|
|
37
|
+
...options.runtime
|
|
38
|
+
};
|
|
39
|
+
}
|
|
22
40
|
this.cliArgs = parseCliArgs({ embeddedRuntime: this.runtimeOptions.embedded });
|
|
23
41
|
const hostModuleLoader = this.runtimeOptions.hostModuleLoader ?? (this.runtimeOptions.embedded ? getHostModuleLoader() : void 0);
|
|
24
42
|
if (hostModuleLoader) {
|
|
25
43
|
setAppHostModuleLoader(this.appConfig, hostModuleLoader);
|
|
26
44
|
}
|
|
27
45
|
getAppModuleLoader(this.appConfig);
|
|
46
|
+
startupTrace.markConfigReady();
|
|
28
47
|
if (options.clearOutput) {
|
|
29
48
|
this.clearDistFolder().catch((error) => {
|
|
30
49
|
appLogger.error("Error clearing dist folder", error);
|
|
@@ -93,6 +112,71 @@ class AbstractApplicationAdapter {
|
|
|
93
112
|
getStaticRoutes() {
|
|
94
113
|
return this.staticRoutes;
|
|
95
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Register a WebSocket handler for the given path pattern.
|
|
117
|
+
*
|
|
118
|
+
* The runtime adapter handles the HTTP→WebSocket upgrade for this path
|
|
119
|
+
* and routes lifecycle events to `handler`.
|
|
120
|
+
*
|
|
121
|
+
* Supports dynamic segments via `:param` syntax. The handler receives
|
|
122
|
+
* typed `params` and `search` fields, and a typed `context` produced by
|
|
123
|
+
* the optional `context()` factory.
|
|
124
|
+
*
|
|
125
|
+
* One pattern registration matches infinite path variations. For example,
|
|
126
|
+
* `app.websocket('/ws/chat/:roomId', handler)` matches `/ws/chat/abc`,
|
|
127
|
+
* `/ws/chat/xyz`, etc. Each connection receives its own `params.roomId`.
|
|
128
|
+
*
|
|
129
|
+
* Works across both Bun and Node runtimes — no runtime-specific imports needed.
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* app.websocket<ChatContext, { roomId: string }>('/ws/chat/:roomId', {
|
|
134
|
+
* async context({ params, search }) {
|
|
135
|
+
* return { username: search.username ?? 'anonymous', roomId: params.roomId };
|
|
136
|
+
* },
|
|
137
|
+
* onConnect(socket) {
|
|
138
|
+
* socket.send(`Welcome to room ${socket.context.roomId}`);
|
|
139
|
+
* },
|
|
140
|
+
* onMessage(socket, message) {
|
|
141
|
+
* if (message.kind === 'text') {
|
|
142
|
+
* socket.send(message.text);
|
|
143
|
+
* }
|
|
144
|
+
* },
|
|
145
|
+
* });
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
websocket(path, handler) {
|
|
149
|
+
invariant(
|
|
150
|
+
typeof path === "string" && path.startsWith("/"),
|
|
151
|
+
`app.websocket(): path must be a string starting with "/", got "${path}".`
|
|
152
|
+
);
|
|
153
|
+
const segments = path.split("/").filter(Boolean);
|
|
154
|
+
const paramNames = /* @__PURE__ */ new Set();
|
|
155
|
+
for (const segment of segments) {
|
|
156
|
+
if (segment.startsWith(":")) {
|
|
157
|
+
const paramName = segment.slice(1);
|
|
158
|
+
invariant(
|
|
159
|
+
paramName.length > 0,
|
|
160
|
+
`app.websocket(): invalid pattern "${path}" \u2014 empty param name in segment ":${paramName}".`
|
|
161
|
+
);
|
|
162
|
+
invariant(
|
|
163
|
+
!paramNames.has(paramName),
|
|
164
|
+
`app.websocket(): invalid pattern "${path}" \u2014 duplicate param name ":${paramName}".`
|
|
165
|
+
);
|
|
166
|
+
paramNames.add(paramName);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
this.websocketHandlers.set(path, handler);
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get the registered WebSocket handlers map.
|
|
174
|
+
*
|
|
175
|
+
* @returns The map of WebSocket route patterns to handlers
|
|
176
|
+
*/
|
|
177
|
+
getWebsocketHandlers() {
|
|
178
|
+
return this.websocketHandlers;
|
|
179
|
+
}
|
|
96
180
|
/**
|
|
97
181
|
* Register a global error handler for all routes.
|
|
98
182
|
* Useful for logging, monitoring integration, and custom error formatting.
|
|
@@ -115,6 +199,72 @@ class AbstractApplicationAdapter {
|
|
|
115
199
|
getErrorHandler() {
|
|
116
200
|
return this.errorHandler;
|
|
117
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Boot the server. When `onAppStart` is passed, it runs once the runtime can take traffic.
|
|
204
|
+
* Embedded apps only register the callback — the host (for example Vite) boots the port.
|
|
205
|
+
*/
|
|
206
|
+
async start(onAppStart) {
|
|
207
|
+
if (onAppStart) {
|
|
208
|
+
this.onAppStartCallback = onAppStart;
|
|
209
|
+
}
|
|
210
|
+
if (this.runtimeOptions.embedded) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
return this.bootServer();
|
|
214
|
+
}
|
|
215
|
+
logServerStarted(origin) {
|
|
216
|
+
appLogger.info(formatRuntimeServerStartedMessage(this.runtimeLabel, origin));
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Invoked by embedded hosts (for example Vite) once the app can take traffic.
|
|
220
|
+
*/
|
|
221
|
+
async handleListening(origin) {
|
|
222
|
+
await this.notifyListening(origin);
|
|
223
|
+
}
|
|
224
|
+
async notifyListening(origin) {
|
|
225
|
+
const normalizedOrigin = origin.replace(/\/$/, "");
|
|
226
|
+
startupTrace.markServerListening();
|
|
227
|
+
if (!this.onAppStartCallback) {
|
|
228
|
+
this.logServerStarted(normalizedOrigin);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
await this.invokeAppStartCallback(normalizedOrigin);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Resolves routes exposed on {@link AppStartInfo}.
|
|
235
|
+
*
|
|
236
|
+
* @remarks
|
|
237
|
+
* Default is empty. Runtime adapters override this to read from the
|
|
238
|
+
* initialized server route registry.
|
|
239
|
+
*/
|
|
240
|
+
async resolveAppRoutes() {
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
async invokeAppStartCallback(origin) {
|
|
244
|
+
let routes = [];
|
|
245
|
+
try {
|
|
246
|
+
routes = await this.resolveAppRoutes();
|
|
247
|
+
} catch (error) {
|
|
248
|
+
appLogger.debug(
|
|
249
|
+
"Failed to resolve app start routes; continuing with empty routes",
|
|
250
|
+
error instanceof Error ? error.message : String(error)
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
this.onAppStartCallback?.({ origin, routes });
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Stops the application server and releases runtime resources.
|
|
257
|
+
*
|
|
258
|
+
* @remarks
|
|
259
|
+
* Subclasses override this to shut down bound servers, watchers, and other
|
|
260
|
+
* dev-time resources. The default implementation is a no-op so embedded
|
|
261
|
+
* adapters that never call `start()` can still be used with `await using`.
|
|
262
|
+
*/
|
|
263
|
+
async stop(_force = true) {
|
|
264
|
+
}
|
|
265
|
+
async [Symbol.asyncDispose]() {
|
|
266
|
+
await this.stop(true);
|
|
267
|
+
}
|
|
118
268
|
}
|
|
119
269
|
export {
|
|
120
270
|
AbstractApplicationAdapter
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function normalizeSegmentPath(pathname: string): string;
|
|
2
|
+
export declare function matchApiPathPattern(pattern: string, pathname: string): Record<string, string | string[]> | null;
|
|
3
|
+
export declare function scoreApiPathPattern(pattern: string): number;
|
|
4
|
+
export declare function matchExplicitStaticPathPattern(pattern: string, pathname: string): Record<string, string> | null;
|
|
5
|
+
export declare function matchColonSegmentPath(pattern: string, pathname: string): Record<string, string> | null;
|
|
6
|
+
export declare function scoreColonSegmentPath(pattern: string): number;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
function normalizeSegmentPath(pathname) {
|
|
2
|
+
if (pathname.length > 1 && pathname.endsWith("/")) {
|
|
3
|
+
return pathname.slice(0, -1);
|
|
4
|
+
}
|
|
5
|
+
return pathname;
|
|
6
|
+
}
|
|
7
|
+
function matchApiPathPattern(pattern, pathname) {
|
|
8
|
+
const normalizedPattern = normalizeSegmentPath(pattern);
|
|
9
|
+
const normalizedPathname = normalizeSegmentPath(pathname);
|
|
10
|
+
const patternSegments = normalizedPattern.split("/").filter(Boolean);
|
|
11
|
+
const pathSegments = normalizedPathname.split("/").filter(Boolean);
|
|
12
|
+
const params = {};
|
|
13
|
+
let patternIndex = 0;
|
|
14
|
+
let pathIndex = 0;
|
|
15
|
+
while (patternIndex < patternSegments.length && pathIndex < pathSegments.length) {
|
|
16
|
+
const patternSegment = patternSegments[patternIndex];
|
|
17
|
+
const pathSegment = pathSegments[pathIndex];
|
|
18
|
+
if (patternSegment === "*") {
|
|
19
|
+
return params;
|
|
20
|
+
}
|
|
21
|
+
if (patternSegment.startsWith("[...") && patternSegment.endsWith("]")) {
|
|
22
|
+
const paramName = patternSegment.slice(4, -1);
|
|
23
|
+
params[paramName] = pathSegments.slice(pathIndex);
|
|
24
|
+
return params;
|
|
25
|
+
}
|
|
26
|
+
if (patternSegment.startsWith(":")) {
|
|
27
|
+
params[patternSegment.slice(1)] = pathSegment;
|
|
28
|
+
patternIndex++;
|
|
29
|
+
pathIndex++;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (patternSegment.startsWith("[") && patternSegment.endsWith("]")) {
|
|
33
|
+
params[patternSegment.slice(1, -1)] = pathSegment;
|
|
34
|
+
patternIndex++;
|
|
35
|
+
pathIndex++;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (patternSegment !== pathSegment) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
patternIndex++;
|
|
42
|
+
pathIndex++;
|
|
43
|
+
}
|
|
44
|
+
if (patternIndex < patternSegments.length) {
|
|
45
|
+
const remaining = patternSegments.slice(patternIndex);
|
|
46
|
+
const catchAll = remaining[0];
|
|
47
|
+
if (remaining.length === 1 && (catchAll === "*" || catchAll.startsWith("[...") && catchAll.endsWith("]"))) {
|
|
48
|
+
if (catchAll.startsWith("[...")) {
|
|
49
|
+
const paramName = catchAll.slice(4, -1);
|
|
50
|
+
params[paramName] = [];
|
|
51
|
+
}
|
|
52
|
+
return params;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
if (pathIndex < pathSegments.length) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return params;
|
|
60
|
+
}
|
|
61
|
+
function scoreApiPathPattern(pattern) {
|
|
62
|
+
const segments = normalizeSegmentPath(pattern).split("/").filter(Boolean);
|
|
63
|
+
let score = 0;
|
|
64
|
+
for (const segment of segments) {
|
|
65
|
+
if (segment === "*" || segment.startsWith("[...") && segment.endsWith("]")) {
|
|
66
|
+
score += 10;
|
|
67
|
+
} else if (segment.startsWith(":") || segment.startsWith("[") && segment.endsWith("]")) {
|
|
68
|
+
score += 50;
|
|
69
|
+
} else {
|
|
70
|
+
score += 100;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return score;
|
|
74
|
+
}
|
|
75
|
+
function matchExplicitStaticPathPattern(pattern, pathname) {
|
|
76
|
+
const patternSegments = normalizeSegmentPath(pattern).split("/").filter(Boolean);
|
|
77
|
+
const pathSegments = normalizeSegmentPath(pathname).split("/").filter(Boolean);
|
|
78
|
+
if (patternSegments.length !== pathSegments.length) {
|
|
79
|
+
const lastPattern = patternSegments[patternSegments.length - 1];
|
|
80
|
+
const isCatchAll = lastPattern?.startsWith("[...") || lastPattern?.startsWith(":...");
|
|
81
|
+
if (!isCatchAll) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const params = {};
|
|
86
|
+
for (let i = 0; i < patternSegments.length; i++) {
|
|
87
|
+
const patternPart = patternSegments[i];
|
|
88
|
+
const pathPart = pathSegments[i];
|
|
89
|
+
if (patternPart.startsWith(":...") || patternPart.startsWith("[...")) {
|
|
90
|
+
const paramName = patternPart.replace(/^(:\.\.\.|\[\.\.\.)/, "").replace(/\]$/, "");
|
|
91
|
+
params[paramName] = pathSegments.slice(i).join("/");
|
|
92
|
+
return params;
|
|
93
|
+
}
|
|
94
|
+
if (patternPart.startsWith(":")) {
|
|
95
|
+
params[patternPart.slice(1)] = pathPart;
|
|
96
|
+
} else if (patternPart.startsWith("[") && patternPart.endsWith("]")) {
|
|
97
|
+
params[patternPart.slice(1, -1)] = pathPart;
|
|
98
|
+
} else if (patternPart !== pathPart) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return params;
|
|
103
|
+
}
|
|
104
|
+
function matchColonSegmentPath(pattern, pathname) {
|
|
105
|
+
const patternSegments = pattern.split("/").filter(Boolean);
|
|
106
|
+
const pathSegments = pathname.split("/").filter(Boolean);
|
|
107
|
+
if (patternSegments.length !== pathSegments.length) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const params = {};
|
|
111
|
+
for (let i = 0; i < patternSegments.length; i++) {
|
|
112
|
+
const patternSegment = patternSegments[i];
|
|
113
|
+
const pathSegment = pathSegments[i];
|
|
114
|
+
if (!patternSegment || !pathSegment) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (patternSegment.startsWith(":")) {
|
|
118
|
+
const paramName = patternSegment.slice(1);
|
|
119
|
+
if (!paramName) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
params[paramName] = pathSegment;
|
|
123
|
+
} else if (patternSegment !== pathSegment) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return params;
|
|
128
|
+
}
|
|
129
|
+
function scoreColonSegmentPath(pattern) {
|
|
130
|
+
const segments = pattern.split("/").filter(Boolean);
|
|
131
|
+
let literals = 0;
|
|
132
|
+
let dynamics = 0;
|
|
133
|
+
for (const segment of segments) {
|
|
134
|
+
if (segment.startsWith(":")) {
|
|
135
|
+
dynamics += 1;
|
|
136
|
+
} else {
|
|
137
|
+
literals += 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return literals * 100 - dynamics * 10 + segments.length;
|
|
141
|
+
}
|
|
142
|
+
export {
|
|
143
|
+
matchApiPathPattern,
|
|
144
|
+
matchColonSegmentPath,
|
|
145
|
+
matchExplicitStaticPathPattern,
|
|
146
|
+
normalizeSegmentPath,
|
|
147
|
+
scoreApiPathPattern,
|
|
148
|
+
scoreColonSegmentPath
|
|
149
|
+
};
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
10
10
|
import type { ApiHandler } from '../../types/public-types.js';
|
|
11
|
+
import type { StaticGenerationRoute } from '../../router/server/route-registry.js';
|
|
11
12
|
/**
|
|
12
13
|
* Configuration options for all server adapters
|
|
13
14
|
*/
|
|
@@ -31,7 +32,19 @@ export interface ServerAdapterResult {
|
|
|
31
32
|
}) => any;
|
|
32
33
|
buildStatic: (options?: {
|
|
33
34
|
preview?: boolean;
|
|
34
|
-
|
|
35
|
+
force?: boolean;
|
|
36
|
+
}) => Promise<string | undefined>;
|
|
37
|
+
servePreviewOnly: () => Promise<string | undefined>;
|
|
38
|
+
dispose(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Lists static-generation routes for app-start consumers.
|
|
41
|
+
*
|
|
42
|
+
* @remarks
|
|
43
|
+
* Optional so lightweight adapter stubs in tests need not implement routing.
|
|
44
|
+
*/
|
|
45
|
+
listStaticGenerationRoutes?: (input: {
|
|
46
|
+
runtimeOrigin: string;
|
|
47
|
+
}) => Promise<readonly StaticGenerationRoute[]>;
|
|
35
48
|
}
|
|
36
49
|
/**
|
|
37
50
|
* Abstract base class for server adapters across different runtimes
|
|
@@ -57,7 +70,8 @@ export declare abstract class AbstractServerAdapter<TOptions extends ServerAdapt
|
|
|
57
70
|
*/
|
|
58
71
|
abstract buildStatic(options?: {
|
|
59
72
|
preview?: boolean;
|
|
60
|
-
|
|
73
|
+
force?: boolean;
|
|
74
|
+
}): Promise<string | undefined>;
|
|
61
75
|
/**
|
|
62
76
|
* Factory method to create a server adapter with runtime-specific functionality
|
|
63
77
|
*/
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EcopagesWebSocketHandler } from '../../types/public-types.js';
|
|
2
|
+
export type WebSocketRouteMatch = {
|
|
3
|
+
handler: EcopagesWebSocketHandler<any, any>;
|
|
4
|
+
params: Record<string, string>;
|
|
5
|
+
kind: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Pattern matcher for WebSocket route paths.
|
|
9
|
+
*/
|
|
10
|
+
export declare function matchWebSocketPath(pattern: string, pathname: string): Record<string, string> | null;
|
|
11
|
+
export declare function scoreWebSocketPattern(pattern: string): number;
|
|
12
|
+
export declare function findWebSocketRoute(handlers: Map<string, EcopagesWebSocketHandler<any, any>>, pathname: string): WebSocketRouteMatch | null;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { matchColonSegmentPath, scoreColonSegmentPath } from "./segment-path-matcher.js";
|
|
2
|
+
function matchWebSocketPath(pattern, pathname) {
|
|
3
|
+
return matchColonSegmentPath(pattern, pathname);
|
|
4
|
+
}
|
|
5
|
+
function scoreWebSocketPattern(pattern) {
|
|
6
|
+
return scoreColonSegmentPath(pattern);
|
|
7
|
+
}
|
|
8
|
+
function findWebSocketRoute(handlers, pathname) {
|
|
9
|
+
let best = null;
|
|
10
|
+
let index = 0;
|
|
11
|
+
for (const [pattern, handler] of handlers) {
|
|
12
|
+
const params = matchColonSegmentPath(pattern, pathname);
|
|
13
|
+
if (params === null) {
|
|
14
|
+
index += 1;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const score = scoreColonSegmentPath(pattern);
|
|
18
|
+
const match = { handler, params, kind: pattern };
|
|
19
|
+
if (best === null || score > best.score || score === best.score && index < best.index) {
|
|
20
|
+
best = { score, match, index };
|
|
21
|
+
}
|
|
22
|
+
index += 1;
|
|
23
|
+
}
|
|
24
|
+
return best?.match ?? null;
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
findWebSocketRoute,
|
|
28
|
+
matchWebSocketPath,
|
|
29
|
+
scoreWebSocketPattern
|
|
30
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ServerWebSocket } from 'bun';
|
|
2
|
+
import type { EcopagesSocket, EcopagesWebSocketHandler } from '../../types/public-types.js';
|
|
3
|
+
export type BunUserWebSocketData = {
|
|
4
|
+
kind: string;
|
|
5
|
+
params: Record<string, string>;
|
|
6
|
+
search: Record<string, string>;
|
|
7
|
+
upgradeUrl?: string;
|
|
8
|
+
context?: unknown;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
};
|
|
11
|
+
export type BunUserWebSocketLifecycleDeps<TWsData extends BunUserWebSocketData> = {
|
|
12
|
+
runtimeOrigin: string;
|
|
13
|
+
userHandlers: Map<string, EcopagesWebSocketHandler<any, any>>;
|
|
14
|
+
resolveContext: <TContext, TParams extends Record<string, string>>(request: Request, handler: EcopagesWebSocketHandler<TContext, TParams>, kind: string, params: TParams, search: Record<string, string>) => Promise<TContext>;
|
|
15
|
+
adaptSocket: <TContext, TParams extends Record<string, string>>(ws: ServerWebSocket<TWsData>, kind: string, params: TParams, search: Record<string, string>, context: TContext) => EcopagesSocket<TContext, TParams>;
|
|
16
|
+
};
|
|
17
|
+
export declare function createBunUserWebSocketLifecycle<TWsData extends BunUserWebSocketData>(deps: BunUserWebSocketLifecycleDeps<TWsData>): {
|
|
18
|
+
open(ws: ServerWebSocket<TWsData>): void;
|
|
19
|
+
message(ws: ServerWebSocket<TWsData>, msg: string | Buffer): void;
|
|
20
|
+
close(ws: ServerWebSocket<TWsData>, code: number, reason: string): void;
|
|
21
|
+
error(ws: ServerWebSocket<TWsData>, error: Error): void;
|
|
22
|
+
};
|