@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
package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts}
RENAMED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
1
|
+
import type { EcoPagesAppConfig, IHmrManager } from '../../../types/internal-types.js';
|
|
2
|
+
import type { EcoBuildPlugin } from '../../../build/contracts/build-types.js';
|
|
3
|
+
import type { StaticRoute } from '../../../types/public-types.js';
|
|
4
|
+
import type { RouteRegistry } from '../../../router/server/route-registry.js';
|
|
5
|
+
import type { StaticSiteGenerator } from '../../../static-site-generator/static-site-generator.js';
|
|
6
|
+
import type { StaticGenerationRendererResolver } from '../../../route-renderer/route-renderer.js';
|
|
6
7
|
export interface StaticBuildOptions {
|
|
7
|
-
preview?: boolean;
|
|
8
8
|
baseUrl?: string;
|
|
9
|
+
force?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export interface ServeOptions {
|
|
11
12
|
hostname?: string;
|
|
@@ -15,10 +16,17 @@ export interface ServerStaticBuilderParams {
|
|
|
15
16
|
appConfig: EcoPagesAppConfig;
|
|
16
17
|
staticSiteGenerator: StaticSiteGenerator;
|
|
17
18
|
serveOptions: ServeOptions;
|
|
18
|
-
|
|
19
|
+
runtimeOrigin: string;
|
|
20
|
+
/**
|
|
21
|
+
* Whether the app requires a server entry bundle for production use.
|
|
22
|
+
* When `true`, the build step bundles the server entry file for `ecopages start`.
|
|
23
|
+
* Defaults to `false` (static-only build, no server needed).
|
|
24
|
+
*/
|
|
25
|
+
needsServerBundle?: boolean;
|
|
19
26
|
logger?: ServerStaticBuilderLogger;
|
|
20
|
-
previewServerFactory?: ServerStaticPreviewServerFactory;
|
|
21
27
|
entryFile?: string;
|
|
28
|
+
hmrManager?: IHmrManager;
|
|
29
|
+
onRuntimePlugin?: (plugin: EcoBuildPlugin) => void;
|
|
22
30
|
}
|
|
23
31
|
/**
|
|
24
32
|
* Minimal logger dependency used by the static builder.
|
|
@@ -26,53 +34,38 @@ export interface ServerStaticBuilderParams {
|
|
|
26
34
|
export interface ServerStaticBuilderLogger {
|
|
27
35
|
warn(message: string, detail?: string): unknown;
|
|
28
36
|
info(message: string): unknown;
|
|
37
|
+
debug(message: string): unknown;
|
|
29
38
|
error(message: string): unknown;
|
|
30
39
|
}
|
|
31
40
|
/**
|
|
32
|
-
*
|
|
33
|
-
*/
|
|
34
|
-
export interface ServerStaticPreviewServerFactory {
|
|
35
|
-
createServer(args: {
|
|
36
|
-
appConfig: EcoPagesAppConfig;
|
|
37
|
-
options: {
|
|
38
|
-
port: number;
|
|
39
|
-
};
|
|
40
|
-
}): {
|
|
41
|
-
server?: {
|
|
42
|
-
port?: number;
|
|
43
|
-
} | null;
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Handles static site generation and previews.
|
|
41
|
+
* Handles static site generation.
|
|
48
42
|
*/
|
|
49
43
|
export declare class ServerStaticBuilder {
|
|
50
44
|
private readonly appConfig;
|
|
51
45
|
private readonly staticSiteGenerator;
|
|
52
46
|
private readonly serveOptions;
|
|
53
|
-
private readonly
|
|
47
|
+
private readonly runtimeOrigin;
|
|
48
|
+
private readonly needsServerBundle;
|
|
54
49
|
private readonly logger;
|
|
55
|
-
private readonly previewServerFactory;
|
|
56
50
|
private readonly entryFile;
|
|
57
|
-
|
|
58
|
-
private
|
|
51
|
+
private readonly hmrManager?;
|
|
52
|
+
private readonly onRuntimePlugin?;
|
|
53
|
+
constructor({ appConfig, staticSiteGenerator, serveOptions, runtimeOrigin, needsServerBundle, logger, entryFile, hmrManager, onRuntimePlugin, }: ServerStaticBuilderParams);
|
|
59
54
|
private prepareExportDirectory;
|
|
60
55
|
private refreshRuntimeAssets;
|
|
61
56
|
/**
|
|
62
57
|
* Bundles the server entry file for production use.
|
|
63
58
|
*
|
|
64
59
|
* @remarks
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* `ecopages start` in production.
|
|
60
|
+
* Only invoked when the app requires a runtime server (API handlers,
|
|
61
|
+
* websocket handlers, etc.). Static-only apps skip this step entirely.
|
|
62
|
+
* Incremental builds may skip Rolldown when the `.eco/.server-entry`
|
|
63
|
+
* cache is still valid.
|
|
70
64
|
*
|
|
71
65
|
* Package imports remain external so native addons and runtime-owned
|
|
72
66
|
* dependencies continue to load through the app's installed
|
|
73
67
|
* `node_modules` tree. Only the app entry graph is bundled.
|
|
74
68
|
*
|
|
75
|
-
* Skips silently when no API endpoints are registered (static-only site).
|
|
76
69
|
* Throws if the build adapter is unavailable, is owned by a host
|
|
77
70
|
* runtime, or bundling fails.
|
|
78
71
|
*
|
|
@@ -81,7 +74,6 @@ export declare class ServerStaticBuilder {
|
|
|
81
74
|
private bundleServerEntry;
|
|
82
75
|
/**
|
|
83
76
|
* Generates a static build of the site for deployment.
|
|
84
|
-
* @param options.preview - If true, starts a preview server after build
|
|
85
77
|
* @param dependencies.router - The initialized router
|
|
86
78
|
* @param dependencies.routeRendererFactory - The route renderer factory
|
|
87
79
|
* @param dependencies.staticRoutes - Explicit static routes registered via app.static()
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
3
|
+
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../../config/constants.js";
|
|
4
|
+
import { appLogger } from "../../../global/app-logger.js";
|
|
5
|
+
import { build, getAppBuildAdapter, setupAppRuntimePlugins } from "../../../build/build-adapter.js";
|
|
6
|
+
import { createServerBuildRequest } from "../../../build/runtime/build-request-policy.js";
|
|
7
|
+
import { requireBuildRuntime } from "../../../build/runtime/build-runtime.js";
|
|
8
|
+
import { attachHmrToIntegrations } from "./runtime-server-lifecycle.js";
|
|
9
|
+
import {
|
|
10
|
+
getServerBundleOutputPaths,
|
|
11
|
+
lookupServerEntryBuildCache,
|
|
12
|
+
recordServerEntryBuildCache,
|
|
13
|
+
writeServerBundleDeployManifest
|
|
14
|
+
} from "../../../build/cache/server-entry-build-cache.js";
|
|
15
|
+
import {
|
|
16
|
+
clearProductionBuildCaches,
|
|
17
|
+
shouldResetStaticExportDirectory
|
|
18
|
+
} from "../../../static-site-generator/static-build-invalidation.js";
|
|
19
|
+
import { resolveEntryFile, SERVER_BUNDLE_FILENAME } from "../../../utils/resolve-entry-file.js";
|
|
20
|
+
class ServerStaticBuilder {
|
|
21
|
+
appConfig;
|
|
22
|
+
staticSiteGenerator;
|
|
23
|
+
serveOptions;
|
|
24
|
+
runtimeOrigin;
|
|
25
|
+
needsServerBundle;
|
|
26
|
+
logger;
|
|
27
|
+
entryFile;
|
|
28
|
+
hmrManager;
|
|
29
|
+
onRuntimePlugin;
|
|
30
|
+
constructor({
|
|
31
|
+
appConfig,
|
|
32
|
+
staticSiteGenerator,
|
|
33
|
+
serveOptions,
|
|
34
|
+
runtimeOrigin,
|
|
35
|
+
needsServerBundle,
|
|
36
|
+
logger,
|
|
37
|
+
entryFile,
|
|
38
|
+
hmrManager,
|
|
39
|
+
onRuntimePlugin
|
|
40
|
+
}) {
|
|
41
|
+
this.appConfig = appConfig;
|
|
42
|
+
this.staticSiteGenerator = staticSiteGenerator;
|
|
43
|
+
this.serveOptions = serveOptions;
|
|
44
|
+
this.runtimeOrigin = runtimeOrigin;
|
|
45
|
+
this.needsServerBundle = needsServerBundle ?? false;
|
|
46
|
+
this.logger = logger ?? appLogger;
|
|
47
|
+
this.entryFile = resolveEntryFile({ entryFile });
|
|
48
|
+
this.hmrManager = hmrManager;
|
|
49
|
+
this.onRuntimePlugin = onRuntimePlugin;
|
|
50
|
+
}
|
|
51
|
+
prepareExportDirectory(force) {
|
|
52
|
+
if (force) {
|
|
53
|
+
clearProductionBuildCaches(this.appConfig);
|
|
54
|
+
}
|
|
55
|
+
const exportDir = this.appConfig.absolutePaths?.distDir ?? path.join(this.appConfig.rootDir, this.appConfig.distDir);
|
|
56
|
+
const shouldCleanDist = shouldResetStaticExportDirectory(this.appConfig, force);
|
|
57
|
+
fileSystem.ensureDir(exportDir, shouldCleanDist);
|
|
58
|
+
if (shouldCleanDist) {
|
|
59
|
+
this.appConfig.runtime = {
|
|
60
|
+
...this.appConfig.runtime ?? {},
|
|
61
|
+
runtimeAssetsPrepared: false
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const srcPublicDir = path.join(
|
|
65
|
+
this.appConfig.rootDir,
|
|
66
|
+
this.appConfig.srcDir ?? "src",
|
|
67
|
+
this.appConfig.publicDir ?? "public"
|
|
68
|
+
);
|
|
69
|
+
if (fileSystem.exists(srcPublicDir)) {
|
|
70
|
+
fileSystem.copyDir(srcPublicDir, exportDir);
|
|
71
|
+
}
|
|
72
|
+
return !shouldCleanDist;
|
|
73
|
+
}
|
|
74
|
+
async refreshRuntimeAssets() {
|
|
75
|
+
appLogger.debugTime("refreshRuntimeAssets");
|
|
76
|
+
try {
|
|
77
|
+
await setupAppRuntimePlugins({
|
|
78
|
+
appConfig: this.appConfig,
|
|
79
|
+
runtimeOrigin: this.runtimeOrigin,
|
|
80
|
+
onRuntimePlugin: this.onRuntimePlugin
|
|
81
|
+
});
|
|
82
|
+
if (this.hmrManager?.isEnabled()) {
|
|
83
|
+
attachHmrToIntegrations(this.appConfig, this.hmrManager);
|
|
84
|
+
}
|
|
85
|
+
} finally {
|
|
86
|
+
appLogger.debugTimeEnd("refreshRuntimeAssets");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Bundles the server entry file for production use.
|
|
91
|
+
*
|
|
92
|
+
* @remarks
|
|
93
|
+
* Only invoked when the app requires a runtime server (API handlers,
|
|
94
|
+
* websocket handlers, etc.). Static-only apps skip this step entirely.
|
|
95
|
+
* Incremental builds may skip Rolldown when the `.eco/.server-entry`
|
|
96
|
+
* cache is still valid.
|
|
97
|
+
*
|
|
98
|
+
* Package imports remain external so native addons and runtime-owned
|
|
99
|
+
* dependencies continue to load through the app's installed
|
|
100
|
+
* `node_modules` tree. Only the app entry graph is bundled.
|
|
101
|
+
*
|
|
102
|
+
* Throws if the build adapter is unavailable, is owned by a host
|
|
103
|
+
* runtime, or bundling fails.
|
|
104
|
+
*
|
|
105
|
+
* @throws If the build adapter is unavailable, is host-owned, or bundling fails.
|
|
106
|
+
*/
|
|
107
|
+
async bundleServerEntry(options) {
|
|
108
|
+
const buildAdapter = getAppBuildAdapter(this.appConfig);
|
|
109
|
+
if (buildAdapter.ownership === "vite-host") {
|
|
110
|
+
throw new Error(
|
|
111
|
+
'Cannot bundle the server entry file: build ownership is "vite-host". The host runtime is expected to produce its own server bundle.'
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
const entryPath = path.isAbsolute(this.entryFile) ? this.entryFile : path.join(this.appConfig.rootDir, this.entryFile);
|
|
115
|
+
if (!fileSystem.exists(entryPath)) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
`Cannot bundle server entry: file "${this.entryFile}" not found in "${this.appConfig.rootDir}".`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
const { serverOutdir, serverEntryPath } = getServerBundleOutputPaths(this.appConfig);
|
|
121
|
+
const cached = lookupServerEntryBuildCache({
|
|
122
|
+
appConfig: this.appConfig,
|
|
123
|
+
entryPath,
|
|
124
|
+
force: options?.force
|
|
125
|
+
});
|
|
126
|
+
if (cached) {
|
|
127
|
+
const hasBundle = cached.outputPaths.some(
|
|
128
|
+
(outputPath) => path.resolve(outputPath) === path.resolve(serverEntryPath) && fileSystem.exists(outputPath)
|
|
129
|
+
);
|
|
130
|
+
if (hasBundle) {
|
|
131
|
+
this.logger.info("Reusing cached server entry bundle");
|
|
132
|
+
writeServerBundleDeployManifest(this.appConfig, serverEntryPath);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
this.logger.info("Bundling server entry file...");
|
|
137
|
+
const buildOptions = createServerBuildRequest(this.appConfig, {
|
|
138
|
+
profile: "server-entry",
|
|
139
|
+
entrypoints: [entryPath],
|
|
140
|
+
outdir: serverOutdir,
|
|
141
|
+
naming: SERVER_BUNDLE_FILENAME,
|
|
142
|
+
sourcemap: "hidden"
|
|
143
|
+
});
|
|
144
|
+
const result = await build(buildOptions, requireBuildRuntime(this.appConfig).getProfile("server-entry"));
|
|
145
|
+
if (!result.success) {
|
|
146
|
+
const errorMessages = result.logs.map((log) => log.message).join("\n");
|
|
147
|
+
throw new Error(`Failed to bundle server entry file:
|
|
148
|
+
${errorMessages}`);
|
|
149
|
+
}
|
|
150
|
+
const outputPaths = result.outputs.length > 0 ? result.outputs.map((output) => output.path) : fileSystem.exists(serverEntryPath) ? [serverEntryPath] : [];
|
|
151
|
+
recordServerEntryBuildCache({
|
|
152
|
+
appConfig: this.appConfig,
|
|
153
|
+
entryPath,
|
|
154
|
+
buildResult: result,
|
|
155
|
+
outputPaths
|
|
156
|
+
});
|
|
157
|
+
writeServerBundleDeployManifest(this.appConfig, serverEntryPath);
|
|
158
|
+
this.logger.info("Server entry file bundled successfully");
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Generates a static build of the site for deployment.
|
|
162
|
+
* @param dependencies.router - The initialized router
|
|
163
|
+
* @param dependencies.routeRendererFactory - The route renderer factory
|
|
164
|
+
* @param dependencies.staticRoutes - Explicit static routes registered via app.static()
|
|
165
|
+
*/
|
|
166
|
+
async build(options, dependencies) {
|
|
167
|
+
const { baseUrl: explicitBaseUrl, force = false } = options ?? {};
|
|
168
|
+
const baseUrl = explicitBaseUrl ?? `http://${this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${this.serveOptions.port || DEFAULT_ECOPAGES_PORT}`;
|
|
169
|
+
const preserveExportDirectory = this.prepareExportDirectory(force);
|
|
170
|
+
await this.refreshRuntimeAssets();
|
|
171
|
+
if (this.needsServerBundle) {
|
|
172
|
+
await this.bundleServerEntry({ force });
|
|
173
|
+
}
|
|
174
|
+
await this.staticSiteGenerator.run({
|
|
175
|
+
router: dependencies.router,
|
|
176
|
+
baseUrl,
|
|
177
|
+
routeRendererFactory: dependencies.routeRendererFactory,
|
|
178
|
+
staticRoutes: dependencies.staticRoutes,
|
|
179
|
+
force,
|
|
180
|
+
preserveExportDirectory
|
|
181
|
+
});
|
|
182
|
+
if (process.env.ECOPAGES_BENCH === "1" && process.env.ECOPAGES_BENCH_VERBOSE !== "1") {
|
|
183
|
+
this.logger.debug("Build completed");
|
|
184
|
+
} else {
|
|
185
|
+
this.logger.info("Build completed");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export {
|
|
190
|
+
ServerStaticBuilder
|
|
191
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
|
|
2
2
|
export interface StaticPreviewHost {
|
|
3
3
|
start(options: StaticPreviewHostStartOptions): Promise<number | null>;
|
|
4
4
|
stop(force?: boolean): Promise<void>;
|
|
@@ -7,4 +7,9 @@ export interface StaticPreviewHostStartOptions {
|
|
|
7
7
|
appConfig: EcoPagesAppConfig;
|
|
8
8
|
hostname: string;
|
|
9
9
|
port: number;
|
|
10
|
+
/**
|
|
11
|
+
* When true, bind to the next available port if the preferred one is busy.
|
|
12
|
+
* Should remain false when the port was explicitly configured.
|
|
13
|
+
*/
|
|
14
|
+
allowPortFallback?: boolean;
|
|
10
15
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Duplex } from 'node:stream';
|
|
2
|
+
import type { Server as NodeHttpServer, IncomingMessage } from 'node:http';
|
|
3
|
+
import type { EcopagesWebSocketHandler } from '../../../types/public-types.js';
|
|
4
|
+
export type NodeHttpWebSocketUpgradePreflight = (req: IncomingMessage, socket: Duplex, head: Buffer) => boolean;
|
|
5
|
+
export type AttachNodeHttpWebSocketUpgradesOptions = {
|
|
6
|
+
runtimeOrigin: string;
|
|
7
|
+
websocketHandlers: Map<string, EcopagesWebSocketHandler<any, any>>;
|
|
8
|
+
/**
|
|
9
|
+
* When true, unmatched upgrade requests are left for other listeners (e.g.
|
|
10
|
+
* Vite HMR). When false, unmatched upgrades are destroyed immediately.
|
|
11
|
+
*/
|
|
12
|
+
passthroughUnmatched?: boolean;
|
|
13
|
+
preflight?: NodeHttpWebSocketUpgradePreflight;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Wires Ecopages user WebSocket routes onto a Node HTTP server's `upgrade` event.
|
|
17
|
+
*
|
|
18
|
+
* Used by the Node adapter in standalone mode and by host integrations such as
|
|
19
|
+
* the Vite plugin that embed Ecopages behind a foreign HTTP server.
|
|
20
|
+
*/
|
|
21
|
+
export declare function attachNodeHttpWebSocketUpgrades(server: NodeHttpServer, options: AttachNodeHttpWebSocketUpgradesOptions): void;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { WebSocketServer } from "ws";
|
|
2
|
+
import { appLogger } from "../../../global/app-logger.js";
|
|
3
|
+
import { findWebSocketRoute } from "../../abstract/ws-pattern-matcher.js";
|
|
4
|
+
import { createEcopagesSocket, invokeWebSocketHandlerHook, toWebSocketCloseInfo } from "./websocket-lifecycle.js";
|
|
5
|
+
const attachedUpgradeServers = /* @__PURE__ */ new WeakSet();
|
|
6
|
+
function adaptNodeWebSocket(ws, kind, params, search, context) {
|
|
7
|
+
return createEcopagesSocket(
|
|
8
|
+
{
|
|
9
|
+
send: (data) => ws.send(data),
|
|
10
|
+
close: (code, reason) => ws.close(code, reason)
|
|
11
|
+
},
|
|
12
|
+
{ kind, params, search, context }
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
function toUpgradeRequest(runtimeOrigin, req) {
|
|
16
|
+
const upgradeUrl = new URL(req.url ?? "/", runtimeOrigin);
|
|
17
|
+
return new Request(upgradeUrl, {
|
|
18
|
+
method: req.method,
|
|
19
|
+
headers: req.headers
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function resolveNodeContext(request, handler, kind, params, search) {
|
|
23
|
+
if (!handler.context) {
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
return await handler.context({ request, kind, params, search });
|
|
28
|
+
} catch (error) {
|
|
29
|
+
appLogger.error(`[WS:${kind}] context() failed; closing connection.`, error);
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function setupNodeWebSocketConnection(ws, wsMatch, req, runtimeOrigin, search) {
|
|
34
|
+
const handler = wsMatch.handler;
|
|
35
|
+
const baseRequest = toUpgradeRequest(runtimeOrigin, req);
|
|
36
|
+
let context;
|
|
37
|
+
try {
|
|
38
|
+
context = await resolveNodeContext(baseRequest, handler, wsMatch.kind, wsMatch.params, search);
|
|
39
|
+
} catch {
|
|
40
|
+
ws.close(1011, "context initialization failed");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const socket = adaptNodeWebSocket(ws, wsMatch.kind, wsMatch.params, search, context);
|
|
44
|
+
try {
|
|
45
|
+
await handler.onConnect?.(socket);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
appLogger.error(`[WS:${wsMatch.kind}] onConnect failed:`, error);
|
|
48
|
+
ws.close(1011, "onConnect failed");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
ws.on("message", (msg, isBinary) => {
|
|
52
|
+
const message = isBinary ? {
|
|
53
|
+
kind: "binary",
|
|
54
|
+
data: msg instanceof ArrayBuffer ? new Uint8Array(msg) : Array.isArray(msg) ? new Uint8Array(Buffer.concat(msg)) : new Uint8Array(msg)
|
|
55
|
+
} : { kind: "text", text: msg.toString() };
|
|
56
|
+
invokeWebSocketHandlerHook(wsMatch.kind, "onMessage", handler.onMessage?.(socket, message));
|
|
57
|
+
});
|
|
58
|
+
ws.on("close", (code, reason) => {
|
|
59
|
+
const event = toWebSocketCloseInfo(code, reason.toString());
|
|
60
|
+
invokeWebSocketHandlerHook(wsMatch.kind, "onClose", handler.onClose?.(socket, event));
|
|
61
|
+
});
|
|
62
|
+
ws.on("error", (err) => {
|
|
63
|
+
appLogger.error(`[WS:${wsMatch.kind}] error:`, err);
|
|
64
|
+
invokeWebSocketHandlerHook(wsMatch.kind, "onError", handler.onError?.(socket, err));
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function attachNodeHttpWebSocketUpgrades(server, options) {
|
|
68
|
+
if (options.websocketHandlers.size === 0) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (attachedUpgradeServers.has(server)) {
|
|
72
|
+
appLogger.warn("[WS] WebSocket upgrades already attached to this HTTP server; skipping duplicate attach.");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
attachedUpgradeServers.add(server);
|
|
76
|
+
const userWss = new WebSocketServer({ noServer: true });
|
|
77
|
+
server.on("upgrade", (req, socket, head) => {
|
|
78
|
+
if (options.preflight?.(req, socket, head)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const url = new URL(req.url ?? "/", options.runtimeOrigin);
|
|
82
|
+
const wsMatch = findWebSocketRoute(options.websocketHandlers, url.pathname);
|
|
83
|
+
if (!wsMatch) {
|
|
84
|
+
if (!options.passthroughUnmatched) {
|
|
85
|
+
socket.destroy();
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
userWss.handleUpgrade(req, socket, head, (ws) => {
|
|
90
|
+
const search = Object.fromEntries(url.searchParams.entries());
|
|
91
|
+
void setupNodeWebSocketConnection(ws, wsMatch, req, options.runtimeOrigin, search).catch((error) => {
|
|
92
|
+
appLogger.error(`[WS:${wsMatch.kind}] unexpected error:`, error);
|
|
93
|
+
ws.close(1011, "internal error");
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
attachNodeHttpWebSocketUpgrades
|
|
100
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { EcopagesSocket, WebSocketCloseInfo } from '../../../types/public-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* @remarks
|
|
4
|
+
* Bun and Node expose different raw socket types but share the same
|
|
5
|
+
* {@link OutgoingWebSocketMessage} contract. Adapters supply only `send`/`close`;
|
|
6
|
+
* {@link createEcopagesSocket} owns message normalization and stream forwarding.
|
|
7
|
+
*/
|
|
8
|
+
export interface WebSocketSendTransport {
|
|
9
|
+
send(data: string | Uint8Array): void;
|
|
10
|
+
close(code?: number, reason?: string): void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @remarks
|
|
14
|
+
* Bun and Node adapters previously duplicated outgoing-message dispatch and
|
|
15
|
+
* stream forwarding; this is the shared implementation both transports delegate to.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createEcopagesSocket<TContext, TParams extends Record<string, string>>(transport: WebSocketSendTransport, meta: {
|
|
18
|
+
kind: string;
|
|
19
|
+
params: TParams;
|
|
20
|
+
search: Record<string, string>;
|
|
21
|
+
context: TContext;
|
|
22
|
+
}): EcopagesSocket<TContext, TParams>;
|
|
23
|
+
export declare function toWebSocketCloseInfo(code: number, reason: string): WebSocketCloseInfo;
|
|
24
|
+
export declare function invokeWebSocketHandlerHook(kind: string, hookName: string, result: void | Promise<void>): void;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { appLogger } from "../../../global/app-logger.js";
|
|
2
|
+
function sendOutgoingMessage(transport, message) {
|
|
3
|
+
if (typeof message === "string") {
|
|
4
|
+
transport.send(message);
|
|
5
|
+
} else if (message instanceof Blob) {
|
|
6
|
+
void message.arrayBuffer().then((buffer) => transport.send(new Uint8Array(buffer)));
|
|
7
|
+
} else if (message instanceof ArrayBuffer) {
|
|
8
|
+
transport.send(new Uint8Array(message));
|
|
9
|
+
} else if (ArrayBuffer.isView(message)) {
|
|
10
|
+
transport.send(new Uint8Array(message.buffer, message.byteOffset, message.byteLength));
|
|
11
|
+
} else {
|
|
12
|
+
transport.send(message);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function createEcopagesSocket(transport, meta) {
|
|
16
|
+
return {
|
|
17
|
+
kind: meta.kind,
|
|
18
|
+
params: meta.params,
|
|
19
|
+
search: meta.search,
|
|
20
|
+
context: meta.context,
|
|
21
|
+
send: (message) => sendOutgoingMessage(transport, message),
|
|
22
|
+
sendStream: async (stream) => {
|
|
23
|
+
const reader = stream.getReader();
|
|
24
|
+
try {
|
|
25
|
+
while (true) {
|
|
26
|
+
const { value, done } = await reader.read();
|
|
27
|
+
if (done) break;
|
|
28
|
+
if (value) transport.send(value);
|
|
29
|
+
}
|
|
30
|
+
} finally {
|
|
31
|
+
reader.releaseLock();
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
close: (code, reason) => transport.close(code, reason)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function toWebSocketCloseInfo(code, reason) {
|
|
38
|
+
return {
|
|
39
|
+
code,
|
|
40
|
+
reason,
|
|
41
|
+
wasClean: code === 1e3 || code === 1001
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function invokeWebSocketHandlerHook(kind, hookName, result) {
|
|
45
|
+
if (result instanceof Promise) {
|
|
46
|
+
result.catch((error) => {
|
|
47
|
+
appLogger.error(`[WS:${kind}] ${hookName} failed:`, error);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
createEcopagesSocket,
|
|
53
|
+
invokeWebSocketHandlerHook,
|
|
54
|
+
toWebSocketCloseInfo
|
|
55
|
+
};
|