@ecopages/core 0.2.0-alpha.9 → 0.2.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -28
- package/package.json +94 -116
- package/src/adapters/README.md +2 -2
- package/src/adapters/abstract/application-adapter.d.ts +28 -2
- package/src/adapters/abstract/application-adapter.js +14 -2
- package/src/adapters/abstract/router-adapter.d.ts +1 -1
- package/src/adapters/abstract/server-adapter.d.ts +2 -2
- package/src/adapters/bun/client-bridge.d.ts +1 -1
- package/src/adapters/bun/create-app.d.ts +12 -12
- package/src/adapters/bun/create-app.js +64 -41
- package/src/adapters/bun/hmr-manager.d.ts +19 -115
- package/src/adapters/bun/hmr-manager.js +25 -301
- package/src/adapters/bun/index.d.ts +1 -1
- package/src/adapters/bun/index.js +2 -2
- package/src/adapters/bun/runtime-host.d.ts +52 -0
- package/src/adapters/bun/runtime-host.js +56 -0
- package/src/adapters/bun/server-adapter.d.ts +100 -32
- package/src/adapters/bun/server-adapter.js +142 -65
- package/src/adapters/bun/static-preview-host.d.ts +28 -0
- package/src/adapters/bun/static-preview-host.js +45 -0
- package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
- package/src/{create-app.js → adapters/create-app.js} +4 -4
- package/src/adapters/index.d.ts +1 -5
- package/src/adapters/index.js +1 -7
- package/src/adapters/node/create-app.d.ts +15 -12
- package/src/adapters/node/create-app.js +34 -85
- package/src/adapters/node/http-request-bridge.d.ts +57 -0
- package/src/adapters/node/http-request-bridge.js +118 -0
- package/src/adapters/node/node-client-bridge.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.d.ts +22 -103
- package/src/adapters/node/node-hmr-manager.js +26 -289
- package/src/adapters/node/runtime-host.d.ts +57 -0
- package/src/adapters/node/runtime-host.js +92 -0
- package/src/adapters/node/server-adapter-dependencies.d.ts +19 -0
- package/src/adapters/node/server-adapter-dependencies.js +18 -0
- package/src/adapters/node/server-adapter.d.ts +19 -42
- package/src/adapters/node/server-adapter.js +94 -139
- package/src/adapters/node/static-content-server.d.ts +1 -1
- package/src/adapters/node/static-content-server.js +1 -1
- package/src/adapters/node/static-preview-host.d.ts +55 -0
- package/src/adapters/node/static-preview-host.js +68 -0
- package/src/adapters/shared/application-adapter.d.ts +1 -1
- package/src/adapters/shared/define-api-handler.d.ts +1 -1
- package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
- package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
- package/src/adapters/shared/explicit-static-route-matcher.js +14 -16
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
- package/src/adapters/shared/file-route-middleware-pipeline.js +2 -11
- package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
- package/src/adapters/shared/fs-server-response-factory.js +11 -27
- package/src/adapters/shared/fs-server-response-matcher.d.ts +18 -18
- package/src/adapters/shared/fs-server-response-matcher.js +72 -46
- package/src/adapters/shared/hmr-entrypoint-registrar.js +1 -1
- package/src/adapters/shared/hmr-html-response.d.ts +1 -1
- package/src/adapters/shared/hmr-html-response.js +4 -3
- package/src/adapters/shared/render-context.d.ts +5 -3
- package/src/adapters/shared/render-context.js +24 -1
- package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
- package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
- package/src/adapters/shared/runtime-host.d.ts +12 -0
- package/src/adapters/shared/server-adapter.d.ts +22 -11
- package/src/adapters/shared/server-adapter.js +183 -133
- package/src/adapters/shared/server-route-handler.d.ts +5 -5
- package/src/adapters/shared/server-route-handler.js +4 -4
- package/src/adapters/shared/server-static-builder.d.ts +8 -7
- package/src/adapters/shared/server-static-builder.js +6 -5
- package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
- package/src/adapters/shared/shared-hmr-manager.js +241 -0
- package/src/adapters/shared/static-preview-host.d.ts +10 -0
- package/src/build/README.md +57 -67
- package/src/build/browser-runtime-manifest.d.ts +31 -0
- package/src/build/browser-runtime-manifest.js +61 -0
- package/src/build/browser-runtime-plugin-helpers.d.ts +26 -0
- package/src/build/browser-runtime-plugin-helpers.js +14 -0
- package/src/build/browser-runtime-plugin.d.ts +78 -0
- package/src/build/browser-runtime-plugin.js +173 -0
- package/src/build/build-adapter.d.ts +384 -63
- package/src/build/build-adapter.js +129 -54
- package/src/build/build-manifest.d.ts +6 -0
- package/src/build/build-manifest.js +21 -2
- package/src/build/build-types.d.ts +2 -2
- package/src/build/rolldown-adapter-helpers.d.ts +58 -0
- package/src/build/rolldown-adapter-helpers.js +265 -0
- package/src/build/rolldown-build-adapter.d.ts +28 -0
- package/src/build/rolldown-build-adapter.js +65 -0
- package/src/build/rolldown-dev-build-adapter.d.ts +82 -0
- package/src/build/rolldown-dev-build-adapter.js +166 -0
- package/src/build/rolldown-plugin-bridge.d.ts +59 -0
- package/src/build/rolldown-plugin-bridge.js +199 -0
- package/src/build/runtime-build-executor.d.ts +15 -7
- package/src/build/runtime-build-executor.js +8 -9
- package/src/build/runtime-build-output-normalizer.d.ts +3 -0
- package/src/build/runtime-build-output-normalizer.js +111 -0
- package/src/build/serialized-build-executor.d.ts +64 -0
- package/src/build/serialized-build-executor.js +63 -0
- package/src/build/server-side-css-shim-plugin.d.ts +41 -0
- package/src/build/server-side-css-shim-plugin.js +35 -0
- package/src/cache/index.d.ts +6 -0
- package/src/cache/index.js +6 -0
- package/src/cache/module-parse-cache.d.ts +65 -0
- package/src/cache/module-parse-cache.js +75 -0
- package/src/config/README.md +5 -2
- package/src/config/config-builder.d.ts +41 -13
- package/src/config/config-builder.js +62 -24
- package/src/declarations.d.ts +1 -1
- package/src/dev/host-runtime.d.ts +10 -0
- package/src/dev/host-runtime.js +24 -0
- package/src/dev/sc-server.d.ts +1 -1
- package/src/dev/sc-server.js +1 -1
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +88 -0
- package/src/eco/eco.js +50 -45
- package/src/eco/eco.types.d.ts +60 -8
- package/src/eco/eco.utils.d.ts +1 -40
- package/src/eco/eco.utils.js +5 -35
- package/src/eco/global-injector-map.d.ts +3 -3
- package/src/eco/global-injector-map.js +2 -2
- package/src/eco/lazy-injector-map.d.ts +2 -2
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +3 -1
- package/src/hmr/client/hmr-runtime.js +9 -1
- package/src/hmr/hmr-strategy.d.ts +16 -13
- package/src/hmr/hmr-strategy.js +22 -7
- package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
- package/src/hmr/strategies/default-hmr-strategy.js +1 -1
- package/src/hmr/strategies/js-hmr-strategy.d.ts +4 -9
- package/src/hmr/strategies/js-hmr-strategy.js +5 -10
- package/src/index.browser.d.ts +2 -2
- package/src/index.browser.js +1 -1
- package/src/index.d.ts +3 -2
- package/src/index.js +15 -4
- package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -1
- package/src/integrations/ghtml/ghtml-renderer.js +24 -29
- package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
- package/src/integrations/ghtml/ghtml.constants.js +4 -0
- package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
- package/src/integrations/ghtml/ghtml.plugin.js +3 -4
- package/src/plugins/README.md +1 -0
- package/src/plugins/alias-resolver-cache.d.ts +68 -0
- package/src/plugins/alias-resolver-cache.js +106 -0
- package/src/plugins/alias-resolver-plugin.d.ts +5 -1
- package/src/plugins/alias-resolver-plugin.js +19 -7
- package/src/plugins/eco-component-meta-plugin.d.ts +12 -1
- package/src/plugins/eco-component-meta-plugin.js +43 -25
- package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
- package/src/plugins/foreign-jsx-override-plugin.js +41 -0
- package/src/plugins/integration-plugin.d.ts +136 -42
- package/src/plugins/integration-plugin.js +99 -31
- package/src/plugins/processor.d.ts +4 -2
- package/src/plugins/processor.js +8 -3
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/GRAPH.md +80 -318
- package/src/route-renderer/README.md +74 -78
- package/src/route-renderer/orchestration/component-render-context.d.ts +97 -0
- package/src/route-renderer/orchestration/component-render-context.js +147 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +110 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +290 -128
- package/src/route-renderer/orchestration/integration-renderer.js +660 -258
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
- package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
- package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +3 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -0
- package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
- package/src/route-renderer/orchestration/render-output.utils.js +171 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +156 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.js +577 -0
- package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
- package/src/route-renderer/orchestration/template-serialization.js +45 -0
- package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
- package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
- package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
- package/src/route-renderer/page-loading/dependency-resolver.d.ts +2 -2
- package/src/route-renderer/page-loading/dependency-resolver.js +27 -354
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
- package/src/route-renderer/page-loading/page-module-loader.d.ts +7 -4
- package/src/route-renderer/page-loading/page-module-loader.js +8 -5
- package/src/route-renderer/route-renderer.d.ts +31 -23
- package/src/route-renderer/route-renderer.js +17 -24
- package/src/router/README.md +76 -8
- package/src/router/client/navigation-coordinator.d.ts +20 -0
- package/src/router/client/navigation-coordinator.js +2 -2
- package/src/router/server/route-registry.d.ts +78 -0
- package/src/router/server/route-registry.js +262 -0
- package/src/services/README.md +1 -2
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +3 -20
- package/src/services/assets/asset-processing-service/asset-processing.service.js +52 -98
- package/src/services/assets/asset-processing-service/asset.factory.d.ts +1 -1
- package/src/services/assets/asset-processing-service/asset.factory.js +2 -2
- package/src/services/assets/asset-processing-service/assets.types.d.ts +14 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
- package/src/services/assets/asset-processing-service/index.d.ts +6 -5
- package/src/services/assets/asset-processing-service/index.js +6 -5
- package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
- package/src/services/assets/asset-processing-service/page-package.js +80 -0
- package/src/services/assets/asset-processing-service/processor.interface.d.ts +2 -2
- package/src/services/assets/asset-processing-service/processor.registry.d.ts +2 -2
- package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +1 -1
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +3 -2
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +10 -5
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +69 -5
- package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -5
- package/src/services/assets/asset-processing-service/processors/index.js +5 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +3 -2
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +66 -3
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +4 -3
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +27 -6
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +38 -3
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +57 -6
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +39 -5
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +5 -2
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
- package/src/services/assets/browser-bundle.service.d.ts +44 -3
- package/src/services/assets/browser-bundle.service.js +15 -7
- package/src/services/html/html-rewriter-provider.service.d.ts +3 -0
- package/src/services/html/html-rewriter-provider.service.js +4 -1
- package/src/services/html/html-transformer.service.d.ts +22 -3
- package/src/services/html/html-transformer.service.js +101 -35
- package/src/services/invalidation/development-invalidation.service.d.ts +1 -1
- package/src/services/invalidation/development-invalidation.service.js +1 -0
- package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
- package/src/services/module-loading/app-module-loader.service.js +0 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +9 -1
- package/src/services/module-loading/app-server-module-transpiler.service.js +102 -6
- package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
- package/src/services/module-loading/host-module-loader-registry.js +15 -0
- package/src/services/module-loading/module-loading-types.d.ts +2 -0
- package/src/services/module-loading/module-loading-types.js +0 -0
- package/src/services/module-loading/page-module-import.service.d.ts +32 -8
- package/src/services/module-loading/page-module-import.service.js +83 -22
- package/src/services/module-loading/server-module-transpiler.service.d.ts +8 -14
- package/src/services/module-loading/server-module-transpiler.service.js +5 -2
- package/src/services/module-loading/source-module-support.d.ts +5 -0
- package/src/services/module-loading/source-module-support.js +8 -0
- package/src/services/runtime-state/dev-graph.service.d.ts +6 -6
- package/src/services/runtime-state/dev-graph.service.js +10 -10
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +1 -1
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +1 -1
- package/src/static-site-generator/static-site-generator.d.ts +23 -28
- package/src/static-site-generator/static-site-generator.js +119 -156
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +34 -23
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +195 -37
- package/src/types/public-types.js +0 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +6 -0
- package/src/utils/locals-utils.d.ts +1 -1
- package/src/utils/parse-cli-args.d.ts +4 -1
- package/src/utils/parse-cli-args.js +16 -1
- package/src/utils/resolve-work-dir.js +1 -1
- package/src/watchers/project-watcher.d.ts +4 -4
- package/src/watchers/project-watcher.js +35 -41
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +5 -5
- package/CHANGELOG.md +0 -31
- package/src/adapters/abstract/application-adapter.ts +0 -337
- package/src/adapters/abstract/router-adapter.ts +0 -30
- package/src/adapters/abstract/server-adapter.ts +0 -79
- package/src/adapters/bun/client-bridge.ts +0 -62
- package/src/adapters/bun/create-app.ts +0 -189
- package/src/adapters/bun/hmr-manager.ts +0 -409
- package/src/adapters/bun/index.ts +0 -2
- package/src/adapters/bun/server-adapter.ts +0 -499
- package/src/adapters/bun/server-lifecycle.d.ts +0 -63
- package/src/adapters/bun/server-lifecycle.js +0 -92
- package/src/adapters/bun/server-lifecycle.ts +0 -124
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/bootstrap-dependency-resolver.d.ts +0 -44
- package/src/adapters/node/bootstrap-dependency-resolver.js +0 -172
- package/src/adapters/node/bootstrap-dependency-resolver.ts +0 -301
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.d.ts +0 -6
- package/src/adapters/node/index.js +0 -11
- package/src/adapters/node/index.ts +0 -16
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -381
- package/src/adapters/node/runtime-adapter.d.ts +0 -46
- package/src/adapters/node/runtime-adapter.js +0 -306
- package/src/adapters/node/runtime-adapter.ts +0 -439
- package/src/adapters/node/server-adapter.ts +0 -488
- package/src/adapters/node/static-content-server.ts +0 -239
- package/src/adapters/node/write-runtime-manifest.d.ts +0 -26
- package/src/adapters/node/write-runtime-manifest.js +0 -12
- package/src/adapters/node/write-runtime-manifest.ts +0 -38
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/define-api-handler.ts +0 -66
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -140
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -127
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -205
- package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
- package/src/adapters/shared/hmr-html-response.ts +0 -52
- package/src/adapters/shared/render-context.ts +0 -120
- package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
- package/src/adapters/shared/runtime-bootstrap.js +0 -43
- package/src/adapters/shared/runtime-bootstrap.ts +0 -79
- package/src/adapters/shared/server-adapter.ts +0 -489
- package/src/adapters/shared/server-route-handler.ts +0 -153
- package/src/adapters/shared/server-static-builder.ts +0 -166
- package/src/build/build-adapter.ts +0 -361
- package/src/build/build-manifest.ts +0 -54
- package/src/build/build-types.ts +0 -83
- package/src/build/dev-build-coordinator.d.ts +0 -74
- package/src/build/dev-build-coordinator.js +0 -161
- package/src/build/dev-build-coordinator.ts +0 -221
- package/src/build/esbuild-build-adapter.d.ts +0 -72
- package/src/build/esbuild-build-adapter.js +0 -422
- package/src/build/esbuild-build-adapter.ts +0 -559
- package/src/build/runtime-build-executor.ts +0 -34
- package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
- package/src/build/runtime-specifier-alias-plugin.js +0 -31
- package/src/build/runtime-specifier-alias-plugin.ts +0 -58
- package/src/config/config-builder.ts +0 -706
- package/src/constants.ts +0 -54
- package/src/create-app.ts +0 -87
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -87
- package/src/eco/component-render-context.ts +0 -224
- package/src/eco/eco.ts +0 -242
- package/src/eco/eco.types.ts +0 -221
- package/src/eco/eco.utils.ts +0 -89
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -2
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- package/src/hmr/client/hmr-runtime.ts +0 -152
- package/src/hmr/hmr-strategy.ts +0 -172
- package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
- package/src/hmr/hmr.test.e2e.ts +0 -66
- package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -96
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -232
- package/src/plugins/alias-resolver-plugin.ts +0 -63
- package/src/plugins/eco-component-meta-plugin.ts +0 -481
- package/src/plugins/integration-plugin.ts +0 -226
- package/src/plugins/processor.ts +0 -240
- package/src/plugins/runtime-capability.ts +0 -14
- package/src/public-types.ts +0 -1317
- package/src/route-renderer/component-graph/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph/component-graph.js +0 -72
- package/src/route-renderer/component-graph/component-graph.ts +0 -159
- package/src/route-renderer/component-graph/component-marker.d.ts +0 -52
- package/src/route-renderer/component-graph/component-marker.js +0 -46
- package/src/route-renderer/component-graph/component-marker.ts +0 -117
- package/src/route-renderer/component-graph/component-reference.d.ts +0 -10
- package/src/route-renderer/component-graph/component-reference.js +0 -19
- package/src/route-renderer/component-graph/component-reference.ts +0 -29
- package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +0 -77
- package/src/route-renderer/component-graph/marker-graph-resolver.js +0 -95
- package/src/route-renderer/component-graph/marker-graph-resolver.ts +0 -155
- package/src/route-renderer/orchestration/integration-renderer.ts +0 -790
- package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -103
- package/src/route-renderer/orchestration/render-execution.service.js +0 -121
- package/src/route-renderer/orchestration/render-execution.service.ts +0 -230
- package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -121
- package/src/route-renderer/orchestration/render-preparation.service.js +0 -332
- package/src/route-renderer/orchestration/render-preparation.service.ts +0 -476
- package/src/route-renderer/page-loading/dependency-resolver.ts +0 -612
- package/src/route-renderer/page-loading/page-module-loader.ts +0 -181
- package/src/route-renderer/route-renderer.ts +0 -115
- package/src/router/client/link-intent.test.browser.ts +0 -51
- package/src/router/client/link-intent.ts +0 -92
- package/src/router/client/navigation-coordinator.ts +0 -433
- package/src/router/server/fs-router-scanner.d.ts +0 -41
- package/src/router/server/fs-router-scanner.js +0 -156
- package/src/router/server/fs-router-scanner.ts +0 -219
- package/src/router/server/fs-router.d.ts +0 -26
- package/src/router/server/fs-router.js +0 -100
- package/src/router/server/fs-router.ts +0 -122
- package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -401
- package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/assets/asset-processing-service/assets.types.ts +0 -113
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -95
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
- package/src/services/assets/asset-processing-service/index.ts +0 -5
- package/src/services/assets/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -82
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -95
- package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -85
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -80
- package/src/services/assets/browser-bundle.service.ts +0 -53
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
- package/src/services/html/html-rewriter-provider.service.ts +0 -103
- package/src/services/html/html-transformer.service.ts +0 -279
- package/src/services/invalidation/development-invalidation.service.ts +0 -261
- package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -52
- package/src/services/module-loading/page-module-import.service.ts +0 -200
- package/src/services/module-loading/server-loader.service.d.ts +0 -96
- package/src/services/module-loading/server-loader.service.js +0 -32
- package/src/services/module-loading/server-loader.service.ts +0 -130
- package/src/services/module-loading/server-module-transpiler.service.ts +0 -105
- package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +0 -35
- package/src/services/runtime-manifest/node-runtime-manifest.service.js +0 -60
- package/src/services/runtime-manifest/node-runtime-manifest.service.ts +0 -101
- package/src/services/runtime-state/dev-graph.service.ts +0 -217
- package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
- package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +0 -69
- package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
- package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
- package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
- package/src/services/validation/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -462
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/resolve-work-dir.ts +0 -45
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/watchers/project-watcher.test-helpers.ts +0 -41
- package/src/watchers/project-watcher.ts +0 -363
- /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
- /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
- /package/src/{constants.d.ts → config/constants.d.ts} +0 -0
- /package/src/{constants.js → config/constants.js} +0 -0
|
@@ -1,38 +1,57 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
4
|
+
import { getAppBrowserBuildPlugins, setupAppRuntimePlugins } from "../../build/build-adapter.js";
|
|
5
|
+
import { installAppRuntimeBuildExecutor } from "../../build/runtime-build-executor.js";
|
|
6
|
+
import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
|
|
2
7
|
import { appLogger } from "../../global/app-logger.js";
|
|
3
8
|
import { NodeClientBridge } from "./node-client-bridge.js";
|
|
4
9
|
import { NodeHmrManager } from "./node-hmr-manager.js";
|
|
10
|
+
import { ProjectWatcher } from "../../watchers/project-watcher.js";
|
|
5
11
|
import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
|
|
6
12
|
import { SharedServerAdapter } from "../shared/server-adapter.js";
|
|
7
13
|
import { ServerStaticBuilder } from "../shared/server-static-builder.js";
|
|
14
|
+
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
|
|
8
15
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from "
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
constructor() {
|
|
18
|
-
super("Client closed the request");
|
|
19
|
-
this.name = "ClientAbortError";
|
|
20
|
-
}
|
|
21
|
-
}
|
|
16
|
+
injectHmrRuntimeIntoHtmlResponse,
|
|
17
|
+
isHtmlResponse,
|
|
18
|
+
shouldInjectHmrHtmlResponse
|
|
19
|
+
} from "../shared/hmr-html-response.js";
|
|
20
|
+
import { resolveServeRuntimeOrigin } from "../shared/runtime-app-bootstrap.js";
|
|
21
|
+
import { NodeClientAbortError, NodeHttpRequestBridge } from "./http-request-bridge.js";
|
|
22
|
+
import { NodeStaticPreviewHost } from "./static-preview-host.js";
|
|
23
|
+
import { DefaultNodeServerDevRuntimeFactory } from "./server-adapter-dependencies.js";
|
|
22
24
|
class NodeServerAdapter extends SharedServerAdapter {
|
|
23
25
|
serverInstance = null;
|
|
24
26
|
initialized = false;
|
|
25
27
|
apiHandlers;
|
|
26
28
|
staticRoutes;
|
|
27
29
|
errorHandler;
|
|
28
|
-
previewServer = null;
|
|
29
30
|
bridge = null;
|
|
30
31
|
hmrManager = null;
|
|
32
|
+
previewHost;
|
|
33
|
+
requestBridge;
|
|
34
|
+
devRuntimeFactory;
|
|
35
|
+
shouldInjectHmrScript() {
|
|
36
|
+
return shouldInjectHmrHtmlResponse(this.options?.watch === true, this.hmrManager ?? void 0);
|
|
37
|
+
}
|
|
38
|
+
isHtmlResponse(response) {
|
|
39
|
+
return isHtmlResponse(response);
|
|
40
|
+
}
|
|
41
|
+
async maybeInjectHmrScript(response) {
|
|
42
|
+
if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
|
|
43
|
+
return injectHmrRuntimeIntoHtmlResponse(response);
|
|
44
|
+
}
|
|
45
|
+
return response;
|
|
46
|
+
}
|
|
31
47
|
constructor(options) {
|
|
32
48
|
super(options);
|
|
33
49
|
this.apiHandlers = options.apiHandlers || [];
|
|
34
50
|
this.staticRoutes = options.staticRoutes || [];
|
|
35
51
|
this.errorHandler = options.errorHandler;
|
|
52
|
+
this.previewHost = options.previewHost;
|
|
53
|
+
this.requestBridge = options.requestBridge;
|
|
54
|
+
this.devRuntimeFactory = options.devRuntimeFactory;
|
|
36
55
|
}
|
|
37
56
|
/**
|
|
38
57
|
* Prepares the adapter for use.
|
|
@@ -48,11 +67,9 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
48
67
|
* processors during their `setup()` calls.
|
|
49
68
|
*/
|
|
50
69
|
async initialize() {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
prepareSharedRuntimePublicDir(this.appConfig);
|
|
55
|
-
await initializeSharedRuntimePlugins({
|
|
70
|
+
installAppRuntimeBuildExecutor(this.appConfig);
|
|
71
|
+
this.prepareRuntimePublicDir();
|
|
72
|
+
await setupAppRuntimePlugins({
|
|
56
73
|
appConfig: this.appConfig,
|
|
57
74
|
runtimeOrigin: this.runtimeOrigin,
|
|
58
75
|
hmrManager: this.hmrManager ?? void 0
|
|
@@ -70,6 +87,13 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
70
87
|
});
|
|
71
88
|
this.initialized = true;
|
|
72
89
|
}
|
|
90
|
+
prepareRuntimePublicDir() {
|
|
91
|
+
const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
|
|
92
|
+
if (fileSystem.exists(srcPublicDir)) {
|
|
93
|
+
fileSystem.copyDir(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
|
|
94
|
+
}
|
|
95
|
+
fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
|
|
96
|
+
}
|
|
73
97
|
getServerOptions() {
|
|
74
98
|
return {
|
|
75
99
|
...this.serveOptions
|
|
@@ -80,9 +104,10 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
80
104
|
await this.initialize();
|
|
81
105
|
}
|
|
82
106
|
const buildServer = await this.startBuildRuntimeServer();
|
|
107
|
+
const buildRuntimeOrigin = this.getListeningServerOrigin(buildServer);
|
|
83
108
|
try {
|
|
84
109
|
await this.staticBuilder.build(
|
|
85
|
-
{ preview: false },
|
|
110
|
+
{ preview: false, baseUrl: buildRuntimeOrigin },
|
|
86
111
|
{
|
|
87
112
|
router: this.router,
|
|
88
113
|
routeRendererFactory: this.routeRendererFactory,
|
|
@@ -95,117 +120,27 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
95
120
|
if (!options?.preview) {
|
|
96
121
|
return;
|
|
97
122
|
}
|
|
98
|
-
|
|
99
|
-
await this.previewServer.stop();
|
|
100
|
-
}
|
|
101
|
-
this.previewServer = new NodeStaticContentServer({
|
|
123
|
+
await this.previewHost.start({
|
|
102
124
|
appConfig: this.appConfig,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
port: Number(this.serveOptions.port || 3e3)
|
|
106
|
-
}
|
|
125
|
+
hostname: String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME),
|
|
126
|
+
port: Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT)
|
|
107
127
|
});
|
|
108
|
-
|
|
109
|
-
const
|
|
110
|
-
const previewPort = this.serveOptions.port || 3e3;
|
|
128
|
+
const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
|
|
129
|
+
const previewPort = this.serveOptions.port || DEFAULT_ECOPAGES_PORT;
|
|
111
130
|
appLogger.info(`Preview running at http://${previewHostname}:${previewPort}`);
|
|
112
131
|
}
|
|
113
|
-
/**
|
|
114
|
-
* Converts a Node.js `IncomingMessage` into a Web API `Request`.
|
|
115
|
-
*
|
|
116
|
-
* Multi-value headers (e.g. `set-cookie`) are appended individually so no
|
|
117
|
-
* value is silently dropped.
|
|
118
|
-
*
|
|
119
|
-
* For methods that carry a body (`POST`, `PUT`, `PATCH`, …), the raw
|
|
120
|
-
* `IncomingMessage` stream is wrapped in a `ReadableStream` rather than
|
|
121
|
-
* cast directly to `BodyInit`. See the inline doc block inside the `if`
|
|
122
|
-
* branch for the rationale (client-abort handling).
|
|
123
|
-
*
|
|
124
|
-
* `duplex: 'half'` is required by the `fetch` spec when a streaming body is
|
|
125
|
-
* provided — without it Node.js 18+ throws a `TypeError`.
|
|
126
|
-
*/
|
|
127
|
-
createWebRequest(req) {
|
|
128
|
-
const url = new URL(req.url ?? "/", this.runtimeOrigin);
|
|
129
|
-
const headers = new Headers();
|
|
130
|
-
for (const [key, value] of Object.entries(req.headers)) {
|
|
131
|
-
if (Array.isArray(value)) {
|
|
132
|
-
for (const item of value) {
|
|
133
|
-
headers.append(key, item);
|
|
134
|
-
}
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
if (value !== void 0) {
|
|
138
|
-
headers.set(key, value);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
const method = (req.method ?? "GET").toUpperCase();
|
|
142
|
-
const requestInit = {
|
|
143
|
-
method,
|
|
144
|
-
headers
|
|
145
|
-
};
|
|
146
|
-
if (method !== "GET" && method !== "HEAD") {
|
|
147
|
-
const body = new ReadableStream({
|
|
148
|
-
start(controller) {
|
|
149
|
-
req.on("data", (chunk) => controller.enqueue(chunk));
|
|
150
|
-
req.once("end", () => controller.close());
|
|
151
|
-
req.once("aborted", () => {
|
|
152
|
-
controller.error(new ClientAbortError());
|
|
153
|
-
});
|
|
154
|
-
req.once("error", (err) => {
|
|
155
|
-
const isClientAbort = err.code === "ECONNRESET";
|
|
156
|
-
controller.error(isClientAbort ? new ClientAbortError() : err);
|
|
157
|
-
});
|
|
158
|
-
},
|
|
159
|
-
cancel() {
|
|
160
|
-
req.destroy();
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
requestInit.body = body;
|
|
164
|
-
requestInit.duplex = "half";
|
|
165
|
-
}
|
|
166
|
-
return new Request(url, requestInit);
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Writes a Web `Response` back to a Node.js `ServerResponse`.
|
|
170
|
-
*
|
|
171
|
-
* The entire body is buffered via `arrayBuffer()` before writing. This is
|
|
172
|
-
* intentional for the current use-case (SSR pages and API routes), where
|
|
173
|
-
* responses are typically small and fully materialised. Streaming responses
|
|
174
|
-
* are not yet supported.
|
|
175
|
-
*/
|
|
176
|
-
async sendNodeResponse(res, response) {
|
|
177
|
-
res.statusCode = response.status;
|
|
178
|
-
response.headers.forEach((value, key) => {
|
|
179
|
-
res.setHeader(key, value);
|
|
180
|
-
});
|
|
181
|
-
if (!response.body) {
|
|
182
|
-
res.end();
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
const body = Buffer.from(await response.arrayBuffer());
|
|
186
|
-
res.end(body);
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Starts an ephemeral HTTP server used *only* during a static site generation
|
|
190
|
-
* run.
|
|
191
|
-
*
|
|
192
|
-
* Static generation works by having the `StaticSiteGenerator` issue real HTTP
|
|
193
|
-
* requests to a live server for each route, capturing the rendered HTML. This
|
|
194
|
-
* approach reuses the normal request pipeline (middleware, caching, API
|
|
195
|
-
* handlers) without any special-casing for the build path.
|
|
196
|
-
*
|
|
197
|
-
* The server is torn down immediately after generation completes via
|
|
198
|
-
* `stopBuildRuntimeServer`, so it never overlaps with the actual dev/prod server.
|
|
199
|
-
*/
|
|
200
132
|
async startBuildRuntimeServer() {
|
|
201
|
-
const hostname = String(this.serveOptions.hostname ||
|
|
202
|
-
const port =
|
|
133
|
+
const hostname = String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME);
|
|
134
|
+
const port = 0;
|
|
203
135
|
const server = createServer(async (req, res) => {
|
|
204
136
|
try {
|
|
205
|
-
const webRequest = this.createWebRequest(req);
|
|
137
|
+
const webRequest = this.requestBridge.createWebRequest(req, this.runtimeOrigin);
|
|
206
138
|
const response = await this.handleRequest(webRequest);
|
|
207
|
-
await this.sendNodeResponse(res, response);
|
|
139
|
+
await this.requestBridge.sendNodeResponse(res, response);
|
|
208
140
|
} catch (error) {
|
|
141
|
+
if (error instanceof NodeClientAbortError) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
209
144
|
appLogger.error("Node static build runtime request failed", error);
|
|
210
145
|
res.statusCode = 500;
|
|
211
146
|
res.end("Internal Server Error");
|
|
@@ -219,9 +154,17 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
219
154
|
});
|
|
220
155
|
});
|
|
221
156
|
this.serverInstance = server;
|
|
222
|
-
appLogger.info(`Server running at
|
|
157
|
+
appLogger.info(`Server running at ${this.getListeningServerOrigin(server)}`);
|
|
223
158
|
return server;
|
|
224
159
|
}
|
|
160
|
+
getListeningServerOrigin(server) {
|
|
161
|
+
const address = server.address();
|
|
162
|
+
const hostname = String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME);
|
|
163
|
+
if (!address || typeof address === "string") {
|
|
164
|
+
throw new Error("Build runtime server did not expose a numeric listening port");
|
|
165
|
+
}
|
|
166
|
+
return `http://${hostname}:${address.port}`;
|
|
167
|
+
}
|
|
225
168
|
/**
|
|
226
169
|
* Gracefully shuts down the ephemeral build runtime server.
|
|
227
170
|
*
|
|
@@ -269,19 +212,20 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
269
212
|
* underlying socket closes early — into a 499 response so it does not
|
|
270
213
|
* incorrectly surface as a 500 in application logs.
|
|
271
214
|
*/
|
|
272
|
-
async handleRequest(
|
|
215
|
+
async handleRequest(request) {
|
|
273
216
|
if (!this.initialized) {
|
|
274
217
|
throw new Error("Node server adapter is not initialized. Call createAdapter() first.");
|
|
275
218
|
}
|
|
276
219
|
try {
|
|
277
|
-
|
|
220
|
+
const response = await this.handleSharedRequest(request, {
|
|
278
221
|
apiHandlers: this.apiHandlers,
|
|
279
222
|
errorHandler: this.errorHandler,
|
|
280
223
|
serverInstance: this.serverInstance,
|
|
281
224
|
hmrManager: this.hmrManager
|
|
282
225
|
});
|
|
226
|
+
return await this.maybeInjectHmrScript(response);
|
|
283
227
|
} catch (error) {
|
|
284
|
-
if (error instanceof
|
|
228
|
+
if (error instanceof NodeClientAbortError) {
|
|
285
229
|
return new Response(null, { status: 499 });
|
|
286
230
|
}
|
|
287
231
|
throw error;
|
|
@@ -295,7 +239,7 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
295
239
|
* `upgrade` event (no separate port needed).
|
|
296
240
|
* - `NodeClientBridge` tracks active WebSocket connections and handles
|
|
297
241
|
* broadcast + heartbeat cleanup.
|
|
298
|
-
* - `NodeHmrManager` watches the filesystem and triggers incremental
|
|
242
|
+
* - `NodeHmrManager` watches the filesystem and triggers incremental
|
|
299
243
|
* rebuilds, notifying connected clients via the bridge.
|
|
300
244
|
* - Shared watcher bootstrapping listens for route-level file changes and
|
|
301
245
|
* refreshes the router and response handlers when pages are added or removed.
|
|
@@ -303,16 +247,16 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
303
247
|
* WebSocket upgrade requests that do not target `/_hmr` are rejected with an
|
|
304
248
|
* immediate socket destroy to prevent unhandled upgrade leaks.
|
|
305
249
|
*/
|
|
306
|
-
async completeInitialization(
|
|
307
|
-
this.serverInstance =
|
|
250
|
+
async completeInitialization(server) {
|
|
251
|
+
this.serverInstance = server;
|
|
308
252
|
if (this.options?.watch) {
|
|
309
|
-
const
|
|
310
|
-
const wss =
|
|
311
|
-
this.bridge =
|
|
312
|
-
this.hmrManager =
|
|
253
|
+
const devRuntime = this.devRuntimeFactory.create({ appConfig: this.appConfig });
|
|
254
|
+
const wss = devRuntime.websocketServer;
|
|
255
|
+
this.bridge = devRuntime.bridge;
|
|
256
|
+
this.hmrManager = devRuntime.hmrManager;
|
|
313
257
|
this.hmrManager.setEnabled(true);
|
|
314
258
|
await this.hmrManager.buildRuntime();
|
|
315
|
-
|
|
259
|
+
server.on("upgrade", (req, socket, head) => {
|
|
316
260
|
const url = new URL(req.url ?? "/", this.runtimeOrigin);
|
|
317
261
|
if (url.pathname === "/_hmr") {
|
|
318
262
|
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
@@ -324,10 +268,14 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
324
268
|
socket.destroy();
|
|
325
269
|
}
|
|
326
270
|
});
|
|
327
|
-
|
|
271
|
+
const browserBuildPlugins = getAppBrowserBuildPlugins(this.appConfig);
|
|
272
|
+
this.hmrManager.setPlugins(browserBuildPlugins);
|
|
273
|
+
for (const integration of this.appConfig.integrations) {
|
|
274
|
+
integration.setHmrManager(this.hmrManager);
|
|
275
|
+
}
|
|
328
276
|
this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
|
|
329
|
-
|
|
330
|
-
|
|
277
|
+
const watcher = new ProjectWatcher({
|
|
278
|
+
config: this.appConfig,
|
|
331
279
|
refreshRouterRoutesCallback: this.createSharedWatchRefreshCallback({
|
|
332
280
|
staticRoutes: this.staticRoutes,
|
|
333
281
|
hmrManager: this.hmrManager
|
|
@@ -335,6 +283,7 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
335
283
|
hmrManager: this.hmrManager,
|
|
336
284
|
bridge: this.bridge
|
|
337
285
|
});
|
|
286
|
+
await watcher.createWatcherSubscription();
|
|
338
287
|
}
|
|
339
288
|
appLogger.debug("Node server adapter initialization completed", {
|
|
340
289
|
apiHandlers: this.apiHandlers.length,
|
|
@@ -345,10 +294,16 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
345
294
|
}
|
|
346
295
|
}
|
|
347
296
|
async function createNodeServerAdapter(params) {
|
|
348
|
-
const runtimeOrigin = params.runtimeOrigin ??
|
|
297
|
+
const runtimeOrigin = params.runtimeOrigin ?? resolveServeRuntimeOrigin(params.serveOptions);
|
|
298
|
+
const previewHost = params.previewHost ?? new NodeStaticPreviewHost();
|
|
299
|
+
const requestBridge = params.requestBridge ?? new NodeHttpRequestBridge();
|
|
300
|
+
const devRuntimeFactory = params.devRuntimeFactory ?? new DefaultNodeServerDevRuntimeFactory();
|
|
349
301
|
const adapter = new NodeServerAdapter({
|
|
350
302
|
...params,
|
|
351
|
-
runtimeOrigin
|
|
303
|
+
runtimeOrigin,
|
|
304
|
+
previewHost,
|
|
305
|
+
requestBridge,
|
|
306
|
+
devRuntimeFactory
|
|
352
307
|
});
|
|
353
308
|
return adapter.createAdapter();
|
|
354
309
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Server as NodeHttpServer } from 'node:http';
|
|
2
|
-
import type { EcoPagesAppConfig } from '../../internal-types.js';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
3
3
|
type NodeStaticContentServerOptions = {
|
|
4
4
|
hostname?: string;
|
|
5
5
|
port?: number;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
2
|
import { extname, join, normalize, sep } from "node:path";
|
|
3
|
-
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from "../../constants.js";
|
|
3
|
+
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from "../../config/constants.js";
|
|
4
4
|
import { fileSystem } from "@ecopages/file-system";
|
|
5
5
|
import { ServerUtils } from "../../utils/server-utils.module.js";
|
|
6
6
|
class NodeStaticContentServer {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { AddressInfo } from 'node:net';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
3
|
+
import type { StaticPreviewHost, StaticPreviewHostStartOptions } from '../shared/static-preview-host.js';
|
|
4
|
+
type NodeStaticPreviewServer = {
|
|
5
|
+
start(): Promise<{
|
|
6
|
+
address(): AddressInfo | string | null;
|
|
7
|
+
}>;
|
|
8
|
+
stop(force?: boolean): Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
type NodeStaticPreviewServerFactory = new (args: {
|
|
11
|
+
appConfig: EcoPagesAppConfig;
|
|
12
|
+
options?: {
|
|
13
|
+
hostname?: string;
|
|
14
|
+
port?: number;
|
|
15
|
+
};
|
|
16
|
+
}) => NodeStaticPreviewServer;
|
|
17
|
+
/**
|
|
18
|
+
* Node preview-host wrapper that manages the lifecycle of the static preview
|
|
19
|
+
* server used after a build.
|
|
20
|
+
*
|
|
21
|
+
* @remarks
|
|
22
|
+
* The host separates preview-server construction from lifecycle control so the
|
|
23
|
+
* Node server adapter can restart preview serving safely across repeated build
|
|
24
|
+
* and preview flows.
|
|
25
|
+
*/
|
|
26
|
+
export declare class NodeStaticPreviewHost implements StaticPreviewHost {
|
|
27
|
+
private readonly previewServerFactory;
|
|
28
|
+
private previewServer;
|
|
29
|
+
private stopPromise;
|
|
30
|
+
/**
|
|
31
|
+
* Creates the preview host with an injectable preview-server constructor.
|
|
32
|
+
*/
|
|
33
|
+
constructor(previewServerFactory?: NodeStaticPreviewServerFactory);
|
|
34
|
+
/**
|
|
35
|
+
* Starts the Node preview host after fully draining any previous preview server
|
|
36
|
+
* shutdown that may still be in flight.
|
|
37
|
+
*
|
|
38
|
+
* @remarks
|
|
39
|
+
* The host only publishes a new preview server after `start()` succeeds. That
|
|
40
|
+
* keeps failed startup attempts from replacing the last known-good server with a
|
|
41
|
+
* half-initialized instance.
|
|
42
|
+
*/
|
|
43
|
+
start(options: StaticPreviewHostStartOptions): Promise<number | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Stops the active preview server and coalesces overlapping stop requests onto
|
|
46
|
+
* the same shutdown promise.
|
|
47
|
+
*
|
|
48
|
+
* @remarks
|
|
49
|
+
* The host keeps the server reference until shutdown succeeds. If shutdown
|
|
50
|
+
* fails, callers can still retry `stop()` or inspect the same live instance
|
|
51
|
+
* instead of losing the handle during a rejected async stop.
|
|
52
|
+
*/
|
|
53
|
+
stop(force?: boolean): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { NodeStaticContentServer } from "./static-content-server.js";
|
|
2
|
+
class NodeStaticPreviewHost {
|
|
3
|
+
/**
|
|
4
|
+
* Creates the preview host with an injectable preview-server constructor.
|
|
5
|
+
*/
|
|
6
|
+
constructor(previewServerFactory = NodeStaticContentServer) {
|
|
7
|
+
this.previewServerFactory = previewServerFactory;
|
|
8
|
+
}
|
|
9
|
+
previewServerFactory;
|
|
10
|
+
previewServer = null;
|
|
11
|
+
stopPromise = null;
|
|
12
|
+
/**
|
|
13
|
+
* Starts the Node preview host after fully draining any previous preview server
|
|
14
|
+
* shutdown that may still be in flight.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* The host only publishes a new preview server after `start()` succeeds. That
|
|
18
|
+
* keeps failed startup attempts from replacing the last known-good server with a
|
|
19
|
+
* half-initialized instance.
|
|
20
|
+
*/
|
|
21
|
+
async start(options) {
|
|
22
|
+
await this.stop();
|
|
23
|
+
const previewServer = new this.previewServerFactory({
|
|
24
|
+
appConfig: options.appConfig,
|
|
25
|
+
options: {
|
|
26
|
+
hostname: options.hostname,
|
|
27
|
+
port: options.port
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
const server = await previewServer.start();
|
|
31
|
+
this.previewServer = previewServer;
|
|
32
|
+
const address = server.address();
|
|
33
|
+
if (address && typeof address === "object") {
|
|
34
|
+
return address.port;
|
|
35
|
+
}
|
|
36
|
+
return options.port;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stops the active preview server and coalesces overlapping stop requests onto
|
|
40
|
+
* the same shutdown promise.
|
|
41
|
+
*
|
|
42
|
+
* @remarks
|
|
43
|
+
* The host keeps the server reference until shutdown succeeds. If shutdown
|
|
44
|
+
* fails, callers can still retry `stop()` or inspect the same live instance
|
|
45
|
+
* instead of losing the handle during a rejected async stop.
|
|
46
|
+
*/
|
|
47
|
+
async stop(force = true) {
|
|
48
|
+
if (this.stopPromise) {
|
|
49
|
+
await this.stopPromise;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!this.previewServer) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const activePreviewServer = this.previewServer;
|
|
56
|
+
this.stopPromise = activePreviewServer.stop(force).then(() => {
|
|
57
|
+
if (this.previewServer === activePreviewServer) {
|
|
58
|
+
this.previewServer = null;
|
|
59
|
+
}
|
|
60
|
+
}).finally(() => {
|
|
61
|
+
this.stopPromise = null;
|
|
62
|
+
});
|
|
63
|
+
await this.stopPromise;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
NodeStaticPreviewHost
|
|
68
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../public-types.js';
|
|
1
|
+
import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../types/public-types.js';
|
|
2
2
|
import { AbstractApplicationAdapter, type ApplicationAdapterOptions, type RouteGroupDefinition, type RouteHandler } from '../abstract/application-adapter.js';
|
|
3
3
|
export declare abstract class SharedApplicationAdapter<TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions, TServer = any, TRequest extends Request = Request> extends AbstractApplicationAdapter<TOptions, TServer, TRequest> {
|
|
4
4
|
protected register<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, method: ApiHandler['method'], handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from '../../public-types.js';
|
|
1
|
+
import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from '../../types/public-types.js';
|
|
2
2
|
type UniversalContext = ApiHandlerContext<Request, unknown>;
|
|
3
3
|
type SchemaHandlerContext<TSchema extends RouteSchema | undefined, TContext extends UniversalContext> = TSchema extends RouteSchema ? TypedGroupHandlerContext<TSchema, TContext> : TContext;
|
|
4
4
|
export declare function defineApiHandler<TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema'> & {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
2
|
+
import type { EcoFunctionComponent, EcoPageComponent } from '../../types/public-types.js';
|
|
3
|
+
import type { ExplicitViewRenderer, ExplicitViewRendererResolver } from '../../route-renderer/route-renderer.js';
|
|
4
|
+
type ExplicitStaticRenderPreparationResult = {
|
|
5
|
+
renderer: ExplicitViewRenderer;
|
|
6
|
+
props: Record<string, unknown>;
|
|
7
|
+
view: EcoFunctionComponent<Record<string, unknown>, any>;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Resolves the renderer and static props needed to render one explicit static
|
|
11
|
+
* view at runtime or during static generation.
|
|
12
|
+
*/
|
|
13
|
+
export declare function prepareExplicitStaticRender(input: {
|
|
14
|
+
routePath: string;
|
|
15
|
+
view: EcoPageComponent<any>;
|
|
16
|
+
params: Record<string, string | string[]>;
|
|
17
|
+
appConfig: EcoPagesAppConfig;
|
|
18
|
+
runtimeOrigin: string;
|
|
19
|
+
routeRendererFactory: ExplicitViewRendererResolver;
|
|
20
|
+
errors: {
|
|
21
|
+
missingIntegration(routePath: string): string;
|
|
22
|
+
noRendererForIntegration(integrationName: string): string;
|
|
23
|
+
};
|
|
24
|
+
}): Promise<ExplicitStaticRenderPreparationResult>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
function getViewIntegrationName(view) {
|
|
2
|
+
return view.config?.integration ?? view.config?.__eco?.integration;
|
|
3
|
+
}
|
|
4
|
+
async function prepareExplicitStaticRender(input) {
|
|
5
|
+
const integrationName = getViewIntegrationName(input.view);
|
|
6
|
+
if (!integrationName) {
|
|
7
|
+
throw new Error(input.errors.missingIntegration(input.routePath));
|
|
8
|
+
}
|
|
9
|
+
const renderer = input.routeRendererFactory.getExplicitViewRenderer(integrationName);
|
|
10
|
+
if (!renderer) {
|
|
11
|
+
throw new Error(input.errors.noRendererForIntegration(integrationName));
|
|
12
|
+
}
|
|
13
|
+
const props = input.view.staticProps ? (await input.view.staticProps({
|
|
14
|
+
pathname: { params: input.params },
|
|
15
|
+
appConfig: input.appConfig,
|
|
16
|
+
runtimeOrigin: input.runtimeOrigin
|
|
17
|
+
})).props : {};
|
|
18
|
+
return {
|
|
19
|
+
renderer,
|
|
20
|
+
props,
|
|
21
|
+
view: input.view
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
prepareExplicitStaticRender
|
|
26
|
+
};
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '../../internal-types.js';
|
|
2
|
-
import type { StaticRoute } from '../../public-types.js';
|
|
3
|
-
import type {
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
2
|
+
import type { StaticRoute } from '../../types/public-types.js';
|
|
3
|
+
import type { ExplicitViewRendererResolver } from '../../route-renderer/route-renderer.js';
|
|
4
4
|
export declare const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS: {
|
|
5
5
|
readonly missingIntegration: (routePath: string) => string;
|
|
6
6
|
readonly noRendererForIntegration: (integrationName: string) => string;
|
|
7
7
|
};
|
|
8
8
|
export interface ExplicitStaticRouteMatcherOptions {
|
|
9
9
|
appConfig: EcoPagesAppConfig;
|
|
10
|
-
routeRendererFactory:
|
|
10
|
+
routeRendererFactory: ExplicitViewRendererResolver;
|
|
11
11
|
staticRoutes: StaticRoute[];
|
|
12
12
|
}
|
|
13
13
|
export interface ExplicitRouteMatch {
|
|
14
14
|
route: StaticRoute;
|
|
15
15
|
params: Record<string, string>;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Matches and renders explicit static routes declared through `app.static()`.
|
|
19
|
+
*/
|
|
17
20
|
export declare class ExplicitStaticRouteMatcher {
|
|
18
21
|
private readonly appConfig;
|
|
19
22
|
private readonly routeRendererFactory;
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { appLogger } from "../../global/app-logger.js";
|
|
2
|
+
import { prepareExplicitStaticRender } from "./explicit-static-render-preparation.js";
|
|
2
3
|
const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
|
|
3
4
|
missingIntegration: (routePath) => `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
|
|
4
5
|
noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`
|
|
5
6
|
};
|
|
6
|
-
function getViewIntegrationName(view) {
|
|
7
|
-
return view.config?.integration ?? view.config?.__eco?.integration;
|
|
8
|
-
}
|
|
9
7
|
class ExplicitStaticRouteMatcher {
|
|
10
8
|
appConfig;
|
|
11
9
|
routeRendererFactory;
|
|
@@ -74,20 +72,20 @@ class ExplicitStaticRouteMatcher {
|
|
|
74
72
|
try {
|
|
75
73
|
const mod = await route.loader();
|
|
76
74
|
const view = mod.default;
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const props = view.staticProps ? (await view.staticProps({
|
|
86
|
-
pathname: { params },
|
|
75
|
+
const {
|
|
76
|
+
renderer,
|
|
77
|
+
props,
|
|
78
|
+
view: renderableView
|
|
79
|
+
} = await prepareExplicitStaticRender({
|
|
80
|
+
routePath: route.path,
|
|
81
|
+
view,
|
|
82
|
+
params,
|
|
87
83
|
appConfig: this.appConfig,
|
|
88
|
-
runtimeOrigin: this.appConfig.baseUrl
|
|
89
|
-
|
|
90
|
-
|
|
84
|
+
runtimeOrigin: this.appConfig.baseUrl,
|
|
85
|
+
routeRendererFactory: this.routeRendererFactory,
|
|
86
|
+
errors: EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS
|
|
87
|
+
});
|
|
88
|
+
return renderer.renderToResponse(renderableView, props, {});
|
|
91
89
|
} catch (error) {
|
|
92
90
|
appLogger.error(
|
|
93
91
|
`Error rendering explicit static route ${route.path}:`,
|