@ecopages/core 0.2.0-alpha.9 → 0.2.1-beta.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 +79 -28
- package/package.json +94 -116
- package/src/adapters/README.md +2 -2
- package/src/adapters/abstract/application-adapter.d.ts +28 -2
- package/src/adapters/abstract/application-adapter.js +14 -2
- package/src/adapters/abstract/router-adapter.d.ts +1 -1
- package/src/adapters/abstract/server-adapter.d.ts +2 -2
- package/src/adapters/bun/client-bridge.d.ts +1 -1
- package/src/adapters/bun/create-app.d.ts +12 -12
- package/src/adapters/bun/create-app.js +64 -41
- package/src/adapters/bun/hmr-manager.d.ts +19 -115
- package/src/adapters/bun/hmr-manager.js +25 -301
- package/src/adapters/bun/index.d.ts +1 -1
- package/src/adapters/bun/index.js +2 -2
- package/src/adapters/bun/runtime-host.d.ts +52 -0
- package/src/adapters/bun/runtime-host.js +56 -0
- package/src/adapters/bun/server-adapter.d.ts +100 -32
- package/src/adapters/bun/server-adapter.js +142 -65
- package/src/adapters/bun/static-preview-host.d.ts +28 -0
- package/src/adapters/bun/static-preview-host.js +45 -0
- package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
- package/src/{create-app.js → adapters/create-app.js} +4 -4
- package/src/adapters/index.d.ts +1 -5
- package/src/adapters/index.js +1 -7
- package/src/adapters/node/create-app.d.ts +15 -12
- package/src/adapters/node/create-app.js +34 -85
- package/src/adapters/node/http-request-bridge.d.ts +57 -0
- package/src/adapters/node/http-request-bridge.js +118 -0
- package/src/adapters/node/node-client-bridge.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.d.ts +22 -103
- package/src/adapters/node/node-hmr-manager.js +26 -289
- package/src/adapters/node/runtime-host.d.ts +57 -0
- package/src/adapters/node/runtime-host.js +92 -0
- package/src/adapters/node/server-adapter-dependencies.d.ts +19 -0
- package/src/adapters/node/server-adapter-dependencies.js +18 -0
- package/src/adapters/node/server-adapter.d.ts +19 -42
- package/src/adapters/node/server-adapter.js +94 -139
- package/src/adapters/node/static-content-server.d.ts +1 -1
- package/src/adapters/node/static-content-server.js +1 -1
- package/src/adapters/node/static-preview-host.d.ts +55 -0
- package/src/adapters/node/static-preview-host.js +68 -0
- package/src/adapters/shared/application-adapter.d.ts +1 -1
- package/src/adapters/shared/define-api-handler.d.ts +1 -1
- 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 +7 -4
- package/src/adapters/shared/explicit-static-route-matcher.js +14 -16
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
- package/src/adapters/shared/file-route-middleware-pipeline.js +2 -11
- package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
- package/src/adapters/shared/fs-server-response-factory.js +11 -27
- package/src/adapters/shared/fs-server-response-matcher.d.ts +18 -18
- package/src/adapters/shared/fs-server-response-matcher.js +72 -46
- package/src/adapters/shared/hmr-entrypoint-registrar.js +1 -1
- package/src/adapters/shared/hmr-html-response.d.ts +1 -1
- package/src/adapters/shared/hmr-html-response.js +4 -3
- package/src/adapters/shared/render-context.d.ts +5 -3
- package/src/adapters/shared/render-context.js +24 -1
- package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
- package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
- package/src/adapters/shared/runtime-host.d.ts +12 -0
- package/src/adapters/shared/server-adapter.d.ts +22 -11
- package/src/adapters/shared/server-adapter.js +183 -133
- package/src/adapters/shared/server-route-handler.d.ts +5 -5
- package/src/adapters/shared/server-route-handler.js +4 -4
- package/src/adapters/shared/server-static-builder.d.ts +8 -7
- package/src/adapters/shared/server-static-builder.js +6 -5
- package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
- package/src/adapters/shared/shared-hmr-manager.js +241 -0
- package/src/adapters/shared/static-preview-host.d.ts +10 -0
- package/src/build/README.md +57 -67
- package/src/build/browser-runtime-manifest.d.ts +31 -0
- package/src/build/browser-runtime-manifest.js +61 -0
- package/src/build/browser-runtime-plugin-helpers.d.ts +26 -0
- package/src/build/browser-runtime-plugin-helpers.js +14 -0
- package/src/build/browser-runtime-plugin.d.ts +78 -0
- package/src/build/browser-runtime-plugin.js +173 -0
- package/src/build/build-adapter.d.ts +384 -63
- package/src/build/build-adapter.js +129 -54
- package/src/build/build-manifest.d.ts +6 -0
- package/src/build/build-manifest.js +21 -2
- package/src/build/build-types.d.ts +2 -2
- package/src/build/rolldown-adapter-helpers.d.ts +58 -0
- package/src/build/rolldown-adapter-helpers.js +265 -0
- package/src/build/rolldown-build-adapter.d.ts +28 -0
- package/src/build/rolldown-build-adapter.js +65 -0
- package/src/build/rolldown-dev-build-adapter.d.ts +82 -0
- package/src/build/rolldown-dev-build-adapter.js +166 -0
- package/src/build/rolldown-plugin-bridge.d.ts +59 -0
- package/src/build/rolldown-plugin-bridge.js +199 -0
- package/src/build/runtime-build-executor.d.ts +15 -7
- package/src/build/runtime-build-executor.js +8 -9
- package/src/build/runtime-build-output-normalizer.d.ts +3 -0
- package/src/build/runtime-build-output-normalizer.js +111 -0
- package/src/build/serialized-build-executor.d.ts +64 -0
- package/src/build/serialized-build-executor.js +63 -0
- package/src/build/server-side-css-shim-plugin.d.ts +41 -0
- package/src/build/server-side-css-shim-plugin.js +35 -0
- package/src/cache/index.d.ts +6 -0
- package/src/cache/index.js +6 -0
- package/src/cache/module-parse-cache.d.ts +65 -0
- package/src/cache/module-parse-cache.js +75 -0
- package/src/config/README.md +5 -2
- package/src/config/config-builder.d.ts +41 -13
- package/src/config/config-builder.js +62 -24
- package/src/declarations.d.ts +1 -1
- package/src/dev/host-runtime.d.ts +10 -0
- package/src/dev/host-runtime.js +24 -0
- package/src/dev/sc-server.d.ts +1 -1
- package/src/dev/sc-server.js +1 -1
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +88 -0
- package/src/eco/eco.js +50 -45
- package/src/eco/eco.types.d.ts +60 -8
- package/src/eco/eco.utils.d.ts +1 -40
- package/src/eco/eco.utils.js +5 -35
- package/src/eco/global-injector-map.d.ts +3 -3
- package/src/eco/global-injector-map.js +2 -2
- package/src/eco/lazy-injector-map.d.ts +2 -2
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +3 -1
- package/src/hmr/client/hmr-runtime.js +9 -1
- package/src/hmr/hmr-strategy.d.ts +16 -13
- package/src/hmr/hmr-strategy.js +22 -7
- package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
- package/src/hmr/strategies/default-hmr-strategy.js +1 -1
- package/src/hmr/strategies/js-hmr-strategy.d.ts +4 -9
- package/src/hmr/strategies/js-hmr-strategy.js +5 -10
- package/src/index.browser.d.ts +2 -2
- package/src/index.browser.js +1 -1
- package/src/index.d.ts +3 -2
- package/src/index.js +15 -4
- package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -1
- package/src/integrations/ghtml/ghtml-renderer.js +24 -29
- 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 +2 -6
- package/src/integrations/ghtml/ghtml.plugin.js +3 -4
- package/src/plugins/README.md +1 -0
- package/src/plugins/alias-resolver-cache.d.ts +68 -0
- package/src/plugins/alias-resolver-cache.js +106 -0
- package/src/plugins/alias-resolver-plugin.d.ts +5 -1
- package/src/plugins/alias-resolver-plugin.js +19 -7
- package/src/plugins/eco-component-meta-plugin.d.ts +12 -1
- package/src/plugins/eco-component-meta-plugin.js +43 -25
- package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
- package/src/plugins/foreign-jsx-override-plugin.js +41 -0
- package/src/plugins/integration-plugin.d.ts +136 -42
- package/src/plugins/integration-plugin.js +99 -31
- package/src/plugins/processor.d.ts +4 -2
- package/src/plugins/processor.js +8 -3
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/GRAPH.md +80 -318
- package/src/route-renderer/README.md +74 -78
- package/src/route-renderer/orchestration/component-render-context.d.ts +97 -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 +110 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +290 -128
- package/src/route-renderer/orchestration/integration-renderer.js +660 -258
- 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 +3 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -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 +156 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.js +577 -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 +2 -2
- package/src/route-renderer/page-loading/dependency-resolver.js +27 -354
- 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 +7 -4
- package/src/route-renderer/page-loading/page-module-loader.js +8 -5
- package/src/route-renderer/route-renderer.d.ts +31 -23
- package/src/route-renderer/route-renderer.js +17 -24
- package/src/router/README.md +76 -8
- package/src/router/client/navigation-coordinator.d.ts +20 -0
- package/src/router/client/navigation-coordinator.js +2 -2
- package/src/router/server/route-registry.d.ts +78 -0
- package/src/router/server/route-registry.js +262 -0
- package/src/services/README.md +1 -2
- 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 +3 -20
- package/src/services/assets/asset-processing-service/asset-processing.service.js +52 -98
- package/src/services/assets/asset-processing-service/asset.factory.d.ts +1 -1
- package/src/services/assets/asset-processing-service/asset.factory.js +2 -2
- package/src/services/assets/asset-processing-service/assets.types.d.ts +14 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -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 -5
- package/src/services/assets/asset-processing-service/index.js +6 -5
- package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
- package/src/services/assets/asset-processing-service/page-package.js +80 -0
- package/src/services/assets/asset-processing-service/processor.interface.d.ts +2 -2
- package/src/services/assets/asset-processing-service/processor.registry.d.ts +2 -2
- package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +1 -1
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +3 -2
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +10 -5
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +69 -5
- package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -5
- 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 +3 -2
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +66 -3
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +4 -3
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +27 -6
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +38 -3
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +57 -6
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +39 -5
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +5 -2
- 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 +44 -3
- package/src/services/assets/browser-bundle.service.js +15 -7
- package/src/services/html/html-rewriter-provider.service.d.ts +3 -0
- package/src/services/html/html-rewriter-provider.service.js +4 -1
- package/src/services/html/html-transformer.service.d.ts +22 -3
- package/src/services/html/html-transformer.service.js +101 -35
- package/src/services/invalidation/development-invalidation.service.d.ts +1 -1
- package/src/services/invalidation/development-invalidation.service.js +1 -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 +9 -1
- package/src/services/module-loading/app-server-module-transpiler.service.js +102 -6
- 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.d.ts +2 -0
- package/src/services/module-loading/module-loading-types.js +0 -0
- package/src/services/module-loading/page-module-import.service.d.ts +32 -8
- package/src/services/module-loading/page-module-import.service.js +83 -22
- package/src/services/module-loading/server-module-transpiler.service.d.ts +8 -14
- package/src/services/module-loading/server-module-transpiler.service.js +5 -2
- 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 +6 -6
- package/src/services/runtime-state/dev-graph.service.js +10 -10
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +1 -1
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +1 -1
- package/src/static-site-generator/static-site-generator.d.ts +23 -28
- package/src/static-site-generator/static-site-generator.js +119 -156
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +34 -23
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +195 -37
- package/src/types/public-types.js +0 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +6 -0
- package/src/utils/locals-utils.d.ts +1 -1
- package/src/utils/parse-cli-args.d.ts +4 -1
- package/src/utils/parse-cli-args.js +16 -1
- package/src/utils/resolve-work-dir.js +1 -1
- package/src/watchers/project-watcher.d.ts +4 -4
- package/src/watchers/project-watcher.js +35 -41
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +5 -5
- package/CHANGELOG.md +0 -31
- package/src/adapters/abstract/application-adapter.ts +0 -337
- 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 -189
- package/src/adapters/bun/hmr-manager.ts +0 -409
- package/src/adapters/bun/index.ts +0 -2
- package/src/adapters/bun/server-adapter.ts +0 -499
- package/src/adapters/bun/server-lifecycle.d.ts +0 -63
- package/src/adapters/bun/server-lifecycle.js +0 -92
- package/src/adapters/bun/server-lifecycle.ts +0 -124
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/bootstrap-dependency-resolver.d.ts +0 -44
- package/src/adapters/node/bootstrap-dependency-resolver.js +0 -172
- package/src/adapters/node/bootstrap-dependency-resolver.ts +0 -301
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.d.ts +0 -6
- package/src/adapters/node/index.js +0 -11
- package/src/adapters/node/index.ts +0 -16
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -381
- package/src/adapters/node/runtime-adapter.d.ts +0 -46
- package/src/adapters/node/runtime-adapter.js +0 -306
- package/src/adapters/node/runtime-adapter.ts +0 -439
- package/src/adapters/node/server-adapter.ts +0 -488
- package/src/adapters/node/static-content-server.ts +0 -239
- package/src/adapters/node/write-runtime-manifest.d.ts +0 -26
- package/src/adapters/node/write-runtime-manifest.js +0 -12
- package/src/adapters/node/write-runtime-manifest.ts +0 -38
- 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-route-matcher.ts +0 -140
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -127
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -205
- package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
- package/src/adapters/shared/hmr-html-response.ts +0 -52
- package/src/adapters/shared/render-context.ts +0 -120
- package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
- package/src/adapters/shared/runtime-bootstrap.js +0 -43
- package/src/adapters/shared/runtime-bootstrap.ts +0 -79
- package/src/adapters/shared/server-adapter.ts +0 -489
- package/src/adapters/shared/server-route-handler.ts +0 -153
- package/src/adapters/shared/server-static-builder.ts +0 -166
- package/src/build/build-adapter.ts +0 -361
- package/src/build/build-manifest.ts +0 -54
- package/src/build/build-types.ts +0 -83
- package/src/build/dev-build-coordinator.d.ts +0 -74
- package/src/build/dev-build-coordinator.js +0 -161
- package/src/build/dev-build-coordinator.ts +0 -221
- package/src/build/esbuild-build-adapter.d.ts +0 -72
- package/src/build/esbuild-build-adapter.js +0 -422
- package/src/build/esbuild-build-adapter.ts +0 -559
- package/src/build/runtime-build-executor.ts +0 -34
- package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
- package/src/build/runtime-specifier-alias-plugin.js +0 -31
- package/src/build/runtime-specifier-alias-plugin.ts +0 -58
- package/src/config/config-builder.ts +0 -706
- package/src/constants.ts +0 -54
- package/src/create-app.ts +0 -87
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -87
- package/src/eco/component-render-context.ts +0 -224
- package/src/eco/eco.ts +0 -242
- package/src/eco/eco.types.ts +0 -221
- package/src/eco/eco.utils.ts +0 -89
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -2
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- package/src/hmr/client/hmr-runtime.ts +0 -152
- package/src/hmr/hmr-strategy.ts +0 -172
- 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.ts +0 -320
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -96
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -232
- package/src/plugins/alias-resolver-plugin.ts +0 -63
- package/src/plugins/eco-component-meta-plugin.ts +0 -481
- package/src/plugins/integration-plugin.ts +0 -226
- package/src/plugins/processor.ts +0 -240
- package/src/plugins/runtime-capability.ts +0 -14
- package/src/public-types.ts +0 -1317
- package/src/route-renderer/component-graph/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph/component-graph.js +0 -72
- package/src/route-renderer/component-graph/component-graph.ts +0 -159
- package/src/route-renderer/component-graph/component-marker.d.ts +0 -52
- package/src/route-renderer/component-graph/component-marker.js +0 -46
- package/src/route-renderer/component-graph/component-marker.ts +0 -117
- package/src/route-renderer/component-graph/component-reference.d.ts +0 -10
- package/src/route-renderer/component-graph/component-reference.js +0 -19
- package/src/route-renderer/component-graph/component-reference.ts +0 -29
- package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +0 -77
- package/src/route-renderer/component-graph/marker-graph-resolver.js +0 -95
- package/src/route-renderer/component-graph/marker-graph-resolver.ts +0 -155
- package/src/route-renderer/orchestration/integration-renderer.ts +0 -790
- package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -103
- package/src/route-renderer/orchestration/render-execution.service.js +0 -121
- package/src/route-renderer/orchestration/render-execution.service.ts +0 -230
- package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -121
- package/src/route-renderer/orchestration/render-preparation.service.js +0 -332
- package/src/route-renderer/orchestration/render-preparation.service.ts +0 -476
- package/src/route-renderer/page-loading/dependency-resolver.ts +0 -612
- package/src/route-renderer/page-loading/page-module-loader.ts +0 -181
- package/src/route-renderer/route-renderer.ts +0 -115
- 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.ts +0 -433
- package/src/router/server/fs-router-scanner.d.ts +0 -41
- package/src/router/server/fs-router-scanner.js +0 -156
- package/src/router/server/fs-router-scanner.ts +0 -219
- package/src/router/server/fs-router.d.ts +0 -26
- package/src/router/server/fs-router.js +0 -100
- package/src/router/server/fs-router.ts +0 -122
- package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -401
- package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/assets/asset-processing-service/assets.types.ts +0 -113
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -95
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
- package/src/services/assets/asset-processing-service/index.ts +0 -5
- package/src/services/assets/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -82
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -95
- package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -85
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -80
- package/src/services/assets/browser-bundle.service.ts +0 -53
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
- package/src/services/html/html-rewriter-provider.service.ts +0 -103
- package/src/services/html/html-transformer.service.ts +0 -279
- package/src/services/invalidation/development-invalidation.service.ts +0 -261
- package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -52
- package/src/services/module-loading/page-module-import.service.ts +0 -200
- package/src/services/module-loading/server-loader.service.d.ts +0 -96
- package/src/services/module-loading/server-loader.service.js +0 -32
- package/src/services/module-loading/server-loader.service.ts +0 -130
- package/src/services/module-loading/server-module-transpiler.service.ts +0 -105
- package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +0 -35
- package/src/services/runtime-manifest/node-runtime-manifest.service.js +0 -60
- package/src/services/runtime-manifest/node-runtime-manifest.service.ts +0 -101
- 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/runtime-specifier-registry.service.d.ts +0 -69
- package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
- package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
- package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
- package/src/services/validation/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -462
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- 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/watchers/project-watcher.test-helpers.ts +0 -41
- package/src/watchers/project-watcher.ts +0 -363
- /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
- /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
- /package/src/{constants.d.ts → config/constants.d.ts} +0 -0
- /package/src/{constants.js → config/constants.js} +0 -0
|
@@ -1,44 +1,34 @@
|
|
|
1
1
|
import { invariant } from "../utils/invariant.js";
|
|
2
2
|
import { PathUtils } from "../utils/path-utils.module.js";
|
|
3
|
-
class RouteRenderer {
|
|
4
|
-
renderer;
|
|
5
|
-
/**
|
|
6
|
-
* Creates a route renderer bound to one integration renderer instance.
|
|
7
|
-
*/
|
|
8
|
-
constructor(renderer) {
|
|
9
|
-
this.renderer = renderer;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Executes the render pipeline for one matched route.
|
|
13
|
-
*/
|
|
14
|
-
async createRoute(options) {
|
|
15
|
-
return this.renderer.execute(options);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
3
|
class RouteRendererFactory {
|
|
19
4
|
appConfig;
|
|
20
5
|
runtimeOrigin;
|
|
6
|
+
rendererModules;
|
|
21
7
|
rendererCache = /* @__PURE__ */ new Map();
|
|
22
8
|
/**
|
|
23
9
|
* Creates the route-renderer factory for one app/runtime instance.
|
|
24
10
|
*/
|
|
25
|
-
constructor({
|
|
11
|
+
constructor({
|
|
12
|
+
appConfig,
|
|
13
|
+
rendererModules,
|
|
14
|
+
runtimeOrigin
|
|
15
|
+
}) {
|
|
26
16
|
this.appConfig = appConfig;
|
|
17
|
+
this.rendererModules = rendererModules;
|
|
27
18
|
this.runtimeOrigin = runtimeOrigin;
|
|
28
19
|
}
|
|
29
20
|
/**
|
|
30
21
|
* Returns a route renderer for the supplied route file.
|
|
31
22
|
*/
|
|
32
|
-
|
|
23
|
+
getPageRenderer(filePath) {
|
|
33
24
|
const integrationRenderer = this.getRouteRendererEngine(filePath);
|
|
34
25
|
invariant(!!integrationRenderer, `No integration renderer found for file: ${filePath}`);
|
|
35
|
-
return
|
|
26
|
+
return integrationRenderer;
|
|
36
27
|
}
|
|
37
28
|
/**
|
|
38
|
-
*
|
|
39
|
-
* Used for explicit routing where views specify their integration via __eco.integration.
|
|
29
|
+
* Returns a renderer for an explicit view integration.
|
|
40
30
|
*/
|
|
41
|
-
|
|
31
|
+
getExplicitViewRenderer(integrationName) {
|
|
42
32
|
const integrationPlugin = this.appConfig.integrations.find((plugin) => plugin.name === integrationName);
|
|
43
33
|
if (!integrationPlugin) {
|
|
44
34
|
return null;
|
|
@@ -47,7 +37,9 @@ class RouteRendererFactory {
|
|
|
47
37
|
if (cached) {
|
|
48
38
|
return cached;
|
|
49
39
|
}
|
|
50
|
-
const renderer = integrationPlugin.initializeRenderer(
|
|
40
|
+
const renderer = integrationPlugin.initializeRenderer({
|
|
41
|
+
rendererModules: this.rendererModules
|
|
42
|
+
});
|
|
51
43
|
this.rendererCache.set(integrationName, renderer);
|
|
52
44
|
return renderer;
|
|
53
45
|
}
|
|
@@ -76,12 +68,13 @@ class RouteRendererFactory {
|
|
|
76
68
|
if (cached) {
|
|
77
69
|
return cached;
|
|
78
70
|
}
|
|
79
|
-
const renderer = integrationPlugin.initializeRenderer(
|
|
71
|
+
const renderer = integrationPlugin.initializeRenderer({
|
|
72
|
+
rendererModules: this.rendererModules
|
|
73
|
+
});
|
|
80
74
|
this.rendererCache.set(integrationPlugin.name, renderer);
|
|
81
75
|
return renderer;
|
|
82
76
|
}
|
|
83
77
|
}
|
|
84
78
|
export {
|
|
85
|
-
RouteRenderer,
|
|
86
79
|
RouteRendererFactory
|
|
87
80
|
};
|
package/src/router/README.md
CHANGED
|
@@ -8,19 +8,87 @@ The router layer determines what route is being handled and how the client runti
|
|
|
8
8
|
|
|
9
9
|
It is responsible for:
|
|
10
10
|
|
|
11
|
-
- filesystem route
|
|
12
|
-
-
|
|
13
|
-
-
|
|
11
|
+
- filesystem route discovery and classification (`exact`, `dynamic`, `catch-all`)
|
|
12
|
+
- matching incoming request URLs to canonical template routes
|
|
13
|
+
- server-side static-path expansion for dynamic template routes
|
|
14
|
+
- client-side navigation ownership and cross-runtime handoff
|
|
14
15
|
- keeping route discovery separate from rendering execution
|
|
15
16
|
|
|
16
|
-
##
|
|
17
|
+
## Directory Structure
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
```
|
|
20
|
+
router/
|
|
21
|
+
├── server/ # Server-side route discovery and matching
|
|
22
|
+
│ └── route-registry.ts # Owns template routes, request matching, static expansion, and reload
|
|
23
|
+
└── client/ # Browser-side navigation coordination
|
|
24
|
+
├── navigation-coordinator.ts # Singleton runtime coordinator
|
|
25
|
+
└── link-intent.ts # Shared anchor detection and intent recovery helpers
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## `server/`
|
|
29
|
+
|
|
30
|
+
### `RouteRegistry`
|
|
31
|
+
|
|
32
|
+
Owns the canonical set of filesystem-discovered template routes for one application.
|
|
33
|
+
|
|
34
|
+
File patterns determine route kind:
|
|
35
|
+
|
|
36
|
+
| Pattern | Kind | Example |
|
|
37
|
+
| --------------- | ----------- | ----------------- |
|
|
38
|
+
| `page.tsx` | `exact` | `/about` |
|
|
39
|
+
| `[slug].tsx` | `dynamic` | `/blog/[slug]` |
|
|
40
|
+
| `[...slug].tsx` | `catch-all` | `/docs/[...slug]` |
|
|
41
|
+
|
|
42
|
+
The registry stores canonical template routes only. It compiles request-time matching metadata during `init()` and `reload()`, but it does not execute `staticPaths()` during discovery.
|
|
43
|
+
|
|
44
|
+
Build-time static expansion is a separate operation. The registry invokes `staticPaths()` lazily through an injected page-module adapter and returns concrete static path expansions for the static generator.
|
|
45
|
+
|
|
46
|
+
The public interface is intentionally small:
|
|
47
|
+
|
|
48
|
+
- `templateRoutes` — ordered readonly template routes
|
|
49
|
+
- `init()` / `reload()` — rebuild discovery state and match metadata
|
|
50
|
+
- `matchRequest(requestUrl)` — request-time matching result with requested pathname, matched template route, params, and query
|
|
51
|
+
- `listStaticPathExpansions()` — build-time expansion for dynamic routes
|
|
52
|
+
- `listStaticGenerationRoutes()` — build-time route planning for static generation across exact and expanded routes
|
|
53
|
+
|
|
54
|
+
Match priority:
|
|
55
|
+
|
|
56
|
+
1. `exact` — the pathname must equal the route pathname exactly.
|
|
57
|
+
2. `dynamic` — the clean (bracket-stripped) prefix must appear in the pathname, and the segment counts must match.
|
|
58
|
+
3. `catch-all` — the clean prefix must appear in the pathname.
|
|
59
|
+
|
|
60
|
+
## `client/`
|
|
61
|
+
|
|
62
|
+
### Navigation Coordinator (`navigation-coordinator.ts`)
|
|
63
|
+
|
|
64
|
+
A singleton browser-side runtime stored on `window.__ECO_PAGES__.navigation`.
|
|
65
|
+
|
|
66
|
+
Access it with:
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { getEcoNavigationRuntime } from '@ecopages/core/router/navigation-coordinator';
|
|
70
|
+
const runtime = getEcoNavigationRuntime();
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The coordinator is framework-agnostic. Browser runtimes (e.g. `browser-router`, `react-router`) register themselves and the coordinator arbitrates:
|
|
74
|
+
|
|
75
|
+
- **Ownership** — which runtime currently drives SPA navigation (`claimOwnership`, `releaseOwnership`, `setOwner`).
|
|
76
|
+
- **Document owner marker** — an HTML attribute (`data-eco-document-owner`) written into rendered markup so the coordinator can `adoptDocumentOwner` on the incoming page.
|
|
77
|
+
- **Navigation transactions** — each navigation begins a transaction with an `AbortSignal`; superseded navigations are automatically cancelled.
|
|
78
|
+
- **Cross-runtime handoff** — `requestHandoff` passes a pre-fetched `Document` to the target runtime without tearing down the current page prematurely.
|
|
79
|
+
- **Reload** — `reloadCurrentPage` delegates to whichever runtime currently owns the document.
|
|
80
|
+
- **Events** — `subscribe` lets runtimes react to `owner-change` and `registration-change` events.
|
|
81
|
+
|
|
82
|
+
### Link Intent (`link-intent.ts`)
|
|
83
|
+
|
|
84
|
+
Shared helpers for locating anchors and recovering stale navigation intent.
|
|
85
|
+
|
|
86
|
+
- `getAnchorFromNavigationEvent(event, linkSelector)` — finds the nearest matching anchor in the event's composed path, including across Shadow DOM boundaries.
|
|
87
|
+
- `recoverPendingNavigationHref(intent, hasInFlightNavigation, now, maxAgeMs?)` — resolves a previously captured pointer or hover target when the DOM changes before the click lands. Intents expire after `maxAgeMs` (default 1000 ms).
|
|
20
88
|
|
|
21
89
|
## Relationship To Rendering
|
|
22
90
|
|
|
23
|
-
The router layer answers which route should run
|
|
24
|
-
The route-renderer layer answers how that route gets rendered
|
|
91
|
+
The router layer answers **which route should run**.
|
|
92
|
+
The route-renderer layer answers **how that route gets rendered**.
|
|
25
93
|
|
|
26
94
|
Keeping those seams separate avoids mixing route ownership, module loading, and component orchestration into one service.
|
|
@@ -40,7 +40,21 @@ export type EcoNavigationHandoffRequest = EcoNavigationRequest & {
|
|
|
40
40
|
};
|
|
41
41
|
/** Request to reload the current page through the active runtime. */
|
|
42
42
|
export type EcoReloadRequest = {
|
|
43
|
+
/**
|
|
44
|
+
* Clears runtime-owned caches before reloading.
|
|
45
|
+
*
|
|
46
|
+
* Runtimes use this when a reload must discard persisted client state such as
|
|
47
|
+
* cached layouts or route-local module instances.
|
|
48
|
+
*/
|
|
43
49
|
clearCache?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Explicit page module URL to load for the reload.
|
|
52
|
+
*
|
|
53
|
+
* This is primarily used by HMR-aware runtimes so a current-page reload can
|
|
54
|
+
* reuse the active hot module entry instead of rediscovering the static page
|
|
55
|
+
* bootstrap asset from the fetched HTML document.
|
|
56
|
+
*/
|
|
57
|
+
moduleUrl?: string;
|
|
44
58
|
source?: EcoNavigationOwner;
|
|
45
59
|
};
|
|
46
60
|
/** Snapshot of the coordinator's current runtime ownership state. */
|
|
@@ -76,6 +90,12 @@ export type EcoNavigationRuntimeRegistration = {
|
|
|
76
90
|
owner: EcoNavigationOwner;
|
|
77
91
|
navigate?: (request: EcoNavigationRequest) => Promise<boolean | void>;
|
|
78
92
|
handoffNavigation?: (request: EcoNavigationHandoffRequest) => Promise<boolean | void>;
|
|
93
|
+
/**
|
|
94
|
+
* Reloads the current page through the runtime's local navigation mechanism.
|
|
95
|
+
*
|
|
96
|
+
* Implementations may honor `request.moduleUrl` to force a specific page entry
|
|
97
|
+
* and `request.clearCache` to discard persisted runtime state before reloading.
|
|
98
|
+
*/
|
|
79
99
|
reloadCurrentPage?: (request?: EcoReloadRequest) => Promise<void>;
|
|
80
100
|
/**
|
|
81
101
|
* Releases runtime-owned client state before another runtime commits a new
|
|
@@ -16,7 +16,7 @@ function getCandidateOwners(currentOwner, registrations, excludedOwner) {
|
|
|
16
16
|
}
|
|
17
17
|
return owners;
|
|
18
18
|
}
|
|
19
|
-
function createEcoNavigationRuntime(
|
|
19
|
+
function createEcoNavigationRuntime() {
|
|
20
20
|
const registrations = /* @__PURE__ */ new Map();
|
|
21
21
|
const listeners = /* @__PURE__ */ new Set();
|
|
22
22
|
let owner = "none";
|
|
@@ -204,7 +204,7 @@ function getEcoNavigationRuntime(windowObject = window) {
|
|
|
204
204
|
const runtimeWindow = windowObject;
|
|
205
205
|
runtimeWindow.__ECO_PAGES__ = runtimeWindow.__ECO_PAGES__ || {};
|
|
206
206
|
if (!runtimeWindow.__ECO_PAGES__.navigation) {
|
|
207
|
-
runtimeWindow.__ECO_PAGES__.navigation = createEcoNavigationRuntime(
|
|
207
|
+
runtimeWindow.__ECO_PAGES__.navigation = createEcoNavigationRuntime();
|
|
208
208
|
}
|
|
209
209
|
return runtimeWindow.__ECO_PAGES__.navigation;
|
|
210
210
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig, RouteKind } from '../../types/internal-types.js';
|
|
2
|
+
export type RouteParams = Record<string, string | string[]>;
|
|
3
|
+
export type RouteQuery = Record<string, string>;
|
|
4
|
+
export type TemplateRoute = {
|
|
5
|
+
readonly pathname: string;
|
|
6
|
+
readonly kind: RouteKind;
|
|
7
|
+
readonly filePath: string;
|
|
8
|
+
readonly paramNames: readonly string[];
|
|
9
|
+
};
|
|
10
|
+
export type RouteMatch = {
|
|
11
|
+
readonly requestedPathname: string;
|
|
12
|
+
readonly templateRoute: TemplateRoute;
|
|
13
|
+
readonly params: RouteParams;
|
|
14
|
+
readonly query: RouteQuery;
|
|
15
|
+
};
|
|
16
|
+
export type StaticPathExpansion = {
|
|
17
|
+
readonly pathname: string;
|
|
18
|
+
readonly templateRoute: TemplateRoute;
|
|
19
|
+
readonly params: RouteParams;
|
|
20
|
+
};
|
|
21
|
+
export type StaticGenerationRoute = {
|
|
22
|
+
readonly requestUrl: string;
|
|
23
|
+
readonly pathname: string;
|
|
24
|
+
readonly templateRoute: TemplateRoute;
|
|
25
|
+
readonly params: RouteParams;
|
|
26
|
+
};
|
|
27
|
+
export type StaticPathsContext = {
|
|
28
|
+
readonly appConfig: EcoPagesAppConfig;
|
|
29
|
+
readonly runtimeOrigin: string;
|
|
30
|
+
};
|
|
31
|
+
export type RouteRegistryPageModule = {
|
|
32
|
+
readonly staticPaths?: (context: StaticPathsContext) => Promise<{
|
|
33
|
+
paths: Array<{
|
|
34
|
+
params: RouteParams;
|
|
35
|
+
}>;
|
|
36
|
+
}>;
|
|
37
|
+
readonly staticProps?: unknown;
|
|
38
|
+
};
|
|
39
|
+
export interface RouteRegistryPageModuleAdapter {
|
|
40
|
+
loadPageModule(filePath: string): Promise<RouteRegistryPageModule>;
|
|
41
|
+
}
|
|
42
|
+
export type RouteRegistryOptions = {
|
|
43
|
+
pagesDir: string;
|
|
44
|
+
appConfig: EcoPagesAppConfig;
|
|
45
|
+
origin: string;
|
|
46
|
+
templatesExt: readonly string[];
|
|
47
|
+
buildMode: boolean;
|
|
48
|
+
pageModuleAdapter: RouteRegistryPageModuleAdapter;
|
|
49
|
+
};
|
|
50
|
+
export declare class RouteRegistry {
|
|
51
|
+
readonly origin: string;
|
|
52
|
+
readonly appConfig: EcoPagesAppConfig;
|
|
53
|
+
readonly pagesDir: string;
|
|
54
|
+
readonly templatesExt: readonly string[];
|
|
55
|
+
readonly buildMode: boolean;
|
|
56
|
+
private readonly pageModuleAdapter;
|
|
57
|
+
private templateRouteList;
|
|
58
|
+
private readonly reloadListeners;
|
|
59
|
+
constructor(options: RouteRegistryOptions);
|
|
60
|
+
get templateRoutes(): readonly TemplateRoute[];
|
|
61
|
+
init(): Promise<void>;
|
|
62
|
+
reload(): Promise<void>;
|
|
63
|
+
onReload(listener: () => void): () => void;
|
|
64
|
+
matchRequest(requestUrl: string): RouteMatch | null;
|
|
65
|
+
listStaticPathExpansions(input: {
|
|
66
|
+
runtimeOrigin: string;
|
|
67
|
+
}): Promise<readonly StaticPathExpansion[]>;
|
|
68
|
+
listStaticGenerationRoutes(input: {
|
|
69
|
+
runtimeOrigin: string;
|
|
70
|
+
}): Promise<readonly StaticGenerationRoute[]>;
|
|
71
|
+
private scanTemplateRoutes;
|
|
72
|
+
private getRoutePath;
|
|
73
|
+
private classifyRouteKind;
|
|
74
|
+
private getParamNames;
|
|
75
|
+
private tryExtractParams;
|
|
76
|
+
private getSearchParams;
|
|
77
|
+
private resolveTemplatePath;
|
|
78
|
+
}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
4
|
+
import { appLogger } from "../../global/app-logger.js";
|
|
5
|
+
import { invariant } from "../../utils/invariant.js";
|
|
6
|
+
const ROUTE_PRIORITY = {
|
|
7
|
+
exact: 0,
|
|
8
|
+
dynamic: 1,
|
|
9
|
+
"catch-all": 2
|
|
10
|
+
};
|
|
11
|
+
class RouteRegistry {
|
|
12
|
+
origin;
|
|
13
|
+
appConfig;
|
|
14
|
+
pagesDir;
|
|
15
|
+
templatesExt;
|
|
16
|
+
buildMode;
|
|
17
|
+
pageModuleAdapter;
|
|
18
|
+
templateRouteList = [];
|
|
19
|
+
reloadListeners = /* @__PURE__ */ new Set();
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.origin = options.origin;
|
|
22
|
+
this.appConfig = options.appConfig;
|
|
23
|
+
this.pagesDir = options.pagesDir;
|
|
24
|
+
this.templatesExt = options.templatesExt;
|
|
25
|
+
this.buildMode = options.buildMode;
|
|
26
|
+
this.pageModuleAdapter = options.pageModuleAdapter;
|
|
27
|
+
}
|
|
28
|
+
get templateRoutes() {
|
|
29
|
+
return this.templateRouteList;
|
|
30
|
+
}
|
|
31
|
+
async init() {
|
|
32
|
+
this.templateRouteList = await this.scanTemplateRoutes();
|
|
33
|
+
appLogger.debug("RouteRegistry initialized", this.templateRouteList);
|
|
34
|
+
}
|
|
35
|
+
async reload() {
|
|
36
|
+
await this.init();
|
|
37
|
+
for (const listener of this.reloadListeners) {
|
|
38
|
+
listener();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
onReload(listener) {
|
|
42
|
+
this.reloadListeners.add(listener);
|
|
43
|
+
return () => {
|
|
44
|
+
this.reloadListeners.delete(listener);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
matchRequest(requestUrl) {
|
|
48
|
+
const url = new URL(requestUrl);
|
|
49
|
+
const requestedPathname = normalizePathname(url.pathname);
|
|
50
|
+
const query = this.getSearchParams(url);
|
|
51
|
+
for (const route of this.templateRouteList) {
|
|
52
|
+
if (route.kind !== "exact") {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (requestedPathname === route.pathname || requestedPathname === `${route.pathname}/`) {
|
|
56
|
+
return {
|
|
57
|
+
requestedPathname,
|
|
58
|
+
templateRoute: route,
|
|
59
|
+
params: {},
|
|
60
|
+
query
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const route of this.templateRouteList) {
|
|
65
|
+
if (route.kind !== "dynamic") {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const params = this.tryExtractParams(route, requestedPathname);
|
|
69
|
+
if (!params) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
requestedPathname,
|
|
74
|
+
templateRoute: route,
|
|
75
|
+
params,
|
|
76
|
+
query
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
for (const route of this.templateRouteList) {
|
|
80
|
+
if (route.kind !== "catch-all") {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const params = this.tryExtractParams(route, requestedPathname);
|
|
84
|
+
if (!params) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
requestedPathname,
|
|
89
|
+
templateRoute: route,
|
|
90
|
+
params,
|
|
91
|
+
query
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
async listStaticPathExpansions(input) {
|
|
97
|
+
const expansions = [];
|
|
98
|
+
for (const route of this.templateRouteList) {
|
|
99
|
+
if (route.kind === "exact") {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const pageModule = await this.pageModuleAdapter.loadPageModule(route.filePath);
|
|
103
|
+
const staticPaths = pageModule.staticPaths;
|
|
104
|
+
if (this.buildMode) {
|
|
105
|
+
invariant(staticPaths !== void 0, `[ecopages] Missing getStaticPaths in ${route.filePath}`);
|
|
106
|
+
invariant(
|
|
107
|
+
pageModule.staticProps !== void 0,
|
|
108
|
+
`[ecopages] Missing getStaticProps in ${route.filePath}`
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
if (!staticPaths) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const result = await staticPaths({
|
|
115
|
+
appConfig: this.appConfig,
|
|
116
|
+
runtimeOrigin: input.runtimeOrigin
|
|
117
|
+
});
|
|
118
|
+
for (const { params } of result.paths) {
|
|
119
|
+
expansions.push({
|
|
120
|
+
pathname: this.resolveTemplatePath(route.pathname, params),
|
|
121
|
+
templateRoute: route,
|
|
122
|
+
params
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return expansions;
|
|
127
|
+
}
|
|
128
|
+
async listStaticGenerationRoutes(input) {
|
|
129
|
+
const staticPathExpansions = await this.listStaticPathExpansions(input);
|
|
130
|
+
return [
|
|
131
|
+
...this.templateRouteList.filter((route) => route.kind === "exact").map((route) => ({
|
|
132
|
+
requestUrl: `${input.runtimeOrigin}${route.pathname}`,
|
|
133
|
+
pathname: route.pathname,
|
|
134
|
+
templateRoute: route,
|
|
135
|
+
params: {}
|
|
136
|
+
})),
|
|
137
|
+
...staticPathExpansions.map((route) => ({
|
|
138
|
+
requestUrl: `${input.runtimeOrigin}${route.pathname}`,
|
|
139
|
+
pathname: route.pathname,
|
|
140
|
+
templateRoute: route.templateRoute,
|
|
141
|
+
params: route.params
|
|
142
|
+
}))
|
|
143
|
+
];
|
|
144
|
+
}
|
|
145
|
+
async scanTemplateRoutes() {
|
|
146
|
+
if (!existsSync(this.pagesDir)) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
const scannedFiles = await fileSystem.glob(
|
|
150
|
+
this.templatesExt.map((ext) => `**/*${ext}`),
|
|
151
|
+
{
|
|
152
|
+
cwd: this.pagesDir
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
const templateRoutes = [];
|
|
156
|
+
for await (const file of scannedFiles) {
|
|
157
|
+
if (file.includes(".ecopages-node.")) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const routePathname = this.getRoutePath(file);
|
|
161
|
+
const filePath = path.join(this.pagesDir, file);
|
|
162
|
+
const kind = this.classifyRouteKind(filePath);
|
|
163
|
+
templateRoutes.push({
|
|
164
|
+
pathname: routePathname,
|
|
165
|
+
kind,
|
|
166
|
+
filePath,
|
|
167
|
+
paramNames: this.getParamNames(routePathname)
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return templateRoutes.sort((left, right) => {
|
|
171
|
+
const priorityDifference = ROUTE_PRIORITY[left.kind] - ROUTE_PRIORITY[right.kind];
|
|
172
|
+
if (priorityDifference !== 0) {
|
|
173
|
+
return priorityDifference;
|
|
174
|
+
}
|
|
175
|
+
if (left.pathname === "/") {
|
|
176
|
+
return -1;
|
|
177
|
+
}
|
|
178
|
+
if (right.pathname === "/") {
|
|
179
|
+
return 1;
|
|
180
|
+
}
|
|
181
|
+
return left.pathname.localeCompare(right.pathname);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
getRoutePath(file) {
|
|
185
|
+
const cleanedRoute = this.templatesExt.reduce((route, ext) => route.replace(ext, ""), file).replace(/\/?index$/, "");
|
|
186
|
+
return normalizePathname(`/${cleanedRoute}`);
|
|
187
|
+
}
|
|
188
|
+
classifyRouteKind(filePath) {
|
|
189
|
+
if (filePath.includes("[...")) {
|
|
190
|
+
return "catch-all";
|
|
191
|
+
}
|
|
192
|
+
if (filePath.includes("[") && filePath.includes("]")) {
|
|
193
|
+
return "dynamic";
|
|
194
|
+
}
|
|
195
|
+
return "exact";
|
|
196
|
+
}
|
|
197
|
+
getParamNames(routePathname) {
|
|
198
|
+
const matches = routePathname.match(/\[(?:\.\.\.)?([^\]]+)\]/g);
|
|
199
|
+
return matches ? matches.map((match) => match.replace(/^\[(?:\.\.\.)?/, "").replace(/\]$/, "")) : [];
|
|
200
|
+
}
|
|
201
|
+
tryExtractParams(route, requestedPathname) {
|
|
202
|
+
const routeParts = route.pathname.split("/");
|
|
203
|
+
const pathnameParts = requestedPathname.split("/");
|
|
204
|
+
if (route.kind === "dynamic" && routeParts.length !== pathnameParts.length) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
const params = {};
|
|
208
|
+
for (let i = 0; i < routeParts.length; i++) {
|
|
209
|
+
const routePart = routeParts[i];
|
|
210
|
+
const pathnamePart = pathnameParts[i];
|
|
211
|
+
if (!routePart) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (routePart.startsWith("[...") && routePart.endsWith("]")) {
|
|
215
|
+
const paramName = routePart.slice(4, -1);
|
|
216
|
+
params[paramName] = pathnameParts.slice(i).filter(Boolean);
|
|
217
|
+
return params;
|
|
218
|
+
}
|
|
219
|
+
if (routePart.startsWith("[") && routePart.endsWith("]")) {
|
|
220
|
+
if (pathnamePart === void 0) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
params[routePart.slice(1, -1)] = pathnamePart;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (routePart !== pathnamePart) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (route.kind === "catch-all") {
|
|
231
|
+
const cleanPathname = route.pathname.replace(/\[.*?\]/g, "");
|
|
232
|
+
return requestedPathname.includes(cleanPathname) ? params : null;
|
|
233
|
+
}
|
|
234
|
+
return params;
|
|
235
|
+
}
|
|
236
|
+
getSearchParams(url) {
|
|
237
|
+
const query = {};
|
|
238
|
+
for (const [key, value] of url.searchParams) {
|
|
239
|
+
query[key] = value;
|
|
240
|
+
}
|
|
241
|
+
return query;
|
|
242
|
+
}
|
|
243
|
+
resolveTemplatePath(pathname, params) {
|
|
244
|
+
let resolvedPath = pathname;
|
|
245
|
+
for (const [key, value] of Object.entries(params)) {
|
|
246
|
+
const serializedValue = Array.isArray(value) ? value.join("/") : value;
|
|
247
|
+
resolvedPath = resolvedPath.replace(`[...${key}]`, serializedValue);
|
|
248
|
+
resolvedPath = resolvedPath.replace(`[${key}]`, serializedValue);
|
|
249
|
+
}
|
|
250
|
+
return normalizePathname(resolvedPath);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function normalizePathname(pathname) {
|
|
254
|
+
if (!pathname || pathname === "/") {
|
|
255
|
+
return "/";
|
|
256
|
+
}
|
|
257
|
+
const normalized = pathname.startsWith("/") ? pathname : `/${pathname}`;
|
|
258
|
+
return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
|
|
259
|
+
}
|
|
260
|
+
export {
|
|
261
|
+
RouteRegistry
|
|
262
|
+
};
|
package/src/services/README.md
CHANGED
|
@@ -11,7 +11,6 @@ Typical responsibilities include:
|
|
|
11
11
|
- server-module loading and transpilation
|
|
12
12
|
- browser bundle coordination
|
|
13
13
|
- asset processing and runtime asset declaration helpers
|
|
14
|
-
- runtime specifier registry management
|
|
15
14
|
- server invalidation state and entrypoint dependency graphs
|
|
16
15
|
- HTML finalization and dependency injection
|
|
17
16
|
|
|
@@ -20,7 +19,7 @@ Typical responsibilities include:
|
|
|
20
19
|
- `module-loading/`: framework-owned config/app bootstrap loading and server-side source loading
|
|
21
20
|
- `assets/`: shared browser build coordination and processed asset pipelines
|
|
22
21
|
- `invalidation/`: file-change classification and invalidation policy
|
|
23
|
-
- `runtime-state/`: app-owned invalidation state
|
|
22
|
+
- `runtime-state/`: app-owned invalidation state and dependency graphs
|
|
24
23
|
- `runtime-manifest/`: node runtime manifest derivation and persistence
|
|
25
24
|
- `html/`: final HTML dependency injection and rewriter selection
|
|
26
25
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { rapidhash } from "../../../utils/hash.js";
|
|
2
|
+
function generateHash(content) {
|
|
3
|
+
return rapidhash(content).toString();
|
|
4
|
+
}
|
|
5
|
+
function getScriptDependencyBuildSignature(dep) {
|
|
6
|
+
if (dep.kind !== "script") {
|
|
7
|
+
return void 0;
|
|
8
|
+
}
|
|
9
|
+
const pluginNames = dep.bundleOptions?.plugins?.map((plugin) => plugin.name) ?? [];
|
|
10
|
+
const signature = {
|
|
11
|
+
bundle: dep.bundle,
|
|
12
|
+
inline: dep.inline,
|
|
13
|
+
excludeFromHtml: dep.excludeFromHtml,
|
|
14
|
+
groupedBundle: dep.groupedBundle,
|
|
15
|
+
naming: dep.bundleOptions?.naming,
|
|
16
|
+
external: dep.bundleOptions?.external,
|
|
17
|
+
minify: dep.bundleOptions?.minify,
|
|
18
|
+
plugins: pluginNames
|
|
19
|
+
};
|
|
20
|
+
return generateHash(JSON.stringify(signature));
|
|
21
|
+
}
|
|
22
|
+
function getAssetDependencyKey(dep) {
|
|
23
|
+
const parts = [dep.kind, dep.source];
|
|
24
|
+
if ("filepath" in dep) {
|
|
25
|
+
parts.push(dep.filepath);
|
|
26
|
+
} else if ("content" in dep) {
|
|
27
|
+
parts.push(`content:${generateHash(dep.content)}`);
|
|
28
|
+
} else if ("importPath" in dep) {
|
|
29
|
+
parts.push(dep.importPath);
|
|
30
|
+
}
|
|
31
|
+
if ("position" in dep && dep.position) {
|
|
32
|
+
parts.push(dep.position);
|
|
33
|
+
}
|
|
34
|
+
if ("packageRole" in dep && dep.packageRole) {
|
|
35
|
+
parts.push(`package:${dep.packageRole}`);
|
|
36
|
+
}
|
|
37
|
+
const scriptBuildSignature = getScriptDependencyBuildSignature(dep);
|
|
38
|
+
if (scriptBuildSignature) {
|
|
39
|
+
parts.push(`build:${scriptBuildSignature}`);
|
|
40
|
+
}
|
|
41
|
+
return parts.join(":");
|
|
42
|
+
}
|
|
43
|
+
function deduplicateAssetDependencies(deps) {
|
|
44
|
+
const seen = /* @__PURE__ */ new Map();
|
|
45
|
+
for (const dep of deps) {
|
|
46
|
+
const key = getAssetDependencyKey(dep);
|
|
47
|
+
if (!seen.has(key)) {
|
|
48
|
+
seen.set(key, dep);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return Array.from(seen.values());
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
deduplicateAssetDependencies,
|
|
55
|
+
getAssetDependencyKey
|
|
56
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig, IHmrManager } from '../../../internal-types';
|
|
2
|
-
import type { AssetDefinition, AssetKind, AssetSource, ProcessedAsset } from './assets.types';
|
|
3
|
-
import { ProcessorRegistry } from './processor.registry';
|
|
1
|
+
import type { EcoPagesAppConfig, IHmrManager } from '../../../types/internal-types.js';
|
|
2
|
+
import type { AssetDefinition, AssetKind, AssetSource, ProcessedAsset } from './assets.types.js';
|
|
3
|
+
import { ProcessorRegistry } from './processor.registry.js';
|
|
4
4
|
/**
|
|
5
5
|
* Processes declared component and page asset dependencies for one app instance.
|
|
6
6
|
*
|
|
@@ -42,23 +42,6 @@ export declare class AssetProcessingService {
|
|
|
42
42
|
* entries.
|
|
43
43
|
*/
|
|
44
44
|
processDependencies(deps: AssetDefinition[], key: string): Promise<ProcessedAsset[]>;
|
|
45
|
-
/**
|
|
46
|
-
* Removes duplicate dependency declarations while preserving first-seen order.
|
|
47
|
-
*/
|
|
48
|
-
private deduplicateDependencies;
|
|
49
|
-
/**
|
|
50
|
-
* Builds the cache signature fragment for script dependencies that can vary by
|
|
51
|
-
* bundling policy.
|
|
52
|
-
*/
|
|
53
|
-
private getScriptDependencyBuildSignature;
|
|
54
|
-
/**
|
|
55
|
-
* Derives the stable cache key for one dependency declaration.
|
|
56
|
-
*/
|
|
57
|
-
private getDependencyKey;
|
|
58
|
-
/**
|
|
59
|
-
* Hashes content used in dependency cache and signature keys.
|
|
60
|
-
*/
|
|
61
|
-
private generateHash;
|
|
62
45
|
/**
|
|
63
46
|
* Processes deduplicated dependencies grouped by processor type.
|
|
64
47
|
*
|