@ecopages/core 0.2.0-alpha.3 → 0.2.0-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -66
- package/README.md +268 -14
- package/package.json +72 -108
- package/src/adapters/README.md +39 -0
- 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 +5 -12
- package/src/adapters/bun/create-app.js +43 -7
- package/src/adapters/bun/hmr-manager.d.ts +72 -26
- package/src/adapters/bun/hmr-manager.js +153 -81
- package/src/adapters/bun/index.d.ts +2 -3
- package/src/adapters/bun/index.js +3 -3
- package/src/adapters/bun/server-adapter.d.ts +5 -5
- package/src/adapters/bun/server-adapter.js +63 -38
- package/src/adapters/bun/server-lifecycle.d.ts +28 -17
- package/src/adapters/bun/server-lifecycle.js +34 -62
- 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 +2 -6
- package/src/adapters/index.js +2 -8
- package/src/adapters/node/create-app.d.ts +6 -9
- package/src/adapters/node/create-app.js +12 -6
- package/src/adapters/node/node-client-bridge.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.d.ts +79 -21
- package/src/adapters/node/node-hmr-manager.js +167 -114
- package/src/adapters/node/server-adapter.d.ts +7 -35
- package/src/adapters/node/server-adapter.js +55 -107
- package/src/adapters/node/static-content-server.d.ts +37 -1
- package/src/adapters/node/static-content-server.js +29 -1
- package/src/adapters/shared/application-adapter.d.ts +1 -1
- package/src/{define-api-handler.d.ts → 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 -13
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
- package/src/adapters/shared/file-route-middleware-pipeline.js +3 -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 +20 -16
- package/src/adapters/shared/fs-server-response-matcher.js +76 -45
- 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 +4 -3
- package/src/adapters/shared/render-context.js +6 -3
- 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 +33 -12
- package/src/adapters/shared/server-adapter.js +208 -132
- package/src/adapters/shared/server-route-handler.d.ts +5 -5
- package/src/adapters/shared/server-route-handler.js +7 -16
- package/src/adapters/shared/server-static-builder.d.ts +41 -8
- package/src/adapters/shared/server-static-builder.js +65 -11
- package/src/build/README.md +107 -0
- package/src/build/build-adapter.d.ts +168 -3
- package/src/build/build-adapter.js +604 -16
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -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 +15 -6
- package/src/build/esbuild-build-adapter.js +189 -74
- 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/README.md +36 -0
- package/src/config/config-builder.d.ts +54 -29
- package/src/config/config-builder.js +255 -49
- package/src/{constants.d.ts → config/constants.d.ts} +13 -0
- package/src/{constants.js → config/constants.js} +4 -0
- package/src/declarations.d.ts +19 -14
- 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/README.md +70 -16
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +83 -0
- package/src/eco/eco.js +32 -57
- package/src/eco/eco.types.d.ts +14 -6
- 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/README.md +26 -0
- package/src/hmr/client/hmr-runtime.d.ts +1 -6
- package/src/hmr/client/hmr-runtime.js +38 -7
- package/src/hmr/hmr-strategy.d.ts +16 -13
- package/src/hmr/hmr-strategy.js +22 -7
- 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.js +26 -33
- 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 +46 -48
- package/src/hmr/strategies/js-hmr-strategy.js +64 -74
- package/src/index.browser.d.ts +2 -2
- package/src/index.browser.js +1 -1
- package/src/index.d.ts +4 -3
- package/src/index.js +16 -5
- package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
- package/src/integrations/ghtml/ghtml-renderer.js +27 -30
- 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 +35 -0
- package/src/plugins/alias-resolver-plugin.js +17 -3
- package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
- package/src/plugins/eco-component-meta-plugin.js +27 -22
- 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 +142 -29
- package/src/plugins/integration-plugin.js +103 -14
- package/src/plugins/processor.d.ts +17 -2
- package/src/plugins/processor.js +22 -3
- package/src/plugins/runtime-capability.d.ts +9 -0
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/GRAPH.md +83 -325
- package/src/route-renderer/README.md +73 -90
- 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/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- 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-module-loader.js → page-loading/page-module-loader.js} +39 -14
- package/src/route-renderer/route-renderer.d.ts +57 -14
- package/src/route-renderer/route-renderer.js +30 -18
- package/src/router/README.md +94 -0
- package/src/router/client/link-intent.d.ts +53 -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/README.md +28 -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/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
- 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/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
- 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/{asset-processing-service → 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 +119 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +12 -7
- package/src/services/{asset-processing-service → 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 +59 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
- 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/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
- package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
- 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-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.d.ts +2 -0
- 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/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.d.ts +67 -20
- package/src/static-site-generator/static-site-generator.js +182 -138
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +201 -32
- 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.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/watchers/project-watcher.d.ts +40 -29
- package/src/watchers/project-watcher.js +126 -116
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +6 -6
- 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/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.ts +0 -296
- package/src/adapters/bun/index.ts +0 -3
- package/src/adapters/bun/server-adapter.ts +0 -492
- package/src/adapters/bun/server-lifecycle.ts +0 -154
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/index.ts +0 -9
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -289
- package/src/adapters/node/server-adapter.ts +0 -561
- package/src/adapters/node/static-content-server.ts +0 -203
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
- package/src/adapters/shared/render-context.ts +0 -105
- package/src/adapters/shared/server-adapter.ts +0 -442
- package/src/adapters/shared/server-route-handler.ts +0 -166
- package/src/adapters/shared/server-static-builder.ts +0 -82
- package/src/build/build-adapter.ts +0 -132
- package/src/build/build-types.ts +0 -83
- package/src/build/esbuild-build-adapter.ts +0 -510
- package/src/config/config-builder.ts +0 -474
- package/src/constants.ts +0 -39
- package/src/create-app.ts +0 -87
- package/src/define-api-handler.js +0 -15
- package/src/define-api-handler.ts +0 -66
- 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 -77
- package/src/eco/component-render-context.ts +0 -202
- package/src/eco/eco.ts +0 -221
- package/src/eco/eco.types.ts +0 -202
- 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/__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 -121
- package/src/hmr/hmr-strategy.ts +0 -172
- package/src/hmr/hmr.test.e2e.ts +0 -75
- 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 -93
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -212
- package/src/plugins/alias-resolver-plugin.ts +0 -45
- package/src/plugins/eco-component-meta-plugin.ts +0 -474
- package/src/plugins/integration-plugin.ts +0 -184
- package/src/plugins/processor.ts +0 -220
- package/src/public-types.ts +0 -1260
- package/src/route-renderer/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-graph.ts +0 -159
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/component-marker.ts +0 -117
- package/src/route-renderer/dependency-resolver.js +0 -428
- package/src/route-renderer/dependency-resolver.ts +0 -596
- package/src/route-renderer/html-post-processing.service.d.ts +0 -40
- package/src/route-renderer/html-post-processing.service.js +0 -86
- package/src/route-renderer/html-post-processing.service.ts +0 -103
- package/src/route-renderer/integration-renderer.d.ts +0 -339
- package/src/route-renderer/integration-renderer.js +0 -526
- package/src/route-renderer/integration-renderer.ts +0 -696
- package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
- package/src/route-renderer/marker-graph-resolver.js +0 -93
- package/src/route-renderer/marker-graph-resolver.ts +0 -153
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.ts +0 -153
- package/src/route-renderer/render-execution.service.d.ts +0 -69
- package/src/route-renderer/render-execution.service.js +0 -91
- package/src/route-renderer/render-execution.service.ts +0 -158
- package/src/route-renderer/render-preparation.service.d.ts +0 -112
- package/src/route-renderer/render-preparation.service.js +0 -243
- package/src/route-renderer/render-preparation.service.ts +0 -358
- package/src/route-renderer/route-renderer.ts +0 -80
- package/src/router/fs-router-scanner.d.ts +0 -41
- package/src/router/fs-router-scanner.js +0 -155
- package/src/router/fs-router-scanner.ts +0 -217
- package/src/router/fs-router.d.ts +0 -26
- package/src/router/fs-router.js +0 -100
- package/src/router/fs-router.ts +0 -122
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
- package/src/services/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/asset-processing-service/assets.types.ts +0 -112
- package/src/services/asset-processing-service/index.d.ts +0 -3
- package/src/services/asset-processing-service/index.js +0 -3
- package/src/services/asset-processing-service/index.ts +0 -3
- package/src/services/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
- package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
- package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
- package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
- package/src/services/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/asset-processing-service/processors/index.js +0 -5
- package/src/services/asset-processing-service/processors/index.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
- package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
- 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/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.ts +0 -128
- package/src/services/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 -359
- 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/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 -344
- /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
- /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
- /package/src/{public-types.js → services/module-loading/app-module-loader.service.js} +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
const ECO_DOCUMENT_OWNER_ATTRIBUTE = "data-eco-document-owner";
|
|
2
|
+
function getEcoDocumentOwner(doc) {
|
|
3
|
+
const owner = doc.documentElement.getAttribute(ECO_DOCUMENT_OWNER_ATTRIBUTE);
|
|
4
|
+
return owner && owner.length > 0 ? owner : null;
|
|
5
|
+
}
|
|
6
|
+
function getCandidateOwners(currentOwner, registrations, excludedOwner) {
|
|
7
|
+
const owners = [];
|
|
8
|
+
if (currentOwner !== "none" && currentOwner !== excludedOwner) {
|
|
9
|
+
owners.push(currentOwner);
|
|
10
|
+
}
|
|
11
|
+
for (const owner of registrations.keys()) {
|
|
12
|
+
if (owner === currentOwner || owner === excludedOwner) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
owners.push(owner);
|
|
16
|
+
}
|
|
17
|
+
return owners;
|
|
18
|
+
}
|
|
19
|
+
function createEcoNavigationRuntime() {
|
|
20
|
+
const registrations = /* @__PURE__ */ new Map();
|
|
21
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
22
|
+
let owner = "none";
|
|
23
|
+
let navigationSequence = 0;
|
|
24
|
+
let navigationAbortController = null;
|
|
25
|
+
const emit = (event) => {
|
|
26
|
+
for (const listener of listeners) {
|
|
27
|
+
listener(event);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const updateOwner = (nextOwner, reason) => {
|
|
31
|
+
if (owner === nextOwner) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const previousOwner = owner;
|
|
35
|
+
owner = nextOwner;
|
|
36
|
+
emit({
|
|
37
|
+
type: "owner-change",
|
|
38
|
+
owner: nextOwner,
|
|
39
|
+
previousOwner,
|
|
40
|
+
reason
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
const cancelNavigationTransaction = (navigationId, abortController) => {
|
|
44
|
+
if (navigationSequence !== navigationId || navigationAbortController !== abortController) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
navigationSequence += 1;
|
|
48
|
+
navigationAbortController = null;
|
|
49
|
+
abortController.abort();
|
|
50
|
+
};
|
|
51
|
+
const completeNavigationTransaction = (navigationId, abortController) => {
|
|
52
|
+
if (navigationSequence !== navigationId || navigationAbortController !== abortController) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
navigationAbortController = null;
|
|
56
|
+
};
|
|
57
|
+
const runtime = {
|
|
58
|
+
getOwnerState() {
|
|
59
|
+
const activeRuntime = registrations.get(owner);
|
|
60
|
+
return {
|
|
61
|
+
owner,
|
|
62
|
+
canHandleSpaNavigation: typeof activeRuntime?.navigate === "function"
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
hasPendingNavigationTransaction() {
|
|
66
|
+
return navigationAbortController !== null;
|
|
67
|
+
},
|
|
68
|
+
beginNavigationTransaction() {
|
|
69
|
+
navigationAbortController?.abort();
|
|
70
|
+
const abortController = new AbortController();
|
|
71
|
+
const navigationId = ++navigationSequence;
|
|
72
|
+
navigationAbortController = abortController;
|
|
73
|
+
return {
|
|
74
|
+
id: navigationId,
|
|
75
|
+
signal: abortController.signal,
|
|
76
|
+
isCurrent: () => navigationSequence === navigationId && navigationAbortController === abortController,
|
|
77
|
+
cancel: () => {
|
|
78
|
+
cancelNavigationTransaction(navigationId, abortController);
|
|
79
|
+
},
|
|
80
|
+
complete: () => {
|
|
81
|
+
completeNavigationTransaction(navigationId, abortController);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
cancelCurrentNavigationTransaction() {
|
|
86
|
+
if (!navigationAbortController) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
cancelNavigationTransaction(navigationSequence, navigationAbortController);
|
|
90
|
+
},
|
|
91
|
+
setOwner(nextOwner) {
|
|
92
|
+
updateOwner(nextOwner, "set");
|
|
93
|
+
},
|
|
94
|
+
claimOwnership(nextOwner) {
|
|
95
|
+
updateOwner(nextOwner, "claim");
|
|
96
|
+
},
|
|
97
|
+
releaseOwnership(currentOwner) {
|
|
98
|
+
if (owner !== currentOwner) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
updateOwner("none", "release");
|
|
102
|
+
},
|
|
103
|
+
resolveDocumentOwner(doc, fallbackOwner = "none") {
|
|
104
|
+
return getEcoDocumentOwner(doc) ?? fallbackOwner;
|
|
105
|
+
},
|
|
106
|
+
adoptDocumentOwner(doc, fallbackOwner = "none") {
|
|
107
|
+
const nextOwner = runtime.resolveDocumentOwner(doc, fallbackOwner);
|
|
108
|
+
updateOwner(nextOwner, "document");
|
|
109
|
+
return nextOwner;
|
|
110
|
+
},
|
|
111
|
+
isOwnedByAnotherRuntime(candidateOwner) {
|
|
112
|
+
return owner !== "none" && owner !== candidateOwner;
|
|
113
|
+
},
|
|
114
|
+
subscribe(listener) {
|
|
115
|
+
listeners.add(listener);
|
|
116
|
+
return () => {
|
|
117
|
+
listeners.delete(listener);
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
register(registration) {
|
|
121
|
+
registrations.set(registration.owner, registration);
|
|
122
|
+
emit({
|
|
123
|
+
type: "registration-change",
|
|
124
|
+
owner: registration.owner,
|
|
125
|
+
status: "registered"
|
|
126
|
+
});
|
|
127
|
+
return () => {
|
|
128
|
+
const currentRegistration = registrations.get(registration.owner);
|
|
129
|
+
if (currentRegistration !== registration) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
registrations.delete(registration.owner);
|
|
133
|
+
emit({
|
|
134
|
+
type: "registration-change",
|
|
135
|
+
owner: registration.owner,
|
|
136
|
+
status: "unregistered"
|
|
137
|
+
});
|
|
138
|
+
if (owner === registration.owner) {
|
|
139
|
+
updateOwner("none", "unregister");
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
async requestNavigation(request) {
|
|
144
|
+
for (const candidateOwner of getCandidateOwners(owner, registrations, request.source)) {
|
|
145
|
+
const registration = registrations.get(candidateOwner);
|
|
146
|
+
if (!registration?.navigate) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const handled = await registration.navigate(request);
|
|
150
|
+
if (handled !== false) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
},
|
|
156
|
+
async requestHandoff(request) {
|
|
157
|
+
if (request.targetOwner === "none") {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
if (request.isStaleSourceNavigation?.()) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
const registration = registrations.get(request.targetOwner);
|
|
164
|
+
if (!registration?.handoffNavigation) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
if (request.isStaleSourceNavigation?.()) {
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
const handled = await registration.handoffNavigation(request);
|
|
171
|
+
return handled !== false;
|
|
172
|
+
},
|
|
173
|
+
async reloadCurrentPage(request) {
|
|
174
|
+
for (const candidateOwner of getCandidateOwners(owner, registrations)) {
|
|
175
|
+
const registration = registrations.get(candidateOwner);
|
|
176
|
+
if (!registration?.reloadCurrentPage) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
await registration.reloadCurrentPage(request);
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
},
|
|
184
|
+
async cleanupOwner(targetOwner) {
|
|
185
|
+
if (targetOwner === "none") {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const registration = registrations.get(targetOwner);
|
|
189
|
+
if (!registration?.cleanupBeforeHandoff) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
await registration.cleanupBeforeHandoff();
|
|
193
|
+
if (owner === targetOwner) {
|
|
194
|
+
updateOwner("none", "release");
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
async cleanupCurrentOwner() {
|
|
198
|
+
await runtime.cleanupOwner(owner);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
return runtime;
|
|
202
|
+
}
|
|
203
|
+
function getEcoNavigationRuntime(windowObject = window) {
|
|
204
|
+
const runtimeWindow = windowObject;
|
|
205
|
+
runtimeWindow.__ECO_PAGES__ = runtimeWindow.__ECO_PAGES__ || {};
|
|
206
|
+
if (!runtimeWindow.__ECO_PAGES__.navigation) {
|
|
207
|
+
runtimeWindow.__ECO_PAGES__.navigation = createEcoNavigationRuntime();
|
|
208
|
+
}
|
|
209
|
+
return runtimeWindow.__ECO_PAGES__.navigation;
|
|
210
|
+
}
|
|
211
|
+
export {
|
|
212
|
+
ECO_DOCUMENT_OWNER_ATTRIBUTE,
|
|
213
|
+
getEcoDocumentOwner,
|
|
214
|
+
getEcoNavigationRuntime
|
|
215
|
+
};
|
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Core Services
|
|
2
|
+
|
|
3
|
+
This directory contains the app-owned service layer used by runtime startup, rendering, asset processing, browser bundling, and development invalidation.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Services in this directory exist to keep cross-cutting framework logic out of adapters, integrations, and processors.
|
|
8
|
+
|
|
9
|
+
Typical responsibilities include:
|
|
10
|
+
|
|
11
|
+
- server-module loading and transpilation
|
|
12
|
+
- browser bundle coordination
|
|
13
|
+
- asset processing and runtime asset declaration helpers
|
|
14
|
+
- server invalidation state and entrypoint dependency graphs
|
|
15
|
+
- HTML finalization and dependency injection
|
|
16
|
+
|
|
17
|
+
## Main Areas
|
|
18
|
+
|
|
19
|
+
- `module-loading/`: framework-owned config/app bootstrap loading and server-side source loading
|
|
20
|
+
- `assets/`: shared browser build coordination and processed asset pipelines
|
|
21
|
+
- `invalidation/`: file-change classification and invalidation policy
|
|
22
|
+
- `runtime-state/`: app-owned invalidation state and dependency graphs
|
|
23
|
+
- `runtime-manifest/`: node runtime manifest derivation and persistence
|
|
24
|
+
- `html/`: final HTML dependency injection and rewriter selection
|
|
25
|
+
|
|
26
|
+
## Design Rule
|
|
27
|
+
|
|
28
|
+
If a concern affects more than one integration or more than one runtime adapter, it usually belongs here instead of in a package-specific implementation.
|
|
@@ -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
|
+
};
|