@ecopages/core 0.2.0-alpha.5 → 0.2.0-alpha.50
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 +268 -14
- package/package.json +92 -110
- package/src/adapters/README.md +39 -0
- package/src/adapters/abstract/application-adapter.d.ts +28 -2
- package/src/adapters/abstract/application-adapter.js +14 -2
- package/src/adapters/abstract/router-adapter.d.ts +1 -1
- package/src/adapters/abstract/server-adapter.d.ts +2 -2
- package/src/adapters/bun/client-bridge.d.ts +1 -1
- package/src/adapters/bun/create-app.d.ts +12 -12
- package/src/adapters/bun/create-app.js +64 -41
- package/src/adapters/bun/hmr-manager.d.ts +30 -62
- package/src/adapters/bun/hmr-manager.js +30 -194
- package/src/adapters/bun/index.d.ts +2 -3
- package/src/adapters/bun/index.js +3 -3
- 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 +93 -32
- package/src/adapters/bun/server-adapter.js +166 -89
- 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 +2 -6
- package/src/adapters/index.js +2 -8
- 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 +38 -48
- package/src/adapters/node/node-hmr-manager.js +31 -203
- 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 +20 -72
- package/src/adapters/node/server-adapter.js +99 -203
- package/src/adapters/node/static-content-server.d.ts +37 -1
- package/src/adapters/node/static-content-server.js +29 -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/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
- package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
- package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
- package/src/adapters/shared/explicit-static-route-matcher.js +14 -13
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
- package/src/adapters/shared/file-route-middleware-pipeline.js +3 -11
- package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
- package/src/adapters/shared/fs-server-response-factory.js +11 -27
- package/src/adapters/shared/fs-server-response-matcher.d.ts +20 -16
- package/src/adapters/shared/fs-server-response-matcher.js +76 -45
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
- package/src/adapters/shared/hmr-html-response.d.ts +22 -0
- package/src/adapters/shared/hmr-html-response.js +33 -0
- package/src/adapters/shared/render-context.d.ts +5 -3
- package/src/adapters/shared/render-context.js +27 -3
- 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 +33 -12
- package/src/adapters/shared/server-adapter.js +215 -132
- package/src/adapters/shared/server-route-handler.d.ts +5 -5
- package/src/adapters/shared/server-route-handler.js +7 -16
- package/src/adapters/shared/server-static-builder.d.ts +41 -8
- package/src/adapters/shared/server-static-builder.js +65 -11
- package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
- package/src/adapters/shared/shared-hmr-manager.js +240 -0
- package/src/adapters/shared/static-preview-host.d.ts +10 -0
- package/src/build/README.md +107 -0
- package/src/build/build-adapter.d.ts +175 -3
- package/src/build/build-adapter.js +625 -16
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -0
- package/src/build/dev-build-coordinator.d.ts +72 -0
- package/src/build/dev-build-coordinator.js +154 -0
- package/src/build/esbuild-build-adapter.d.ts +16 -6
- package/src/build/esbuild-build-adapter.js +202 -75
- package/src/build/runtime-build-executor.d.ts +14 -0
- package/src/build/runtime-build-executor.js +22 -0
- package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
- package/src/build/runtime-specifier-alias-plugin.js +35 -0
- package/src/build/runtime-specifier-aliases.d.ts +5 -0
- package/src/build/runtime-specifier-aliases.js +95 -0
- package/src/config/README.md +36 -0
- package/src/config/config-builder.d.ts +54 -29
- package/src/config/config-builder.js +256 -50
- package/src/{constants.d.ts → config/constants.d.ts} +13 -0
- package/src/{constants.js → config/constants.js} +4 -0
- package/src/declarations.d.ts +19 -14
- package/src/dev/host-runtime.d.ts +10 -0
- package/src/dev/host-runtime.js +24 -0
- package/src/dev/sc-server.d.ts +1 -1
- package/src/dev/sc-server.js +1 -1
- package/src/eco/README.md +70 -16
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +88 -0
- package/src/eco/eco.js +63 -54
- package/src/eco/eco.types.d.ts +69 -6
- package/src/eco/eco.utils.d.ts +1 -40
- package/src/eco/eco.utils.js +5 -35
- package/src/eco/global-injector-map.d.ts +3 -3
- package/src/eco/global-injector-map.js +2 -2
- package/src/eco/lazy-injector-map.d.ts +2 -2
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +3 -1
- package/src/hmr/README.md +26 -0
- package/src/hmr/client/hmr-runtime.d.ts +1 -6
- package/src/hmr/client/hmr-runtime.js +38 -7
- package/src/hmr/hmr-strategy.d.ts +16 -13
- package/src/hmr/hmr-strategy.js +22 -7
- package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
- package/src/hmr/hmr.postcss.test.e2e.js +31 -0
- package/src/hmr/hmr.test.e2e.js +26 -33
- package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
- package/src/hmr/strategies/default-hmr-strategy.js +1 -1
- package/src/hmr/strategies/js-hmr-strategy.d.ts +40 -42
- package/src/hmr/strategies/js-hmr-strategy.js +24 -43
- package/src/index.browser.d.ts +2 -2
- package/src/index.browser.js +1 -1
- package/src/index.d.ts +4 -3
- package/src/index.js +16 -5
- package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
- package/src/integrations/ghtml/ghtml-renderer.js +27 -30
- package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
- package/src/integrations/ghtml/ghtml.constants.js +4 -0
- package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
- package/src/integrations/ghtml/ghtml.plugin.js +3 -4
- package/src/plugins/README.md +35 -0
- package/src/plugins/alias-resolver-plugin.d.ts +1 -0
- package/src/plugins/alias-resolver-plugin.js +27 -5
- package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
- package/src/plugins/eco-component-meta-plugin.js +42 -24
- 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 +147 -29
- package/src/plugins/integration-plugin.js +103 -14
- package/src/plugins/processor.d.ts +17 -2
- package/src/plugins/processor.js +22 -3
- package/src/plugins/runtime-capability.d.ts +9 -0
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/GRAPH.md +83 -325
- package/src/route-renderer/README.md +73 -90
- package/src/route-renderer/orchestration/component-render-context.d.ts +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 +534 -0
- package/src/route-renderer/orchestration/integration-renderer.js +991 -0
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
- package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
- package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +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/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
- package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
- package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
- package/src/route-renderer/route-renderer.d.ts +57 -14
- package/src/route-renderer/route-renderer.js +30 -18
- package/src/router/README.md +94 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.js +34 -0
- package/src/router/client/link-intent.test.browser.d.ts +1 -0
- package/src/router/client/link-intent.test.browser.js +43 -0
- package/src/router/client/navigation-coordinator.d.ts +169 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/server/route-registry.d.ts +78 -0
- package/src/router/server/route-registry.js +262 -0
- package/src/services/README.md +28 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
- package/src/services/assets/asset-processing-service/assets.types.js +0 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
- package/src/services/assets/asset-processing-service/index.d.ts +6 -0
- package/src/services/assets/asset-processing-service/index.js +6 -0
- package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
- package/src/services/assets/asset-processing-service/page-package.js +80 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
- package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/index.js +5 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +3 -2
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +120 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +42 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +126 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
- package/src/services/assets/browser-bundle.service.d.ts +73 -0
- package/src/services/assets/browser-bundle.service.js +41 -0
- package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
- package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
- package/src/services/html/html-rewriter-provider.service.d.ts +40 -0
- package/src/services/html/html-rewriter-provider.service.js +68 -0
- package/src/services/html/html-transformer.service.d.ts +96 -0
- package/src/services/html/html-transformer.service.js +287 -0
- package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
- package/src/services/invalidation/development-invalidation.service.js +190 -0
- package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
- package/src/services/module-loading/app-module-loader.service.js +0 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +151 -0
- package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
- package/src/services/module-loading/host-module-loader-registry.js +15 -0
- package/src/services/module-loading/module-loading-types.d.ts +2 -0
- package/src/services/module-loading/module-loading-types.js +0 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +38 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +215 -0
- package/src/services/module-loading/page-module-import.service.d.ts +95 -0
- package/src/services/module-loading/page-module-import.service.js +191 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
- package/src/services/module-loading/server-module-transpiler.service.js +64 -0
- package/src/services/module-loading/source-module-support.d.ts +5 -0
- package/src/services/module-loading/source-module-support.js +8 -0
- package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
- package/src/services/runtime-state/dev-graph.service.js +162 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
- package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
- package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.d.ts +67 -20
- package/src/static-site-generator/static-site-generator.js +182 -138
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +239 -31
- package/src/types/public-types.js +0 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +6 -0
- package/src/utils/locals-utils.d.ts +1 -1
- package/src/utils/parse-cli-args.d.ts +4 -1
- package/src/utils/parse-cli-args.js +16 -1
- package/src/utils/resolve-work-dir.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/watchers/project-watcher.d.ts +11 -7
- package/src/watchers/project-watcher.js +69 -75
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +6 -5
- package/CHANGELOG.md +0 -94
- package/src/adapters/abstract/application-adapter.ts +0 -337
- package/src/adapters/abstract/router-adapter.ts +0 -30
- package/src/adapters/abstract/server-adapter.ts +0 -79
- package/src/adapters/bun/client-bridge.ts +0 -62
- package/src/adapters/bun/create-app.ts +0 -189
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.ts +0 -276
- package/src/adapters/bun/index.ts +0 -3
- package/src/adapters/bun/server-adapter.ts +0 -492
- package/src/adapters/bun/server-lifecycle.d.ts +0 -52
- package/src/adapters/bun/server-lifecycle.js +0 -120
- package/src/adapters/bun/server-lifecycle.ts +0 -154
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/index.ts +0 -9
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -271
- package/src/adapters/node/server-adapter.ts +0 -561
- package/src/adapters/node/static-content-server.ts +0 -203
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
- package/src/adapters/shared/render-context.ts +0 -105
- package/src/adapters/shared/server-adapter.ts +0 -442
- package/src/adapters/shared/server-route-handler.ts +0 -166
- package/src/adapters/shared/server-static-builder.ts +0 -82
- package/src/build/build-adapter.ts +0 -133
- package/src/build/build-types.ts +0 -83
- package/src/build/esbuild-build-adapter.ts +0 -511
- package/src/config/config-builder.ts +0 -474
- package/src/constants.ts +0 -39
- package/src/create-app.ts +0 -87
- package/src/define-api-handler.js +0 -15
- package/src/define-api-handler.ts +0 -66
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -77
- package/src/eco/component-render-context.ts +0 -202
- package/src/eco/eco.ts +0 -221
- package/src/eco/eco.types.ts +0 -202
- package/src/eco/eco.utils.ts +0 -89
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -2
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- package/src/hmr/client/hmr-runtime.ts +0 -121
- package/src/hmr/hmr-strategy.ts +0 -172
- package/src/hmr/hmr.test.e2e.ts +0 -75
- package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -327
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -212
- package/src/plugins/alias-resolver-plugin.ts +0 -45
- package/src/plugins/eco-component-meta-plugin.ts +0 -474
- package/src/plugins/integration-plugin.ts +0 -184
- package/src/plugins/processor.ts +0 -220
- package/src/public-types.ts +0 -1255
- package/src/route-renderer/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-graph.ts +0 -159
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/component-marker.ts +0 -117
- package/src/route-renderer/dependency-resolver.js +0 -428
- package/src/route-renderer/dependency-resolver.ts +0 -596
- package/src/route-renderer/html-post-processing.service.d.ts +0 -40
- package/src/route-renderer/html-post-processing.service.js +0 -86
- package/src/route-renderer/html-post-processing.service.ts +0 -103
- package/src/route-renderer/integration-renderer.d.ts +0 -339
- package/src/route-renderer/integration-renderer.js +0 -526
- package/src/route-renderer/integration-renderer.ts +0 -696
- package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
- package/src/route-renderer/marker-graph-resolver.js +0 -93
- package/src/route-renderer/marker-graph-resolver.ts +0 -153
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.ts +0 -153
- package/src/route-renderer/render-execution.service.d.ts +0 -69
- package/src/route-renderer/render-execution.service.js +0 -91
- package/src/route-renderer/render-execution.service.ts +0 -158
- package/src/route-renderer/render-preparation.service.d.ts +0 -112
- package/src/route-renderer/render-preparation.service.js +0 -243
- package/src/route-renderer/render-preparation.service.ts +0 -358
- package/src/route-renderer/route-renderer.ts +0 -80
- package/src/router/fs-router-scanner.d.ts +0 -41
- package/src/router/fs-router-scanner.js +0 -155
- package/src/router/fs-router-scanner.ts +0 -217
- package/src/router/fs-router.d.ts +0 -26
- package/src/router/fs-router.js +0 -100
- package/src/router/fs-router.ts +0 -122
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
- package/src/services/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/asset-processing-service/assets.types.ts +0 -112
- package/src/services/asset-processing-service/index.d.ts +0 -3
- package/src/services/asset-processing-service/index.js +0 -3
- package/src/services/asset-processing-service/index.ts +0 -3
- package/src/services/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
- package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
- package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
- package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
- package/src/services/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/asset-processing-service/processors/index.js +0 -5
- package/src/services/asset-processing-service/processors/index.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
- package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.ts +0 -128
- package/src/services/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -359
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/watchers/project-watcher.test-helpers.ts +0 -40
- package/src/watchers/project-watcher.ts +0 -364
- /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
- /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/{services/asset-processing-service/assets.types.js → plugins/runtime-capability.js} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -1,219 +1,47 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { RESOLVED_ASSETS_DIR } from "../../constants.js";
|
|
5
|
-
import { defaultBuildAdapter } from "../../build/build-adapter.js";
|
|
6
|
-
import { fileSystem } from "@ecopages/file-system";
|
|
7
|
-
import { DefaultHmrStrategy } from "../../hmr/strategies/default-hmr-strategy.js";
|
|
8
|
-
import { JsHmrStrategy } from "../../hmr/strategies/js-hmr-strategy.js";
|
|
9
1
|
import { appLogger } from "../../global/app-logger.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
specifierMap = /* @__PURE__ */ new Map();
|
|
2
|
+
import {
|
|
3
|
+
InMemoryEntrypointDependencyGraph
|
|
4
|
+
} from "../../services/runtime-state/entrypoint-dependency-graph.service.js";
|
|
5
|
+
import { SharedHmrManager } from "../shared/shared-hmr-manager.js";
|
|
6
|
+
class NodeHmrManager extends SharedHmrManager {
|
|
16
7
|
/**
|
|
17
|
-
* Node
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
*
|
|
8
|
+
* Creates the Node HMR manager over the shared coordination pipeline.
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* Unlike Bun, Node keeps websocket subscription wiring in the server adapter,
|
|
12
|
+
* so this manager only specializes the shared manager where runtime behavior
|
|
13
|
+
* actually differs: dependency-graph storage, missing-file tolerance, and how
|
|
14
|
+
* runtime bundle failures disable HMR.
|
|
22
15
|
*/
|
|
23
|
-
entrypointDependencies = /* @__PURE__ */ new Map();
|
|
24
|
-
distDir;
|
|
25
|
-
plugins = [];
|
|
26
|
-
enabled = true;
|
|
27
|
-
strategies = [];
|
|
28
16
|
constructor({ appConfig, bridge }) {
|
|
29
|
-
|
|
30
|
-
this.bridge = bridge;
|
|
31
|
-
this.distDir = path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR, "_hmr");
|
|
32
|
-
this.cleanDistDir();
|
|
33
|
-
this.initializeStrategies();
|
|
17
|
+
super({ appConfig, bridge });
|
|
34
18
|
}
|
|
35
19
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* This must not remove the directory because multiple app processes
|
|
39
|
-
* can share the same dist path during e2e runs.
|
|
20
|
+
* Reuses the shared in-memory dependency graph when the app already has one and
|
|
21
|
+
* otherwise creates the default Node development graph.
|
|
40
22
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
initializeStrategies() {
|
|
45
|
-
const jsContext = {
|
|
46
|
-
getWatchedFiles: () => this.watchedFiles,
|
|
47
|
-
getSpecifierMap: () => this.specifierMap,
|
|
48
|
-
getDependencyEntrypoints: (filePath) => new Set(this.dependencyEntrypoints.get(path.resolve(filePath)) ?? []),
|
|
49
|
-
setEntrypointDependencies: (entrypointPath, dependencies) => this.setEntrypointDependencies(entrypointPath, dependencies),
|
|
50
|
-
getDistDir: () => this.distDir,
|
|
51
|
-
getPlugins: () => this.plugins,
|
|
52
|
-
getSrcDir: () => this.appConfig.absolutePaths.srcDir
|
|
53
|
-
};
|
|
54
|
-
this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
|
|
55
|
-
}
|
|
56
|
-
registerStrategy(strategy) {
|
|
57
|
-
this.strategies.push(strategy);
|
|
58
|
-
}
|
|
59
|
-
setPlugins(plugins) {
|
|
60
|
-
this.plugins = [...plugins];
|
|
61
|
-
}
|
|
62
|
-
setEnabled(enabled) {
|
|
63
|
-
this.enabled = enabled;
|
|
64
|
-
}
|
|
65
|
-
isEnabled() {
|
|
66
|
-
return this.enabled;
|
|
67
|
-
}
|
|
68
|
-
registerSpecifierMap(map) {
|
|
69
|
-
for (const [specifier, url] of Object.entries(map)) {
|
|
70
|
-
this.specifierMap.set(specifier, url);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
async buildRuntime() {
|
|
74
|
-
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
75
|
-
const runtimeSource = path.resolve(currentDir, "../../hmr/client/hmr-runtime.js");
|
|
76
|
-
const result = await defaultBuildAdapter.build({
|
|
77
|
-
entrypoints: [runtimeSource],
|
|
78
|
-
outdir: this.distDir,
|
|
79
|
-
naming: "_hmr_runtime.js",
|
|
80
|
-
minify: false,
|
|
81
|
-
...defaultBuildAdapter.getTranspileOptions("hmr-runtime"),
|
|
82
|
-
plugins: this.plugins
|
|
83
|
-
});
|
|
84
|
-
if (!result.success) {
|
|
85
|
-
appLogger.error("[HMR] Failed to build runtime script:", result.logs);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
getRuntimePath() {
|
|
89
|
-
return path.join(this.distDir, "_hmr_runtime.js");
|
|
90
|
-
}
|
|
91
|
-
broadcast(event) {
|
|
92
|
-
appLogger.debug(
|
|
93
|
-
`[HMR] Broadcasting ${event.type} event, path=${event.path || "all"}, subscribers=${this.bridge.subscriberCount}`
|
|
94
|
-
);
|
|
95
|
-
this.bridge.broadcast(event);
|
|
96
|
-
}
|
|
97
|
-
async handleFileChange(filePath) {
|
|
98
|
-
const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
|
|
99
|
-
const strategy = sorted.find((s) => {
|
|
100
|
-
try {
|
|
101
|
-
return s.matches(filePath);
|
|
102
|
-
} catch (err) {
|
|
103
|
-
appLogger.error(err);
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
if (!strategy) {
|
|
108
|
-
appLogger.warn(`[HMR] No strategy found for ${filePath}`);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
appLogger.debug(`[NodeHmrManager] Selected strategy: ${strategy.constructor.name}`);
|
|
112
|
-
const action = await strategy.process(filePath);
|
|
113
|
-
if (action.type === "broadcast") {
|
|
114
|
-
if (action.events) {
|
|
115
|
-
for (const event of action.events) {
|
|
116
|
-
this.broadcast(event);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
getOutputUrl(entrypointPath) {
|
|
122
|
-
return this.watchedFiles.get(entrypointPath);
|
|
123
|
-
}
|
|
124
|
-
getWatchedFiles() {
|
|
125
|
-
return this.watchedFiles;
|
|
126
|
-
}
|
|
127
|
-
getSpecifierMap() {
|
|
128
|
-
return this.specifierMap;
|
|
129
|
-
}
|
|
130
|
-
getDistDir() {
|
|
131
|
-
return this.distDir;
|
|
132
|
-
}
|
|
133
|
-
getPlugins() {
|
|
134
|
-
return this.plugins;
|
|
135
|
-
}
|
|
136
|
-
getDefaultContext() {
|
|
137
|
-
return {
|
|
138
|
-
getWatchedFiles: () => this.watchedFiles,
|
|
139
|
-
getSpecifierMap: () => this.specifierMap,
|
|
140
|
-
getDistDir: () => this.distDir,
|
|
141
|
-
getPlugins: () => this.plugins,
|
|
142
|
-
getSrcDir: () => this.appConfig.absolutePaths.srcDir,
|
|
143
|
-
getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
|
|
144
|
-
getPagesDir: () => this.appConfig.absolutePaths.pagesDir
|
|
145
|
-
};
|
|
23
|
+
createEntrypointDependencyGraph(existingEntrypointDependencyGraph) {
|
|
24
|
+
return existingEntrypointDependencyGraph instanceof InMemoryEntrypointDependencyGraph ? existingEntrypointDependencyGraph : new InMemoryEntrypointDependencyGraph();
|
|
146
25
|
}
|
|
147
26
|
/**
|
|
148
|
-
*
|
|
27
|
+
* Tells the shared HMR manager to ignore missing-file events during Node watch
|
|
28
|
+
* mode.
|
|
149
29
|
*
|
|
150
30
|
* @remarks
|
|
151
|
-
*
|
|
152
|
-
*
|
|
31
|
+
* Node file watching can briefly report remove-and-recreate sequences while a
|
|
32
|
+
* file is being rewritten. Treating those transient gaps as fatal would disable
|
|
33
|
+
* otherwise healthy development sessions.
|
|
153
34
|
*/
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const previousDependencies = this.entrypointDependencies.get(normalizedEntrypoint);
|
|
157
|
-
if (previousDependencies) {
|
|
158
|
-
for (const dependencyPath of previousDependencies) {
|
|
159
|
-
const entrypoints = this.dependencyEntrypoints.get(dependencyPath);
|
|
160
|
-
if (!entrypoints) {
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
entrypoints.delete(normalizedEntrypoint);
|
|
164
|
-
if (entrypoints.size === 0) {
|
|
165
|
-
this.dependencyEntrypoints.delete(dependencyPath);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
const normalizedDependencies = /* @__PURE__ */ new Set([
|
|
170
|
-
normalizedEntrypoint,
|
|
171
|
-
...dependencies.map((dependencyPath) => path.resolve(dependencyPath))
|
|
172
|
-
]);
|
|
173
|
-
this.entrypointDependencies.set(normalizedEntrypoint, normalizedDependencies);
|
|
174
|
-
for (const dependencyPath of normalizedDependencies) {
|
|
175
|
-
const entrypoints = this.dependencyEntrypoints.get(dependencyPath) ?? /* @__PURE__ */ new Set();
|
|
176
|
-
entrypoints.add(normalizedEntrypoint);
|
|
177
|
-
this.dependencyEntrypoints.set(dependencyPath, entrypoints);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
async registerEntrypoint(entrypointPath) {
|
|
181
|
-
if (this.watchedFiles.has(entrypointPath)) {
|
|
182
|
-
return this.watchedFiles.get(entrypointPath);
|
|
183
|
-
}
|
|
184
|
-
const srcDir = this.appConfig.absolutePaths.srcDir;
|
|
185
|
-
const relativePath = path.relative(srcDir, entrypointPath);
|
|
186
|
-
const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
|
|
187
|
-
const encodedPathJs = this.encodeDynamicSegments(relativePathJs);
|
|
188
|
-
const urlPath = encodedPathJs.split(path.sep).join("/");
|
|
189
|
-
const outputUrl = `/${path.join(RESOLVED_ASSETS_DIR, "_hmr", urlPath)}`;
|
|
190
|
-
const outputPath = path.join(this.distDir, urlPath);
|
|
191
|
-
this.watchedFiles.set(entrypointPath, outputUrl);
|
|
192
|
-
await this.handleFileChange(entrypointPath);
|
|
193
|
-
if (!fileSystem.exists(outputPath)) {
|
|
194
|
-
const fallback = await defaultBuildAdapter.build({
|
|
195
|
-
entrypoints: [entrypointPath],
|
|
196
|
-
outdir: this.distDir,
|
|
197
|
-
naming: encodedPathJs,
|
|
198
|
-
minify: false,
|
|
199
|
-
external: Array.from(this.specifierMap.keys()),
|
|
200
|
-
...defaultBuildAdapter.getTranspileOptions("hmr-entrypoint"),
|
|
201
|
-
plugins: this.plugins
|
|
202
|
-
});
|
|
203
|
-
if (!fallback.success) {
|
|
204
|
-
appLogger.error(`[HMR] Fallback build failed for ${entrypointPath}:`, fallback.logs);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return outputUrl;
|
|
35
|
+
shouldSkipMissingFileChange(_filePath) {
|
|
36
|
+
return true;
|
|
208
37
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
this.watchers.clear();
|
|
38
|
+
/**
|
|
39
|
+
* Disables HMR after a runtime bundle failure so the Node dev server can keep
|
|
40
|
+
* serving requests without repeatedly emitting broken updates.
|
|
41
|
+
*/
|
|
42
|
+
onRuntimeBundleFailure(error) {
|
|
43
|
+
this.enabled = false;
|
|
44
|
+
appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", error);
|
|
217
45
|
}
|
|
218
46
|
}
|
|
219
47
|
export {
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createServer, type Server as NodeServerInstance } from 'node:http';
|
|
2
|
+
import type { RuntimeHost, RuntimeHostStartOptions } from '../shared/runtime-host.js';
|
|
3
|
+
import { NodeHttpRequestBridge } from './http-request-bridge.js';
|
|
4
|
+
type NodeServerFactory = typeof createServer;
|
|
5
|
+
/**
|
|
6
|
+
* Node runtime host that binds the shared Web-request pipeline onto a concrete
|
|
7
|
+
* Node HTTP server.
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* The host owns only transport concerns: creating the Node listener, converting
|
|
11
|
+
* requests through `NodeHttpRequestBridge`, and handling socket-level failures.
|
|
12
|
+
* Routing and rendering remain in the shared server adapter.
|
|
13
|
+
*/
|
|
14
|
+
export declare class NodeRuntimeHost implements RuntimeHost<NodeServerInstance, {
|
|
15
|
+
port?: number;
|
|
16
|
+
hostname?: string;
|
|
17
|
+
}> {
|
|
18
|
+
private readonly requestBridge;
|
|
19
|
+
private readonly serverFactory;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a Node runtime host with injectable request bridging and server
|
|
22
|
+
* creation seams for tests and alternate hosts.
|
|
23
|
+
*/
|
|
24
|
+
constructor(requestBridge: NodeHttpRequestBridge, serverFactory?: NodeServerFactory);
|
|
25
|
+
/**
|
|
26
|
+
* Starts the Node HTTP server and wires each request through the shared Web
|
|
27
|
+
* request pipeline.
|
|
28
|
+
*
|
|
29
|
+
* @remarks
|
|
30
|
+
* Client disconnects are treated as normal aborts and do not trigger adapter
|
|
31
|
+
* error logging or the runtime host's `onError` callback.
|
|
32
|
+
*/
|
|
33
|
+
start(options: RuntimeHostStartOptions<{
|
|
34
|
+
port?: number;
|
|
35
|
+
hostname?: string;
|
|
36
|
+
}>): Promise<NodeServerInstance>;
|
|
37
|
+
/**
|
|
38
|
+
* Stops the Node HTTP server and, by default, force-closes any remaining open
|
|
39
|
+
* connections.
|
|
40
|
+
*/
|
|
41
|
+
stop(server: NodeServerInstance, options?: {
|
|
42
|
+
force?: boolean;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Resolves the public runtime origin from the bound Node listener.
|
|
46
|
+
*
|
|
47
|
+
* @remarks
|
|
48
|
+
* The host preserves the configured hostname rather than echoing the raw socket
|
|
49
|
+
* address because users care about the requested host contract, not the local
|
|
50
|
+
* bind interface that Node chose internally.
|
|
51
|
+
*/
|
|
52
|
+
getOrigin(server: NodeServerInstance, fallbackServeOptions: {
|
|
53
|
+
port?: number;
|
|
54
|
+
hostname?: string;
|
|
55
|
+
}): string;
|
|
56
|
+
}
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
|
|
3
|
+
import { appLogger } from "../../global/app-logger.js";
|
|
4
|
+
import { resolveServeRuntimeOrigin } from "../shared/runtime-app-bootstrap.js";
|
|
5
|
+
import { isNodeClientAbortError, NodeHttpRequestBridge } from "./http-request-bridge.js";
|
|
6
|
+
class NodeRuntimeHost {
|
|
7
|
+
/**
|
|
8
|
+
* Creates a Node runtime host with injectable request bridging and server
|
|
9
|
+
* creation seams for tests and alternate hosts.
|
|
10
|
+
*/
|
|
11
|
+
constructor(requestBridge, serverFactory = createServer) {
|
|
12
|
+
this.requestBridge = requestBridge;
|
|
13
|
+
this.serverFactory = serverFactory;
|
|
14
|
+
}
|
|
15
|
+
requestBridge;
|
|
16
|
+
serverFactory;
|
|
17
|
+
/**
|
|
18
|
+
* Starts the Node HTTP server and wires each request through the shared Web
|
|
19
|
+
* request pipeline.
|
|
20
|
+
*
|
|
21
|
+
* @remarks
|
|
22
|
+
* Client disconnects are treated as normal aborts and do not trigger adapter
|
|
23
|
+
* error logging or the runtime host's `onError` callback.
|
|
24
|
+
*/
|
|
25
|
+
async start(options) {
|
|
26
|
+
const hostname = String(options.serveOptions.hostname ?? DEFAULT_ECOPAGES_HOSTNAME);
|
|
27
|
+
const port = Number(options.serveOptions.port ?? DEFAULT_ECOPAGES_PORT);
|
|
28
|
+
const runtimeOrigin = resolveServeRuntimeOrigin({ hostname, port });
|
|
29
|
+
const server = this.serverFactory(async (req, res) => {
|
|
30
|
+
try {
|
|
31
|
+
const webRequest = this.requestBridge.createWebRequest(req, runtimeOrigin);
|
|
32
|
+
const response = await options.handleRequest(webRequest);
|
|
33
|
+
await this.requestBridge.sendNodeResponse(res, response);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
if (isNodeClientAbortError(error)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
appLogger.error("Node server adapter request failed", error);
|
|
39
|
+
res.statusCode = 500;
|
|
40
|
+
res.end("Internal Server Error");
|
|
41
|
+
await options.onError(error instanceof Error ? error : new Error(String(error)));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
await new Promise((resolve) => {
|
|
45
|
+
server.listen(port, hostname, () => resolve());
|
|
46
|
+
});
|
|
47
|
+
return server;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Stops the Node HTTP server and, by default, force-closes any remaining open
|
|
51
|
+
* connections.
|
|
52
|
+
*/
|
|
53
|
+
async stop(server, options) {
|
|
54
|
+
await new Promise((resolve, reject) => {
|
|
55
|
+
server.close((error) => {
|
|
56
|
+
if (error) {
|
|
57
|
+
reject(error);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
resolve();
|
|
61
|
+
});
|
|
62
|
+
if (options?.force ?? true) {
|
|
63
|
+
server.closeAllConnections();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Resolves the public runtime origin from the bound Node listener.
|
|
69
|
+
*
|
|
70
|
+
* @remarks
|
|
71
|
+
* The host preserves the configured hostname rather than echoing the raw socket
|
|
72
|
+
* address because users care about the requested host contract, not the local
|
|
73
|
+
* bind interface that Node chose internally.
|
|
74
|
+
*/
|
|
75
|
+
getOrigin(server, fallbackServeOptions) {
|
|
76
|
+
const address = server.address();
|
|
77
|
+
const fallbackHostname = fallbackServeOptions.hostname ?? DEFAULT_ECOPAGES_HOSTNAME;
|
|
78
|
+
if (address && typeof address === "object") {
|
|
79
|
+
return resolveServeRuntimeOrigin({
|
|
80
|
+
hostname: fallbackHostname,
|
|
81
|
+
port: address.port
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return resolveServeRuntimeOrigin({
|
|
85
|
+
hostname: fallbackHostname,
|
|
86
|
+
port: fallbackServeOptions.port
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
NodeRuntimeHost
|
|
92
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { WebSocketServer } from 'ws';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
3
|
+
import { NodeClientBridge } from './node-client-bridge.js';
|
|
4
|
+
import { NodeHmrManager } from './node-hmr-manager.js';
|
|
5
|
+
export interface NodeServerDevRuntime {
|
|
6
|
+
websocketServer: WebSocketServer;
|
|
7
|
+
bridge: NodeClientBridge;
|
|
8
|
+
hmrManager: NodeHmrManager;
|
|
9
|
+
}
|
|
10
|
+
export interface NodeServerDevRuntimeFactory {
|
|
11
|
+
create(options: {
|
|
12
|
+
appConfig: EcoPagesAppConfig;
|
|
13
|
+
}): NodeServerDevRuntime;
|
|
14
|
+
}
|
|
15
|
+
export declare class DefaultNodeServerDevRuntimeFactory implements NodeServerDevRuntimeFactory {
|
|
16
|
+
create(options: {
|
|
17
|
+
appConfig: EcoPagesAppConfig;
|
|
18
|
+
}): NodeServerDevRuntime;
|
|
19
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { WebSocketServer } from "ws";
|
|
2
|
+
import { NodeClientBridge } from "./node-client-bridge.js";
|
|
3
|
+
import { NodeHmrManager } from "./node-hmr-manager.js";
|
|
4
|
+
class DefaultNodeServerDevRuntimeFactory {
|
|
5
|
+
create(options) {
|
|
6
|
+
const websocketServer = new WebSocketServer({ noServer: true });
|
|
7
|
+
const bridge = new NodeClientBridge();
|
|
8
|
+
const hmrManager = new NodeHmrManager({ appConfig: options.appConfig, bridge });
|
|
9
|
+
return {
|
|
10
|
+
websocketServer,
|
|
11
|
+
bridge,
|
|
12
|
+
hmrManager
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
DefaultNodeServerDevRuntimeFactory
|
|
18
|
+
};
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { type Server as NodeHttpServer } from 'node:http';
|
|
2
|
-
import type { EcoPagesAppConfig } from '../../internal-types.js';
|
|
3
|
-
import type { ApiHandler, ErrorHandler, StaticRoute } from '../../public-types.js';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
3
|
+
import type { ApiHandler, ErrorHandler, StaticRoute } from '../../types/public-types.js';
|
|
4
4
|
import { SharedServerAdapter } from '../shared/server-adapter.js';
|
|
5
5
|
import type { ServerAdapterResult } from '../abstract/server-adapter.js';
|
|
6
|
+
import { NodeHttpRequestBridge } from './http-request-bridge.js';
|
|
7
|
+
import type { StaticPreviewHost } from '../shared/static-preview-host.js';
|
|
8
|
+
import { type NodeServerDevRuntimeFactory } from './server-adapter-dependencies.js';
|
|
6
9
|
export type NodeServerInstance = NodeHttpServer;
|
|
7
10
|
export type NodeServeAdapterServerOptions = {
|
|
8
11
|
port?: number;
|
|
@@ -19,6 +22,9 @@ export interface NodeServerAdapterParams {
|
|
|
19
22
|
options?: {
|
|
20
23
|
watch?: boolean;
|
|
21
24
|
};
|
|
25
|
+
previewHost?: StaticPreviewHost;
|
|
26
|
+
requestBridge?: NodeHttpRequestBridge;
|
|
27
|
+
devRuntimeFactory?: NodeServerDevRuntimeFactory;
|
|
22
28
|
}
|
|
23
29
|
export interface NodeServerAdapterResult extends ServerAdapterResult {
|
|
24
30
|
completeInitialization: (server: NodeServerInstance) => Promise<void>;
|
|
@@ -50,10 +56,14 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
50
56
|
private apiHandlers;
|
|
51
57
|
private staticRoutes;
|
|
52
58
|
private errorHandler?;
|
|
53
|
-
private previewServer;
|
|
54
59
|
private bridge;
|
|
55
60
|
private hmrManager;
|
|
56
|
-
private
|
|
61
|
+
private readonly previewHost;
|
|
62
|
+
private readonly requestBridge;
|
|
63
|
+
private readonly devRuntimeFactory;
|
|
64
|
+
private shouldInjectHmrScript;
|
|
65
|
+
private isHtmlResponse;
|
|
66
|
+
private maybeInjectHmrScript;
|
|
57
67
|
constructor(options: NodeServerAdapterParams);
|
|
58
68
|
/**
|
|
59
69
|
* Prepares the adapter for use.
|
|
@@ -69,75 +79,13 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
69
79
|
* processors during their `setup()` calls.
|
|
70
80
|
*/
|
|
71
81
|
initialize(): Promise<void>;
|
|
72
|
-
|
|
73
|
-
* Registers every configured file loader as a build plugin on the shared
|
|
74
|
-
* `defaultBuildAdapter`.
|
|
75
|
-
*
|
|
76
|
-
* Loaders are registered on the *shared* adapter (not on a per-build instance)
|
|
77
|
-
* because they must be available globally to both the SSR build and any dynamic
|
|
78
|
-
* transpile passes that happen outside of a top-level `build()` call (e.g. HMR
|
|
79
|
-
* incremental rebuilds).
|
|
80
|
-
*/
|
|
81
|
-
private setupLoaders;
|
|
82
|
-
private copyPublicDir;
|
|
83
|
-
/**
|
|
84
|
-
* Sets up all configured processors and integrations in two distinct phases.
|
|
85
|
-
*
|
|
86
|
-
* **Phase 1 — Processors:**
|
|
87
|
-
* Each processor's `setup()` is called first. A processor may expose two
|
|
88
|
-
* plugin lists:
|
|
89
|
-
* - `plugins` — transform plugins used during SSR rendering (e.g. PostCSS).
|
|
90
|
-
* - `buildPlugins` — esbuild plugins used during the client bundle step.
|
|
91
|
-
* Both are registered on `defaultBuildAdapter` so later build calls pick them up.
|
|
92
|
-
*
|
|
93
|
-
* **Phase 2 — Integrations:**
|
|
94
|
-
* Integrations receive the fully-resolved app config, the runtime origin, and
|
|
95
|
-
* (if already initialised) the HMR manager before their own `setup()` is called.
|
|
96
|
-
* This ordering ensures integrations can query config values that processors
|
|
97
|
-
* may have mutated during phase 1.
|
|
98
|
-
*/
|
|
99
|
-
private initializePlugins;
|
|
82
|
+
private prepareRuntimePublicDir;
|
|
100
83
|
getServerOptions(): NodeServeAdapterServerOptions;
|
|
101
84
|
buildStatic(options?: {
|
|
102
85
|
preview?: boolean;
|
|
103
86
|
}): Promise<void>;
|
|
104
|
-
/**
|
|
105
|
-
* Converts a Node.js `IncomingMessage` into a Web API `Request`.
|
|
106
|
-
*
|
|
107
|
-
* Multi-value headers (e.g. `set-cookie`) are appended individually so no
|
|
108
|
-
* value is silently dropped.
|
|
109
|
-
*
|
|
110
|
-
* For methods that carry a body (`POST`, `PUT`, `PATCH`, …), the raw
|
|
111
|
-
* `IncomingMessage` stream is wrapped in a `ReadableStream` rather than
|
|
112
|
-
* cast directly to `BodyInit`. See the inline doc block inside the `if`
|
|
113
|
-
* branch for the rationale (client-abort handling).
|
|
114
|
-
*
|
|
115
|
-
* `duplex: 'half'` is required by the `fetch` spec when a streaming body is
|
|
116
|
-
* provided — without it Node.js 18+ throws a `TypeError`.
|
|
117
|
-
*/
|
|
118
|
-
private createWebRequest;
|
|
119
|
-
/**
|
|
120
|
-
* Writes a Web `Response` back to a Node.js `ServerResponse`.
|
|
121
|
-
*
|
|
122
|
-
* The entire body is buffered via `arrayBuffer()` before writing. This is
|
|
123
|
-
* intentional for the current use-case (SSR pages and API routes), where
|
|
124
|
-
* responses are typically small and fully materialised. Streaming responses
|
|
125
|
-
* are not yet supported.
|
|
126
|
-
*/
|
|
127
|
-
private sendNodeResponse;
|
|
128
|
-
/**
|
|
129
|
-
* Starts an ephemeral HTTP server used *only* during a static site generation
|
|
130
|
-
* run.
|
|
131
|
-
*
|
|
132
|
-
* Static generation works by having the `StaticSiteGenerator` issue real HTTP
|
|
133
|
-
* requests to a live server for each route, capturing the rendered HTML. This
|
|
134
|
-
* approach reuses the normal request pipeline (middleware, caching, API
|
|
135
|
-
* handlers) without any special-casing for the build path.
|
|
136
|
-
*
|
|
137
|
-
* The server is torn down immediately after generation completes via
|
|
138
|
-
* `stopBuildRuntimeServer`, so it never overlaps with the actual dev/prod server.
|
|
139
|
-
*/
|
|
140
87
|
private startBuildRuntimeServer;
|
|
88
|
+
private getListeningServerOrigin;
|
|
141
89
|
/**
|
|
142
90
|
* Gracefully shuts down the ephemeral build runtime server.
|
|
143
91
|
*
|
|
@@ -161,7 +109,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
161
109
|
* underlying socket closes early — into a 499 response so it does not
|
|
162
110
|
* incorrectly surface as a 500 in application logs.
|
|
163
111
|
*/
|
|
164
|
-
handleRequest(
|
|
112
|
+
handleRequest(request: Request): Promise<Response>;
|
|
165
113
|
/**
|
|
166
114
|
* Called once the HTTP server is bound and listening.
|
|
167
115
|
*
|
|
@@ -172,13 +120,13 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
172
120
|
* broadcast + heartbeat cleanup.
|
|
173
121
|
* - `NodeHmrManager` watches the filesystem and triggers incremental esbuild
|
|
174
122
|
* rebuilds, notifying connected clients via the bridge.
|
|
175
|
-
* -
|
|
176
|
-
* router and response handlers when pages are added or removed.
|
|
123
|
+
* - Shared watcher bootstrapping listens for route-level file changes and
|
|
124
|
+
* refreshes the router and response handlers when pages are added or removed.
|
|
177
125
|
*
|
|
178
126
|
* WebSocket upgrade requests that do not target `/_hmr` are rejected with an
|
|
179
127
|
* immediate socket destroy to prevent unhandled upgrade leaks.
|
|
180
128
|
*/
|
|
181
|
-
completeInitialization(
|
|
129
|
+
completeInitialization(server: NodeServerInstance): Promise<void>;
|
|
182
130
|
}
|
|
183
131
|
/**
|
|
184
132
|
* Factory function that creates and fully initialises a `NodeServerAdapter`.
|