@ecopages/core 0.2.0-alpha.8 → 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,310 +1,47 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { RESOLVED_ASSETS_DIR } from "../../constants.js";
|
|
4
|
-
import { getAppBuildExecutor } from "../../build/build-adapter.js";
|
|
5
|
-
import { fileSystem } from "@ecopages/file-system";
|
|
6
|
-
import { HmrStrategyType } from "../../hmr/hmr-strategy.js";
|
|
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
|
-
import { HmrEntrypointRegistrar } from "../shared/hmr-entrypoint-registrar.js";
|
|
11
|
-
import { BrowserBundleService } from "../../services/assets/browser-bundle.service.js";
|
|
12
|
-
import { getAppServerModuleTranspiler } from "../../services/module-loading/app-server-module-transpiler.service.js";
|
|
13
2
|
import {
|
|
14
|
-
|
|
15
|
-
InMemoryEntrypointDependencyGraph,
|
|
16
|
-
setAppEntrypointDependencyGraph
|
|
3
|
+
InMemoryEntrypointDependencyGraph
|
|
17
4
|
} from "../../services/runtime-state/entrypoint-dependency-graph.service.js";
|
|
18
|
-
import {
|
|
19
|
-
|
|
20
|
-
class NodeHmrManager {
|
|
21
|
-
static entrypointRegistrationTimeoutMs = 4e3;
|
|
22
|
-
appConfig;
|
|
23
|
-
bridge;
|
|
24
|
-
watchers = /* @__PURE__ */ new Map();
|
|
25
|
-
watchedFiles = /* @__PURE__ */ new Map();
|
|
26
|
-
entrypointRegistrations = /* @__PURE__ */ new Map();
|
|
27
|
-
distDir;
|
|
28
|
-
plugins = [];
|
|
29
|
-
enabled = true;
|
|
30
|
-
strategies = [];
|
|
31
|
-
entrypointRegistrar;
|
|
32
|
-
browserBundleService;
|
|
33
|
-
entrypointDependencyGraph;
|
|
34
|
-
runtimeSpecifierRegistry;
|
|
35
|
-
serverModuleTranspiler;
|
|
36
|
-
constructor({ appConfig, bridge }) {
|
|
37
|
-
this.appConfig = appConfig;
|
|
38
|
-
this.bridge = bridge;
|
|
39
|
-
this.distDir = path.join(resolveInternalWorkDir(this.appConfig), RESOLVED_ASSETS_DIR, "_hmr");
|
|
40
|
-
this.entrypointRegistrar = new HmrEntrypointRegistrar({
|
|
41
|
-
srcDir: this.appConfig.absolutePaths.srcDir,
|
|
42
|
-
distDir: this.distDir,
|
|
43
|
-
entrypointRegistrations: this.entrypointRegistrations,
|
|
44
|
-
watchedFiles: this.watchedFiles,
|
|
45
|
-
clearFailedRegistration: (entrypointPath) => this.clearFailedEntrypointRegistration(entrypointPath),
|
|
46
|
-
registrationTimeoutMs: NodeHmrManager.entrypointRegistrationTimeoutMs
|
|
47
|
-
});
|
|
48
|
-
this.browserBundleService = new BrowserBundleService(appConfig);
|
|
49
|
-
const existingEntrypointDependencyGraph = getAppEntrypointDependencyGraph(appConfig);
|
|
50
|
-
this.entrypointDependencyGraph = existingEntrypointDependencyGraph instanceof InMemoryEntrypointDependencyGraph ? existingEntrypointDependencyGraph : new InMemoryEntrypointDependencyGraph();
|
|
51
|
-
setAppEntrypointDependencyGraph(this.appConfig, this.entrypointDependencyGraph);
|
|
52
|
-
this.runtimeSpecifierRegistry = getAppRuntimeSpecifierRegistry(this.appConfig);
|
|
53
|
-
this.serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
|
|
54
|
-
this.cleanDistDir();
|
|
55
|
-
this.initializeStrategies();
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Ensures the HMR output directory exists.
|
|
59
|
-
*
|
|
60
|
-
* This must not remove the directory because multiple app processes
|
|
61
|
-
* can share the same dist path during e2e runs.
|
|
62
|
-
*/
|
|
63
|
-
cleanDistDir() {
|
|
64
|
-
fileSystem.ensureDir(this.distDir);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Returns whether the generic JS strategy is allowed to rebuild an entrypoint.
|
|
68
|
-
*
|
|
69
|
-
* @remarks
|
|
70
|
-
* Higher-priority integration strategies own framework page entrypoints. When
|
|
71
|
-
* one of them matches, the generic JS strategy must stay out of the way so a
|
|
72
|
-
* shared dependency invalidation does not overwrite framework-specific output.
|
|
73
|
-
*/
|
|
74
|
-
shouldJsStrategyProcessEntrypoint(entrypointPath) {
|
|
75
|
-
return !this.strategies.some((strategy) => {
|
|
76
|
-
if (strategy.type !== HmrStrategyType.INTEGRATION || strategy.priority <= HmrStrategyType.SCRIPT) {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
try {
|
|
80
|
-
return strategy.matches(entrypointPath);
|
|
81
|
-
} catch (error) {
|
|
82
|
-
appLogger.error(error);
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
initializeStrategies() {
|
|
88
|
-
const jsContext = {
|
|
89
|
-
getWatchedFiles: () => this.watchedFiles,
|
|
90
|
-
getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
|
|
91
|
-
getDistDir: () => this.distDir,
|
|
92
|
-
getPlugins: () => this.plugins,
|
|
93
|
-
getSrcDir: () => this.appConfig.absolutePaths.srcDir,
|
|
94
|
-
getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
|
|
95
|
-
getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
|
|
96
|
-
getTemplateExtensions: () => this.appConfig.templatesExt,
|
|
97
|
-
getBrowserBundleService: () => this.browserBundleService,
|
|
98
|
-
getEntrypointDependencyGraph: () => this.entrypointDependencyGraph,
|
|
99
|
-
shouldProcessEntrypoint: (entrypointPath) => this.shouldJsStrategyProcessEntrypoint(entrypointPath)
|
|
100
|
-
};
|
|
101
|
-
this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
|
|
102
|
-
}
|
|
103
|
-
registerStrategy(strategy) {
|
|
104
|
-
this.strategies.push(strategy);
|
|
105
|
-
}
|
|
106
|
-
setPlugins(plugins) {
|
|
107
|
-
this.plugins = [...plugins];
|
|
108
|
-
}
|
|
109
|
-
setEnabled(enabled) {
|
|
110
|
-
this.enabled = enabled;
|
|
111
|
-
}
|
|
112
|
-
isEnabled() {
|
|
113
|
-
return this.enabled;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Registers runtime bare-specifier mappings exposed by integrations.
|
|
117
|
-
*
|
|
118
|
-
* @remarks
|
|
119
|
-
* These mappings are consumed by framework-owned HMR strategies such as the
|
|
120
|
-
* React integration strategy when they rewrite browser bundles. The registry
|
|
121
|
-
* stays generic so the same mappings can support broader import-map-style
|
|
122
|
-
* runtime features later without moving integration semantics into core.
|
|
123
|
-
*/
|
|
124
|
-
registerSpecifierMap(map) {
|
|
125
|
-
this.runtimeSpecifierRegistry.register(map);
|
|
126
|
-
}
|
|
127
|
-
async buildRuntime() {
|
|
128
|
-
const runtimeSource = path.resolve(import.meta.dirname, "../../hmr/client/hmr-runtime.js");
|
|
129
|
-
try {
|
|
130
|
-
const result = await this.browserBundleService.bundle({
|
|
131
|
-
profile: "hmr-runtime",
|
|
132
|
-
entrypoints: [runtimeSource],
|
|
133
|
-
outdir: this.distDir,
|
|
134
|
-
naming: "_hmr_runtime.js",
|
|
135
|
-
minify: false,
|
|
136
|
-
plugins: this.plugins
|
|
137
|
-
});
|
|
138
|
-
if (!result.success) {
|
|
139
|
-
this.enabled = false;
|
|
140
|
-
appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", result.logs);
|
|
141
|
-
}
|
|
142
|
-
} catch (error) {
|
|
143
|
-
this.enabled = false;
|
|
144
|
-
appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", error);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
getRuntimePath() {
|
|
148
|
-
return path.join(this.distDir, "_hmr_runtime.js");
|
|
149
|
-
}
|
|
150
|
-
broadcast(event) {
|
|
151
|
-
appLogger.debug(
|
|
152
|
-
`[HMR] Broadcasting ${event.type} event, path=${event.path || "all"}, subscribers=${this.bridge.subscriberCount}`
|
|
153
|
-
);
|
|
154
|
-
this.bridge.broadcast(event);
|
|
155
|
-
}
|
|
156
|
-
async handleFileChange(filePath, options = {}) {
|
|
157
|
-
const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
|
|
158
|
-
const strategy = sorted.find((s) => {
|
|
159
|
-
try {
|
|
160
|
-
return s.matches(filePath);
|
|
161
|
-
} catch (err) {
|
|
162
|
-
appLogger.error(err);
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
if (!strategy) {
|
|
167
|
-
appLogger.warn(`[HMR] No strategy found for ${filePath}`);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
appLogger.debug(`[NodeHmrManager] Selected strategy: ${strategy.constructor.name}`);
|
|
171
|
-
const action = await strategy.process(filePath);
|
|
172
|
-
const shouldBroadcast = options.broadcast ?? true;
|
|
173
|
-
if (shouldBroadcast && action.type === "broadcast") {
|
|
174
|
-
if (action.events) {
|
|
175
|
-
for (const event of action.events) {
|
|
176
|
-
this.broadcast(event);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
getOutputUrl(entrypointPath) {
|
|
182
|
-
return this.watchedFiles.get(entrypointPath);
|
|
183
|
-
}
|
|
184
|
-
getWatchedFiles() {
|
|
185
|
-
return this.watchedFiles;
|
|
186
|
-
}
|
|
187
|
-
getSpecifierMap() {
|
|
188
|
-
return this.runtimeSpecifierRegistry.getAll();
|
|
189
|
-
}
|
|
190
|
-
getDistDir() {
|
|
191
|
-
return this.distDir;
|
|
192
|
-
}
|
|
193
|
-
getPlugins() {
|
|
194
|
-
return this.plugins;
|
|
195
|
-
}
|
|
196
|
-
getDefaultContext() {
|
|
197
|
-
return {
|
|
198
|
-
getWatchedFiles: () => this.watchedFiles,
|
|
199
|
-
getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
|
|
200
|
-
getDistDir: () => this.distDir,
|
|
201
|
-
getPlugins: () => this.plugins,
|
|
202
|
-
getSrcDir: () => this.appConfig.absolutePaths.srcDir,
|
|
203
|
-
getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
|
|
204
|
-
getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
|
|
205
|
-
getBuildExecutor: () => getAppBuildExecutor(this.appConfig),
|
|
206
|
-
getBrowserBundleService: () => this.browserBundleService,
|
|
207
|
-
importServerModule: async (filePath) => await this.serverModuleTranspiler.importModule({
|
|
208
|
-
filePath,
|
|
209
|
-
outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-modules"),
|
|
210
|
-
externalPackages: true
|
|
211
|
-
})
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
clearFailedEntrypointRegistration(entrypointPath) {
|
|
215
|
-
this.watchedFiles.delete(entrypointPath);
|
|
216
|
-
this.entrypointDependencyGraph.clearEntrypointDependencies(entrypointPath);
|
|
217
|
-
}
|
|
5
|
+
import { SharedHmrManager } from "../shared/shared-hmr-manager.js";
|
|
6
|
+
class NodeHmrManager extends SharedHmrManager {
|
|
218
7
|
/**
|
|
219
|
-
*
|
|
8
|
+
* Creates the Node HMR manager over the shared coordination pipeline.
|
|
220
9
|
*
|
|
221
10
|
* @remarks
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
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.
|
|
225
15
|
*/
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
emit: async (normalizedEntrypoint, outputPath) => await this.emitStrictEntrypoint(normalizedEntrypoint, outputPath),
|
|
229
|
-
getMissingOutputError: (normalizedEntrypoint, outputPath) => new Error(
|
|
230
|
-
`[HMR] Integration failed to emit entrypoint ${normalizedEntrypoint} to ${outputPath}. Page entrypoints must be produced by their owning integration.`
|
|
231
|
-
)
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Registers one generic script entrypoint.
|
|
236
|
-
*
|
|
237
|
-
* @remarks
|
|
238
|
-
* This path is intentionally separate from page entrypoints so non-framework
|
|
239
|
-
* scripts can still use the generic build fallback without weakening the page
|
|
240
|
-
* ownership contract.
|
|
241
|
-
*/
|
|
242
|
-
async registerScriptEntrypoint(entrypointPath) {
|
|
243
|
-
return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
|
|
244
|
-
emit: async (normalizedEntrypoint, outputPath) => await this.emitScriptEntrypoint(normalizedEntrypoint, outputPath),
|
|
245
|
-
getMissingOutputError: (normalizedEntrypoint) => new Error(`[HMR] Failed to register script entrypoint: ${normalizedEntrypoint}`)
|
|
246
|
-
});
|
|
16
|
+
constructor({ appConfig, bridge }) {
|
|
17
|
+
super({ appConfig, bridge });
|
|
247
18
|
}
|
|
248
19
|
/**
|
|
249
|
-
*
|
|
250
|
-
*
|
|
251
|
-
* @remarks
|
|
252
|
-
* The flow is:
|
|
253
|
-
* 1. Reserve the output URL in the watched map.
|
|
254
|
-
* 2. Remove any stale emitted file from an earlier process or failed build.
|
|
255
|
-
* 3. Let the strategy chain try to emit the entrypoint without broadcasting.
|
|
256
|
-
* 4. Fail if the owning integration did not emit the expected output.
|
|
20
|
+
* Reuses the shared in-memory dependency graph when the app already has one and
|
|
21
|
+
* otherwise creates the default Node development graph.
|
|
257
22
|
*/
|
|
258
|
-
|
|
259
|
-
|
|
23
|
+
createEntrypointDependencyGraph(existingEntrypointDependencyGraph) {
|
|
24
|
+
return existingEntrypointDependencyGraph instanceof InMemoryEntrypointDependencyGraph ? existingEntrypointDependencyGraph : new InMemoryEntrypointDependencyGraph();
|
|
260
25
|
}
|
|
261
26
|
/**
|
|
262
|
-
*
|
|
27
|
+
* Tells the shared HMR manager to ignore missing-file events during Node watch
|
|
28
|
+
* mode.
|
|
263
29
|
*
|
|
264
30
|
* @remarks
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
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.
|
|
268
34
|
*/
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
await this.handleFileChange(entrypointPath, { broadcast: false });
|
|
272
|
-
if (!fileSystem.exists(outputPath)) {
|
|
273
|
-
const buildResult = await this.browserBundleService.bundle({
|
|
274
|
-
profile: "hmr-entrypoint",
|
|
275
|
-
entrypoints: [entrypointPath],
|
|
276
|
-
outdir: this.distDir,
|
|
277
|
-
naming,
|
|
278
|
-
minify: false,
|
|
279
|
-
plugins: this.plugins
|
|
280
|
-
});
|
|
281
|
-
if (!buildResult.success) {
|
|
282
|
-
appLogger.error(
|
|
283
|
-
`[HMR] Generic script entrypoint build failed for ${entrypointPath}:`,
|
|
284
|
-
buildResult.logs
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
35
|
+
shouldSkipMissingFileChange(_filePath) {
|
|
36
|
+
return true;
|
|
288
37
|
}
|
|
289
38
|
/**
|
|
290
|
-
*
|
|
291
|
-
*
|
|
292
|
-
* @remarks
|
|
293
|
-
* The manager intentionally does not remove emitted `_hmr` files from disk
|
|
294
|
-
* because multiple app processes may share the same dist directory during test
|
|
295
|
-
* runs. It does clear in-memory indexes so old entrypoints, dependencies, and
|
|
296
|
-
* specifier maps cannot leak across a reused manager instance.
|
|
39
|
+
* Disables HMR after a runtime bundle failure so the Node dev server can keep
|
|
40
|
+
* serving requests without repeatedly emitting broken updates.
|
|
297
41
|
*/
|
|
298
|
-
|
|
299
|
-
this.
|
|
300
|
-
|
|
301
|
-
watcher.close();
|
|
302
|
-
}
|
|
303
|
-
this.watchers.clear();
|
|
304
|
-
this.watchedFiles.clear();
|
|
305
|
-
this.runtimeSpecifierRegistry.clear();
|
|
306
|
-
this.entrypointDependencyGraph.reset();
|
|
307
|
-
this.plugins = [];
|
|
42
|
+
onRuntimeBundleFailure(error) {
|
|
43
|
+
this.enabled = false;
|
|
44
|
+
appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", error);
|
|
308
45
|
}
|
|
309
46
|
}
|
|
310
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,9 +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;
|
|
61
|
+
private readonly previewHost;
|
|
62
|
+
private readonly requestBridge;
|
|
63
|
+
private readonly devRuntimeFactory;
|
|
64
|
+
private shouldInjectHmrScript;
|
|
65
|
+
private isHtmlResponse;
|
|
66
|
+
private maybeInjectHmrScript;
|
|
56
67
|
constructor(options: NodeServerAdapterParams);
|
|
57
68
|
/**
|
|
58
69
|
* Prepares the adapter for use.
|
|
@@ -68,47 +79,13 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
68
79
|
* processors during their `setup()` calls.
|
|
69
80
|
*/
|
|
70
81
|
initialize(): Promise<void>;
|
|
82
|
+
private prepareRuntimePublicDir;
|
|
71
83
|
getServerOptions(): NodeServeAdapterServerOptions;
|
|
72
84
|
buildStatic(options?: {
|
|
73
85
|
preview?: boolean;
|
|
74
86
|
}): Promise<void>;
|
|
75
|
-
/**
|
|
76
|
-
* Converts a Node.js `IncomingMessage` into a Web API `Request`.
|
|
77
|
-
*
|
|
78
|
-
* Multi-value headers (e.g. `set-cookie`) are appended individually so no
|
|
79
|
-
* value is silently dropped.
|
|
80
|
-
*
|
|
81
|
-
* For methods that carry a body (`POST`, `PUT`, `PATCH`, …), the raw
|
|
82
|
-
* `IncomingMessage` stream is wrapped in a `ReadableStream` rather than
|
|
83
|
-
* cast directly to `BodyInit`. See the inline doc block inside the `if`
|
|
84
|
-
* branch for the rationale (client-abort handling).
|
|
85
|
-
*
|
|
86
|
-
* `duplex: 'half'` is required by the `fetch` spec when a streaming body is
|
|
87
|
-
* provided — without it Node.js 18+ throws a `TypeError`.
|
|
88
|
-
*/
|
|
89
|
-
private createWebRequest;
|
|
90
|
-
/**
|
|
91
|
-
* Writes a Web `Response` back to a Node.js `ServerResponse`.
|
|
92
|
-
*
|
|
93
|
-
* The entire body is buffered via `arrayBuffer()` before writing. This is
|
|
94
|
-
* intentional for the current use-case (SSR pages and API routes), where
|
|
95
|
-
* responses are typically small and fully materialised. Streaming responses
|
|
96
|
-
* are not yet supported.
|
|
97
|
-
*/
|
|
98
|
-
private sendNodeResponse;
|
|
99
|
-
/**
|
|
100
|
-
* Starts an ephemeral HTTP server used *only* during a static site generation
|
|
101
|
-
* run.
|
|
102
|
-
*
|
|
103
|
-
* Static generation works by having the `StaticSiteGenerator` issue real HTTP
|
|
104
|
-
* requests to a live server for each route, capturing the rendered HTML. This
|
|
105
|
-
* approach reuses the normal request pipeline (middleware, caching, API
|
|
106
|
-
* handlers) without any special-casing for the build path.
|
|
107
|
-
*
|
|
108
|
-
* The server is torn down immediately after generation completes via
|
|
109
|
-
* `stopBuildRuntimeServer`, so it never overlaps with the actual dev/prod server.
|
|
110
|
-
*/
|
|
111
87
|
private startBuildRuntimeServer;
|
|
88
|
+
private getListeningServerOrigin;
|
|
112
89
|
/**
|
|
113
90
|
* Gracefully shuts down the ephemeral build runtime server.
|
|
114
91
|
*
|
|
@@ -132,7 +109,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
132
109
|
* underlying socket closes early — into a 499 response so it does not
|
|
133
110
|
* incorrectly surface as a 500 in application logs.
|
|
134
111
|
*/
|
|
135
|
-
handleRequest(
|
|
112
|
+
handleRequest(request: Request): Promise<Response>;
|
|
136
113
|
/**
|
|
137
114
|
* Called once the HTTP server is bound and listening.
|
|
138
115
|
*
|
|
@@ -141,7 +118,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
141
118
|
* `upgrade` event (no separate port needed).
|
|
142
119
|
* - `NodeClientBridge` tracks active WebSocket connections and handles
|
|
143
120
|
* broadcast + heartbeat cleanup.
|
|
144
|
-
* - `NodeHmrManager` watches the filesystem and triggers incremental
|
|
121
|
+
* - `NodeHmrManager` watches the filesystem and triggers incremental
|
|
145
122
|
* rebuilds, notifying connected clients via the bridge.
|
|
146
123
|
* - Shared watcher bootstrapping listens for route-level file changes and
|
|
147
124
|
* refreshes the router and response handlers when pages are added or removed.
|
|
@@ -149,7 +126,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
149
126
|
* WebSocket upgrade requests that do not target `/_hmr` are rejected with an
|
|
150
127
|
* immediate socket destroy to prevent unhandled upgrade leaks.
|
|
151
128
|
*/
|
|
152
|
-
completeInitialization(
|
|
129
|
+
completeInitialization(server: NodeServerInstance): Promise<void>;
|
|
153
130
|
}
|
|
154
131
|
/**
|
|
155
132
|
* Factory function that creates and fully initialises a `NodeServerAdapter`.
|