@ecopages/core 0.2.0-alpha.52 → 0.2.0-alpha.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/package.json +97 -182
- package/src/adapters/abstract/application-adapter.test.ts +218 -0
- package/src/adapters/abstract/application-adapter.ts +379 -0
- package/src/adapters/abstract/router-adapter.ts +30 -0
- package/src/adapters/abstract/server-adapter.ts +79 -0
- package/src/adapters/bun/client-bridge.ts +62 -0
- package/src/adapters/bun/create-app.ts +214 -0
- package/src/adapters/bun/hmr-manager.test.ts +265 -0
- package/src/adapters/bun/hmr-manager.ts +88 -0
- package/src/adapters/bun/index.ts +2 -0
- package/src/adapters/bun/runtime-host.ts +76 -0
- package/src/adapters/bun/server-adapter.ts +605 -0
- package/src/adapters/bun/static-preview-host.ts +70 -0
- package/src/adapters/create-app.test.ts +10 -0
- package/src/adapters/create-app.ts +91 -0
- package/src/adapters/index.ts +2 -0
- package/src/adapters/node/create-app.test.ts +76 -0
- package/src/adapters/node/create-app.ts +116 -0
- package/src/adapters/node/http-request-bridge.test.ts +146 -0
- package/src/adapters/node/http-request-bridge.ts +176 -0
- package/src/adapters/node/node-client-bridge.test.ts +198 -0
- package/src/adapters/node/node-client-bridge.ts +79 -0
- package/src/adapters/node/node-hmr-manager.test.ts +374 -0
- package/src/adapters/node/node-hmr-manager.ts +72 -0
- package/src/adapters/node/runtime-host.test.ts +49 -0
- package/src/adapters/node/runtime-host.ts +113 -0
- package/src/adapters/node/server-adapter-dependencies.ts +28 -0
- package/src/adapters/node/server-adapter.test.ts +84 -0
- package/src/adapters/node/server-adapter.ts +423 -0
- package/src/adapters/node/static-content-server.test.ts +60 -0
- package/src/adapters/node/static-content-server.ts +239 -0
- package/src/adapters/node/static-preview-host.test.ts +89 -0
- package/src/adapters/node/static-preview-host.ts +101 -0
- package/src/adapters/shared/api-response.test.ts +97 -0
- package/src/adapters/shared/api-response.ts +104 -0
- package/src/adapters/shared/application-adapter.ts +199 -0
- package/src/adapters/shared/define-api-handler.ts +66 -0
- package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
- package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
- package/src/adapters/shared/explicit-static-route-matcher.ts +131 -0
- package/src/adapters/shared/file-route-middleware-pipeline.test.ts +85 -0
- package/src/adapters/shared/file-route-middleware-pipeline.ts +118 -0
- package/src/adapters/shared/fs-server-response-factory.test.ts +176 -0
- package/src/adapters/shared/fs-server-response-factory.ts +96 -0
- package/src/adapters/shared/fs-server-response-matcher.test.ts +311 -0
- package/src/adapters/shared/fs-server-response-matcher.ts +240 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
- package/src/adapters/shared/hmr-html-response.ts +54 -0
- package/src/adapters/shared/hmr-manager.contract.test.ts +228 -0
- package/src/adapters/shared/hmr-manager.dispatch.test.ts +229 -0
- package/src/adapters/shared/render-context.test.ts +244 -0
- package/src/adapters/shared/render-context.ts +161 -0
- package/src/adapters/shared/runtime-app-bootstrap.test.ts +96 -0
- package/src/adapters/shared/runtime-app-bootstrap.ts +72 -0
- package/src/adapters/shared/runtime-host.ts +11 -0
- package/src/adapters/shared/server-adapter.test.ts +130 -0
- package/src/adapters/shared/server-adapter.ts +571 -0
- package/src/adapters/shared/server-route-handler.test.ts +112 -0
- package/src/adapters/shared/server-route-handler.ts +153 -0
- package/src/adapters/shared/server-static-builder.test.ts +338 -0
- package/src/adapters/shared/server-static-builder.ts +170 -0
- package/src/adapters/shared/shared-hmr-manager.ts +298 -0
- package/src/adapters/shared/static-preview-host.ts +12 -0
- package/src/build/README.md +57 -73
- package/src/build/browser-runtime-manifest.test.ts +121 -0
- package/src/build/browser-runtime-manifest.ts +105 -0
- package/src/build/browser-runtime-plugin-helpers.test.ts +49 -0
- package/src/build/browser-runtime-plugin-helpers.ts +37 -0
- package/src/build/browser-runtime-plugin.test.ts +256 -0
- package/src/build/browser-runtime-plugin.ts +306 -0
- package/src/build/build-adapter.test.ts +463 -0
- package/src/build/build-adapter.ts +788 -0
- package/src/build/build-manifest.ts +79 -0
- package/src/build/build-types.ts +83 -0
- package/src/build/rolldown-build-adapter.test.ts +352 -0
- package/src/build/rolldown-build-adapter.ts +363 -0
- package/src/build/rolldown-plugin-bridge.test.ts +256 -0
- package/src/build/rolldown-plugin-bridge.ts +309 -0
- package/src/build/runtime-build-executor.test.ts +130 -0
- package/src/build/runtime-build-executor.ts +37 -0
- package/src/build/runtime-build-output-normalizer.ts +137 -0
- package/src/build/serialized-build-executor.test.ts +96 -0
- package/src/build/serialized-build-executor.ts +90 -0
- package/src/build/server-side-css-shim-plugin.ts +77 -0
- package/src/cache/index.ts +6 -0
- package/src/cache/module-parse-cache.test.ts +73 -0
- package/src/cache/module-parse-cache.ts +137 -0
- package/src/config/README.md +1 -1
- package/src/config/config-builder.test.ts +456 -0
- package/src/config/config-builder.ts +728 -0
- package/src/config/config-builder.typecheck.test.ts +96 -0
- package/src/config/{constants.d.ts → constants.ts} +22 -13
- package/src/dev/host-runtime.ts +34 -0
- package/src/dev/sc-server.ts +143 -0
- package/src/eco/eco.browser.test.ts +43 -0
- package/src/eco/eco.browser.ts +137 -0
- package/src/eco/eco.test.ts +781 -0
- package/src/eco/eco.ts +262 -0
- package/src/eco/eco.types.ts +293 -0
- package/src/eco/eco.utils.test.ts +219 -0
- package/src/eco/eco.utils.ts +5 -0
- package/src/eco/global-injector-map.test.ts +42 -0
- package/src/eco/global-injector-map.ts +112 -0
- package/src/eco/lazy-injector-map.test.ts +66 -0
- package/src/eco/lazy-injector-map.ts +120 -0
- package/src/eco/module-dependencies.test.ts +30 -0
- package/src/eco/module-dependencies.ts +75 -0
- package/src/errors/http-error.test.ts +134 -0
- package/src/errors/http-error.ts +72 -0
- package/src/errors/index.ts +3 -0
- package/src/errors/locals-access-error.ts +7 -0
- package/src/global/app-logger.ts +4 -0
- package/src/global/utils.test.ts +12 -0
- 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 +162 -0
- package/src/hmr/hmr-strategy.test.ts +124 -0
- package/src/hmr/hmr-strategy.ts +177 -0
- package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
- package/src/hmr/hmr.test.e2e.ts +66 -0
- package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
- package/src/hmr/strategies/js-hmr-strategy.test.ts +344 -0
- package/src/hmr/strategies/js-hmr-strategy.ts +307 -0
- package/src/index.browser.ts +3 -0
- package/src/index.ts +15 -0
- package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
- package/src/integrations/ghtml/ghtml-renderer.ts +87 -0
- package/src/integrations/ghtml/ghtml.constants.ts +1 -0
- package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
- package/src/plugins/alias-resolver-cache.test.ts +110 -0
- package/src/plugins/alias-resolver-cache.ts +145 -0
- package/src/plugins/alias-resolver-plugin.test.ts +41 -0
- package/src/plugins/alias-resolver-plugin.ts +75 -0
- package/src/plugins/eco-component-meta-plugin.test.ts +421 -0
- package/src/plugins/eco-component-meta-plugin.ts +518 -0
- package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
- package/src/plugins/foreign-jsx-override-plugin.ts +76 -0
- package/src/plugins/integration-plugin.test.ts +151 -0
- package/src/plugins/integration-plugin.ts +344 -0
- package/src/plugins/processor.test.ts +148 -0
- package/src/plugins/processor.ts +257 -0
- package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
- package/src/plugins/source-transform.test.ts +82 -0
- package/src/plugins/source-transform.ts +123 -0
- package/src/route-renderer/orchestration/component-render-context.ts +338 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +431 -0
- package/src/route-renderer/orchestration/integration-renderer.test.ts +2251 -0
- package/src/route-renderer/orchestration/integration-renderer.ts +1384 -0
- package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
- package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.ts +29 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +435 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +310 -0
- package/src/route-renderer/orchestration/render-output.utils.ts +310 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +1365 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +267 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.ts +879 -0
- package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
- package/src/route-renderer/orchestration/template-serialization.ts +117 -0
- package/src/route-renderer/page-loading/component-dependency-collection.ts +202 -0
- package/src/route-renderer/page-loading/declared-asset-collection.ts +153 -0
- package/src/route-renderer/page-loading/dependency-resolver.test.ts +761 -0
- package/src/route-renderer/page-loading/dependency-resolver.ts +144 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.ts +244 -0
- package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
- package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
- package/src/route-renderer/route-renderer.ts +133 -0
- package/src/router/client/link-intent.test.browser.ts +51 -0
- package/src/router/client/link-intent.ts +92 -0
- package/src/router/client/navigation-coordinator.test.ts +237 -0
- package/src/router/client/navigation-coordinator.ts +453 -0
- package/src/router/server/route-registry.test.ts +176 -0
- package/src/router/server/route-registry.ts +382 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +473 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.ts +344 -0
- package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
- package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
- package/src/services/assets/asset-processing-service/assets.types.ts +128 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +98 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
- package/src/services/assets/asset-processing-service/index.ts +6 -0
- package/src/services/assets/asset-processing-service/page-package.test.ts +135 -0
- package/src/services/assets/asset-processing-service/page-package.ts +103 -0
- package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
- package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
- package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
- package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +173 -0
- package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +188 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +138 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +116 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +270 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +145 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +72 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +83 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
- package/src/services/assets/browser-bundle.service.test.ts +66 -0
- package/src/services/assets/browser-bundle.service.ts +109 -0
- package/src/services/cache/cache.types.ts +126 -0
- package/src/services/cache/index.ts +18 -0
- package/src/services/cache/memory-cache-store.test.ts +225 -0
- package/src/services/cache/memory-cache-store.ts +130 -0
- package/src/services/cache/page-cache-service.test.ts +175 -0
- package/src/services/cache/page-cache-service.ts +202 -0
- package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
- package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
- package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
- package/src/services/html/html-rewriter-provider.service.ts +105 -0
- package/src/services/html/html-transformer.service.test.ts +544 -0
- package/src/services/html/html-transformer.service.ts +369 -0
- package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
- package/src/services/invalidation/development-invalidation.service.ts +262 -0
- package/src/services/module-loading/app-module-loader.service.ts +9 -0
- package/src/services/module-loading/app-server-module-transpiler.service.test.ts +297 -0
- package/src/services/module-loading/app-server-module-transpiler.service.ts +168 -0
- package/src/services/module-loading/host-module-loader-registry.ts +15 -0
- package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
- package/src/services/module-loading/page-module-import.service.test.ts +652 -0
- package/src/services/module-loading/page-module-import.service.ts +302 -0
- package/src/services/module-loading/server-module-transpiler.service.test.ts +242 -0
- package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
- package/src/services/module-loading/source-module-support.ts +19 -0
- package/src/services/runtime-state/dev-graph.service.ts +217 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
- package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
- package/src/services/validation/schema-validation-service.test.ts +223 -0
- package/src/services/validation/schema-validation-service.ts +204 -0
- package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
- package/src/static-site-generator/static-site-generator.test.ts +408 -0
- package/src/static-site-generator/static-site-generator.ts +445 -0
- package/src/types/internal-types.ts +243 -0
- package/src/types/public-types.ts +1508 -0
- package/src/utils/deep-merge.test.ts +114 -0
- package/src/utils/deep-merge.ts +47 -0
- package/src/utils/hash.ts +5 -0
- package/src/utils/html-escaping.ts +9 -0
- package/src/utils/invariant.test.ts +22 -0
- package/src/utils/invariant.ts +15 -0
- package/src/utils/locals-utils.ts +37 -0
- package/src/utils/parse-cli-args.test.ts +69 -0
- package/src/utils/parse-cli-args.ts +105 -0
- package/src/utils/path-utils.module.ts +14 -0
- package/src/utils/path-utils.test.ts +15 -0
- package/src/utils/resolve-work-dir.ts +45 -0
- package/src/utils/runtime.ts +44 -0
- package/src/utils/server-utils.module.ts +67 -0
- package/src/utils/server-utils.test.ts +38 -0
- package/src/watchers/project-watcher.integration.test.ts +337 -0
- package/src/watchers/project-watcher.test-helpers.ts +42 -0
- package/src/watchers/project-watcher.test.ts +768 -0
- package/src/watchers/project-watcher.ts +357 -0
- package/src/adapters/abstract/application-adapter.d.ts +0 -194
- package/src/adapters/abstract/application-adapter.js +0 -121
- package/src/adapters/abstract/router-adapter.d.ts +0 -26
- package/src/adapters/abstract/router-adapter.js +0 -5
- package/src/adapters/abstract/server-adapter.d.ts +0 -69
- package/src/adapters/abstract/server-adapter.js +0 -15
- package/src/adapters/bun/client-bridge.d.ts +0 -34
- package/src/adapters/bun/client-bridge.js +0 -48
- package/src/adapters/bun/create-app.d.ts +0 -60
- package/src/adapters/bun/create-app.js +0 -140
- package/src/adapters/bun/hmr-manager.d.ts +0 -47
- package/src/adapters/bun/hmr-manager.js +0 -58
- package/src/adapters/bun/index.d.ts +0 -2
- package/src/adapters/bun/index.js +0 -8
- package/src/adapters/bun/runtime-host.d.ts +0 -52
- package/src/adapters/bun/runtime-host.js +0 -56
- package/src/adapters/bun/server-adapter.d.ts +0 -216
- package/src/adapters/bun/server-adapter.js +0 -445
- package/src/adapters/bun/static-preview-host.d.ts +0 -28
- package/src/adapters/bun/static-preview-host.js +0 -45
- package/src/adapters/create-app.d.ts +0 -20
- package/src/adapters/create-app.js +0 -66
- package/src/adapters/index.d.ts +0 -2
- package/src/adapters/index.js +0 -8
- package/src/adapters/node/create-app.d.ts +0 -24
- package/src/adapters/node/create-app.js +0 -92
- package/src/adapters/node/http-request-bridge.d.ts +0 -57
- package/src/adapters/node/http-request-bridge.js +0 -118
- package/src/adapters/node/node-client-bridge.d.ts +0 -26
- package/src/adapters/node/node-client-bridge.js +0 -66
- package/src/adapters/node/node-hmr-manager.d.ts +0 -52
- package/src/adapters/node/node-hmr-manager.js +0 -49
- package/src/adapters/node/runtime-host.d.ts +0 -57
- package/src/adapters/node/runtime-host.js +0 -92
- package/src/adapters/node/server-adapter-dependencies.d.ts +0 -19
- package/src/adapters/node/server-adapter-dependencies.js +0 -18
- package/src/adapters/node/server-adapter.d.ts +0 -138
- package/src/adapters/node/server-adapter.js +0 -315
- package/src/adapters/node/static-content-server.d.ts +0 -60
- package/src/adapters/node/static-content-server.js +0 -194
- package/src/adapters/node/static-preview-host.d.ts +0 -55
- package/src/adapters/node/static-preview-host.js +0 -68
- package/src/adapters/shared/api-response.d.ts +0 -52
- package/src/adapters/shared/api-response.js +0 -96
- package/src/adapters/shared/application-adapter.d.ts +0 -18
- package/src/adapters/shared/application-adapter.js +0 -90
- package/src/adapters/shared/define-api-handler.d.ts +0 -25
- package/src/adapters/shared/define-api-handler.js +0 -15
- package/src/adapters/shared/explicit-static-render-preparation.d.ts +0 -25
- package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -41
- package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -62
- package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
- package/src/adapters/shared/fs-server-response-factory.d.ts +0 -23
- package/src/adapters/shared/fs-server-response-factory.js +0 -81
- package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -75
- package/src/adapters/shared/fs-server-response-matcher.js +0 -186
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
- package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
- package/src/adapters/shared/hmr-html-response.d.ts +0 -22
- package/src/adapters/shared/hmr-html-response.js +0 -33
- package/src/adapters/shared/render-context.d.ts +0 -16
- package/src/adapters/shared/render-context.js +0 -93
- package/src/adapters/shared/runtime-app-bootstrap.d.ts +0 -26
- package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
- package/src/adapters/shared/runtime-host.d.ts +0 -12
- package/src/adapters/shared/runtime-host.js +0 -0
- package/src/adapters/shared/server-adapter.d.ts +0 -108
- package/src/adapters/shared/server-adapter.js +0 -436
- package/src/adapters/shared/server-route-handler.d.ts +0 -89
- package/src/adapters/shared/server-route-handler.js +0 -111
- package/src/adapters/shared/server-static-builder.d.ts +0 -71
- package/src/adapters/shared/server-static-builder.js +0 -100
- package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
- package/src/adapters/shared/shared-hmr-manager.js +0 -241
- package/src/adapters/shared/static-preview-host.d.ts +0 -10
- package/src/adapters/shared/static-preview-host.js +0 -0
- package/src/build/browser-runtime-import-rewrite-plugin.d.ts +0 -26
- package/src/build/browser-runtime-import-rewrite-plugin.js +0 -165
- package/src/build/browser-runtime-manifest.d.ts +0 -31
- package/src/build/browser-runtime-manifest.js +0 -61
- package/src/build/build-adapter.d.ts +0 -247
- package/src/build/build-adapter.js +0 -671
- package/src/build/build-manifest.d.ts +0 -33
- package/src/build/build-manifest.js +0 -52
- package/src/build/build-types.d.ts +0 -57
- package/src/build/build-types.js +0 -0
- package/src/build/dev-build-coordinator.d.ts +0 -72
- package/src/build/dev-build-coordinator.js +0 -154
- package/src/build/esbuild-build-adapter.d.ts +0 -79
- package/src/build/esbuild-build-adapter.js +0 -521
- package/src/build/runtime-build-executor.d.ts +0 -14
- package/src/build/runtime-build-executor.js +0 -22
- package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
- package/src/build/runtime-specifier-alias-plugin.js +0 -31
- package/src/config/config-builder.d.ts +0 -252
- package/src/config/config-builder.js +0 -598
- package/src/config/constants.js +0 -25
- package/src/dev/host-runtime.d.ts +0 -10
- package/src/dev/host-runtime.js +0 -24
- package/src/dev/sc-server.d.ts +0 -30
- package/src/dev/sc-server.js +0 -111
- package/src/eco/eco.browser.d.ts +0 -2
- package/src/eco/eco.browser.js +0 -88
- package/src/eco/eco.d.ts +0 -9
- package/src/eco/eco.js +0 -119
- package/src/eco/eco.types.d.ts +0 -233
- package/src/eco/eco.types.js +0 -0
- package/src/eco/eco.utils.d.ts +0 -1
- package/src/eco/eco.utils.js +0 -10
- package/src/eco/global-injector-map.d.ts +0 -16
- package/src/eco/global-injector-map.js +0 -80
- package/src/eco/lazy-injector-map.d.ts +0 -8
- package/src/eco/lazy-injector-map.js +0 -70
- package/src/eco/module-dependencies.d.ts +0 -18
- package/src/eco/module-dependencies.js +0 -49
- package/src/errors/http-error.d.ts +0 -31
- package/src/errors/http-error.js +0 -50
- package/src/errors/index.d.ts +0 -3
- package/src/errors/index.js +0 -6
- package/src/errors/locals-access-error.d.ts +0 -4
- package/src/errors/locals-access-error.js +0 -9
- package/src/global/app-logger.d.ts +0 -2
- package/src/global/app-logger.js +0 -6
- package/src/hmr/client/hmr-runtime.d.ts +0 -5
- package/src/hmr/client/hmr-runtime.js +0 -117
- package/src/hmr/hmr-strategy.d.ts +0 -162
- package/src/hmr/hmr-strategy.js +0 -44
- package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
- package/src/hmr/hmr.postcss.test.e2e.js +0 -31
- package/src/hmr/hmr.test.e2e.d.ts +0 -1
- package/src/hmr/hmr.test.e2e.js +0 -43
- package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
- package/src/hmr/strategies/default-hmr-strategy.js +0 -34
- package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -134
- package/src/hmr/strategies/js-hmr-strategy.js +0 -173
- package/src/index.browser.d.ts +0 -3
- package/src/index.browser.js +0 -4
- package/src/index.d.ts +0 -6
- package/src/index.js +0 -21
- package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -16
- package/src/integrations/ghtml/ghtml-renderer.js +0 -57
- package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
- package/src/integrations/ghtml/ghtml.constants.js +0 -4
- package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
- package/src/integrations/ghtml/ghtml.plugin.js +0 -20
- package/src/plugins/alias-resolver-plugin.d.ts +0 -3
- package/src/plugins/alias-resolver-plugin.js +0 -61
- package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
- package/src/plugins/eco-component-meta-plugin.js +0 -175
- package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -33
- package/src/plugins/foreign-jsx-override-plugin.js +0 -41
- package/src/plugins/integration-plugin.d.ts +0 -230
- package/src/plugins/integration-plugin.js +0 -201
- package/src/plugins/processor.d.ts +0 -97
- package/src/plugins/processor.js +0 -141
- package/src/plugins/runtime-capability.js +0 -0
- package/src/plugins/source-transform.d.ts +0 -46
- package/src/plugins/source-transform.js +0 -71
- package/src/route-renderer/orchestration/component-render-context.d.ts +0 -97
- package/src/route-renderer/orchestration/component-render-context.js +0 -147
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
- package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +0 -110
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
- package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -534
- package/src/route-renderer/orchestration/integration-renderer.js +0 -991
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
- package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +0 -29
- package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
- package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +0 -3
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
- package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -66
- package/src/route-renderer/orchestration/render-output.utils.js +0 -171
- package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +0 -156
- package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
- package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
- package/src/route-renderer/orchestration/template-serialization.js +0 -45
- package/src/route-renderer/page-loading/component-dependency-collection.d.ts +0 -37
- package/src/route-renderer/page-loading/component-dependency-collection.js +0 -132
- package/src/route-renderer/page-loading/declared-asset-collection.d.ts +0 -24
- package/src/route-renderer/page-loading/declared-asset-collection.js +0 -106
- package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
- package/src/route-renderer/page-loading/dependency-resolver.js +0 -115
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +0 -11
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +0 -57
- package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +0 -45
- package/src/route-renderer/page-loading/lazy-entry-collection.js +0 -105
- package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +0 -19
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +0 -40
- package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +0 -5
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +0 -33
- package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +0 -3
- package/src/route-renderer/page-loading/module-declaration-scripts.js +0 -18
- package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +0 -13
- package/src/route-renderer/page-loading/page-dependency-bundling.js +0 -137
- package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
- package/src/route-renderer/page-loading/page-module-loader.js +0 -127
- package/src/route-renderer/route-renderer.d.ts +0 -69
- package/src/route-renderer/route-renderer.js +0 -80
- package/src/router/client/link-intent.js +0 -34
- package/src/router/client/link-intent.test.browser.d.ts +0 -1
- package/src/router/client/link-intent.test.browser.js +0 -43
- package/src/router/client/navigation-coordinator.d.ts +0 -169
- package/src/router/client/navigation-coordinator.js +0 -215
- package/src/router/server/route-registry.d.ts +0 -78
- package/src/router/server/route-registry.js +0 -262
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +0 -3
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +0 -56
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -103
- package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -285
- package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
- package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
- package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -103
- package/src/services/assets/asset-processing-service/assets.types.js +0 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -57
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -49
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
- package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +0 -30
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +0 -65
- package/src/services/assets/asset-processing-service/index.d.ts +0 -6
- package/src/services/assets/asset-processing-service/index.js +0 -6
- package/src/services/assets/asset-processing-service/page-package.d.ts +0 -6
- package/src/services/assets/asset-processing-service/page-package.js +0 -80
- package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
- package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
- package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
- package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -65
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -22
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -136
- package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/assets/asset-processing-service/processors/index.js +0 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -6
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -120
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -97
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -42
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -126
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -8
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -59
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -69
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -18
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +0 -45
- package/src/services/assets/browser-bundle.service.d.ts +0 -73
- package/src/services/assets/browser-bundle.service.js +0 -41
- package/src/services/cache/cache.types.d.ts +0 -107
- package/src/services/cache/cache.types.js +0 -0
- package/src/services/cache/index.d.ts +0 -7
- package/src/services/cache/index.js +0 -7
- package/src/services/cache/memory-cache-store.d.ts +0 -42
- package/src/services/cache/memory-cache-store.js +0 -98
- package/src/services/cache/page-cache-service.d.ts +0 -70
- package/src/services/cache/page-cache-service.js +0 -152
- package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
- package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
- package/src/services/html/html-rewriter-provider.service.d.ts +0 -40
- package/src/services/html/html-rewriter-provider.service.js +0 -68
- package/src/services/html/html-transformer.service.d.ts +0 -96
- package/src/services/html/html-transformer.service.js +0 -287
- package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
- package/src/services/invalidation/development-invalidation.service.js +0 -190
- package/src/services/module-loading/app-module-loader.service.d.ts +0 -7
- package/src/services/module-loading/app-module-loader.service.js +0 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
- package/src/services/module-loading/app-server-module-transpiler.service.js +0 -151
- package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
- package/src/services/module-loading/host-module-loader-registry.js +0 -15
- package/src/services/module-loading/module-loading-types.js +0 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -38
- package/src/services/module-loading/node-bootstrap-plugin.js +0 -215
- package/src/services/module-loading/page-module-import.service.d.ts +0 -95
- package/src/services/module-loading/page-module-import.service.js +0 -191
- package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -63
- package/src/services/module-loading/server-module-transpiler.service.js +0 -64
- package/src/services/module-loading/source-module-support.d.ts +0 -5
- package/src/services/module-loading/source-module-support.js +0 -8
- package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
- package/src/services/runtime-state/dev-graph.service.js +0 -162
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
- package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
- package/src/services/validation/schema-validation-service.d.ts +0 -122
- package/src/services/validation/schema-validation-service.js +0 -101
- package/src/services/validation/standard-schema.types.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +0 -104
- package/src/static-site-generator/static-site-generator.js +0 -316
- package/src/types/internal-types.d.ts +0 -232
- package/src/types/internal-types.js +0 -0
- package/src/types/public-types.d.ts +0 -1307
- package/src/types/public-types.js +0 -0
- package/src/utils/deep-merge.d.ts +0 -14
- package/src/utils/deep-merge.js +0 -32
- package/src/utils/hash.d.ts +0 -1
- package/src/utils/hash.js +0 -7
- package/src/utils/html-escaping.d.ts +0 -7
- package/src/utils/html-escaping.js +0 -6
- package/src/utils/html.js +0 -4
- package/src/utils/invariant.d.ts +0 -5
- package/src/utils/invariant.js +0 -11
- package/src/utils/locals-utils.d.ts +0 -15
- package/src/utils/locals-utils.js +0 -24
- package/src/utils/parse-cli-args.d.ts +0 -27
- package/src/utils/parse-cli-args.js +0 -62
- package/src/utils/path-utils.module.d.ts +0 -5
- package/src/utils/path-utils.module.js +0 -14
- package/src/utils/resolve-work-dir.d.ts +0 -11
- package/src/utils/resolve-work-dir.js +0 -31
- package/src/utils/runtime.d.ts +0 -11
- package/src/utils/runtime.js +0 -40
- package/src/utils/server-utils.module.d.ts +0 -19
- package/src/utils/server-utils.module.js +0 -56
- package/src/watchers/project-watcher.d.ts +0 -136
- package/src/watchers/project-watcher.js +0 -275
- package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
- package/src/watchers/project-watcher.test-helpers.js +0 -52
- /package/src/utils/{html.d.ts → html.ts} +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../types/internal-types.ts';
|
|
2
|
+
import { AbstractApplicationAdapter } from './abstract/application-adapter.ts';
|
|
3
|
+
import type { ApiHandler } from '../types/public-types.ts';
|
|
4
|
+
import type { ApplicationAdapterOptions } from './abstract/application-adapter.ts';
|
|
5
|
+
import { SharedApplicationAdapter } from './shared/application-adapter.ts';
|
|
6
|
+
import { createApp as createBunApp } from './bun/create-app.ts';
|
|
7
|
+
import { createNodeApp } from './node/create-app.ts';
|
|
8
|
+
|
|
9
|
+
export interface EcopagesAppOptions extends ApplicationAdapterOptions {
|
|
10
|
+
appConfig: EcoPagesAppConfig;
|
|
11
|
+
serverOptions?: Record<string, any>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type UniversalEcopagesApp = AbstractApplicationAdapter<EcopagesAppOptions, unknown, Request>;
|
|
15
|
+
|
|
16
|
+
async function createRuntimeApp<WebSocketData = undefined>(options: EcopagesAppOptions): Promise<UniversalEcopagesApp> {
|
|
17
|
+
const bun = (globalThis as { Bun?: unknown }).Bun;
|
|
18
|
+
|
|
19
|
+
if (bun) {
|
|
20
|
+
return (await createBunApp<WebSocketData>(options)) as unknown as UniversalEcopagesApp;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return (await createNodeApp(options)) as unknown as UniversalEcopagesApp;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function createApp<WebSocketData = undefined>(options: EcopagesAppOptions): Promise<UniversalEcopagesApp> {
|
|
27
|
+
return createRuntimeApp<WebSocketData>(options);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class EcopagesApp extends SharedApplicationAdapter<EcopagesAppOptions, unknown, Request> {
|
|
31
|
+
private readonly appOptions: EcopagesAppOptions;
|
|
32
|
+
private runtimeApp: UniversalEcopagesApp | null = null;
|
|
33
|
+
private runtimeAppPromise: Promise<UniversalEcopagesApp> | null = null;
|
|
34
|
+
|
|
35
|
+
constructor(options: EcopagesAppOptions) {
|
|
36
|
+
super(options);
|
|
37
|
+
this.appOptions = options;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private async getRuntimeApp(): Promise<UniversalEcopagesApp> {
|
|
41
|
+
if (this.runtimeApp) {
|
|
42
|
+
return this.runtimeApp;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!this.runtimeAppPromise) {
|
|
46
|
+
this.runtimeAppPromise = createRuntimeApp({
|
|
47
|
+
...this.appOptions,
|
|
48
|
+
clearOutput: false,
|
|
49
|
+
}).then((app) => {
|
|
50
|
+
for (const handler of this.apiHandlers) {
|
|
51
|
+
app.add(handler as ApiHandler<string, Request, any>);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
for (const route of this.staticRoutes) {
|
|
55
|
+
app.static(route.path, route.loader);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (this.errorHandler) {
|
|
59
|
+
app.onError(this.errorHandler);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
this.runtimeApp = app;
|
|
63
|
+
return app;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return this.runtimeAppPromise;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
protected async initializeServerAdapter(): Promise<UniversalEcopagesApp> {
|
|
71
|
+
return this.getRuntimeApp();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async start(): Promise<unknown> {
|
|
75
|
+
const runtimeApp = await this.getRuntimeApp();
|
|
76
|
+
return runtimeApp.start();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async fetch(request: Request): Promise<Response> {
|
|
80
|
+
const runtimeApp = await this.getRuntimeApp();
|
|
81
|
+
const candidate = runtimeApp as UniversalEcopagesApp & {
|
|
82
|
+
fetch?: (request: Request) => Promise<Response>;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
if (!candidate.fetch) {
|
|
86
|
+
throw new Error('The selected runtime adapter does not expose fetch()');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return candidate.fetch(request);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { afterEach, describe, it, vi } from 'vitest';
|
|
3
|
+
import type { NodeServerAdapterParams, NodeServerAdapterResult } from './server-adapter.ts';
|
|
4
|
+
import { NodeEcopagesApp } from './create-app.ts';
|
|
5
|
+
import { NodeHttpRequestBridge } from './http-request-bridge.ts';
|
|
6
|
+
import { NodeRuntimeHost } from './runtime-host.ts';
|
|
7
|
+
|
|
8
|
+
class TestNodeEcopagesApp extends NodeEcopagesApp {
|
|
9
|
+
public capturedParams: NodeServerAdapterParams | undefined;
|
|
10
|
+
|
|
11
|
+
constructor(options: ConstructorParameters<typeof NodeEcopagesApp>[0]) {
|
|
12
|
+
super(options, {
|
|
13
|
+
runtimeHost: new NodeRuntimeHost(new NodeHttpRequestBridge()),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
protected override async createServerAdapter(params: NodeServerAdapterParams): Promise<NodeServerAdapterResult> {
|
|
18
|
+
this.capturedParams = params;
|
|
19
|
+
return {
|
|
20
|
+
getServerOptions: () => params.serveOptions,
|
|
21
|
+
completeInitialization: async () => {},
|
|
22
|
+
handleRequest: async () => new Response(null, { status: 204 }),
|
|
23
|
+
buildStatic: async () => {},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public async initializeForTest(): Promise<void> {
|
|
28
|
+
await this.initializeServerAdapter();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
process.env.NODE_ENV = undefined;
|
|
34
|
+
process.env.ECOPAGES_INTERNAL_EMBEDDED_RUNTIME = undefined;
|
|
35
|
+
process.env.ECOPAGES_PORT = '';
|
|
36
|
+
process.env.ECOPAGES_HOSTNAME = '';
|
|
37
|
+
vi.restoreAllMocks();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe('node embedded app bootstrap', () => {
|
|
41
|
+
it('keeps watch mode enabled for embedded development runtimes', async () => {
|
|
42
|
+
process.env.NODE_ENV = 'development';
|
|
43
|
+
|
|
44
|
+
const app = new TestNodeEcopagesApp({
|
|
45
|
+
appConfig: {
|
|
46
|
+
runtime: {},
|
|
47
|
+
} as any,
|
|
48
|
+
runtime: {
|
|
49
|
+
embedded: true,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
await app.initializeForTest();
|
|
54
|
+
|
|
55
|
+
assert.equal(app.capturedParams?.options?.watch, true);
|
|
56
|
+
assert.deepEqual(app.capturedParams?.serveOptions, {
|
|
57
|
+
port: 3000,
|
|
58
|
+
hostname: 'localhost',
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('preserves the configured hostname in the reported runtime origin', () => {
|
|
63
|
+
const runtimeHost = new NodeRuntimeHost(new NodeHttpRequestBridge());
|
|
64
|
+
const server = {
|
|
65
|
+
address: () => ({ address: '::1', port: 3000, family: 'IPv6' }),
|
|
66
|
+
} as any;
|
|
67
|
+
|
|
68
|
+
assert.equal(
|
|
69
|
+
runtimeHost.getOrigin(server, {
|
|
70
|
+
hostname: 'localhost',
|
|
71
|
+
port: 3000,
|
|
72
|
+
}),
|
|
73
|
+
'http://localhost:3000',
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { appLogger } from '../../global/app-logger.ts';
|
|
2
|
+
import type { StaticRoute } from '../../types/public-types.ts';
|
|
3
|
+
import { SharedApplicationAdapter } from '../shared/application-adapter.ts';
|
|
4
|
+
import { resolveRuntimeBinding } from '../shared/runtime-app-bootstrap.ts';
|
|
5
|
+
import type { RuntimeHost } from '../shared/runtime-host.ts';
|
|
6
|
+
import type { EcopagesAppOptions } from '../create-app.ts';
|
|
7
|
+
import { type NodeServerAdapterResult, createNodeServerAdapter } from './server-adapter.ts';
|
|
8
|
+
import { NodeHttpRequestBridge } from './http-request-bridge.ts';
|
|
9
|
+
import type { NodeServerInstance } from './server-adapter.ts';
|
|
10
|
+
import { NodeRuntimeHost } from './runtime-host.ts';
|
|
11
|
+
|
|
12
|
+
export class NodeEcopagesApp extends SharedApplicationAdapter<EcopagesAppOptions, NodeServerInstance, Request> {
|
|
13
|
+
serverAdapter: NodeServerAdapterResult | undefined;
|
|
14
|
+
private server: NodeServerInstance | null = null;
|
|
15
|
+
private runtimeOrigin = '';
|
|
16
|
+
private readonly runtimeHost: RuntimeHost<NodeServerInstance, { port?: number; hostname?: string }>;
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
options: EcopagesAppOptions,
|
|
20
|
+
dependencies: {
|
|
21
|
+
runtimeHost: RuntimeHost<NodeServerInstance, { port?: number; hostname?: string }>;
|
|
22
|
+
},
|
|
23
|
+
) {
|
|
24
|
+
super(options);
|
|
25
|
+
this.runtimeHost = dependencies.runtimeHost;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
protected createServerAdapter(
|
|
29
|
+
params: Parameters<typeof createNodeServerAdapter>[0],
|
|
30
|
+
): Promise<NodeServerAdapterResult> {
|
|
31
|
+
return createNodeServerAdapter(params);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public async stop(force = true): Promise<void> {
|
|
35
|
+
if (!this.server) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const activeServer = this.server;
|
|
40
|
+
this.server = null;
|
|
41
|
+
await this.runtimeHost.stop(activeServer, { force });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected async initializeServerAdapter(): Promise<NodeServerAdapterResult> {
|
|
45
|
+
const binding = resolveRuntimeBinding({
|
|
46
|
+
cliArgs: this.cliArgs,
|
|
47
|
+
serverOptions: this.serverOptions,
|
|
48
|
+
});
|
|
49
|
+
this.runtimeOrigin = binding.runtimeOrigin;
|
|
50
|
+
|
|
51
|
+
return this.createServerAdapter({
|
|
52
|
+
runtimeOrigin: this.runtimeOrigin,
|
|
53
|
+
appConfig: this.appConfig,
|
|
54
|
+
apiHandlers: this.apiHandlers,
|
|
55
|
+
staticRoutes: this.staticRoutes as StaticRoute[],
|
|
56
|
+
errorHandler: this.errorHandler,
|
|
57
|
+
options: { watch: binding.watch },
|
|
58
|
+
serveOptions: binding.serveOptions,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public async start(): Promise<NodeServerInstance | void> {
|
|
63
|
+
if (!this.serverAdapter) {
|
|
64
|
+
this.serverAdapter = await this.initializeServerAdapter();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (this.server) {
|
|
68
|
+
return this.server;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const { build, preview } = this.cliArgs;
|
|
72
|
+
|
|
73
|
+
if (build || preview) {
|
|
74
|
+
appLogger.debugTime('Building static pages');
|
|
75
|
+
await this.serverAdapter.buildStatic({ preview });
|
|
76
|
+
await this.stop(true);
|
|
77
|
+
appLogger.debugTimeEnd('Building static pages');
|
|
78
|
+
|
|
79
|
+
if (build) {
|
|
80
|
+
process.exit(0);
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const serveOptions = this.serverAdapter.getServerOptions();
|
|
86
|
+
this.server = await this.runtimeHost.start({
|
|
87
|
+
serveOptions,
|
|
88
|
+
handleRequest: async (request) => await this.serverAdapter!.handleRequest(request),
|
|
89
|
+
onError: async () => {},
|
|
90
|
+
});
|
|
91
|
+
this.runtimeOrigin = this.runtimeHost.getOrigin(this.server, serveOptions);
|
|
92
|
+
|
|
93
|
+
await this.serverAdapter.completeInitialization(this.server);
|
|
94
|
+
appLogger.info(`Node server running at ${this.runtimeOrigin}`);
|
|
95
|
+
|
|
96
|
+
return this.server;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public async fetch(request: Request): Promise<Response> {
|
|
100
|
+
if (!this.serverAdapter) {
|
|
101
|
+
this.serverAdapter = await this.initializeServerAdapter();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return this.serverAdapter.handleRequest(request);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export async function createNodeApp(options: EcopagesAppOptions): Promise<NodeEcopagesApp> {
|
|
109
|
+
return new NodeEcopagesApp(options, {
|
|
110
|
+
runtimeHost: new NodeRuntimeHost(new NodeHttpRequestBridge()),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export async function createApp(options: EcopagesAppOptions): Promise<NodeEcopagesApp> {
|
|
115
|
+
return createNodeApp(options);
|
|
116
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import { PassThrough, Writable } from 'node:stream';
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { NodeClientAbortError, NodeHttpRequestBridge } from './http-request-bridge.ts';
|
|
5
|
+
|
|
6
|
+
class MockIncomingMessage extends PassThrough {
|
|
7
|
+
public url = '/submit?ok=1';
|
|
8
|
+
public method = 'POST';
|
|
9
|
+
public headers: Record<string, string | string[] | undefined> = {
|
|
10
|
+
'content-type': 'application/json',
|
|
11
|
+
'x-test': 'one',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
public emitAbort(): void {
|
|
15
|
+
this.emit('aborted');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public emitNodeError(code: string): void {
|
|
19
|
+
const error = new Error(code) as NodeJS.ErrnoException;
|
|
20
|
+
error.code = code;
|
|
21
|
+
this.emit('error', error);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Writable test double that captures streamed response output and headers for
|
|
27
|
+
* bridge assertions.
|
|
28
|
+
*/
|
|
29
|
+
class MockServerResponse extends Writable {
|
|
30
|
+
public statusCode = 200;
|
|
31
|
+
public headers = new Map<string, string>();
|
|
32
|
+
public chunks: Buffer[] = [];
|
|
33
|
+
|
|
34
|
+
public setHeader(name: string, value: string): void {
|
|
35
|
+
this.headers.set(name, value);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public override _write(
|
|
39
|
+
chunk: string | Buffer,
|
|
40
|
+
_encoding: BufferEncoding,
|
|
41
|
+
callback: (error?: Error | null) => void,
|
|
42
|
+
): void {
|
|
43
|
+
this.chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
44
|
+
callback();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe('NodeHttpRequestBridge', () => {
|
|
49
|
+
it('creates a streaming Web Request for non-GET request bodies', async () => {
|
|
50
|
+
const bridge = new NodeHttpRequestBridge();
|
|
51
|
+
const req = new MockIncomingMessage();
|
|
52
|
+
|
|
53
|
+
const request = bridge.createWebRequest(req as unknown as IncomingMessage, 'http://localhost:3000');
|
|
54
|
+
const bodyRead = request.text();
|
|
55
|
+
|
|
56
|
+
req.end('{"hello":"world"}');
|
|
57
|
+
|
|
58
|
+
expect(request.method).toBe('POST');
|
|
59
|
+
expect(request.url).toBe('http://localhost:3000/submit?ok=1');
|
|
60
|
+
expect(request.headers.get('content-type')).toBe('application/json');
|
|
61
|
+
expect(request.headers.get('x-test')).toBe('one');
|
|
62
|
+
await expect(bodyRead).resolves.toBe('{"hello":"world"}');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('does not attach a body for GET requests', () => {
|
|
66
|
+
const bridge = new NodeHttpRequestBridge();
|
|
67
|
+
const req = new MockIncomingMessage();
|
|
68
|
+
req.method = 'GET';
|
|
69
|
+
|
|
70
|
+
const request = bridge.createWebRequest(req as unknown as IncomingMessage, 'http://localhost:3000');
|
|
71
|
+
|
|
72
|
+
expect(request.method).toBe('GET');
|
|
73
|
+
expect(request.body).toBeNull();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('normalizes aborted request bodies into NodeClientAbortError', async () => {
|
|
77
|
+
const bridge = new NodeHttpRequestBridge();
|
|
78
|
+
const req = new MockIncomingMessage();
|
|
79
|
+
|
|
80
|
+
const request = bridge.createWebRequest(req as unknown as IncomingMessage, 'http://localhost:3000');
|
|
81
|
+
const bodyRead = request.text();
|
|
82
|
+
|
|
83
|
+
req.emitAbort();
|
|
84
|
+
|
|
85
|
+
await expect(bodyRead).rejects.toBeInstanceOf(NodeClientAbortError);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('normalizes ECONNRESET request stream errors into NodeClientAbortError', async () => {
|
|
89
|
+
const bridge = new NodeHttpRequestBridge();
|
|
90
|
+
const req = new MockIncomingMessage();
|
|
91
|
+
|
|
92
|
+
const request = bridge.createWebRequest(req as unknown as IncomingMessage, 'http://localhost:3000');
|
|
93
|
+
const bodyRead = request.text();
|
|
94
|
+
|
|
95
|
+
req.emitNodeError('ECONNRESET');
|
|
96
|
+
|
|
97
|
+
await expect(bodyRead).rejects.toBeInstanceOf(NodeClientAbortError);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('streams response bodies to the Node response without buffering through arrayBuffer', async () => {
|
|
101
|
+
const bridge = new NodeHttpRequestBridge();
|
|
102
|
+
const response = new Response(
|
|
103
|
+
new ReadableStream({
|
|
104
|
+
start(controller) {
|
|
105
|
+
controller.enqueue(new TextEncoder().encode('hello '));
|
|
106
|
+
controller.enqueue(new TextEncoder().encode('world'));
|
|
107
|
+
controller.close();
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
{
|
|
111
|
+
status: 206,
|
|
112
|
+
headers: {
|
|
113
|
+
'content-type': 'text/plain; charset=utf-8',
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const arrayBufferSpy = vi.spyOn(response, 'arrayBuffer');
|
|
119
|
+
const res = new MockServerResponse();
|
|
120
|
+
|
|
121
|
+
await bridge.sendNodeResponse(res as unknown as ServerResponse, response);
|
|
122
|
+
|
|
123
|
+
expect(res.statusCode).toBe(206);
|
|
124
|
+
expect(res.headers.get('content-type')).toBe('text/plain; charset=utf-8');
|
|
125
|
+
expect(Buffer.concat(res.chunks).toString('utf8')).toBe('hello world');
|
|
126
|
+
expect(arrayBufferSpy).not.toHaveBeenCalled();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('normalizes closed response streams into NodeClientAbortError', async () => {
|
|
130
|
+
const bridge = new NodeHttpRequestBridge();
|
|
131
|
+
const response = new Response(
|
|
132
|
+
new ReadableStream({
|
|
133
|
+
start(controller) {
|
|
134
|
+
controller.enqueue(new TextEncoder().encode('hello world'));
|
|
135
|
+
controller.close();
|
|
136
|
+
},
|
|
137
|
+
}),
|
|
138
|
+
);
|
|
139
|
+
const res = new MockServerResponse();
|
|
140
|
+
res.destroy();
|
|
141
|
+
|
|
142
|
+
await expect(bridge.sendNodeResponse(res as unknown as ServerResponse, response)).rejects.toBeInstanceOf(
|
|
143
|
+
NodeClientAbortError,
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import { Readable } from 'node:stream';
|
|
3
|
+
import { pipeline } from 'node:stream/promises';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Signals that the remote client closed the HTTP exchange before the Node
|
|
7
|
+
* adapter finished reading or writing the body.
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* This error represents a transport-level disconnect, not an application
|
|
11
|
+
* failure. Higher layers may safely suppress logging for this error when the
|
|
12
|
+
* client socket is already gone and no meaningful response can still be sent.
|
|
13
|
+
*/
|
|
14
|
+
export class NodeClientAbortError extends Error {
|
|
15
|
+
/**
|
|
16
|
+
* Creates the canonical Node transport abort error used across request-body
|
|
17
|
+
* reads and response-body writes.
|
|
18
|
+
*/
|
|
19
|
+
constructor() {
|
|
20
|
+
super('Client closed the request');
|
|
21
|
+
this.name = 'ClientAbortError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Returns whether a Node stream error code corresponds to a normal client-side
|
|
27
|
+
* disconnect rather than a server fault.
|
|
28
|
+
*
|
|
29
|
+
* @remarks
|
|
30
|
+
* The allowlist is intentionally narrow. Only socket and stream shutdown codes
|
|
31
|
+
* that are expected after browser aborts or navigation churn are treated as
|
|
32
|
+
* suppressible client disconnects.
|
|
33
|
+
*/
|
|
34
|
+
function isNodeClientDisconnectCode(code: string | undefined): boolean {
|
|
35
|
+
return [
|
|
36
|
+
'ECONNRESET',
|
|
37
|
+
'EPIPE',
|
|
38
|
+
'ERR_STREAM_DESTROYED',
|
|
39
|
+
'ERR_STREAM_PREMATURE_CLOSE',
|
|
40
|
+
'ERR_STREAM_UNABLE_TO_PIPE',
|
|
41
|
+
].includes(code ?? '');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Type guard for the canonical client-abort error used by the Node adapter.
|
|
46
|
+
*
|
|
47
|
+
* @remarks
|
|
48
|
+
* Runtime hosts use this guard before logging so only explicitly classified
|
|
49
|
+
* client disconnects are muted. All other failures continue through the normal
|
|
50
|
+
* error-reporting path.
|
|
51
|
+
*/
|
|
52
|
+
export function isNodeClientAbortError(error: unknown): error is NodeClientAbortError {
|
|
53
|
+
return error instanceof NodeClientAbortError;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Normalizes low-level Node socket and stream shutdown errors into the shared
|
|
58
|
+
* `NodeClientAbortError` abstraction used by the adapter stack.
|
|
59
|
+
*
|
|
60
|
+
* @remarks
|
|
61
|
+
* This normalization exists at the transport boundary because Node exposes
|
|
62
|
+
* several host-specific error codes for the same underlying event: the client
|
|
63
|
+
* disappeared before the response stream finished. Converting them here keeps
|
|
64
|
+
* the rest of the adapter stack independent from those Node-specific details.
|
|
65
|
+
*/
|
|
66
|
+
function toNodeClientAbortError(error: unknown): NodeClientAbortError | null {
|
|
67
|
+
if (error instanceof NodeClientAbortError) {
|
|
68
|
+
return error;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (typeof error === 'object' && error !== null && 'code' in error) {
|
|
72
|
+
const code = typeof error.code === 'string' ? error.code : undefined;
|
|
73
|
+
if (isNodeClientDisconnectCode(code)) {
|
|
74
|
+
return new NodeClientAbortError();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Bridges Node's `IncomingMessage` / `ServerResponse` pair to the Web
|
|
83
|
+
* `Request` / `Response` contract used by the shared routing pipeline.
|
|
84
|
+
*
|
|
85
|
+
* @remarks
|
|
86
|
+
* This class is the Node transport boundary. It owns the translation of request
|
|
87
|
+
* headers and bodies into Web primitives and the reverse translation of Web
|
|
88
|
+
* responses back onto Node streams, including client-abort normalization.
|
|
89
|
+
*/
|
|
90
|
+
export class NodeHttpRequestBridge {
|
|
91
|
+
/**
|
|
92
|
+
* Converts one incoming Node request into the Web `Request` shape consumed by
|
|
93
|
+
* the shared server adapter.
|
|
94
|
+
*
|
|
95
|
+
* @remarks
|
|
96
|
+
* Non-GET/HEAD requests retain streaming semantics via a `ReadableStream` so
|
|
97
|
+
* large request bodies do not need to be buffered before route handling begins.
|
|
98
|
+
*/
|
|
99
|
+
public createWebRequest(req: IncomingMessage, runtimeOrigin: string): Request {
|
|
100
|
+
const url = new URL(req.url ?? '/', runtimeOrigin);
|
|
101
|
+
const headers = new Headers();
|
|
102
|
+
|
|
103
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
104
|
+
if (Array.isArray(value)) {
|
|
105
|
+
for (const item of value) {
|
|
106
|
+
headers.append(key, item);
|
|
107
|
+
}
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (value !== undefined) {
|
|
112
|
+
headers.set(key, value);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const method = (req.method ?? 'GET').toUpperCase();
|
|
117
|
+
const requestInit: RequestInit & { duplex?: 'half' } = {
|
|
118
|
+
method,
|
|
119
|
+
headers,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
if (method !== 'GET' && method !== 'HEAD') {
|
|
123
|
+
const body = new ReadableStream({
|
|
124
|
+
start(controller) {
|
|
125
|
+
req.on('data', (chunk: Buffer) => controller.enqueue(chunk));
|
|
126
|
+
req.once('end', () => controller.close());
|
|
127
|
+
req.once('aborted', () => {
|
|
128
|
+
controller.error(new NodeClientAbortError());
|
|
129
|
+
});
|
|
130
|
+
req.once('error', (err) => {
|
|
131
|
+
const isClientAbort = (err as NodeJS.ErrnoException).code === 'ECONNRESET';
|
|
132
|
+
controller.error(isClientAbort ? new NodeClientAbortError() : err);
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
cancel() {
|
|
136
|
+
req.destroy();
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
requestInit.body = body;
|
|
141
|
+
requestInit.duplex = 'half';
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return new Request(url, requestInit);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Sends a Web `Response` through Node's `ServerResponse` without buffering the
|
|
149
|
+
* full body in memory first.
|
|
150
|
+
*
|
|
151
|
+
* @remarks
|
|
152
|
+
* Streaming responses matter for large payloads and long-lived transports such
|
|
153
|
+
* as server-sent events. The bridge therefore forwards the `ReadableStream`
|
|
154
|
+
* directly into the Node writable response instead of materializing an
|
|
155
|
+
* intermediate `ArrayBuffer`.
|
|
156
|
+
*/
|
|
157
|
+
public async sendNodeResponse(res: ServerResponse, response: Response): Promise<void> {
|
|
158
|
+
res.statusCode = response.status;
|
|
159
|
+
|
|
160
|
+
response.headers.forEach((value, key) => {
|
|
161
|
+
res.setHeader(key, value);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
if (!response.body) {
|
|
165
|
+
res.end();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const responseBody = response.body as unknown as Parameters<typeof Readable.fromWeb>[0];
|
|
170
|
+
try {
|
|
171
|
+
await pipeline(Readable.fromWeb(responseBody), res);
|
|
172
|
+
} catch (error) {
|
|
173
|
+
throw toNodeClientAbortError(error) ?? error;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|