@ecopages/core 0.2.0-alpha.4 → 0.2.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +213 -12
- package/package.json +100 -188
- package/src/adapters/README.md +39 -0
- package/src/adapters/bun/hmr-manager.test.ts +267 -0
- package/src/adapters/bun/hmr-manager.ts +181 -68
- package/src/adapters/bun/index.ts +1 -2
- package/src/adapters/bun/server-adapter.ts +41 -34
- package/src/adapters/bun/server-lifecycle.ts +40 -70
- package/src/adapters/index.ts +1 -1
- package/src/adapters/node/bootstrap-dependency-resolver.test.ts +282 -0
- package/src/adapters/node/bootstrap-dependency-resolver.ts +301 -0
- package/src/adapters/node/index.ts +7 -0
- package/src/adapters/node/node-client-bridge.test.ts +198 -0
- package/src/adapters/node/node-hmr-manager.test.ts +322 -0
- package/src/adapters/node/node-hmr-manager.ts +208 -116
- package/src/adapters/node/runtime-adapter.test.ts +868 -0
- package/src/adapters/node/runtime-adapter.ts +439 -0
- package/src/adapters/node/server-adapter.ts +31 -104
- package/src/adapters/node/static-content-server.test.ts +60 -0
- package/src/adapters/node/static-content-server.ts +36 -0
- package/src/adapters/node/write-runtime-manifest.ts +38 -0
- package/src/adapters/shared/api-response.test.ts +97 -0
- package/src/{define-api-handler.ts → adapters/shared/define-api-handler.ts} +1 -1
- package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
- package/src/adapters/shared/explicit-static-route-matcher.ts +7 -1
- package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
- package/src/adapters/shared/file-route-middleware-pipeline.ts +6 -2
- package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
- package/src/adapters/shared/fs-server-response-matcher.test.ts +286 -0
- package/src/adapters/shared/fs-server-response-matcher.ts +17 -10
- package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
- package/src/adapters/shared/hmr-html-response.ts +52 -0
- package/src/adapters/shared/hmr-manager.contract.test.ts +196 -0
- package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
- package/src/adapters/shared/render-context.test.ts +146 -0
- package/src/adapters/shared/render-context.ts +21 -6
- package/src/adapters/shared/runtime-bootstrap.ts +79 -0
- package/src/adapters/shared/server-adapter.test.ts +77 -0
- package/src/adapters/shared/server-adapter.ts +51 -4
- package/src/adapters/shared/server-route-handler.test.ts +110 -0
- package/src/adapters/shared/server-route-handler.ts +5 -18
- package/src/adapters/shared/server-static-builder.test.ts +316 -0
- package/src/adapters/shared/server-static-builder.ts +92 -8
- package/src/build/README.md +101 -0
- package/src/build/build-adapter-serialization.test.ts +268 -0
- package/src/build/build-adapter.test.ts +815 -0
- package/src/build/build-adapter.ts +235 -6
- package/src/build/build-manifest.ts +54 -0
- package/src/build/dev-build-coordinator.ts +221 -0
- package/src/build/esbuild-build-adapter.ts +132 -83
- package/src/build/runtime-build-executor.ts +34 -0
- package/src/build/runtime-specifier-alias-plugin.test.ts +43 -0
- package/src/build/runtime-specifier-alias-plugin.ts +58 -0
- package/src/config/README.md +33 -0
- package/src/config/config-builder.test.ts +410 -0
- package/src/config/config-builder.ts +281 -49
- package/src/constants.ts +15 -0
- package/src/declarations.d.ts +18 -13
- package/src/eco/README.md +70 -16
- package/src/eco/component-render-context.ts +39 -17
- package/src/eco/eco.test.ts +678 -0
- package/src/eco/eco.ts +29 -8
- package/src/eco/eco.types.ts +20 -1
- package/src/eco/eco.utils.test.ts +124 -0
- package/src/eco/global-injector-map.test.ts +42 -0
- package/src/eco/lazy-injector-map.test.ts +66 -0
- package/src/eco/module-dependencies.test.ts +30 -0
- package/src/errors/http-error.test.ts +134 -0
- package/src/global/utils.test.ts +12 -0
- package/src/hmr/README.md +26 -0
- 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 +38 -7
- package/src/hmr/hmr-strategy.test.ts +124 -0
- package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
- package/src/hmr/hmr.test.e2e.ts +29 -38
- package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
- package/src/hmr/strategies/js-hmr-strategy.ts +115 -115
- package/src/index.ts +1 -1
- package/src/integrations/ghtml/ghtml-renderer.test.ts +63 -0
- package/src/integrations/ghtml/ghtml-renderer.ts +4 -1
- package/src/internal-types.ts +39 -19
- package/src/plugins/README.md +34 -0
- package/src/plugins/alias-resolver-plugin.test.ts +41 -0
- package/src/plugins/alias-resolver-plugin.ts +21 -3
- package/src/plugins/eco-component-meta-plugin.test.ts +380 -0
- package/src/plugins/eco-component-meta-plugin.ts +10 -3
- package/src/plugins/integration-plugin.test.ts +111 -0
- package/src/plugins/integration-plugin.ts +45 -3
- package/src/plugins/processor.test.ts +148 -0
- package/src/plugins/processor.ts +22 -2
- package/src/plugins/runtime-capability.ts +14 -0
- package/src/public-types.ts +73 -16
- package/src/route-renderer/GRAPH.md +16 -20
- package/src/route-renderer/README.md +8 -21
- package/src/route-renderer/component-graph/component-graph-executor.test.ts +41 -0
- package/src/route-renderer/component-graph/component-graph.test.ts +63 -0
- package/src/route-renderer/component-graph/component-marker.test.ts +73 -0
- package/src/route-renderer/component-graph/component-reference.ts +29 -0
- package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +135 -0
- package/src/route-renderer/{marker-graph-resolver.ts → component-graph/marker-graph-resolver.ts} +11 -9
- package/src/route-renderer/orchestration/integration-renderer.test.ts +936 -0
- package/src/route-renderer/{integration-renderer.ts → orchestration/integration-renderer.ts} +113 -19
- package/src/route-renderer/orchestration/render-execution.service.test.ts +97 -0
- package/src/route-renderer/{render-execution.service.ts → orchestration/render-execution.service.ts} +109 -37
- package/src/route-renderer/orchestration/render-preparation.service.test.ts +235 -0
- package/src/route-renderer/{render-preparation.service.ts → orchestration/render-preparation.service.ts} +127 -9
- package/src/route-renderer/page-loading/dependency-resolver.test.ts +345 -0
- package/src/route-renderer/{dependency-resolver.ts → page-loading/dependency-resolver.ts} +28 -12
- package/src/route-renderer/page-loading/page-module-loader.test.ts +96 -0
- package/src/route-renderer/{page-module-loader.ts → page-loading/page-module-loader.ts} +49 -21
- package/src/route-renderer/route-renderer.ts +36 -1
- package/src/router/README.md +26 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.test.browser.ts +51 -0
- package/src/router/client/link-intent.ts +92 -0
- package/src/router/client/navigation-coordinator.test.ts +237 -0
- package/src/router/client/navigation-coordinator.ts +433 -0
- package/src/router/server/fs-router-scanner.test.ts +83 -0
- package/src/router/{fs-router-scanner.ts → server/fs-router-scanner.ts} +12 -10
- package/src/router/server/fs-router.test.ts +214 -0
- package/src/router/{fs-router.ts → server/fs-router.ts} +2 -2
- package/src/services/README.md +29 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +385 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.ts +101 -6
- package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.ts +2 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +72 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +95 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/index.ts +2 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.ts +1 -1
- package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.ts +11 -5
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.ts +17 -27
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +286 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.ts +3 -3
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.ts +5 -4
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +199 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.ts +4 -1
- package/src/services/assets/browser-bundle.service.test.ts +36 -0
- package/src/services/assets/browser-bundle.service.ts +53 -0
- package/src/services/cache/index.ts +3 -3
- package/src/services/cache/memory-cache-store.test.ts +225 -0
- package/src/services/cache/memory-cache-store.ts +1 -1
- package/src/services/cache/page-cache-service.test.ts +175 -0
- package/src/services/cache/page-cache-service.ts +3 -3
- package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
- package/src/services/{page-request-cache-coordinator.service.ts → cache/page-request-cache-coordinator.service.ts} +9 -6
- package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
- package/src/services/html/html-rewriter-provider.service.ts +103 -0
- package/src/services/html/html-transformer.service.test.ts +378 -0
- package/src/services/html/html-transformer.service.ts +279 -0
- package/src/services/invalidation/development-invalidation.service.test.ts +77 -0
- package/src/services/invalidation/development-invalidation.service.ts +261 -0
- package/src/services/module-loading/app-server-module-transpiler.service.ts +52 -0
- package/src/services/module-loading/page-module-import.service.test.ts +253 -0
- package/src/services/module-loading/page-module-import.service.ts +200 -0
- package/src/services/module-loading/server-loader.service.test.ts +161 -0
- package/src/services/module-loading/server-loader.service.ts +130 -0
- package/src/services/module-loading/server-module-transpiler.service.test.ts +115 -0
- package/src/services/module-loading/server-module-transpiler.service.ts +105 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +95 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.ts +101 -0
- package/src/services/runtime-state/dev-graph.service.ts +217 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
- package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
- package/src/services/validation/schema-validation-service.test.ts +223 -0
- package/src/services/{schema-validation-service.ts → validation/schema-validation-service.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.test.ts +307 -0
- package/src/static-site-generator/static-site-generator.ts +109 -6
- package/src/utils/deep-merge.test.ts +114 -0
- package/src/utils/invariant.test.ts +22 -0
- package/src/utils/path-utils.test.ts +15 -0
- package/src/utils/resolve-work-dir.ts +45 -0
- package/src/utils/server-utils.test.ts +38 -0
- package/src/watchers/project-watcher.integration.test.ts +337 -0
- package/src/watchers/project-watcher.test-helpers.ts +1 -1
- package/src/watchers/project-watcher.test.ts +678 -0
- package/src/watchers/project-watcher.ts +130 -111
- package/CHANGELOG.md +0 -91
- package/src/adapters/abstract/application-adapter.d.ts +0 -168
- package/src/adapters/abstract/application-adapter.js +0 -109
- package/src/adapters/abstract/router-adapter.d.ts +0 -26
- package/src/adapters/abstract/router-adapter.js +0 -5
- package/src/adapters/abstract/server-adapter.d.ts +0 -69
- package/src/adapters/abstract/server-adapter.js +0 -15
- package/src/adapters/bun/client-bridge.d.ts +0 -34
- package/src/adapters/bun/client-bridge.js +0 -48
- package/src/adapters/bun/create-app.d.ts +0 -60
- package/src/adapters/bun/create-app.js +0 -117
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.js +0 -15
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.d.ts +0 -85
- package/src/adapters/bun/hmr-manager.js +0 -240
- package/src/adapters/bun/index.d.ts +0 -3
- package/src/adapters/bun/index.js +0 -8
- package/src/adapters/bun/server-adapter.d.ts +0 -155
- package/src/adapters/bun/server-adapter.js +0 -368
- package/src/adapters/bun/server-lifecycle.d.ts +0 -52
- package/src/adapters/bun/server-lifecycle.js +0 -120
- package/src/adapters/index.d.ts +0 -6
- package/src/adapters/index.js +0 -14
- package/src/adapters/node/create-app.d.ts +0 -21
- package/src/adapters/node/create-app.js +0 -143
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/node-client-bridge.d.ts +0 -26
- package/src/adapters/node/node-client-bridge.js +0 -66
- package/src/adapters/node/node-hmr-manager.d.ts +0 -63
- package/src/adapters/node/node-hmr-manager.js +0 -237
- package/src/adapters/node/server-adapter.d.ts +0 -190
- package/src/adapters/node/server-adapter.js +0 -420
- package/src/adapters/node/static-content-server.d.ts +0 -24
- package/src/adapters/node/static-content-server.js +0 -166
- package/src/adapters/shared/api-response.d.ts +0 -52
- package/src/adapters/shared/api-response.js +0 -96
- package/src/adapters/shared/application-adapter.d.ts +0 -18
- package/src/adapters/shared/application-adapter.js +0 -90
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
- package/src/adapters/shared/explicit-static-route-matcher.js +0 -100
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
- package/src/adapters/shared/file-route-middleware-pipeline.js +0 -98
- package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
- package/src/adapters/shared/fs-server-response-factory.js +0 -97
- package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -71
- package/src/adapters/shared/fs-server-response-matcher.js +0 -155
- package/src/adapters/shared/render-context.d.ts +0 -14
- package/src/adapters/shared/render-context.js +0 -69
- package/src/adapters/shared/server-adapter.d.ts +0 -87
- package/src/adapters/shared/server-adapter.js +0 -353
- package/src/adapters/shared/server-route-handler.d.ts +0 -89
- package/src/adapters/shared/server-route-handler.js +0 -120
- package/src/adapters/shared/server-static-builder.d.ts +0 -38
- package/src/adapters/shared/server-static-builder.js +0 -46
- package/src/build/build-adapter.d.ts +0 -74
- package/src/build/build-adapter.js +0 -54
- package/src/build/build-types.d.ts +0 -57
- package/src/build/build-types.js +0 -0
- package/src/build/esbuild-build-adapter.d.ts +0 -69
- package/src/build/esbuild-build-adapter.js +0 -390
- package/src/config/config-builder.d.ts +0 -227
- package/src/config/config-builder.js +0 -392
- package/src/constants.d.ts +0 -32
- package/src/constants.js +0 -21
- package/src/create-app.d.ts +0 -17
- package/src/create-app.js +0 -66
- package/src/define-api-handler.d.ts +0 -25
- package/src/define-api-handler.js +0 -15
- package/src/dev/sc-server.d.ts +0 -30
- package/src/dev/sc-server.js +0 -111
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -77
- package/src/eco/eco.d.ts +0 -9
- package/src/eco/eco.js +0 -110
- package/src/eco/eco.types.d.ts +0 -170
- package/src/eco/eco.types.js +0 -0
- package/src/eco/eco.utils.d.ts +0 -40
- package/src/eco/eco.utils.js +0 -40
- package/src/eco/global-injector-map.d.ts +0 -16
- package/src/eco/global-injector-map.js +0 -80
- package/src/eco/lazy-injector-map.d.ts +0 -8
- package/src/eco/lazy-injector-map.js +0 -70
- package/src/eco/module-dependencies.d.ts +0 -18
- package/src/eco/module-dependencies.js +0 -49
- package/src/errors/http-error.d.ts +0 -31
- package/src/errors/http-error.js +0 -50
- package/src/errors/index.d.ts +0 -2
- package/src/errors/index.js +0 -4
- package/src/errors/locals-access-error.d.ts +0 -4
- package/src/errors/locals-access-error.js +0 -9
- package/src/global/app-logger.d.ts +0 -2
- package/src/global/app-logger.js +0 -6
- package/src/hmr/client/hmr-runtime.d.ts +0 -10
- package/src/hmr/client/hmr-runtime.js +0 -86
- package/src/hmr/hmr-strategy.d.ts +0 -159
- package/src/hmr/hmr-strategy.js +0 -29
- package/src/hmr/hmr.test.e2e.d.ts +0 -1
- package/src/hmr/hmr.test.e2e.js +0 -50
- package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
- package/src/hmr/strategies/default-hmr-strategy.js +0 -34
- package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -136
- package/src/hmr/strategies/js-hmr-strategy.js +0 -188
- package/src/index.browser.d.ts +0 -3
- package/src/index.browser.js +0 -4
- package/src/index.d.ts +0 -5
- package/src/index.js +0 -10
- package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -15
- package/src/integrations/ghtml/ghtml-renderer.js +0 -60
- package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -20
- package/src/integrations/ghtml/ghtml.plugin.js +0 -21
- package/src/internal-types.d.ts +0 -200
- package/src/internal-types.js +0 -0
- package/src/plugins/alias-resolver-plugin.d.ts +0 -2
- package/src/plugins/alias-resolver-plugin.js +0 -39
- package/src/plugins/eco-component-meta-plugin.d.ts +0 -95
- package/src/plugins/eco-component-meta-plugin.js +0 -157
- package/src/plugins/integration-plugin.d.ts +0 -102
- package/src/plugins/integration-plugin.js +0 -100
- package/src/plugins/processor.d.ts +0 -82
- package/src/plugins/processor.js +0 -122
- package/src/public-types.d.ts +0 -1098
- package/src/public-types.js +0 -0
- 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.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/dependency-resolver.d.ts +0 -24
- package/src/route-renderer/dependency-resolver.js +0 -428
- 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/marker-graph-resolver.d.ts +0 -76
- package/src/route-renderer/marker-graph-resolver.js +0 -93
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.js +0 -102
- 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-preparation.service.d.ts +0 -112
- package/src/route-renderer/render-preparation.service.js +0 -243
- package/src/route-renderer/route-renderer.d.ts +0 -26
- package/src/route-renderer/route-renderer.js +0 -68
- package/src/router/fs-router-scanner.d.ts +0 -41
- package/src/router/fs-router-scanner.js +0 -155
- package/src/router/fs-router.d.ts +0 -26
- package/src/router/fs-router.js +0 -100
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.js +0 -250
- package/src/services/asset-processing-service/asset.factory.d.ts +0 -17
- package/src/services/asset-processing-service/asset.factory.js +0 -82
- package/src/services/asset-processing-service/assets.types.d.ts +0 -88
- package/src/services/asset-processing-service/assets.types.js +0 -0
- 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/processor.interface.d.ts +0 -22
- package/src/services/asset-processing-service/processor.interface.js +0 -6
- package/src/services/asset-processing-service/processor.registry.d.ts +0 -8
- package/src/services/asset-processing-service/processor.registry.js +0 -15
- package/src/services/asset-processing-service/processors/base/base-processor.d.ts +0 -24
- package/src/services/asset-processing-service/processors/base/base-processor.js +0 -59
- 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/index.d.ts +0 -5
- package/src/services/asset-processing-service/processors/index.js +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.d.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/file-script.processor.d.ts +0 -8
- package/src/services/asset-processing-service/processors/script/file-script.processor.js +0 -76
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -63
- package/src/services/cache/cache.types.d.ts +0 -107
- package/src/services/cache/cache.types.js +0 -0
- package/src/services/cache/index.d.ts +0 -7
- package/src/services/cache/index.js +0 -7
- package/src/services/cache/memory-cache-store.d.ts +0 -42
- package/src/services/cache/memory-cache-store.js +0 -98
- package/src/services/cache/page-cache-service.d.ts +0 -70
- package/src/services/cache/page-cache-service.js +0 -152
- 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.d.ts +0 -75
- package/src/services/page-request-cache-coordinator.service.js +0 -107
- package/src/services/schema-validation-service.d.ts +0 -122
- package/src/services/schema-validation-service.js +0 -101
- package/src/services/validation/standard-schema.types.d.ts +0 -65
- package/src/services/validation/standard-schema.types.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +0 -57
- package/src/static-site-generator/static-site-generator.js +0 -272
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/deep-merge.d.ts +0 -14
- package/src/utils/deep-merge.js +0 -32
- package/src/utils/hash.d.ts +0 -1
- package/src/utils/hash.js +0 -7
- package/src/utils/html.d.ts +0 -1
- package/src/utils/html.js +0 -4
- package/src/utils/invariant.d.ts +0 -5
- package/src/utils/invariant.js +0 -11
- package/src/utils/locals-utils.d.ts +0 -15
- package/src/utils/locals-utils.js +0 -24
- package/src/utils/parse-cli-args.d.ts +0 -24
- package/src/utils/parse-cli-args.js +0 -47
- package/src/utils/path-utils.module.d.ts +0 -5
- package/src/utils/path-utils.module.js +0 -14
- package/src/utils/runtime.d.ts +0 -11
- package/src/utils/runtime.js +0 -40
- package/src/utils/server-utils.module.d.ts +0 -19
- package/src/utils/server-utils.module.js +0 -56
- package/src/watchers/project-watcher.d.ts +0 -125
- package/src/watchers/project-watcher.js +0 -265
- package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
- package/src/watchers/project-watcher.test-helpers.js +0 -52
- /package/src/route-renderer/{component-graph-executor.ts → component-graph/component-graph-executor.ts} +0 -0
- /package/src/route-renderer/{component-graph.ts → component-graph/component-graph.ts} +0 -0
- /package/src/route-renderer/{component-marker.ts → component-graph/component-marker.ts} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.ts +0 -0
|
@@ -1,46 +1,88 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
3
|
import { RESOLVED_ASSETS_DIR } from '../../constants.ts';
|
|
5
|
-
import {
|
|
4
|
+
import { getAppBuildExecutor } from '../../build/build-adapter.ts';
|
|
6
5
|
import type { DefaultHmrContext, EcoPagesAppConfig, IHmrManager, IClientBridge } from '../../internal-types.ts';
|
|
7
6
|
import type { EcoBuildPlugin } from '../../build/build-types.ts';
|
|
8
7
|
import { fileSystem } from '@ecopages/file-system';
|
|
9
|
-
import type
|
|
10
|
-
import { HmrStrategyType } from '../../hmr/hmr-strategy.ts';
|
|
8
|
+
import { HmrStrategyType, type HmrStrategy } from '../../hmr/hmr-strategy.ts';
|
|
11
9
|
import { DefaultHmrStrategy } from '../../hmr/strategies/default-hmr-strategy.ts';
|
|
12
10
|
import { JsHmrStrategy } from '../../hmr/strategies/js-hmr-strategy.ts';
|
|
13
11
|
import { appLogger } from '../../global/app-logger.ts';
|
|
14
12
|
import type { ClientBridgeEvent } from '../../public-types.ts';
|
|
13
|
+
import { HmrEntrypointRegistrar } from '../shared/hmr-entrypoint-registrar.ts';
|
|
14
|
+
import { BrowserBundleService } from '../../services/assets/browser-bundle.service.ts';
|
|
15
|
+
import { getAppServerModuleTranspiler } from '../../services/module-loading/app-server-module-transpiler.service.ts';
|
|
16
|
+
import {
|
|
17
|
+
getAppEntrypointDependencyGraph,
|
|
18
|
+
InMemoryEntrypointDependencyGraph,
|
|
19
|
+
setAppEntrypointDependencyGraph,
|
|
20
|
+
type EntrypointDependencyGraph,
|
|
21
|
+
} from '../../services/runtime-state/entrypoint-dependency-graph.service.ts';
|
|
22
|
+
import { getAppRuntimeSpecifierRegistry } from '../../services/runtime-state/runtime-specifier-registry.service.ts';
|
|
23
|
+
import type { ServerModuleTranspiler } from '../../services/module-loading/server-module-transpiler.service.ts';
|
|
24
|
+
import { resolveInternalExecutionDir, resolveInternalWorkDir } from '../../utils/resolve-work-dir.ts';
|
|
15
25
|
|
|
16
26
|
export interface NodeHmrManagerParams {
|
|
17
27
|
appConfig: EcoPagesAppConfig;
|
|
18
28
|
bridge: IClientBridge;
|
|
19
29
|
}
|
|
20
30
|
|
|
31
|
+
type HandleFileChangeOptions = {
|
|
32
|
+
broadcast?: boolean;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Node development HMR manager.
|
|
37
|
+
*
|
|
38
|
+
* @remarks
|
|
39
|
+
* This manager owns three separate concerns:
|
|
40
|
+
* - runtime websocket event fanout
|
|
41
|
+
* - entrypoint registration and dedupe
|
|
42
|
+
* - strategy coordination for rebuilds and invalidation
|
|
43
|
+
*
|
|
44
|
+
* The strict page-entrypoint contract lives here: `registerEntrypoint()` is
|
|
45
|
+
* reserved for integration-owned page bundles, while generic script assets must
|
|
46
|
+
* go through `registerScriptEntrypoint()`.
|
|
47
|
+
*/
|
|
21
48
|
export class NodeHmrManager implements IHmrManager {
|
|
49
|
+
private static readonly entrypointRegistrationTimeoutMs = 4000;
|
|
22
50
|
public readonly appConfig: EcoPagesAppConfig;
|
|
23
51
|
private readonly bridge: IClientBridge;
|
|
24
52
|
private watchers = new Map<string, fs.FSWatcher>();
|
|
25
53
|
private watchedFiles = new Map<string, string>();
|
|
26
|
-
private
|
|
27
|
-
/**
|
|
28
|
-
* Node-only reverse invalidation index: dependency file -> affected entrypoints.
|
|
29
|
-
*/
|
|
30
|
-
private dependencyEntrypoints = new Map<string, Set<string>>();
|
|
31
|
-
/**
|
|
32
|
-
* Node-only forward index: entrypoint -> latest dependency set.
|
|
33
|
-
*/
|
|
34
|
-
private entrypointDependencies = new Map<string, Set<string>>();
|
|
54
|
+
private entrypointRegistrations = new Map<string, Promise<string>>();
|
|
35
55
|
private distDir: string;
|
|
36
56
|
private plugins: EcoBuildPlugin[] = [];
|
|
37
57
|
private enabled = true;
|
|
38
58
|
private strategies: HmrStrategy[] = [];
|
|
59
|
+
private readonly entrypointRegistrar: HmrEntrypointRegistrar;
|
|
60
|
+
private readonly browserBundleService: BrowserBundleService;
|
|
61
|
+
private readonly entrypointDependencyGraph: EntrypointDependencyGraph;
|
|
62
|
+
private readonly runtimeSpecifierRegistry: ReturnType<typeof getAppRuntimeSpecifierRegistry>;
|
|
63
|
+
private readonly serverModuleTranspiler: ServerModuleTranspiler;
|
|
39
64
|
|
|
40
65
|
constructor({ appConfig, bridge }: NodeHmrManagerParams) {
|
|
41
66
|
this.appConfig = appConfig;
|
|
42
67
|
this.bridge = bridge;
|
|
43
|
-
this.distDir = path.join(this.appConfig
|
|
68
|
+
this.distDir = path.join(resolveInternalWorkDir(this.appConfig), RESOLVED_ASSETS_DIR, '_hmr');
|
|
69
|
+
this.entrypointRegistrar = new HmrEntrypointRegistrar({
|
|
70
|
+
srcDir: this.appConfig.absolutePaths.srcDir,
|
|
71
|
+
distDir: this.distDir,
|
|
72
|
+
entrypointRegistrations: this.entrypointRegistrations,
|
|
73
|
+
watchedFiles: this.watchedFiles,
|
|
74
|
+
clearFailedRegistration: (entrypointPath) => this.clearFailedEntrypointRegistration(entrypointPath),
|
|
75
|
+
registrationTimeoutMs: NodeHmrManager.entrypointRegistrationTimeoutMs,
|
|
76
|
+
});
|
|
77
|
+
this.browserBundleService = new BrowserBundleService(appConfig);
|
|
78
|
+
const existingEntrypointDependencyGraph = getAppEntrypointDependencyGraph(appConfig);
|
|
79
|
+
this.entrypointDependencyGraph =
|
|
80
|
+
existingEntrypointDependencyGraph instanceof InMemoryEntrypointDependencyGraph
|
|
81
|
+
? existingEntrypointDependencyGraph
|
|
82
|
+
: new InMemoryEntrypointDependencyGraph();
|
|
83
|
+
setAppEntrypointDependencyGraph(this.appConfig, this.entrypointDependencyGraph);
|
|
84
|
+
this.runtimeSpecifierRegistry = getAppRuntimeSpecifierRegistry(this.appConfig);
|
|
85
|
+
this.serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
|
|
44
86
|
this.cleanDistDir();
|
|
45
87
|
this.initializeStrategies();
|
|
46
88
|
}
|
|
@@ -55,17 +97,42 @@ export class NodeHmrManager implements IHmrManager {
|
|
|
55
97
|
fileSystem.ensureDir(this.distDir);
|
|
56
98
|
}
|
|
57
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Returns whether the generic JS strategy is allowed to rebuild an entrypoint.
|
|
102
|
+
*
|
|
103
|
+
* @remarks
|
|
104
|
+
* Higher-priority integration strategies own framework page entrypoints. When
|
|
105
|
+
* one of them matches, the generic JS strategy must stay out of the way so a
|
|
106
|
+
* shared dependency invalidation does not overwrite framework-specific output.
|
|
107
|
+
*/
|
|
108
|
+
private shouldJsStrategyProcessEntrypoint(entrypointPath: string): boolean {
|
|
109
|
+
return !this.strategies.some((strategy) => {
|
|
110
|
+
if (strategy.type !== HmrStrategyType.INTEGRATION || strategy.priority <= HmrStrategyType.SCRIPT) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
return strategy.matches(entrypointPath);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
appLogger.error(error);
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
58
123
|
private initializeStrategies(): void {
|
|
59
124
|
const jsContext = {
|
|
60
125
|
getWatchedFiles: () => this.watchedFiles,
|
|
61
|
-
getSpecifierMap: () => this.
|
|
62
|
-
getDependencyEntrypoints: (filePath: string) =>
|
|
63
|
-
new Set(this.dependencyEntrypoints.get(path.resolve(filePath)) ?? []),
|
|
64
|
-
setEntrypointDependencies: (entrypointPath: string, dependencies: string[]) =>
|
|
65
|
-
this.setEntrypointDependencies(entrypointPath, dependencies),
|
|
126
|
+
getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
|
|
66
127
|
getDistDir: () => this.distDir,
|
|
67
128
|
getPlugins: () => this.plugins,
|
|
68
129
|
getSrcDir: () => this.appConfig.absolutePaths.srcDir,
|
|
130
|
+
getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
|
|
131
|
+
getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
|
|
132
|
+
getTemplateExtensions: () => this.appConfig.templatesExt,
|
|
133
|
+
getBrowserBundleService: () => this.browserBundleService,
|
|
134
|
+
getEntrypointDependencyGraph: () => this.entrypointDependencyGraph,
|
|
135
|
+
shouldProcessEntrypoint: (entrypointPath: string) => this.shouldJsStrategyProcessEntrypoint(entrypointPath),
|
|
69
136
|
};
|
|
70
137
|
|
|
71
138
|
this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
|
|
@@ -87,27 +154,39 @@ export class NodeHmrManager implements IHmrManager {
|
|
|
87
154
|
return this.enabled;
|
|
88
155
|
}
|
|
89
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Registers runtime bare-specifier mappings exposed by integrations.
|
|
159
|
+
*
|
|
160
|
+
* @remarks
|
|
161
|
+
* These mappings are consumed by framework-owned HMR strategies such as the
|
|
162
|
+
* React integration strategy when they rewrite browser bundles. The registry
|
|
163
|
+
* stays generic so the same mappings can support broader import-map-style
|
|
164
|
+
* runtime features later without moving integration semantics into core.
|
|
165
|
+
*/
|
|
90
166
|
public registerSpecifierMap(map: Record<string, string>): void {
|
|
91
|
-
|
|
92
|
-
this.specifierMap.set(specifier, url);
|
|
93
|
-
}
|
|
167
|
+
this.runtimeSpecifierRegistry.register(map);
|
|
94
168
|
}
|
|
95
169
|
|
|
96
170
|
public async buildRuntime(): Promise<void> {
|
|
97
|
-
const
|
|
98
|
-
const runtimeSource = path.resolve(currentDir, '../../hmr/client/hmr-runtime.ts');
|
|
99
|
-
|
|
100
|
-
const result = await defaultBuildAdapter.build({
|
|
101
|
-
entrypoints: [runtimeSource],
|
|
102
|
-
outdir: this.distDir,
|
|
103
|
-
naming: '_hmr_runtime.js',
|
|
104
|
-
minify: false,
|
|
105
|
-
...defaultBuildAdapter.getTranspileOptions('hmr-runtime'),
|
|
106
|
-
plugins: this.plugins,
|
|
107
|
-
});
|
|
171
|
+
const runtimeSource = path.resolve(import.meta.dirname, '../../hmr/client/hmr-runtime.ts');
|
|
108
172
|
|
|
109
|
-
|
|
110
|
-
|
|
173
|
+
try {
|
|
174
|
+
const result = await this.browserBundleService.bundle({
|
|
175
|
+
profile: 'hmr-runtime',
|
|
176
|
+
entrypoints: [runtimeSource],
|
|
177
|
+
outdir: this.distDir,
|
|
178
|
+
naming: '_hmr_runtime.js',
|
|
179
|
+
minify: false,
|
|
180
|
+
plugins: this.plugins,
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
if (!result.success) {
|
|
184
|
+
this.enabled = false;
|
|
185
|
+
appLogger.error('[HMR] Failed to build runtime script; continuing with HMR disabled.', result.logs);
|
|
186
|
+
}
|
|
187
|
+
} catch (error) {
|
|
188
|
+
this.enabled = false;
|
|
189
|
+
appLogger.error('[HMR] Failed to build runtime script; continuing with HMR disabled.', error);
|
|
111
190
|
}
|
|
112
191
|
}
|
|
113
192
|
|
|
@@ -122,30 +201,13 @@ export class NodeHmrManager implements IHmrManager {
|
|
|
122
201
|
this.bridge.broadcast(event);
|
|
123
202
|
}
|
|
124
203
|
|
|
125
|
-
public
|
|
126
|
-
const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
|
|
127
|
-
const strategy = sorted.find((candidate) => {
|
|
128
|
-
try {
|
|
129
|
-
return candidate.matches(filePath);
|
|
130
|
-
} catch (err) {
|
|
131
|
-
appLogger.error(
|
|
132
|
-
`[NodeHmrManager] Error checking match for ${candidate.constructor.name}:`,
|
|
133
|
-
err as Error,
|
|
134
|
-
);
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
return strategy !== undefined && strategy.type !== HmrStrategyType.FALLBACK;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
public async handleFileChange(filePath: string): Promise<void> {
|
|
204
|
+
public async handleFileChange(filePath: string, options: HandleFileChangeOptions = {}): Promise<void> {
|
|
143
205
|
const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
|
|
144
206
|
const strategy = sorted.find((s) => {
|
|
145
207
|
try {
|
|
146
208
|
return s.matches(filePath);
|
|
147
209
|
} catch (err) {
|
|
148
|
-
appLogger.error(
|
|
210
|
+
appLogger.error(err);
|
|
149
211
|
return false;
|
|
150
212
|
}
|
|
151
213
|
});
|
|
@@ -158,8 +220,9 @@ export class NodeHmrManager implements IHmrManager {
|
|
|
158
220
|
appLogger.debug(`[NodeHmrManager] Selected strategy: ${strategy.constructor.name}`);
|
|
159
221
|
|
|
160
222
|
const action = await strategy.process(filePath);
|
|
223
|
+
const shouldBroadcast = options.broadcast ?? true;
|
|
161
224
|
|
|
162
|
-
if (action.type === 'broadcast') {
|
|
225
|
+
if (shouldBroadcast && action.type === 'broadcast') {
|
|
163
226
|
if (action.events) {
|
|
164
227
|
for (const event of action.events) {
|
|
165
228
|
this.broadcast(event);
|
|
@@ -177,7 +240,7 @@ export class NodeHmrManager implements IHmrManager {
|
|
|
177
240
|
}
|
|
178
241
|
|
|
179
242
|
public getSpecifierMap(): Map<string, string> {
|
|
180
|
-
return this.
|
|
243
|
+
return this.runtimeSpecifierRegistry.getAll();
|
|
181
244
|
}
|
|
182
245
|
|
|
183
246
|
public getDistDir(): string {
|
|
@@ -191,99 +254,128 @@ export class NodeHmrManager implements IHmrManager {
|
|
|
191
254
|
public getDefaultContext(): DefaultHmrContext {
|
|
192
255
|
return {
|
|
193
256
|
getWatchedFiles: () => this.watchedFiles,
|
|
194
|
-
getSpecifierMap: () => this.
|
|
257
|
+
getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
|
|
195
258
|
getDistDir: () => this.distDir,
|
|
196
259
|
getPlugins: () => this.plugins,
|
|
197
260
|
getSrcDir: () => this.appConfig.absolutePaths.srcDir,
|
|
198
261
|
getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
|
|
199
262
|
getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
|
|
263
|
+
getBuildExecutor: () => getAppBuildExecutor(this.appConfig),
|
|
264
|
+
getBrowserBundleService: () => this.browserBundleService,
|
|
265
|
+
importServerModule: async <T>(filePath: string) =>
|
|
266
|
+
await this.serverModuleTranspiler.importModule<T>({
|
|
267
|
+
filePath,
|
|
268
|
+
outdir: path.join(resolveInternalExecutionDir(this.appConfig), '.server-modules'),
|
|
269
|
+
externalPackages: true,
|
|
270
|
+
}),
|
|
200
271
|
};
|
|
201
272
|
}
|
|
202
273
|
|
|
274
|
+
private clearFailedEntrypointRegistration(entrypointPath: string): void {
|
|
275
|
+
this.watchedFiles.delete(entrypointPath);
|
|
276
|
+
this.entrypointDependencyGraph.clearEntrypointDependencies(entrypointPath);
|
|
277
|
+
}
|
|
278
|
+
|
|
203
279
|
/**
|
|
204
|
-
*
|
|
280
|
+
* Registers one integration-owned page entrypoint.
|
|
205
281
|
*
|
|
206
282
|
* @remarks
|
|
207
|
-
*
|
|
208
|
-
*
|
|
283
|
+
* Concurrent callers share one in-flight registration. The registration is
|
|
284
|
+
* removed from the dedupe map once it resolves or fails so later requests do
|
|
285
|
+
* not inherit stale state.
|
|
209
286
|
*/
|
|
210
|
-
private setEntrypointDependencies(entrypointPath: string, dependencies: string[]): void {
|
|
211
|
-
const normalizedEntrypoint = path.resolve(entrypointPath);
|
|
212
|
-
const previousDependencies = this.entrypointDependencies.get(normalizedEntrypoint);
|
|
213
|
-
|
|
214
|
-
if (previousDependencies) {
|
|
215
|
-
for (const dependencyPath of previousDependencies) {
|
|
216
|
-
const entrypoints = this.dependencyEntrypoints.get(dependencyPath);
|
|
217
|
-
if (!entrypoints) {
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
entrypoints.delete(normalizedEntrypoint);
|
|
222
|
-
if (entrypoints.size === 0) {
|
|
223
|
-
this.dependencyEntrypoints.delete(dependencyPath);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
const normalizedDependencies = new Set<string>([
|
|
229
|
-
normalizedEntrypoint,
|
|
230
|
-
...dependencies.map((dependencyPath) => path.resolve(dependencyPath)),
|
|
231
|
-
]);
|
|
232
|
-
|
|
233
|
-
this.entrypointDependencies.set(normalizedEntrypoint, normalizedDependencies);
|
|
234
|
-
|
|
235
|
-
for (const dependencyPath of normalizedDependencies) {
|
|
236
|
-
const entrypoints = this.dependencyEntrypoints.get(dependencyPath) ?? new Set<string>();
|
|
237
|
-
entrypoints.add(normalizedEntrypoint);
|
|
238
|
-
this.dependencyEntrypoints.set(dependencyPath, entrypoints);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
287
|
public async registerEntrypoint(entrypointPath: string): Promise<string> {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
288
|
+
return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
|
|
289
|
+
emit: async (normalizedEntrypoint, outputPath) =>
|
|
290
|
+
await this.emitStrictEntrypoint(normalizedEntrypoint, outputPath),
|
|
291
|
+
getMissingOutputError: (normalizedEntrypoint, outputPath) =>
|
|
292
|
+
new Error(
|
|
293
|
+
`[HMR] Integration failed to emit entrypoint ${normalizedEntrypoint} to ${outputPath}. Page entrypoints must be produced by their owning integration.`,
|
|
294
|
+
),
|
|
295
|
+
});
|
|
296
|
+
}
|
|
246
297
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
298
|
+
/**
|
|
299
|
+
* Registers one generic script entrypoint.
|
|
300
|
+
*
|
|
301
|
+
* @remarks
|
|
302
|
+
* This path is intentionally separate from page entrypoints so non-framework
|
|
303
|
+
* scripts can still use the generic build fallback without weakening the page
|
|
304
|
+
* ownership contract.
|
|
305
|
+
*/
|
|
306
|
+
public async registerScriptEntrypoint(entrypointPath: string): Promise<string> {
|
|
307
|
+
return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
|
|
308
|
+
emit: async (normalizedEntrypoint, outputPath) =>
|
|
309
|
+
await this.emitScriptEntrypoint(normalizedEntrypoint, outputPath),
|
|
310
|
+
getMissingOutputError: (normalizedEntrypoint) =>
|
|
311
|
+
new Error(`[HMR] Failed to register script entrypoint: ${normalizedEntrypoint}`),
|
|
312
|
+
});
|
|
313
|
+
}
|
|
251
314
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
315
|
+
/**
|
|
316
|
+
* Performs strict integration-owned entrypoint registration for one normalized source path.
|
|
317
|
+
*
|
|
318
|
+
* @remarks
|
|
319
|
+
* The flow is:
|
|
320
|
+
* 1. Reserve the output URL in the watched map.
|
|
321
|
+
* 2. Remove any stale emitted file from an earlier process or failed build.
|
|
322
|
+
* 3. Let the strategy chain try to emit the entrypoint without broadcasting.
|
|
323
|
+
* 4. Fail if the owning integration did not emit the expected output.
|
|
324
|
+
*/
|
|
325
|
+
private async emitStrictEntrypoint(entrypointPath: string, _outputPath: string): Promise<void> {
|
|
326
|
+
await this.handleFileChange(entrypointPath, { broadcast: false });
|
|
327
|
+
}
|
|
255
328
|
|
|
256
|
-
|
|
329
|
+
/**
|
|
330
|
+
* Performs registration for a generic script asset.
|
|
331
|
+
*
|
|
332
|
+
* @remarks
|
|
333
|
+
* The manager first gives registered strategies a chance to emit the file so
|
|
334
|
+
* processor-owned or integration-owned behavior can still participate. Only
|
|
335
|
+
* when no output exists does it issue the generic build.
|
|
336
|
+
*/
|
|
337
|
+
private async emitScriptEntrypoint(entrypointPath: string, outputPath: string): Promise<void> {
|
|
338
|
+
const naming = path.relative(this.distDir, outputPath).split(path.sep).join('/');
|
|
257
339
|
|
|
258
|
-
await this.handleFileChange(entrypointPath);
|
|
340
|
+
await this.handleFileChange(entrypointPath, { broadcast: false });
|
|
259
341
|
|
|
260
342
|
if (!fileSystem.exists(outputPath)) {
|
|
261
|
-
const
|
|
343
|
+
const buildResult = await this.browserBundleService.bundle({
|
|
344
|
+
profile: 'hmr-entrypoint',
|
|
262
345
|
entrypoints: [entrypointPath],
|
|
263
346
|
outdir: this.distDir,
|
|
264
|
-
naming
|
|
347
|
+
naming,
|
|
265
348
|
minify: false,
|
|
266
|
-
external: Array.from(this.specifierMap.keys()),
|
|
267
|
-
...defaultBuildAdapter.getTranspileOptions('hmr-entrypoint'),
|
|
268
349
|
plugins: this.plugins,
|
|
269
350
|
});
|
|
270
351
|
|
|
271
|
-
if (!
|
|
272
|
-
appLogger.error(
|
|
352
|
+
if (!buildResult.success) {
|
|
353
|
+
appLogger.error(
|
|
354
|
+
`[HMR] Generic script entrypoint build failed for ${entrypointPath}:`,
|
|
355
|
+
buildResult.logs,
|
|
356
|
+
);
|
|
273
357
|
}
|
|
274
358
|
}
|
|
275
|
-
|
|
276
|
-
return outputUrl;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
private encodeDynamicSegments(filepath: string): string {
|
|
280
|
-
return filepath.replace(/\[([^\]]+)\]/g, '_$1_');
|
|
281
359
|
}
|
|
282
360
|
|
|
361
|
+
/**
|
|
362
|
+
* Stops active watchers and releases retained registration state.
|
|
363
|
+
*
|
|
364
|
+
* @remarks
|
|
365
|
+
* The manager intentionally does not remove emitted `_hmr` files from disk
|
|
366
|
+
* because multiple app processes may share the same dist directory during test
|
|
367
|
+
* runs. It does clear in-memory indexes so old entrypoints, dependencies, and
|
|
368
|
+
* specifier maps cannot leak across a reused manager instance.
|
|
369
|
+
*/
|
|
283
370
|
public stop() {
|
|
371
|
+
this.entrypointRegistrations.clear();
|
|
284
372
|
for (const watcher of this.watchers.values()) {
|
|
285
373
|
watcher.close();
|
|
286
374
|
}
|
|
287
375
|
this.watchers.clear();
|
|
376
|
+
this.watchedFiles.clear();
|
|
377
|
+
this.runtimeSpecifierRegistry.clear();
|
|
378
|
+
this.entrypointDependencyGraph.reset();
|
|
379
|
+
this.plugins = [];
|
|
288
380
|
}
|
|
289
381
|
}
|