@ecopages/core 0.2.0-alpha.3 → 0.2.0-alpha.31
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/CHANGELOG.md +66 -66
- package/README.md +268 -14
- package/package.json +72 -108
- 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 +5 -12
- package/src/adapters/bun/create-app.js +43 -7
- package/src/adapters/bun/hmr-manager.d.ts +72 -26
- package/src/adapters/bun/hmr-manager.js +153 -81
- package/src/adapters/bun/index.d.ts +2 -3
- package/src/adapters/bun/index.js +3 -3
- package/src/adapters/bun/server-adapter.d.ts +5 -5
- package/src/adapters/bun/server-adapter.js +63 -38
- package/src/adapters/bun/server-lifecycle.d.ts +28 -17
- package/src/adapters/bun/server-lifecycle.js +34 -62
- 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 +6 -9
- package/src/adapters/node/create-app.js +12 -6
- package/src/adapters/node/node-client-bridge.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.d.ts +79 -21
- package/src/adapters/node/node-hmr-manager.js +167 -114
- package/src/adapters/node/server-adapter.d.ts +7 -35
- package/src/adapters/node/server-adapter.js +55 -107
- package/src/adapters/node/static-content-server.d.ts +37 -1
- package/src/adapters/node/static-content-server.js +29 -1
- 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 +32 -0
- package/src/adapters/shared/render-context.d.ts +4 -3
- package/src/adapters/shared/render-context.js +6 -3
- package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
- package/src/adapters/shared/runtime-bootstrap.js +43 -0
- package/src/adapters/shared/server-adapter.d.ts +33 -12
- package/src/adapters/shared/server-adapter.js +208 -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/build/README.md +107 -0
- package/src/build/build-adapter.d.ts +168 -3
- package/src/build/build-adapter.js +604 -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 +15 -6
- package/src/build/esbuild-build-adapter.js +189 -74
- 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 +255 -49
- 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 +83 -0
- package/src/eco/eco.js +32 -57
- package/src/eco/eco.types.d.ts +14 -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 +46 -48
- package/src/hmr/strategies/js-hmr-strategy.js +64 -74
- 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.js +17 -3
- package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
- package/src/plugins/eco-component-meta-plugin.js +27 -22
- package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
- package/src/plugins/foreign-jsx-override-plugin.js +35 -0
- package/src/plugins/integration-plugin.d.ts +142 -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 +89 -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 +108 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +206 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +516 -0
- package/src/route-renderer/orchestration/integration-renderer.js +909 -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 +2 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +90 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +158 -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 +120 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.js +388 -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/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 +3 -0
- package/src/services/assets/asset-processing-service/page-package.js +74 -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 +119 -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/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +12 -7
- 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 +37 -0
- package/src/services/html/html-rewriter-provider.service.js +68 -0
- package/src/services/html/html-transformer.service.d.ts +87 -0
- package/src/services/html/html-transformer.service.js +216 -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-server-module-transpiler.service.d.ts +24 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +115 -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 +42 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +216 -0
- package/src/services/module-loading/page-module-import.service.d.ts +76 -0
- package/src/services/module-loading/page-module-import.service.js +170 -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} +201 -32
- 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 +40 -29
- package/src/watchers/project-watcher.js +126 -116
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +6 -6
- 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 -296
- package/src/adapters/bun/index.ts +0 -3
- package/src/adapters/bun/server-adapter.ts +0 -492
- 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 -289
- 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 -132
- package/src/build/build-types.ts +0 -83
- package/src/build/esbuild-build-adapter.ts +0 -510
- 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/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
- package/src/hmr/client/hmr-runtime.ts +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 -320
- 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 -1260
- 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.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 -41
- package/src/watchers/project-watcher.ts +0 -344
- /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
- /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.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/{public-types.js → services/module-loading/app-module-loader.service.js} +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -1,29 +1,42 @@
|
|
|
1
|
-
import type { DefaultHmrContext, EcoPagesAppConfig, IHmrManager, IClientBridge } from '../../internal-types.js';
|
|
1
|
+
import type { DefaultHmrContext, EcoPagesAppConfig, IHmrManager, IClientBridge } from '../../types/internal-types.js';
|
|
2
2
|
import type { EcoBuildPlugin } from '../../build/build-types.js';
|
|
3
|
-
import type
|
|
4
|
-
import type { ClientBridgeEvent } from '../../public-types.js';
|
|
3
|
+
import { type HmrStrategy } from '../../hmr/hmr-strategy.js';
|
|
4
|
+
import type { ClientBridgeEvent } from '../../types/public-types.js';
|
|
5
5
|
export interface NodeHmrManagerParams {
|
|
6
6
|
appConfig: EcoPagesAppConfig;
|
|
7
7
|
bridge: IClientBridge;
|
|
8
8
|
}
|
|
9
|
+
type HandleFileChangeOptions = {
|
|
10
|
+
broadcast?: boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Node development HMR manager.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* This manager owns three separate concerns:
|
|
17
|
+
* - runtime websocket event fanout
|
|
18
|
+
* - entrypoint registration and dedupe
|
|
19
|
+
* - strategy coordination for rebuilds and invalidation
|
|
20
|
+
*
|
|
21
|
+
* The strict page-entrypoint contract lives here: `registerEntrypoint()` is
|
|
22
|
+
* reserved for integration-owned page bundles, while generic script assets must
|
|
23
|
+
* go through `registerScriptEntrypoint()`.
|
|
24
|
+
*/
|
|
9
25
|
export declare class NodeHmrManager implements IHmrManager {
|
|
26
|
+
private static readonly entrypointRegistrationTimeoutMs;
|
|
10
27
|
readonly appConfig: EcoPagesAppConfig;
|
|
11
28
|
private readonly bridge;
|
|
12
29
|
private watchers;
|
|
13
30
|
private watchedFiles;
|
|
14
|
-
private
|
|
15
|
-
/**
|
|
16
|
-
* Node-only reverse invalidation index: dependency file -> affected entrypoints.
|
|
17
|
-
*/
|
|
18
|
-
private dependencyEntrypoints;
|
|
19
|
-
/**
|
|
20
|
-
* Node-only forward index: entrypoint -> latest dependency set.
|
|
21
|
-
*/
|
|
22
|
-
private entrypointDependencies;
|
|
31
|
+
private entrypointRegistrations;
|
|
23
32
|
private distDir;
|
|
24
33
|
private plugins;
|
|
25
34
|
private enabled;
|
|
26
35
|
private strategies;
|
|
36
|
+
private readonly entrypointRegistrar;
|
|
37
|
+
private readonly browserBundleService;
|
|
38
|
+
private readonly entrypointDependencyGraph;
|
|
39
|
+
private readonly serverModuleTranspiler;
|
|
27
40
|
constructor({ appConfig, bridge }: NodeHmrManagerParams);
|
|
28
41
|
/**
|
|
29
42
|
* Ensures the HMR output directory exists.
|
|
@@ -32,32 +45,77 @@ export declare class NodeHmrManager implements IHmrManager {
|
|
|
32
45
|
* can share the same dist path during e2e runs.
|
|
33
46
|
*/
|
|
34
47
|
private cleanDistDir;
|
|
48
|
+
/**
|
|
49
|
+
* Returns whether the generic JS strategy is allowed to rebuild an entrypoint.
|
|
50
|
+
*
|
|
51
|
+
* @remarks
|
|
52
|
+
* Higher-priority integration strategies own framework page entrypoints. When
|
|
53
|
+
* one of them matches, the generic JS strategy must stay out of the way so a
|
|
54
|
+
* shared dependency invalidation does not overwrite framework-specific output.
|
|
55
|
+
*/
|
|
56
|
+
private shouldJsStrategyProcessEntrypoint;
|
|
35
57
|
private initializeStrategies;
|
|
36
58
|
registerStrategy(strategy: HmrStrategy): void;
|
|
37
59
|
setPlugins(plugins: EcoBuildPlugin[]): void;
|
|
38
60
|
setEnabled(enabled: boolean): void;
|
|
39
61
|
isEnabled(): boolean;
|
|
40
|
-
registerSpecifierMap(map: Record<string, string>): void;
|
|
41
62
|
buildRuntime(): Promise<void>;
|
|
42
63
|
getRuntimePath(): string;
|
|
43
64
|
broadcast(event: ClientBridgeEvent): void;
|
|
44
|
-
|
|
45
|
-
handleFileChange(filePath: string): Promise<void>;
|
|
65
|
+
handleFileChange(filePath: string, options?: HandleFileChangeOptions): Promise<void>;
|
|
46
66
|
getOutputUrl(entrypointPath: string): string | undefined;
|
|
47
67
|
getWatchedFiles(): Map<string, string>;
|
|
48
|
-
getSpecifierMap(): Map<string, string>;
|
|
49
68
|
getDistDir(): string;
|
|
50
69
|
getPlugins(): EcoBuildPlugin[];
|
|
51
70
|
getDefaultContext(): DefaultHmrContext;
|
|
71
|
+
private clearFailedEntrypointRegistration;
|
|
52
72
|
/**
|
|
53
|
-
*
|
|
73
|
+
* Registers one integration-owned page entrypoint.
|
|
54
74
|
*
|
|
55
75
|
* @remarks
|
|
56
|
-
*
|
|
57
|
-
*
|
|
76
|
+
* Concurrent callers share one in-flight registration. The registration is
|
|
77
|
+
* removed from the dedupe map once it resolves or fails so later requests do
|
|
78
|
+
* not inherit stale state.
|
|
58
79
|
*/
|
|
59
|
-
private setEntrypointDependencies;
|
|
60
80
|
registerEntrypoint(entrypointPath: string): Promise<string>;
|
|
61
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Registers one generic script entrypoint.
|
|
83
|
+
*
|
|
84
|
+
* @remarks
|
|
85
|
+
* This path is intentionally separate from page entrypoints so non-framework
|
|
86
|
+
* scripts can still use the generic build fallback without weakening the page
|
|
87
|
+
* ownership contract.
|
|
88
|
+
*/
|
|
89
|
+
registerScriptEntrypoint(entrypointPath: string): Promise<string>;
|
|
90
|
+
/**
|
|
91
|
+
* Performs strict integration-owned entrypoint registration for one normalized source path.
|
|
92
|
+
*
|
|
93
|
+
* @remarks
|
|
94
|
+
* The flow is:
|
|
95
|
+
* 1. Reserve the output URL in the watched map.
|
|
96
|
+
* 2. Remove any stale emitted file from an earlier process or failed build.
|
|
97
|
+
* 3. Let the strategy chain try to emit the entrypoint without broadcasting.
|
|
98
|
+
* 4. Fail if the owning integration did not emit the expected output.
|
|
99
|
+
*/
|
|
100
|
+
private emitStrictEntrypoint;
|
|
101
|
+
/**
|
|
102
|
+
* Performs registration for a generic script asset.
|
|
103
|
+
*
|
|
104
|
+
* @remarks
|
|
105
|
+
* This path performs a targeted browser bundle for the requested script
|
|
106
|
+
* entrypoint only. The resulting dependency graph is retained so later file
|
|
107
|
+
* changes can invalidate just the affected script entrypoints.
|
|
108
|
+
*/
|
|
109
|
+
private emitScriptEntrypoint;
|
|
110
|
+
/**
|
|
111
|
+
* Stops active watchers and releases retained registration state.
|
|
112
|
+
*
|
|
113
|
+
* @remarks
|
|
114
|
+
* The manager intentionally does not remove emitted `_hmr` files from disk
|
|
115
|
+
* because multiple app processes may share the same dist directory during test
|
|
116
|
+
* runs. It does clear in-memory indexes so old entrypoints and dependencies
|
|
117
|
+
* cannot leak across a reused manager instance.
|
|
118
|
+
*/
|
|
62
119
|
stop(): void;
|
|
63
120
|
}
|
|
121
|
+
export {};
|
|
@@ -1,35 +1,53 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { defaultBuildAdapter } from "../../build/build-adapter.js";
|
|
3
|
+
import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
|
|
4
|
+
import { getAppBuildExecutor } from "../../build/build-adapter.js";
|
|
6
5
|
import { fileSystem } from "@ecopages/file-system";
|
|
7
6
|
import { HmrStrategyType } from "../../hmr/hmr-strategy.js";
|
|
8
7
|
import { DefaultHmrStrategy } from "../../hmr/strategies/default-hmr-strategy.js";
|
|
9
8
|
import { JsHmrStrategy } from "../../hmr/strategies/js-hmr-strategy.js";
|
|
10
9
|
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
|
+
import {
|
|
14
|
+
getAppEntrypointDependencyGraph,
|
|
15
|
+
InMemoryEntrypointDependencyGraph,
|
|
16
|
+
setAppEntrypointDependencyGraph
|
|
17
|
+
} from "../../services/runtime-state/entrypoint-dependency-graph.service.js";
|
|
18
|
+
import { resolveInternalExecutionDir, resolveInternalWorkDir } from "../../utils/resolve-work-dir.js";
|
|
11
19
|
class NodeHmrManager {
|
|
20
|
+
static entrypointRegistrationTimeoutMs = 4e3;
|
|
12
21
|
appConfig;
|
|
13
22
|
bridge;
|
|
14
23
|
watchers = /* @__PURE__ */ new Map();
|
|
15
24
|
watchedFiles = /* @__PURE__ */ new Map();
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Node-only reverse invalidation index: dependency file -> affected entrypoints.
|
|
19
|
-
*/
|
|
20
|
-
dependencyEntrypoints = /* @__PURE__ */ new Map();
|
|
21
|
-
/**
|
|
22
|
-
* Node-only forward index: entrypoint -> latest dependency set.
|
|
23
|
-
*/
|
|
24
|
-
entrypointDependencies = /* @__PURE__ */ new Map();
|
|
25
|
+
entrypointRegistrations = /* @__PURE__ */ new Map();
|
|
25
26
|
distDir;
|
|
26
27
|
plugins = [];
|
|
27
28
|
enabled = true;
|
|
28
29
|
strategies = [];
|
|
30
|
+
entrypointRegistrar;
|
|
31
|
+
browserBundleService;
|
|
32
|
+
entrypointDependencyGraph;
|
|
33
|
+
serverModuleTranspiler;
|
|
29
34
|
constructor({ appConfig, bridge }) {
|
|
30
35
|
this.appConfig = appConfig;
|
|
31
36
|
this.bridge = bridge;
|
|
32
|
-
this.distDir = path.join(this.appConfig
|
|
37
|
+
this.distDir = path.join(resolveInternalWorkDir(this.appConfig), RESOLVED_ASSETS_DIR, "_hmr");
|
|
38
|
+
this.entrypointRegistrar = new HmrEntrypointRegistrar({
|
|
39
|
+
srcDir: this.appConfig.absolutePaths.srcDir,
|
|
40
|
+
distDir: this.distDir,
|
|
41
|
+
entrypointRegistrations: this.entrypointRegistrations,
|
|
42
|
+
watchedFiles: this.watchedFiles,
|
|
43
|
+
clearFailedRegistration: (entrypointPath) => this.clearFailedEntrypointRegistration(entrypointPath),
|
|
44
|
+
registrationTimeoutMs: NodeHmrManager.entrypointRegistrationTimeoutMs
|
|
45
|
+
});
|
|
46
|
+
this.browserBundleService = new BrowserBundleService(appConfig);
|
|
47
|
+
const existingEntrypointDependencyGraph = getAppEntrypointDependencyGraph(appConfig);
|
|
48
|
+
this.entrypointDependencyGraph = existingEntrypointDependencyGraph instanceof InMemoryEntrypointDependencyGraph ? existingEntrypointDependencyGraph : new InMemoryEntrypointDependencyGraph();
|
|
49
|
+
setAppEntrypointDependencyGraph(this.appConfig, this.entrypointDependencyGraph);
|
|
50
|
+
this.serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
|
|
33
51
|
this.cleanDistDir();
|
|
34
52
|
this.initializeStrategies();
|
|
35
53
|
}
|
|
@@ -42,15 +60,39 @@ class NodeHmrManager {
|
|
|
42
60
|
cleanDistDir() {
|
|
43
61
|
fileSystem.ensureDir(this.distDir);
|
|
44
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns whether the generic JS strategy is allowed to rebuild an entrypoint.
|
|
65
|
+
*
|
|
66
|
+
* @remarks
|
|
67
|
+
* Higher-priority integration strategies own framework page entrypoints. When
|
|
68
|
+
* one of them matches, the generic JS strategy must stay out of the way so a
|
|
69
|
+
* shared dependency invalidation does not overwrite framework-specific output.
|
|
70
|
+
*/
|
|
71
|
+
shouldJsStrategyProcessEntrypoint(entrypointPath) {
|
|
72
|
+
return !this.strategies.some((strategy) => {
|
|
73
|
+
if (strategy.type !== HmrStrategyType.INTEGRATION || strategy.priority <= HmrStrategyType.SCRIPT) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
return strategy.matches(entrypointPath);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
appLogger.error(error);
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
45
84
|
initializeStrategies() {
|
|
46
85
|
const jsContext = {
|
|
47
86
|
getWatchedFiles: () => this.watchedFiles,
|
|
48
|
-
getSpecifierMap: () => this.specifierMap,
|
|
49
|
-
getDependencyEntrypoints: (filePath) => new Set(this.dependencyEntrypoints.get(path.resolve(filePath)) ?? []),
|
|
50
|
-
setEntrypointDependencies: (entrypointPath, dependencies) => this.setEntrypointDependencies(entrypointPath, dependencies),
|
|
51
87
|
getDistDir: () => this.distDir,
|
|
52
88
|
getPlugins: () => this.plugins,
|
|
53
|
-
getSrcDir: () => this.appConfig.absolutePaths.srcDir
|
|
89
|
+
getSrcDir: () => this.appConfig.absolutePaths.srcDir,
|
|
90
|
+
getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
|
|
91
|
+
getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
|
|
92
|
+
getTemplateExtensions: () => this.appConfig.templatesExt,
|
|
93
|
+
getBrowserBundleService: () => this.browserBundleService,
|
|
94
|
+
getEntrypointDependencyGraph: () => this.entrypointDependencyGraph,
|
|
95
|
+
shouldProcessEntrypoint: (entrypointPath) => this.shouldJsStrategyProcessEntrypoint(entrypointPath)
|
|
54
96
|
};
|
|
55
97
|
this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
|
|
56
98
|
}
|
|
@@ -66,24 +108,24 @@ class NodeHmrManager {
|
|
|
66
108
|
isEnabled() {
|
|
67
109
|
return this.enabled;
|
|
68
110
|
}
|
|
69
|
-
registerSpecifierMap(map) {
|
|
70
|
-
for (const [specifier, url] of Object.entries(map)) {
|
|
71
|
-
this.specifierMap.set(specifier, url);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
111
|
async buildRuntime() {
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
112
|
+
const runtimeSource = path.resolve(import.meta.dirname, "../../hmr/client/hmr-runtime.js");
|
|
113
|
+
try {
|
|
114
|
+
const result = await this.browserBundleService.bundle({
|
|
115
|
+
profile: "hmr-runtime",
|
|
116
|
+
entrypoints: [runtimeSource],
|
|
117
|
+
outdir: this.distDir,
|
|
118
|
+
naming: "_hmr_runtime.js",
|
|
119
|
+
minify: false,
|
|
120
|
+
plugins: this.plugins
|
|
121
|
+
});
|
|
122
|
+
if (!result.success) {
|
|
123
|
+
this.enabled = false;
|
|
124
|
+
appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", result.logs);
|
|
125
|
+
}
|
|
126
|
+
} catch (error) {
|
|
127
|
+
this.enabled = false;
|
|
128
|
+
appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", error);
|
|
87
129
|
}
|
|
88
130
|
}
|
|
89
131
|
getRuntimePath() {
|
|
@@ -95,28 +137,13 @@ class NodeHmrManager {
|
|
|
95
137
|
);
|
|
96
138
|
this.bridge.broadcast(event);
|
|
97
139
|
}
|
|
98
|
-
|
|
99
|
-
const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
|
|
100
|
-
const strategy = sorted.find((candidate) => {
|
|
101
|
-
try {
|
|
102
|
-
return candidate.matches(filePath);
|
|
103
|
-
} catch (err) {
|
|
104
|
-
appLogger.error(
|
|
105
|
-
`[NodeHmrManager] Error checking match for ${candidate.constructor.name}:`,
|
|
106
|
-
err
|
|
107
|
-
);
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
return strategy !== void 0 && strategy.type !== HmrStrategyType.FALLBACK;
|
|
112
|
-
}
|
|
113
|
-
async handleFileChange(filePath) {
|
|
140
|
+
async handleFileChange(filePath, options = {}) {
|
|
114
141
|
const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
|
|
115
142
|
const strategy = sorted.find((s) => {
|
|
116
143
|
try {
|
|
117
144
|
return s.matches(filePath);
|
|
118
145
|
} catch (err) {
|
|
119
|
-
appLogger.error(
|
|
146
|
+
appLogger.error(err);
|
|
120
147
|
return false;
|
|
121
148
|
}
|
|
122
149
|
});
|
|
@@ -126,7 +153,8 @@ class NodeHmrManager {
|
|
|
126
153
|
}
|
|
127
154
|
appLogger.debug(`[NodeHmrManager] Selected strategy: ${strategy.constructor.name}`);
|
|
128
155
|
const action = await strategy.process(filePath);
|
|
129
|
-
|
|
156
|
+
const shouldBroadcast = options.broadcast ?? true;
|
|
157
|
+
if (shouldBroadcast && action.type === "broadcast") {
|
|
130
158
|
if (action.events) {
|
|
131
159
|
for (const event of action.events) {
|
|
132
160
|
this.broadcast(event);
|
|
@@ -140,9 +168,6 @@ class NodeHmrManager {
|
|
|
140
168
|
getWatchedFiles() {
|
|
141
169
|
return this.watchedFiles;
|
|
142
170
|
}
|
|
143
|
-
getSpecifierMap() {
|
|
144
|
-
return this.specifierMap;
|
|
145
|
-
}
|
|
146
171
|
getDistDir() {
|
|
147
172
|
return this.distDir;
|
|
148
173
|
}
|
|
@@ -152,84 +177,112 @@ class NodeHmrManager {
|
|
|
152
177
|
getDefaultContext() {
|
|
153
178
|
return {
|
|
154
179
|
getWatchedFiles: () => this.watchedFiles,
|
|
155
|
-
getSpecifierMap: () => this.specifierMap,
|
|
156
180
|
getDistDir: () => this.distDir,
|
|
157
181
|
getPlugins: () => this.plugins,
|
|
158
182
|
getSrcDir: () => this.appConfig.absolutePaths.srcDir,
|
|
159
183
|
getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
|
|
160
|
-
getPagesDir: () => this.appConfig.absolutePaths.pagesDir
|
|
184
|
+
getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
|
|
185
|
+
getBuildExecutor: () => getAppBuildExecutor(this.appConfig),
|
|
186
|
+
getBrowserBundleService: () => this.browserBundleService,
|
|
187
|
+
importServerModule: async (filePath) => await this.serverModuleTranspiler.importModule({
|
|
188
|
+
filePath,
|
|
189
|
+
outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-modules"),
|
|
190
|
+
externalPackages: true
|
|
191
|
+
})
|
|
161
192
|
};
|
|
162
193
|
}
|
|
194
|
+
clearFailedEntrypointRegistration(entrypointPath) {
|
|
195
|
+
this.watchedFiles.delete(entrypointPath);
|
|
196
|
+
this.entrypointDependencyGraph.clearEntrypointDependencies(entrypointPath);
|
|
197
|
+
}
|
|
163
198
|
/**
|
|
164
|
-
*
|
|
199
|
+
* Registers one integration-owned page entrypoint.
|
|
165
200
|
*
|
|
166
201
|
* @remarks
|
|
167
|
-
*
|
|
168
|
-
*
|
|
202
|
+
* Concurrent callers share one in-flight registration. The registration is
|
|
203
|
+
* removed from the dedupe map once it resolves or fails so later requests do
|
|
204
|
+
* not inherit stale state.
|
|
169
205
|
*/
|
|
170
|
-
setEntrypointDependencies(entrypointPath, dependencies) {
|
|
171
|
-
const normalizedEntrypoint = path.resolve(entrypointPath);
|
|
172
|
-
const previousDependencies = this.entrypointDependencies.get(normalizedEntrypoint);
|
|
173
|
-
if (previousDependencies) {
|
|
174
|
-
for (const dependencyPath of previousDependencies) {
|
|
175
|
-
const entrypoints = this.dependencyEntrypoints.get(dependencyPath);
|
|
176
|
-
if (!entrypoints) {
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
entrypoints.delete(normalizedEntrypoint);
|
|
180
|
-
if (entrypoints.size === 0) {
|
|
181
|
-
this.dependencyEntrypoints.delete(dependencyPath);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
const normalizedDependencies = /* @__PURE__ */ new Set([
|
|
186
|
-
normalizedEntrypoint,
|
|
187
|
-
...dependencies.map((dependencyPath) => path.resolve(dependencyPath))
|
|
188
|
-
]);
|
|
189
|
-
this.entrypointDependencies.set(normalizedEntrypoint, normalizedDependencies);
|
|
190
|
-
for (const dependencyPath of normalizedDependencies) {
|
|
191
|
-
const entrypoints = this.dependencyEntrypoints.get(dependencyPath) ?? /* @__PURE__ */ new Set();
|
|
192
|
-
entrypoints.add(normalizedEntrypoint);
|
|
193
|
-
this.dependencyEntrypoints.set(dependencyPath, entrypoints);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
206
|
async registerEntrypoint(entrypointPath) {
|
|
197
|
-
|
|
198
|
-
|
|
207
|
+
return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
|
|
208
|
+
emit: async (normalizedEntrypoint) => await this.emitStrictEntrypoint(normalizedEntrypoint),
|
|
209
|
+
getMissingOutputError: (normalizedEntrypoint, outputPath) => new Error(
|
|
210
|
+
`[HMR] Integration failed to emit entrypoint ${normalizedEntrypoint} to ${outputPath}. Page entrypoints must be produced by their owning integration.`
|
|
211
|
+
)
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Registers one generic script entrypoint.
|
|
216
|
+
*
|
|
217
|
+
* @remarks
|
|
218
|
+
* This path is intentionally separate from page entrypoints so non-framework
|
|
219
|
+
* scripts can still use the generic build fallback without weakening the page
|
|
220
|
+
* ownership contract.
|
|
221
|
+
*/
|
|
222
|
+
async registerScriptEntrypoint(entrypointPath) {
|
|
223
|
+
return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
|
|
224
|
+
emit: async (normalizedEntrypoint, outputPath) => await this.emitScriptEntrypoint(normalizedEntrypoint, outputPath),
|
|
225
|
+
getMissingOutputError: (normalizedEntrypoint) => new Error(`[HMR] Failed to register script entrypoint: ${normalizedEntrypoint}`)
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Performs strict integration-owned entrypoint registration for one normalized source path.
|
|
230
|
+
*
|
|
231
|
+
* @remarks
|
|
232
|
+
* The flow is:
|
|
233
|
+
* 1. Reserve the output URL in the watched map.
|
|
234
|
+
* 2. Remove any stale emitted file from an earlier process or failed build.
|
|
235
|
+
* 3. Let the strategy chain try to emit the entrypoint without broadcasting.
|
|
236
|
+
* 4. Fail if the owning integration did not emit the expected output.
|
|
237
|
+
*/
|
|
238
|
+
async emitStrictEntrypoint(entrypointPath) {
|
|
239
|
+
await this.handleFileChange(entrypointPath, { broadcast: false });
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Performs registration for a generic script asset.
|
|
243
|
+
*
|
|
244
|
+
* @remarks
|
|
245
|
+
* This path performs a targeted browser bundle for the requested script
|
|
246
|
+
* entrypoint only. The resulting dependency graph is retained so later file
|
|
247
|
+
* changes can invalidate just the affected script entrypoints.
|
|
248
|
+
*/
|
|
249
|
+
async emitScriptEntrypoint(entrypointPath, outputPath) {
|
|
250
|
+
const naming = path.relative(this.distDir, outputPath).split(path.sep).join("/");
|
|
251
|
+
const buildResult = await this.browserBundleService.bundle({
|
|
252
|
+
profile: "hmr-entrypoint",
|
|
253
|
+
entrypoints: [entrypointPath],
|
|
254
|
+
outdir: this.distDir,
|
|
255
|
+
naming,
|
|
256
|
+
minify: false,
|
|
257
|
+
plugins: this.plugins
|
|
258
|
+
});
|
|
259
|
+
if (!buildResult.success) {
|
|
260
|
+
appLogger.error(`[HMR] Generic script entrypoint build failed for ${entrypointPath}:`, buildResult.logs);
|
|
261
|
+
return;
|
|
199
262
|
}
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const encodedPathJs = this.encodeDynamicSegments(relativePathJs);
|
|
204
|
-
const urlPath = encodedPathJs.split(path.sep).join("/");
|
|
205
|
-
const outputUrl = `/${path.join(RESOLVED_ASSETS_DIR, "_hmr", urlPath)}`;
|
|
206
|
-
const outputPath = path.join(this.distDir, urlPath);
|
|
207
|
-
this.watchedFiles.set(entrypointPath, outputUrl);
|
|
208
|
-
await this.handleFileChange(entrypointPath);
|
|
209
|
-
if (!fileSystem.exists(outputPath)) {
|
|
210
|
-
const fallback = await defaultBuildAdapter.build({
|
|
211
|
-
entrypoints: [entrypointPath],
|
|
212
|
-
outdir: this.distDir,
|
|
213
|
-
naming: encodedPathJs,
|
|
214
|
-
minify: false,
|
|
215
|
-
external: Array.from(this.specifierMap.keys()),
|
|
216
|
-
...defaultBuildAdapter.getTranspileOptions("hmr-entrypoint"),
|
|
217
|
-
plugins: this.plugins
|
|
218
|
-
});
|
|
219
|
-
if (!fallback.success) {
|
|
220
|
-
appLogger.error(`[HMR] Fallback build failed for ${entrypointPath}:`, fallback.logs);
|
|
221
|
-
}
|
|
263
|
+
const entrypointDependencies = buildResult.dependencyGraph?.entrypoints?.[entrypointPath];
|
|
264
|
+
if (entrypointDependencies) {
|
|
265
|
+
this.entrypointDependencyGraph.setEntrypointDependencies(entrypointPath, entrypointDependencies);
|
|
222
266
|
}
|
|
223
|
-
return outputUrl;
|
|
224
|
-
}
|
|
225
|
-
encodeDynamicSegments(filepath) {
|
|
226
|
-
return filepath.replace(/\[([^\]]+)\]/g, "_$1_");
|
|
227
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Stops active watchers and releases retained registration state.
|
|
270
|
+
*
|
|
271
|
+
* @remarks
|
|
272
|
+
* The manager intentionally does not remove emitted `_hmr` files from disk
|
|
273
|
+
* because multiple app processes may share the same dist directory during test
|
|
274
|
+
* runs. It does clear in-memory indexes so old entrypoints and dependencies
|
|
275
|
+
* cannot leak across a reused manager instance.
|
|
276
|
+
*/
|
|
228
277
|
stop() {
|
|
278
|
+
this.entrypointRegistrations.clear();
|
|
229
279
|
for (const watcher of this.watchers.values()) {
|
|
230
280
|
watcher.close();
|
|
231
281
|
}
|
|
232
282
|
this.watchers.clear();
|
|
283
|
+
this.watchedFiles.clear();
|
|
284
|
+
this.entrypointDependencyGraph.reset();
|
|
285
|
+
this.plugins = [];
|
|
233
286
|
}
|
|
234
287
|
}
|
|
235
288
|
export {
|
|
@@ -1,6 +1,6 @@
|
|
|
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
6
|
export type NodeServerInstance = NodeHttpServer;
|
|
@@ -53,7 +53,6 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
53
53
|
private previewServer;
|
|
54
54
|
private bridge;
|
|
55
55
|
private hmrManager;
|
|
56
|
-
private processorBuildPlugins;
|
|
57
56
|
constructor(options: NodeServerAdapterParams);
|
|
58
57
|
/**
|
|
59
58
|
* Prepares the adapter for use.
|
|
@@ -69,34 +68,6 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
69
68
|
* processors during their `setup()` calls.
|
|
70
69
|
*/
|
|
71
70
|
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;
|
|
100
71
|
getServerOptions(): NodeServeAdapterServerOptions;
|
|
101
72
|
buildStatic(options?: {
|
|
102
73
|
preview?: boolean;
|
|
@@ -138,6 +109,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
138
109
|
* `stopBuildRuntimeServer`, so it never overlaps with the actual dev/prod server.
|
|
139
110
|
*/
|
|
140
111
|
private startBuildRuntimeServer;
|
|
112
|
+
private getListeningServerOrigin;
|
|
141
113
|
/**
|
|
142
114
|
* Gracefully shuts down the ephemeral build runtime server.
|
|
143
115
|
*
|
|
@@ -161,7 +133,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
161
133
|
* underlying socket closes early — into a 499 response so it does not
|
|
162
134
|
* incorrectly surface as a 500 in application logs.
|
|
163
135
|
*/
|
|
164
|
-
handleRequest(
|
|
136
|
+
handleRequest(request: Request): Promise<Response>;
|
|
165
137
|
/**
|
|
166
138
|
* Called once the HTTP server is bound and listening.
|
|
167
139
|
*
|
|
@@ -172,13 +144,13 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
172
144
|
* broadcast + heartbeat cleanup.
|
|
173
145
|
* - `NodeHmrManager` watches the filesystem and triggers incremental esbuild
|
|
174
146
|
* rebuilds, notifying connected clients via the bridge.
|
|
175
|
-
* -
|
|
176
|
-
* router and response handlers when pages are added or removed.
|
|
147
|
+
* - Shared watcher bootstrapping listens for route-level file changes and
|
|
148
|
+
* refreshes the router and response handlers when pages are added or removed.
|
|
177
149
|
*
|
|
178
150
|
* WebSocket upgrade requests that do not target `/_hmr` are rejected with an
|
|
179
151
|
* immediate socket destroy to prevent unhandled upgrade leaks.
|
|
180
152
|
*/
|
|
181
|
-
completeInitialization(
|
|
153
|
+
completeInitialization(server: NodeServerInstance): Promise<void>;
|
|
182
154
|
}
|
|
183
155
|
/**
|
|
184
156
|
* Factory function that creates and fully initialises a `NodeServerAdapter`.
|