@ecopages/core 0.2.0-beta.3 → 0.2.0-beta.30
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
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
2
|
+
import { type BuildExecutor } from '../build-adapter.js';
|
|
3
|
+
export type BuildProfile = 'server-entry' | 'route-module' | 'browser-hmr';
|
|
4
|
+
export interface BuildRuntime {
|
|
5
|
+
getProfile(profile: BuildProfile): BuildExecutor;
|
|
6
|
+
dispose(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function getBuildRuntime(appConfig: EcoPagesAppConfig): BuildRuntime | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the installed build runtime, installing it when missing.
|
|
11
|
+
*/
|
|
12
|
+
export declare function requireBuildRuntime(appConfig: EcoPagesAppConfig): BuildRuntime;
|
|
13
|
+
/**
|
|
14
|
+
* Installs profile-based build executors for one app instance.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* For Rolldown ownership, server-entry stays serialized single-flight while
|
|
18
|
+
* route-module and browser-HMR run in parallel one-shot builds. Vite-host
|
|
19
|
+
* profiles wrap a boundary marker and reject framework-owned build attempts.
|
|
20
|
+
* Profiles do not inject app plugins — assemble complete
|
|
21
|
+
* {@link BuildOptions} with {@link createServerBuildRequest} /
|
|
22
|
+
* {@link createBrowserBuildRequest} (or {@link BrowserBundleService}) first.
|
|
23
|
+
*/
|
|
24
|
+
export declare function installBuildRuntime(appConfig: EcoPagesAppConfig): BuildRuntime;
|
|
25
|
+
/**
|
|
26
|
+
* No-op retained for server teardown call sites.
|
|
27
|
+
*/
|
|
28
|
+
export declare function disposeAppBuildRuntime(appConfig: EcoPagesAppConfig): Promise<void>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { availableParallelism } from "node:os";
|
|
2
|
+
import { getAppBuildAdapter } from "../build-adapter.js";
|
|
3
|
+
import { ParallelBuildExecutor } from "./parallel-build-executor.js";
|
|
4
|
+
import { DedupingBuildExecutor } from "./deduping-build-executor.js";
|
|
5
|
+
import { SerializedBuildExecutor } from "./serialized-build-executor.js";
|
|
6
|
+
function resolveParallelismLimit() {
|
|
7
|
+
return Math.max(1, availableParallelism() - 1);
|
|
8
|
+
}
|
|
9
|
+
function patchAppRuntime(appConfig, patch) {
|
|
10
|
+
appConfig.runtime = {
|
|
11
|
+
...appConfig.runtime ?? {},
|
|
12
|
+
...patch
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
class AppBuildRuntime {
|
|
16
|
+
serverEntryExecutor;
|
|
17
|
+
routeModuleExecutor;
|
|
18
|
+
hmrExecutor;
|
|
19
|
+
constructor(appConfig) {
|
|
20
|
+
const adapter = getAppBuildAdapter(appConfig);
|
|
21
|
+
const limit = resolveParallelismLimit();
|
|
22
|
+
this.serverEntryExecutor = new SerializedBuildExecutor(adapter);
|
|
23
|
+
this.routeModuleExecutor = new DedupingBuildExecutor(new ParallelBuildExecutor(adapter, limit));
|
|
24
|
+
this.hmrExecutor = new DedupingBuildExecutor(new ParallelBuildExecutor(adapter, Math.min(3, limit)));
|
|
25
|
+
}
|
|
26
|
+
getProfile(profile) {
|
|
27
|
+
switch (profile) {
|
|
28
|
+
case "server-entry":
|
|
29
|
+
return this.serverEntryExecutor;
|
|
30
|
+
case "route-module":
|
|
31
|
+
return this.routeModuleExecutor;
|
|
32
|
+
case "browser-hmr":
|
|
33
|
+
return this.hmrExecutor;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* No-op for profile teardown.
|
|
38
|
+
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* Rolldown-owned profiles use one-shot builds, and Vite-host profiles only
|
|
41
|
+
* wrap a boundary marker. Neither owns a long-lived engine to close.
|
|
42
|
+
*/
|
|
43
|
+
async dispose() {
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function getBuildRuntime(appConfig) {
|
|
47
|
+
return appConfig.runtime?.buildRuntime;
|
|
48
|
+
}
|
|
49
|
+
function requireBuildRuntime(appConfig) {
|
|
50
|
+
return getBuildRuntime(appConfig) ?? installBuildRuntime(appConfig);
|
|
51
|
+
}
|
|
52
|
+
function installBuildRuntime(appConfig) {
|
|
53
|
+
const buildRuntime = new AppBuildRuntime(appConfig);
|
|
54
|
+
patchAppRuntime(appConfig, { buildRuntime });
|
|
55
|
+
return buildRuntime;
|
|
56
|
+
}
|
|
57
|
+
async function disposeAppBuildRuntime(appConfig) {
|
|
58
|
+
await getBuildRuntime(appConfig)?.dispose();
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
disposeAppBuildRuntime,
|
|
62
|
+
getBuildRuntime,
|
|
63
|
+
installBuildRuntime,
|
|
64
|
+
requireBuildRuntime
|
|
65
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BuildExecutor, BuildOptions, BuildResult } from '../build-adapter.js';
|
|
2
|
+
export { createBuildRequestIdentity, createBuildOptionsDedupeKey } from './build-request-identity.js';
|
|
3
|
+
/**
|
|
4
|
+
* In-flight build coalescing wrapper.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* `ParallelBuildExecutor` allows concurrent builds but does not dedupe identical
|
|
8
|
+
* options. Multiple callers (route import, browser bundles, HMR) can hit the
|
|
9
|
+
* same Rolldown request before disk or import caches warm. This wrapper shares
|
|
10
|
+
* one inner `build()` promise per dedupe key until it settles.
|
|
11
|
+
*
|
|
12
|
+
* Wrap route-module and browser-hmr profiles only; server-entry stays serialized.
|
|
13
|
+
*/
|
|
14
|
+
export declare class DedupingBuildExecutor implements BuildExecutor {
|
|
15
|
+
private readonly inner;
|
|
16
|
+
private readonly inFlight;
|
|
17
|
+
constructor(inner: BuildExecutor);
|
|
18
|
+
build(options: BuildOptions): Promise<BuildResult>;
|
|
19
|
+
unwrap(): BuildExecutor;
|
|
20
|
+
getInFlightCountForTests(): number;
|
|
21
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createBuildRequestIdentity } from "./build-request-identity.js";
|
|
2
|
+
import { createBuildRequestIdentity as createBuildRequestIdentity2, createBuildOptionsDedupeKey } from "./build-request-identity.js";
|
|
3
|
+
class DedupingBuildExecutor {
|
|
4
|
+
inner;
|
|
5
|
+
inFlight = /* @__PURE__ */ new Map();
|
|
6
|
+
constructor(inner) {
|
|
7
|
+
this.inner = inner;
|
|
8
|
+
}
|
|
9
|
+
build(options) {
|
|
10
|
+
const key = createBuildRequestIdentity(options);
|
|
11
|
+
const existing = this.inFlight.get(key);
|
|
12
|
+
if (existing) {
|
|
13
|
+
return existing;
|
|
14
|
+
}
|
|
15
|
+
const buildPromise = this.inner.build(options).finally(() => {
|
|
16
|
+
if (this.inFlight.get(key) === buildPromise) {
|
|
17
|
+
this.inFlight.delete(key);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
this.inFlight.set(key, buildPromise);
|
|
21
|
+
return buildPromise;
|
|
22
|
+
}
|
|
23
|
+
unwrap() {
|
|
24
|
+
return this.inner;
|
|
25
|
+
}
|
|
26
|
+
getInFlightCountForTests() {
|
|
27
|
+
return this.inFlight.size;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
DedupingBuildExecutor,
|
|
32
|
+
createBuildOptionsDedupeKey,
|
|
33
|
+
createBuildRequestIdentity2 as createBuildRequestIdentity
|
|
34
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BuildExecutor, BuildOptions, BuildResult } from '../build-adapter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Concurrency-limited build executor wrapper.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Runs up to `limit` builds concurrently. Use for independent route-module
|
|
7
|
+
* and HMR browser builds where FIFO serialization is unnecessary.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ParallelBuildExecutor implements BuildExecutor {
|
|
10
|
+
private readonly inner;
|
|
11
|
+
private readonly limit;
|
|
12
|
+
private activeCount;
|
|
13
|
+
private queue;
|
|
14
|
+
constructor(inner: BuildExecutor, limit: number);
|
|
15
|
+
build(options: BuildOptions): Promise<BuildResult>;
|
|
16
|
+
private drainQueue;
|
|
17
|
+
unwrap(): BuildExecutor;
|
|
18
|
+
getConcurrencyLimitForTests(): number;
|
|
19
|
+
getActiveCountForTests(): number;
|
|
20
|
+
getQueuedCountForTests(): number;
|
|
21
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
class ParallelBuildExecutor {
|
|
2
|
+
inner;
|
|
3
|
+
limit;
|
|
4
|
+
activeCount = 0;
|
|
5
|
+
queue = [];
|
|
6
|
+
constructor(inner, limit) {
|
|
7
|
+
this.inner = inner;
|
|
8
|
+
this.limit = Math.max(1, limit);
|
|
9
|
+
}
|
|
10
|
+
build(options) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
this.queue.push({
|
|
13
|
+
operation: () => this.inner.build(options),
|
|
14
|
+
resolve,
|
|
15
|
+
reject
|
|
16
|
+
});
|
|
17
|
+
this.drainQueue();
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
drainQueue() {
|
|
21
|
+
while (this.activeCount < this.limit && this.queue.length > 0) {
|
|
22
|
+
const next = this.queue.shift();
|
|
23
|
+
if (!next) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.activeCount += 1;
|
|
27
|
+
void next.operation().then((result) => {
|
|
28
|
+
next.resolve(result);
|
|
29
|
+
}).catch((error) => {
|
|
30
|
+
next.reject(error);
|
|
31
|
+
}).finally(() => {
|
|
32
|
+
this.activeCount -= 1;
|
|
33
|
+
this.drainQueue();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
unwrap() {
|
|
38
|
+
return this.inner;
|
|
39
|
+
}
|
|
40
|
+
getConcurrencyLimitForTests() {
|
|
41
|
+
return this.limit;
|
|
42
|
+
}
|
|
43
|
+
getActiveCountForTests() {
|
|
44
|
+
return this.activeCount;
|
|
45
|
+
}
|
|
46
|
+
getQueuedCountForTests() {
|
|
47
|
+
return this.queue.length;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
ParallelBuildExecutor
|
|
52
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classifies head scripts for navigation-time persistence and execution.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Returns whether a script tag carries non-executable data (for example JSON-LD).
|
|
7
|
+
*/
|
|
8
|
+
export declare function isNonExecutableHeadScript(element: Element): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Returns whether an identified inline head script should survive head diffing.
|
|
11
|
+
*/
|
|
12
|
+
export declare function shouldPersistExecutableInlineHeadScript(element: Element): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Returns whether a script is queued for rerun after navigation commit.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isRerunScript(element: Element): element is HTMLScriptElement;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const EXECUTABLE_SCRIPT_TYPES = /* @__PURE__ */ new Set([
|
|
2
|
+
"application/javascript",
|
|
3
|
+
"application/ecmascript",
|
|
4
|
+
"module",
|
|
5
|
+
"text/ecmascript",
|
|
6
|
+
"text/javascript"
|
|
7
|
+
]);
|
|
8
|
+
function isNonExecutableHeadScript(element) {
|
|
9
|
+
if (element.tagName !== "SCRIPT") {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const type = (element.getAttribute("type") ?? "").trim().toLowerCase();
|
|
13
|
+
if (!type) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return !EXECUTABLE_SCRIPT_TYPES.has(type);
|
|
17
|
+
}
|
|
18
|
+
function shouldPersistExecutableInlineHeadScript(element) {
|
|
19
|
+
if (element.tagName !== "SCRIPT") {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const scriptId = element.getAttribute("data-eco-script-id") || element.getAttribute("id");
|
|
23
|
+
if (!scriptId) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if (element.hasAttribute("data-eco-rerun")) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (element.src) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return !isNonExecutableHeadScript(element);
|
|
33
|
+
}
|
|
34
|
+
function isRerunScript(element) {
|
|
35
|
+
return element.tagName === "SCRIPT" && element.hasAttribute("data-eco-rerun");
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
isNonExecutableHeadScript,
|
|
39
|
+
isRerunScript,
|
|
40
|
+
shouldPersistExecutableInlineHeadScript
|
|
41
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { isNonExecutableHeadScript, isRerunScript, shouldPersistExecutableInlineHeadScript } from './classification.js';
|
|
2
|
+
export { RERUN_SRC_ATTR, getRegisteredRerunScript, type RerunScriptCallback } from './registry.js';
|
|
3
|
+
export { collectRerunScripts, createRerunScriptUrl, findExistingRerunScript, flushPendingRerunScripts, isExternalModuleRerunScript, resetRerunNonceForTests, type PendingRerunScript, } from './rerun-queue.js';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isNonExecutableHeadScript, isRerunScript, shouldPersistExecutableInlineHeadScript } from "./classification.js";
|
|
2
|
+
import { RERUN_SRC_ATTR, getRegisteredRerunScript } from "./registry.js";
|
|
3
|
+
import {
|
|
4
|
+
collectRerunScripts,
|
|
5
|
+
createRerunScriptUrl,
|
|
6
|
+
findExistingRerunScript,
|
|
7
|
+
flushPendingRerunScripts,
|
|
8
|
+
isExternalModuleRerunScript,
|
|
9
|
+
resetRerunNonceForTests
|
|
10
|
+
} from "./rerun-queue.js";
|
|
11
|
+
export {
|
|
12
|
+
RERUN_SRC_ATTR,
|
|
13
|
+
collectRerunScripts,
|
|
14
|
+
createRerunScriptUrl,
|
|
15
|
+
findExistingRerunScript,
|
|
16
|
+
flushPendingRerunScripts,
|
|
17
|
+
getRegisteredRerunScript,
|
|
18
|
+
isExternalModuleRerunScript,
|
|
19
|
+
isNonExecutableHeadScript,
|
|
20
|
+
isRerunScript,
|
|
21
|
+
resetRerunNonceForTests,
|
|
22
|
+
shouldPersistExecutableInlineHeadScript
|
|
23
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { isNonExecutableHeadScript } from "./classification.js";
|
|
3
|
+
import {
|
|
4
|
+
collectRerunScripts,
|
|
5
|
+
createRerunScriptUrl,
|
|
6
|
+
flushPendingRerunScripts,
|
|
7
|
+
resetRerunNonceForTests
|
|
8
|
+
} from "./rerun-queue.js";
|
|
9
|
+
import { RERUN_SRC_ATTR } from "./registry.js";
|
|
10
|
+
describe("isNonExecutableHeadScript", () => {
|
|
11
|
+
it("treats JSON-LD scripts as non-executable", () => {
|
|
12
|
+
const script = document.createElement("script");
|
|
13
|
+
script.type = "application/ld+json";
|
|
14
|
+
expect(isNonExecutableHeadScript(script)).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it("treats untyped scripts as executable", () => {
|
|
17
|
+
const script = document.createElement("script");
|
|
18
|
+
expect(isNonExecutableHeadScript(script)).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe("collectRerunScripts and flushPendingRerunScripts", () => {
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
document.head.replaceChildren();
|
|
24
|
+
document.body.replaceChildren();
|
|
25
|
+
resetRerunNonceForTests();
|
|
26
|
+
});
|
|
27
|
+
it("replays registered rerun callbacks without duplicating script tags", () => {
|
|
28
|
+
const callback = vi.fn();
|
|
29
|
+
window.__ECO_PAGES__ = {
|
|
30
|
+
rerunScripts: { "eco-test": callback }
|
|
31
|
+
};
|
|
32
|
+
try {
|
|
33
|
+
flushPendingRerunScripts([
|
|
34
|
+
{
|
|
35
|
+
parent: "head",
|
|
36
|
+
attributes: [
|
|
37
|
+
["data-eco-rerun", ""],
|
|
38
|
+
["data-eco-script-id", "eco-test"]
|
|
39
|
+
],
|
|
40
|
+
textContent: "",
|
|
41
|
+
src: null,
|
|
42
|
+
scriptId: "eco-test"
|
|
43
|
+
}
|
|
44
|
+
]);
|
|
45
|
+
expect(callback).toHaveBeenCalledOnce();
|
|
46
|
+
expect(document.head.querySelector('script[data-eco-script-id="eco-test"]')).toBeNull();
|
|
47
|
+
} finally {
|
|
48
|
+
delete window.__ECO_PAGES__;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it("cache-busts external module rerun scripts", () => {
|
|
52
|
+
const html = '<html><head><script data-eco-rerun src="/app.js" type="module"><\/script></head></html>';
|
|
53
|
+
const parsed = new DOMParser().parseFromString(html, "text/html");
|
|
54
|
+
const scripts = collectRerunScripts(parsed);
|
|
55
|
+
flushPendingRerunScripts(scripts);
|
|
56
|
+
const inserted = document.head.querySelector(`script[${RERUN_SRC_ATTR}]`);
|
|
57
|
+
expect(inserted?.getAttribute("src")).toMatch(/__eco_rerun=1/);
|
|
58
|
+
expect(inserted?.getAttribute(RERUN_SRC_ATTR)).toBe("/app.js");
|
|
59
|
+
});
|
|
60
|
+
it("appends a unique nonce on each module rerun url", () => {
|
|
61
|
+
const first = createRerunScriptUrl("/app.js");
|
|
62
|
+
const second = createRerunScriptUrl("/app.js");
|
|
63
|
+
expect(first).not.toBe(second);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `__ECO_PAGES__.rerunScripts` registry access for navigation reruns.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
export type RerunScriptCallback = () => void;
|
|
6
|
+
/** Attribute storing the original module `src` after cache-busting. */
|
|
7
|
+
export declare const RERUN_SRC_ATTR = "data-eco-rerun-src";
|
|
8
|
+
/**
|
|
9
|
+
* Returns a registered in-memory rerun callback for the given script id.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getRegisteredRerunScript(scriptId: string | null): RerunScriptCallback | null;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const RERUN_SRC_ATTR = "data-eco-rerun-src";
|
|
2
|
+
function getRegisteredRerunScript(scriptId) {
|
|
3
|
+
if (!scriptId) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
const runtimeWindow = window;
|
|
7
|
+
return runtimeWindow.__ECO_PAGES__?.rerunScripts?.[scriptId] ?? null;
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
RERUN_SRC_ATTR,
|
|
11
|
+
getRegisteredRerunScript
|
|
12
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queueing and replay of `data-eco-rerun` scripts after navigation.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
export type PendingRerunScript = {
|
|
6
|
+
parent: 'head' | 'body';
|
|
7
|
+
attributes: Array<[string, string]>;
|
|
8
|
+
textContent: string;
|
|
9
|
+
src: string | null;
|
|
10
|
+
scriptId: string | null;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Collects rerun scripts from an incoming document.
|
|
14
|
+
*/
|
|
15
|
+
export declare function collectRerunScripts(document: Document, filter?: (script: HTMLScriptElement) => boolean): PendingRerunScript[];
|
|
16
|
+
/**
|
|
17
|
+
* Returns whether a rerun script is an external ES module that needs cache busting.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isExternalModuleRerunScript(script: PendingRerunScript): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Finds an existing rerun script in `root` by id or by src and inline content.
|
|
22
|
+
*/
|
|
23
|
+
export declare function findExistingRerunScript(root: ParentNode, script: PendingRerunScript): HTMLScriptElement | null;
|
|
24
|
+
/**
|
|
25
|
+
* Appends a nonce query parameter so module scripts re-execute after navigation.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createRerunScriptUrl(src: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Replays queued rerun scripts after the incoming page body is in place.
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
* Flushed elements keep `data-eco-rerun` so head cleanup does not treat them
|
|
33
|
+
* as persistable inline scripts on the next navigation.
|
|
34
|
+
*/
|
|
35
|
+
export declare function flushPendingRerunScripts(scripts: readonly PendingRerunScript[]): void;
|
|
36
|
+
/** @remarks Test-only reset for nonce sequencing. */
|
|
37
|
+
export declare function resetRerunNonceForTests(): void;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { RERUN_SRC_ATTR, getRegisteredRerunScript } from "./registry.js";
|
|
2
|
+
let rerunNonce = 0;
|
|
3
|
+
function collectRerunScripts(document2, filter) {
|
|
4
|
+
return Array.from(document2.querySelectorAll("script[data-eco-rerun]")).filter((script) => filter ? filter(script) : true).map((script) => ({
|
|
5
|
+
parent: script.closest("body") ? "body" : "head",
|
|
6
|
+
attributes: Array.from(script.attributes).map((attribute) => [attribute.name, attribute.value]),
|
|
7
|
+
textContent: script.textContent ?? "",
|
|
8
|
+
src: script.getAttribute("src"),
|
|
9
|
+
scriptId: script.getAttribute("data-eco-script-id")
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
function isExternalModuleRerunScript(script) {
|
|
13
|
+
if (!script.src) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return script.attributes.some(([name, value]) => name === "type" && value === "module");
|
|
17
|
+
}
|
|
18
|
+
function findExistingRerunScript(root, script) {
|
|
19
|
+
const scripts = Array.from(root.querySelectorAll("script"));
|
|
20
|
+
if (script.scriptId) {
|
|
21
|
+
return scripts.find((candidate) => candidate.getAttribute("data-eco-script-id") === script.scriptId) ?? null;
|
|
22
|
+
}
|
|
23
|
+
return scripts.find(
|
|
24
|
+
(candidate) => (candidate.getAttribute(RERUN_SRC_ATTR) ?? candidate.getAttribute("src")) === script.src && (candidate.textContent ?? "") === script.textContent
|
|
25
|
+
) ?? null;
|
|
26
|
+
}
|
|
27
|
+
function createRerunScriptUrl(src) {
|
|
28
|
+
const url = new URL(src, document.baseURI);
|
|
29
|
+
url.searchParams.set("__eco_rerun", String(++rerunNonce));
|
|
30
|
+
return url.toString();
|
|
31
|
+
}
|
|
32
|
+
function flushPendingRerunScripts(scripts) {
|
|
33
|
+
for (const script of scripts) {
|
|
34
|
+
const targetParent = script.parent === "body" ? document.body : document.head;
|
|
35
|
+
const registeredRerun = getRegisteredRerunScript(script.scriptId);
|
|
36
|
+
const replacement = document.createElement("script");
|
|
37
|
+
const shouldBustModuleSrc = isExternalModuleRerunScript(script) && !registeredRerun;
|
|
38
|
+
for (const [name, value] of script.attributes) {
|
|
39
|
+
if (name === "src" && shouldBustModuleSrc) {
|
|
40
|
+
replacement.setAttribute(RERUN_SRC_ATTR, value);
|
|
41
|
+
replacement.setAttribute("src", createRerunScriptUrl(value));
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
replacement.setAttribute(name, value);
|
|
45
|
+
}
|
|
46
|
+
replacement.textContent = script.textContent;
|
|
47
|
+
const existingScript = findExistingRerunScript(targetParent, script);
|
|
48
|
+
if (registeredRerun) {
|
|
49
|
+
const needsScriptElement = isExternalModuleRerunScript(script);
|
|
50
|
+
if (!existingScript && needsScriptElement) {
|
|
51
|
+
targetParent.appendChild(replacement);
|
|
52
|
+
}
|
|
53
|
+
registeredRerun();
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (existingScript) {
|
|
57
|
+
existingScript.replaceWith(replacement);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
targetParent.appendChild(replacement);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function resetRerunNonceForTests() {
|
|
64
|
+
rerunNonce = 0;
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
collectRerunScripts,
|
|
68
|
+
createRerunScriptUrl,
|
|
69
|
+
findExistingRerunScript,
|
|
70
|
+
flushPendingRerunScripts,
|
|
71
|
+
isExternalModuleRerunScript,
|
|
72
|
+
resetRerunNonceForTests
|
|
73
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Window scroll behavior during client-side navigations.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
export type WindowScrollBehavior = 'top' | 'preserve' | 'auto';
|
|
6
|
+
export type ManageWindowScrollOptions = {
|
|
7
|
+
scrollBehavior: WindowScrollBehavior;
|
|
8
|
+
smoothScroll: boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Updates window scroll position after a navigation commit.
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* Hash navigations always scroll to the target element and ignore `scrollBehavior`.
|
|
15
|
+
* Fragment targets are resolved by element id (`#section` → `getElementById('section')`).
|
|
16
|
+
*/
|
|
17
|
+
export declare function manageWindowScroll(newUrl: URL, previousUrl: URL, options: ManageWindowScrollOptions): void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function manageWindowScroll(newUrl, previousUrl, options) {
|
|
2
|
+
const { scrollBehavior, smoothScroll } = options;
|
|
3
|
+
if (newUrl.hash) {
|
|
4
|
+
const target = document.getElementById(newUrl.hash.slice(1));
|
|
5
|
+
target?.scrollIntoView({ behavior: smoothScroll ? "smooth" : "instant" });
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const behavior = smoothScroll ? "smooth" : "instant";
|
|
9
|
+
switch (scrollBehavior) {
|
|
10
|
+
case "preserve":
|
|
11
|
+
break;
|
|
12
|
+
case "auto":
|
|
13
|
+
if (newUrl.pathname !== previousUrl.pathname) {
|
|
14
|
+
window.scrollTo({ top: 0, left: 0, behavior });
|
|
15
|
+
}
|
|
16
|
+
break;
|
|
17
|
+
case "top":
|
|
18
|
+
default:
|
|
19
|
+
window.scrollTo({ top: 0, left: 0, behavior });
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
manageWindowScroll
|
|
25
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { manageWindowScroll } from "./scroll.js";
|
|
3
|
+
const options = { scrollBehavior: "top", smoothScroll: false };
|
|
4
|
+
describe("manageWindowScroll", () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
history.replaceState({}, "", "/");
|
|
7
|
+
document.body.replaceChildren();
|
|
8
|
+
vi.restoreAllMocks();
|
|
9
|
+
});
|
|
10
|
+
it("scrolls to top by default", () => {
|
|
11
|
+
const scrollTo = vi.spyOn(window, "scrollTo").mockImplementation(() => {
|
|
12
|
+
});
|
|
13
|
+
manageWindowScroll(new URL("/next", window.location.origin), new URL("/prev", window.location.origin), options);
|
|
14
|
+
expect(scrollTo).toHaveBeenCalledWith({ top: 0, left: 0, behavior: "instant" });
|
|
15
|
+
});
|
|
16
|
+
it("preserves scroll when scrollBehavior is preserve", () => {
|
|
17
|
+
const scrollTo = vi.spyOn(window, "scrollTo").mockImplementation(() => {
|
|
18
|
+
});
|
|
19
|
+
manageWindowScroll(new URL("/next", window.location.origin), new URL("/prev", window.location.origin), {
|
|
20
|
+
...options,
|
|
21
|
+
scrollBehavior: "preserve"
|
|
22
|
+
});
|
|
23
|
+
expect(scrollTo).not.toHaveBeenCalled();
|
|
24
|
+
});
|
|
25
|
+
it("scrolls to hash target by element id", () => {
|
|
26
|
+
const section = document.createElement("section");
|
|
27
|
+
section.id = "section";
|
|
28
|
+
section.scrollIntoView = vi.fn();
|
|
29
|
+
document.body.append(section);
|
|
30
|
+
manageWindowScroll(
|
|
31
|
+
new URL("/page#section", window.location.origin),
|
|
32
|
+
new URL("/page", window.location.origin),
|
|
33
|
+
options
|
|
34
|
+
);
|
|
35
|
+
expect(section.scrollIntoView).toHaveBeenCalledWith({ behavior: "instant" });
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* View Transition API helpers for `data-view-transition` markup.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Assigns `view-transition-name` from `data-view-transition` and injects morph styles.
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* Elements without `data-view-transition-animate="fade"` get a geometric morph:
|
|
10
|
+
* the old snapshot is hidden so cross-fade ghosting does not appear.
|
|
11
|
+
*/
|
|
12
|
+
export declare function applyViewTransitionNames(): void;
|
|
13
|
+
/**
|
|
14
|
+
* Clears inline transition names and dynamic morph styles after a transition ends.
|
|
15
|
+
*/
|
|
16
|
+
export declare function clearViewTransitionNames(): void;
|