@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.21
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 +26 -64
- package/README.md +212 -14
- package/package.json +116 -66
- 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 +4 -12
- package/src/adapters/bun/create-app.js +4 -5
- package/src/adapters/bun/hmr-manager.d.ts +80 -21
- package/src/adapters/bun/hmr-manager.js +168 -62
- 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 +40 -34
- 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 +89 -18
- package/src/adapters/node/node-hmr-manager.js +185 -95
- package/src/adapters/node/server-adapter.d.ts +6 -35
- package/src/adapters/node/server-adapter.js +44 -105
- 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-route-matcher.d.ts +2 -2
- package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
- package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
- package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
- package/src/adapters/shared/fs-server-response-factory.js +1 -1
- package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
- package/src/adapters/shared/fs-server-response-matcher.js +10 -18
- 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 +2 -1
- 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 +13 -3
- package/src/adapters/shared/server-adapter.js +42 -5
- package/src/adapters/shared/server-route-handler.d.ts +4 -4
- package/src/adapters/shared/server-route-handler.js +6 -15
- package/src/adapters/shared/server-static-builder.d.ts +38 -6
- package/src/adapters/shared/server-static-builder.js +64 -10
- 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 +52 -27
- package/src/config/config-builder.js +260 -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/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 +12 -4
- 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 +1 -1
- package/src/eco/lazy-injector-map.d.ts +1 -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 +30 -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 -43
- package/src/hmr/strategies/js-hmr-strategy.js +72 -73
- 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 +7 -2
- package/src/integrations/ghtml/ghtml-renderer.js +33 -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 -21
- 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 +145 -28
- package/src/plugins/integration-plugin.js +109 -13
- package/src/plugins/processor.d.ts +15 -2
- package/src/plugins/processor.js +16 -2
- 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 +64 -98
- package/src/route-renderer/README.md +67 -46
- package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
- package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
- package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
- package/src/route-renderer/orchestration/component-render-context.js +147 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
- package/src/route-renderer/orchestration/integration-renderer.js +957 -0
- package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
- package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
- package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
- package/src/route-renderer/orchestration/render-execution.service.js +106 -0
- package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
- package/src/route-renderer/orchestration/render-output.utils.js +65 -0
- package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
- package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
- package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
- package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -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/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
- 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 +45 -4
- package/src/route-renderer/route-renderer.js +38 -3
- package/src/router/README.md +97 -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 +149 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
- package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
- package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
- package/src/router/{fs-router.js → server/fs-router.js} +1 -1
- package/src/services/README.md +29 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
- 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 +2 -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 +48 -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/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/index.js +5 -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 +9 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
- 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 +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
- 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 +16 -4
- 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 +6 -5
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
- 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 +5 -2
- package/src/services/assets/browser-bundle.service.d.ts +32 -0
- package/src/services/assets/browser-bundle.service.js +33 -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 +77 -0
- package/src/services/html/html-transformer.service.js +215 -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 +28 -0
- package/src/services/module-loading/app-module-loader.service.js +35 -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 +109 -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/node-bootstrap-plugin.d.ts +42 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
- package/src/services/module-loading/page-module-import.service.d.ts +76 -0
- package/src/services/module-loading/page-module-import.service.js +173 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
- package/src/services/module-loading/server-module-transpiler.service.js +64 -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/runtime-specifier-registry.service.d.ts +69 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -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 +50 -3
- package/src/static-site-generator/static-site-generator.js +71 -5
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
- 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 -24
- package/src/watchers/project-watcher.js +129 -92
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +1 -0
- 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 -281
- 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 -271
- package/src/adapters/node/server-adapter.ts +0 -561
- package/src/adapters/node/static-content-server.ts +0 -203
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
- package/src/adapters/shared/render-context.ts +0 -105
- package/src/adapters/shared/server-adapter.ts +0 -442
- package/src/adapters/shared/server-route-handler.ts +0 -166
- package/src/adapters/shared/server-static-builder.ts +0 -82
- package/src/build/build-adapter.ts +0 -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/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 -308
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -212
- package/src/plugins/alias-resolver-plugin.ts +0 -45
- package/src/plugins/eco-component-meta-plugin.ts +0 -474
- package/src/plugins/integration-plugin.ts +0 -184
- package/src/plugins/processor.ts +0 -220
- package/src/public-types.ts +0 -1255
- package/src/route-renderer/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-graph.ts +0 -159
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/component-marker.ts +0 -117
- package/src/route-renderer/dependency-resolver.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.ts +0 -358
- package/src/route-renderer/route-renderer.ts +0 -80
- package/src/router/fs-router-scanner.ts +0 -217
- 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.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.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.ts +0 -27
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.ts +0 -128
- package/src/services/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -359
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/watchers/project-watcher.test-helpers.ts +0 -40
- package/src/watchers/project-watcher.ts +0 -306
- /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/module-loading-types.js} +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -1,29 +1,43 @@
|
|
|
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 runtimeSpecifierRegistry;
|
|
40
|
+
private readonly serverModuleTranspiler;
|
|
27
41
|
constructor({ appConfig, bridge }: NodeHmrManagerParams);
|
|
28
42
|
/**
|
|
29
43
|
* Ensures the HMR output directory exists.
|
|
@@ -32,31 +46,88 @@ export declare class NodeHmrManager implements IHmrManager {
|
|
|
32
46
|
* can share the same dist path during e2e runs.
|
|
33
47
|
*/
|
|
34
48
|
private cleanDistDir;
|
|
49
|
+
/**
|
|
50
|
+
* Returns whether the generic JS strategy is allowed to rebuild an entrypoint.
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* Higher-priority integration strategies own framework page entrypoints. When
|
|
54
|
+
* one of them matches, the generic JS strategy must stay out of the way so a
|
|
55
|
+
* shared dependency invalidation does not overwrite framework-specific output.
|
|
56
|
+
*/
|
|
57
|
+
private shouldJsStrategyProcessEntrypoint;
|
|
35
58
|
private initializeStrategies;
|
|
36
59
|
registerStrategy(strategy: HmrStrategy): void;
|
|
37
60
|
setPlugins(plugins: EcoBuildPlugin[]): void;
|
|
38
61
|
setEnabled(enabled: boolean): void;
|
|
39
62
|
isEnabled(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Registers runtime bare-specifier mappings exposed by integrations.
|
|
65
|
+
*
|
|
66
|
+
* @remarks
|
|
67
|
+
* These mappings are consumed by framework-owned HMR strategies such as the
|
|
68
|
+
* React integration strategy when they rewrite browser bundles. The registry
|
|
69
|
+
* stays generic so the same mappings can support broader import-map-style
|
|
70
|
+
* runtime features later without moving integration semantics into core.
|
|
71
|
+
*/
|
|
40
72
|
registerSpecifierMap(map: Record<string, string>): void;
|
|
41
73
|
buildRuntime(): Promise<void>;
|
|
42
74
|
getRuntimePath(): string;
|
|
43
75
|
broadcast(event: ClientBridgeEvent): void;
|
|
44
|
-
handleFileChange(filePath: string): Promise<void>;
|
|
76
|
+
handleFileChange(filePath: string, options?: HandleFileChangeOptions): Promise<void>;
|
|
45
77
|
getOutputUrl(entrypointPath: string): string | undefined;
|
|
46
78
|
getWatchedFiles(): Map<string, string>;
|
|
47
79
|
getSpecifierMap(): Map<string, string>;
|
|
48
80
|
getDistDir(): string;
|
|
49
81
|
getPlugins(): EcoBuildPlugin[];
|
|
50
82
|
getDefaultContext(): DefaultHmrContext;
|
|
83
|
+
private clearFailedEntrypointRegistration;
|
|
51
84
|
/**
|
|
52
|
-
*
|
|
85
|
+
* Registers one integration-owned page entrypoint.
|
|
53
86
|
*
|
|
54
87
|
* @remarks
|
|
55
|
-
*
|
|
56
|
-
*
|
|
88
|
+
* Concurrent callers share one in-flight registration. The registration is
|
|
89
|
+
* removed from the dedupe map once it resolves or fails so later requests do
|
|
90
|
+
* not inherit stale state.
|
|
57
91
|
*/
|
|
58
|
-
private setEntrypointDependencies;
|
|
59
92
|
registerEntrypoint(entrypointPath: string): Promise<string>;
|
|
60
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Registers one generic script entrypoint.
|
|
95
|
+
*
|
|
96
|
+
* @remarks
|
|
97
|
+
* This path is intentionally separate from page entrypoints so non-framework
|
|
98
|
+
* scripts can still use the generic build fallback without weakening the page
|
|
99
|
+
* ownership contract.
|
|
100
|
+
*/
|
|
101
|
+
registerScriptEntrypoint(entrypointPath: string): Promise<string>;
|
|
102
|
+
/**
|
|
103
|
+
* Performs strict integration-owned entrypoint registration for one normalized source path.
|
|
104
|
+
*
|
|
105
|
+
* @remarks
|
|
106
|
+
* The flow is:
|
|
107
|
+
* 1. Reserve the output URL in the watched map.
|
|
108
|
+
* 2. Remove any stale emitted file from an earlier process or failed build.
|
|
109
|
+
* 3. Let the strategy chain try to emit the entrypoint without broadcasting.
|
|
110
|
+
* 4. Fail if the owning integration did not emit the expected output.
|
|
111
|
+
*/
|
|
112
|
+
private emitStrictEntrypoint;
|
|
113
|
+
/**
|
|
114
|
+
* Performs registration for a generic script asset.
|
|
115
|
+
*
|
|
116
|
+
* @remarks
|
|
117
|
+
* This path performs a targeted browser bundle for the requested script
|
|
118
|
+
* entrypoint only. The resulting dependency graph is retained so later file
|
|
119
|
+
* changes can invalidate just the affected script entrypoints.
|
|
120
|
+
*/
|
|
121
|
+
private emitScriptEntrypoint;
|
|
122
|
+
/**
|
|
123
|
+
* Stops active watchers and releases retained registration state.
|
|
124
|
+
*
|
|
125
|
+
* @remarks
|
|
126
|
+
* The manager intentionally does not remove emitted `_hmr` files from disk
|
|
127
|
+
* because multiple app processes may share the same dist directory during test
|
|
128
|
+
* runs. It does clear in-memory indexes so old entrypoints, dependencies, and
|
|
129
|
+
* specifier maps cannot leak across a reused manager instance.
|
|
130
|
+
*/
|
|
61
131
|
stop(): void;
|
|
62
132
|
}
|
|
133
|
+
export {};
|
|
@@ -1,34 +1,56 @@
|
|
|
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";
|
|
6
|
+
import { HmrStrategyType } from "../../hmr/hmr-strategy.js";
|
|
7
7
|
import { DefaultHmrStrategy } from "../../hmr/strategies/default-hmr-strategy.js";
|
|
8
8
|
import { JsHmrStrategy } from "../../hmr/strategies/js-hmr-strategy.js";
|
|
9
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 { getAppRuntimeSpecifierRegistry } from "../../services/runtime-state/runtime-specifier-registry.service.js";
|
|
19
|
+
import { resolveInternalExecutionDir, resolveInternalWorkDir } from "../../utils/resolve-work-dir.js";
|
|
10
20
|
class NodeHmrManager {
|
|
21
|
+
static entrypointRegistrationTimeoutMs = 4e3;
|
|
11
22
|
appConfig;
|
|
12
23
|
bridge;
|
|
13
24
|
watchers = /* @__PURE__ */ new Map();
|
|
14
25
|
watchedFiles = /* @__PURE__ */ new Map();
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Node-only reverse invalidation index: dependency file -> affected entrypoints.
|
|
18
|
-
*/
|
|
19
|
-
dependencyEntrypoints = /* @__PURE__ */ new Map();
|
|
20
|
-
/**
|
|
21
|
-
* Node-only forward index: entrypoint -> latest dependency set.
|
|
22
|
-
*/
|
|
23
|
-
entrypointDependencies = /* @__PURE__ */ new Map();
|
|
26
|
+
entrypointRegistrations = /* @__PURE__ */ new Map();
|
|
24
27
|
distDir;
|
|
25
28
|
plugins = [];
|
|
26
29
|
enabled = true;
|
|
27
30
|
strategies = [];
|
|
31
|
+
entrypointRegistrar;
|
|
32
|
+
browserBundleService;
|
|
33
|
+
entrypointDependencyGraph;
|
|
34
|
+
runtimeSpecifierRegistry;
|
|
35
|
+
serverModuleTranspiler;
|
|
28
36
|
constructor({ appConfig, bridge }) {
|
|
29
37
|
this.appConfig = appConfig;
|
|
30
38
|
this.bridge = bridge;
|
|
31
|
-
this.distDir = path.join(this.appConfig
|
|
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);
|
|
32
54
|
this.cleanDistDir();
|
|
33
55
|
this.initializeStrategies();
|
|
34
56
|
}
|
|
@@ -41,15 +63,40 @@ class NodeHmrManager {
|
|
|
41
63
|
cleanDistDir() {
|
|
42
64
|
fileSystem.ensureDir(this.distDir);
|
|
43
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
|
+
}
|
|
44
87
|
initializeStrategies() {
|
|
45
88
|
const jsContext = {
|
|
46
89
|
getWatchedFiles: () => this.watchedFiles,
|
|
47
|
-
getSpecifierMap: () => this.
|
|
48
|
-
getDependencyEntrypoints: (filePath) => new Set(this.dependencyEntrypoints.get(path.resolve(filePath)) ?? []),
|
|
49
|
-
setEntrypointDependencies: (entrypointPath, dependencies) => this.setEntrypointDependencies(entrypointPath, dependencies),
|
|
90
|
+
getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
|
|
50
91
|
getDistDir: () => this.distDir,
|
|
51
92
|
getPlugins: () => this.plugins,
|
|
52
|
-
getSrcDir: () => this.appConfig.absolutePaths.srcDir
|
|
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)
|
|
53
100
|
};
|
|
54
101
|
this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
|
|
55
102
|
}
|
|
@@ -65,24 +112,36 @@ class NodeHmrManager {
|
|
|
65
112
|
isEnabled() {
|
|
66
113
|
return this.enabled;
|
|
67
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
|
+
*/
|
|
68
124
|
registerSpecifierMap(map) {
|
|
69
|
-
|
|
70
|
-
this.specifierMap.set(specifier, url);
|
|
71
|
-
}
|
|
125
|
+
this.runtimeSpecifierRegistry.register(map);
|
|
72
126
|
}
|
|
73
127
|
async buildRuntime() {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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);
|
|
86
145
|
}
|
|
87
146
|
}
|
|
88
147
|
getRuntimePath() {
|
|
@@ -94,13 +153,13 @@ class NodeHmrManager {
|
|
|
94
153
|
);
|
|
95
154
|
this.bridge.broadcast(event);
|
|
96
155
|
}
|
|
97
|
-
async handleFileChange(filePath) {
|
|
156
|
+
async handleFileChange(filePath, options = {}) {
|
|
98
157
|
const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
|
|
99
158
|
const strategy = sorted.find((s) => {
|
|
100
159
|
try {
|
|
101
160
|
return s.matches(filePath);
|
|
102
161
|
} catch (err) {
|
|
103
|
-
appLogger.error(
|
|
162
|
+
appLogger.error(err);
|
|
104
163
|
return false;
|
|
105
164
|
}
|
|
106
165
|
});
|
|
@@ -110,7 +169,8 @@ class NodeHmrManager {
|
|
|
110
169
|
}
|
|
111
170
|
appLogger.debug(`[NodeHmrManager] Selected strategy: ${strategy.constructor.name}`);
|
|
112
171
|
const action = await strategy.process(filePath);
|
|
113
|
-
|
|
172
|
+
const shouldBroadcast = options.broadcast ?? true;
|
|
173
|
+
if (shouldBroadcast && action.type === "broadcast") {
|
|
114
174
|
if (action.events) {
|
|
115
175
|
for (const event of action.events) {
|
|
116
176
|
this.broadcast(event);
|
|
@@ -125,7 +185,7 @@ class NodeHmrManager {
|
|
|
125
185
|
return this.watchedFiles;
|
|
126
186
|
}
|
|
127
187
|
getSpecifierMap() {
|
|
128
|
-
return this.
|
|
188
|
+
return this.runtimeSpecifierRegistry.getAll();
|
|
129
189
|
}
|
|
130
190
|
getDistDir() {
|
|
131
191
|
return this.distDir;
|
|
@@ -136,84 +196,114 @@ class NodeHmrManager {
|
|
|
136
196
|
getDefaultContext() {
|
|
137
197
|
return {
|
|
138
198
|
getWatchedFiles: () => this.watchedFiles,
|
|
139
|
-
getSpecifierMap: () => this.
|
|
199
|
+
getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
|
|
140
200
|
getDistDir: () => this.distDir,
|
|
141
201
|
getPlugins: () => this.plugins,
|
|
142
202
|
getSrcDir: () => this.appConfig.absolutePaths.srcDir,
|
|
143
203
|
getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
|
|
144
|
-
getPagesDir: () => this.appConfig.absolutePaths.pagesDir
|
|
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
|
+
})
|
|
145
212
|
};
|
|
146
213
|
}
|
|
214
|
+
clearFailedEntrypointRegistration(entrypointPath) {
|
|
215
|
+
this.watchedFiles.delete(entrypointPath);
|
|
216
|
+
this.entrypointDependencyGraph.clearEntrypointDependencies(entrypointPath);
|
|
217
|
+
}
|
|
147
218
|
/**
|
|
148
|
-
*
|
|
219
|
+
* Registers one integration-owned page entrypoint.
|
|
149
220
|
*
|
|
150
221
|
* @remarks
|
|
151
|
-
*
|
|
152
|
-
*
|
|
222
|
+
* Concurrent callers share one in-flight registration. The registration is
|
|
223
|
+
* removed from the dedupe map once it resolves or fails so later requests do
|
|
224
|
+
* not inherit stale state.
|
|
153
225
|
*/
|
|
154
|
-
setEntrypointDependencies(entrypointPath, dependencies) {
|
|
155
|
-
const normalizedEntrypoint = path.resolve(entrypointPath);
|
|
156
|
-
const previousDependencies = this.entrypointDependencies.get(normalizedEntrypoint);
|
|
157
|
-
if (previousDependencies) {
|
|
158
|
-
for (const dependencyPath of previousDependencies) {
|
|
159
|
-
const entrypoints = this.dependencyEntrypoints.get(dependencyPath);
|
|
160
|
-
if (!entrypoints) {
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
entrypoints.delete(normalizedEntrypoint);
|
|
164
|
-
if (entrypoints.size === 0) {
|
|
165
|
-
this.dependencyEntrypoints.delete(dependencyPath);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
const normalizedDependencies = /* @__PURE__ */ new Set([
|
|
170
|
-
normalizedEntrypoint,
|
|
171
|
-
...dependencies.map((dependencyPath) => path.resolve(dependencyPath))
|
|
172
|
-
]);
|
|
173
|
-
this.entrypointDependencies.set(normalizedEntrypoint, normalizedDependencies);
|
|
174
|
-
for (const dependencyPath of normalizedDependencies) {
|
|
175
|
-
const entrypoints = this.dependencyEntrypoints.get(dependencyPath) ?? /* @__PURE__ */ new Set();
|
|
176
|
-
entrypoints.add(normalizedEntrypoint);
|
|
177
|
-
this.dependencyEntrypoints.set(dependencyPath, entrypoints);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
226
|
async registerEntrypoint(entrypointPath) {
|
|
181
|
-
|
|
182
|
-
|
|
227
|
+
return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
|
|
228
|
+
emit: async (normalizedEntrypoint) => await this.emitStrictEntrypoint(normalizedEntrypoint),
|
|
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
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Performs strict integration-owned entrypoint registration for one normalized source path.
|
|
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.
|
|
257
|
+
*/
|
|
258
|
+
async emitStrictEntrypoint(entrypointPath) {
|
|
259
|
+
await this.handleFileChange(entrypointPath, { broadcast: false });
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Performs registration for a generic script asset.
|
|
263
|
+
*
|
|
264
|
+
* @remarks
|
|
265
|
+
* This path performs a targeted browser bundle for the requested script
|
|
266
|
+
* entrypoint only. The resulting dependency graph is retained so later file
|
|
267
|
+
* changes can invalidate just the affected script entrypoints.
|
|
268
|
+
*/
|
|
269
|
+
async emitScriptEntrypoint(entrypointPath, outputPath) {
|
|
270
|
+
const naming = path.relative(this.distDir, outputPath).split(path.sep).join("/");
|
|
271
|
+
const buildResult = await this.browserBundleService.bundle({
|
|
272
|
+
profile: "hmr-entrypoint",
|
|
273
|
+
entrypoints: [entrypointPath],
|
|
274
|
+
outdir: this.distDir,
|
|
275
|
+
naming,
|
|
276
|
+
minify: false,
|
|
277
|
+
plugins: this.plugins
|
|
278
|
+
});
|
|
279
|
+
if (!buildResult.success) {
|
|
280
|
+
appLogger.error(`[HMR] Generic script entrypoint build failed for ${entrypointPath}:`, buildResult.logs);
|
|
281
|
+
return;
|
|
183
282
|
}
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const encodedPathJs = this.encodeDynamicSegments(relativePathJs);
|
|
188
|
-
const urlPath = encodedPathJs.split(path.sep).join("/");
|
|
189
|
-
const outputUrl = `/${path.join(RESOLVED_ASSETS_DIR, "_hmr", urlPath)}`;
|
|
190
|
-
const outputPath = path.join(this.distDir, urlPath);
|
|
191
|
-
this.watchedFiles.set(entrypointPath, outputUrl);
|
|
192
|
-
await this.handleFileChange(entrypointPath);
|
|
193
|
-
if (!fileSystem.exists(outputPath)) {
|
|
194
|
-
const fallback = await defaultBuildAdapter.build({
|
|
195
|
-
entrypoints: [entrypointPath],
|
|
196
|
-
outdir: this.distDir,
|
|
197
|
-
naming: encodedPathJs,
|
|
198
|
-
minify: false,
|
|
199
|
-
external: Array.from(this.specifierMap.keys()),
|
|
200
|
-
...defaultBuildAdapter.getTranspileOptions("hmr-entrypoint"),
|
|
201
|
-
plugins: this.plugins
|
|
202
|
-
});
|
|
203
|
-
if (!fallback.success) {
|
|
204
|
-
appLogger.error(`[HMR] Fallback build failed for ${entrypointPath}:`, fallback.logs);
|
|
205
|
-
}
|
|
283
|
+
const entrypointDependencies = buildResult.dependencyGraph?.entrypoints?.[entrypointPath];
|
|
284
|
+
if (entrypointDependencies) {
|
|
285
|
+
this.entrypointDependencyGraph.setEntrypointDependencies(entrypointPath, entrypointDependencies);
|
|
206
286
|
}
|
|
207
|
-
return outputUrl;
|
|
208
|
-
}
|
|
209
|
-
encodeDynamicSegments(filepath) {
|
|
210
|
-
return filepath.replace(/\[([^\]]+)\]/g, "_$1_");
|
|
211
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* Stops active watchers and releases retained registration state.
|
|
290
|
+
*
|
|
291
|
+
* @remarks
|
|
292
|
+
* The manager intentionally does not remove emitted `_hmr` files from disk
|
|
293
|
+
* because multiple app processes may share the same dist directory during test
|
|
294
|
+
* runs. It does clear in-memory indexes so old entrypoints, dependencies, and
|
|
295
|
+
* specifier maps cannot leak across a reused manager instance.
|
|
296
|
+
*/
|
|
212
297
|
stop() {
|
|
298
|
+
this.entrypointRegistrations.clear();
|
|
213
299
|
for (const watcher of this.watchers.values()) {
|
|
214
300
|
watcher.close();
|
|
215
301
|
}
|
|
216
302
|
this.watchers.clear();
|
|
303
|
+
this.watchedFiles.clear();
|
|
304
|
+
this.runtimeSpecifierRegistry.clear();
|
|
305
|
+
this.entrypointDependencyGraph.reset();
|
|
306
|
+
this.plugins = [];
|
|
217
307
|
}
|
|
218
308
|
}
|
|
219
309
|
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;
|
|
@@ -161,7 +132,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
161
132
|
* underlying socket closes early — into a 499 response so it does not
|
|
162
133
|
* incorrectly surface as a 500 in application logs.
|
|
163
134
|
*/
|
|
164
|
-
handleRequest(
|
|
135
|
+
handleRequest(request: Request): Promise<Response>;
|
|
165
136
|
/**
|
|
166
137
|
* Called once the HTTP server is bound and listening.
|
|
167
138
|
*
|
|
@@ -172,13 +143,13 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
|
|
|
172
143
|
* broadcast + heartbeat cleanup.
|
|
173
144
|
* - `NodeHmrManager` watches the filesystem and triggers incremental esbuild
|
|
174
145
|
* rebuilds, notifying connected clients via the bridge.
|
|
175
|
-
* -
|
|
176
|
-
* router and response handlers when pages are added or removed.
|
|
146
|
+
* - Shared watcher bootstrapping listens for route-level file changes and
|
|
147
|
+
* refreshes the router and response handlers when pages are added or removed.
|
|
177
148
|
*
|
|
178
149
|
* WebSocket upgrade requests that do not target `/_hmr` are rejected with an
|
|
179
150
|
* immediate socket destroy to prevent unhandled upgrade leaks.
|
|
180
151
|
*/
|
|
181
|
-
completeInitialization(
|
|
152
|
+
completeInitialization(server: NodeServerInstance): Promise<void>;
|
|
182
153
|
}
|
|
183
154
|
/**
|
|
184
155
|
* Factory function that creates and fully initialises a `NodeServerAdapter`.
|