@ecopages/core 0.2.0-alpha.27 → 0.2.0-alpha.28
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/CHANGELOG.md +91 -0
- package/package.json +162 -72
- package/src/adapters/abstract/application-adapter.d.ts +194 -0
- package/src/adapters/abstract/application-adapter.js +121 -0
- package/src/adapters/abstract/router-adapter.d.ts +26 -0
- package/src/adapters/abstract/router-adapter.js +5 -0
- package/src/adapters/abstract/server-adapter.d.ts +69 -0
- package/src/adapters/abstract/server-adapter.js +15 -0
- package/src/adapters/bun/client-bridge.d.ts +34 -0
- package/src/adapters/bun/client-bridge.js +48 -0
- package/src/adapters/bun/create-app.d.ts +53 -0
- package/src/adapters/bun/create-app.js +153 -0
- package/src/adapters/bun/hmr-manager.d.ts +131 -0
- package/src/adapters/bun/hmr-manager.js +312 -0
- package/src/adapters/bun/index.d.ts +2 -0
- package/src/adapters/bun/index.js +8 -0
- package/src/adapters/bun/server-adapter.d.ts +155 -0
- package/src/adapters/bun/server-adapter.js +393 -0
- package/src/adapters/bun/server-lifecycle.d.ts +63 -0
- package/src/adapters/bun/server-lifecycle.js +92 -0
- package/src/adapters/create-app.d.ts +20 -0
- package/src/adapters/create-app.js +66 -0
- package/src/adapters/index.d.ts +2 -0
- package/src/adapters/index.js +8 -0
- package/src/adapters/node/create-app.d.ts +18 -0
- package/src/adapters/node/create-app.js +149 -0
- package/src/adapters/node/node-client-bridge.d.ts +26 -0
- package/src/adapters/node/node-client-bridge.js +66 -0
- package/src/adapters/node/node-hmr-manager.d.ts +121 -0
- package/src/adapters/node/node-hmr-manager.js +290 -0
- package/src/adapters/node/server-adapter.d.ts +162 -0
- package/src/adapters/node/server-adapter.js +368 -0
- package/src/adapters/node/static-content-server.d.ts +60 -0
- package/src/adapters/node/static-content-server.js +194 -0
- package/src/adapters/shared/api-response.d.ts +52 -0
- package/src/adapters/shared/api-response.js +96 -0
- package/src/adapters/shared/application-adapter.d.ts +18 -0
- package/src/adapters/shared/application-adapter.js +90 -0
- package/src/adapters/shared/define-api-handler.d.ts +25 -0
- package/src/adapters/shared/define-api-handler.js +15 -0
- package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
- package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +41 -0
- package/src/adapters/shared/explicit-static-route-matcher.js +101 -0
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +62 -0
- package/src/adapters/shared/file-route-middleware-pipeline.js +90 -0
- package/src/adapters/shared/fs-server-response-factory.d.ts +23 -0
- package/src/adapters/shared/fs-server-response-factory.js +81 -0
- package/src/adapters/shared/fs-server-response-matcher.d.ts +75 -0
- package/src/adapters/shared/fs-server-response-matcher.js +186 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
- package/src/adapters/shared/hmr-html-response.d.ts +22 -0
- package/src/adapters/shared/hmr-html-response.js +32 -0
- package/src/adapters/shared/render-context.d.ts +15 -0
- package/src/adapters/shared/render-context.js +72 -0
- package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
- package/src/adapters/shared/runtime-bootstrap.js +43 -0
- package/src/adapters/shared/server-adapter.d.ts +108 -0
- package/src/adapters/shared/server-adapter.js +429 -0
- package/src/adapters/shared/server-route-handler.d.ts +89 -0
- package/src/adapters/shared/server-route-handler.js +111 -0
- package/src/adapters/shared/server-static-builder.d.ts +71 -0
- package/src/adapters/shared/server-static-builder.js +100 -0
- package/src/build/build-adapter.d.ts +239 -0
- package/src/build/build-adapter.js +642 -0
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -0
- package/src/build/build-types.d.ts +57 -0
- package/src/build/build-types.js +0 -0
- package/src/build/dev-build-coordinator.d.ts +72 -0
- package/src/build/dev-build-coordinator.js +154 -0
- package/src/build/esbuild-build-adapter.d.ts +78 -0
- package/src/build/esbuild-build-adapter.js +505 -0
- package/src/build/runtime-build-executor.d.ts +14 -0
- package/src/build/runtime-build-executor.js +22 -0
- package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
- package/src/build/runtime-specifier-alias-plugin.js +35 -0
- package/src/build/runtime-specifier-aliases.d.ts +5 -0
- package/src/build/runtime-specifier-aliases.js +95 -0
- package/src/config/config-builder.d.ts +252 -0
- package/src/config/config-builder.js +598 -0
- package/src/config/{constants.ts → constants.d.ts} +13 -22
- package/src/config/constants.js +25 -0
- package/src/dev/host-runtime.d.ts +10 -0
- package/src/dev/host-runtime.js +24 -0
- package/src/dev/sc-server.d.ts +30 -0
- package/src/dev/sc-server.js +111 -0
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +83 -0
- package/src/eco/eco.d.ts +9 -0
- package/src/eco/eco.js +85 -0
- package/src/eco/eco.types.d.ts +178 -0
- package/src/eco/eco.types.js +0 -0
- package/src/eco/eco.utils.d.ts +1 -0
- package/src/eco/eco.utils.js +10 -0
- package/src/eco/global-injector-map.d.ts +16 -0
- package/src/eco/global-injector-map.js +80 -0
- package/src/eco/lazy-injector-map.d.ts +8 -0
- package/src/eco/lazy-injector-map.js +70 -0
- package/src/eco/module-dependencies.d.ts +18 -0
- package/src/eco/module-dependencies.js +49 -0
- package/src/errors/http-error.d.ts +31 -0
- package/src/errors/http-error.js +50 -0
- package/src/errors/index.d.ts +3 -0
- package/src/errors/index.js +6 -0
- package/src/errors/locals-access-error.d.ts +4 -0
- package/src/errors/locals-access-error.js +9 -0
- package/src/global/app-logger.d.ts +2 -0
- package/src/global/app-logger.js +6 -0
- package/src/hmr/client/hmr-runtime.d.ts +5 -0
- package/src/hmr/client/hmr-runtime.js +117 -0
- package/src/hmr/hmr-strategy.d.ts +162 -0
- package/src/hmr/hmr-strategy.js +44 -0
- package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
- package/src/hmr/hmr.postcss.test.e2e.js +31 -0
- package/src/hmr/hmr.test.e2e.d.ts +1 -0
- package/src/hmr/hmr.test.e2e.js +43 -0
- package/src/hmr/strategies/default-hmr-strategy.d.ts +43 -0
- package/src/hmr/strategies/default-hmr-strategy.js +34 -0
- package/src/hmr/strategies/js-hmr-strategy.d.ts +134 -0
- package/src/hmr/strategies/js-hmr-strategy.js +178 -0
- package/src/index.browser.d.ts +3 -0
- package/src/index.browser.js +4 -0
- package/src/index.d.ts +6 -0
- package/src/index.js +21 -0
- package/src/integrations/ghtml/ghtml-renderer.d.ts +16 -0
- package/src/integrations/ghtml/ghtml-renderer.js +57 -0
- package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
- package/src/integrations/ghtml/ghtml.constants.js +4 -0
- package/src/integrations/ghtml/ghtml.plugin.d.ts +16 -0
- package/src/integrations/ghtml/ghtml.plugin.js +20 -0
- package/src/plugins/alias-resolver-plugin.d.ts +2 -0
- package/src/plugins/alias-resolver-plugin.js +53 -0
- package/src/plugins/eco-component-meta-plugin.d.ts +108 -0
- package/src/plugins/eco-component-meta-plugin.js +162 -0
- package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
- package/src/plugins/foreign-jsx-override-plugin.js +35 -0
- package/src/plugins/integration-plugin.d.ts +215 -0
- package/src/plugins/integration-plugin.js +189 -0
- package/src/plugins/processor.d.ts +97 -0
- package/src/plugins/processor.js +141 -0
- package/src/plugins/{runtime-capability.ts → runtime-capability.d.ts} +3 -8
- package/src/plugins/runtime-capability.js +0 -0
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/orchestration/component-render-context.d.ts +89 -0
- package/src/route-renderer/orchestration/component-render-context.js +147 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +108 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +206 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +516 -0
- package/src/route-renderer/orchestration/integration-renderer.js +909 -0
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
- package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
- package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +2 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +90 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +158 -0
- package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
- package/src/route-renderer/orchestration/render-output.utils.js +171 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +120 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.js +388 -0
- package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
- package/src/route-renderer/orchestration/template-serialization.js +45 -0
- package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
- package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
- package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
- package/src/route-renderer/page-loading/dependency-resolver.d.ts +35 -0
- package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
- package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
- package/src/route-renderer/page-loading/page-module-loader.js +127 -0
- package/src/route-renderer/route-renderer.d.ts +69 -0
- package/src/route-renderer/route-renderer.js +80 -0
- package/src/router/client/link-intent.js +34 -0
- package/src/router/client/link-intent.test.browser.d.ts +1 -0
- package/src/router/client/link-intent.test.browser.js +43 -0
- package/src/router/client/navigation-coordinator.d.ts +169 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/server/route-registry.d.ts +78 -0
- package/src/router/server/route-registry.js +262 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.js +285 -0
- package/src/services/assets/asset-processing-service/asset.factory.d.ts +17 -0
- package/src/services/assets/asset-processing-service/asset.factory.js +82 -0
- package/src/services/assets/asset-processing-service/assets.types.d.ts +103 -0
- package/src/services/assets/asset-processing-service/assets.types.js +0 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
- package/src/services/assets/asset-processing-service/index.d.ts +6 -0
- package/src/services/assets/asset-processing-service/index.js +6 -0
- package/src/services/assets/asset-processing-service/page-package.d.ts +3 -0
- package/src/services/assets/asset-processing-service/page-package.js +74 -0
- package/src/services/assets/asset-processing-service/{processor.interface.ts → processor.interface.d.ts} +5 -10
- package/src/services/assets/asset-processing-service/processor.interface.js +6 -0
- package/src/services/assets/asset-processing-service/processor.registry.d.ts +8 -0
- package/src/services/assets/asset-processing-service/processor.registry.js +15 -0
- package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +24 -0
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +65 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
- package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/index.js +5 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +6 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +9 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +97 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +7 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +79 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +8 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +9 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +69 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
- package/src/services/assets/browser-bundle.service.d.ts +73 -0
- package/src/services/assets/browser-bundle.service.js +41 -0
- package/src/services/cache/cache.types.d.ts +107 -0
- package/src/services/cache/cache.types.js +0 -0
- package/src/services/cache/index.d.ts +7 -0
- package/src/services/cache/index.js +7 -0
- package/src/services/cache/memory-cache-store.d.ts +42 -0
- package/src/services/cache/memory-cache-store.js +98 -0
- package/src/services/cache/page-cache-service.d.ts +70 -0
- package/src/services/cache/page-cache-service.js +152 -0
- package/src/services/cache/page-request-cache-coordinator.service.d.ts +75 -0
- package/src/services/cache/page-request-cache-coordinator.service.js +109 -0
- package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
- package/src/services/html/html-rewriter-provider.service.js +68 -0
- package/src/services/html/html-transformer.service.d.ts +87 -0
- package/src/services/html/html-transformer.service.js +216 -0
- package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
- package/src/services/invalidation/development-invalidation.service.js +190 -0
- package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
- package/src/services/module-loading/app-module-loader.service.js +0 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +115 -0
- package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
- package/src/services/module-loading/host-module-loader-registry.js +15 -0
- package/src/services/module-loading/{module-loading-types.ts → module-loading-types.d.ts} +0 -1
- package/src/services/module-loading/module-loading-types.js +0 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +216 -0
- package/src/services/module-loading/page-module-import.service.d.ts +76 -0
- package/src/services/module-loading/page-module-import.service.js +170 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
- package/src/services/module-loading/server-module-transpiler.service.js +64 -0
- package/src/services/module-loading/source-module-support.d.ts +5 -0
- package/src/services/module-loading/source-module-support.js +8 -0
- package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
- package/src/services/runtime-state/dev-graph.service.js +162 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
- package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
- package/src/services/validation/schema-validation-service.d.ts +122 -0
- package/src/services/validation/schema-validation-service.js +101 -0
- package/src/services/validation/{standard-schema.types.ts → standard-schema.types.d.ts} +17 -20
- package/src/services/validation/standard-schema.types.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +104 -0
- package/src/static-site-generator/static-site-generator.js +316 -0
- package/src/types/internal-types.d.ts +232 -0
- package/src/types/internal-types.js +0 -0
- package/src/types/public-types.d.ts +1267 -0
- package/src/types/public-types.js +0 -0
- package/src/utils/deep-merge.d.ts +14 -0
- package/src/utils/deep-merge.js +32 -0
- package/src/utils/hash.d.ts +1 -0
- package/src/utils/hash.js +7 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +6 -0
- package/src/utils/html.js +4 -0
- package/src/utils/invariant.d.ts +5 -0
- package/src/utils/invariant.js +11 -0
- package/src/utils/locals-utils.d.ts +15 -0
- package/src/utils/locals-utils.js +24 -0
- package/src/utils/parse-cli-args.d.ts +27 -0
- package/src/utils/parse-cli-args.js +62 -0
- package/src/utils/path-utils.module.d.ts +5 -0
- package/src/utils/path-utils.module.js +14 -0
- package/src/utils/resolve-work-dir.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/utils/runtime.d.ts +11 -0
- package/src/utils/runtime.js +40 -0
- package/src/utils/server-utils.module.d.ts +19 -0
- package/src/utils/server-utils.module.js +56 -0
- package/src/watchers/project-watcher.d.ts +136 -0
- package/src/watchers/project-watcher.js +275 -0
- package/src/watchers/project-watcher.test-helpers.d.ts +4 -0
- package/src/watchers/project-watcher.test-helpers.js +52 -0
- package/src/adapters/abstract/application-adapter.test.ts +0 -172
- package/src/adapters/abstract/application-adapter.ts +0 -379
- package/src/adapters/abstract/router-adapter.ts +0 -30
- package/src/adapters/abstract/server-adapter.ts +0 -79
- package/src/adapters/bun/client-bridge.ts +0 -62
- package/src/adapters/bun/create-app.ts +0 -232
- package/src/adapters/bun/hmr-manager.test.ts +0 -265
- package/src/adapters/bun/hmr-manager.ts +0 -383
- package/src/adapters/bun/index.ts +0 -2
- package/src/adapters/bun/server-adapter.ts +0 -526
- package/src/adapters/bun/server-lifecycle.ts +0 -124
- package/src/adapters/create-app.test.ts +0 -10
- package/src/adapters/create-app.ts +0 -91
- package/src/adapters/index.ts +0 -2
- package/src/adapters/node/create-app.test.ts +0 -53
- package/src/adapters/node/create-app.ts +0 -183
- package/src/adapters/node/node-client-bridge.test.ts +0 -198
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.test.ts +0 -320
- package/src/adapters/node/node-hmr-manager.ts +0 -355
- package/src/adapters/node/server-adapter.ts +0 -502
- package/src/adapters/node/static-content-server.test.ts +0 -60
- package/src/adapters/node/static-content-server.ts +0 -239
- package/src/adapters/shared/api-response.test.ts +0 -97
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/define-api-handler.ts +0 -66
- package/src/adapters/shared/explicit-static-render-preparation.ts +0 -58
- package/src/adapters/shared/explicit-static-route-matcher.test.ts +0 -381
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -131
- package/src/adapters/shared/file-route-middleware-pipeline.test.ts +0 -85
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -118
- package/src/adapters/shared/fs-server-response-factory.test.ts +0 -176
- package/src/adapters/shared/fs-server-response-factory.ts +0 -96
- package/src/adapters/shared/fs-server-response-matcher.test.ts +0 -311
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -240
- package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
- package/src/adapters/shared/hmr-html-response.ts +0 -52
- package/src/adapters/shared/hmr-manager.contract.test.ts +0 -228
- package/src/adapters/shared/hmr-manager.dispatch.test.ts +0 -220
- package/src/adapters/shared/render-context.test.ts +0 -150
- package/src/adapters/shared/render-context.ts +0 -123
- package/src/adapters/shared/runtime-bootstrap.ts +0 -79
- package/src/adapters/shared/server-adapter.test.ts +0 -130
- package/src/adapters/shared/server-adapter.ts +0 -562
- package/src/adapters/shared/server-route-handler.test.ts +0 -111
- package/src/adapters/shared/server-route-handler.ts +0 -153
- package/src/adapters/shared/server-static-builder.test.ts +0 -338
- package/src/adapters/shared/server-static-builder.ts +0 -170
- package/src/build/build-adapter-serialization.test.ts +0 -281
- package/src/build/build-adapter.test.ts +0 -1240
- package/src/build/build-adapter.ts +0 -1012
- package/src/build/build-manifest.ts +0 -54
- package/src/build/build-types.ts +0 -83
- package/src/build/dev-build-coordinator.ts +0 -220
- package/src/build/esbuild-build-adapter.ts +0 -660
- package/src/build/runtime-build-executor.test.ts +0 -81
- package/src/build/runtime-build-executor.ts +0 -40
- package/src/build/runtime-specifier-alias-plugin.test.ts +0 -67
- package/src/build/runtime-specifier-alias-plugin.ts +0 -62
- package/src/build/runtime-specifier-aliases.ts +0 -135
- package/src/config/config-builder.test.ts +0 -442
- package/src/config/config-builder.ts +0 -737
- package/src/config/config-builder.typecheck.test.ts +0 -96
- package/src/dev/host-runtime.ts +0 -34
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/eco.browser.test.ts +0 -43
- package/src/eco/eco.browser.ts +0 -118
- package/src/eco/eco.test.ts +0 -654
- package/src/eco/eco.ts +0 -205
- package/src/eco/eco.types.ts +0 -221
- package/src/eco/eco.utils.test.ts +0 -219
- package/src/eco/eco.utils.ts +0 -5
- package/src/eco/global-injector-map.test.ts +0 -42
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.test.ts +0 -66
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.test.ts +0 -30
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.test.ts +0 -134
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -3
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- package/src/global/utils.test.ts +0 -12
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
- package/src/hmr/client/hmr-runtime.ts +0 -162
- package/src/hmr/hmr-strategy.test.ts +0 -124
- package/src/hmr/hmr-strategy.ts +0 -177
- package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
- package/src/hmr/hmr.test.e2e.ts +0 -66
- package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
- package/src/hmr/strategies/js-hmr-strategy.test.ts +0 -334
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -314
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -15
- package/src/integrations/ghtml/ghtml-renderer.test.ts +0 -253
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -87
- package/src/integrations/ghtml/ghtml.constants.ts +0 -1
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -28
- package/src/plugins/alias-resolver-plugin.test.ts +0 -41
- package/src/plugins/alias-resolver-plugin.ts +0 -63
- package/src/plugins/eco-component-meta-plugin.test.ts +0 -406
- package/src/plugins/eco-component-meta-plugin.ts +0 -494
- package/src/plugins/foreign-jsx-override-plugin.test.ts +0 -65
- package/src/plugins/foreign-jsx-override-plugin.ts +0 -67
- package/src/plugins/integration-plugin.test.ts +0 -151
- package/src/plugins/integration-plugin.ts +0 -323
- package/src/plugins/processor.test.ts +0 -148
- package/src/plugins/processor.ts +0 -257
- package/src/plugins/source-transform.test.ts +0 -82
- package/src/plugins/source-transform.ts +0 -123
- package/src/route-renderer/orchestration/component-render-context.ts +0 -325
- package/src/route-renderer/orchestration/declared-ownership-graph.ts +0 -62
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +0 -383
- package/src/route-renderer/orchestration/integration-renderer.test.ts +0 -2085
- package/src/route-renderer/orchestration/integration-renderer.ts +0 -1244
- package/src/route-renderer/orchestration/ownership-planning.service.ts +0 -97
- package/src/route-renderer/orchestration/ownership-validation.service.ts +0 -76
- package/src/route-renderer/orchestration/processed-asset-dedupe.ts +0 -25
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +0 -324
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +0 -294
- package/src/route-renderer/orchestration/render-output.utils.ts +0 -310
- package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +0 -644
- package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +0 -265
- package/src/route-renderer/orchestration/route-render-orchestrator.ts +0 -592
- package/src/route-renderer/orchestration/template-serialization.test.ts +0 -110
- package/src/route-renderer/orchestration/template-serialization.ts +0 -117
- package/src/route-renderer/page-loading/component-dependency-collection.ts +0 -202
- package/src/route-renderer/page-loading/declared-asset-collection.ts +0 -153
- package/src/route-renderer/page-loading/dependency-resolver.test.ts +0 -761
- package/src/route-renderer/page-loading/dependency-resolver.ts +0 -144
- package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +0 -75
- package/src/route-renderer/page-loading/lazy-entry-collection.ts +0 -167
- package/src/route-renderer/page-loading/lazy-trigger-planning.ts +0 -74
- package/src/route-renderer/page-loading/module-declaration-aggregation.ts +0 -60
- package/src/route-renderer/page-loading/module-declaration-scripts.ts +0 -16
- package/src/route-renderer/page-loading/page-dependency-bundling.ts +0 -244
- package/src/route-renderer/page-loading/page-module-loader.test.ts +0 -183
- package/src/route-renderer/page-loading/page-module-loader.ts +0 -184
- package/src/route-renderer/route-renderer.ts +0 -133
- package/src/router/client/link-intent.test.browser.ts +0 -51
- package/src/router/client/link-intent.ts +0 -92
- package/src/router/client/navigation-coordinator.test.ts +0 -237
- package/src/router/client/navigation-coordinator.ts +0 -453
- package/src/router/server/route-registry.test.ts +0 -176
- package/src/router/server/route-registry.ts +0 -382
- package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +0 -66
- package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +0 -473
- package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -344
- package/src/services/assets/asset-processing-service/asset.factory.test.ts +0 -63
- package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/assets/asset-processing-service/assets.types.ts +0 -128
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +0 -74
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -96
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +0 -67
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
- package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +0 -104
- package/src/services/assets/asset-processing-service/index.ts +0 -6
- package/src/services/assets/asset-processing-service/page-package.test.ts +0 -100
- package/src/services/assets/asset-processing-service/page-package.ts +0 -93
- package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +0 -59
- package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -83
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -173
- package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +0 -195
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -137
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +0 -326
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -116
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +0 -227
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -89
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +0 -261
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -72
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -83
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +0 -65
- package/src/services/assets/browser-bundle.service.test.ts +0 -66
- package/src/services/assets/browser-bundle.service.ts +0 -109
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.test.ts +0 -225
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.test.ts +0 -175
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/cache/page-request-cache-coordinator.service.test.ts +0 -79
- package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
- package/src/services/html/html-rewriter-provider.service.test.ts +0 -183
- package/src/services/html/html-rewriter-provider.service.ts +0 -104
- package/src/services/html/html-transformer.service.test.ts +0 -476
- package/src/services/html/html-transformer.service.ts +0 -275
- package/src/services/invalidation/development-invalidation.service.test.ts +0 -87
- package/src/services/invalidation/development-invalidation.service.ts +0 -262
- package/src/services/module-loading/app-module-loader.service.ts +0 -9
- package/src/services/module-loading/app-server-module-transpiler.service.test.ts +0 -130
- package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -141
- package/src/services/module-loading/host-module-loader-registry.ts +0 -15
- package/src/services/module-loading/node-bootstrap-plugin.test.ts +0 -335
- package/src/services/module-loading/node-bootstrap-plugin.ts +0 -311
- package/src/services/module-loading/page-module-import.service.test.ts +0 -504
- package/src/services/module-loading/page-module-import.service.ts +0 -251
- package/src/services/module-loading/server-module-transpiler.service.test.ts +0 -243
- package/src/services/module-loading/server-module-transpiler.service.ts +0 -104
- package/src/services/module-loading/source-module-support.ts +0 -19
- package/src/services/runtime-state/dev-graph.service.ts +0 -217
- package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
- package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
- package/src/services/validation/schema-validation-service.test.ts +0 -223
- package/src/services/validation/schema-validation-service.ts +0 -204
- package/src/static-site-generator/static-site-generator.test.ts +0 -408
- package/src/static-site-generator/static-site-generator.ts +0 -445
- package/src/types/internal-types.ts +0 -243
- package/src/types/public-types.ts +0 -1459
- package/src/utils/deep-merge.test.ts +0 -114
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html-escaping.ts +0 -9
- package/src/utils/invariant.test.ts +0 -22
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.test.ts +0 -69
- package/src/utils/parse-cli-args.ts +0 -105
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/path-utils.test.ts +0 -15
- package/src/utils/resolve-work-dir.ts +0 -45
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/utils/server-utils.test.ts +0 -38
- package/src/watchers/project-watcher.integration.test.ts +0 -337
- package/src/watchers/project-watcher.test-helpers.ts +0 -42
- package/src/watchers/project-watcher.test.ts +0 -768
- package/src/watchers/project-watcher.ts +0 -357
- /package/src/utils/{html.ts → html.d.ts} +0 -0
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '../types/internal-types.ts';
|
|
2
|
-
import type { IntegrationPlugin } from '../plugins/integration-plugin.ts';
|
|
3
|
-
import { invariant } from '../utils/invariant.ts';
|
|
4
|
-
import { PathUtils } from '../utils/path-utils.module.ts';
|
|
5
|
-
import type { IntegrationRenderer } from './orchestration/integration-renderer.ts';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Narrow route-render contract exposed to higher-level routing code.
|
|
9
|
-
*
|
|
10
|
-
* @remarks
|
|
11
|
-
* Higher-level routing code only needs request execution and page-module
|
|
12
|
-
* loading. Returning this narrowed shape avoids a dedicated wrapper class while
|
|
13
|
-
* still keeping callers off the full integration renderer surface.
|
|
14
|
-
*/
|
|
15
|
-
export type PageRouteRenderer = Pick<IntegrationRenderer, 'execute' | 'loadPageModule'>;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Narrow explicit-view render contract exposed to static route handling.
|
|
19
|
-
*
|
|
20
|
-
* @remarks
|
|
21
|
-
* Explicit static routes only need `renderToResponse()`, so the factory can
|
|
22
|
-
* hide the broader integration renderer surface there as well.
|
|
23
|
-
*/
|
|
24
|
-
export type ExplicitViewRenderer = Pick<IntegrationRenderer, 'renderToResponse'>;
|
|
25
|
-
|
|
26
|
-
export interface PageRendererResolver {
|
|
27
|
-
getPageRenderer(filePath: string): PageRouteRenderer;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface ExplicitViewRendererResolver {
|
|
31
|
-
getExplicitViewRenderer(integrationName: string): ExplicitViewRenderer | null;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Combined renderer-factory contract used by static generation.
|
|
36
|
-
*/
|
|
37
|
-
export type StaticGenerationRendererResolver = PageRendererResolver & ExplicitViewRendererResolver;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Selects and caches integration renderers for route files and explicit views.
|
|
41
|
-
*
|
|
42
|
-
* @remarks
|
|
43
|
-
* The factory owns the policy that maps a route file or explicit integration
|
|
44
|
-
* name to one initialized integration renderer. Renderer instances are cached by
|
|
45
|
-
* integration name so repeated requests do not rebuild renderer state.
|
|
46
|
-
*/
|
|
47
|
-
export class RouteRendererFactory {
|
|
48
|
-
private appConfig: EcoPagesAppConfig;
|
|
49
|
-
runtimeOrigin: string;
|
|
50
|
-
private rendererModules?: unknown;
|
|
51
|
-
private rendererCache = new Map<string, IntegrationRenderer>();
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Creates the route-renderer factory for one app/runtime instance.
|
|
55
|
-
*/
|
|
56
|
-
constructor({
|
|
57
|
-
appConfig,
|
|
58
|
-
rendererModules,
|
|
59
|
-
runtimeOrigin,
|
|
60
|
-
}: {
|
|
61
|
-
appConfig: EcoPagesAppConfig;
|
|
62
|
-
rendererModules?: unknown;
|
|
63
|
-
runtimeOrigin: string;
|
|
64
|
-
}) {
|
|
65
|
-
this.appConfig = appConfig;
|
|
66
|
-
this.rendererModules = rendererModules;
|
|
67
|
-
this.runtimeOrigin = runtimeOrigin;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Returns a route renderer for the supplied route file.
|
|
72
|
-
*/
|
|
73
|
-
getPageRenderer(filePath: string): PageRouteRenderer {
|
|
74
|
-
const integrationRenderer = this.getRouteRendererEngine(filePath);
|
|
75
|
-
invariant(!!integrationRenderer, `No integration renderer found for file: ${filePath}`);
|
|
76
|
-
return integrationRenderer;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Returns a renderer for an explicit view integration.
|
|
81
|
-
*/
|
|
82
|
-
getExplicitViewRenderer(integrationName: string): ExplicitViewRenderer | null {
|
|
83
|
-
const integrationPlugin = this.appConfig.integrations.find((plugin) => plugin.name === integrationName);
|
|
84
|
-
if (!integrationPlugin) {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const cached = this.rendererCache.get(integrationName);
|
|
89
|
-
if (cached) {
|
|
90
|
-
return cached;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const renderer = integrationPlugin.initializeRenderer({
|
|
94
|
-
rendererModules: this.rendererModules,
|
|
95
|
-
});
|
|
96
|
-
this.rendererCache.set(integrationName, renderer);
|
|
97
|
-
return renderer;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Resolves the integration plugin that owns a given route file.
|
|
102
|
-
*/
|
|
103
|
-
getIntegrationPlugin(filePath: string): IntegrationPlugin {
|
|
104
|
-
const templateExtension = PathUtils.getEcoTemplateExtension(filePath);
|
|
105
|
-
const isIntegrationPlugin = (plugin: IntegrationPlugin): boolean => {
|
|
106
|
-
return plugin.extensions.some((extension) => templateExtension === extension);
|
|
107
|
-
};
|
|
108
|
-
const integrationPlugin = this.appConfig.integrations.find(isIntegrationPlugin);
|
|
109
|
-
invariant(
|
|
110
|
-
!!integrationPlugin,
|
|
111
|
-
`No integration plugin found for template extension: ${templateExtension}, file: ${filePath}`,
|
|
112
|
-
);
|
|
113
|
-
return integrationPlugin as IntegrationPlugin;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Returns the cached renderer engine for the file's owning integration,
|
|
118
|
-
* creating it on first use.
|
|
119
|
-
*/
|
|
120
|
-
private getRouteRendererEngine(filePath: string): IntegrationRenderer {
|
|
121
|
-
const integrationPlugin = this.getIntegrationPlugin(filePath);
|
|
122
|
-
const cached = this.rendererCache.get(integrationPlugin.name);
|
|
123
|
-
if (cached) {
|
|
124
|
-
return cached;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const renderer = integrationPlugin.initializeRenderer({
|
|
128
|
-
rendererModules: this.rendererModules,
|
|
129
|
-
});
|
|
130
|
-
this.rendererCache.set(integrationPlugin.name, renderer);
|
|
131
|
-
return renderer;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { getAnchorFromNavigationEvent, recoverPendingNavigationHref } from './link-intent.ts';
|
|
3
|
-
|
|
4
|
-
describe('getAnchorFromNavigationEvent', () => {
|
|
5
|
-
it('returns the anchor when the event target is a text node inside it', () => {
|
|
6
|
-
const anchor = document.createElement('a');
|
|
7
|
-
anchor.href = '/fast';
|
|
8
|
-
anchor.setAttribute('data-eco-link', 'true');
|
|
9
|
-
const textNode = document.createTextNode('fast-link');
|
|
10
|
-
anchor.append(textNode);
|
|
11
|
-
document.body.append(anchor);
|
|
12
|
-
|
|
13
|
-
const event = new MouseEvent('click', { bubbles: true, cancelable: true, composed: true });
|
|
14
|
-
Object.defineProperty(event, 'target', {
|
|
15
|
-
configurable: true,
|
|
16
|
-
value: textNode,
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
expect(getAnchorFromNavigationEvent(event, 'a[data-eco-link]')).toBe(anchor);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('returns the closest matching anchor for nested element targets', () => {
|
|
23
|
-
const anchor = document.createElement('a');
|
|
24
|
-
anchor.href = '/fast';
|
|
25
|
-
anchor.setAttribute('data-eco-link', 'true');
|
|
26
|
-
const span = document.createElement('span');
|
|
27
|
-
span.textContent = 'fast-link';
|
|
28
|
-
anchor.append(span);
|
|
29
|
-
document.body.append(anchor);
|
|
30
|
-
|
|
31
|
-
const event = new MouseEvent('click', { bubbles: true, cancelable: true, composed: true });
|
|
32
|
-
Object.defineProperty(event, 'target', {
|
|
33
|
-
configurable: true,
|
|
34
|
-
value: span,
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
expect(getAnchorFromNavigationEvent(event, 'a[data-eco-link]')).toBe(anchor);
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
describe('recoverPendingNavigationHref', () => {
|
|
42
|
-
it('returns null for stale or missing pending intent state', () => {
|
|
43
|
-
expect(recoverPendingNavigationHref(null, true, 10)).toBeNull();
|
|
44
|
-
expect(recoverPendingNavigationHref({ href: '/fast', timestamp: 0 }, false, 10)).toBeNull();
|
|
45
|
-
expect(recoverPendingNavigationHref({ href: '/fast', timestamp: 0 }, true, 2000, 1000)).toBeNull();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('returns the captured href while a navigation is still in flight', () => {
|
|
49
|
-
expect(recoverPendingNavigationHref({ href: '/fast', timestamp: 10 }, true, 20, 1000)).toBe('/fast');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared client-side navigation intent helpers.
|
|
3
|
-
*
|
|
4
|
-
* Browser runtimes use the same low-level mechanics to:
|
|
5
|
-
* - locate the anchor associated with a click, pointer, or hover event,
|
|
6
|
-
* - persist the last valid pointer or hover target while a navigation is in flight,
|
|
7
|
-
* - recover the final intended href when the DOM changes before the click lands.
|
|
8
|
-
*
|
|
9
|
-
* Keeping those mechanics here lets browser-router and react-router share one
|
|
10
|
-
* implementation while preserving their router-specific interception rules.
|
|
11
|
-
*
|
|
12
|
-
* @module
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Timestamped navigation intent captured from pointer or hover activity.
|
|
17
|
-
*/
|
|
18
|
-
export type EcoPendingNavigationIntent = {
|
|
19
|
-
href: string;
|
|
20
|
-
timestamp: number;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Finds the nearest matching anchor within an event's composed path.
|
|
25
|
-
*
|
|
26
|
-
* This works across Shadow DOM boundaries, which is required for delegated
|
|
27
|
-
* navigation handling when links are rendered inside custom elements.
|
|
28
|
-
*
|
|
29
|
-
* @param event - Pointer or mouse event being inspected.
|
|
30
|
-
* @param linkSelector - Selector that identifies navigable anchors.
|
|
31
|
-
* @returns The matched anchor element, or `null` when no matching anchor exists.
|
|
32
|
-
*/
|
|
33
|
-
export function getAnchorFromNavigationEvent(
|
|
34
|
-
event: MouseEvent | PointerEvent,
|
|
35
|
-
linkSelector: string,
|
|
36
|
-
): HTMLAnchorElement | null {
|
|
37
|
-
const eventTarget = event.target;
|
|
38
|
-
|
|
39
|
-
if (eventTarget instanceof HTMLAnchorElement && eventTarget.matches(linkSelector)) {
|
|
40
|
-
return eventTarget;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (eventTarget instanceof Element) {
|
|
44
|
-
const closestAnchor = eventTarget.closest(linkSelector);
|
|
45
|
-
if (closestAnchor instanceof HTMLAnchorElement) {
|
|
46
|
-
return closestAnchor;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (eventTarget instanceof Text) {
|
|
51
|
-
const parentAnchor = eventTarget.parentElement?.closest(linkSelector);
|
|
52
|
-
if (parentAnchor instanceof HTMLAnchorElement) {
|
|
53
|
-
return parentAnchor;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return event
|
|
58
|
-
.composedPath()
|
|
59
|
-
.find(
|
|
60
|
-
(target) => target instanceof HTMLAnchorElement && target.matches(linkSelector),
|
|
61
|
-
) as HTMLAnchorElement | null;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Resolves a previously captured intent while a navigation is still in flight.
|
|
66
|
-
*
|
|
67
|
-
* Pending intents expire quickly because they are only meant to bridge the gap
|
|
68
|
-
* between pointer or hover capture and the later click event when the DOM or
|
|
69
|
-
* active runtime changes during a rapid navigation sequence.
|
|
70
|
-
*
|
|
71
|
-
* @param intent - Previously captured pointer or hover intent.
|
|
72
|
-
* @param hasInFlightNavigation - Whether a router navigation is still active.
|
|
73
|
-
* @param now - Current monotonic timestamp, usually from `performance.now()`.
|
|
74
|
-
* @param maxAgeMs - Maximum allowed age for the recovered intent.
|
|
75
|
-
* @returns The intended href when still valid, otherwise `null`.
|
|
76
|
-
*/
|
|
77
|
-
export function recoverPendingNavigationHref(
|
|
78
|
-
intent: EcoPendingNavigationIntent | null,
|
|
79
|
-
hasInFlightNavigation: boolean,
|
|
80
|
-
now: number,
|
|
81
|
-
maxAgeMs = 1000,
|
|
82
|
-
): string | null {
|
|
83
|
-
if (!intent || !hasInFlightNavigation) {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (now - intent.timestamp > maxAgeMs) {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return intent.href;
|
|
92
|
-
}
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { getEcoNavigationRuntime } from './navigation-coordinator.ts';
|
|
3
|
-
|
|
4
|
-
function createWindowLike() {
|
|
5
|
-
return {} as Window &
|
|
6
|
-
typeof globalThis & {
|
|
7
|
-
__ECO_PAGES__?: { navigation?: ReturnType<typeof getEcoNavigationRuntime> };
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
describe('getEcoNavigationRuntime', () => {
|
|
12
|
-
it('returns the same coordinator instance for the same window', () => {
|
|
13
|
-
const windowLike = createWindowLike();
|
|
14
|
-
const first = getEcoNavigationRuntime(windowLike);
|
|
15
|
-
const second = getEcoNavigationRuntime(windowLike);
|
|
16
|
-
|
|
17
|
-
expect(first).toBe(second);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it('tracks explicit ownership claims', () => {
|
|
21
|
-
const windowLike = createWindowLike();
|
|
22
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
23
|
-
|
|
24
|
-
runtime.claimOwnership('react-router');
|
|
25
|
-
|
|
26
|
-
expect(runtime.getOwnerState()).toEqual({
|
|
27
|
-
owner: 'react-router',
|
|
28
|
-
canHandleSpaNavigation: false,
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('shares one navigation transaction sequence across runtimes', () => {
|
|
33
|
-
const windowLike = createWindowLike();
|
|
34
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
35
|
-
|
|
36
|
-
const first = runtime.beginNavigationTransaction();
|
|
37
|
-
expect(runtime.hasPendingNavigationTransaction()).toBe(true);
|
|
38
|
-
expect(first.isCurrent()).toBe(true);
|
|
39
|
-
expect(first.signal.aborted).toBe(false);
|
|
40
|
-
|
|
41
|
-
const second = runtime.beginNavigationTransaction();
|
|
42
|
-
|
|
43
|
-
expect(first.isCurrent()).toBe(false);
|
|
44
|
-
expect(first.signal.aborted).toBe(true);
|
|
45
|
-
expect(second.isCurrent()).toBe(true);
|
|
46
|
-
expect(second.signal.aborted).toBe(false);
|
|
47
|
-
second.complete();
|
|
48
|
-
expect(runtime.hasPendingNavigationTransaction()).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('cancels only the current navigation transaction', () => {
|
|
52
|
-
const windowLike = createWindowLike();
|
|
53
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
54
|
-
|
|
55
|
-
const first = runtime.beginNavigationTransaction();
|
|
56
|
-
const second = runtime.beginNavigationTransaction();
|
|
57
|
-
|
|
58
|
-
first.cancel();
|
|
59
|
-
expect(second.isCurrent()).toBe(true);
|
|
60
|
-
expect(second.signal.aborted).toBe(false);
|
|
61
|
-
|
|
62
|
-
second.cancel();
|
|
63
|
-
expect(second.isCurrent()).toBe(false);
|
|
64
|
-
expect(second.signal.aborted).toBe(true);
|
|
65
|
-
expect(runtime.hasPendingNavigationTransaction()).toBe(false);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('adopts ownership from the rendered document marker', () => {
|
|
69
|
-
const windowLike = createWindowLike();
|
|
70
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
71
|
-
const documentLike = {
|
|
72
|
-
documentElement: {
|
|
73
|
-
getAttribute: vi.fn(() => 'custom-router'),
|
|
74
|
-
},
|
|
75
|
-
} as unknown as Document;
|
|
76
|
-
|
|
77
|
-
expect(runtime.adoptDocumentOwner(documentLike, 'browser-router')).toBe('custom-router');
|
|
78
|
-
expect(runtime.getOwnerState().owner).toBe('custom-router');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('delegates navigation to another registered runtime when the source cannot handle it', async () => {
|
|
82
|
-
const windowLike = createWindowLike();
|
|
83
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
84
|
-
const navigateSpy = vi.fn(async () => true);
|
|
85
|
-
|
|
86
|
-
runtime.register({ owner: 'browser-router', navigate: navigateSpy });
|
|
87
|
-
runtime.register({ owner: 'react-router', navigate: vi.fn(async () => true) });
|
|
88
|
-
runtime.claimOwnership('react-router');
|
|
89
|
-
|
|
90
|
-
const handled = await runtime.requestNavigation({
|
|
91
|
-
href: '/docs',
|
|
92
|
-
direction: 'forward',
|
|
93
|
-
source: 'react-router',
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
expect(handled).toBe(true);
|
|
97
|
-
expect(navigateSpy).toHaveBeenCalledWith({
|
|
98
|
-
href: '/docs',
|
|
99
|
-
direction: 'forward',
|
|
100
|
-
source: 'react-router',
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('delegates a fetched document handoff to the targeted runtime without forcing source cleanup first', async () => {
|
|
105
|
-
const windowLike = createWindowLike();
|
|
106
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
107
|
-
const cleanupSpy = vi.fn(async () => undefined);
|
|
108
|
-
const handoffSpy = vi.fn(async () => true);
|
|
109
|
-
const documentLike = {
|
|
110
|
-
documentElement: {
|
|
111
|
-
getAttribute: vi.fn(() => null),
|
|
112
|
-
},
|
|
113
|
-
} as unknown as Document;
|
|
114
|
-
|
|
115
|
-
runtime.register({ owner: 'react-router', cleanupBeforeHandoff: cleanupSpy });
|
|
116
|
-
runtime.register({ owner: 'browser-router', handoffNavigation: handoffSpy });
|
|
117
|
-
runtime.claimOwnership('react-router');
|
|
118
|
-
|
|
119
|
-
const handled = await runtime.requestHandoff({
|
|
120
|
-
href: '/docs',
|
|
121
|
-
finalHref: '/docs',
|
|
122
|
-
direction: 'forward',
|
|
123
|
-
source: 'react-router',
|
|
124
|
-
targetOwner: 'browser-router',
|
|
125
|
-
document: documentLike,
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
expect(handled).toBe(true);
|
|
129
|
-
expect(cleanupSpy).not.toHaveBeenCalled();
|
|
130
|
-
expect(handoffSpy).toHaveBeenCalledWith({
|
|
131
|
-
href: '/docs',
|
|
132
|
-
finalHref: '/docs',
|
|
133
|
-
direction: 'forward',
|
|
134
|
-
source: 'react-router',
|
|
135
|
-
targetOwner: 'browser-router',
|
|
136
|
-
document: documentLike,
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('ignores stale handoff requests before cleaning up the active owner', async () => {
|
|
141
|
-
const windowLike = createWindowLike();
|
|
142
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
143
|
-
const cleanupSpy = vi.fn(async () => undefined);
|
|
144
|
-
const handoffSpy = vi.fn(async () => true);
|
|
145
|
-
const documentLike = {
|
|
146
|
-
documentElement: {
|
|
147
|
-
getAttribute: vi.fn(() => null),
|
|
148
|
-
},
|
|
149
|
-
} as unknown as Document;
|
|
150
|
-
|
|
151
|
-
runtime.register({ owner: 'react-router', cleanupBeforeHandoff: cleanupSpy });
|
|
152
|
-
runtime.register({ owner: 'browser-router', handoffNavigation: handoffSpy });
|
|
153
|
-
runtime.claimOwnership('react-router');
|
|
154
|
-
|
|
155
|
-
const handled = await runtime.requestHandoff({
|
|
156
|
-
href: '/docs',
|
|
157
|
-
finalHref: '/docs',
|
|
158
|
-
direction: 'forward',
|
|
159
|
-
source: 'react-router',
|
|
160
|
-
targetOwner: 'browser-router',
|
|
161
|
-
document: documentLike,
|
|
162
|
-
isStaleSourceNavigation: () => true,
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
expect(handled).toBe(true);
|
|
166
|
-
expect(cleanupSpy).not.toHaveBeenCalled();
|
|
167
|
-
expect(handoffSpy).not.toHaveBeenCalled();
|
|
168
|
-
expect(runtime.getOwnerState().owner).toBe('react-router');
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('reloads the current owner through its registration', async () => {
|
|
172
|
-
const windowLike = createWindowLike();
|
|
173
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
174
|
-
const reloadSpy = vi.fn(async () => undefined);
|
|
175
|
-
|
|
176
|
-
runtime.register({ owner: 'react-router', reloadCurrentPage: reloadSpy });
|
|
177
|
-
runtime.claimOwnership('react-router');
|
|
178
|
-
|
|
179
|
-
const handled = await runtime.reloadCurrentPage({ clearCache: true, source: 'browser-router' });
|
|
180
|
-
|
|
181
|
-
expect(handled).toBe(true);
|
|
182
|
-
expect(reloadSpy).toHaveBeenCalledWith({ clearCache: true, source: 'browser-router' });
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
it('reloads the current owner even when the request source matches that owner', async () => {
|
|
186
|
-
const windowLike = createWindowLike();
|
|
187
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
188
|
-
const reloadSpy = vi.fn(async () => undefined);
|
|
189
|
-
|
|
190
|
-
runtime.register({ owner: 'react-router', reloadCurrentPage: reloadSpy });
|
|
191
|
-
runtime.claimOwnership('react-router');
|
|
192
|
-
|
|
193
|
-
const handled = await runtime.reloadCurrentPage({ clearCache: false, source: 'react-router' });
|
|
194
|
-
|
|
195
|
-
expect(handled).toBe(true);
|
|
196
|
-
expect(reloadSpy).toHaveBeenCalledWith({ clearCache: false, source: 'react-router' });
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('cleans up an explicit owner via its registration', async () => {
|
|
200
|
-
const windowLike = createWindowLike();
|
|
201
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
202
|
-
const cleanupSpy = vi.fn();
|
|
203
|
-
|
|
204
|
-
runtime.register({ owner: 'react-router', cleanupBeforeHandoff: cleanupSpy });
|
|
205
|
-
runtime.claimOwnership('react-router');
|
|
206
|
-
|
|
207
|
-
await runtime.cleanupOwner('react-router');
|
|
208
|
-
|
|
209
|
-
expect(cleanupSpy).toHaveBeenCalledTimes(1);
|
|
210
|
-
expect(runtime.getOwnerState().owner).toBe('none');
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
it('emits events for registrations and ownership changes', () => {
|
|
214
|
-
const windowLike = createWindowLike();
|
|
215
|
-
const runtime = getEcoNavigationRuntime(windowLike);
|
|
216
|
-
const listener = vi.fn();
|
|
217
|
-
const unsubscribe = runtime.subscribe(listener);
|
|
218
|
-
|
|
219
|
-
const unregister = runtime.register({ owner: 'custom-router' });
|
|
220
|
-
runtime.claimOwnership('custom-router');
|
|
221
|
-
runtime.releaseOwnership('custom-router');
|
|
222
|
-
unregister();
|
|
223
|
-
unsubscribe();
|
|
224
|
-
|
|
225
|
-
expect(listener).toHaveBeenCalledWith({
|
|
226
|
-
type: 'registration-change',
|
|
227
|
-
owner: 'custom-router',
|
|
228
|
-
status: 'registered',
|
|
229
|
-
});
|
|
230
|
-
expect(listener).toHaveBeenCalledWith({
|
|
231
|
-
type: 'owner-change',
|
|
232
|
-
owner: 'custom-router',
|
|
233
|
-
previousOwner: 'none',
|
|
234
|
-
reason: 'claim',
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
});
|