@ecopages/core 0.2.0-alpha.53 → 0.2.0-alpha.54
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 +2 -3
- package/package.json +97 -182
- package/src/adapters/abstract/application-adapter.test.ts +218 -0
- package/src/adapters/abstract/application-adapter.ts +379 -0
- package/src/adapters/abstract/router-adapter.ts +30 -0
- package/src/adapters/abstract/server-adapter.ts +79 -0
- package/src/adapters/bun/client-bridge.ts +62 -0
- package/src/adapters/bun/create-app.ts +214 -0
- package/src/adapters/bun/hmr-manager.test.ts +265 -0
- package/src/adapters/bun/hmr-manager.ts +88 -0
- package/src/adapters/bun/index.ts +2 -0
- package/src/adapters/bun/runtime-host.ts +76 -0
- package/src/adapters/bun/server-adapter.ts +605 -0
- package/src/adapters/bun/static-preview-host.ts +70 -0
- package/src/adapters/create-app.test.ts +10 -0
- package/src/adapters/create-app.ts +91 -0
- package/src/adapters/index.ts +2 -0
- package/src/adapters/node/create-app.test.ts +76 -0
- package/src/adapters/node/create-app.ts +116 -0
- package/src/adapters/node/http-request-bridge.test.ts +146 -0
- package/src/adapters/node/http-request-bridge.ts +176 -0
- package/src/adapters/node/node-client-bridge.test.ts +198 -0
- package/src/adapters/node/node-client-bridge.ts +79 -0
- package/src/adapters/node/node-hmr-manager.test.ts +374 -0
- package/src/adapters/node/node-hmr-manager.ts +72 -0
- package/src/adapters/node/runtime-host.test.ts +49 -0
- package/src/adapters/node/runtime-host.ts +113 -0
- package/src/adapters/node/server-adapter-dependencies.ts +28 -0
- package/src/adapters/node/server-adapter.test.ts +84 -0
- package/src/adapters/node/server-adapter.ts +423 -0
- package/src/adapters/node/static-content-server.test.ts +60 -0
- package/src/adapters/node/static-content-server.ts +239 -0
- package/src/adapters/node/static-preview-host.test.ts +89 -0
- package/src/adapters/node/static-preview-host.ts +101 -0
- package/src/adapters/shared/api-response.test.ts +97 -0
- package/src/adapters/shared/api-response.ts +104 -0
- package/src/adapters/shared/application-adapter.ts +199 -0
- package/src/adapters/shared/define-api-handler.ts +66 -0
- package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
- package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
- package/src/adapters/shared/explicit-static-route-matcher.ts +131 -0
- package/src/adapters/shared/file-route-middleware-pipeline.test.ts +85 -0
- package/src/adapters/shared/file-route-middleware-pipeline.ts +118 -0
- package/src/adapters/shared/fs-server-response-factory.test.ts +176 -0
- package/src/adapters/shared/fs-server-response-factory.ts +96 -0
- package/src/adapters/shared/fs-server-response-matcher.test.ts +311 -0
- package/src/adapters/shared/fs-server-response-matcher.ts +240 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
- package/src/adapters/shared/hmr-html-response.ts +54 -0
- package/src/adapters/shared/hmr-manager.contract.test.ts +228 -0
- package/src/adapters/shared/hmr-manager.dispatch.test.ts +229 -0
- package/src/adapters/shared/render-context.test.ts +244 -0
- package/src/adapters/shared/render-context.ts +161 -0
- package/src/adapters/shared/runtime-app-bootstrap.test.ts +96 -0
- package/src/adapters/shared/runtime-app-bootstrap.ts +72 -0
- package/src/adapters/shared/runtime-host.ts +11 -0
- package/src/adapters/shared/server-adapter.test.ts +130 -0
- package/src/adapters/shared/server-adapter.ts +571 -0
- package/src/adapters/shared/server-route-handler.test.ts +112 -0
- package/src/adapters/shared/server-route-handler.ts +153 -0
- package/src/adapters/shared/server-static-builder.test.ts +338 -0
- package/src/adapters/shared/server-static-builder.ts +170 -0
- package/src/adapters/shared/shared-hmr-manager.ts +298 -0
- package/src/adapters/shared/static-preview-host.ts +12 -0
- package/src/build/README.md +57 -73
- package/src/build/browser-runtime-manifest.test.ts +121 -0
- package/src/build/browser-runtime-manifest.ts +105 -0
- package/src/build/browser-runtime-plugin-helpers.test.ts +49 -0
- package/src/build/browser-runtime-plugin-helpers.ts +37 -0
- package/src/build/browser-runtime-plugin.test.ts +256 -0
- package/src/build/browser-runtime-plugin.ts +306 -0
- package/src/build/build-adapter.test.ts +463 -0
- package/src/build/build-adapter.ts +788 -0
- package/src/build/build-manifest.ts +79 -0
- package/src/build/build-types.ts +83 -0
- package/src/build/rolldown-build-adapter.test.ts +352 -0
- package/src/build/rolldown-build-adapter.ts +363 -0
- package/src/build/rolldown-plugin-bridge.test.ts +256 -0
- package/src/build/rolldown-plugin-bridge.ts +309 -0
- package/src/build/runtime-build-executor.test.ts +130 -0
- package/src/build/runtime-build-executor.ts +37 -0
- package/src/build/runtime-build-output-normalizer.ts +137 -0
- package/src/build/serialized-build-executor.test.ts +96 -0
- package/src/build/serialized-build-executor.ts +90 -0
- package/src/build/server-side-css-shim-plugin.ts +77 -0
- package/src/cache/index.ts +6 -0
- package/src/cache/module-parse-cache.test.ts +73 -0
- package/src/cache/module-parse-cache.ts +137 -0
- package/src/config/README.md +1 -1
- package/src/config/config-builder.test.ts +456 -0
- package/src/config/config-builder.ts +728 -0
- package/src/config/config-builder.typecheck.test.ts +96 -0
- package/src/config/{constants.d.ts → constants.ts} +22 -13
- package/src/dev/host-runtime.ts +34 -0
- package/src/dev/sc-server.ts +143 -0
- package/src/eco/eco.browser.test.ts +43 -0
- package/src/eco/eco.browser.ts +137 -0
- package/src/eco/eco.test.ts +781 -0
- package/src/eco/eco.ts +262 -0
- package/src/eco/eco.types.ts +293 -0
- package/src/eco/eco.utils.test.ts +219 -0
- package/src/eco/eco.utils.ts +5 -0
- package/src/eco/global-injector-map.test.ts +42 -0
- package/src/eco/global-injector-map.ts +112 -0
- package/src/eco/lazy-injector-map.test.ts +66 -0
- package/src/eco/lazy-injector-map.ts +120 -0
- package/src/eco/module-dependencies.test.ts +30 -0
- package/src/eco/module-dependencies.ts +75 -0
- package/src/errors/http-error.test.ts +134 -0
- package/src/errors/http-error.ts +72 -0
- package/src/errors/index.ts +3 -0
- package/src/errors/locals-access-error.ts +7 -0
- package/src/global/app-logger.ts +4 -0
- package/src/global/utils.test.ts +12 -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 +162 -0
- package/src/hmr/hmr-strategy.test.ts +124 -0
- package/src/hmr/hmr-strategy.ts +177 -0
- package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
- package/src/hmr/hmr.test.e2e.ts +66 -0
- package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
- package/src/hmr/strategies/js-hmr-strategy.test.ts +344 -0
- package/src/hmr/strategies/js-hmr-strategy.ts +307 -0
- package/src/index.browser.ts +3 -0
- package/src/index.ts +15 -0
- package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
- package/src/integrations/ghtml/ghtml-renderer.ts +87 -0
- package/src/integrations/ghtml/ghtml.constants.ts +1 -0
- package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
- package/src/plugins/alias-resolver-cache.test.ts +110 -0
- package/src/plugins/alias-resolver-cache.ts +145 -0
- package/src/plugins/alias-resolver-plugin.test.ts +41 -0
- package/src/plugins/alias-resolver-plugin.ts +75 -0
- package/src/plugins/eco-component-meta-plugin.test.ts +421 -0
- package/src/plugins/eco-component-meta-plugin.ts +518 -0
- package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
- package/src/plugins/foreign-jsx-override-plugin.ts +76 -0
- package/src/plugins/integration-plugin.test.ts +151 -0
- package/src/plugins/integration-plugin.ts +344 -0
- package/src/plugins/processor.test.ts +148 -0
- package/src/plugins/processor.ts +257 -0
- package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
- package/src/plugins/source-transform.test.ts +82 -0
- package/src/plugins/source-transform.ts +123 -0
- package/src/route-renderer/orchestration/component-render-context.ts +338 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +431 -0
- package/src/route-renderer/orchestration/integration-renderer.test.ts +2251 -0
- package/src/route-renderer/orchestration/integration-renderer.ts +1384 -0
- package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
- package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.ts +29 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +435 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +310 -0
- package/src/route-renderer/orchestration/render-output.utils.ts +310 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +1365 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +267 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.ts +879 -0
- package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
- package/src/route-renderer/orchestration/template-serialization.ts +117 -0
- package/src/route-renderer/page-loading/component-dependency-collection.ts +202 -0
- package/src/route-renderer/page-loading/declared-asset-collection.ts +153 -0
- package/src/route-renderer/page-loading/dependency-resolver.test.ts +761 -0
- package/src/route-renderer/page-loading/dependency-resolver.ts +144 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.ts +244 -0
- package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
- package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
- package/src/route-renderer/route-renderer.ts +133 -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 +453 -0
- package/src/router/server/route-registry.test.ts +176 -0
- package/src/router/server/route-registry.ts +382 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +473 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.ts +344 -0
- package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
- package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
- package/src/services/assets/asset-processing-service/assets.types.ts +128 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +98 -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/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
- package/src/services/assets/asset-processing-service/index.ts +6 -0
- package/src/services/assets/asset-processing-service/page-package.test.ts +135 -0
- package/src/services/assets/asset-processing-service/page-package.ts +103 -0
- package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
- package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
- package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
- package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +173 -0
- package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +188 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +138 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +116 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +270 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +145 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +72 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +83 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
- package/src/services/assets/browser-bundle.service.test.ts +66 -0
- package/src/services/assets/browser-bundle.service.ts +109 -0
- package/src/services/cache/cache.types.ts +126 -0
- package/src/services/cache/index.ts +18 -0
- package/src/services/cache/memory-cache-store.test.ts +225 -0
- package/src/services/cache/memory-cache-store.ts +130 -0
- package/src/services/cache/page-cache-service.test.ts +175 -0
- package/src/services/cache/page-cache-service.ts +202 -0
- package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
- package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
- package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
- package/src/services/html/html-rewriter-provider.service.ts +105 -0
- package/src/services/html/html-transformer.service.test.ts +544 -0
- package/src/services/html/html-transformer.service.ts +369 -0
- package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
- package/src/services/invalidation/development-invalidation.service.ts +262 -0
- package/src/services/module-loading/app-module-loader.service.ts +9 -0
- package/src/services/module-loading/app-server-module-transpiler.service.test.ts +297 -0
- package/src/services/module-loading/app-server-module-transpiler.service.ts +168 -0
- package/src/services/module-loading/host-module-loader-registry.ts +15 -0
- package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
- package/src/services/module-loading/page-module-import.service.test.ts +652 -0
- package/src/services/module-loading/page-module-import.service.ts +302 -0
- package/src/services/module-loading/server-module-transpiler.service.test.ts +242 -0
- package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
- package/src/services/module-loading/source-module-support.ts +19 -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/server-invalidation-state.service.ts +68 -0
- package/src/services/validation/schema-validation-service.test.ts +223 -0
- package/src/services/validation/schema-validation-service.ts +204 -0
- package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
- package/src/static-site-generator/static-site-generator.test.ts +408 -0
- package/src/static-site-generator/static-site-generator.ts +445 -0
- package/src/types/internal-types.ts +243 -0
- package/src/types/public-types.ts +1508 -0
- package/src/utils/deep-merge.test.ts +114 -0
- package/src/utils/deep-merge.ts +47 -0
- package/src/utils/hash.ts +5 -0
- package/src/utils/html-escaping.ts +9 -0
- package/src/utils/invariant.test.ts +22 -0
- package/src/utils/invariant.ts +15 -0
- package/src/utils/locals-utils.ts +37 -0
- package/src/utils/parse-cli-args.test.ts +69 -0
- package/src/utils/parse-cli-args.ts +105 -0
- package/src/utils/path-utils.module.ts +14 -0
- package/src/utils/path-utils.test.ts +15 -0
- package/src/utils/resolve-work-dir.ts +45 -0
- package/src/utils/runtime.ts +44 -0
- package/src/utils/server-utils.module.ts +67 -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 +42 -0
- package/src/watchers/project-watcher.test.ts +768 -0
- package/src/watchers/project-watcher.ts +357 -0
- package/src/adapters/abstract/application-adapter.d.ts +0 -194
- package/src/adapters/abstract/application-adapter.js +0 -121
- 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 -140
- package/src/adapters/bun/hmr-manager.d.ts +0 -47
- package/src/adapters/bun/hmr-manager.js +0 -58
- package/src/adapters/bun/index.d.ts +0 -2
- package/src/adapters/bun/index.js +0 -8
- package/src/adapters/bun/runtime-host.d.ts +0 -52
- package/src/adapters/bun/runtime-host.js +0 -56
- package/src/adapters/bun/server-adapter.d.ts +0 -216
- package/src/adapters/bun/server-adapter.js +0 -445
- package/src/adapters/bun/static-preview-host.d.ts +0 -28
- package/src/adapters/bun/static-preview-host.js +0 -45
- package/src/adapters/create-app.d.ts +0 -20
- package/src/adapters/create-app.js +0 -66
- package/src/adapters/index.d.ts +0 -2
- package/src/adapters/index.js +0 -8
- package/src/adapters/node/create-app.d.ts +0 -24
- package/src/adapters/node/create-app.js +0 -92
- package/src/adapters/node/http-request-bridge.d.ts +0 -57
- package/src/adapters/node/http-request-bridge.js +0 -118
- 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 -52
- package/src/adapters/node/node-hmr-manager.js +0 -49
- package/src/adapters/node/runtime-host.d.ts +0 -57
- package/src/adapters/node/runtime-host.js +0 -92
- package/src/adapters/node/server-adapter-dependencies.d.ts +0 -19
- package/src/adapters/node/server-adapter-dependencies.js +0 -18
- package/src/adapters/node/server-adapter.d.ts +0 -138
- package/src/adapters/node/server-adapter.js +0 -315
- package/src/adapters/node/static-content-server.d.ts +0 -60
- package/src/adapters/node/static-content-server.js +0 -194
- package/src/adapters/node/static-preview-host.d.ts +0 -55
- package/src/adapters/node/static-preview-host.js +0 -68
- 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/define-api-handler.d.ts +0 -25
- package/src/adapters/shared/define-api-handler.js +0 -15
- package/src/adapters/shared/explicit-static-render-preparation.d.ts +0 -25
- package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -41
- package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -62
- package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
- package/src/adapters/shared/fs-server-response-factory.d.ts +0 -23
- package/src/adapters/shared/fs-server-response-factory.js +0 -81
- package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -75
- package/src/adapters/shared/fs-server-response-matcher.js +0 -186
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
- package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
- package/src/adapters/shared/hmr-html-response.d.ts +0 -22
- package/src/adapters/shared/hmr-html-response.js +0 -33
- package/src/adapters/shared/render-context.d.ts +0 -16
- package/src/adapters/shared/render-context.js +0 -93
- package/src/adapters/shared/runtime-app-bootstrap.d.ts +0 -26
- package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
- package/src/adapters/shared/runtime-host.d.ts +0 -12
- package/src/adapters/shared/runtime-host.js +0 -0
- package/src/adapters/shared/server-adapter.d.ts +0 -108
- package/src/adapters/shared/server-adapter.js +0 -436
- package/src/adapters/shared/server-route-handler.d.ts +0 -89
- package/src/adapters/shared/server-route-handler.js +0 -111
- package/src/adapters/shared/server-static-builder.d.ts +0 -71
- package/src/adapters/shared/server-static-builder.js +0 -100
- package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
- package/src/adapters/shared/shared-hmr-manager.js +0 -241
- package/src/adapters/shared/static-preview-host.d.ts +0 -10
- package/src/adapters/shared/static-preview-host.js +0 -0
- package/src/build/browser-runtime-import-rewrite-plugin.d.ts +0 -26
- package/src/build/browser-runtime-import-rewrite-plugin.js +0 -165
- package/src/build/browser-runtime-manifest.d.ts +0 -31
- package/src/build/browser-runtime-manifest.js +0 -61
- package/src/build/build-adapter.d.ts +0 -247
- package/src/build/build-adapter.js +0 -671
- package/src/build/build-manifest.d.ts +0 -33
- package/src/build/build-manifest.js +0 -52
- package/src/build/build-types.d.ts +0 -57
- package/src/build/build-types.js +0 -0
- package/src/build/dev-build-coordinator.d.ts +0 -72
- package/src/build/dev-build-coordinator.js +0 -154
- package/src/build/esbuild-build-adapter.d.ts +0 -79
- package/src/build/esbuild-build-adapter.js +0 -521
- package/src/build/runtime-build-executor.d.ts +0 -14
- package/src/build/runtime-build-executor.js +0 -22
- package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
- package/src/build/runtime-specifier-alias-plugin.js +0 -31
- package/src/config/config-builder.d.ts +0 -252
- package/src/config/config-builder.js +0 -598
- package/src/config/constants.js +0 -25
- package/src/dev/host-runtime.d.ts +0 -10
- package/src/dev/host-runtime.js +0 -24
- package/src/dev/sc-server.d.ts +0 -30
- package/src/dev/sc-server.js +0 -111
- package/src/eco/eco.browser.d.ts +0 -2
- package/src/eco/eco.browser.js +0 -88
- package/src/eco/eco.d.ts +0 -9
- package/src/eco/eco.js +0 -119
- package/src/eco/eco.types.d.ts +0 -233
- package/src/eco/eco.types.js +0 -0
- package/src/eco/eco.utils.d.ts +0 -1
- package/src/eco/eco.utils.js +0 -10
- 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 -3
- package/src/errors/index.js +0 -6
- 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 -5
- package/src/hmr/client/hmr-runtime.js +0 -117
- package/src/hmr/hmr-strategy.d.ts +0 -162
- package/src/hmr/hmr-strategy.js +0 -44
- package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
- package/src/hmr/hmr.postcss.test.e2e.js +0 -31
- package/src/hmr/hmr.test.e2e.d.ts +0 -1
- package/src/hmr/hmr.test.e2e.js +0 -43
- 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 -134
- package/src/hmr/strategies/js-hmr-strategy.js +0 -173
- package/src/index.browser.d.ts +0 -3
- package/src/index.browser.js +0 -4
- package/src/index.d.ts +0 -6
- package/src/index.js +0 -21
- package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -16
- package/src/integrations/ghtml/ghtml-renderer.js +0 -57
- package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
- package/src/integrations/ghtml/ghtml.constants.js +0 -4
- package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
- package/src/integrations/ghtml/ghtml.plugin.js +0 -20
- package/src/plugins/alias-resolver-plugin.d.ts +0 -3
- package/src/plugins/alias-resolver-plugin.js +0 -61
- package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
- package/src/plugins/eco-component-meta-plugin.js +0 -175
- package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -33
- package/src/plugins/foreign-jsx-override-plugin.js +0 -41
- package/src/plugins/integration-plugin.d.ts +0 -230
- package/src/plugins/integration-plugin.js +0 -201
- package/src/plugins/processor.d.ts +0 -97
- package/src/plugins/processor.js +0 -141
- package/src/plugins/runtime-capability.js +0 -0
- package/src/plugins/source-transform.d.ts +0 -46
- package/src/plugins/source-transform.js +0 -71
- package/src/route-renderer/orchestration/component-render-context.d.ts +0 -97
- package/src/route-renderer/orchestration/component-render-context.js +0 -147
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
- package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +0 -110
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
- package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -534
- package/src/route-renderer/orchestration/integration-renderer.js +0 -991
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
- package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +0 -29
- package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
- package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +0 -3
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
- package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -66
- package/src/route-renderer/orchestration/render-output.utils.js +0 -171
- package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +0 -156
- package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
- package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
- package/src/route-renderer/orchestration/template-serialization.js +0 -45
- package/src/route-renderer/page-loading/component-dependency-collection.d.ts +0 -37
- package/src/route-renderer/page-loading/component-dependency-collection.js +0 -132
- package/src/route-renderer/page-loading/declared-asset-collection.d.ts +0 -24
- package/src/route-renderer/page-loading/declared-asset-collection.js +0 -106
- package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
- package/src/route-renderer/page-loading/dependency-resolver.js +0 -115
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +0 -11
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +0 -57
- package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +0 -45
- package/src/route-renderer/page-loading/lazy-entry-collection.js +0 -105
- package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +0 -19
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +0 -40
- package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +0 -5
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +0 -33
- package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +0 -3
- package/src/route-renderer/page-loading/module-declaration-scripts.js +0 -18
- package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +0 -13
- package/src/route-renderer/page-loading/page-dependency-bundling.js +0 -137
- package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
- package/src/route-renderer/page-loading/page-module-loader.js +0 -127
- package/src/route-renderer/route-renderer.d.ts +0 -69
- package/src/route-renderer/route-renderer.js +0 -80
- package/src/router/client/link-intent.js +0 -34
- package/src/router/client/link-intent.test.browser.d.ts +0 -1
- package/src/router/client/link-intent.test.browser.js +0 -43
- package/src/router/client/navigation-coordinator.d.ts +0 -169
- package/src/router/client/navigation-coordinator.js +0 -215
- package/src/router/server/route-registry.d.ts +0 -78
- package/src/router/server/route-registry.js +0 -262
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +0 -3
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +0 -56
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -103
- package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -285
- package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
- package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
- package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -103
- package/src/services/assets/asset-processing-service/assets.types.js +0 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -57
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -49
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
- package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +0 -30
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +0 -65
- package/src/services/assets/asset-processing-service/index.d.ts +0 -6
- package/src/services/assets/asset-processing-service/index.js +0 -6
- package/src/services/assets/asset-processing-service/page-package.d.ts +0 -6
- package/src/services/assets/asset-processing-service/page-package.js +0 -80
- package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
- package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
- package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
- package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -65
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -22
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -136
- package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/assets/asset-processing-service/processors/index.js +0 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -6
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -120
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -97
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -42
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -126
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -8
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -59
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -69
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -18
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +0 -45
- package/src/services/assets/browser-bundle.service.d.ts +0 -73
- package/src/services/assets/browser-bundle.service.js +0 -41
- 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/cache/page-request-cache-coordinator.service.d.ts +0 -75
- package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
- package/src/services/html/html-rewriter-provider.service.d.ts +0 -40
- package/src/services/html/html-rewriter-provider.service.js +0 -68
- package/src/services/html/html-transformer.service.d.ts +0 -96
- package/src/services/html/html-transformer.service.js +0 -287
- package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
- package/src/services/invalidation/development-invalidation.service.js +0 -190
- package/src/services/module-loading/app-module-loader.service.d.ts +0 -7
- package/src/services/module-loading/app-module-loader.service.js +0 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
- package/src/services/module-loading/app-server-module-transpiler.service.js +0 -151
- package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
- package/src/services/module-loading/host-module-loader-registry.js +0 -15
- package/src/services/module-loading/module-loading-types.js +0 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -38
- package/src/services/module-loading/node-bootstrap-plugin.js +0 -215
- package/src/services/module-loading/page-module-import.service.d.ts +0 -95
- package/src/services/module-loading/page-module-import.service.js +0 -191
- package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -63
- package/src/services/module-loading/server-module-transpiler.service.js +0 -64
- package/src/services/module-loading/source-module-support.d.ts +0 -5
- package/src/services/module-loading/source-module-support.js +0 -8
- package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
- package/src/services/runtime-state/dev-graph.service.js +0 -162
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
- package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
- package/src/services/validation/schema-validation-service.d.ts +0 -122
- package/src/services/validation/schema-validation-service.js +0 -101
- package/src/services/validation/standard-schema.types.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +0 -104
- package/src/static-site-generator/static-site-generator.js +0 -316
- package/src/types/internal-types.d.ts +0 -232
- package/src/types/internal-types.js +0 -0
- package/src/types/public-types.d.ts +0 -1307
- package/src/types/public-types.js +0 -0
- 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-escaping.d.ts +0 -7
- package/src/utils/html-escaping.js +0 -6
- 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 -27
- package/src/utils/parse-cli-args.js +0 -62
- package/src/utils/path-utils.module.d.ts +0 -5
- package/src/utils/path-utils.module.js +0 -14
- package/src/utils/resolve-work-dir.d.ts +0 -11
- package/src/utils/resolve-work-dir.js +0 -31
- 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 -136
- package/src/watchers/project-watcher.js +0 -275
- package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
- package/src/watchers/project-watcher.test-helpers.js +0 -52
- /package/src/utils/{html.d.ts → html.ts} +0 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import type { ClientBridgeEvent } from '../types/public-types.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* HMR Strategy Pattern
|
|
5
|
+
*
|
|
6
|
+
* This module defines the base classes and types for Hot Module Replacement strategies.
|
|
7
|
+
* Each strategy handles a specific type of file change and determines how to process it.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* class CustomHmrStrategy extends HmrStrategy {
|
|
13
|
+
* readonly type = HmrStrategyType.INTEGRATION;
|
|
14
|
+
*
|
|
15
|
+
* matches(filePath: string): boolean {
|
|
16
|
+
* return filePath.endsWith('.custom');
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* async process(filePath: string): Promise<HmrAction> {
|
|
20
|
+
* return {
|
|
21
|
+
* type: 'broadcast',
|
|
22
|
+
* events: [{ type: 'update', path: filePath, timestamp: Date.now() }],
|
|
23
|
+
* };
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Defines the category of an HMR strategy, which determines its execution priority.
|
|
31
|
+
* Strategies are evaluated in descending order: INTEGRATION → ASSET → SCRIPT → FALLBACK.
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* The numeric values represent base priorities. Strategies can fine-tune their priority
|
|
35
|
+
* using the `priorityOffset` property.
|
|
36
|
+
*/
|
|
37
|
+
export const HmrStrategyType = {
|
|
38
|
+
/**
|
|
39
|
+
* Integration-specific strategies (React, Lit, etc.)
|
|
40
|
+
* Highest priority to allow framework-specific HMR handling.
|
|
41
|
+
*/
|
|
42
|
+
INTEGRATION: 100,
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Asset processing strategies (CSS, images, etc.)
|
|
46
|
+
* High priority for specialized asset handling.
|
|
47
|
+
*/
|
|
48
|
+
ASSET: 50,
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Generic script bundling strategies (JS/TS)
|
|
52
|
+
* Medium priority for standard script processing.
|
|
53
|
+
*/
|
|
54
|
+
SCRIPT: 25,
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Fallback strategy for unhandled file types.
|
|
58
|
+
* Lowest priority, triggers full page reload.
|
|
59
|
+
*/
|
|
60
|
+
FALLBACK: 0,
|
|
61
|
+
} as const;
|
|
62
|
+
|
|
63
|
+
export type HmrStrategyType = (typeof HmrStrategyType)[keyof typeof HmrStrategyType];
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Represents an action to be taken after processing a file change.
|
|
67
|
+
*/
|
|
68
|
+
export interface HmrAction {
|
|
69
|
+
/**
|
|
70
|
+
* Whether to broadcast an HMR event to connected clients.
|
|
71
|
+
*/
|
|
72
|
+
type: 'broadcast' | 'none';
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The HMR events to broadcast, if type is 'broadcast'.
|
|
76
|
+
* Multiple events may be broadcast in one action.
|
|
77
|
+
*/
|
|
78
|
+
events?: ClientBridgeEvent[];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Base class for HMR strategies.
|
|
83
|
+
*
|
|
84
|
+
* Each strategy handles a specific type of file change and determines how to process it.
|
|
85
|
+
* Strategies are selected based on their priority (higher values are evaluated first) and
|
|
86
|
+
* whether they match the changed file path.
|
|
87
|
+
*
|
|
88
|
+
* @remarks
|
|
89
|
+
* Strategies are expected to be stateless and idempotent. The same file change
|
|
90
|
+
* should produce the same result when processed by the same strategy.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* class MyAssetStrategy extends HmrStrategy {
|
|
95
|
+
* readonly type = HmrStrategyType.ASSET;
|
|
96
|
+
* readonly priorityOffset = 5;
|
|
97
|
+
*
|
|
98
|
+
* matches(filePath: string): boolean {
|
|
99
|
+
* return /\.(png|jpg|svg)$/.test(filePath);
|
|
100
|
+
* }
|
|
101
|
+
*
|
|
102
|
+
* async process(filePath: string): Promise<HmrAction> {
|
|
103
|
+
* await this.optimizeImage(filePath);
|
|
104
|
+
* return {
|
|
105
|
+
* type: 'broadcast',
|
|
106
|
+
* events: [{ type: 'update', path: filePath, timestamp: Date.now() }]
|
|
107
|
+
* };
|
|
108
|
+
* }
|
|
109
|
+
* }
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export abstract class HmrStrategy {
|
|
113
|
+
/**
|
|
114
|
+
* The category of this strategy, determining its base priority.
|
|
115
|
+
*/
|
|
116
|
+
abstract readonly type: HmrStrategyType;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Optional offset to fine-tune priority within the same category.
|
|
120
|
+
* Useful when multiple strategies share the same type.
|
|
121
|
+
*
|
|
122
|
+
* @defaultValue 0
|
|
123
|
+
*/
|
|
124
|
+
readonly priorityOffset: number = 0;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Computed priority for strategy selection.
|
|
128
|
+
* Higher values are evaluated first.
|
|
129
|
+
*
|
|
130
|
+
* @returns The sum of the strategy type and priority offset
|
|
131
|
+
*/
|
|
132
|
+
get priority(): number {
|
|
133
|
+
return this.type + this.priorityOffset;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Determines if this strategy can handle the given file path.
|
|
138
|
+
*
|
|
139
|
+
* @param filePath - Absolute path to the changed file
|
|
140
|
+
* @returns `true` when this strategy should process the file
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* matches(filePath: string): boolean {
|
|
145
|
+
* return filePath.endsWith('.css');
|
|
146
|
+
* }
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
abstract matches(filePath: string): boolean;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Processes a file change and returns the action to take.
|
|
153
|
+
*
|
|
154
|
+
* This method may perform side effects such as:
|
|
155
|
+
* - Rebuilding files
|
|
156
|
+
* - Writing to disk
|
|
157
|
+
* - Transforming code
|
|
158
|
+
* - Updating caches
|
|
159
|
+
*
|
|
160
|
+
* @param filePath - Absolute path to the changed file
|
|
161
|
+
* @returns Action to take (broadcast event or none)
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* async process(filePath: string): Promise<HmrAction> {
|
|
166
|
+
* const processed = await this.transform(filePath);
|
|
167
|
+
* await Bun.write(outputPath, processed);
|
|
168
|
+
*
|
|
169
|
+
* return {
|
|
170
|
+
* type: 'broadcast',
|
|
171
|
+
* events: [{ type: 'update', path: outputPath, timestamp: Date.now() }]
|
|
172
|
+
* };
|
|
173
|
+
* }
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
abstract process(filePath: string): Promise<HmrAction>;
|
|
177
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { writeFile } from 'node:fs/promises';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
|
|
6
|
+
const FIXTURE_DIR = resolve(process.cwd(), 'packages/core/__fixtures__/app');
|
|
7
|
+
const TEST_CSS_FILE = resolve(FIXTURE_DIR, 'src/pages/postcss-hmr.css');
|
|
8
|
+
|
|
9
|
+
test.describe('HMR E2E PostCSS', () => {
|
|
10
|
+
test('should hot-update processor-owned CSS without a full page reload', async ({ page }) => {
|
|
11
|
+
const originalCss = readFileSync(TEST_CSS_FILE, 'utf-8');
|
|
12
|
+
const title = page.locator('.postcss-title').first();
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
await page.goto('/postcss-hmr', { waitUntil: 'networkidle' });
|
|
16
|
+
await expect(title).toBeVisible();
|
|
17
|
+
|
|
18
|
+
const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
|
|
19
|
+
expect(initialColor).toBeTruthy();
|
|
20
|
+
await page.evaluate(() => {
|
|
21
|
+
(window as typeof window & { __postcssReloadProbe?: string }).__postcssReloadProbe = 'before-change';
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const modifiedCss = originalCss.replace('.postcss-title {', '.postcss-title {\n\tcolor: rgb(255, 0, 0);');
|
|
25
|
+
|
|
26
|
+
await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
|
|
27
|
+
|
|
28
|
+
await expect
|
|
29
|
+
.poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 10000 })
|
|
30
|
+
.toBe('rgb(255, 0, 0)');
|
|
31
|
+
|
|
32
|
+
await expect(
|
|
33
|
+
page.evaluate(
|
|
34
|
+
() => (window as typeof window & { __postcssReloadProbe?: string }).__postcssReloadProbe ?? null,
|
|
35
|
+
),
|
|
36
|
+
).resolves.toBe('before-change');
|
|
37
|
+
} finally {
|
|
38
|
+
await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { writeFile } from 'node:fs/promises';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* HMR E2E Tests
|
|
8
|
+
*
|
|
9
|
+
* True end-to-end tests for Hot Module Replacement using Playwright.
|
|
10
|
+
* These tests modify actual source files and verify the browser updates.
|
|
11
|
+
*
|
|
12
|
+
* Run with: bunx playwright test packages/core/src/hmr/hmr.e2e.test.ts
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const FIXTURE_DIR = resolve(process.cwd(), 'packages/core/__fixtures__/app');
|
|
16
|
+
const TEST_CSS_FILE = resolve(FIXTURE_DIR, 'src/pages/index.css');
|
|
17
|
+
|
|
18
|
+
test.describe('HMR E2E', () => {
|
|
19
|
+
test('should load page with .main-title element', async ({ page }) => {
|
|
20
|
+
await page.goto('/', { waitUntil: 'networkidle' });
|
|
21
|
+
const title = page.locator('.main-title').first();
|
|
22
|
+
await expect(title).toBeVisible();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('should connect to HMR WebSocket', async ({ page }) => {
|
|
26
|
+
const socketPromise = page.waitForEvent('websocket', {
|
|
27
|
+
predicate: (socket) => socket.url().endsWith('/_hmr'),
|
|
28
|
+
timeout: 10000,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
await page.goto('/', { waitUntil: 'networkidle' });
|
|
32
|
+
const socket = await socketPromise;
|
|
33
|
+
|
|
34
|
+
expect(socket.url()).toMatch(/\/_hmr$/);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('should fall back to a full page reload when raw CSS file changes', async ({ page }) => {
|
|
38
|
+
const originalCss = readFileSync(TEST_CSS_FILE, 'utf-8');
|
|
39
|
+
const title = page.locator('.main-title').first();
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
await page.goto('/', { waitUntil: 'networkidle' });
|
|
43
|
+
await expect(title).toBeVisible();
|
|
44
|
+
|
|
45
|
+
const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
|
|
46
|
+
expect(initialColor).toBeTruthy();
|
|
47
|
+
|
|
48
|
+
const modifiedCss = originalCss.replace('.main-title {', '.main-title {\n\tcolor: rgb(255, 0, 0);');
|
|
49
|
+
const reloadPromise = page.waitForEvent('framenavigated', {
|
|
50
|
+
predicate: (frame) => frame === page.mainFrame(),
|
|
51
|
+
timeout: 10000,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
|
|
55
|
+
|
|
56
|
+
await reloadPromise;
|
|
57
|
+
await page.waitForLoadState('networkidle');
|
|
58
|
+
|
|
59
|
+
await expect
|
|
60
|
+
.poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 10000 })
|
|
61
|
+
.toBe('rgb(255, 0, 0)');
|
|
62
|
+
} finally {
|
|
63
|
+
await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default HMR Strategy
|
|
3
|
+
*
|
|
4
|
+
* Fallback strategy for file types that don't have specialized handling.
|
|
5
|
+
* Triggers a full page reload to ensure changes are reflected.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy.ts';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Default fallback strategy for unhandled file types.
|
|
14
|
+
*
|
|
15
|
+
* This strategy matches all files and triggers a full page reload.
|
|
16
|
+
* It has the lowest priority (FALLBACK) and acts as a catch-all when
|
|
17
|
+
* no other strategy matches the changed file.
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* This strategy ensures that all file changes result in some action,
|
|
21
|
+
* even if we don't have specialized handling for that file type.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const strategy = new DefaultHmrStrategy();
|
|
26
|
+
* const action = await strategy.process('/path/to/unknown.file');
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export class DefaultHmrStrategy extends HmrStrategy {
|
|
30
|
+
readonly type = HmrStrategyType.FALLBACK;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Matches all file paths.
|
|
34
|
+
*
|
|
35
|
+
* @param _filePath - Absolute path to the changed file (unused)
|
|
36
|
+
* @returns Always returns true as this is a catch-all strategy
|
|
37
|
+
*/
|
|
38
|
+
matches(_filePath: string): boolean {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Processes a file change by triggering a full page reload.
|
|
44
|
+
*
|
|
45
|
+
* @param filePath - Absolute path to the changed file
|
|
46
|
+
* @returns Action to broadcast a reload event
|
|
47
|
+
*/
|
|
48
|
+
async process(filePath: string): Promise<HmrAction> {
|
|
49
|
+
return {
|
|
50
|
+
type: 'broadcast',
|
|
51
|
+
events: [
|
|
52
|
+
{
|
|
53
|
+
type: 'reload',
|
|
54
|
+
path: filePath,
|
|
55
|
+
message: 'fallback-strategy',
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { describe, expect, it, beforeAll, afterAll } from 'vitest';
|
|
2
|
+
import { JsHmrStrategy, type JsHmrContext } from './js-hmr-strategy';
|
|
3
|
+
import { HmrStrategyType } from '../hmr-strategy';
|
|
4
|
+
import { InMemoryDevGraphService, NoopDevGraphService } from '../../services/runtime-state/dev-graph.service.ts';
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
|
|
9
|
+
const TMP_DIR = path.join(os.tmpdir(), 'js-hmr-strategy-test');
|
|
10
|
+
const SRC_DIR = path.join(TMP_DIR, 'src');
|
|
11
|
+
|
|
12
|
+
function createMockContext(overrides: Partial<JsHmrContext> = {}): JsHmrContext {
|
|
13
|
+
return {
|
|
14
|
+
getWatchedFiles: () => new Map(),
|
|
15
|
+
getEntrypointDependencyGraph: () => new NoopDevGraphService(),
|
|
16
|
+
getDistDir: () => TMP_DIR,
|
|
17
|
+
getPlugins: () => [],
|
|
18
|
+
getSrcDir: () => SRC_DIR,
|
|
19
|
+
getPagesDir: () => path.join(SRC_DIR, 'pages'),
|
|
20
|
+
getLayoutsDir: () => path.join(SRC_DIR, 'layouts'),
|
|
21
|
+
getTemplateExtensions: () => ['.kita.tsx', '.react.tsx'],
|
|
22
|
+
getBrowserBundleService: () => ({
|
|
23
|
+
bundle: async () => ({ success: true, logs: [], outputs: [] }),
|
|
24
|
+
}),
|
|
25
|
+
...overrides,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe('JsHmrStrategy', () => {
|
|
30
|
+
beforeAll(() => {
|
|
31
|
+
fs.mkdirSync(SRC_DIR, { recursive: true });
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
afterAll(() => {
|
|
35
|
+
fs.rmSync(TMP_DIR, { recursive: true, force: true });
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe('type', () => {
|
|
39
|
+
it('has SCRIPT type', () => {
|
|
40
|
+
const context = createMockContext();
|
|
41
|
+
const strategy = new JsHmrStrategy(context);
|
|
42
|
+
expect(strategy.type).toBe(HmrStrategyType.SCRIPT);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('has default priority of 25', () => {
|
|
46
|
+
const context = createMockContext();
|
|
47
|
+
const strategy = new JsHmrStrategy(context);
|
|
48
|
+
expect(strategy.priority).toBe(25);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('matches', () => {
|
|
53
|
+
it('returns false when no watched files are registered', () => {
|
|
54
|
+
const context = createMockContext({
|
|
55
|
+
getWatchedFiles: () => new Map(),
|
|
56
|
+
});
|
|
57
|
+
const strategy = new JsHmrStrategy(context);
|
|
58
|
+
|
|
59
|
+
expect(strategy.matches(path.join(SRC_DIR, 'app.ts'))).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('returns true for unrelated .ts files when watched entrypoints exist', () => {
|
|
63
|
+
const devGraphService = new InMemoryDevGraphService();
|
|
64
|
+
const context = createMockContext({
|
|
65
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
66
|
+
getEntrypointDependencyGraph: () => devGraphService,
|
|
67
|
+
});
|
|
68
|
+
const strategy = new JsHmrStrategy(context);
|
|
69
|
+
|
|
70
|
+
expect(strategy.matches(path.join(SRC_DIR, 'component.ts'))).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('returns true for dependency-connected .tsx files in src directory', () => {
|
|
74
|
+
const changedFile = path.join(SRC_DIR, 'component.tsx');
|
|
75
|
+
const devGraphService = new InMemoryDevGraphService();
|
|
76
|
+
devGraphService.setEntrypointDependencies(path.join(SRC_DIR, 'entry.ts'), [changedFile]);
|
|
77
|
+
const context = createMockContext({
|
|
78
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
79
|
+
getEntrypointDependencyGraph: () => devGraphService,
|
|
80
|
+
});
|
|
81
|
+
const strategy = new JsHmrStrategy(context);
|
|
82
|
+
|
|
83
|
+
expect(strategy.matches(changedFile)).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('returns true for registered entrypoints even without dependency graph hits', () => {
|
|
87
|
+
const entrypoint = path.join(SRC_DIR, 'entry.tsx');
|
|
88
|
+
const devGraphService = new InMemoryDevGraphService();
|
|
89
|
+
const context = createMockContext({
|
|
90
|
+
getWatchedFiles: () => new Map([[entrypoint, '/output.js']]),
|
|
91
|
+
getEntrypointDependencyGraph: () => devGraphService,
|
|
92
|
+
});
|
|
93
|
+
const strategy = new JsHmrStrategy(context);
|
|
94
|
+
|
|
95
|
+
expect(strategy.matches(entrypoint)).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('returns true for .js files in src directory', () => {
|
|
99
|
+
const context = createMockContext({
|
|
100
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
101
|
+
});
|
|
102
|
+
const strategy = new JsHmrStrategy(context);
|
|
103
|
+
|
|
104
|
+
expect(strategy.matches(path.join(SRC_DIR, 'utils.js'))).toBe(true);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('returns true for .jsx files in src directory', () => {
|
|
108
|
+
const context = createMockContext({
|
|
109
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
110
|
+
});
|
|
111
|
+
const strategy = new JsHmrStrategy(context);
|
|
112
|
+
|
|
113
|
+
expect(strategy.matches(path.join(SRC_DIR, 'component.jsx'))).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('returns false for .css files', () => {
|
|
117
|
+
const context = createMockContext({
|
|
118
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
119
|
+
});
|
|
120
|
+
const strategy = new JsHmrStrategy(context);
|
|
121
|
+
|
|
122
|
+
expect(strategy.matches(path.join(SRC_DIR, 'styles.css'))).toBe(false);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('returns false for files outside src directory', () => {
|
|
126
|
+
const context = createMockContext({
|
|
127
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
128
|
+
});
|
|
129
|
+
const strategy = new JsHmrStrategy(context);
|
|
130
|
+
|
|
131
|
+
expect(strategy.matches('/other/path/file.ts')).toBe(false);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('returns false for integration-owned route template files', () => {
|
|
135
|
+
const pagesDir = path.join(SRC_DIR, 'pages');
|
|
136
|
+
const context = createMockContext({
|
|
137
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
138
|
+
getPagesDir: () => pagesDir,
|
|
139
|
+
getTemplateExtensions: () => ['.kita.tsx', '.react.tsx'],
|
|
140
|
+
});
|
|
141
|
+
const strategy = new JsHmrStrategy(context);
|
|
142
|
+
|
|
143
|
+
expect(strategy.matches(path.join(pagesDir, 'index.kita.tsx'))).toBe(false);
|
|
144
|
+
expect(strategy.matches(path.join(pagesDir, 'home.react.tsx'))).toBe(false);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('returns false for integration-owned server templates outside pages and layouts', () => {
|
|
148
|
+
const context = createMockContext({
|
|
149
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
150
|
+
getTemplateExtensions: () => ['.kita.tsx', '.react.tsx'],
|
|
151
|
+
});
|
|
152
|
+
const strategy = new JsHmrStrategy(context);
|
|
153
|
+
|
|
154
|
+
expect(strategy.matches(path.join(SRC_DIR, 'views', 'explicit-team-view.kita.tsx'))).toBe(false);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('returns false for non-extension matches', () => {
|
|
158
|
+
const context = createMockContext({
|
|
159
|
+
getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
|
|
160
|
+
});
|
|
161
|
+
const strategy = new JsHmrStrategy(context);
|
|
162
|
+
|
|
163
|
+
expect(strategy.matches(path.join(SRC_DIR, 'data.json'))).toBe(false);
|
|
164
|
+
expect(strategy.matches(path.join(SRC_DIR, 'readme.md'))).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
describe('process', () => {
|
|
169
|
+
it('returns none when no watched files are registered', async () => {
|
|
170
|
+
const context = createMockContext({
|
|
171
|
+
getWatchedFiles: () => new Map(),
|
|
172
|
+
});
|
|
173
|
+
const strategy = new JsHmrStrategy(context);
|
|
174
|
+
|
|
175
|
+
const action = await strategy.process(path.join(SRC_DIR, 'app.ts'));
|
|
176
|
+
|
|
177
|
+
expect(action.type).toBe('none');
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('rebuilds only dependency-connected entrypoints when graph hit exists', async () => {
|
|
181
|
+
const entryA = path.join(SRC_DIR, 'entry-a.ts');
|
|
182
|
+
const entryB = path.join(SRC_DIR, 'entry-b.ts');
|
|
183
|
+
const depA = path.join(SRC_DIR, 'shared-a.ts');
|
|
184
|
+
const setEntrypointDependenciesCalls: Array<{ entrypointPath: string; dependencies: string[] }> = [];
|
|
185
|
+
let batchedEntrypoints: string[] = [];
|
|
186
|
+
const devGraphService = new InMemoryDevGraphService();
|
|
187
|
+
devGraphService.setEntrypointDependencies(entryA, [depA]);
|
|
188
|
+
devGraphService.setEntrypointDependencies(entryB, [entryB]);
|
|
189
|
+
|
|
190
|
+
const context = createMockContext({
|
|
191
|
+
getWatchedFiles: () =>
|
|
192
|
+
new Map([
|
|
193
|
+
[entryA, '/_hmr/entry-a.js'],
|
|
194
|
+
[entryB, '/_hmr/entry-b.js'],
|
|
195
|
+
]),
|
|
196
|
+
getEntrypointDependencyGraph: () => ({
|
|
197
|
+
supportsSelectiveInvalidation: () => devGraphService.supportsSelectiveInvalidation(),
|
|
198
|
+
getDependencyEntrypoints: (filePath: string) => devGraphService.getDependencyEntrypoints(filePath),
|
|
199
|
+
setEntrypointDependencies: (entrypointPath: string, dependencies: string[]) => {
|
|
200
|
+
setEntrypointDependenciesCalls.push({ entrypointPath, dependencies });
|
|
201
|
+
devGraphService.setEntrypointDependencies(entrypointPath, dependencies);
|
|
202
|
+
},
|
|
203
|
+
clearEntrypointDependencies: (entrypointPath: string) =>
|
|
204
|
+
devGraphService.clearEntrypointDependencies(entrypointPath),
|
|
205
|
+
reset: () => devGraphService.reset(),
|
|
206
|
+
}),
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
const strategy = new JsHmrStrategy(context) as unknown as {
|
|
210
|
+
process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
|
|
211
|
+
[key: string]: unknown;
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
strategy.bundleEntrypoints = async (entrypoints: string[]) => {
|
|
215
|
+
batchedEntrypoints = entrypoints;
|
|
216
|
+
const dependencies = new Map<string, string[]>();
|
|
217
|
+
for (const ep of entrypoints) {
|
|
218
|
+
dependencies.set(path.resolve(ep), [ep, depA]);
|
|
219
|
+
}
|
|
220
|
+
return { success: true, dependencies };
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
strategy.processOutput = async () => {
|
|
224
|
+
return { success: true, requiresReload: false };
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
const action = await strategy.process(depA);
|
|
228
|
+
|
|
229
|
+
expect(batchedEntrypoints).toEqual([entryA]);
|
|
230
|
+
expect(setEntrypointDependenciesCalls).toEqual([{ entrypointPath: entryA, dependencies: [entryA, depA] }]);
|
|
231
|
+
expect(action).toEqual({
|
|
232
|
+
type: 'broadcast',
|
|
233
|
+
events: [
|
|
234
|
+
{
|
|
235
|
+
type: 'update',
|
|
236
|
+
path: '/_hmr/entry-a.js',
|
|
237
|
+
timestamp: expect.any(Number),
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
it('falls back to rebuilding all watched entrypoints when graph has no hit', async () => {
|
|
244
|
+
const entryA = path.join(SRC_DIR, 'entry-a.ts');
|
|
245
|
+
const entryB = path.join(SRC_DIR, 'entry-b.ts');
|
|
246
|
+
const changedFile = path.join(SRC_DIR, 'new-shared.ts');
|
|
247
|
+
let batchedEntrypoints: string[] = [];
|
|
248
|
+
|
|
249
|
+
const context = createMockContext({
|
|
250
|
+
getWatchedFiles: () =>
|
|
251
|
+
new Map([
|
|
252
|
+
[entryA, '/_hmr/entry-a.js'],
|
|
253
|
+
[entryB, '/_hmr/entry-b.js'],
|
|
254
|
+
]),
|
|
255
|
+
getEntrypointDependencyGraph: () => new NoopDevGraphService(),
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
const strategy = new JsHmrStrategy(context) as unknown as {
|
|
259
|
+
process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
|
|
260
|
+
[key: string]: unknown;
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
strategy.bundleEntrypoints = async (entrypoints: string[]) => {
|
|
264
|
+
batchedEntrypoints = entrypoints;
|
|
265
|
+
const dependencies = new Map<string, string[]>();
|
|
266
|
+
for (const ep of entrypoints) {
|
|
267
|
+
dependencies.set(path.resolve(ep), [ep]);
|
|
268
|
+
}
|
|
269
|
+
return { success: true, dependencies };
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
strategy.processOutput = async () => {
|
|
273
|
+
return { success: true, requiresReload: false };
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
const action = await strategy.process(changedFile);
|
|
277
|
+
|
|
278
|
+
expect(batchedEntrypoints).toEqual([entryA, entryB]);
|
|
279
|
+
expect(action).toEqual({
|
|
280
|
+
type: 'broadcast',
|
|
281
|
+
events: [
|
|
282
|
+
{
|
|
283
|
+
type: 'update',
|
|
284
|
+
path: '/_hmr/entry-a.js',
|
|
285
|
+
timestamp: expect.any(Number),
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
type: 'update',
|
|
289
|
+
path: '/_hmr/entry-b.js',
|
|
290
|
+
timestamp: expect.any(Number),
|
|
291
|
+
},
|
|
292
|
+
],
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('skips watched entrypoints owned by higher-priority integration strategies', async () => {
|
|
297
|
+
const reactEntrypoint = path.join(SRC_DIR, 'react-page.tsx');
|
|
298
|
+
const scriptEntrypoint = path.join(SRC_DIR, 'widget.script.ts');
|
|
299
|
+
const changedFile = path.join(SRC_DIR, 'shared.ts');
|
|
300
|
+
let batchedEntrypoints: string[] = [];
|
|
301
|
+
const devGraphService = new InMemoryDevGraphService();
|
|
302
|
+
devGraphService.setEntrypointDependencies(reactEntrypoint, [changedFile]);
|
|
303
|
+
devGraphService.setEntrypointDependencies(scriptEntrypoint, [changedFile]);
|
|
304
|
+
|
|
305
|
+
const context = createMockContext({
|
|
306
|
+
getWatchedFiles: () =>
|
|
307
|
+
new Map([
|
|
308
|
+
[reactEntrypoint, '/_hmr/react-page.js'],
|
|
309
|
+
[scriptEntrypoint, '/_hmr/widget.script.js'],
|
|
310
|
+
]),
|
|
311
|
+
getEntrypointDependencyGraph: () => devGraphService,
|
|
312
|
+
shouldProcessEntrypoint: (entrypointPath: string) => entrypointPath !== reactEntrypoint,
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
const strategy = new JsHmrStrategy(context) as unknown as {
|
|
316
|
+
process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
|
|
317
|
+
[key: string]: unknown;
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
strategy.bundleEntrypoints = async (entrypoints: string[]) => {
|
|
321
|
+
batchedEntrypoints = entrypoints;
|
|
322
|
+
return { success: true, dependencies: new Map([[path.resolve(scriptEntrypoint), [scriptEntrypoint]]]) };
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
strategy.processOutput = async () => {
|
|
326
|
+
return { success: true, requiresReload: false };
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
const action = await strategy.process(changedFile);
|
|
330
|
+
|
|
331
|
+
expect(batchedEntrypoints).toEqual([scriptEntrypoint]);
|
|
332
|
+
expect(action).toEqual({
|
|
333
|
+
type: 'broadcast',
|
|
334
|
+
events: [
|
|
335
|
+
{
|
|
336
|
+
type: 'update',
|
|
337
|
+
path: '/_hmr/widget.script.js',
|
|
338
|
+
timestamp: expect.any(Number),
|
|
339
|
+
},
|
|
340
|
+
],
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
});
|