@ecopages/core 0.2.0-alpha.5 → 0.2.0-alpha.50
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 +268 -14
- package/package.json +92 -110
- package/src/adapters/README.md +39 -0
- package/src/adapters/abstract/application-adapter.d.ts +28 -2
- package/src/adapters/abstract/application-adapter.js +14 -2
- package/src/adapters/abstract/router-adapter.d.ts +1 -1
- package/src/adapters/abstract/server-adapter.d.ts +2 -2
- package/src/adapters/bun/client-bridge.d.ts +1 -1
- package/src/adapters/bun/create-app.d.ts +12 -12
- package/src/adapters/bun/create-app.js +64 -41
- package/src/adapters/bun/hmr-manager.d.ts +30 -62
- package/src/adapters/bun/hmr-manager.js +30 -194
- package/src/adapters/bun/index.d.ts +2 -3
- package/src/adapters/bun/index.js +3 -3
- package/src/adapters/bun/runtime-host.d.ts +52 -0
- package/src/adapters/bun/runtime-host.js +56 -0
- package/src/adapters/bun/server-adapter.d.ts +93 -32
- package/src/adapters/bun/server-adapter.js +166 -89
- package/src/adapters/bun/static-preview-host.d.ts +28 -0
- package/src/adapters/bun/static-preview-host.js +45 -0
- package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
- package/src/{create-app.js → adapters/create-app.js} +4 -4
- package/src/adapters/index.d.ts +2 -6
- package/src/adapters/index.js +2 -8
- package/src/adapters/node/create-app.d.ts +15 -12
- package/src/adapters/node/create-app.js +34 -85
- package/src/adapters/node/http-request-bridge.d.ts +57 -0
- package/src/adapters/node/http-request-bridge.js +118 -0
- package/src/adapters/node/node-client-bridge.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.d.ts +38 -48
- package/src/adapters/node/node-hmr-manager.js +31 -203
- package/src/adapters/node/runtime-host.d.ts +57 -0
- package/src/adapters/node/runtime-host.js +92 -0
- package/src/adapters/node/server-adapter-dependencies.d.ts +19 -0
- package/src/adapters/node/server-adapter-dependencies.js +18 -0
- package/src/adapters/node/server-adapter.d.ts +20 -72
- package/src/adapters/node/server-adapter.js +99 -203
- package/src/adapters/node/static-content-server.d.ts +37 -1
- package/src/adapters/node/static-content-server.js +29 -1
- package/src/adapters/node/static-preview-host.d.ts +55 -0
- package/src/adapters/node/static-preview-host.js +68 -0
- package/src/adapters/shared/application-adapter.d.ts +1 -1
- package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
- package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
- package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
- package/src/adapters/shared/explicit-static-route-matcher.js +14 -13
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
- package/src/adapters/shared/file-route-middleware-pipeline.js +3 -11
- package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
- package/src/adapters/shared/fs-server-response-factory.js +11 -27
- package/src/adapters/shared/fs-server-response-matcher.d.ts +20 -16
- package/src/adapters/shared/fs-server-response-matcher.js +76 -45
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
- package/src/adapters/shared/hmr-html-response.d.ts +22 -0
- package/src/adapters/shared/hmr-html-response.js +33 -0
- package/src/adapters/shared/render-context.d.ts +5 -3
- package/src/adapters/shared/render-context.js +27 -3
- package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
- package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
- package/src/adapters/shared/runtime-host.d.ts +12 -0
- package/src/adapters/shared/server-adapter.d.ts +33 -12
- package/src/adapters/shared/server-adapter.js +215 -132
- package/src/adapters/shared/server-route-handler.d.ts +5 -5
- package/src/adapters/shared/server-route-handler.js +7 -16
- package/src/adapters/shared/server-static-builder.d.ts +41 -8
- package/src/adapters/shared/server-static-builder.js +65 -11
- package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
- package/src/adapters/shared/shared-hmr-manager.js +240 -0
- package/src/adapters/shared/static-preview-host.d.ts +10 -0
- package/src/build/README.md +107 -0
- package/src/build/build-adapter.d.ts +175 -3
- package/src/build/build-adapter.js +625 -16
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -0
- package/src/build/dev-build-coordinator.d.ts +72 -0
- package/src/build/dev-build-coordinator.js +154 -0
- package/src/build/esbuild-build-adapter.d.ts +16 -6
- package/src/build/esbuild-build-adapter.js +202 -75
- package/src/build/runtime-build-executor.d.ts +14 -0
- package/src/build/runtime-build-executor.js +22 -0
- package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
- package/src/build/runtime-specifier-alias-plugin.js +35 -0
- package/src/build/runtime-specifier-aliases.d.ts +5 -0
- package/src/build/runtime-specifier-aliases.js +95 -0
- package/src/config/README.md +36 -0
- package/src/config/config-builder.d.ts +54 -29
- package/src/config/config-builder.js +256 -50
- package/src/{constants.d.ts → config/constants.d.ts} +13 -0
- package/src/{constants.js → config/constants.js} +4 -0
- package/src/declarations.d.ts +19 -14
- package/src/dev/host-runtime.d.ts +10 -0
- package/src/dev/host-runtime.js +24 -0
- package/src/dev/sc-server.d.ts +1 -1
- package/src/dev/sc-server.js +1 -1
- package/src/eco/README.md +70 -16
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +88 -0
- package/src/eco/eco.js +63 -54
- package/src/eco/eco.types.d.ts +69 -6
- package/src/eco/eco.utils.d.ts +1 -40
- package/src/eco/eco.utils.js +5 -35
- package/src/eco/global-injector-map.d.ts +3 -3
- package/src/eco/global-injector-map.js +2 -2
- package/src/eco/lazy-injector-map.d.ts +2 -2
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +3 -1
- package/src/hmr/README.md +26 -0
- package/src/hmr/client/hmr-runtime.d.ts +1 -6
- package/src/hmr/client/hmr-runtime.js +38 -7
- package/src/hmr/hmr-strategy.d.ts +16 -13
- package/src/hmr/hmr-strategy.js +22 -7
- package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
- package/src/hmr/hmr.postcss.test.e2e.js +31 -0
- package/src/hmr/hmr.test.e2e.js +26 -33
- package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
- package/src/hmr/strategies/default-hmr-strategy.js +1 -1
- package/src/hmr/strategies/js-hmr-strategy.d.ts +40 -42
- package/src/hmr/strategies/js-hmr-strategy.js +24 -43
- package/src/index.browser.d.ts +2 -2
- package/src/index.browser.js +1 -1
- package/src/index.d.ts +4 -3
- package/src/index.js +16 -5
- package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
- package/src/integrations/ghtml/ghtml-renderer.js +27 -30
- package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
- package/src/integrations/ghtml/ghtml.constants.js +4 -0
- package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
- package/src/integrations/ghtml/ghtml.plugin.js +3 -4
- package/src/plugins/README.md +35 -0
- package/src/plugins/alias-resolver-plugin.d.ts +1 -0
- package/src/plugins/alias-resolver-plugin.js +27 -5
- package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
- package/src/plugins/eco-component-meta-plugin.js +42 -24
- package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
- package/src/plugins/foreign-jsx-override-plugin.js +41 -0
- package/src/plugins/integration-plugin.d.ts +147 -29
- package/src/plugins/integration-plugin.js +103 -14
- package/src/plugins/processor.d.ts +17 -2
- package/src/plugins/processor.js +22 -3
- package/src/plugins/runtime-capability.d.ts +9 -0
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/GRAPH.md +83 -325
- package/src/route-renderer/README.md +73 -90
- package/src/route-renderer/orchestration/component-render-context.d.ts +97 -0
- package/src/route-renderer/orchestration/component-render-context.js +147 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +110 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +534 -0
- package/src/route-renderer/orchestration/integration-renderer.js +991 -0
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
- package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
- package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +3 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -0
- package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
- package/src/route-renderer/orchestration/render-output.utils.js +171 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +156 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.js +577 -0
- package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
- package/src/route-renderer/orchestration/template-serialization.js +45 -0
- package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
- package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
- package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
- package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
- package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
- package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
- package/src/route-renderer/route-renderer.d.ts +57 -14
- package/src/route-renderer/route-renderer.js +30 -18
- package/src/router/README.md +94 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.js +34 -0
- package/src/router/client/link-intent.test.browser.d.ts +1 -0
- package/src/router/client/link-intent.test.browser.js +43 -0
- package/src/router/client/navigation-coordinator.d.ts +169 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/server/route-registry.d.ts +78 -0
- package/src/router/server/route-registry.js +262 -0
- package/src/services/README.md +28 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
- package/src/services/assets/asset-processing-service/assets.types.js +0 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
- package/src/services/assets/asset-processing-service/index.d.ts +6 -0
- package/src/services/assets/asset-processing-service/index.js +6 -0
- package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
- package/src/services/assets/asset-processing-service/page-package.js +80 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
- package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/index.js +5 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +3 -2
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +120 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +42 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +126 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
- package/src/services/assets/browser-bundle.service.d.ts +73 -0
- package/src/services/assets/browser-bundle.service.js +41 -0
- package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
- package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
- package/src/services/html/html-rewriter-provider.service.d.ts +40 -0
- package/src/services/html/html-rewriter-provider.service.js +68 -0
- package/src/services/html/html-transformer.service.d.ts +96 -0
- package/src/services/html/html-transformer.service.js +287 -0
- package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
- package/src/services/invalidation/development-invalidation.service.js +190 -0
- package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
- package/src/services/module-loading/app-module-loader.service.js +0 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +151 -0
- package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
- package/src/services/module-loading/host-module-loader-registry.js +15 -0
- package/src/services/module-loading/module-loading-types.d.ts +2 -0
- package/src/services/module-loading/module-loading-types.js +0 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +38 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +215 -0
- package/src/services/module-loading/page-module-import.service.d.ts +95 -0
- package/src/services/module-loading/page-module-import.service.js +191 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
- package/src/services/module-loading/server-module-transpiler.service.js +64 -0
- package/src/services/module-loading/source-module-support.d.ts +5 -0
- package/src/services/module-loading/source-module-support.js +8 -0
- package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
- package/src/services/runtime-state/dev-graph.service.js +162 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
- package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
- package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.d.ts +67 -20
- package/src/static-site-generator/static-site-generator.js +182 -138
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +239 -31
- package/src/types/public-types.js +0 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +6 -0
- package/src/utils/locals-utils.d.ts +1 -1
- package/src/utils/parse-cli-args.d.ts +4 -1
- package/src/utils/parse-cli-args.js +16 -1
- package/src/utils/resolve-work-dir.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/watchers/project-watcher.d.ts +11 -7
- package/src/watchers/project-watcher.js +69 -75
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +6 -5
- package/CHANGELOG.md +0 -94
- package/src/adapters/abstract/application-adapter.ts +0 -337
- package/src/adapters/abstract/router-adapter.ts +0 -30
- package/src/adapters/abstract/server-adapter.ts +0 -79
- package/src/adapters/bun/client-bridge.ts +0 -62
- package/src/adapters/bun/create-app.ts +0 -189
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.ts +0 -276
- package/src/adapters/bun/index.ts +0 -3
- package/src/adapters/bun/server-adapter.ts +0 -492
- package/src/adapters/bun/server-lifecycle.d.ts +0 -52
- package/src/adapters/bun/server-lifecycle.js +0 -120
- package/src/adapters/bun/server-lifecycle.ts +0 -154
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/index.ts +0 -9
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -271
- package/src/adapters/node/server-adapter.ts +0 -561
- package/src/adapters/node/static-content-server.ts +0 -203
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
- package/src/adapters/shared/render-context.ts +0 -105
- package/src/adapters/shared/server-adapter.ts +0 -442
- package/src/adapters/shared/server-route-handler.ts +0 -166
- package/src/adapters/shared/server-static-builder.ts +0 -82
- package/src/build/build-adapter.ts +0 -133
- package/src/build/build-types.ts +0 -83
- package/src/build/esbuild-build-adapter.ts +0 -511
- package/src/config/config-builder.ts +0 -474
- package/src/constants.ts +0 -39
- package/src/create-app.ts +0 -87
- package/src/define-api-handler.js +0 -15
- package/src/define-api-handler.ts +0 -66
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -77
- package/src/eco/component-render-context.ts +0 -202
- package/src/eco/eco.ts +0 -221
- package/src/eco/eco.types.ts +0 -202
- package/src/eco/eco.utils.ts +0 -89
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -2
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- package/src/hmr/client/hmr-runtime.ts +0 -121
- package/src/hmr/hmr-strategy.ts +0 -172
- package/src/hmr/hmr.test.e2e.ts +0 -75
- package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -327
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -212
- package/src/plugins/alias-resolver-plugin.ts +0 -45
- package/src/plugins/eco-component-meta-plugin.ts +0 -474
- package/src/plugins/integration-plugin.ts +0 -184
- package/src/plugins/processor.ts +0 -220
- package/src/public-types.ts +0 -1255
- package/src/route-renderer/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-graph.ts +0 -159
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/component-marker.ts +0 -117
- package/src/route-renderer/dependency-resolver.js +0 -428
- package/src/route-renderer/dependency-resolver.ts +0 -596
- package/src/route-renderer/html-post-processing.service.d.ts +0 -40
- package/src/route-renderer/html-post-processing.service.js +0 -86
- package/src/route-renderer/html-post-processing.service.ts +0 -103
- package/src/route-renderer/integration-renderer.d.ts +0 -339
- package/src/route-renderer/integration-renderer.js +0 -526
- package/src/route-renderer/integration-renderer.ts +0 -696
- package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
- package/src/route-renderer/marker-graph-resolver.js +0 -93
- package/src/route-renderer/marker-graph-resolver.ts +0 -153
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.ts +0 -153
- package/src/route-renderer/render-execution.service.d.ts +0 -69
- package/src/route-renderer/render-execution.service.js +0 -91
- package/src/route-renderer/render-execution.service.ts +0 -158
- package/src/route-renderer/render-preparation.service.d.ts +0 -112
- package/src/route-renderer/render-preparation.service.js +0 -243
- package/src/route-renderer/render-preparation.service.ts +0 -358
- package/src/route-renderer/route-renderer.ts +0 -80
- package/src/router/fs-router-scanner.d.ts +0 -41
- package/src/router/fs-router-scanner.js +0 -155
- package/src/router/fs-router-scanner.ts +0 -217
- package/src/router/fs-router.d.ts +0 -26
- package/src/router/fs-router.js +0 -100
- package/src/router/fs-router.ts +0 -122
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
- package/src/services/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/asset-processing-service/assets.types.ts +0 -112
- package/src/services/asset-processing-service/index.d.ts +0 -3
- package/src/services/asset-processing-service/index.js +0 -3
- package/src/services/asset-processing-service/index.ts +0 -3
- package/src/services/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
- package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
- package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
- package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
- package/src/services/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/asset-processing-service/processors/index.js +0 -5
- package/src/services/asset-processing-service/processors/index.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
- package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.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/script/node-module-script.processor.ts +0 -84
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.ts +0 -128
- package/src/services/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -359
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/watchers/project-watcher.test-helpers.ts +0 -40
- package/src/watchers/project-watcher.ts +0 -364
- /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
- /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
- /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
- /package/src/{services/asset-processing-service/assets.types.js → plugins/runtime-capability.js} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -2,9 +2,4 @@
|
|
|
2
2
|
* Ecopages HMR Runtime
|
|
3
3
|
* Injected into the browser to handle Hot Module Replacement updates.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
type: 'reload' | 'error' | 'update' | 'css-update' | 'layout-update';
|
|
7
|
-
path?: string;
|
|
8
|
-
message?: string;
|
|
9
|
-
timestamp?: number;
|
|
10
|
-
}
|
|
5
|
+
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getEcoNavigationRuntime } from "../../router/client/navigation-coordinator.js";
|
|
1
2
|
(function() {
|
|
2
3
|
const WS_URL = "ws://" + location.host + "/_hmr";
|
|
3
4
|
let socket;
|
|
@@ -24,14 +25,15 @@
|
|
|
24
25
|
});
|
|
25
26
|
}
|
|
26
27
|
async function handleMessage(payload) {
|
|
28
|
+
const navigationRuntime = getEcoNavigationRuntime(window);
|
|
27
29
|
switch (payload.type) {
|
|
28
30
|
case "reload":
|
|
31
|
+
await waitForNavigationToSettle(navigationRuntime);
|
|
29
32
|
location.reload();
|
|
30
33
|
break;
|
|
31
34
|
case "layout-update": {
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
await reloadFn({ clearCache: true });
|
|
35
|
+
await waitForNavigationToSettle(navigationRuntime);
|
|
36
|
+
if (await navigationRuntime.reloadCurrentPage({ clearCache: true, moduleUrl: getActiveHmrModuleUrl() })) {
|
|
35
37
|
} else {
|
|
36
38
|
location.reload();
|
|
37
39
|
}
|
|
@@ -55,20 +57,49 @@
|
|
|
55
57
|
async function applyUpdate(path, timestamp) {
|
|
56
58
|
try {
|
|
57
59
|
const url = path + "?t=" + (timestamp || Date.now());
|
|
58
|
-
const handlers = window.
|
|
60
|
+
const handlers = window.__ECO_PAGES__?.hmrHandlers;
|
|
61
|
+
const navigationRuntime = getEcoNavigationRuntime(window);
|
|
62
|
+
await waitForNavigationToSettle(navigationRuntime);
|
|
59
63
|
if (handlers?.[path]) {
|
|
60
64
|
await handlers[path](url);
|
|
61
65
|
return;
|
|
62
66
|
}
|
|
63
67
|
await import(url);
|
|
64
|
-
|
|
65
|
-
if (typeof reloadFn === "function") {
|
|
66
|
-
await reloadFn({ clearCache: false });
|
|
68
|
+
if (await navigationRuntime.reloadCurrentPage({ clearCache: false })) {
|
|
67
69
|
}
|
|
68
70
|
} catch (e) {
|
|
69
71
|
console.error("[ecopages] Failed to apply HMR update:", e);
|
|
70
72
|
}
|
|
71
73
|
}
|
|
74
|
+
function getActiveHmrModuleUrl() {
|
|
75
|
+
const pageModule = window.__ECO_PAGES__?.page?.module;
|
|
76
|
+
if (pageModule && pageModule.includes("/assets/_hmr/")) {
|
|
77
|
+
return pageModule.split("?")[0];
|
|
78
|
+
}
|
|
79
|
+
const handlerPaths = Object.keys(window.__ECO_PAGES__?.hmrHandlers ?? {});
|
|
80
|
+
return handlerPaths[handlerPaths.length - 1];
|
|
81
|
+
}
|
|
82
|
+
async function waitForNavigationToSettle(navigationRuntime) {
|
|
83
|
+
if (!navigationRuntime.hasPendingNavigationTransaction()) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await new Promise((resolve) => {
|
|
87
|
+
const startedAt = performance.now();
|
|
88
|
+
const timeoutMs = 2e3;
|
|
89
|
+
const poll = () => {
|
|
90
|
+
if (!navigationRuntime.hasPendingNavigationTransaction()) {
|
|
91
|
+
resolve();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (performance.now() - startedAt >= timeoutMs) {
|
|
95
|
+
resolve();
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
requestAnimationFrame(poll);
|
|
99
|
+
};
|
|
100
|
+
requestAnimationFrame(poll);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
72
103
|
function refreshStylesheet(path) {
|
|
73
104
|
const filename = path.split("/").pop() || "";
|
|
74
105
|
const links = document.querySelectorAll('link[rel="stylesheet"]');
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientBridgeEvent } from '../public-types';
|
|
1
|
+
import type { ClientBridgeEvent } from '../types/public-types.js';
|
|
2
2
|
/**
|
|
3
3
|
* HMR Strategy Pattern
|
|
4
4
|
*
|
|
@@ -18,11 +18,13 @@ import type { ClientBridgeEvent } from '../public-types';
|
|
|
18
18
|
* async process(filePath: string): Promise<HmrAction> {
|
|
19
19
|
* return {
|
|
20
20
|
* type: 'broadcast',
|
|
21
|
-
* events: [{ type: 'update', path: filePath, timestamp: Date.now() }]
|
|
21
|
+
* events: [{ type: 'update', path: filePath, timestamp: Date.now() }],
|
|
22
22
|
* };
|
|
23
23
|
* }
|
|
24
24
|
* }
|
|
25
|
-
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
26
28
|
* Defines the category of an HMR strategy, which determines its execution priority.
|
|
27
29
|
* Strategies are evaluated in descending order: INTEGRATION → ASSET → SCRIPT → FALLBACK.
|
|
28
30
|
*
|
|
@@ -30,28 +32,29 @@ import type { ClientBridgeEvent } from '../public-types';
|
|
|
30
32
|
* The numeric values represent base priorities. Strategies can fine-tune their priority
|
|
31
33
|
* using the `priorityOffset` property.
|
|
32
34
|
*/
|
|
33
|
-
export declare
|
|
35
|
+
export declare const HmrStrategyType: {
|
|
34
36
|
/**
|
|
35
37
|
* Integration-specific strategies (React, Lit, etc.)
|
|
36
38
|
* Highest priority to allow framework-specific HMR handling.
|
|
37
39
|
*/
|
|
38
|
-
INTEGRATION
|
|
40
|
+
readonly INTEGRATION: 100;
|
|
39
41
|
/**
|
|
40
42
|
* Asset processing strategies (CSS, images, etc.)
|
|
41
43
|
* High priority for specialized asset handling.
|
|
42
44
|
*/
|
|
43
|
-
ASSET
|
|
45
|
+
readonly ASSET: 50;
|
|
44
46
|
/**
|
|
45
47
|
* Generic script bundling strategies (JS/TS)
|
|
46
48
|
* Medium priority for standard script processing.
|
|
47
49
|
*/
|
|
48
|
-
SCRIPT
|
|
50
|
+
readonly SCRIPT: 25;
|
|
49
51
|
/**
|
|
50
52
|
* Fallback strategy for unhandled file types.
|
|
51
53
|
* Lowest priority, triggers full page reload.
|
|
52
54
|
*/
|
|
53
|
-
FALLBACK
|
|
54
|
-
}
|
|
55
|
+
readonly FALLBACK: 0;
|
|
56
|
+
};
|
|
57
|
+
export type HmrStrategyType = (typeof HmrStrategyType)[keyof typeof HmrStrategyType];
|
|
55
58
|
/**
|
|
56
59
|
* Represents an action to be taken after processing a file change.
|
|
57
60
|
*/
|
|
@@ -62,7 +65,7 @@ export interface HmrAction {
|
|
|
62
65
|
type: 'broadcast' | 'none';
|
|
63
66
|
/**
|
|
64
67
|
* The HMR events to broadcast, if type is 'broadcast'.
|
|
65
|
-
*
|
|
68
|
+
* Multiple events may be broadcast in one action.
|
|
66
69
|
*/
|
|
67
70
|
events?: ClientBridgeEvent[];
|
|
68
71
|
}
|
|
@@ -74,8 +77,8 @@ export interface HmrAction {
|
|
|
74
77
|
* whether they match the changed file path.
|
|
75
78
|
*
|
|
76
79
|
* @remarks
|
|
77
|
-
* Strategies
|
|
78
|
-
* produce the same result when processed by the same strategy.
|
|
80
|
+
* Strategies are expected to be stateless and idempotent. The same file change
|
|
81
|
+
* should produce the same result when processed by the same strategy.
|
|
79
82
|
*
|
|
80
83
|
* @example
|
|
81
84
|
* ```typescript
|
|
@@ -120,7 +123,7 @@ export declare abstract class HmrStrategy {
|
|
|
120
123
|
* Determines if this strategy can handle the given file path.
|
|
121
124
|
*
|
|
122
125
|
* @param filePath - Absolute path to the changed file
|
|
123
|
-
* @returns
|
|
126
|
+
* @returns `true` when this strategy should process the file
|
|
124
127
|
*
|
|
125
128
|
* @example
|
|
126
129
|
* ```typescript
|
package/src/hmr/hmr-strategy.js
CHANGED
|
@@ -1,10 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
const HmrStrategyType = {
|
|
2
|
+
/**
|
|
3
|
+
* Integration-specific strategies (React, Lit, etc.)
|
|
4
|
+
* Highest priority to allow framework-specific HMR handling.
|
|
5
|
+
*/
|
|
6
|
+
INTEGRATION: 100,
|
|
7
|
+
/**
|
|
8
|
+
* Asset processing strategies (CSS, images, etc.)
|
|
9
|
+
* High priority for specialized asset handling.
|
|
10
|
+
*/
|
|
11
|
+
ASSET: 50,
|
|
12
|
+
/**
|
|
13
|
+
* Generic script bundling strategies (JS/TS)
|
|
14
|
+
* Medium priority for standard script processing.
|
|
15
|
+
*/
|
|
16
|
+
SCRIPT: 25,
|
|
17
|
+
/**
|
|
18
|
+
* Fallback strategy for unhandled file types.
|
|
19
|
+
* Lowest priority, triggers full page reload.
|
|
20
|
+
*/
|
|
21
|
+
FALLBACK: 0
|
|
22
|
+
};
|
|
8
23
|
class HmrStrategy {
|
|
9
24
|
/**
|
|
10
25
|
* Optional offset to fine-tune priority within the same category.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
const FIXTURE_DIR = resolve(process.cwd(), "packages/core/__fixtures__/app");
|
|
6
|
+
const TEST_CSS_FILE = resolve(FIXTURE_DIR, "src/pages/postcss-hmr.css");
|
|
7
|
+
test.describe("HMR E2E PostCSS", () => {
|
|
8
|
+
test("should hot-update processor-owned CSS without a full page reload", async ({ page }) => {
|
|
9
|
+
const originalCss = readFileSync(TEST_CSS_FILE, "utf-8");
|
|
10
|
+
const title = page.locator(".postcss-title").first();
|
|
11
|
+
try {
|
|
12
|
+
await page.goto("/postcss-hmr", { waitUntil: "networkidle" });
|
|
13
|
+
await expect(title).toBeVisible();
|
|
14
|
+
const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
|
|
15
|
+
expect(initialColor).toBeTruthy();
|
|
16
|
+
await page.evaluate(() => {
|
|
17
|
+
window.__postcssReloadProbe = "before-change";
|
|
18
|
+
});
|
|
19
|
+
const modifiedCss = originalCss.replace(".postcss-title {", ".postcss-title {\n color: rgb(255, 0, 0);");
|
|
20
|
+
await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
|
|
21
|
+
await expect.poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 1e4 }).toBe("rgb(255, 0, 0)");
|
|
22
|
+
await expect(
|
|
23
|
+
page.evaluate(
|
|
24
|
+
() => window.__postcssReloadProbe ?? null
|
|
25
|
+
)
|
|
26
|
+
).resolves.toBe("before-change");
|
|
27
|
+
} finally {
|
|
28
|
+
await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
});
|
package/src/hmr/hmr.test.e2e.js
CHANGED
|
@@ -4,47 +4,40 @@ import { writeFile } from "node:fs/promises";
|
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
const FIXTURE_DIR = resolve(process.cwd(), "packages/core/__fixtures__/app");
|
|
6
6
|
const TEST_CSS_FILE = resolve(FIXTURE_DIR, "src/pages/index.css");
|
|
7
|
-
const BUILT_CSS_FILE = resolve(FIXTURE_DIR, ".eco/assets/pages/index.css");
|
|
8
|
-
const TEST_URL = "http://localhost:3002";
|
|
9
7
|
test.describe("HMR E2E", () => {
|
|
10
8
|
test("should load page with .main-title element", async ({ page }) => {
|
|
11
|
-
await page.goto(
|
|
9
|
+
await page.goto("/", { waitUntil: "networkidle" });
|
|
12
10
|
const title = page.locator(".main-title").first();
|
|
13
11
|
await expect(title).toBeVisible();
|
|
14
12
|
});
|
|
15
13
|
test("should connect to HMR WebSocket", async ({ page }) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const ws = new WebSocket("ws://localhost:3002/_hmr");
|
|
20
|
-
ws.onopen = () => {
|
|
21
|
-
ws.close();
|
|
22
|
-
resolve2(true);
|
|
23
|
-
};
|
|
24
|
-
ws.onerror = () => resolve2(false);
|
|
25
|
-
setTimeout(() => resolve2(false), 5e3);
|
|
26
|
-
});
|
|
14
|
+
const socketPromise = page.waitForEvent("websocket", {
|
|
15
|
+
predicate: (socket2) => socket2.url().endsWith("/_hmr"),
|
|
16
|
+
timeout: 1e4
|
|
27
17
|
});
|
|
28
|
-
|
|
18
|
+
await page.goto("/", { waitUntil: "networkidle" });
|
|
19
|
+
const socket = await socketPromise;
|
|
20
|
+
expect(socket.url()).toMatch(/\/_hmr$/);
|
|
29
21
|
});
|
|
30
|
-
test("should
|
|
22
|
+
test("should fall back to a full page reload when raw CSS file changes", async ({ page }) => {
|
|
31
23
|
const originalCss = readFileSync(TEST_CSS_FILE, "utf-8");
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
24
|
+
const title = page.locator(".main-title").first();
|
|
25
|
+
try {
|
|
26
|
+
await page.goto("/", { waitUntil: "networkidle" });
|
|
27
|
+
await expect(title).toBeVisible();
|
|
28
|
+
const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
|
|
29
|
+
expect(initialColor).toBeTruthy();
|
|
30
|
+
const modifiedCss = originalCss.replace(".main-title {", ".main-title {\n color: rgb(255, 0, 0);");
|
|
31
|
+
const reloadPromise = page.waitForEvent("framenavigated", {
|
|
32
|
+
predicate: (frame) => frame === page.mainFrame(),
|
|
33
|
+
timeout: 1e4
|
|
34
|
+
});
|
|
35
|
+
await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
|
|
36
|
+
await reloadPromise;
|
|
37
|
+
await page.waitForLoadState("networkidle");
|
|
38
|
+
await expect.poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 1e4 }).toBe("rgb(255, 0, 0)");
|
|
39
|
+
} finally {
|
|
40
|
+
await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
|
|
41
|
+
}
|
|
49
42
|
});
|
|
50
43
|
});
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
import { HmrStrategy,
|
|
9
|
+
import { HmrStrategy, type HmrAction } from '../hmr-strategy.js';
|
|
10
10
|
/**
|
|
11
11
|
* Default fallback strategy for unhandled file types.
|
|
12
12
|
*
|
|
@@ -25,7 +25,7 @@ import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy';
|
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
27
|
export declare class DefaultHmrStrategy extends HmrStrategy {
|
|
28
|
-
readonly type
|
|
28
|
+
readonly type: 0;
|
|
29
29
|
/**
|
|
30
30
|
* Matches all file paths.
|
|
31
31
|
*
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
* JavaScript HMR Strategy
|
|
3
3
|
*
|
|
4
4
|
* Handles hot module replacement for JavaScript and TypeScript entrypoints.
|
|
5
|
-
* Bundles files,
|
|
5
|
+
* Bundles files, inspects the emitted output, and decides whether the browser
|
|
6
|
+
* can hot-accept the change or must reload.
|
|
6
7
|
*
|
|
7
8
|
* @module
|
|
8
9
|
*/
|
|
9
|
-
import { HmrStrategy,
|
|
10
|
+
import { HmrStrategy, type HmrAction } from '../hmr-strategy.js';
|
|
10
11
|
import type { EcoBuildPlugin } from '../../build/build-types.js';
|
|
12
|
+
import type { BrowserBundleExecutor } from '../../services/assets/browser-bundle.service.js';
|
|
13
|
+
import type { EntrypointDependencyGraph } from '../../services/runtime-state/entrypoint-dependency-graph.service.js';
|
|
11
14
|
/**
|
|
12
15
|
* Context interface providing access to HmrManager state.
|
|
13
16
|
* Required for JsHmrStrategy to access registered entrypoints and configuration.
|
|
@@ -17,27 +20,7 @@ export interface JsHmrContext {
|
|
|
17
20
|
* Map of registered entrypoints to their output URLs.
|
|
18
21
|
*/
|
|
19
22
|
getWatchedFiles(): Map<string, string>;
|
|
20
|
-
|
|
21
|
-
* Map of bare specifiers to vendor URLs for import resolution.
|
|
22
|
-
*/
|
|
23
|
-
getSpecifierMap(): Map<string, string>;
|
|
24
|
-
/**
|
|
25
|
-
* Returns entrypoints impacted by a changed dependency path.
|
|
26
|
-
*
|
|
27
|
-
* @remarks
|
|
28
|
-
* This hook is currently provided by the Node HMR manager where dependency
|
|
29
|
-
* graph metadata is extracted from the Node/esbuild build adapter.
|
|
30
|
-
*/
|
|
31
|
-
getDependencyEntrypoints?(filePath: string): Set<string>;
|
|
32
|
-
/**
|
|
33
|
-
* Stores latest dependency set for an entrypoint.
|
|
34
|
-
*
|
|
35
|
-
* @remarks
|
|
36
|
-
* This hook is currently used only by the Node HMR manager to maintain a
|
|
37
|
-
* reverse invalidation index. Runtimes that do not provide it keep rebuild-all
|
|
38
|
-
* fallback semantics.
|
|
39
|
-
*/
|
|
40
|
-
setEntrypointDependencies?(entrypointPath: string, dependencies: string[]): void;
|
|
23
|
+
getEntrypointDependencyGraph(): EntrypointDependencyGraph;
|
|
41
24
|
/**
|
|
42
25
|
* Directory where HMR bundles are written.
|
|
43
26
|
*/
|
|
@@ -50,23 +33,47 @@ export interface JsHmrContext {
|
|
|
50
33
|
* Absolute path to the source directory.
|
|
51
34
|
*/
|
|
52
35
|
getSrcDir(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Absolute path to the pages directory.
|
|
38
|
+
*/
|
|
39
|
+
getPagesDir(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Absolute path to the layouts directory.
|
|
42
|
+
*/
|
|
43
|
+
getLayoutsDir(): string;
|
|
44
|
+
/**
|
|
45
|
+
* All configured route-template extensions across integrations.
|
|
46
|
+
*/
|
|
47
|
+
getTemplateExtensions(): string[];
|
|
48
|
+
/**
|
|
49
|
+
* Browser bundler used to rebuild changed entrypoints.
|
|
50
|
+
*/
|
|
51
|
+
getBrowserBundleService(): BrowserBundleExecutor;
|
|
52
|
+
/**
|
|
53
|
+
* Returns whether a watched entrypoint should be rebuilt by the generic JS strategy.
|
|
54
|
+
*
|
|
55
|
+
* @remarks
|
|
56
|
+
* Integrations with higher-priority HMR strategies can use this to keep the
|
|
57
|
+
* generic JS strategy from overwriting their emitted entrypoints when a shared
|
|
58
|
+
* dependency changes.
|
|
59
|
+
*/
|
|
60
|
+
shouldProcessEntrypoint?(entrypointPath: string): boolean;
|
|
53
61
|
}
|
|
54
62
|
/**
|
|
55
63
|
* Strategy for handling JavaScript/TypeScript file changes with hot reloading.
|
|
56
64
|
*
|
|
57
|
-
* This strategy rebuilds all registered entrypoints when any file changes,
|
|
58
|
-
* as we don't currently track dependencies. This is safe but inefficient.
|
|
59
|
-
*
|
|
60
65
|
* The processing steps are:
|
|
61
66
|
* 1. Check if any entrypoints are registered
|
|
62
|
-
* 2. Rebuild
|
|
63
|
-
*
|
|
67
|
+
* 2. Rebuild impacted entrypoints, or all watched entrypoints when no runtime
|
|
68
|
+
* dependency graph is available
|
|
69
|
+
* 3. Emit rebuilt entrypoint bundles for browser delivery
|
|
64
70
|
* 4. Inject generic HMR boilerplate
|
|
65
71
|
* 5. Broadcast update events for each rebuilt entrypoint
|
|
66
72
|
*
|
|
67
73
|
* @remarks
|
|
68
|
-
*
|
|
69
|
-
*
|
|
74
|
+
* Node can provide dependency-graph metadata, so this strategy can rebuild only
|
|
75
|
+
* the entrypoints impacted by a changed dependency. Runtimes that do not expose
|
|
76
|
+
* that metadata intentionally keep the rebuild-all fallback.
|
|
70
77
|
*
|
|
71
78
|
* @see https://bun.sh/docs/runtime/transpiler
|
|
72
79
|
*
|
|
@@ -74,7 +81,6 @@ export interface JsHmrContext {
|
|
|
74
81
|
* ```typescript
|
|
75
82
|
* const context = {
|
|
76
83
|
* getWatchedFiles: () => watchedFilesMap,
|
|
77
|
-
* getSpecifierMap: () => specifierMap,
|
|
78
84
|
* getDistDir: () => '/path/to/dist/_hmr',
|
|
79
85
|
* getPlugins: () => [],
|
|
80
86
|
* getSrcDir: () => '/path/to/src'
|
|
@@ -83,8 +89,8 @@ export interface JsHmrContext {
|
|
|
83
89
|
* ```
|
|
84
90
|
*/
|
|
85
91
|
export declare class JsHmrStrategy extends HmrStrategy {
|
|
92
|
+
readonly type: 25;
|
|
86
93
|
private context;
|
|
87
|
-
readonly type = HmrStrategyType.SCRIPT;
|
|
88
94
|
constructor(context: JsHmrContext);
|
|
89
95
|
/**
|
|
90
96
|
* Determines if the file is a JS/TS file that could affect registered entrypoints.
|
|
@@ -117,20 +123,12 @@ export declare class JsHmrStrategy extends HmrStrategy {
|
|
|
117
123
|
*/
|
|
118
124
|
private bundleEntrypoints;
|
|
119
125
|
/**
|
|
120
|
-
* Processes bundled output
|
|
126
|
+
* Processes bundled output and determines whether the browser can hot-accept
|
|
127
|
+
* the update or must fall back to a full reload.
|
|
121
128
|
*
|
|
122
129
|
* @param filepath - Path to the bundled output file
|
|
123
130
|
* @param url - URL path for the bundled file
|
|
124
131
|
* @returns True if processing was successful and update should be broadcast
|
|
125
132
|
*/
|
|
126
133
|
private processOutput;
|
|
127
|
-
/**
|
|
128
|
-
* Replaces bare specifiers with vendor URLs.
|
|
129
|
-
*
|
|
130
|
-
* Handles both static imports and dynamic imports.
|
|
131
|
-
*
|
|
132
|
-
* @param code - The bundled code to transform
|
|
133
|
-
* @returns The transformed code with vendor URLs
|
|
134
|
-
*/
|
|
135
|
-
private replaceBareSpecifiers;
|
|
136
134
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { fileSystem } from "@ecopages/file-system";
|
|
3
|
-
import { HmrStrategy, HmrStrategyType } from "../hmr-strategy";
|
|
4
|
-
import { appLogger } from "../../global/app-logger";
|
|
5
|
-
import { defaultBuildAdapter } from "../../build/build-adapter.js";
|
|
3
|
+
import { HmrStrategy, HmrStrategyType } from "../hmr-strategy.js";
|
|
4
|
+
import { appLogger } from "../../global/app-logger.js";
|
|
6
5
|
class JsHmrStrategy extends HmrStrategy {
|
|
6
|
+
type = HmrStrategyType.SCRIPT;
|
|
7
|
+
context;
|
|
7
8
|
constructor(context) {
|
|
8
9
|
super();
|
|
9
10
|
this.context = context;
|
|
10
11
|
}
|
|
11
|
-
type = HmrStrategyType.SCRIPT;
|
|
12
12
|
/**
|
|
13
13
|
* Determines if the file is a JS/TS file that could affect registered entrypoints.
|
|
14
14
|
*
|
|
@@ -23,18 +23,19 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
23
23
|
const watchedFiles = this.context.getWatchedFiles();
|
|
24
24
|
const isJsTs = /\.(ts|tsx|js|jsx)$/.test(filePath);
|
|
25
25
|
const isInSrc = filePath.startsWith(this.context.getSrcDir());
|
|
26
|
+
const isIntegrationTemplate = this.context.getTemplateExtensions().some((extension) => filePath.endsWith(extension));
|
|
26
27
|
if (watchedFiles.size === 0) {
|
|
27
28
|
return false;
|
|
28
29
|
}
|
|
29
30
|
if (!isJsTs || !isInSrc) {
|
|
30
31
|
return false;
|
|
31
32
|
}
|
|
33
|
+
if (isIntegrationTemplate) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
32
36
|
if (watchedFiles.has(filePath)) {
|
|
33
37
|
return true;
|
|
34
38
|
}
|
|
35
|
-
if (this.context.getDependencyEntrypoints) {
|
|
36
|
-
return this.context.getDependencyEntrypoints(filePath).size > 0;
|
|
37
|
-
}
|
|
38
39
|
return true;
|
|
39
40
|
}
|
|
40
41
|
/**
|
|
@@ -56,31 +57,34 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
56
57
|
appLogger.debug(`[JsHmrStrategy] No watched files to rebuild`);
|
|
57
58
|
return { type: "none" };
|
|
58
59
|
}
|
|
59
|
-
const dependencyHits = this.context.getDependencyEntrypoints
|
|
60
|
+
const dependencyHits = this.context.getEntrypointDependencyGraph().getDependencyEntrypoints(filePath);
|
|
60
61
|
const hasDependencyHit = dependencyHits.size > 0;
|
|
61
62
|
const impactedEntrypoints = hasDependencyHit ? Array.from(dependencyHits).filter((entrypoint) => watchedFiles.has(entrypoint)) : Array.from(watchedFiles.keys());
|
|
63
|
+
const buildableEntrypoints = impactedEntrypoints.filter(
|
|
64
|
+
(entrypoint) => this.context.shouldProcessEntrypoint?.(entrypoint) ?? true
|
|
65
|
+
);
|
|
62
66
|
if (!hasDependencyHit) {
|
|
63
67
|
appLogger.debug("[JsHmrStrategy] Dependency graph miss, rebuilding all watched entrypoints");
|
|
64
68
|
}
|
|
65
|
-
if (
|
|
69
|
+
if (buildableEntrypoints.length === 0) {
|
|
66
70
|
return { type: "none" };
|
|
67
71
|
}
|
|
68
|
-
const buildResult = await this.bundleEntrypoints(
|
|
72
|
+
const buildResult = await this.bundleEntrypoints(buildableEntrypoints);
|
|
69
73
|
if (!buildResult.success) {
|
|
70
74
|
return { type: "none" };
|
|
71
75
|
}
|
|
72
76
|
const updates = [];
|
|
73
77
|
let reloadRequired = false;
|
|
74
|
-
for (const entrypoint of
|
|
78
|
+
for (const entrypoint of buildableEntrypoints) {
|
|
75
79
|
const outputUrl = watchedFiles.get(entrypoint);
|
|
76
80
|
if (!outputUrl) continue;
|
|
77
|
-
if (buildResult.dependencies
|
|
81
|
+
if (buildResult.dependencies) {
|
|
78
82
|
const entrypointDeps = buildResult.dependencies.get(path.resolve(entrypoint)) ?? [];
|
|
79
|
-
this.context.setEntrypointDependencies(entrypoint, entrypointDeps);
|
|
83
|
+
this.context.getEntrypointDependencyGraph().setEntrypointDependencies(entrypoint, entrypointDeps);
|
|
80
84
|
}
|
|
81
85
|
const srcDir = this.context.getSrcDir();
|
|
82
86
|
const relativePath = path.relative(srcDir, entrypoint);
|
|
83
|
-
const relativePathJs = relativePath.replace(/\.(tsx?|jsx?)$/, ".js");
|
|
87
|
+
const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
|
|
84
88
|
const outputPath = path.join(this.context.getDistDir(), relativePathJs);
|
|
85
89
|
const result = await this.processOutput(outputPath, outputUrl);
|
|
86
90
|
if (result.success) {
|
|
@@ -116,15 +120,14 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
116
120
|
*/
|
|
117
121
|
async bundleEntrypoints(entrypoints) {
|
|
118
122
|
try {
|
|
119
|
-
const result = await
|
|
123
|
+
const result = await this.context.getBrowserBundleService().bundle({
|
|
124
|
+
profile: "hmr-entrypoint",
|
|
120
125
|
entrypoints,
|
|
121
126
|
outdir: this.context.getDistDir(),
|
|
122
127
|
outbase: this.context.getSrcDir(),
|
|
123
128
|
naming: "[dir]/[name]",
|
|
124
|
-
...defaultBuildAdapter.getTranspileOptions("hmr-entrypoint"),
|
|
125
129
|
plugins: this.context.getPlugins(),
|
|
126
|
-
minify: false
|
|
127
|
-
external: ["react", "react-dom"]
|
|
130
|
+
minify: false
|
|
128
131
|
});
|
|
129
132
|
if (!result.success) {
|
|
130
133
|
appLogger.error("[JsHmrStrategy] Batched build failed:", result.logs);
|
|
@@ -143,7 +146,8 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
143
146
|
}
|
|
144
147
|
}
|
|
145
148
|
/**
|
|
146
|
-
* Processes bundled output
|
|
149
|
+
* Processes bundled output and determines whether the browser can hot-accept
|
|
150
|
+
* the update or must fall back to a full reload.
|
|
147
151
|
*
|
|
148
152
|
* @param filepath - Path to the bundled output file
|
|
149
153
|
* @param url - URL path for the bundled file
|
|
@@ -151,12 +155,10 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
151
155
|
*/
|
|
152
156
|
async processOutput(filepath, url) {
|
|
153
157
|
try {
|
|
154
|
-
|
|
158
|
+
const code = await fileSystem.readFile(filepath);
|
|
155
159
|
if (code.includes("/* [ecopages] hmr */")) {
|
|
156
160
|
return { success: true, requiresReload: !code.includes("import.meta.hot.accept") };
|
|
157
161
|
}
|
|
158
|
-
code = this.replaceBareSpecifiers(code);
|
|
159
|
-
await fileSystem.writeAsync(filepath, code);
|
|
160
162
|
appLogger.debug(`[JsHmrStrategy] Processed ${url}`);
|
|
161
163
|
const hasHmrAccept = code.includes("import.meta.hot.accept");
|
|
162
164
|
return { success: true, requiresReload: !hasHmrAccept };
|
|
@@ -165,27 +167,6 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
165
167
|
return { success: false, requiresReload: false };
|
|
166
168
|
}
|
|
167
169
|
}
|
|
168
|
-
/**
|
|
169
|
-
* Replaces bare specifiers with vendor URLs.
|
|
170
|
-
*
|
|
171
|
-
* Handles both static imports and dynamic imports.
|
|
172
|
-
*
|
|
173
|
-
* @param code - The bundled code to transform
|
|
174
|
-
* @returns The transformed code with vendor URLs
|
|
175
|
-
*/
|
|
176
|
-
replaceBareSpecifiers(code) {
|
|
177
|
-
const specifierMap = this.context.getSpecifierMap();
|
|
178
|
-
if (specifierMap.size === 0) {
|
|
179
|
-
return code;
|
|
180
|
-
}
|
|
181
|
-
let result = code;
|
|
182
|
-
for (const [bareSpec, vendorUrl] of specifierMap.entries()) {
|
|
183
|
-
const escaped = bareSpec.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
184
|
-
result = result.replace(new RegExp(`from\\s*["']${escaped}["']`, "g"), `from "${vendorUrl}"`);
|
|
185
|
-
result = result.replace(new RegExp(`import\\(["']${escaped}["']\\)`, "g"), `import("${vendorUrl}")`);
|
|
186
|
-
}
|
|
187
|
-
return result;
|
|
188
|
-
}
|
|
189
170
|
}
|
|
190
171
|
export {
|
|
191
172
|
JsHmrStrategy
|
package/src/index.browser.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type * from './public-types.js';
|
|
1
|
+
export type * from './types/public-types.js';
|
|
2
2
|
export type * from './eco/eco.types.js';
|
|
3
|
-
export { eco } from './eco/eco.js';
|
|
3
|
+
export { eco } from './eco/eco.browser.js';
|
package/src/index.browser.js
CHANGED