@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
|
@@ -6,19 +6,31 @@ import { invariant } from "../../utils/invariant.js";
|
|
|
6
6
|
import { HttpError } from "../../errors/http-error.js";
|
|
7
7
|
import { DependencyResolverService } from "../page-loading/dependency-resolver.js";
|
|
8
8
|
import { PageModuleLoaderService } from "../page-loading/page-module-loader.js";
|
|
9
|
-
import { OwnershipValidationService } from "./ownership-validation.service.js";
|
|
9
|
+
import { OwnershipValidationService } from "./ownership-graph/ownership-validation.service.js";
|
|
10
|
+
import { hasForeignChildDescendantsInGraph } from "./ownership-graph/component-graph-collectors.js";
|
|
10
11
|
import {
|
|
11
12
|
RouteRenderOrchestrator
|
|
12
|
-
} from "./route-render-orchestrator.js";
|
|
13
|
-
import {
|
|
13
|
+
} from "./route-pipeline/route-render-orchestrator.js";
|
|
14
|
+
import { createIntegrationRouteRenderAdapter } from "./route-pipeline/integration-route-render-adapter.js";
|
|
15
|
+
import { loadPageBrowserGraphContribution } from "./page-browser-graph/page-browser-graph-contribution.loader.js";
|
|
16
|
+
import { normalizeUnresolvedMarkerArtifactHtml } from "./route-pipeline/marker-artifact.utils.js";
|
|
17
|
+
import { isMarkupNodeLike } from "./foreign-child/foreign-child-output.utils.js";
|
|
14
18
|
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
getForeignSubtreeResolutionContextKey,
|
|
20
|
+
getForeignSubtreeTokenPrefix,
|
|
21
|
+
resolveOwningIntegrationRenderer
|
|
22
|
+
} from "./foreign-child/owning-renderer-resolution.js";
|
|
23
|
+
import { ensureIntegrationRuntimeReady } from "../../build/app-build-manifest-runtime.js";
|
|
24
|
+
import { ForeignSubtreeExecutionService } from "./foreign-child/foreign-subtree-execution.service.js";
|
|
25
|
+
import {
|
|
26
|
+
composeDocumentShell,
|
|
27
|
+
finalizeDocumentShellHtml,
|
|
28
|
+
renderPageDocumentShell
|
|
29
|
+
} from "./document-shell/document-shell-render.service.js";
|
|
30
|
+
import {
|
|
31
|
+
resolveInnermostPageLayout,
|
|
32
|
+
resolvePageLayoutComponents
|
|
33
|
+
} from "./document-shell/layout-shell-props.service.js";
|
|
22
34
|
class IntegrationRenderer {
|
|
23
35
|
appConfig;
|
|
24
36
|
assetProcessingService;
|
|
@@ -31,63 +43,52 @@ class IntegrationRenderer {
|
|
|
31
43
|
pageModuleLoaderService;
|
|
32
44
|
routeRenderOrchestrator;
|
|
33
45
|
foreignSubtreeExecutionService = new ForeignSubtreeExecutionService();
|
|
34
|
-
DOC_TYPE = "<!DOCTYPE html>";
|
|
35
46
|
/**
|
|
36
|
-
*
|
|
47
|
+
* Serializes route and view renders that mutate `htmlTransformer` state.
|
|
37
48
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* those callers reuse integration-specific import setup instead of bypassing it
|
|
41
|
-
* with raw transpiler access.
|
|
49
|
+
* Integration renderers are cached per integration, so concurrent static builds
|
|
50
|
+
* and overlapping SSR requests must not share one transformer page package.
|
|
42
51
|
*/
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
renderExclusiveChain = Promise.resolve();
|
|
53
|
+
DOC_TYPE = "<!DOCTYPE html>";
|
|
54
|
+
runRenderExclusive(operation) {
|
|
55
|
+
const run = this.renderExclusiveChain.then(async () => {
|
|
56
|
+
await this.ensureIntegrationRuntimeActivated();
|
|
57
|
+
return operation();
|
|
58
|
+
});
|
|
59
|
+
this.renderExclusiveChain = run.then(
|
|
60
|
+
() => void 0,
|
|
61
|
+
() => void 0
|
|
62
|
+
);
|
|
63
|
+
return run;
|
|
45
64
|
}
|
|
46
65
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* Shared page/layout/document shell helpers pass one cache through
|
|
50
|
-
* `integrationContext` so repeated delegation to the same foreign integration
|
|
51
|
-
* can reuse a single initialized renderer instance during one render flow.
|
|
52
|
-
* The cache is deliberately scoped to the current render execution rather than
|
|
53
|
-
* stored on the renderer, which avoids leaking mutable integration state across
|
|
54
|
-
* requests while still preventing redundant renderer initialization.
|
|
55
|
-
*
|
|
56
|
-
* @param integrationContext - Optional render context carried with one render input.
|
|
57
|
-
* @returns The current execution cache when present.
|
|
66
|
+
* Activates the owning integration runtime on first render or graph use.
|
|
58
67
|
*/
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
68
|
+
async ensureIntegrationRuntimeActivated() {
|
|
69
|
+
await ensureIntegrationRuntimeReady({
|
|
70
|
+
appConfig: this.appConfig,
|
|
71
|
+
integrationName: this.name,
|
|
72
|
+
runtimeOrigin: this.runtimeOrigin
|
|
73
|
+
});
|
|
64
74
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
/**
|
|
76
|
+
* Prebuilds the production Page Browser Graph for one route file.
|
|
77
|
+
*/
|
|
78
|
+
async prebuildProductionPageBrowserGraph(routeFile) {
|
|
79
|
+
await this.ensureIntegrationRuntimeActivated();
|
|
80
|
+
await this.resolvePageBrowserGraphForFile(routeFile);
|
|
71
81
|
}
|
|
72
82
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* Foreign-owned page, layout, or document shells may delegate several times in
|
|
76
|
-
* the same render flow. Threading the cache through `integrationContext`
|
|
77
|
-
* preserves renderer reuse without changing the public render input contract.
|
|
78
|
-
* Existing integration-specific context is preserved and augmented.
|
|
83
|
+
* Loads one route module through the owning renderer's import path.
|
|
79
84
|
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
85
|
+
* Request-time infrastructure may need page metadata such as cache strategy or
|
|
86
|
+
* middleware before full rendering starts. Exposing this narrow entrypoint lets
|
|
87
|
+
* those callers reuse integration-specific import setup instead of bypassing it
|
|
88
|
+
* with raw transpiler access.
|
|
83
89
|
*/
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const sharedRendererCache = rendererCache;
|
|
87
|
-
return {
|
|
88
|
-
...input,
|
|
89
|
-
integrationContext: integrationContext ? { ...integrationContext, rendererCache: sharedRendererCache } : { rendererCache: sharedRendererCache }
|
|
90
|
-
};
|
|
90
|
+
async loadPageModule(file, options) {
|
|
91
|
+
return this.importPageFile(file, options);
|
|
91
92
|
}
|
|
92
93
|
getRendererModuleValue(key) {
|
|
93
94
|
if (!this.rendererModules || typeof this.rendererModules !== "object") {
|
|
@@ -184,41 +185,12 @@ class IntegrationRenderer {
|
|
|
184
185
|
return await this.routeRenderOrchestrator.resolveDeclaredPageBrowserGraph({
|
|
185
186
|
routeFile: filePath,
|
|
186
187
|
integrationName: this.name,
|
|
187
|
-
collectContribution:
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
mergePageBrowserGraphIntoPagePackage(pageBrowserGraph) {
|
|
194
|
-
if (!pageBrowserGraph) {
|
|
195
|
-
return void 0;
|
|
196
|
-
}
|
|
197
|
-
const currentPagePackage = this.htmlTransformer.getPagePackage();
|
|
198
|
-
const mergedPageBrowserGraph = currentPagePackage?.pageBrowserGraph ? {
|
|
199
|
-
entryAssets: this.htmlTransformer.dedupeProcessedAssets([
|
|
200
|
-
...currentPagePackage.pageBrowserGraph.entryAssets,
|
|
201
|
-
...pageBrowserGraph.entryAssets
|
|
202
|
-
]),
|
|
203
|
-
chunkAssets: this.htmlTransformer.dedupeProcessedAssets([
|
|
204
|
-
...currentPagePackage.pageBrowserGraph.chunkAssets,
|
|
205
|
-
...pageBrowserGraph.chunkAssets
|
|
206
|
-
])
|
|
207
|
-
} : pageBrowserGraph;
|
|
208
|
-
const pageBrowserGraphAssetKeys = new Set(
|
|
209
|
-
[...mergedPageBrowserGraph.entryAssets, ...mergedPageBrowserGraph.chunkAssets].map(
|
|
210
|
-
(asset) => buildProcessedAssetDedupeKey(asset)
|
|
188
|
+
collectContribution: (routeFile) => loadPageBrowserGraphContribution(
|
|
189
|
+
routeFile,
|
|
190
|
+
(targetFile) => this.importPageFile(targetFile),
|
|
191
|
+
(context) => this.collectPageBrowserGraphContribution(context)
|
|
211
192
|
)
|
|
212
|
-
);
|
|
213
|
-
const baseAssets = currentPagePackage ? currentPagePackage.assets.filter(
|
|
214
|
-
(asset) => !pageBrowserGraphAssetKeys.has(buildProcessedAssetDedupeKey(asset))
|
|
215
|
-
) : this.htmlTransformer.getProcessedDependencies();
|
|
216
|
-
this.htmlTransformer.setPagePackage(
|
|
217
|
-
createPagePackage(this.htmlTransformer.dedupeProcessedAssets(baseAssets), {
|
|
218
|
-
pageBrowserGraph: mergedPageBrowserGraph
|
|
219
|
-
})
|
|
220
|
-
);
|
|
221
|
-
return mergedPageBrowserGraph;
|
|
193
|
+
});
|
|
222
194
|
}
|
|
223
195
|
/**
|
|
224
196
|
* Merges component-scoped assets into the active HTML transformer state.
|
|
@@ -306,29 +278,42 @@ class IntegrationRenderer {
|
|
|
306
278
|
* @returns HTML response for the explicit view render.
|
|
307
279
|
*/
|
|
308
280
|
async renderViewWithDocumentShell(input) {
|
|
281
|
+
await this.ensureIntegrationRuntimeActivated();
|
|
309
282
|
const normalizedProps = input.props ?? {};
|
|
310
283
|
if (input.ctx.partial) {
|
|
311
|
-
return this.renderPartialViewResponse(
|
|
284
|
+
return this.renderPartialViewResponse({
|
|
285
|
+
...input,
|
|
286
|
+
transformHtml: input.transformDocumentHtml
|
|
287
|
+
});
|
|
312
288
|
}
|
|
313
289
|
await this.prepareViewDependencies(input.view, input.layout);
|
|
314
290
|
const HtmlTemplate = await this.getHtmlTemplate();
|
|
315
291
|
const metadata = await this.resolveViewMetadata(input.view, input.props);
|
|
316
|
-
const { documentHtml } = await
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
292
|
+
const { documentHtml } = await composeDocumentShell(
|
|
293
|
+
{
|
|
294
|
+
renderComponentWithForeignChildren: (renderInput) => this.renderComponentWithForeignChildren(renderInput),
|
|
295
|
+
appendProcessedDependencies: (...assetGroups) => this.appendProcessedDependencies(...assetGroups)
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
primaryComponent: input.view,
|
|
299
|
+
primaryProps: normalizedProps,
|
|
300
|
+
layout: input.layout ? {
|
|
301
|
+
component: input.layout,
|
|
302
|
+
props: {}
|
|
303
|
+
} : void 0,
|
|
304
|
+
htmlTemplate: HtmlTemplate,
|
|
305
|
+
documentProps: {
|
|
306
|
+
metadata,
|
|
307
|
+
pageProps: normalizedProps
|
|
308
|
+
}
|
|
327
309
|
}
|
|
328
|
-
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
|
|
310
|
+
);
|
|
311
|
+
const transformedDocumentHtml = input.transformDocumentHtml ? input.transformDocumentHtml(documentHtml) : documentHtml;
|
|
312
|
+
this.appendProcessedDependencies(this.getRendererBootstrapDependencies(false));
|
|
313
|
+
const html = await finalizeDocumentShellHtml(this.htmlTransformer, {
|
|
314
|
+
html: `${this.DOC_TYPE}${transformedDocumentHtml}`,
|
|
315
|
+
partial: false,
|
|
316
|
+
htmlContributions: this.getHtmlDocumentContributions({ partial: false })
|
|
332
317
|
});
|
|
333
318
|
return this.createHtmlResponse(html, input.ctx);
|
|
334
319
|
}
|
|
@@ -345,59 +330,17 @@ class IntegrationRenderer {
|
|
|
345
330
|
* @returns Final serialized document HTML including the doctype prefix.
|
|
346
331
|
*/
|
|
347
332
|
async renderPageWithDocumentShell(input) {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
...input.documentProps ?? {}
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
const documentHtml = input.transformDocumentHtml ? input.transformDocumentHtml(composedDocumentHtml) : composedDocumentHtml;
|
|
360
|
-
return `${this.DOC_TYPE}${documentHtml}`;
|
|
361
|
-
}
|
|
362
|
-
async composeDocumentShell(input) {
|
|
363
|
-
const rendererCache = /* @__PURE__ */ new Map();
|
|
364
|
-
const primaryRender = await this.renderComponentWithForeignChildren({
|
|
365
|
-
component: input.primaryComponent,
|
|
366
|
-
props: input.primaryProps,
|
|
367
|
-
integrationContext: { rendererCache }
|
|
368
|
-
});
|
|
369
|
-
const layoutRender = input.layout ? await this.renderComponentWithForeignChildren({
|
|
370
|
-
component: input.layout.component,
|
|
371
|
-
props: input.layout.props ?? {},
|
|
372
|
-
children: primaryRender.html,
|
|
373
|
-
integrationContext: { rendererCache }
|
|
374
|
-
}) : void 0;
|
|
375
|
-
const documentRender = await this.renderComponentWithForeignChildren({
|
|
376
|
-
component: input.htmlTemplate,
|
|
377
|
-
props: input.documentProps,
|
|
378
|
-
children: layoutRender?.html ?? primaryRender.html,
|
|
379
|
-
integrationContext: { rendererCache }
|
|
380
|
-
});
|
|
381
|
-
this.appendProcessedDependencies(primaryRender.assets, layoutRender?.assets, documentRender.assets);
|
|
382
|
-
return {
|
|
383
|
-
documentHtml: documentRender.html
|
|
384
|
-
};
|
|
333
|
+
return renderPageDocumentShell(
|
|
334
|
+
{
|
|
335
|
+
renderComponentWithForeignChildren: (renderInput) => this.renderComponentWithForeignChildren(renderInput),
|
|
336
|
+
appendProcessedDependencies: (...assetGroups) => this.appendProcessedDependencies(...assetGroups)
|
|
337
|
+
},
|
|
338
|
+
input,
|
|
339
|
+
this.DOC_TYPE
|
|
340
|
+
);
|
|
385
341
|
}
|
|
386
|
-
/**
|
|
387
|
-
* Renders one string-first component with serialized children and collects its assets.
|
|
388
|
-
*
|
|
389
|
-
* String-oriented integrations frequently share the same component contract:
|
|
390
|
-
* pass serialized children through props, coerce the render result to HTML, and
|
|
391
|
-
* attach any component-scoped dependencies. This helper centralizes that flow
|
|
392
|
-
* so integrations can opt into shared orchestration without repeating the same
|
|
393
|
-
* string-render boilerplate.
|
|
394
|
-
*
|
|
395
|
-
* @param input - Component render input.
|
|
396
|
-
* @param component - String-oriented component implementation to execute.
|
|
397
|
-
* @returns Structured component render result for orchestration paths.
|
|
398
|
-
*/
|
|
399
342
|
async renderStringComponentWithSerializedChildren(input, component) {
|
|
400
|
-
const serializedChildren = input.children === void 0 ? void 0 : typeof input.children === "string" ? input.children : isMarkupNodeLike(input.children) ? input.children.outerHTML : void 0;
|
|
343
|
+
const serializedChildren = input.children === void 0 ? void 0 : typeof input.children === "string" ? input.children : isMarkupNodeLike(input.children) && typeof input.children.outerHTML === "string" ? input.children.outerHTML : void 0;
|
|
401
344
|
if (input.children !== void 0 && serializedChildren === void 0) {
|
|
402
345
|
const componentFile = input.component.config?.__eco?.file ?? "unknown component";
|
|
403
346
|
const childTag = Object.prototype.toString.call(input.children);
|
|
@@ -407,7 +350,14 @@ class IntegrationRenderer {
|
|
|
407
350
|
}
|
|
408
351
|
const props = serializedChildren === void 0 ? input.props : { ...input.props, children: serializedChildren };
|
|
409
352
|
const content = await component(props);
|
|
410
|
-
|
|
353
|
+
if (typeof content !== "string") {
|
|
354
|
+
const componentFile = input.component.config?.__eco?.file ?? "unknown component";
|
|
355
|
+
const contentTag = Object.prototype.toString.call(content);
|
|
356
|
+
throw new TypeError(
|
|
357
|
+
`[ecopages] ${this.name} renderer expected a string render result for ${componentFile}, received ${contentTag}.`
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
const html = content;
|
|
411
361
|
const assets = input.component.config?.dependencies && typeof this.assetProcessingService?.processDependencies === "function" ? await this.processComponentDependencies([input.component]) : void 0;
|
|
412
362
|
return {
|
|
413
363
|
html,
|
|
@@ -417,27 +367,6 @@ class IntegrationRenderer {
|
|
|
417
367
|
assets
|
|
418
368
|
};
|
|
419
369
|
}
|
|
420
|
-
getForeignSubtreeTokenPrefix() {
|
|
421
|
-
return `__${this.name}_foreign_subtree__`;
|
|
422
|
-
}
|
|
423
|
-
getForeignSubtreeResolutionContextKey() {
|
|
424
|
-
return `__${this.name}_foreign_subtree_runtime__`;
|
|
425
|
-
}
|
|
426
|
-
createQueuedForeignSubtreeExecutionRuntime(options) {
|
|
427
|
-
return this.foreignSubtreeExecutionService.createQueuedRuntime({
|
|
428
|
-
renderInput: options.renderInput,
|
|
429
|
-
rendererCache: options.rendererCache,
|
|
430
|
-
runtimeContextKey: options.runtimeContextKey ?? this.getForeignSubtreeResolutionContextKey(),
|
|
431
|
-
tokenPrefix: options.tokenPrefix ?? this.getForeignSubtreeTokenPrefix(),
|
|
432
|
-
createRuntimeContext: options.createRuntimeContext
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
getQueuedForeignSubtreeResolutionContext(input) {
|
|
436
|
-
return this.foreignSubtreeExecutionService.getQueuedRuntimeContext(
|
|
437
|
-
input,
|
|
438
|
-
this.getForeignSubtreeResolutionContextKey()
|
|
439
|
-
);
|
|
440
|
-
}
|
|
441
370
|
/**
|
|
442
371
|
* Renders a string-first component, then resolves any queued foreign
|
|
443
372
|
* boundaries before returning final component HTML.
|
|
@@ -448,9 +377,16 @@ class IntegrationRenderer {
|
|
|
448
377
|
currentIntegrationName: this.name,
|
|
449
378
|
renderInput: input,
|
|
450
379
|
html: componentRender.html,
|
|
451
|
-
runtimeContextKey: this.
|
|
380
|
+
runtimeContextKey: getForeignSubtreeResolutionContextKey(this.name),
|
|
452
381
|
queueLabel: "String",
|
|
453
|
-
getOwningRenderer: (integrationName, rendererCache) =>
|
|
382
|
+
getOwningRenderer: (integrationName, rendererCache) => resolveOwningIntegrationRenderer({
|
|
383
|
+
appConfig: this.appConfig,
|
|
384
|
+
runtimeOrigin: this.runtimeOrigin,
|
|
385
|
+
currentIntegrationName: this.name,
|
|
386
|
+
currentRenderer: this,
|
|
387
|
+
integrationName,
|
|
388
|
+
cache: rendererCache
|
|
389
|
+
}),
|
|
454
390
|
applyAttributesToFirstElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstElement(html, attributes),
|
|
455
391
|
dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets)
|
|
456
392
|
});
|
|
@@ -484,23 +420,6 @@ class IntegrationRenderer {
|
|
|
484
420
|
ownershipValidationService: new OwnershipValidationService(appConfig)
|
|
485
421
|
});
|
|
486
422
|
}
|
|
487
|
-
/**
|
|
488
|
-
* Returns the HTML path from the provided file path.
|
|
489
|
-
* It extracts the path relative to the pages directory and removes the 'index' part if present.
|
|
490
|
-
*
|
|
491
|
-
* @param file - The file path to extract the HTML path from.
|
|
492
|
-
* @returns The extracted HTML path.
|
|
493
|
-
*/
|
|
494
|
-
getHtmlPath({ file }) {
|
|
495
|
-
const pagesDir = this.appConfig.absolutePaths.pagesDir;
|
|
496
|
-
const pagesIndex = file.indexOf(pagesDir);
|
|
497
|
-
if (pagesIndex === -1) return file;
|
|
498
|
-
const startIndex = file.indexOf(pagesDir) + pagesDir.length;
|
|
499
|
-
const endIndex = file.lastIndexOf("/");
|
|
500
|
-
const path = file.substring(startIndex, endIndex);
|
|
501
|
-
if (path === "/index") return "";
|
|
502
|
-
return path;
|
|
503
|
-
}
|
|
504
423
|
/**
|
|
505
424
|
* Returns the HTML template component.
|
|
506
425
|
* It imports the HTML template from the specified path in the app configuration.
|
|
@@ -533,7 +452,7 @@ class IntegrationRenderer {
|
|
|
533
452
|
* @returns The imported module.
|
|
534
453
|
*/
|
|
535
454
|
async importPageFile(file, options) {
|
|
536
|
-
const bypassCache = options?.bypassCache ??
|
|
455
|
+
const bypassCache = options?.bypassCache ?? false;
|
|
537
456
|
const pageModule = this.usesIntegrationPageImporter(file) ? await this.importIntegrationPageFile(file, {
|
|
538
457
|
bypassCache,
|
|
539
458
|
cacheScope: options?.cacheScope
|
|
@@ -554,46 +473,6 @@ class IntegrationRenderer {
|
|
|
554
473
|
resolveDependencyPath(componentDir, pathUrl) {
|
|
555
474
|
return this.dependencyResolverService.resolveDependencyPath(componentDir, pathUrl);
|
|
556
475
|
}
|
|
557
|
-
/**
|
|
558
|
-
* Extracts the dependencies from the provided component configuration.
|
|
559
|
-
* It resolves the paths for scripts and stylesheets based on the component directory.
|
|
560
|
-
*
|
|
561
|
-
* @param componentDir - The component directory path.
|
|
562
|
-
* @param scripts - The scripts to extract.
|
|
563
|
-
* @param stylesheets - The stylesheets to extract.
|
|
564
|
-
* @returns The extracted dependencies.
|
|
565
|
-
*/
|
|
566
|
-
extractDependencies({
|
|
567
|
-
componentDir,
|
|
568
|
-
scripts,
|
|
569
|
-
stylesheets
|
|
570
|
-
}) {
|
|
571
|
-
const scriptsPaths = [
|
|
572
|
-
...new Set(
|
|
573
|
-
(scripts ?? []).filter((script) => typeof script === "string" ? true : !script.lazy).map((script) => typeof script === "string" ? script : script.src).filter((script) => Boolean(script)).map((script) => this.resolveDependencyPath(componentDir, script))
|
|
574
|
-
)
|
|
575
|
-
];
|
|
576
|
-
const stylesheetsPaths = [
|
|
577
|
-
...new Set(
|
|
578
|
-
(stylesheets ?? []).map((style) => typeof style === "string" ? style : style.src).filter((style) => Boolean(style)).map((style) => this.resolveDependencyPath(componentDir, style))
|
|
579
|
-
)
|
|
580
|
-
];
|
|
581
|
-
return {
|
|
582
|
-
scripts: scriptsPaths,
|
|
583
|
-
stylesheets: stylesheetsPaths
|
|
584
|
-
};
|
|
585
|
-
}
|
|
586
|
-
/**
|
|
587
|
-
* Resolves lazy script paths to public asset URLs.
|
|
588
|
-
* Converts source paths to their final bundled output paths.
|
|
589
|
-
*
|
|
590
|
-
* @param componentDir - The component directory path.
|
|
591
|
-
* @param scripts - The lazy script paths to resolve.
|
|
592
|
-
* @returns Comma-separated string of resolved public script paths.
|
|
593
|
-
*/
|
|
594
|
-
resolveLazyScripts(componentDir, scripts) {
|
|
595
|
-
return this.dependencyResolverService.resolveLazyScripts(componentDir, scripts);
|
|
596
|
-
}
|
|
597
476
|
/**
|
|
598
477
|
* Collects the dependencies for the provided components.
|
|
599
478
|
* Combines component-specific dependencies with global integration dependencies.
|
|
@@ -622,19 +501,26 @@ class IntegrationRenderer {
|
|
|
622
501
|
* subclasses continue to override protected renderer behavior directly.
|
|
623
502
|
*/
|
|
624
503
|
createRouteRenderOrchestratorAdapter() {
|
|
625
|
-
return {
|
|
504
|
+
return createIntegrationRouteRenderAdapter({
|
|
626
505
|
name: this.name,
|
|
627
506
|
resolveRouteRenderInputs: (routeOptions) => this.resolveRouteRenderInputs(routeOptions),
|
|
628
507
|
resolveRouteDependencies: (input) => this.resolveRouteDependencies(input),
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
return await this.collectPageBrowserGraphContribution({ file: routeFile, pageModule });
|
|
632
|
-
},
|
|
633
|
-
resolveRoutePageComponentRender: (input) => this.resolveRoutePageComponentRender(input),
|
|
508
|
+
importPageFile: (file) => this.importPageFile(file),
|
|
509
|
+
collectPageBrowserGraphContribution: (context) => this.collectPageBrowserGraphContribution(context),
|
|
634
510
|
renderRouteBody: (renderOptions) => this.renderRouteBody(renderOptions),
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
511
|
+
getDocumentAttributes: (renderOptions) => this.getDocumentAttributes(renderOptions),
|
|
512
|
+
getHtmlDocumentContributions: (options) => this.getHtmlDocumentContributions(options),
|
|
513
|
+
applyAttributesToHtmlElement: (html, attributes) => this.applyAttributesToHtmlElement(html, attributes),
|
|
514
|
+
transformRouteResponse: async (response, htmlContributions, pagePackage) => {
|
|
515
|
+
const resolvedPagePackage = this.htmlTransformer.getPagePackage() ?? pagePackage;
|
|
516
|
+
const transformedResponse = await this.htmlTransformer.transform(
|
|
517
|
+
response,
|
|
518
|
+
htmlContributions,
|
|
519
|
+
resolvedPagePackage
|
|
520
|
+
);
|
|
521
|
+
return transformedResponse.body ?? await transformedResponse.text();
|
|
522
|
+
}
|
|
523
|
+
});
|
|
638
524
|
}
|
|
639
525
|
async resolveRouteRenderInputs(routeOptions) {
|
|
640
526
|
const pageModule = await this.pageModuleLoaderService.resolvePageModule({
|
|
@@ -643,7 +529,8 @@ class IntegrationRenderer {
|
|
|
643
529
|
});
|
|
644
530
|
const { Page, integrationSpecificProps } = pageModule;
|
|
645
531
|
const HtmlTemplate = await this.getHtmlTemplate();
|
|
646
|
-
const
|
|
532
|
+
const Layouts = resolvePageLayoutComponents(Page.config?.layouts);
|
|
533
|
+
const Layout = resolveInnermostPageLayout(Layouts);
|
|
647
534
|
const { props, metadata } = await this.pageModuleLoaderService.resolvePageData({
|
|
648
535
|
pageModule,
|
|
649
536
|
routeOptions
|
|
@@ -651,7 +538,9 @@ class IntegrationRenderer {
|
|
|
651
538
|
return {
|
|
652
539
|
Page,
|
|
653
540
|
HtmlTemplate,
|
|
541
|
+
Layouts,
|
|
654
542
|
Layout,
|
|
543
|
+
layoutEntries: Page.config?.layoutEntries,
|
|
655
544
|
props,
|
|
656
545
|
metadata,
|
|
657
546
|
integrationSpecificProps
|
|
@@ -662,54 +551,9 @@ class IntegrationRenderer {
|
|
|
662
551
|
resolvedDependencies: await this.resolveDependencies(input.components)
|
|
663
552
|
};
|
|
664
553
|
}
|
|
665
|
-
async resolveRoutePageComponentRender(input) {
|
|
666
|
-
if (!this.shouldRenderPageComponent({ Page: input.Page, Layout: input.Layout, options: input.routeOptions })) {
|
|
667
|
-
return void 0;
|
|
668
|
-
}
|
|
669
|
-
return this.renderComponentWithForeignChildren({
|
|
670
|
-
component: input.Page,
|
|
671
|
-
props: {
|
|
672
|
-
...input.props,
|
|
673
|
-
params: input.routeOptions.params || {},
|
|
674
|
-
query: input.routeOptions.query || {}
|
|
675
|
-
},
|
|
676
|
-
integrationContext: {
|
|
677
|
-
componentInstanceId: "eco-page-root"
|
|
678
|
-
}
|
|
679
|
-
});
|
|
680
|
-
}
|
|
681
554
|
async renderRouteBody(renderOptions) {
|
|
682
555
|
return this.render(renderOptions);
|
|
683
556
|
}
|
|
684
|
-
getRouteHtmlFinalization(renderOptions) {
|
|
685
|
-
const componentRootAttributes = renderOptions.componentRender?.canAttachAttributes && renderOptions.componentRender.rootAttributes && Object.keys(renderOptions.componentRender.rootAttributes).length > 0 ? renderOptions.componentRender.rootAttributes : void 0;
|
|
686
|
-
const documentAttributes = this.getDocumentAttributes(renderOptions);
|
|
687
|
-
const htmlContributions = this.getHtmlDocumentContributions({ renderOptions, partial: false });
|
|
688
|
-
const hasStructuralFinalization = componentRootAttributes && Object.keys(componentRootAttributes).length > 0 || documentAttributes && Object.keys(documentAttributes).length > 0;
|
|
689
|
-
if (!hasStructuralFinalization && (!htmlContributions || htmlContributions.length === 0)) {
|
|
690
|
-
return {};
|
|
691
|
-
}
|
|
692
|
-
return {
|
|
693
|
-
htmlContributions,
|
|
694
|
-
finalizeHtml: (html) => {
|
|
695
|
-
let renderedHtml = html;
|
|
696
|
-
if (componentRootAttributes) {
|
|
697
|
-
renderedHtml = this.htmlTransformer.applyAttributesToFirstBodyElement(
|
|
698
|
-
renderedHtml,
|
|
699
|
-
componentRootAttributes
|
|
700
|
-
);
|
|
701
|
-
}
|
|
702
|
-
if (documentAttributes) {
|
|
703
|
-
renderedHtml = this.htmlTransformer.applyAttributesToHtmlElement(renderedHtml, documentAttributes);
|
|
704
|
-
}
|
|
705
|
-
return renderedHtml;
|
|
706
|
-
}
|
|
707
|
-
};
|
|
708
|
-
}
|
|
709
|
-
async transformRouteResponse(response, htmlContributions) {
|
|
710
|
-
const transformedResponse = await this.htmlTransformer.transform(response, htmlContributions);
|
|
711
|
-
return transformedResponse.body ?? await transformedResponse.text();
|
|
712
|
-
}
|
|
713
557
|
/**
|
|
714
558
|
* Prepares the render options for the integration renderer.
|
|
715
559
|
* It imports the page file, collects dependencies, and prepares the render options.
|
|
@@ -723,17 +567,6 @@ class IntegrationRenderer {
|
|
|
723
567
|
this.htmlTransformer.setPagePackage(renderOptions.pagePackage);
|
|
724
568
|
return renderOptions;
|
|
725
569
|
}
|
|
726
|
-
/**
|
|
727
|
-
* Controls whether the page root should be rendered through `renderComponent()`
|
|
728
|
-
* during route option preparation in component-capable modes.
|
|
729
|
-
*
|
|
730
|
-
* Integrations that already own page-level hydration (for example router-driven
|
|
731
|
-
* React rendering) can override this and return `false` to avoid duplicate root
|
|
732
|
-
* mount assets and competing hydration entrypoints.
|
|
733
|
-
*/
|
|
734
|
-
shouldRenderPageComponent(_input) {
|
|
735
|
-
return true;
|
|
736
|
-
}
|
|
737
570
|
/**
|
|
738
571
|
* Executes the integration renderer with the provided options.
|
|
739
572
|
*
|
|
@@ -741,7 +574,7 @@ class IntegrationRenderer {
|
|
|
741
574
|
* 1. Build normalized render options (`prepareRenderOptions`).
|
|
742
575
|
* 2. Render the route body once.
|
|
743
576
|
* 3. Reject unresolved route-level eco-marker artifacts.
|
|
744
|
-
* 4. Optionally apply
|
|
577
|
+
* 4. Optionally apply document attributes for integration-owned document boundaries.
|
|
745
578
|
* 5. Run HTML transformer with final dependency set.
|
|
746
579
|
*
|
|
747
580
|
* Stream-safety note: the first render result is normalized to a string once,
|
|
@@ -752,41 +585,12 @@ class IntegrationRenderer {
|
|
|
752
585
|
* @returns Rendered route body plus effective cache strategy.
|
|
753
586
|
*/
|
|
754
587
|
async execute(options) {
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
* Finalizes already-resolved HTML for explicit renderer-owned paths.
|
|
761
|
-
*
|
|
762
|
-
* This keeps document and root-attribute stamping plus HTML transformation
|
|
763
|
-
* available after a renderer has completed nested foreign-subtree resolution without
|
|
764
|
-
* routing back through shared route execution.
|
|
765
|
-
*/
|
|
766
|
-
async finalizeResolvedHtml(options) {
|
|
767
|
-
const rendererBootstrapDependencies = this.getRendererBootstrapDependencies(options.partial);
|
|
768
|
-
this.appendProcessedDependencies(rendererBootstrapDependencies);
|
|
769
|
-
let html = options.html;
|
|
770
|
-
if (options.componentRootAttributes && Object.keys(options.componentRootAttributes).length > 0) {
|
|
771
|
-
html = this.htmlTransformer.applyAttributesToFirstBodyElement(html, options.componentRootAttributes);
|
|
772
|
-
}
|
|
773
|
-
if (options.documentAttributes && Object.keys(options.documentAttributes).length > 0) {
|
|
774
|
-
html = this.htmlTransformer.applyAttributesToHtmlElement(html, options.documentAttributes);
|
|
775
|
-
}
|
|
776
|
-
const shouldTransform = options.transformHtml ?? !options.partial;
|
|
777
|
-
if (!shouldTransform) {
|
|
778
|
-
return html;
|
|
779
|
-
}
|
|
780
|
-
const htmlContributions = options.htmlContributions ?? this.getHtmlDocumentContributions({
|
|
781
|
-
partial: options.partial
|
|
588
|
+
return this.runRenderExclusive(async () => {
|
|
589
|
+
this.htmlTransformer.setProcessedDependencies([]);
|
|
590
|
+
const adapter = this.createRouteRenderOrchestratorAdapter();
|
|
591
|
+
const renderOptions = await this.prepareRenderOptions(options, adapter);
|
|
592
|
+
return this.routeRenderOrchestrator.executePrepared(renderOptions, adapter);
|
|
782
593
|
});
|
|
783
|
-
const transformedResponse = await this.htmlTransformer.transform(
|
|
784
|
-
new Response(html, {
|
|
785
|
-
headers: { "Content-Type": "text/html" }
|
|
786
|
-
}),
|
|
787
|
-
htmlContributions
|
|
788
|
-
);
|
|
789
|
-
return await transformedResponse.text();
|
|
790
594
|
}
|
|
791
595
|
/**
|
|
792
596
|
* Returns document-level attributes to stamp onto the rendered `<html>` tag.
|
|
@@ -797,6 +601,12 @@ class IntegrationRenderer {
|
|
|
797
601
|
getDocumentAttributes(_renderOptions) {
|
|
798
602
|
return void 0;
|
|
799
603
|
}
|
|
604
|
+
applyAttributesToFirstBodyElement(html, attributes) {
|
|
605
|
+
return this.htmlTransformer.applyAttributesToFirstBodyElement(html, attributes);
|
|
606
|
+
}
|
|
607
|
+
applyAttributesToHtmlElement(html, attributes) {
|
|
608
|
+
return this.htmlTransformer.applyAttributesToHtmlElement(html, attributes);
|
|
609
|
+
}
|
|
800
610
|
/**
|
|
801
611
|
* Returns declarative HTML fragments that core should inject into the final document.
|
|
802
612
|
*
|
|
@@ -809,34 +619,6 @@ class IntegrationRenderer {
|
|
|
809
619
|
getHtmlDocumentContributions(_options) {
|
|
810
620
|
return void 0;
|
|
811
621
|
}
|
|
812
|
-
/**
|
|
813
|
-
* Returns a renderer instance for a given integration name.
|
|
814
|
-
*
|
|
815
|
-
* Uses a per-execution cache to avoid repeated renderer initialization.
|
|
816
|
-
*
|
|
817
|
-
* @param integrationName Target integration name.
|
|
818
|
-
* @param cache Render-pass renderer cache.
|
|
819
|
-
* @returns Renderer for the requested integration.
|
|
820
|
-
* @throws Error when no integration plugin matches `integrationName`.
|
|
821
|
-
*/
|
|
822
|
-
getIntegrationRendererForName(integrationName, cache) {
|
|
823
|
-
if (cache.has(integrationName)) {
|
|
824
|
-
return cache.get(integrationName);
|
|
825
|
-
}
|
|
826
|
-
if (integrationName === this.name) {
|
|
827
|
-
cache.set(integrationName, this);
|
|
828
|
-
return this;
|
|
829
|
-
}
|
|
830
|
-
const integrationPlugin = this.appConfig.integrations.find(
|
|
831
|
-
(integration) => integration.name === integrationName
|
|
832
|
-
);
|
|
833
|
-
invariant(!!integrationPlugin, `[ecopages] Integration not found for foreign owner: ${integrationName}`);
|
|
834
|
-
const renderer = integrationPlugin.initializeRenderer({
|
|
835
|
-
rendererModules: this.appConfig.runtime?.rendererModuleContext
|
|
836
|
-
});
|
|
837
|
-
cache.set(integrationName, renderer);
|
|
838
|
-
return renderer;
|
|
839
|
-
}
|
|
840
622
|
/**
|
|
841
623
|
* Renders one component under this integration's foreign-child runtime and resolves
|
|
842
624
|
* any nested foreign children captured during that render.
|
|
@@ -856,25 +638,16 @@ class IntegrationRenderer {
|
|
|
856
638
|
renderInput,
|
|
857
639
|
rendererCache
|
|
858
640
|
}),
|
|
859
|
-
getOwningRenderer: (integrationName, rendererCache) =>
|
|
641
|
+
getOwningRenderer: (integrationName, rendererCache) => resolveOwningIntegrationRenderer({
|
|
642
|
+
appConfig: this.appConfig,
|
|
643
|
+
runtimeOrigin: this.runtimeOrigin,
|
|
644
|
+
currentIntegrationName: this.name,
|
|
645
|
+
currentRenderer: this,
|
|
646
|
+
integrationName,
|
|
647
|
+
cache: rendererCache
|
|
648
|
+
})
|
|
860
649
|
});
|
|
861
650
|
}
|
|
862
|
-
/**
|
|
863
|
-
* Compatibility foreign-subtree contract that exposes a narrower payload shape for
|
|
864
|
-
* future route-composition work while preserving the current
|
|
865
|
-
* `renderComponentWithForeignChildren()` runtime semantics.
|
|
866
|
-
*/
|
|
867
|
-
async renderForeignSubtree(input) {
|
|
868
|
-
const result = await this.renderComponentWithForeignChildren(input);
|
|
869
|
-
return {
|
|
870
|
-
html: result.html,
|
|
871
|
-
assets: result.assets ?? [],
|
|
872
|
-
rootTag: result.rootTag,
|
|
873
|
-
rootAttributes: result.rootAttributes,
|
|
874
|
-
attachmentPolicy: result.canAttachAttributes ? { kind: "first-element" } : { kind: "none" },
|
|
875
|
-
integrationName: result.integrationName
|
|
876
|
-
};
|
|
877
|
-
}
|
|
878
651
|
normalizeComponentRenderOutput(result) {
|
|
879
652
|
const normalizedHtml = this.normalizeUnresolvedMarkerArtifactHtml(result.html);
|
|
880
653
|
return normalizedHtml === result.html ? result : {
|
|
@@ -893,21 +666,7 @@ class IntegrationRenderer {
|
|
|
893
666
|
* directly without paying the queue orchestration cost.
|
|
894
667
|
*/
|
|
895
668
|
hasForeignChildDescendants(component) {
|
|
896
|
-
|
|
897
|
-
const seen = /* @__PURE__ */ new Set();
|
|
898
|
-
while (stack.length > 0) {
|
|
899
|
-
const current = stack.pop();
|
|
900
|
-
if (!current || seen.has(current)) {
|
|
901
|
-
continue;
|
|
902
|
-
}
|
|
903
|
-
seen.add(current);
|
|
904
|
-
const integrationName = current.config?.integration ?? current.config?.__eco?.integration;
|
|
905
|
-
if (integrationName && integrationName !== this.name) {
|
|
906
|
-
return true;
|
|
907
|
-
}
|
|
908
|
-
stack.push(...current.config?.dependencies?.components ?? []);
|
|
909
|
-
}
|
|
910
|
-
return false;
|
|
669
|
+
return hasForeignChildDescendantsInGraph(component, this.name);
|
|
911
670
|
}
|
|
912
671
|
/**
|
|
913
672
|
* Render a single component and return structured output for orchestration paths.
|
|
@@ -973,9 +732,11 @@ class IntegrationRenderer {
|
|
|
973
732
|
* context or a different foreign-child execution strategy.
|
|
974
733
|
*/
|
|
975
734
|
createForeignChildRuntime(options) {
|
|
976
|
-
return this.
|
|
735
|
+
return this.foreignSubtreeExecutionService.createQueuedRuntime({
|
|
977
736
|
renderInput: options.renderInput,
|
|
978
|
-
rendererCache: options.rendererCache
|
|
737
|
+
rendererCache: options.rendererCache,
|
|
738
|
+
runtimeContextKey: getForeignSubtreeResolutionContextKey(this.name),
|
|
739
|
+
tokenPrefix: getForeignSubtreeTokenPrefix(this.name)
|
|
979
740
|
});
|
|
980
741
|
}
|
|
981
742
|
/**
|