@ecopages/core 0.2.0-alpha.3 → 0.2.0-alpha.31
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,43 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
3
|
+
import { getAppBrowserBuildPlugins, setupAppRuntimePlugins } from "../../build/build-adapter.js";
|
|
4
|
+
import { installAppRuntimeBuildExecutor } from "../../build/runtime-build-executor.js";
|
|
5
|
+
import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
|
|
6
|
+
import { ProjectWatcher } from "../../watchers/project-watcher.js";
|
|
7
|
+
function installSharedRuntimeBuildExecutor(appConfig, options) {
|
|
8
|
+
return installAppRuntimeBuildExecutor(appConfig, options);
|
|
9
|
+
}
|
|
10
|
+
function prepareSharedRuntimePublicDir(appConfig) {
|
|
11
|
+
const srcPublicDir = path.join(appConfig.rootDir, appConfig.srcDir, appConfig.publicDir);
|
|
12
|
+
if (fileSystem.exists(srcPublicDir)) {
|
|
13
|
+
fileSystem.copyDir(srcPublicDir, path.join(appConfig.rootDir, appConfig.distDir));
|
|
14
|
+
}
|
|
15
|
+
fileSystem.ensureDir(path.join(appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
|
|
16
|
+
}
|
|
17
|
+
async function initializeSharedRuntimePlugins(options) {
|
|
18
|
+
await setupAppRuntimePlugins(options);
|
|
19
|
+
}
|
|
20
|
+
async function startSharedProjectWatching(options) {
|
|
21
|
+
const watcher = new ProjectWatcher({
|
|
22
|
+
config: options.appConfig,
|
|
23
|
+
refreshRouterRoutesCallback: options.refreshRouterRoutesCallback,
|
|
24
|
+
hmrManager: options.hmrManager,
|
|
25
|
+
bridge: options.bridge
|
|
26
|
+
});
|
|
27
|
+
await watcher.createWatcherSubscription();
|
|
28
|
+
}
|
|
29
|
+
function bindSharedRuntimeHmrManager(appConfig, hmrManager) {
|
|
30
|
+
const browserBuildPlugins = getAppBrowserBuildPlugins(appConfig);
|
|
31
|
+
hmrManager.setPlugins(browserBuildPlugins);
|
|
32
|
+
for (const integration of appConfig.integrations) {
|
|
33
|
+
integration.setHmrManager(hmrManager);
|
|
34
|
+
}
|
|
35
|
+
return browserBuildPlugins;
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
bindSharedRuntimeHmrManager,
|
|
39
|
+
initializeSharedRuntimePlugins,
|
|
40
|
+
installSharedRuntimeBuildExecutor,
|
|
41
|
+
prepareSharedRuntimePublicDir,
|
|
42
|
+
startSharedProjectWatching
|
|
43
|
+
};
|
|
@@ -1,30 +1,47 @@
|
|
|
1
1
|
import { AbstractServerAdapter } from '../abstract/server-adapter.js';
|
|
2
2
|
import type { ServerAdapterOptions, ServerAdapterResult } from '../abstract/server-adapter.js';
|
|
3
3
|
import { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
|
|
4
|
-
import {
|
|
5
|
-
import { SchemaValidationService } from '../../services/schema-validation-service.js';
|
|
4
|
+
import { RouteRegistry } from '../../router/server/route-registry.js';
|
|
5
|
+
import { SchemaValidationService } from '../../services/validation/schema-validation-service.js';
|
|
6
6
|
import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
|
|
7
7
|
import { ServerStaticBuilder } from './server-static-builder.js';
|
|
8
8
|
import { FileSystemResponseMatcher } from './fs-server-response-matcher.js';
|
|
9
9
|
import { ServerRouteHandler } from './server-route-handler.js';
|
|
10
|
-
import type { ApiHandler, CacheInvalidator, ErrorHandler, RenderContext, StaticRoute } from '../../public-types.js';
|
|
10
|
+
import type { ApiHandler, CacheInvalidator, ErrorHandler, RenderContext, StaticRoute } from '../../types/public-types.js';
|
|
11
|
+
type SharedRequestContext = {
|
|
12
|
+
apiHandlers: ApiHandler[];
|
|
13
|
+
errorHandler?: ErrorHandler;
|
|
14
|
+
serverInstance?: any;
|
|
15
|
+
hmrManager?: any;
|
|
16
|
+
};
|
|
11
17
|
export declare abstract class SharedServerAdapter<TOptions extends ServerAdapterOptions, TResult extends ServerAdapterResult> extends AbstractServerAdapter<TOptions, TResult> {
|
|
12
|
-
protected router:
|
|
18
|
+
protected router: RouteRegistry;
|
|
13
19
|
protected fileSystemResponseMatcher: FileSystemResponseMatcher;
|
|
14
20
|
protected routeRendererFactory: RouteRendererFactory;
|
|
15
21
|
protected routeHandler: ServerRouteHandler;
|
|
16
22
|
protected staticSiteGenerator: StaticSiteGenerator;
|
|
17
23
|
protected staticBuilder: ServerStaticBuilder;
|
|
18
24
|
protected readonly schemaValidator: SchemaValidationService;
|
|
25
|
+
protected initializeSharedRouteHandling(options: {
|
|
26
|
+
staticRoutes: StaticRoute[];
|
|
27
|
+
hmrManager?: any;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
protected createSharedWatchRefreshCallback(options: {
|
|
30
|
+
staticRoutes: StaticRoute[];
|
|
31
|
+
hmrManager?: any;
|
|
32
|
+
onRoutesReady?: () => Promise<void> | void;
|
|
33
|
+
onError?: (error: Error) => Promise<void> | void;
|
|
34
|
+
}): () => Promise<void>;
|
|
19
35
|
/**
|
|
20
|
-
* Scans the filesystem and dynamically constructs the
|
|
36
|
+
* Scans the filesystem and dynamically constructs the Route Registry.
|
|
21
37
|
*
|
|
22
38
|
* This process runs identically across both Bun and Node wrappers. It analyzes the configured pages
|
|
23
39
|
* directory, building a map of all available UI routes and API endpoints.
|
|
24
|
-
* The resulting `
|
|
40
|
+
* The resulting `RouteRegistry` instance becomes the central nervous system for mapping WinterCG incoming
|
|
25
41
|
* Web Requests (`Request`) to their corresponding internal execution paths.
|
|
26
42
|
*/
|
|
27
43
|
protected initSharedRouter(): Promise<void>;
|
|
44
|
+
private createRouteRegistryPageModuleAdapter;
|
|
28
45
|
/**
|
|
29
46
|
* Sets up the unified rendering pipeline and response matching chain.
|
|
30
47
|
*
|
|
@@ -40,6 +57,8 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
|
|
|
40
57
|
* @param hmrManager - The runtime-specific Hot Module Replacement orchestrator (if watching).
|
|
41
58
|
*/
|
|
42
59
|
protected configureSharedResponseHandlers(staticRoutes: StaticRoute[], hmrManager?: any): void;
|
|
60
|
+
private createSharedResponseHandlerDependencies;
|
|
61
|
+
private createSharedPageCacheService;
|
|
43
62
|
protected getCacheService(): CacheInvalidator | null;
|
|
44
63
|
protected getRenderContext(): RenderContext;
|
|
45
64
|
/**
|
|
@@ -60,6 +79,10 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
|
|
|
60
79
|
* @returns The resulting Web standard `Response` constructed by the user's handler.
|
|
61
80
|
*/
|
|
62
81
|
protected executeApiHandler(request: Request, params: Record<string, string | string[]>, routeConfig: ApiHandler, serverInstance: any, errorHandler?: ErrorHandler): Promise<Response>;
|
|
82
|
+
private createApiHandlerContext;
|
|
83
|
+
private normalizeApiParams;
|
|
84
|
+
private applyApiRequestSchema;
|
|
85
|
+
private runApiMiddlewareChain;
|
|
63
86
|
private normalizePath;
|
|
64
87
|
private matchApiPath;
|
|
65
88
|
private getApiPathScore;
|
|
@@ -67,6 +90,8 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
|
|
|
67
90
|
routeConfig: ApiHandler;
|
|
68
91
|
params: Record<string, string | string[]>;
|
|
69
92
|
} | null;
|
|
93
|
+
private tryHandleSharedHmrRequest;
|
|
94
|
+
private tryHandleSharedApiRequest;
|
|
70
95
|
/**
|
|
71
96
|
* Universally processes an incoming WinterCG Web standard Request.
|
|
72
97
|
*
|
|
@@ -78,10 +103,6 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
|
|
|
78
103
|
* Both Bun and Node bindings fall back to this exact function once they have mapped their
|
|
79
104
|
* native HTTP objects into Web Standard Requests.
|
|
80
105
|
*/
|
|
81
|
-
handleSharedRequest(request: Request, context:
|
|
82
|
-
apiHandlers: ApiHandler[];
|
|
83
|
-
errorHandler?: ErrorHandler;
|
|
84
|
-
serverInstance?: any;
|
|
85
|
-
hmrManager?: any;
|
|
86
|
-
}): Promise<Response>;
|
|
106
|
+
handleSharedRequest(request: Request, context: SharedRequestContext): Promise<Response>;
|
|
87
107
|
}
|
|
108
|
+
export {};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { AbstractServerAdapter } from "../abstract/server-adapter.js";
|
|
3
3
|
import { RouteRendererFactory } from "../../route-renderer/route-renderer.js";
|
|
4
|
-
import {
|
|
5
|
-
import { FSRouterScanner } from "../../router/fs-router-scanner.js";
|
|
4
|
+
import { RouteRegistry } from "../../router/server/route-registry.js";
|
|
6
5
|
import { MemoryCacheStore } from "../../services/cache/memory-cache-store.js";
|
|
7
6
|
import { PageCacheService } from "../../services/cache/page-cache-service.js";
|
|
8
|
-
import { SchemaValidationService } from "../../services/schema-validation-service.js";
|
|
7
|
+
import { SchemaValidationService } from "../../services/validation/schema-validation-service.js";
|
|
9
8
|
import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
|
|
10
9
|
import { ServerStaticBuilder } from "./server-static-builder.js";
|
|
11
10
|
import { ExplicitStaticRouteMatcher } from "./explicit-static-route-matcher.js";
|
|
@@ -17,6 +16,9 @@ import { createRequire } from "../../utils/locals-utils.js";
|
|
|
17
16
|
import { HttpError } from "../../errors/http-error.js";
|
|
18
17
|
import { ApiResponseBuilder } from "./api-response.js";
|
|
19
18
|
import { appLogger } from "../../global/app-logger.js";
|
|
19
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
20
|
+
import { getAppServerModuleTranspiler } from "../../services/module-loading/app-server-module-transpiler.service.js";
|
|
21
|
+
import { resolveInternalExecutionDir } from "../../utils/resolve-work-dir.js";
|
|
20
22
|
class SharedServerAdapter extends AbstractServerAdapter {
|
|
21
23
|
router;
|
|
22
24
|
fileSystemResponseMatcher;
|
|
@@ -25,31 +27,67 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
25
27
|
staticSiteGenerator;
|
|
26
28
|
staticBuilder;
|
|
27
29
|
schemaValidator = new SchemaValidationService();
|
|
30
|
+
async initializeSharedRouteHandling(options) {
|
|
31
|
+
await this.initSharedRouter();
|
|
32
|
+
this.configureSharedResponseHandlers(options.staticRoutes, options.hmrManager);
|
|
33
|
+
}
|
|
34
|
+
createSharedWatchRefreshCallback(options) {
|
|
35
|
+
return async () => {
|
|
36
|
+
try {
|
|
37
|
+
await this.initializeSharedRouteHandling({
|
|
38
|
+
staticRoutes: options.staticRoutes,
|
|
39
|
+
hmrManager: options.hmrManager
|
|
40
|
+
});
|
|
41
|
+
if (options.onRoutesReady) {
|
|
42
|
+
await options.onRoutesReady();
|
|
43
|
+
}
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (options.onError) {
|
|
46
|
+
await options.onError(error instanceof Error ? error : new Error(String(error)));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
28
53
|
/**
|
|
29
|
-
* Scans the filesystem and dynamically constructs the
|
|
54
|
+
* Scans the filesystem and dynamically constructs the Route Registry.
|
|
30
55
|
*
|
|
31
56
|
* This process runs identically across both Bun and Node wrappers. It analyzes the configured pages
|
|
32
57
|
* directory, building a map of all available UI routes and API endpoints.
|
|
33
|
-
* The resulting `
|
|
58
|
+
* The resulting `RouteRegistry` instance becomes the central nervous system for mapping WinterCG incoming
|
|
34
59
|
* Web Requests (`Request`) to their corresponding internal execution paths.
|
|
35
60
|
*/
|
|
36
61
|
async initSharedRouter() {
|
|
37
|
-
|
|
38
|
-
|
|
62
|
+
this.router = new RouteRegistry({
|
|
63
|
+
pagesDir: path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.pagesDir),
|
|
39
64
|
appConfig: this.appConfig,
|
|
40
65
|
origin: this.runtimeOrigin,
|
|
41
66
|
templatesExt: this.appConfig.templatesExt,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
this.router = new FSRouter({
|
|
47
|
-
origin: this.runtimeOrigin,
|
|
48
|
-
assetPrefix: path.join(this.appConfig.rootDir, this.appConfig.distDir),
|
|
49
|
-
scanner
|
|
67
|
+
buildMode: !this.options?.watch,
|
|
68
|
+
pageModuleAdapter: this.createRouteRegistryPageModuleAdapter()
|
|
50
69
|
});
|
|
51
70
|
await this.router.init();
|
|
52
71
|
}
|
|
72
|
+
createRouteRegistryPageModuleAdapter() {
|
|
73
|
+
const serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
|
|
74
|
+
return {
|
|
75
|
+
loadPageModule: async (filePath) => {
|
|
76
|
+
const module = await serverModuleTranspiler.importModule({
|
|
77
|
+
filePath,
|
|
78
|
+
outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-route-modules"),
|
|
79
|
+
externalPackages: false,
|
|
80
|
+
transpileErrorMessage: (details) => `Error transpiling route module: ${details}`,
|
|
81
|
+
noOutputMessage: (targetFilePath) => `No transpiled output generated for route module: ${targetFilePath}`
|
|
82
|
+
});
|
|
83
|
+
const page = module.default;
|
|
84
|
+
return {
|
|
85
|
+
staticPaths: page?.staticPaths ?? module.getStaticPaths,
|
|
86
|
+
staticProps: page?.staticProps ?? module.getStaticProps
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
53
91
|
/**
|
|
54
92
|
* Sets up the unified rendering pipeline and response matching chain.
|
|
55
93
|
*
|
|
@@ -67,47 +105,62 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
67
105
|
configureSharedResponseHandlers(staticRoutes, hmrManager) {
|
|
68
106
|
this.routeRendererFactory = new RouteRendererFactory({
|
|
69
107
|
appConfig: this.appConfig,
|
|
108
|
+
rendererModules: this.appConfig.runtime?.rendererModuleContext,
|
|
70
109
|
runtimeOrigin: this.runtimeOrigin
|
|
71
110
|
});
|
|
111
|
+
const { fileSystemResponseMatcher, explicitStaticRouteMatcher } = this.createSharedResponseHandlerDependencies(staticRoutes);
|
|
112
|
+
this.fileSystemResponseMatcher = fileSystemResponseMatcher;
|
|
113
|
+
this.routeHandler = new ServerRouteHandler({
|
|
114
|
+
router: this.router,
|
|
115
|
+
fileSystemResponseMatcher: this.fileSystemResponseMatcher,
|
|
116
|
+
explicitStaticRouteMatcher,
|
|
117
|
+
watch: !!this.options?.watch,
|
|
118
|
+
hmrManager
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
createSharedResponseHandlerDependencies(staticRoutes) {
|
|
72
122
|
const fileSystemResponseFactory = new FileSystemServerResponseFactory({
|
|
73
|
-
appConfig: this.appConfig,
|
|
74
|
-
routeRendererFactory: this.routeRendererFactory,
|
|
75
123
|
options: {
|
|
76
124
|
watchMode: !!this.options?.watch
|
|
77
125
|
}
|
|
78
126
|
});
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const store = cacheConfig?.store === "memory" || !cacheConfig?.store ? new MemoryCacheStore({ maxEntries: cacheConfig?.maxEntries }) : cacheConfig.store;
|
|
84
|
-
cacheService = new PageCacheService({ store, enabled: true });
|
|
85
|
-
}
|
|
86
|
-
this.fileSystemResponseMatcher = new FileSystemResponseMatcher({
|
|
127
|
+
const cacheService = this.createSharedPageCacheService();
|
|
128
|
+
const fileSystemResponseMatcher = new FileSystemResponseMatcher({
|
|
129
|
+
appConfig: this.appConfig,
|
|
130
|
+
assetPrefix: path.join(this.appConfig.rootDir, this.appConfig.distDir),
|
|
87
131
|
router: this.router,
|
|
88
132
|
routeRendererFactory: this.routeRendererFactory,
|
|
89
133
|
fileSystemResponseFactory,
|
|
90
134
|
cacheService,
|
|
91
|
-
defaultCacheStrategy:
|
|
92
|
-
});
|
|
93
|
-
const explicitStaticRouteMatcher = staticRoutes.length > 0 ? new ExplicitStaticRouteMatcher({
|
|
94
|
-
appConfig: this.appConfig,
|
|
95
|
-
routeRendererFactory: this.routeRendererFactory,
|
|
96
|
-
staticRoutes
|
|
97
|
-
}) : void 0;
|
|
98
|
-
this.routeHandler = new ServerRouteHandler({
|
|
99
|
-
router: this.router,
|
|
100
|
-
fileSystemResponseMatcher: this.fileSystemResponseMatcher,
|
|
101
|
-
explicitStaticRouteMatcher,
|
|
102
|
-
watch: !!this.options?.watch,
|
|
103
|
-
hmrManager
|
|
135
|
+
defaultCacheStrategy: this.appConfig.cache?.defaultStrategy ?? "static"
|
|
104
136
|
});
|
|
137
|
+
return {
|
|
138
|
+
cacheService,
|
|
139
|
+
fileSystemResponseMatcher,
|
|
140
|
+
explicitStaticRouteMatcher: staticRoutes.length > 0 ? new ExplicitStaticRouteMatcher({
|
|
141
|
+
appConfig: this.appConfig,
|
|
142
|
+
routeRendererFactory: this.routeRendererFactory,
|
|
143
|
+
staticRoutes
|
|
144
|
+
}) : void 0
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
createSharedPageCacheService() {
|
|
148
|
+
const cacheConfig = this.appConfig.cache;
|
|
149
|
+
const isCacheEnabled = cacheConfig?.enabled ?? !this.options?.watch;
|
|
150
|
+
if (!isCacheEnabled) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const store = cacheConfig?.store === "memory" || !cacheConfig?.store ? new MemoryCacheStore({ maxEntries: cacheConfig?.maxEntries }) : cacheConfig.store;
|
|
154
|
+
return new PageCacheService({ store, enabled: true });
|
|
105
155
|
}
|
|
106
156
|
getCacheService() {
|
|
107
157
|
return this.fileSystemResponseMatcher?.getCacheService() ?? null;
|
|
108
158
|
}
|
|
109
159
|
getRenderContext() {
|
|
110
|
-
return createRenderContext({
|
|
160
|
+
return createRenderContext({
|
|
161
|
+
integrations: this.appConfig.integrations,
|
|
162
|
+
rendererModules: this.appConfig.runtime?.rendererModuleContext
|
|
163
|
+
});
|
|
111
164
|
}
|
|
112
165
|
/**
|
|
113
166
|
* Executes an Application Programming Interface (API) handler in an environment-agnostic manner.
|
|
@@ -129,87 +182,18 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
129
182
|
async executeApiHandler(request, params, routeConfig, serverInstance, errorHandler) {
|
|
130
183
|
let context;
|
|
131
184
|
try {
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join("/") : value])
|
|
137
|
-
);
|
|
138
|
-
context = {
|
|
139
|
-
request,
|
|
140
|
-
params: normalizedParams,
|
|
141
|
-
response: new ApiResponseBuilder(),
|
|
142
|
-
server: serverInstance,
|
|
143
|
-
locals,
|
|
144
|
-
require: createRequire(() => locals),
|
|
145
|
-
services: {
|
|
146
|
-
cache: this.getCacheService()
|
|
147
|
-
},
|
|
148
|
-
...this.getRenderContext()
|
|
149
|
-
};
|
|
150
|
-
if (schema) {
|
|
151
|
-
const url = new URL(request.url);
|
|
152
|
-
const queryParams = Object.fromEntries(url.searchParams);
|
|
153
|
-
const headers = Object.fromEntries(request.headers);
|
|
154
|
-
let body;
|
|
155
|
-
if (schema.body) {
|
|
156
|
-
try {
|
|
157
|
-
const contentType = request.headers.get("Content-Type") || "";
|
|
158
|
-
if (contentType.includes("application/json")) body = await request.clone().json();
|
|
159
|
-
else if (contentType.includes("text/plain")) body = await request.clone().text();
|
|
160
|
-
} catch {
|
|
161
|
-
return context.response.status(400).json({ error: "Invalid request body" });
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
const validationResult = await this.schemaValidator.validateRequest(
|
|
165
|
-
{ body, query: queryParams, headers, params: normalizedParams },
|
|
166
|
-
schema
|
|
167
|
-
);
|
|
168
|
-
if (!validationResult.success) {
|
|
169
|
-
return context.response.status(400).json({
|
|
170
|
-
error: "Validation failed",
|
|
171
|
-
issues: validationResult.errors
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
const validated = validationResult.data;
|
|
175
|
-
if (validated.body !== void 0) context.body = validated.body;
|
|
176
|
-
if (validated.query !== void 0) context.query = validated.query;
|
|
177
|
-
if (validated.headers !== void 0) context.headers = validated.headers;
|
|
178
|
-
if (validated.params !== void 0) context.params = validated.params;
|
|
179
|
-
}
|
|
180
|
-
if (middleware.length === 0) {
|
|
181
|
-
return await routeConfig.handler(context);
|
|
185
|
+
context = this.createApiHandlerContext(request, params, serverInstance);
|
|
186
|
+
const schemaResponse = await this.applyApiRequestSchema(context, routeConfig.schema);
|
|
187
|
+
if (schemaResponse) {
|
|
188
|
+
return schemaResponse;
|
|
182
189
|
}
|
|
183
|
-
|
|
184
|
-
const executeNext = async () => {
|
|
185
|
-
if (index < middleware.length) {
|
|
186
|
-
const currentMiddleware = middleware[index++];
|
|
187
|
-
return await currentMiddleware(context, executeNext);
|
|
188
|
-
}
|
|
189
|
-
return await routeConfig.handler(context);
|
|
190
|
-
};
|
|
191
|
-
return await executeNext();
|
|
190
|
+
return await this.runApiMiddlewareChain(context, routeConfig);
|
|
192
191
|
} catch (error) {
|
|
193
192
|
if (error instanceof Response) return error;
|
|
194
193
|
if (errorHandler) {
|
|
195
194
|
try {
|
|
196
195
|
if (!context) {
|
|
197
|
-
|
|
198
|
-
context = {
|
|
199
|
-
request,
|
|
200
|
-
params: Object.fromEntries(
|
|
201
|
-
Object.entries(params).map(([key, value]) => [
|
|
202
|
-
key,
|
|
203
|
-
Array.isArray(value) ? value.join("/") : value
|
|
204
|
-
])
|
|
205
|
-
),
|
|
206
|
-
response: new ApiResponseBuilder(),
|
|
207
|
-
server: serverInstance,
|
|
208
|
-
locals,
|
|
209
|
-
require: createRequire(() => locals),
|
|
210
|
-
services: { cache: this.getCacheService() },
|
|
211
|
-
...this.getRenderContext()
|
|
212
|
-
};
|
|
196
|
+
context = this.createApiHandlerContext(request, params, serverInstance);
|
|
213
197
|
}
|
|
214
198
|
return await errorHandler(error, context);
|
|
215
199
|
} catch (handlerError) {
|
|
@@ -221,6 +205,76 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
221
205
|
return new Response("Internal Server Error", { status: 500 });
|
|
222
206
|
}
|
|
223
207
|
}
|
|
208
|
+
createApiHandlerContext(request, params, serverInstance) {
|
|
209
|
+
const locals = {};
|
|
210
|
+
const normalizedParams = this.normalizeApiParams(params);
|
|
211
|
+
return {
|
|
212
|
+
request,
|
|
213
|
+
params: normalizedParams,
|
|
214
|
+
response: new ApiResponseBuilder(),
|
|
215
|
+
server: serverInstance,
|
|
216
|
+
locals,
|
|
217
|
+
require: createRequire(() => locals),
|
|
218
|
+
services: {
|
|
219
|
+
cache: this.getCacheService()
|
|
220
|
+
},
|
|
221
|
+
...this.getRenderContext()
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
normalizeApiParams(params) {
|
|
225
|
+
return Object.fromEntries(
|
|
226
|
+
Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join("/") : value])
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
async applyApiRequestSchema(context, schema) {
|
|
230
|
+
if (!schema) {
|
|
231
|
+
return void 0;
|
|
232
|
+
}
|
|
233
|
+
const url = new URL(context.request.url);
|
|
234
|
+
const queryParams = Object.fromEntries(url.searchParams);
|
|
235
|
+
const headers = Object.fromEntries(context.request.headers);
|
|
236
|
+
let body;
|
|
237
|
+
if (schema.body) {
|
|
238
|
+
try {
|
|
239
|
+
const contentType = context.request.headers.get("Content-Type") || "";
|
|
240
|
+
if (contentType.includes("application/json")) body = await context.request.clone().json();
|
|
241
|
+
else if (contentType.includes("text/plain")) body = await context.request.clone().text();
|
|
242
|
+
} catch {
|
|
243
|
+
return context.response.status(400).json({ error: "Invalid request body" });
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const validationResult = await this.schemaValidator.validateRequest(
|
|
247
|
+
{ body, query: queryParams, headers, params: context.params },
|
|
248
|
+
schema
|
|
249
|
+
);
|
|
250
|
+
if (!validationResult.success) {
|
|
251
|
+
return context.response.status(400).json({
|
|
252
|
+
error: "Validation failed",
|
|
253
|
+
issues: validationResult.errors
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
const validated = validationResult.data;
|
|
257
|
+
if (validated.body !== void 0) context.body = validated.body;
|
|
258
|
+
if (validated.query !== void 0) context.query = validated.query;
|
|
259
|
+
if (validated.headers !== void 0) context.headers = validated.headers;
|
|
260
|
+
if (validated.params !== void 0) context.params = validated.params;
|
|
261
|
+
return void 0;
|
|
262
|
+
}
|
|
263
|
+
async runApiMiddlewareChain(context, routeConfig) {
|
|
264
|
+
const middleware = routeConfig.middleware || [];
|
|
265
|
+
if (middleware.length === 0) {
|
|
266
|
+
return await routeConfig.handler(context);
|
|
267
|
+
}
|
|
268
|
+
let index = 0;
|
|
269
|
+
const executeNext = async () => {
|
|
270
|
+
if (index < middleware.length) {
|
|
271
|
+
const currentMiddleware = middleware[index++];
|
|
272
|
+
return await currentMiddleware(context, executeNext);
|
|
273
|
+
}
|
|
274
|
+
return await routeConfig.handler(context);
|
|
275
|
+
};
|
|
276
|
+
return await executeNext();
|
|
277
|
+
}
|
|
224
278
|
normalizePath(pathname) {
|
|
225
279
|
if (pathname.length > 1 && pathname.endsWith("/")) {
|
|
226
280
|
return pathname.slice(0, -1);
|
|
@@ -313,6 +367,40 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
313
367
|
}
|
|
314
368
|
return null;
|
|
315
369
|
}
|
|
370
|
+
tryHandleSharedHmrRequest(request, context) {
|
|
371
|
+
const url = new URL(request.url);
|
|
372
|
+
if (url.pathname === "/_hmr_runtime.js" && context.hmrManager) {
|
|
373
|
+
const runtimePath = context.hmrManager.getRuntimePath();
|
|
374
|
+
if (fileSystem.exists(runtimePath)) {
|
|
375
|
+
return new Response(fileSystem.readFileAsBuffer(runtimePath), {
|
|
376
|
+
headers: { "Content-Type": "application/javascript" }
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (url.pathname.startsWith("/assets/_hmr/") && context.hmrManager) {
|
|
381
|
+
const relativePath = url.pathname.slice("/assets/_hmr/".length);
|
|
382
|
+
const assetPath = path.join(context.hmrManager.getDistDir(), relativePath);
|
|
383
|
+
if (fileSystem.exists(assetPath)) {
|
|
384
|
+
return new Response(fileSystem.readFileAsBuffer(assetPath), {
|
|
385
|
+
headers: { "Content-Type": "application/javascript" }
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
async tryHandleSharedApiRequest(request, context) {
|
|
392
|
+
const apiMatch = this.matchApiHandler(request, context.apiHandlers);
|
|
393
|
+
if (!apiMatch) {
|
|
394
|
+
return null;
|
|
395
|
+
}
|
|
396
|
+
return await this.executeApiHandler(
|
|
397
|
+
request,
|
|
398
|
+
apiMatch.params,
|
|
399
|
+
apiMatch.routeConfig,
|
|
400
|
+
context.serverInstance,
|
|
401
|
+
context.errorHandler
|
|
402
|
+
);
|
|
403
|
+
}
|
|
316
404
|
/**
|
|
317
405
|
* Universally processes an incoming WinterCG Web standard Request.
|
|
318
406
|
*
|
|
@@ -325,25 +413,13 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
325
413
|
* native HTTP objects into Web Standard Requests.
|
|
326
414
|
*/
|
|
327
415
|
async handleSharedRequest(request, context) {
|
|
328
|
-
const
|
|
329
|
-
if (
|
|
330
|
-
|
|
331
|
-
const fileSystem = (await import("@ecopages/file-system")).fileSystem;
|
|
332
|
-
if (fileSystem.exists(runtimePath)) {
|
|
333
|
-
return new Response(fileSystem.readFileAsBuffer(runtimePath), {
|
|
334
|
-
headers: { "Content-Type": "application/javascript" }
|
|
335
|
-
});
|
|
336
|
-
}
|
|
416
|
+
const hmrResponse = this.tryHandleSharedHmrRequest(request, context);
|
|
417
|
+
if (hmrResponse) {
|
|
418
|
+
return hmrResponse;
|
|
337
419
|
}
|
|
338
|
-
const
|
|
339
|
-
if (
|
|
340
|
-
return
|
|
341
|
-
request,
|
|
342
|
-
apiMatch.params,
|
|
343
|
-
apiMatch.routeConfig,
|
|
344
|
-
context.serverInstance,
|
|
345
|
-
context.errorHandler
|
|
346
|
-
);
|
|
420
|
+
const apiResponse = await this.tryHandleSharedApiRequest(request, context);
|
|
421
|
+
if (apiResponse) {
|
|
422
|
+
return apiResponse;
|
|
347
423
|
}
|
|
348
424
|
return this.routeHandler.handleResponse(request);
|
|
349
425
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { IHmrManager } from '../../public-types';
|
|
2
|
-
import type {
|
|
3
|
-
import type { ExplicitStaticRouteMatcher } from './explicit-static-route-matcher';
|
|
4
|
-
import type { FileSystemResponseMatcher } from './fs-server-response-matcher';
|
|
1
|
+
import type { IHmrManager } from '../../types/public-types.js';
|
|
2
|
+
import type { RouteRegistry } from '../../router/server/route-registry.js';
|
|
3
|
+
import type { ExplicitStaticRouteMatcher } from './explicit-static-route-matcher.js';
|
|
4
|
+
import type { FileSystemResponseMatcher } from './fs-server-response-matcher.js';
|
|
5
5
|
/**
|
|
6
6
|
* Configuration parameters for ServerRouteHandler.
|
|
7
7
|
*/
|
|
8
8
|
export interface ServerRouteHandlerParams {
|
|
9
9
|
/** File system router for matching request URLs to route handlers. */
|
|
10
|
-
router:
|
|
10
|
+
router: RouteRegistry;
|
|
11
11
|
/** Matcher for handling file system route responses. */
|
|
12
12
|
fileSystemResponseMatcher: FileSystemResponseMatcher;
|
|
13
13
|
/** Optional matcher for explicit static routes like processed images or sitemaps. */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { appLogger } from "../../global/app-logger";
|
|
2
|
-
import { HttpError } from "../../errors/http-error";
|
|
1
|
+
import { appLogger } from "../../global/app-logger.js";
|
|
2
|
+
import { HttpError } from "../../errors/http-error.js";
|
|
3
|
+
import { injectHmrRuntimeIntoHtmlResponse, isHtmlResponse, shouldInjectHmrHtmlResponse } from "./hmr-html-response.js";
|
|
3
4
|
class ServerRouteHandler {
|
|
4
5
|
router;
|
|
5
6
|
fileSystemResponseMatcher;
|
|
@@ -30,7 +31,7 @@ class ServerRouteHandler {
|
|
|
30
31
|
* @returns true if in watch mode and HMR manager is enabled
|
|
31
32
|
*/
|
|
32
33
|
shouldInjectHmrScript() {
|
|
33
|
-
return this.watch
|
|
34
|
+
return shouldInjectHmrHtmlResponse(this.watch, this.hmrManager);
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* Checks if a response contains HTML content.
|
|
@@ -39,8 +40,7 @@ class ServerRouteHandler {
|
|
|
39
40
|
* @returns true if Content-Type header starts with 'text/html'
|
|
40
41
|
*/
|
|
41
42
|
isHtmlResponse(response) {
|
|
42
|
-
|
|
43
|
-
return contentType !== null && contentType.startsWith("text/html");
|
|
43
|
+
return isHtmlResponse(response);
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* Handles HTTP requests from the router adapter.
|
|
@@ -60,7 +60,7 @@ class ServerRouteHandler {
|
|
|
60
60
|
const response2 = await this.explicitStaticRouteMatcher.handleMatch(explicitMatch);
|
|
61
61
|
return this.maybeInjectHmrScript(response2);
|
|
62
62
|
}
|
|
63
|
-
const fsMatch = !pathname.includes(".") && this.router.
|
|
63
|
+
const fsMatch = !pathname.includes(".") && this.router.matchRequest(request.url);
|
|
64
64
|
const response = await (fsMatch ? this.fileSystemResponseMatcher.handleMatch(fsMatch, request) : this.handleNoMatch(request));
|
|
65
65
|
return this.maybeInjectHmrScript(response);
|
|
66
66
|
}
|
|
@@ -75,16 +75,7 @@ class ServerRouteHandler {
|
|
|
75
75
|
*/
|
|
76
76
|
async maybeInjectHmrScript(response) {
|
|
77
77
|
if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
|
|
78
|
-
|
|
79
|
-
const hmrScript = `<script type="module">import '/_hmr_runtime.js';<\/script>`;
|
|
80
|
-
const updatedHtml = html.replace(/<\/html>/i, `${hmrScript}</html>`);
|
|
81
|
-
const headers = new Headers(response.headers);
|
|
82
|
-
headers.delete("Content-Length");
|
|
83
|
-
return new Response(updatedHtml, {
|
|
84
|
-
status: response.status,
|
|
85
|
-
statusText: response.statusText,
|
|
86
|
-
headers
|
|
87
|
-
});
|
|
78
|
+
return injectHmrRuntimeIntoHtmlResponse(response);
|
|
88
79
|
}
|
|
89
80
|
return response;
|
|
90
81
|
}
|