@ecopages/core 0.2.0-beta.8 → 0.2.0-rc.0
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 +42 -13
- package/package.json +361 -58
- package/src/adapters/README.md +6 -2
- package/src/adapters/abstract/application-adapter.d.ts +57 -5
- package/src/adapters/abstract/application-adapter.js +261 -203
- package/src/adapters/abstract/router-adapter.js +12 -4
- package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
- package/src/adapters/abstract/segment-path-matcher.js +147 -0
- package/src/adapters/abstract/server-adapter.d.ts +13 -2
- package/src/adapters/abstract/server-adapter.js +22 -14
- package/src/adapters/abstract/ws-pattern-matcher.d.ts +2 -50
- package/src/adapters/abstract/ws-pattern-matcher.js +24 -57
- package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
- package/src/adapters/bun/client-bridge.js +51 -50
- package/src/adapters/bun/create-app.d.ts +4 -6
- package/src/adapters/bun/create-app.js +169 -154
- package/src/adapters/bun/hmr-manager.d.ts +2 -3
- package/src/adapters/bun/hmr-manager.js +62 -57
- package/src/adapters/bun/index.d.ts +1 -1
- package/src/adapters/bun/index.js +2 -8
- package/src/adapters/bun/runtime-host.d.ts +1 -1
- package/src/adapters/bun/runtime-host.js +61 -54
- package/src/adapters/bun/server-adapter.d.ts +34 -53
- package/src/adapters/bun/server-adapter.js +557 -637
- package/src/adapters/bun/static-preview-host.d.ts +1 -1
- package/src/adapters/bun/static-preview-host.js +43 -41
- package/src/adapters/create-app.d.ts +1 -12
- package/src/adapters/create-app.js +11 -72
- package/src/adapters/index.d.ts +2 -2
- package/src/adapters/index.js +2 -8
- package/src/adapters/node/create-app.d.ts +4 -3
- package/src/adapters/node/create-app.js +123 -98
- package/src/adapters/node/http-request-bridge.js +147 -106
- package/src/adapters/node/node-client-bridge.js +62 -64
- package/src/adapters/node/node-hmr-manager.d.ts +2 -3
- package/src/adapters/node/node-hmr-manager.js +58 -48
- package/src/adapters/node/runtime-host.d.ts +1 -1
- package/src/adapters/node/runtime-host.js +96 -89
- package/src/adapters/node/server-adapter-dependencies.js +18 -17
- package/src/adapters/node/server-adapter.d.ts +28 -8
- package/src/adapters/node/server-adapter.js +349 -302
- package/src/adapters/node/static-content-server.js +172 -186
- package/src/adapters/node/static-preview-host.d.ts +1 -1
- package/src/adapters/node/static-preview-host.js +88 -64
- package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
- package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
- package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
- package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
- package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
- package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
- package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
- package/src/adapters/shared/http/api-request-pipeline.js +132 -0
- package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
- package/src/adapters/shared/http/api-response.js +79 -0
- package/src/adapters/shared/http/create-body-response.d.ts +12 -0
- package/src/adapters/shared/http/create-body-response.js +26 -0
- package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
- package/src/adapters/shared/http/define-api-handler.js +49 -0
- package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
- package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
- package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
- package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
- package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
- package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
- package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
- package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
- package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
- package/src/adapters/shared/http/fs-server-response-matcher.js +260 -0
- package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
- package/src/adapters/shared/http/run-middleware-chain.js +17 -0
- package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
- package/src/adapters/shared/runtime/application-adapter.js +75 -0
- package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
- package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
- package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
- package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
- package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
- package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
- package/src/adapters/shared/runtime/port-manager.js +226 -0
- package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
- package/src/adapters/shared/runtime/render-context.js +99 -0
- package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -2
- package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
- package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
- package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
- package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
- package/src/adapters/shared/runtime/server-adapter.js +301 -0
- package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
- package/src/adapters/shared/runtime/server-route-handler.js +77 -0
- package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +26 -31
- package/src/adapters/shared/runtime/server-static-builder.js +172 -0
- package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
- package/src/adapters/shared/{node-http-websocket-upgrades.d.ts → ws/node-http-websocket-upgrades.d.ts} +1 -1
- package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
- package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
- package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
- package/src/build/README.md +165 -45
- package/src/build/app-build-manifest-runtime.d.ts +39 -0
- package/src/build/app-build-manifest-runtime.js +145 -0
- package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +4 -0
- package/src/build/browser/browser-runtime-manifest.js +65 -0
- package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +3 -5
- package/src/build/browser/browser-runtime-plugin-helpers.js +32 -0
- package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +12 -13
- package/src/build/browser/browser-runtime-plugin.js +218 -0
- package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
- package/src/build/browser/jsx-ownership-plugins.js +55 -0
- package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
- package/src/build/browser/lit-static-render-worker-context.js +4 -0
- package/src/build/build-adapter.d.ts +29 -340
- package/src/build/build-adapter.js +258 -260
- package/src/build/{build-input-fingerprint.d.ts → cache/build-input-fingerprint.d.ts} +3 -3
- package/src/build/cache/build-input-fingerprint.js +33 -0
- package/src/build/cache/cache-constants.d.ts +4 -0
- package/src/build/cache/cache-constants.js +4 -0
- package/src/build/cache/cache-keys.d.ts +22 -0
- package/src/build/cache/cache-keys.js +71 -0
- package/src/build/{pages-unified-graph-build.d.ts → cache/pages-unified-graph-build.d.ts} +1 -1
- package/src/build/cache/pages-unified-graph-build.js +199 -0
- package/src/build/cache/production-build-cache.d.ts +21 -0
- package/src/build/cache/production-build-cache.js +56 -0
- package/src/build/{server-entry-build-cache.d.ts → cache/server-entry-build-cache.d.ts} +3 -4
- package/src/build/cache/server-entry-build-cache.js +153 -0
- package/src/build/contracts/build-contracts.d.ts +96 -0
- package/src/build/contracts/build-contracts.js +1 -0
- package/src/build/contracts/build-manifest.d.ts +90 -0
- package/src/build/contracts/build-manifest.js +64 -0
- package/src/build/contracts/build-types.js +1 -0
- package/src/build/contracts/content-virtual-modules.d.ts +12 -0
- package/src/build/contracts/content-virtual-modules.js +29 -0
- package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
- package/src/build/rolldown/rolldown-adapter-helpers.js +463 -0
- package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
- package/src/build/rolldown/rolldown-build-adapter.js +57 -0
- package/src/build/{rolldown-build-invocation-metrics.d.ts → rolldown/rolldown-build-invocation-metrics.d.ts} +1 -1
- package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
- package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
- package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
- package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
- package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
- package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
- package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
- package/src/build/runtime/build-profile-options.d.ts +7 -0
- package/src/build/runtime/build-profile-options.js +37 -0
- package/src/build/runtime/build-request-identity.d.ts +17 -0
- package/src/build/runtime/build-request-identity.js +79 -0
- package/src/build/runtime/build-request-policy.d.ts +58 -0
- package/src/build/runtime/build-request-policy.js +84 -0
- package/src/build/runtime/build-runtime.d.ts +28 -0
- package/src/build/runtime/build-runtime.js +75 -0
- package/src/build/runtime/deduping-build-executor.d.ts +21 -0
- package/src/build/runtime/deduping-build-executor.js +40 -0
- package/src/build/{parallel-build-executor.d.ts → runtime/parallel-build-executor.d.ts} +1 -1
- package/src/build/runtime/parallel-build-executor.js +60 -0
- package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
- package/src/build/runtime/serialized-build-executor.js +79 -0
- package/src/cache/index.d.ts +2 -1
- package/src/cache/index.js +7 -6
- package/src/cache/module-parse-cache.d.ts +5 -0
- package/src/cache/module-parse-cache.js +122 -67
- package/src/cache/module-transform-profiler.d.ts +8 -0
- package/src/cache/module-transform-profiler.js +8 -0
- package/src/client/navigation-scripts/classification.d.ts +16 -0
- package/src/client/navigation-scripts/classification.js +49 -0
- package/src/client/navigation-scripts/index.d.ts +3 -0
- package/src/client/navigation-scripts/index.js +3 -0
- package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
- package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
- package/src/client/navigation-scripts/registry.d.ts +11 -0
- package/src/client/navigation-scripts/registry.js +16 -0
- package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
- package/src/client/navigation-scripts/rerun-queue.js +90 -0
- package/src/client/scroll.d.ts +17 -0
- package/src/client/scroll.js +33 -0
- package/src/client/scroll.test.browser.d.ts +1 -0
- package/src/client/scroll.test.browser.js +31 -0
- package/src/client/view-transitions.d.ts +32 -0
- package/src/client/view-transitions.js +120 -0
- package/src/client/view-transitions.test.browser.d.ts +1 -0
- package/src/client/view-transitions.test.browser.js +56 -0
- package/src/config/README.md +1 -1
- package/src/config/config-builder.d.ts +42 -12
- package/src/config/config-builder.js +645 -600
- package/src/config/constants.d.ts +1 -0
- package/src/config/constants.js +44 -23
- package/src/declarations.d.ts +1 -0
- package/src/dev/README.md +24 -0
- package/src/dev/client-bridge-registry.d.ts +5 -0
- package/src/dev/client-bridge-registry.js +10 -0
- package/src/dev/dev-client-ownership.d.ts +7 -0
- package/src/dev/dev-client-ownership.js +8 -0
- package/src/dev/hmr-manager-registry.d.ts +8 -0
- package/src/dev/hmr-manager-registry.js +10 -0
- package/src/dev/host-runtime.d.ts +3 -0
- package/src/dev/host-runtime.js +25 -23
- package/src/dev/runtime-server-started-message.d.ts +2 -0
- package/src/dev/runtime-server-started-message.js +3 -0
- package/src/dev/sc-server.js +106 -103
- package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
- package/src/dev/transform-server/dev-transform-bundler.js +79 -0
- package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
- package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
- package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
- package/src/dev/transform-server/dev-transform-import-rewriter.js +127 -0
- package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
- package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
- package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
- package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
- package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
- package/src/dev/transform-server/dev-transform-server.js +191 -0
- package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
- package/src/dev/transform-server/dev-transform-url.js +58 -0
- package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
- package/src/dev/transform-server/dev-transform-vendor-registry.js +166 -0
- package/src/dev/transform-server/index.d.ts +6 -0
- package/src/dev/transform-server/index.js +4 -0
- package/src/dev/transform-server/types.d.ts +15 -0
- package/src/dev/transform-server/types.js +1 -0
- package/src/dev-toolbar/README.md +52 -0
- package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
- package/src/dev-toolbar/define-dev-tool.js +9 -0
- package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
- package/src/dev-toolbar/dev-toolbar-config.js +19 -0
- package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
- package/src/dev-toolbar/dev-toolbar-host.js +117 -0
- package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
- package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
- package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
- package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
- package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
- package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
- package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
- package/src/dev-toolbar/dev-toolbar-package.js +78 -0
- package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
- package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
- package/src/diagnostics/request-build-dedupe.d.ts +18 -0
- package/src/diagnostics/request-build-dedupe.js +39 -0
- package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
- package/src/diagnostics/request-pipeline-metrics.js +121 -0
- package/src/diagnostics/startup-trace.d.ts +81 -0
- package/src/diagnostics/startup-trace.js +281 -0
- package/src/eco/README.md +17 -0
- package/src/eco/component-identity.d.ts +13 -0
- package/src/eco/component-identity.js +18 -0
- package/src/eco/eco-declared-component.d.ts +15 -0
- package/src/eco/eco-declared-component.js +23 -0
- package/src/eco/eco.browser.js +63 -70
- package/src/eco/eco.js +163 -97
- package/src/eco/eco.types.d.ts +47 -8
- package/src/eco/eco.types.js +5 -0
- package/src/eco/eco.utils.d.ts +1 -1
- package/src/eco/eco.utils.js +1 -10
- package/src/eco/global-injector-map.js +55 -41
- package/src/eco/lazy-injector-map.js +90 -60
- package/src/eco/module-dependencies.js +52 -44
- package/src/eco/page-layout-normalization.d.ts +21 -0
- package/src/eco/page-layout-normalization.js +69 -0
- package/src/env.d.ts +2 -0
- package/src/errors/http-error.d.ts +8 -0
- package/src/errors/http-error.js +66 -49
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +3 -6
- package/src/errors/locals-access-error.js +5 -8
- package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
- package/src/errors/undeclared-component-dependency-error.js +17 -0
- package/src/global/app-logger.js +3 -6
- package/src/hmr/README.md +21 -0
- package/src/hmr/client/hmr-runtime.js +119 -110
- package/src/hmr/client/module-update.d.ts +13 -0
- package/src/hmr/client/module-update.js +39 -0
- package/src/hmr/hmr-asset-paths.d.ts +14 -0
- package/src/hmr/hmr-asset-paths.js +22 -0
- package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
- package/src/hmr/hmr-entrypoint-output.js +34 -0
- package/src/hmr/hmr-file-change-prep.d.ts +10 -0
- package/src/hmr/hmr-file-change-prep.js +14 -0
- package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
- package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
- package/src/hmr/hmr-runtime-paths.d.ts +10 -0
- package/src/hmr/hmr-runtime-paths.js +13 -0
- package/src/hmr/hmr-strategy.d.ts +9 -0
- package/src/hmr/hmr-strategy.js +113 -42
- package/src/hmr/strategies/default-hmr-strategy.js +55 -33
- package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
- package/src/hmr/strategies/js-hmr-strategy.js +107 -167
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
- package/src/index.browser.d.ts +1 -0
- package/src/index.browser.js +2 -4
- package/src/index.d.ts +4 -1
- package/src/index.js +7 -21
- package/src/islands/README.md +25 -0
- package/src/islands/island-host.d.ts +37 -0
- package/src/islands/island-host.js +55 -0
- package/src/plugins/README.md +2 -1
- package/src/plugins/alias-resolver-cache.d.ts +6 -9
- package/src/plugins/alias-resolver-cache.js +114 -97
- package/src/plugins/alias-resolver-plugin.d.ts +3 -3
- package/src/plugins/alias-resolver-plugin.js +35 -62
- package/src/plugins/define-integration.d.ts +26 -0
- package/src/plugins/define-integration.js +20 -0
- package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
- package/src/plugins/eco-component-meta-plugin.js +123 -162
- package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
- package/src/plugins/foreign-jsx-override-plugin.js +49 -37
- package/src/plugins/integration-plugin.d.ts +24 -6
- package/src/plugins/integration-plugin.js +212 -195
- package/src/plugins/jsx-import-source.utils.d.ts +8 -0
- package/src/plugins/jsx-import-source.utils.js +21 -0
- package/src/plugins/package-specifier.d.ts +12 -0
- package/src/plugins/package-specifier.js +33 -0
- package/src/plugins/processor.d.ts +66 -12
- package/src/plugins/processor.js +168 -137
- package/src/plugins/runtime-capability.js +1 -0
- package/src/plugins/source-transform.d.ts +32 -1
- package/src/plugins/source-transform.js +112 -60
- package/src/plugins/tsconfig-import-resolver.d.ts +37 -0
- package/src/plugins/tsconfig-import-resolver.js +262 -0
- package/src/route-renderer/GRAPH.md +24 -30
- package/src/route-renderer/README.md +52 -32
- package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
- package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
- package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
- package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
- package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
- package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
- package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +20 -7
- package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +195 -0
- package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
- package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
- package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
- package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +37 -153
- package/src/route-renderer/orchestration/integration-renderer.js +803 -1008
- package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
- package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
- package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
- package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
- package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
- package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
- package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
- package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
- package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +248 -0
- package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
- package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
- package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
- package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
- package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
- package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
- package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
- package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +44 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
- package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
- package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
- package/src/{integrations/ghtml/ghtml-renderer.d.ts → route-renderer/orchestration/string-markup-renderer.d.ts} +8 -10
- package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
- package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
- package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
- package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
- package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
- package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
- package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
- package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
- package/src/route-renderer/page-loading/page-module-loader.js +136 -124
- package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
- package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
- package/src/route-renderer/route-renderer.js +74 -76
- package/src/router/README.md +31 -0
- package/src/router/client/link-intent.d.ts +11 -21
- package/src/router/client/link-intent.js +56 -30
- package/src/router/client/link-intent.test.browser.js +50 -39
- package/src/router/client/link-navigation-policy.d.ts +45 -0
- package/src/router/client/link-navigation-policy.js +122 -0
- package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
- package/src/router/client/link-navigation-policy.test.browser.js +82 -0
- package/src/router/client/navigation-coordinator.d.ts +1 -1
- package/src/router/client/navigation-coordinator.js +235 -211
- package/src/router/client/navigation-lifecycle.d.ts +55 -0
- package/src/router/client/navigation-lifecycle.js +50 -0
- package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
- package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
- package/src/router/server/route-registry.js +237 -242
- package/src/services/README.md +5 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +12 -1
- package/src/services/assets/asset-processing-service/asset-processing.service.js +335 -268
- package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
- package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
- package/src/services/assets/asset-processing-service/assets.types.js +1 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
- package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -58
- package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
- package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
- package/src/services/assets/asset-processing-service/index.d.ts +2 -0
- package/src/services/assets/asset-processing-service/index.js +8 -6
- package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
- package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
- package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
- package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
- package/src/services/assets/asset-processing-service/page-package.js +70 -72
- package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
- package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
- package/src/services/assets/asset-processing-service/processors/index.js +5 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
- package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
- package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
- package/src/services/assets/browser-bundle.service.d.ts +27 -30
- package/src/services/assets/browser-bundle.service.js +54 -46
- package/src/services/assets/browser-runtime-asset-generation.d.ts +17 -0
- package/src/services/assets/browser-runtime-asset-generation.js +28 -0
- package/src/services/cache/cache.types.d.ts +4 -2
- package/src/services/cache/cache.types.js +5 -0
- package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
- package/src/services/cache/html-page-cache-dependency-index.js +88 -0
- package/src/services/cache/index.d.ts +2 -0
- package/src/services/cache/index.js +8 -7
- package/src/services/cache/memory-cache-store.js +101 -89
- package/src/services/cache/page-cache-service.d.ts +31 -1
- package/src/services/cache/page-cache-service.js +237 -150
- package/src/services/cache/page-request-cache-coordinator.service.d.ts +2 -1
- package/src/services/cache/page-request-cache-coordinator.service.js +112 -102
- package/src/services/html/html-rewriter-provider.service.js +61 -61
- package/src/services/html/html-transformer.service.js +249 -266
- package/src/services/invalidation/development-invalidation.service.d.ts +15 -1
- package/src/services/invalidation/development-invalidation.service.js +241 -204
- package/src/services/module-loading/README.md +9 -6
- package/src/services/module-loading/app-module-loader.service.js +1 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +104 -106
- package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
- package/src/services/module-loading/collection-server-module-build.service.js +83 -0
- package/src/services/module-loading/host-module-loader-registry.js +6 -11
- package/src/services/module-loading/module-loading-types.js +1 -0
- package/src/services/module-loading/page-module-import.service.d.ts +7 -12
- package/src/services/module-loading/page-module-import.service.js +232 -206
- package/src/services/module-loading/route-module-build-cache-registry.d.ts +2 -0
- package/src/services/module-loading/route-module-build-cache-registry.js +59 -33
- package/src/services/module-loading/route-module-build-cache.js +3 -38
- package/src/services/module-loading/route-module-build-cache.store.d.ts +10 -0
- package/src/services/module-loading/route-module-build-cache.store.js +213 -196
- package/src/services/module-loading/route-module-build-manifest.d.ts +10 -14
- package/src/services/module-loading/route-module-build-manifest.js +54 -118
- package/src/services/module-loading/route-module-dependency-hasher.d.ts +2 -2
- package/src/services/module-loading/route-module-dependency-hasher.js +136 -109
- package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
- package/src/services/module-loading/server-module-transpiler.service.js +65 -62
- package/src/services/module-loading/source-module-support.js +15 -7
- package/src/services/runtime-state/dev-graph.service.js +165 -157
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
- package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
- package/src/services/validation/schema-validation-service.d.ts +1 -4
- package/src/services/validation/schema-validation-service.js +156 -95
- package/src/services/validation/standard-schema.types.d.ts +9 -62
- package/src/services/validation/standard-schema.types.js +1 -0
- package/src/services/validation/validate-standard-schema.d.ts +7 -0
- package/src/services/validation/validate-standard-schema.js +14 -0
- package/src/static-site-generator/README.md +10 -2
- package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
- package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
- package/src/static-site-generator/sitemap-routes.d.ts +14 -0
- package/src/static-site-generator/sitemap-routes.js +36 -0
- package/src/static-site-generator/sitemap.d.ts +15 -0
- package/src/static-site-generator/sitemap.js +42 -0
- package/src/static-site-generator/static-build-invalidation.d.ts +2 -2
- package/src/static-site-generator/static-build-invalidation.js +33 -74
- package/src/static-site-generator/static-export-context.d.ts +9 -1
- package/src/static-site-generator/static-export-context.js +1 -0
- package/src/static-site-generator/static-site-generator.d.ts +27 -6
- package/src/static-site-generator/static-site-generator.js +528 -389
- package/src/types/internal-types.d.ts +55 -17
- package/src/types/internal-types.js +1 -0
- package/src/types/public-types.d.ts +236 -95
- package/src/types/public-types.js +1 -0
- package/src/utils/deep-merge.js +39 -26
- package/src/utils/ecopages-route-info.d.ts +26 -0
- package/src/utils/ecopages-route-info.js +30 -0
- package/src/utils/hash.js +3 -6
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +22 -5
- package/src/utils/invariant.js +11 -10
- package/src/utils/locals-utils.js +32 -22
- package/src/utils/parse-cli-args.d.ts +1 -0
- package/src/utils/parse-cli-args.js +73 -62
- package/src/utils/path-pattern.d.ts +23 -0
- package/src/utils/path-pattern.js +42 -0
- package/src/utils/path-utils.module.js +8 -11
- package/src/utils/resolve-entry-file.js +70 -38
- package/src/utils/resolve-work-dir.js +23 -27
- package/src/utils/runtime.js +24 -33
- package/src/utils/server-utils.module.d.ts +3 -2
- package/src/utils/server-utils.module.js +60 -53
- package/src/utils/static-file-extensions.d.ts +12 -0
- package/src/utils/static-file-extensions.js +54 -0
- package/src/watchers/project-watcher-ignore.d.ts +11 -0
- package/src/watchers/project-watcher-ignore.js +17 -0
- package/src/watchers/project-watcher.d.ts +21 -6
- package/src/watchers/project-watcher.js +402 -277
- package/src/watchers/project-watcher.test-helpers.js +45 -50
- package/src/adapters/shared/api-response.js +0 -96
- package/src/adapters/shared/application-adapter.js +0 -90
- package/src/adapters/shared/bun-user-websocket-lifecycle.js +0 -102
- package/src/adapters/shared/copy-runtime-public-dir.js +0 -24
- package/src/adapters/shared/define-api-handler.d.ts +0 -25
- package/src/adapters/shared/define-api-handler.js +0 -15
- package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
- package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
- package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
- package/src/adapters/shared/fs-server-response-factory.js +0 -81
- package/src/adapters/shared/fs-server-response-matcher.js +0 -186
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
- package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
- package/src/adapters/shared/hmr-html-response.js +0 -33
- package/src/adapters/shared/node-http-websocket-upgrades.js +0 -125
- package/src/adapters/shared/render-context.js +0 -93
- package/src/adapters/shared/runtime-app-bootstrap.js +0 -41
- package/src/adapters/shared/runtime-host.js +0 -0
- package/src/adapters/shared/server-adapter.js +0 -436
- package/src/adapters/shared/server-route-handler.js +0 -111
- package/src/adapters/shared/server-static-builder.js +0 -202
- package/src/adapters/shared/shared-hmr-manager.d.ts +0 -61
- package/src/adapters/shared/shared-hmr-manager.js +0 -273
- package/src/adapters/shared/static-preview-host.js +0 -0
- package/src/adapters/shared/websocket-lifecycle.d.ts +0 -3
- package/src/adapters/shared/websocket-lifecycle.js +0 -19
- package/src/build/browser-runtime-manifest.js +0 -61
- package/src/build/browser-runtime-plugin-helpers.js +0 -14
- package/src/build/browser-runtime-plugin.js +0 -173
- package/src/build/build-input-fingerprint.js +0 -31
- package/src/build/build-manifest.d.ts +0 -33
- package/src/build/build-manifest.js +0 -49
- package/src/build/build-types.js +0 -0
- package/src/build/jsx-ownership-plugins.d.ts +0 -10
- package/src/build/jsx-ownership-plugins.js +0 -17
- package/src/build/pages-unified-graph-build.js +0 -208
- package/src/build/parallel-build-executor.js +0 -52
- package/src/build/rolldown-adapter-helpers.js +0 -309
- package/src/build/rolldown-build-adapter.js +0 -67
- package/src/build/rolldown-build-invocation-metrics.js +0 -43
- package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
- package/src/build/rolldown-dev-build-adapter.js +0 -182
- package/src/build/rolldown-plugin-bridge.js +0 -199
- package/src/build/runtime-build-executor.d.ts +0 -15
- package/src/build/runtime-build-executor.js +0 -43
- package/src/build/runtime-build-output-normalizer.js +0 -203
- package/src/build/serialized-build-executor.js +0 -63
- package/src/build/server-entry-build-cache.js +0 -169
- package/src/build/server-side-css-shim-plugin.js +0 -35
- package/src/hmr/hmr.postcss.test.e2e.js +0 -31
- package/src/hmr/hmr.test.e2e.js +0 -54
- package/src/integrations/ghtml/ghtml-renderer.js +0 -57
- package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
- package/src/integrations/ghtml/ghtml.constants.js +0 -4
- package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
- package/src/integrations/ghtml/ghtml.plugin.js +0 -20
- package/src/route-renderer/orchestration/component-render-context.js +0 -147
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
- package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -231
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
- package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
- package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
- package/src/route-renderer/orchestration/render-output.utils.js +0 -175
- package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -578
- package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
- package/src/route-renderer/orchestration/template-serialization.js +0 -45
- package/src/utils/html.d.ts +0 -1
- package/src/utils/html.js +0 -4
- /package/src/adapters/{shared → bun}/bun-user-websocket-lifecycle.d.ts +0 -0
- /package/src/adapters/shared/{copy-runtime-public-dir.d.ts → runtime/copy-runtime-public-dir.d.ts} +0 -0
- /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
- /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
- /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
- /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
- /package/src/build/{runtime-build-output-normalizer.d.ts → rolldown/runtime-build-output-normalizer.d.ts} +0 -0
- /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
|
@@ -1,75 +1,130 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Process-wide parse cache for `oxc-parser.parseSync`.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Several build plugins (eco-component-meta, client-graph-boundary,
|
|
6
|
+
* browser-runtime) each call `parseSync` on the same source file with
|
|
7
|
+
* overlapping options. This cache memoizes the parse result keyed by
|
|
8
|
+
* `(absolute path, source, options)`. When the source is unchanged,
|
|
9
|
+
* subsequent calls return the cached result without re-parsing.
|
|
10
|
+
*
|
|
11
|
+
* The cache is LRU-bounded (10 000 entries) and key-stable across a
|
|
12
|
+
* single HMR session. It is **content-hashed** rather than
|
|
13
|
+
* mtime-hashed so that `touch`/`utimes` does not invalidate a
|
|
14
|
+
* still-valid parse.
|
|
15
|
+
*/
|
|
16
|
+
import { extname } from 'node:path';
|
|
17
|
+
import { parseSync } from 'oxc-parser';
|
|
18
|
+
import { rapidhash } from '../utils/hash.js';
|
|
19
|
+
const DEFAULT_MAX_ENTRIES = 10_000;
|
|
20
|
+
/** Resolves the Oxc dialect for a source module from its file extension. */
|
|
21
|
+
export function parserLanguageForFile(filePath) {
|
|
22
|
+
const extension = extname(filePath).toLowerCase();
|
|
23
|
+
if (extension === '.tsx')
|
|
24
|
+
return 'tsx';
|
|
25
|
+
if (extension === '.ts' || extension === '.mts' || extension === '.cts')
|
|
26
|
+
return 'ts';
|
|
27
|
+
if (extension === '.jsx')
|
|
28
|
+
return 'jsx';
|
|
29
|
+
return 'js';
|
|
30
|
+
}
|
|
31
|
+
/** Parses an ECMAScript module with the shared, normalized cache contract. */
|
|
32
|
+
export function parseModuleSource(filePath, source, options = {}) {
|
|
33
|
+
return moduleParseCache.getOrParse(filePath, source, normalizeModuleParseOptions(filePath, options));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* LRU-bounded module parse cache.
|
|
37
|
+
*
|
|
38
|
+
* Single instance shared across the process. Constructed lazily; use
|
|
39
|
+
* {@link moduleParseCache} for the default shared instance.
|
|
40
|
+
*/
|
|
41
|
+
export class ModuleParseCache {
|
|
42
|
+
entries = new Map();
|
|
43
|
+
maxEntries;
|
|
44
|
+
hits = 0;
|
|
45
|
+
misses = 0;
|
|
46
|
+
constructor(maxEntries = DEFAULT_MAX_ENTRIES) {
|
|
47
|
+
if (maxEntries <= 0) {
|
|
48
|
+
throw new Error(`ModuleParseCache: maxEntries must be > 0, got ${maxEntries}`);
|
|
49
|
+
}
|
|
50
|
+
this.maxEntries = maxEntries;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Parse `source` for `filePath`, memoizing by (filePath, source, options).
|
|
54
|
+
*
|
|
55
|
+
* @returns the {@link ParseResult} from `oxc-parser.parseSync`.
|
|
56
|
+
*/
|
|
57
|
+
getOrParse(filePath, source, options = {}) {
|
|
58
|
+
const normalizedOptions = normalizeModuleParseOptions(filePath, options);
|
|
59
|
+
const hash = rapidhash(source);
|
|
60
|
+
const key = makeKey(filePath, hash, normalizedOptions);
|
|
61
|
+
const existing = this.entries.get(key);
|
|
62
|
+
if (existing && existing.hash === hash) {
|
|
63
|
+
this.hits += 1;
|
|
64
|
+
// Refresh LRU position.
|
|
65
|
+
this.entries.delete(key);
|
|
66
|
+
this.entries.set(key, existing);
|
|
67
|
+
return existing.result;
|
|
68
|
+
}
|
|
69
|
+
this.misses += 1;
|
|
70
|
+
const result = parseSync(filePath, source, normalizedOptions);
|
|
71
|
+
this.entries.set(key, { hash, result });
|
|
72
|
+
if (this.entries.size > this.maxEntries) {
|
|
73
|
+
// Map iteration order is insertion order; the first key is the
|
|
74
|
+
// least recently used (we delete-then-set on hits, so the
|
|
75
|
+
// oldest still-present entry is the LRU one).
|
|
76
|
+
const oldestKey = this.entries.keys().next().value;
|
|
77
|
+
if (oldestKey !== undefined) {
|
|
78
|
+
this.entries.delete(oldestKey);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
/** Clear all cached entries. Useful in tests and on full-rebuild signals. */
|
|
84
|
+
clear() {
|
|
85
|
+
this.entries.clear();
|
|
86
|
+
this.hits = 0;
|
|
87
|
+
this.misses = 0;
|
|
12
88
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* Parse `source` for `filePath`, memoizing by (filePath, source, options).
|
|
17
|
-
*
|
|
18
|
-
* @returns the {@link ParseResult} from `oxc-parser.parseSync`.
|
|
19
|
-
*/
|
|
20
|
-
getOrParse(filePath, source, options = {}) {
|
|
21
|
-
const hash = rapidhash(source);
|
|
22
|
-
const key = makeKey(filePath, hash, options);
|
|
23
|
-
const existing = this.entries.get(key);
|
|
24
|
-
if (existing && existing.hash === hash) {
|
|
25
|
-
this.hits += 1;
|
|
26
|
-
this.entries.delete(key);
|
|
27
|
-
this.entries.set(key, existing);
|
|
28
|
-
return existing.result;
|
|
89
|
+
/** Current cache size (for observability). */
|
|
90
|
+
get size() {
|
|
91
|
+
return this.entries.size;
|
|
29
92
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
93
|
+
/** Cumulative hit/miss counters (for observability). */
|
|
94
|
+
stats() {
|
|
95
|
+
const total = this.hits + this.misses;
|
|
96
|
+
return {
|
|
97
|
+
hits: this.hits,
|
|
98
|
+
misses: this.misses,
|
|
99
|
+
size: this.entries.size,
|
|
100
|
+
hitRate: total === 0 ? 0 : this.hits / total,
|
|
101
|
+
};
|
|
38
102
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Default shared cache. Use this from plugin code so the cache is
|
|
106
|
+
* amortized across plugins and build invocations.
|
|
107
|
+
*/
|
|
108
|
+
export const moduleParseCache = new ModuleParseCache();
|
|
109
|
+
/**
|
|
110
|
+
* Drop-in replacement for `oxc-parser.parseSync` that uses the shared
|
|
111
|
+
* {@link moduleParseCache}. Use everywhere we currently call `parseSync`
|
|
112
|
+
* on user/source files during a build.
|
|
113
|
+
*/
|
|
114
|
+
export function cachedParseSync(filePath, source, options = {}) {
|
|
115
|
+
return parseModuleSource(filePath, source, options);
|
|
116
|
+
}
|
|
117
|
+
function normalizeModuleParseOptions(filePath, options) {
|
|
54
118
|
return {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
hitRate: total === 0 ? 0 : this.hits / total
|
|
119
|
+
...options,
|
|
120
|
+
lang: options.lang ?? parserLanguageForFile(filePath),
|
|
121
|
+
sourceType: options.sourceType ?? 'module',
|
|
59
122
|
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
const moduleParseCache = new ModuleParseCache();
|
|
63
|
-
function cachedParseSync(filePath, source, options = {}) {
|
|
64
|
-
return moduleParseCache.getOrParse(filePath, source, options);
|
|
65
123
|
}
|
|
66
124
|
function makeKey(filePath, sourceHash, options) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
125
|
+
// Stringify only the option keys we actually use; `parseSync` does
|
|
126
|
+
// not deeply equal-check options so any extra keys would be noise.
|
|
127
|
+
const lang = options.lang ?? '';
|
|
128
|
+
const sourceType = options.sourceType ?? '';
|
|
129
|
+
return `${filePath} ${sourceHash.toString(36)} ${lang} ${sourceType}`;
|
|
70
130
|
}
|
|
71
|
-
export {
|
|
72
|
-
ModuleParseCache,
|
|
73
|
-
cachedParseSync,
|
|
74
|
-
moduleParseCache
|
|
75
|
-
};
|
|
@@ -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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classifies head scripts for navigation-time persistence and execution.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
const EXECUTABLE_SCRIPT_TYPES = new Set([
|
|
6
|
+
'application/javascript',
|
|
7
|
+
'application/ecmascript',
|
|
8
|
+
'module',
|
|
9
|
+
'text/ecmascript',
|
|
10
|
+
'text/javascript',
|
|
11
|
+
]);
|
|
12
|
+
/**
|
|
13
|
+
* Returns whether a script tag carries non-executable data (for example JSON-LD).
|
|
14
|
+
*/
|
|
15
|
+
export function isNonExecutableHeadScript(element) {
|
|
16
|
+
if (element.tagName !== 'SCRIPT') {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const type = (element.getAttribute('type') ?? '').trim().toLowerCase();
|
|
20
|
+
if (!type) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return !EXECUTABLE_SCRIPT_TYPES.has(type);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns whether an identified inline head script should survive head diffing.
|
|
27
|
+
*/
|
|
28
|
+
export function shouldPersistExecutableInlineHeadScript(element) {
|
|
29
|
+
if (element.tagName !== 'SCRIPT') {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const scriptId = element.getAttribute('data-eco-script-id') || element.getAttribute('id');
|
|
33
|
+
if (!scriptId) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (element.hasAttribute('data-eco-rerun')) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (element.src) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return !isNonExecutableHeadScript(element);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns whether a script is queued for rerun after navigation commit.
|
|
46
|
+
*/
|
|
47
|
+
export function isRerunScript(element) {
|
|
48
|
+
return element.tagName === 'SCRIPT' && element.hasAttribute('data-eco-rerun');
|
|
49
|
+
}
|
|
@@ -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,3 @@
|
|
|
1
|
+
export { isNonExecutableHeadScript, isRerunScript, shouldPersistExecutableInlineHeadScript } from './classification.js';
|
|
2
|
+
export { RERUN_SRC_ATTR, getRegisteredRerunScript } from './registry.js';
|
|
3
|
+
export { collectRerunScripts, createRerunScriptUrl, findExistingRerunScript, flushPendingRerunScripts, isExternalModuleRerunScript, resetRerunNonceForTests, } from './rerun-queue.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { isNonExecutableHeadScript } from './classification.js';
|
|
3
|
+
import { collectRerunScripts, createRerunScriptUrl, flushPendingRerunScripts, resetRerunNonceForTests, } from './rerun-queue.js';
|
|
4
|
+
import { RERUN_SRC_ATTR } from './registry.js';
|
|
5
|
+
describe('isNonExecutableHeadScript', () => {
|
|
6
|
+
it('treats JSON-LD scripts as non-executable', () => {
|
|
7
|
+
const script = document.createElement('script');
|
|
8
|
+
script.type = 'application/ld+json';
|
|
9
|
+
expect(isNonExecutableHeadScript(script)).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
it('treats untyped scripts as executable', () => {
|
|
12
|
+
const script = document.createElement('script');
|
|
13
|
+
expect(isNonExecutableHeadScript(script)).toBe(false);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe('collectRerunScripts and flushPendingRerunScripts', () => {
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
document.head.replaceChildren();
|
|
19
|
+
document.body.replaceChildren();
|
|
20
|
+
resetRerunNonceForTests();
|
|
21
|
+
});
|
|
22
|
+
it('replays registered rerun callbacks without duplicating script tags', () => {
|
|
23
|
+
const callback = vi.fn();
|
|
24
|
+
window.__ECO_PAGES__ = {
|
|
25
|
+
rerunScripts: { 'eco-test': callback },
|
|
26
|
+
};
|
|
27
|
+
try {
|
|
28
|
+
flushPendingRerunScripts([
|
|
29
|
+
{
|
|
30
|
+
parent: 'head',
|
|
31
|
+
attributes: [
|
|
32
|
+
['data-eco-rerun', ''],
|
|
33
|
+
['data-eco-script-id', 'eco-test'],
|
|
34
|
+
],
|
|
35
|
+
textContent: '',
|
|
36
|
+
src: null,
|
|
37
|
+
scriptId: 'eco-test',
|
|
38
|
+
},
|
|
39
|
+
]);
|
|
40
|
+
expect(callback).toHaveBeenCalledOnce();
|
|
41
|
+
expect(document.head.querySelector('script[data-eco-script-id="eco-test"]')).toBeNull();
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
delete window.__ECO_PAGES__;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it('cache-busts external module rerun scripts', () => {
|
|
48
|
+
const html = '<html><head><script data-eco-rerun src="/app.js" type="module"></script></head></html>';
|
|
49
|
+
const parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
50
|
+
const scripts = collectRerunScripts(parsed);
|
|
51
|
+
flushPendingRerunScripts(scripts);
|
|
52
|
+
const inserted = document.head.querySelector(`script[${RERUN_SRC_ATTR}]`);
|
|
53
|
+
expect(inserted?.getAttribute('src')).toMatch(/__eco_rerun=1/);
|
|
54
|
+
expect(inserted?.getAttribute(RERUN_SRC_ATTR)).toBe('/app.js');
|
|
55
|
+
});
|
|
56
|
+
it('appends a unique nonce on each module rerun url', () => {
|
|
57
|
+
const first = createRerunScriptUrl('/app.js');
|
|
58
|
+
const second = createRerunScriptUrl('/app.js');
|
|
59
|
+
expect(first).not.toBe(second);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -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,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `__ECO_PAGES__.rerunScripts` registry access for navigation reruns.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
/** Attribute storing the original module `src` after cache-busting. */
|
|
6
|
+
export const RERUN_SRC_ATTR = 'data-eco-rerun-src';
|
|
7
|
+
/**
|
|
8
|
+
* Returns a registered in-memory rerun callback for the given script id.
|
|
9
|
+
*/
|
|
10
|
+
export function getRegisteredRerunScript(scriptId) {
|
|
11
|
+
if (!scriptId) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const runtimeWindow = window;
|
|
15
|
+
return runtimeWindow.__ECO_PAGES__?.rerunScripts?.[scriptId] ?? null;
|
|
16
|
+
}
|
|
@@ -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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queueing and replay of `data-eco-rerun` scripts after navigation.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
import { RERUN_SRC_ATTR, getRegisteredRerunScript } from './registry.js';
|
|
6
|
+
let rerunNonce = 0;
|
|
7
|
+
/**
|
|
8
|
+
* Collects rerun scripts from an incoming document.
|
|
9
|
+
*/
|
|
10
|
+
export function collectRerunScripts(document, filter) {
|
|
11
|
+
return Array.from(document.querySelectorAll('script[data-eco-rerun]'))
|
|
12
|
+
.filter((script) => (filter ? filter(script) : true))
|
|
13
|
+
.map((script) => ({
|
|
14
|
+
parent: script.closest('body') ? 'body' : 'head',
|
|
15
|
+
attributes: Array.from(script.attributes).map((attribute) => [attribute.name, attribute.value]),
|
|
16
|
+
textContent: script.textContent ?? '',
|
|
17
|
+
src: script.getAttribute('src'),
|
|
18
|
+
scriptId: script.getAttribute('data-eco-script-id'),
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns whether a rerun script is an external ES module that needs cache busting.
|
|
23
|
+
*/
|
|
24
|
+
export function isExternalModuleRerunScript(script) {
|
|
25
|
+
if (!script.src) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return script.attributes.some(([name, value]) => name === 'type' && value === 'module');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Finds an existing rerun script in `root` by id or by src and inline content.
|
|
32
|
+
*/
|
|
33
|
+
export function findExistingRerunScript(root, script) {
|
|
34
|
+
const scripts = Array.from(root.querySelectorAll('script'));
|
|
35
|
+
if (script.scriptId) {
|
|
36
|
+
return scripts.find((candidate) => candidate.getAttribute('data-eco-script-id') === script.scriptId) ?? null;
|
|
37
|
+
}
|
|
38
|
+
return (scripts.find((candidate) => (candidate.getAttribute(RERUN_SRC_ATTR) ?? candidate.getAttribute('src')) === script.src &&
|
|
39
|
+
(candidate.textContent ?? '') === script.textContent) ?? null);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Appends a nonce query parameter so module scripts re-execute after navigation.
|
|
43
|
+
*/
|
|
44
|
+
export function createRerunScriptUrl(src) {
|
|
45
|
+
const url = new URL(src, document.baseURI);
|
|
46
|
+
url.searchParams.set('__eco_rerun', String(++rerunNonce));
|
|
47
|
+
return url.toString();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Replays queued rerun scripts after the incoming page body is in place.
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* Flushed elements keep `data-eco-rerun` so head cleanup does not treat them
|
|
54
|
+
* as persistable inline scripts on the next navigation.
|
|
55
|
+
*/
|
|
56
|
+
export function flushPendingRerunScripts(scripts) {
|
|
57
|
+
for (const script of scripts) {
|
|
58
|
+
const targetParent = script.parent === 'body' ? document.body : document.head;
|
|
59
|
+
const registeredRerun = getRegisteredRerunScript(script.scriptId);
|
|
60
|
+
const replacement = document.createElement('script');
|
|
61
|
+
const shouldBustModuleSrc = isExternalModuleRerunScript(script) && !registeredRerun;
|
|
62
|
+
for (const [name, value] of script.attributes) {
|
|
63
|
+
if (name === 'src' && shouldBustModuleSrc) {
|
|
64
|
+
replacement.setAttribute(RERUN_SRC_ATTR, value);
|
|
65
|
+
replacement.setAttribute('src', createRerunScriptUrl(value));
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
replacement.setAttribute(name, value);
|
|
69
|
+
}
|
|
70
|
+
replacement.textContent = script.textContent;
|
|
71
|
+
const existingScript = findExistingRerunScript(targetParent, script);
|
|
72
|
+
if (registeredRerun) {
|
|
73
|
+
const needsScriptElement = isExternalModuleRerunScript(script);
|
|
74
|
+
if (!existingScript && needsScriptElement) {
|
|
75
|
+
targetParent.appendChild(replacement);
|
|
76
|
+
}
|
|
77
|
+
registeredRerun();
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (existingScript) {
|
|
81
|
+
existingScript.replaceWith(replacement);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
targetParent.appendChild(replacement);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** @remarks Test-only reset for nonce sequencing. */
|
|
88
|
+
export function resetRerunNonceForTests() {
|
|
89
|
+
rerunNonce = 0;
|
|
90
|
+
}
|
|
@@ -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,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Window scroll behavior during client-side navigations.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Updates window scroll position after a navigation commit.
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* Hash navigations always scroll to the target element and ignore `scrollBehavior`.
|
|
10
|
+
* Fragment targets are resolved by element id (`#section` → `getElementById('section')`).
|
|
11
|
+
*/
|
|
12
|
+
export function manageWindowScroll(newUrl, previousUrl, options) {
|
|
13
|
+
const { scrollBehavior, smoothScroll } = options;
|
|
14
|
+
if (newUrl.hash) {
|
|
15
|
+
const target = document.getElementById(newUrl.hash.slice(1));
|
|
16
|
+
target?.scrollIntoView({ behavior: smoothScroll ? 'smooth' : 'instant' });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const behavior = smoothScroll ? 'smooth' : 'instant';
|
|
20
|
+
switch (scrollBehavior) {
|
|
21
|
+
case 'preserve':
|
|
22
|
+
break;
|
|
23
|
+
case 'auto':
|
|
24
|
+
if (newUrl.pathname !== previousUrl.pathname) {
|
|
25
|
+
window.scrollTo({ top: 0, left: 0, behavior });
|
|
26
|
+
}
|
|
27
|
+
break;
|
|
28
|
+
case 'top':
|
|
29
|
+
default:
|
|
30
|
+
window.scrollTo({ top: 0, left: 0, behavior });
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
manageWindowScroll(new URL('/next', window.location.origin), new URL('/prev', window.location.origin), options);
|
|
13
|
+
expect(scrollTo).toHaveBeenCalledWith({ top: 0, left: 0, behavior: 'instant' });
|
|
14
|
+
});
|
|
15
|
+
it('preserves scroll when scrollBehavior is preserve', () => {
|
|
16
|
+
const scrollTo = vi.spyOn(window, 'scrollTo').mockImplementation(() => { });
|
|
17
|
+
manageWindowScroll(new URL('/next', window.location.origin), new URL('/prev', window.location.origin), {
|
|
18
|
+
...options,
|
|
19
|
+
scrollBehavior: 'preserve',
|
|
20
|
+
});
|
|
21
|
+
expect(scrollTo).not.toHaveBeenCalled();
|
|
22
|
+
});
|
|
23
|
+
it('scrolls to hash target by element id', () => {
|
|
24
|
+
const section = document.createElement('section');
|
|
25
|
+
section.id = 'section';
|
|
26
|
+
section.scrollIntoView = vi.fn();
|
|
27
|
+
document.body.append(section);
|
|
28
|
+
manageWindowScroll(new URL('/page#section', window.location.origin), new URL('/page', window.location.origin), options);
|
|
29
|
+
expect(section.scrollIntoView).toHaveBeenCalledWith({ behavior: 'instant' });
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* View Transition API helpers for `data-view-transition` markup and safe root defaults.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Whether a document tree contains elements that participate in named view transitions.
|
|
7
|
+
*/
|
|
8
|
+
export declare function documentHasNamedViewTransitions(doc: Document): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Whether SPA navigation should use `startViewTransition` (old or incoming page).
|
|
11
|
+
*/
|
|
12
|
+
export declare function navigationHasNamedViewTransitions(current: Document, incoming: Document): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Injects persisted CSS that opts the document out of the root view-transition group.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* Uses `data-eco-persist` so head morphing does not drop the stylesheet between navigations.
|
|
18
|
+
* Named `data-view-transition` morph / fade rules live in a separate dynamic style tag.
|
|
19
|
+
*/
|
|
20
|
+
export declare function ensureRootViewTransitionStyles(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Assigns `view-transition-name` from `data-view-transition` and injects morph styles.
|
|
23
|
+
*
|
|
24
|
+
* @remarks
|
|
25
|
+
* Elements without `data-view-transition-animate="fade"` get a geometric morph:
|
|
26
|
+
* the old snapshot is hidden so cross-fade ghosting does not appear.
|
|
27
|
+
*/
|
|
28
|
+
export declare function applyViewTransitionNames(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Clears inline transition names and dynamic morph styles after a transition ends.
|
|
31
|
+
*/
|
|
32
|
+
export declare function clearViewTransitionNames(): void;
|