@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,605 @@
|
|
|
1
|
+
import type { Server, WebSocketHandler } from 'bun';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from '../../config/constants.ts';
|
|
4
|
+
import { RESOLVED_ASSETS_DIR } from '../../config/constants.ts';
|
|
5
|
+
import { appLogger } from '../../global/app-logger.ts';
|
|
6
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.ts';
|
|
7
|
+
import type { ApiHandler, ApiHandlerContext, ErrorHandler, StaticRoute } from '../../types/public-types.ts';
|
|
8
|
+
import { HttpError } from '../../errors/http-error.ts';
|
|
9
|
+
import { createRequire } from '../../utils/locals-utils.ts';
|
|
10
|
+
|
|
11
|
+
import { fileSystem } from '@ecopages/file-system';
|
|
12
|
+
import { getAppBrowserBuildPlugins, setupAppRuntimePlugins } from '../../build/build-adapter.ts';
|
|
13
|
+
import { installAppRuntimeBuildExecutor } from '../../build/runtime-build-executor.ts';
|
|
14
|
+
import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.ts';
|
|
15
|
+
import { ProjectWatcher } from '../../watchers/project-watcher.ts';
|
|
16
|
+
import { SharedServerAdapter } from '../shared/server-adapter.ts';
|
|
17
|
+
import type { ServerAdapterResult } from '../abstract/server-adapter.ts';
|
|
18
|
+
import { ApiResponseBuilder } from '../shared/api-response.ts';
|
|
19
|
+
import type { StaticPreviewHost } from '../shared/static-preview-host.ts';
|
|
20
|
+
|
|
21
|
+
import { ServerStaticBuilder } from '../shared/server-static-builder.ts';
|
|
22
|
+
import {
|
|
23
|
+
injectHmrRuntimeIntoHtmlResponse,
|
|
24
|
+
isHtmlResponse,
|
|
25
|
+
shouldInjectHmrHtmlResponse,
|
|
26
|
+
} from '../shared/hmr-html-response.ts';
|
|
27
|
+
import { resolveServeRuntimeOrigin } from '../shared/runtime-app-bootstrap.ts';
|
|
28
|
+
import { ClientBridge } from './client-bridge.ts';
|
|
29
|
+
import { HmrManager } from './hmr-manager.ts';
|
|
30
|
+
import { BunStaticPreviewHost } from './static-preview-host.ts';
|
|
31
|
+
|
|
32
|
+
type BunServerInstance = Server<unknown>;
|
|
33
|
+
type BunNativeServeOptions = Bun.Serve.Options<unknown>;
|
|
34
|
+
|
|
35
|
+
export type BunServerRoutes = Bun.Serve.Routes<unknown, string>;
|
|
36
|
+
|
|
37
|
+
export type BunServeAdapterServerOptions = Partial<
|
|
38
|
+
Omit<BunNativeServeOptions, 'fetch'> & {
|
|
39
|
+
fetch(this: BunServerInstance, request: Request): Promise<void | Response>;
|
|
40
|
+
}
|
|
41
|
+
>;
|
|
42
|
+
|
|
43
|
+
export type BunServeOptions = Omit<BunNativeServeOptions, 'fetch'> & {
|
|
44
|
+
fetch?: (this: BunServerInstance, request: Request, server: BunServerInstance) => Promise<void | Response>;
|
|
45
|
+
websocket?: WebSocketHandler<unknown>;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Construction parameters for the Bun server adapter.
|
|
50
|
+
*
|
|
51
|
+
* @remarks
|
|
52
|
+
* Callers normally provide only the app-facing fields such as routes, handlers,
|
|
53
|
+
* and `serveOptions`. The transport collaborators remain optional here because
|
|
54
|
+
* `createBunServerAdapter()` fills in Bun-specific defaults before the concrete
|
|
55
|
+
* adapter instance is created.
|
|
56
|
+
*/
|
|
57
|
+
export interface BunServerAdapterParams {
|
|
58
|
+
appConfig: EcoPagesAppConfig;
|
|
59
|
+
runtimeOrigin: string;
|
|
60
|
+
serveOptions: BunServeAdapterServerOptions;
|
|
61
|
+
apiHandlers?: ApiHandler<string, Request, BunServerInstance>[];
|
|
62
|
+
staticRoutes?: StaticRoute[];
|
|
63
|
+
errorHandler?: ErrorHandler;
|
|
64
|
+
options?: {
|
|
65
|
+
watch?: boolean;
|
|
66
|
+
};
|
|
67
|
+
hmrManager?: HmrManager;
|
|
68
|
+
bridge?: ClientBridge;
|
|
69
|
+
previewHost?: StaticPreviewHost;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface BunServerAdapterResult extends ServerAdapterResult {
|
|
73
|
+
getServerOptions: (options?: { enableHmr?: boolean }) => BunServeOptions;
|
|
74
|
+
buildStatic: (options?: { preview?: boolean }) => Promise<void>;
|
|
75
|
+
completeInitialization: (server?: BunServerInstance | null) => Promise<void>;
|
|
76
|
+
handleRequest: (request: Request) => Promise<Response>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Bun transport adapter that wires shared Ecopages request handling onto a live
|
|
81
|
+
* `Bun.serve()` runtime.
|
|
82
|
+
*
|
|
83
|
+
* @remarks
|
|
84
|
+
* The adapter owns Bun-specific concerns that do not exist in the shared server
|
|
85
|
+
* abstraction: websocket-backed HMR transport, runtime plugin registration, and
|
|
86
|
+
* preview-host startup for static builds. Routing, rendering, and response
|
|
87
|
+
* composition still delegate to the shared server adapter base.
|
|
88
|
+
*/
|
|
89
|
+
export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams, BunServerAdapterResult> {
|
|
90
|
+
declare appConfig: EcoPagesAppConfig;
|
|
91
|
+
declare options: BunServerAdapterParams['options'];
|
|
92
|
+
declare serveOptions: BunServeAdapterServerOptions;
|
|
93
|
+
protected apiHandlers: ApiHandler<string, Request, BunServerInstance>[];
|
|
94
|
+
protected staticRoutes: StaticRoute[];
|
|
95
|
+
|
|
96
|
+
protected errorHandler?: ErrorHandler;
|
|
97
|
+
|
|
98
|
+
private bridge!: ClientBridge;
|
|
99
|
+
public hmrManager!: HmrManager;
|
|
100
|
+
private initializationPromise: Promise<void> | null = null;
|
|
101
|
+
private fullyInitialized = false;
|
|
102
|
+
declare serverInstance: BunServerInstance | null;
|
|
103
|
+
private readonly previewHost: StaticPreviewHost;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Creates a Bun server adapter with already-resolved runtime collaborators.
|
|
107
|
+
*
|
|
108
|
+
* @remarks
|
|
109
|
+
* The public params interface keeps `hmrManager`, `bridge`, and `previewHost`
|
|
110
|
+
* optional so factory callers can omit them. By the time the concrete adapter
|
|
111
|
+
* is constructed, those collaborators are mandatory because the adapter cannot
|
|
112
|
+
* initialize Bun HMR or preview flows without them.
|
|
113
|
+
*/
|
|
114
|
+
constructor({
|
|
115
|
+
appConfig,
|
|
116
|
+
runtimeOrigin,
|
|
117
|
+
serveOptions,
|
|
118
|
+
apiHandlers,
|
|
119
|
+
staticRoutes,
|
|
120
|
+
errorHandler,
|
|
121
|
+
options,
|
|
122
|
+
hmrManager,
|
|
123
|
+
bridge,
|
|
124
|
+
previewHost,
|
|
125
|
+
}: BunServerAdapterParams & {
|
|
126
|
+
hmrManager: HmrManager;
|
|
127
|
+
bridge: ClientBridge;
|
|
128
|
+
previewHost: StaticPreviewHost;
|
|
129
|
+
}) {
|
|
130
|
+
super({ appConfig, runtimeOrigin, serveOptions, options });
|
|
131
|
+
this.apiHandlers = apiHandlers || [];
|
|
132
|
+
this.staticRoutes = staticRoutes || [];
|
|
133
|
+
this.errorHandler = errorHandler;
|
|
134
|
+
this.bridge = bridge;
|
|
135
|
+
this.hmrManager = hmrManager;
|
|
136
|
+
this.previewHost = previewHost;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Returns whether adapter-level HTML responses still need HMR runtime injection.
|
|
141
|
+
*
|
|
142
|
+
* @remarks
|
|
143
|
+
* Filesystem-routed pages are wrapped later in the shared route layer. This
|
|
144
|
+
* adapter-level check exists for explicit API handlers that return HTML and
|
|
145
|
+
* would otherwise bypass the route wrapper entirely.
|
|
146
|
+
*/
|
|
147
|
+
private shouldInjectHmrScript(): boolean {
|
|
148
|
+
return shouldInjectHmrHtmlResponse(this.options?.watch === true, this.hmrManager);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Delegates the HTML-response test to the shared response helper used by both
|
|
153
|
+
* adapters.
|
|
154
|
+
*/
|
|
155
|
+
private isHtmlResponse(response: Response): boolean {
|
|
156
|
+
return isHtmlResponse(response);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Injects HMR script into HTML responses in development mode.
|
|
161
|
+
* Ensures explicit API handlers that return HTML get auto-reload capability.
|
|
162
|
+
*/
|
|
163
|
+
private async maybeInjectHmrScript(response: Response): Promise<Response> {
|
|
164
|
+
if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
|
|
165
|
+
return injectHmrRuntimeIntoHtmlResponse(response);
|
|
166
|
+
}
|
|
167
|
+
return response;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Initializes the server adapter's core runtime components.
|
|
172
|
+
*/
|
|
173
|
+
public async initialize(): Promise<void> {
|
|
174
|
+
installAppRuntimeBuildExecutor(this.appConfig);
|
|
175
|
+
|
|
176
|
+
this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
|
|
177
|
+
await this.hmrManager.buildRuntime();
|
|
178
|
+
this.prepareRuntimePublicDir();
|
|
179
|
+
|
|
180
|
+
const staticBuilderOptions = {
|
|
181
|
+
appConfig: this.appConfig,
|
|
182
|
+
staticSiteGenerator: this.staticSiteGenerator,
|
|
183
|
+
serveOptions: this.serveOptions,
|
|
184
|
+
apiHandlers: this.apiHandlers,
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
this.staticBuilder = new ServerStaticBuilder(staticBuilderOptions);
|
|
188
|
+
|
|
189
|
+
await this.initializeRuntimePlugins({ watch: this.options?.watch });
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Copies the source `public` directory into the runtime output and ensures the
|
|
194
|
+
* HMR assets directory exists before any runtime bundles are emitted.
|
|
195
|
+
*/
|
|
196
|
+
private prepareRuntimePublicDir(): void {
|
|
197
|
+
const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
|
|
198
|
+
|
|
199
|
+
if (fileSystem.exists(srcPublicDir)) {
|
|
200
|
+
fileSystem.copyDir(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Registers runtime plugins and propagates the final HMR manager into each
|
|
208
|
+
* integration.
|
|
209
|
+
*
|
|
210
|
+
* @remarks
|
|
211
|
+
* This is where Bun's runtime-plugin registration path meets the integration
|
|
212
|
+
* lifecycle. A failure here leaves the runtime partially bootstrapped, so the
|
|
213
|
+
* method logs the underlying error and rethrows instead of trying to limp on.
|
|
214
|
+
*/
|
|
215
|
+
private async initializeRuntimePlugins(options?: { watch?: boolean }): Promise<void> {
|
|
216
|
+
try {
|
|
217
|
+
this.hmrManager.setEnabled(Boolean(options?.watch));
|
|
218
|
+
|
|
219
|
+
await setupAppRuntimePlugins({
|
|
220
|
+
appConfig: this.appConfig,
|
|
221
|
+
runtimeOrigin: this.runtimeOrigin,
|
|
222
|
+
hmrManager: this.hmrManager,
|
|
223
|
+
onRuntimePlugin: (plugin) => {
|
|
224
|
+
Bun.plugin(plugin as any);
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
const browserBuildPlugins = getAppBrowserBuildPlugins(this.appConfig);
|
|
229
|
+
this.hmrManager.setPlugins(browserBuildPlugins);
|
|
230
|
+
|
|
231
|
+
for (const integration of this.appConfig.integrations) {
|
|
232
|
+
integration.setHmrManager(this.hmrManager);
|
|
233
|
+
}
|
|
234
|
+
} catch (error) {
|
|
235
|
+
appLogger.error(`Failed to initialize plugins: ${error instanceof Error ? error.message : String(error)}`);
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Rebuilds the shared routing state and hot-reloads the live Bun server when a
|
|
242
|
+
* watched route file changes.
|
|
243
|
+
*/
|
|
244
|
+
private async refreshRouterRoutes(): Promise<void> {
|
|
245
|
+
if (!this.serverInstance || typeof this.serverInstance.reload !== 'function') {
|
|
246
|
+
appLogger.error('Server instance is not available for reloading');
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
await this.createSharedWatchRefreshCallback({
|
|
251
|
+
staticRoutes: this.staticRoutes,
|
|
252
|
+
hmrManager: this.hmrManager,
|
|
253
|
+
onRoutesReady: () => {
|
|
254
|
+
const options = this.getServerOptions({ enableHmr: true });
|
|
255
|
+
this.serverInstance!.reload(options as BunNativeServeOptions);
|
|
256
|
+
appLogger.debug('Server routes updated with dynamic routes');
|
|
257
|
+
},
|
|
258
|
+
onError: (error) => {
|
|
259
|
+
this.hmrManager.broadcast({ type: 'error', message: error.message });
|
|
260
|
+
appLogger.error('Failed to refresh router routes:', error);
|
|
261
|
+
},
|
|
262
|
+
})();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
private async watch(): Promise<void> {
|
|
266
|
+
const watcher = new ProjectWatcher({
|
|
267
|
+
config: this.appConfig,
|
|
268
|
+
refreshRouterRoutesCallback: this.refreshRouterRoutes.bind(this),
|
|
269
|
+
hmrManager: this.hmrManager,
|
|
270
|
+
bridge: this.bridge,
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
await watcher.createWatcherSubscription();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Builds the `Bun.serve()` options for the current adapter state.
|
|
278
|
+
*
|
|
279
|
+
* @remarks
|
|
280
|
+
* The HMR-enabled variant wraps the base fetch handler so one Bun server can
|
|
281
|
+
* serve normal requests, accept HMR websocket upgrades, and expose the HMR
|
|
282
|
+
* runtime asset without splitting responsibility across separate listeners.
|
|
283
|
+
*/
|
|
284
|
+
public getServerOptions({ enableHmr = false } = {}): BunServeOptions {
|
|
285
|
+
appLogger.debug(`[BunServerAdapter] getServerOptions called with enableHmr: ${enableHmr}`);
|
|
286
|
+
const serverOptions = this.buildServerSettings();
|
|
287
|
+
|
|
288
|
+
if (enableHmr) {
|
|
289
|
+
const originalFetch = serverOptions.fetch;
|
|
290
|
+
const hmrHandler = this.hmrManager.getWebSocketHandler();
|
|
291
|
+
const hmrManager = this.hmrManager;
|
|
292
|
+
|
|
293
|
+
(serverOptions as any).development = true;
|
|
294
|
+
|
|
295
|
+
serverOptions.websocket = hmrHandler;
|
|
296
|
+
serverOptions.fetch = async function (
|
|
297
|
+
this: Server<unknown>,
|
|
298
|
+
request: Request,
|
|
299
|
+
_server: Server<unknown>,
|
|
300
|
+
): Promise<Response | void> {
|
|
301
|
+
const url = new URL(request.url);
|
|
302
|
+
appLogger.debug(`[HMR] Request: ${url.pathname}`);
|
|
303
|
+
|
|
304
|
+
/** Handle HMR WebSocket upgrade */
|
|
305
|
+
if (url.pathname === '/_hmr') {
|
|
306
|
+
const success = this.upgrade(request, {
|
|
307
|
+
data: undefined,
|
|
308
|
+
});
|
|
309
|
+
if (success) return;
|
|
310
|
+
return new Response('WebSocket upgrade failed', { status: 400 });
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/** Serve HMR runtime script */
|
|
314
|
+
if (url.pathname === '/_hmr_runtime.js') {
|
|
315
|
+
appLogger.debug(`[HMR] Serving runtime from ${hmrManager.getRuntimePath()}`);
|
|
316
|
+
return new Response(fileSystem.readFileAsBuffer(hmrManager.getRuntimePath()) as BodyInit, {
|
|
317
|
+
headers: { 'Content-Type': 'application/javascript' },
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Proceed with normal request handling */
|
|
322
|
+
let response: Response;
|
|
323
|
+
if (originalFetch) {
|
|
324
|
+
const res = await originalFetch.call(this, request, this);
|
|
325
|
+
response = res instanceof Response ? res : new Response('Not Found', { status: 404 });
|
|
326
|
+
} else {
|
|
327
|
+
response = new Response('Not Found', { status: 404 });
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return response;
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return serverOptions as BunServeOptions;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Helper method to retrieve and parse the request body.
|
|
339
|
+
* Handles JSON and plain text content types.
|
|
340
|
+
* For FormData (multipart/form-data, x-www-form-urlencoded), use ctx.request.formData() directly.
|
|
341
|
+
* Returns undefined for unsupported content types.
|
|
342
|
+
*/
|
|
343
|
+
private async retrieveBodyFromRequest(request: Request): Promise<unknown> {
|
|
344
|
+
const contentType = request.headers.get('Content-Type') || '';
|
|
345
|
+
|
|
346
|
+
if (contentType.includes('application/json')) {
|
|
347
|
+
return await request.json();
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (contentType.includes('text/plain')) {
|
|
351
|
+
return await request.text();
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Composes the base Bun server settings that all runtime modes build from.
|
|
359
|
+
*
|
|
360
|
+
* @remarks
|
|
361
|
+
* This method centralizes the Bun-specific error boundary. It preserves the
|
|
362
|
+
* shared route pipeline while still allowing adapter-level custom error-handler
|
|
363
|
+
* execution and `HttpError` passthrough.
|
|
364
|
+
*/
|
|
365
|
+
private buildServerSettings(): BunServeOptions {
|
|
366
|
+
const serverOptions = { ...this.serveOptions } as BunServeAdapterServerOptions;
|
|
367
|
+
const handleNoMatch = this.handleNoMatch.bind(this);
|
|
368
|
+
const waitForInit = this.waitForInitialization.bind(this);
|
|
369
|
+
const handleReq = this.handleRequest.bind(this);
|
|
370
|
+
const errorHandler = this.errorHandler;
|
|
371
|
+
const getCacheService = () => this.getCacheService();
|
|
372
|
+
const getRenderContext = () => this.getRenderContext();
|
|
373
|
+
|
|
374
|
+
appLogger.debug(`[BunServerAdapter] Building server settings`);
|
|
375
|
+
|
|
376
|
+
const finalOptions: BunServeOptions = {
|
|
377
|
+
...serverOptions,
|
|
378
|
+
async fetch(this: Server<unknown>, request: Request, _server: Server<unknown>) {
|
|
379
|
+
try {
|
|
380
|
+
await waitForInit();
|
|
381
|
+
return await handleReq(request);
|
|
382
|
+
} catch (error) {
|
|
383
|
+
if (error instanceof Response) return error;
|
|
384
|
+
if (errorHandler) {
|
|
385
|
+
try {
|
|
386
|
+
const locals: Record<string, unknown> = {};
|
|
387
|
+
const context: ApiHandlerContext<Request, BunServerInstance> = {
|
|
388
|
+
request,
|
|
389
|
+
params: {},
|
|
390
|
+
response: new ApiResponseBuilder(),
|
|
391
|
+
server: _server as BunServerInstance,
|
|
392
|
+
locals,
|
|
393
|
+
require: createRequire((): Record<string, unknown> => locals),
|
|
394
|
+
services: {
|
|
395
|
+
cache: getCacheService(),
|
|
396
|
+
},
|
|
397
|
+
...getRenderContext(),
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
return await errorHandler(error, context);
|
|
401
|
+
} catch (handlerError) {
|
|
402
|
+
appLogger.error(`[ecopages] Error in custom error handler: ${handlerError}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (error instanceof HttpError) return error.toResponse();
|
|
406
|
+
|
|
407
|
+
appLogger.error(`[ecopages] Error handling request: ${error}`);
|
|
408
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
error(this: Server<unknown>, error: Error) {
|
|
412
|
+
appLogger.error(`[ecopages] Error handling request: ${error}`);
|
|
413
|
+
return handleNoMatch(new Request('http://localhost'));
|
|
414
|
+
},
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
return finalOptions as unknown as BunServeOptions;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Generates a static build of the site for deployment.
|
|
422
|
+
* @param options.preview - If true, starts a preview server after build
|
|
423
|
+
*/
|
|
424
|
+
public async buildStatic(options?: { preview?: boolean }): Promise<void> {
|
|
425
|
+
if (!this.fullyInitialized) {
|
|
426
|
+
await this.initializeSharedRouteHandling({
|
|
427
|
+
staticRoutes: this.staticRoutes,
|
|
428
|
+
hmrManager: this.hmrManager,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const buildRuntimeOrigin = this.serverInstance
|
|
433
|
+
? `http://${this.serverInstance.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${this.serverInstance.port || DEFAULT_ECOPAGES_PORT}`
|
|
434
|
+
: undefined;
|
|
435
|
+
|
|
436
|
+
await this.staticBuilder.build(
|
|
437
|
+
{ ...options, preview: false, baseUrl: buildRuntimeOrigin },
|
|
438
|
+
{
|
|
439
|
+
router: this.router,
|
|
440
|
+
routeRendererFactory: this.routeRendererFactory,
|
|
441
|
+
staticRoutes: this.staticRoutes,
|
|
442
|
+
},
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
if (!options?.preview) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
|
|
450
|
+
const previewPort = Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT);
|
|
451
|
+
const activePreviewPort = await this.previewHost.start({
|
|
452
|
+
appConfig: this.appConfig,
|
|
453
|
+
hostname: String(previewHostname),
|
|
454
|
+
port: previewPort,
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
if (activePreviewPort) {
|
|
458
|
+
appLogger.info(`Preview running at http://${previewHostname}:${activePreviewPort}`);
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Initializes the server with dynamic routes after server creation.
|
|
465
|
+
* Must be called before handling any requests.
|
|
466
|
+
* @param server - The Bun server instance
|
|
467
|
+
*/
|
|
468
|
+
public async completeInitialization(server?: BunServerInstance | null): Promise<void> {
|
|
469
|
+
if (this.fullyInitialized) {
|
|
470
|
+
if (server && !this.serverInstance) {
|
|
471
|
+
this.serverInstance = server;
|
|
472
|
+
}
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
if (!this.initializationPromise) {
|
|
477
|
+
this.initializationPromise = this._performInitialization(server ?? null);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
return this.initializationPromise;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Performs the one-time post-bind initialization path for Bun servers.
|
|
485
|
+
*
|
|
486
|
+
* @remarks
|
|
487
|
+
* This is intentionally split from `initialize()` because shared route handling
|
|
488
|
+
* and file watching need the live server instance to exist before Bun can
|
|
489
|
+
* reload updated route handlers in place.
|
|
490
|
+
*/
|
|
491
|
+
private async _performInitialization(server: BunServerInstance | null): Promise<void> {
|
|
492
|
+
this.serverInstance = server;
|
|
493
|
+
appLogger.debug('Completing server initialization with dynamic routes');
|
|
494
|
+
|
|
495
|
+
await this.initializeSharedRouteHandling({
|
|
496
|
+
staticRoutes: this.staticRoutes,
|
|
497
|
+
hmrManager: this.hmrManager,
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
this.fullyInitialized = true;
|
|
501
|
+
|
|
502
|
+
if (this.options?.watch) await this.watch();
|
|
503
|
+
|
|
504
|
+
if (server && typeof server.reload === 'function') {
|
|
505
|
+
const updatedOptions = this.getServerOptions(this.options?.watch ? { enableHmr: true } : undefined);
|
|
506
|
+
server.reload(updatedOptions as BunNativeServeOptions);
|
|
507
|
+
appLogger.debug('Server routes updated with dynamic routes');
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Creates and initializes the Bun server adapter.
|
|
513
|
+
* @returns Configured adapter with server methods
|
|
514
|
+
*/
|
|
515
|
+
public async createAdapter(): Promise<BunServerAdapterResult> {
|
|
516
|
+
await this.initialize();
|
|
517
|
+
|
|
518
|
+
return {
|
|
519
|
+
getServerOptions: this.getServerOptions.bind(this),
|
|
520
|
+
buildStatic: this.buildStatic.bind(this),
|
|
521
|
+
completeInitialization: this.completeInitialization.bind(this),
|
|
522
|
+
handleRequest: this.handleRequest.bind(this),
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Handles HTTP requests by passing them securely to the shared core router adapter.
|
|
528
|
+
*
|
|
529
|
+
* @remarks
|
|
530
|
+
* Filesystem page responses are wrapped by `ServerRouteHandler`. This
|
|
531
|
+
* adapter-level pass only covers HTML returned by explicit API handlers,
|
|
532
|
+
* which bypass that route-layer wrapper and would otherwise miss the
|
|
533
|
+
* dev HMR runtime — so the HMR script injection happens here, after
|
|
534
|
+
* the shared handler runs.
|
|
535
|
+
*/
|
|
536
|
+
public async handleRequest(request: Request): Promise<Response> {
|
|
537
|
+
const response = await this.handleSharedRequest(request, {
|
|
538
|
+
apiHandlers: this.apiHandlers,
|
|
539
|
+
errorHandler: this.errorHandler,
|
|
540
|
+
serverInstance: this.serverInstance,
|
|
541
|
+
hmrManager: this.hmrManager,
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
return await this.maybeInjectHmrScript(response);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Ensures server initialization completes before request handling.
|
|
549
|
+
* Prevents race conditions during startup.
|
|
550
|
+
*/
|
|
551
|
+
private async waitForInitialization(): Promise<void> {
|
|
552
|
+
if (this.fullyInitialized) {
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
if (this.initializationPromise) {
|
|
557
|
+
return this.initializationPromise;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
throw new Error('Server not initialized. Call completeInitialization() first.');
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Handles HTTP requests from the router adapter.
|
|
565
|
+
*/
|
|
566
|
+
public async handleResponse(request: Request): Promise<Response> {
|
|
567
|
+
await this.waitForInitialization();
|
|
568
|
+
return this.routeHandler.handleResponse(request);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Handles requests that do not match any routes.
|
|
573
|
+
*/
|
|
574
|
+
private async handleNoMatch(request: Request): Promise<Response> {
|
|
575
|
+
await this.waitForInitialization();
|
|
576
|
+
return this.routeHandler.handleNoMatch(request);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* Creates the Bun server adapter and fills in the runtime-specific collaborators
|
|
582
|
+
* that Bun callers usually leave implicit.
|
|
583
|
+
*
|
|
584
|
+
* @remarks
|
|
585
|
+
* This is the canonical entry point for Bun server-adapter construction. It
|
|
586
|
+
* guarantees that the concrete adapter receives a Bun websocket bridge, HMR
|
|
587
|
+
* manager, and preview host even though those dependencies are optional on the
|
|
588
|
+
* public params type.
|
|
589
|
+
*/
|
|
590
|
+
export async function createBunServerAdapter(params: BunServerAdapterParams): Promise<BunServerAdapterResult> {
|
|
591
|
+
const runtimeOrigin = params.runtimeOrigin ?? resolveServeRuntimeOrigin(params.serveOptions);
|
|
592
|
+
const bridge = params.bridge ?? new ClientBridge();
|
|
593
|
+
const hmrManager = params.hmrManager ?? new HmrManager({ appConfig: params.appConfig, bridge });
|
|
594
|
+
const previewHost = params.previewHost ?? new BunStaticPreviewHost();
|
|
595
|
+
|
|
596
|
+
const adapter = new BunServerAdapter({
|
|
597
|
+
...params,
|
|
598
|
+
runtimeOrigin,
|
|
599
|
+
bridge,
|
|
600
|
+
hmrManager,
|
|
601
|
+
previewHost,
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
return adapter.createAdapter();
|
|
605
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { StaticContentServer } from '../../dev/sc-server.ts';
|
|
2
|
+
import { appLogger } from '../../global/app-logger.ts';
|
|
3
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.ts';
|
|
4
|
+
import type { StaticPreviewHost, StaticPreviewHostStartOptions } from '../shared/static-preview-host.ts';
|
|
5
|
+
|
|
6
|
+
type BunStaticPreviewServer = {
|
|
7
|
+
server: {
|
|
8
|
+
port?: number;
|
|
9
|
+
} | null;
|
|
10
|
+
stop(): void;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type BunStaticPreviewServerFactory = {
|
|
14
|
+
createServer(args: { appConfig: EcoPagesAppConfig; options: { port: number } }): BunStaticPreviewServer;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type BunStaticPreviewLogger = {
|
|
18
|
+
error(message: string): unknown;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export class BunStaticPreviewHost implements StaticPreviewHost {
|
|
22
|
+
private previewServer: BunStaticPreviewServer | null = null;
|
|
23
|
+
|
|
24
|
+
constructor(
|
|
25
|
+
private readonly previewServerFactory: BunStaticPreviewServerFactory = StaticContentServer,
|
|
26
|
+
private readonly logger: BunStaticPreviewLogger = appLogger,
|
|
27
|
+
) {}
|
|
28
|
+
|
|
29
|
+
public async start(options: StaticPreviewHostStartOptions): Promise<number | null> {
|
|
30
|
+
await this.stop();
|
|
31
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
32
|
+
|
|
33
|
+
for (let attempt = 0; attempt < 20; attempt += 1) {
|
|
34
|
+
try {
|
|
35
|
+
this.previewServer = this.previewServerFactory.createServer({
|
|
36
|
+
appConfig: options.appConfig,
|
|
37
|
+
options: { port: options.port },
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const previewPort = this.previewServer.server?.port;
|
|
41
|
+
if (previewPort) {
|
|
42
|
+
return previewPort;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
break;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
48
|
+
const errorCode =
|
|
49
|
+
typeof error === 'object' && error !== null && 'code' in error
|
|
50
|
+
? String((error as { code?: unknown }).code)
|
|
51
|
+
: undefined;
|
|
52
|
+
const isPortReleaseRace = errorCode === 'EADDRINUSE' || errorMessage.includes('EADDRINUSE');
|
|
53
|
+
|
|
54
|
+
if (!isPortReleaseRace || attempt === 19) {
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
this.logger.error('Failed to start preview server');
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public async stop(): Promise<void> {
|
|
67
|
+
this.previewServer?.stop();
|
|
68
|
+
this.previewServer = null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createApp } from './create-app.ts';
|
|
3
|
+
|
|
4
|
+
describe('createApp', () => {
|
|
5
|
+
it('falls back to Node adapter when Bun is not available', async () => {
|
|
6
|
+
const app = await createApp({ appConfig: {} as never });
|
|
7
|
+
expect(app).toBeDefined();
|
|
8
|
+
expect(typeof app.fetch).toBe('function');
|
|
9
|
+
});
|
|
10
|
+
});
|