@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -64
- package/README.md +212 -14
- package/package.json +116 -66
- package/src/adapters/README.md +39 -0
- package/src/adapters/abstract/application-adapter.d.ts +28 -2
- package/src/adapters/abstract/application-adapter.js +14 -2
- package/src/adapters/abstract/router-adapter.d.ts +1 -1
- package/src/adapters/abstract/server-adapter.d.ts +2 -2
- package/src/adapters/bun/client-bridge.d.ts +1 -1
- package/src/adapters/bun/create-app.d.ts +4 -12
- package/src/adapters/bun/create-app.js +4 -5
- package/src/adapters/bun/hmr-manager.d.ts +80 -21
- package/src/adapters/bun/hmr-manager.js +168 -62
- package/src/adapters/bun/index.d.ts +2 -3
- package/src/adapters/bun/index.js +3 -3
- package/src/adapters/bun/server-adapter.d.ts +5 -5
- package/src/adapters/bun/server-adapter.js +40 -34
- package/src/adapters/bun/server-lifecycle.d.ts +28 -17
- package/src/adapters/bun/server-lifecycle.js +34 -62
- package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
- package/src/{create-app.js → adapters/create-app.js} +4 -4
- package/src/adapters/index.d.ts +2 -6
- package/src/adapters/index.js +2 -8
- package/src/adapters/node/create-app.d.ts +6 -9
- package/src/adapters/node/create-app.js +12 -6
- package/src/adapters/node/node-client-bridge.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.d.ts +89 -18
- package/src/adapters/node/node-hmr-manager.js +185 -95
- package/src/adapters/node/server-adapter.d.ts +6 -35
- package/src/adapters/node/server-adapter.js +44 -105
- package/src/adapters/node/static-content-server.d.ts +37 -1
- package/src/adapters/node/static-content-server.js +29 -1
- package/src/adapters/shared/application-adapter.d.ts +1 -1
- package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +2 -2
- package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
- package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
- package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
- package/src/adapters/shared/fs-server-response-factory.js +1 -1
- package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
- package/src/adapters/shared/fs-server-response-matcher.js +10 -18
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
- package/src/adapters/shared/hmr-html-response.d.ts +22 -0
- package/src/adapters/shared/hmr-html-response.js +32 -0
- package/src/adapters/shared/render-context.d.ts +2 -1
- package/src/adapters/shared/render-context.js +6 -3
- package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
- package/src/adapters/shared/runtime-bootstrap.js +43 -0
- package/src/adapters/shared/server-adapter.d.ts +13 -3
- package/src/adapters/shared/server-adapter.js +42 -5
- package/src/adapters/shared/server-route-handler.d.ts +4 -4
- package/src/adapters/shared/server-route-handler.js +6 -15
- package/src/adapters/shared/server-static-builder.d.ts +38 -6
- package/src/adapters/shared/server-static-builder.js +64 -10
- package/src/build/README.md +107 -0
- package/src/build/build-adapter.d.ts +168 -3
- package/src/build/build-adapter.js +604 -16
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -0
- package/src/build/dev-build-coordinator.d.ts +72 -0
- package/src/build/dev-build-coordinator.js +154 -0
- package/src/build/esbuild-build-adapter.d.ts +15 -6
- package/src/build/esbuild-build-adapter.js +189 -74
- package/src/build/runtime-build-executor.d.ts +14 -0
- package/src/build/runtime-build-executor.js +22 -0
- package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
- package/src/build/runtime-specifier-alias-plugin.js +35 -0
- package/src/build/runtime-specifier-aliases.d.ts +5 -0
- package/src/build/runtime-specifier-aliases.js +95 -0
- package/src/config/README.md +36 -0
- package/src/config/config-builder.d.ts +52 -27
- package/src/config/config-builder.js +260 -49
- package/src/{constants.d.ts → config/constants.d.ts} +13 -0
- package/src/{constants.js → config/constants.js} +4 -0
- package/src/declarations.d.ts +19 -14
- package/src/dev/sc-server.d.ts +1 -1
- package/src/dev/sc-server.js +1 -1
- package/src/eco/README.md +70 -16
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +83 -0
- package/src/eco/eco.js +32 -57
- package/src/eco/eco.types.d.ts +12 -4
- package/src/eco/eco.utils.d.ts +1 -40
- package/src/eco/eco.utils.js +5 -35
- package/src/eco/global-injector-map.d.ts +1 -1
- package/src/eco/lazy-injector-map.d.ts +1 -1
- package/src/hmr/README.md +26 -0
- package/src/hmr/client/hmr-runtime.d.ts +1 -6
- package/src/hmr/client/hmr-runtime.js +30 -7
- package/src/hmr/hmr-strategy.d.ts +16 -13
- package/src/hmr/hmr-strategy.js +22 -7
- package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
- package/src/hmr/hmr.postcss.test.e2e.js +31 -0
- package/src/hmr/hmr.test.e2e.js +26 -33
- package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
- package/src/hmr/strategies/default-hmr-strategy.js +1 -1
- package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
- package/src/hmr/strategies/js-hmr-strategy.js +72 -73
- package/src/index.browser.d.ts +2 -2
- package/src/index.browser.js +1 -1
- package/src/index.d.ts +4 -3
- package/src/index.js +16 -5
- package/src/integrations/ghtml/ghtml-renderer.d.ts +7 -2
- package/src/integrations/ghtml/ghtml-renderer.js +33 -30
- package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
- package/src/integrations/ghtml/ghtml.constants.js +4 -0
- package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
- package/src/integrations/ghtml/ghtml.plugin.js +3 -4
- package/src/plugins/README.md +35 -0
- package/src/plugins/alias-resolver-plugin.js +17 -3
- package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
- package/src/plugins/eco-component-meta-plugin.js +27 -21
- package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
- package/src/plugins/foreign-jsx-override-plugin.js +35 -0
- package/src/plugins/integration-plugin.d.ts +145 -28
- package/src/plugins/integration-plugin.js +109 -13
- package/src/plugins/processor.d.ts +15 -2
- package/src/plugins/processor.js +16 -2
- package/src/plugins/runtime-capability.d.ts +9 -0
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/GRAPH.md +64 -98
- package/src/route-renderer/README.md +67 -46
- package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
- package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
- package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
- package/src/route-renderer/orchestration/component-render-context.js +147 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
- package/src/route-renderer/orchestration/integration-renderer.js +957 -0
- package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
- package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
- package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
- package/src/route-renderer/orchestration/render-execution.service.js +106 -0
- package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
- package/src/route-renderer/orchestration/render-output.utils.js +65 -0
- package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
- package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
- package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
- package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
- package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
- package/src/route-renderer/orchestration/template-serialization.js +45 -0
- package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
- package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
- package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
- package/src/route-renderer/route-renderer.d.ts +45 -4
- package/src/route-renderer/route-renderer.js +38 -3
- package/src/router/README.md +97 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.js +34 -0
- package/src/router/client/link-intent.test.browser.d.ts +1 -0
- package/src/router/client/link-intent.test.browser.js +43 -0
- package/src/router/client/navigation-coordinator.d.ts +149 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
- package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
- package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
- package/src/router/{fs-router.js → server/fs-router.js} +1 -1
- package/src/services/README.md +29 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
- package/src/services/assets/asset-processing-service/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/index.js +5 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
- package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/index.js +5 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
- package/src/services/assets/browser-bundle.service.d.ts +32 -0
- package/src/services/assets/browser-bundle.service.js +33 -0
- package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
- package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
- package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
- package/src/services/html/html-rewriter-provider.service.js +68 -0
- package/src/services/html/html-transformer.service.d.ts +77 -0
- package/src/services/html/html-transformer.service.js +215 -0
- package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
- package/src/services/invalidation/development-invalidation.service.js +190 -0
- package/src/services/module-loading/app-module-loader.service.d.ts +28 -0
- package/src/services/module-loading/app-module-loader.service.js +35 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
- package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
- package/src/services/module-loading/host-module-loader-registry.js +15 -0
- package/src/services/module-loading/module-loading-types.d.ts +2 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
- package/src/services/module-loading/page-module-import.service.d.ts +76 -0
- package/src/services/module-loading/page-module-import.service.js +173 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
- package/src/services/module-loading/server-module-transpiler.service.js +64 -0
- package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
- package/src/services/runtime-state/dev-graph.service.js +162 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
- package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
- package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.d.ts +50 -3
- package/src/static-site-generator/static-site-generator.js +71 -5
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
- package/src/types/public-types.js +0 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +6 -0
- package/src/utils/locals-utils.d.ts +1 -1
- package/src/utils/parse-cli-args.d.ts +4 -1
- package/src/utils/parse-cli-args.js +16 -1
- package/src/utils/resolve-work-dir.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/watchers/project-watcher.d.ts +40 -24
- package/src/watchers/project-watcher.js +129 -92
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +1 -0
- package/src/adapters/abstract/application-adapter.ts +0 -337
- package/src/adapters/abstract/router-adapter.ts +0 -30
- package/src/adapters/abstract/server-adapter.ts +0 -79
- package/src/adapters/bun/client-bridge.ts +0 -62
- package/src/adapters/bun/create-app.ts +0 -189
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.ts +0 -281
- package/src/adapters/bun/index.ts +0 -3
- package/src/adapters/bun/server-adapter.ts +0 -492
- package/src/adapters/bun/server-lifecycle.ts +0 -154
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/index.ts +0 -9
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -271
- package/src/adapters/node/server-adapter.ts +0 -561
- package/src/adapters/node/static-content-server.ts +0 -203
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
- package/src/adapters/shared/render-context.ts +0 -105
- package/src/adapters/shared/server-adapter.ts +0 -442
- package/src/adapters/shared/server-route-handler.ts +0 -166
- package/src/adapters/shared/server-static-builder.ts +0 -82
- package/src/build/build-adapter.ts +0 -132
- package/src/build/build-types.ts +0 -83
- package/src/build/esbuild-build-adapter.ts +0 -510
- package/src/config/config-builder.ts +0 -474
- package/src/constants.ts +0 -39
- package/src/create-app.ts +0 -87
- package/src/define-api-handler.js +0 -15
- package/src/define-api-handler.ts +0 -66
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -77
- package/src/eco/component-render-context.ts +0 -202
- package/src/eco/eco.ts +0 -221
- package/src/eco/eco.types.ts +0 -202
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -2
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
- package/src/hmr/client/hmr-runtime.ts +0 -121
- package/src/hmr/hmr-strategy.ts +0 -172
- package/src/hmr/hmr.test.e2e.ts +0 -75
- package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -212
- package/src/plugins/alias-resolver-plugin.ts +0 -45
- package/src/plugins/eco-component-meta-plugin.ts +0 -474
- package/src/plugins/integration-plugin.ts +0 -184
- package/src/plugins/processor.ts +0 -220
- package/src/public-types.ts +0 -1255
- package/src/route-renderer/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-graph.ts +0 -159
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/component-marker.ts +0 -117
- package/src/route-renderer/dependency-resolver.ts +0 -596
- package/src/route-renderer/html-post-processing.service.d.ts +0 -40
- package/src/route-renderer/html-post-processing.service.js +0 -86
- package/src/route-renderer/html-post-processing.service.ts +0 -103
- package/src/route-renderer/integration-renderer.d.ts +0 -339
- package/src/route-renderer/integration-renderer.js +0 -526
- package/src/route-renderer/integration-renderer.ts +0 -696
- package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
- package/src/route-renderer/marker-graph-resolver.js +0 -93
- package/src/route-renderer/marker-graph-resolver.ts +0 -153
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.ts +0 -153
- package/src/route-renderer/render-execution.service.d.ts +0 -69
- package/src/route-renderer/render-execution.service.js +0 -91
- package/src/route-renderer/render-execution.service.ts +0 -158
- package/src/route-renderer/render-preparation.service.ts +0 -358
- package/src/route-renderer/route-renderer.ts +0 -80
- package/src/router/fs-router-scanner.ts +0 -217
- package/src/router/fs-router.ts +0 -122
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
- package/src/services/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/asset-processing-service/assets.types.ts +0 -112
- package/src/services/asset-processing-service/index.d.ts +0 -3
- package/src/services/asset-processing-service/index.js +0 -3
- package/src/services/asset-processing-service/index.ts +0 -3
- package/src/services/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
- package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
- package/src/services/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/asset-processing-service/processors/index.js +0 -5
- package/src/services/asset-processing-service/processors/index.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.ts +0 -128
- package/src/services/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -359
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/watchers/project-watcher.test-helpers.ts +0 -40
- package/src/watchers/project-watcher.ts +0 -306
- /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
- /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
- /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
function createComponentFactory(options) {
|
|
2
|
+
const component2 = ((props) => options.render(props));
|
|
3
|
+
component2.config = {
|
|
4
|
+
__eco: options.__eco,
|
|
5
|
+
integration: options.integration,
|
|
6
|
+
dependencies: options.dependencies
|
|
7
|
+
};
|
|
8
|
+
return component2;
|
|
9
|
+
}
|
|
10
|
+
function component(options) {
|
|
11
|
+
return createComponentFactory(options);
|
|
12
|
+
}
|
|
13
|
+
function html(options) {
|
|
14
|
+
return createComponentFactory(options);
|
|
15
|
+
}
|
|
16
|
+
function layout(options) {
|
|
17
|
+
return createComponentFactory(options);
|
|
18
|
+
}
|
|
19
|
+
function page(options) {
|
|
20
|
+
const {
|
|
21
|
+
layout: pageLayout,
|
|
22
|
+
dependencies,
|
|
23
|
+
render,
|
|
24
|
+
staticPaths: staticPaths2,
|
|
25
|
+
staticProps: staticProps2,
|
|
26
|
+
metadata: metadata2,
|
|
27
|
+
cache,
|
|
28
|
+
requires,
|
|
29
|
+
middleware
|
|
30
|
+
} = options;
|
|
31
|
+
const pageComponent = createComponentFactory({
|
|
32
|
+
__eco: options.__eco,
|
|
33
|
+
integration: options.integration,
|
|
34
|
+
dependencies: pageLayout ? {
|
|
35
|
+
...dependencies,
|
|
36
|
+
components: [...dependencies?.components ?? [], pageLayout]
|
|
37
|
+
} : dependencies,
|
|
38
|
+
render
|
|
39
|
+
});
|
|
40
|
+
if (pageLayout && pageComponent.config) {
|
|
41
|
+
pageComponent.config.layout = pageLayout;
|
|
42
|
+
}
|
|
43
|
+
if (staticPaths2) {
|
|
44
|
+
pageComponent.staticPaths = staticPaths2;
|
|
45
|
+
}
|
|
46
|
+
if (staticProps2) {
|
|
47
|
+
pageComponent.staticProps = staticProps2;
|
|
48
|
+
}
|
|
49
|
+
if (metadata2) {
|
|
50
|
+
pageComponent.metadata = metadata2;
|
|
51
|
+
}
|
|
52
|
+
if (cache) {
|
|
53
|
+
pageComponent.cache = cache;
|
|
54
|
+
}
|
|
55
|
+
if (requires) {
|
|
56
|
+
pageComponent.requires = requires;
|
|
57
|
+
}
|
|
58
|
+
if (middleware) {
|
|
59
|
+
pageComponent.middleware = middleware;
|
|
60
|
+
}
|
|
61
|
+
return pageComponent;
|
|
62
|
+
}
|
|
63
|
+
function metadata(fn) {
|
|
64
|
+
return fn;
|
|
65
|
+
}
|
|
66
|
+
function staticPaths(fn) {
|
|
67
|
+
return fn;
|
|
68
|
+
}
|
|
69
|
+
function staticProps(fn) {
|
|
70
|
+
return fn;
|
|
71
|
+
}
|
|
72
|
+
const eco = {
|
|
73
|
+
component,
|
|
74
|
+
html,
|
|
75
|
+
layout,
|
|
76
|
+
page,
|
|
77
|
+
metadata,
|
|
78
|
+
staticPaths,
|
|
79
|
+
staticProps
|
|
80
|
+
};
|
|
81
|
+
export {
|
|
82
|
+
eco
|
|
83
|
+
};
|
package/src/eco/eco.js
CHANGED
|
@@ -1,60 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
finalizeComponentRender,
|
|
3
|
+
interceptComponentBoundary
|
|
4
|
+
} from "../route-renderer/orchestration/component-render-context.js";
|
|
5
|
+
import { isThenable } from "../route-renderer/orchestration/render-output.utils.js";
|
|
4
6
|
function createComponentFactory(options) {
|
|
5
7
|
const integrationName = options.integration ?? options.__eco?.integration;
|
|
6
8
|
const comp = ((props) => {
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
throw new Error(
|
|
19
|
-
"[ecopages] Missing component reference metadata for cross-integration marker emission."
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
const componentProps = props ?? {};
|
|
23
|
-
renderContext.propsByRef[propsRef] = componentProps;
|
|
24
|
-
let slotRef;
|
|
25
|
-
const children = componentProps.children;
|
|
26
|
-
if (typeof children === "string" && children.includes("<eco-marker")) {
|
|
27
|
-
const childMarkers = parseComponentMarkers(children);
|
|
28
|
-
if (childMarkers.length > 0) {
|
|
29
|
-
slotRef = createSlotRef(renderContext);
|
|
30
|
-
renderContext.slotChildrenByRef[slotRef] = childMarkers.map((marker) => marker.nodeId);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return createComponentMarker({
|
|
34
|
-
nodeId,
|
|
35
|
-
integration: integrationName,
|
|
36
|
-
componentRef,
|
|
37
|
-
propsRef,
|
|
38
|
-
slotRef
|
|
39
|
-
});
|
|
9
|
+
const componentProps = props ?? {};
|
|
10
|
+
const renderInline = () => finalizeComponentRender(comp, options.render(props));
|
|
11
|
+
const boundaryRender = interceptComponentBoundary({
|
|
12
|
+
component: comp,
|
|
13
|
+
props: componentProps,
|
|
14
|
+
targetIntegration: integrationName
|
|
15
|
+
});
|
|
16
|
+
if (isThenable(boundaryRender)) {
|
|
17
|
+
return boundaryRender.then(
|
|
18
|
+
(resolvedBoundaryRender) => resolvedBoundaryRender !== void 0 ? resolvedBoundaryRender : renderInline()
|
|
19
|
+
);
|
|
40
20
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (lazyTriggers && lazyTriggers.length > 0) {
|
|
44
|
-
const triggerId = lazyTriggers[0].triggerId;
|
|
45
|
-
if (isThenable(content)) {
|
|
46
|
-
return content.then((resolvedContent) => addTriggerAttribute(resolvedContent, triggerId));
|
|
47
|
-
}
|
|
48
|
-
return addTriggerAttribute(content, triggerId);
|
|
21
|
+
if (boundaryRender !== void 0) {
|
|
22
|
+
return boundaryRender;
|
|
49
23
|
}
|
|
50
|
-
|
|
51
|
-
if (lazyGroups && lazyGroups.length > 0) {
|
|
52
|
-
if (isThenable(content)) {
|
|
53
|
-
return content.then((resolvedContent) => wrapWithScriptsInjector(resolvedContent, lazyGroups));
|
|
54
|
-
}
|
|
55
|
-
return wrapWithScriptsInjector(content, lazyGroups);
|
|
56
|
-
}
|
|
57
|
-
return content;
|
|
24
|
+
return renderInline();
|
|
58
25
|
});
|
|
59
26
|
comp.config = {
|
|
60
27
|
__eco: options.__eco,
|
|
@@ -66,20 +33,26 @@ function createComponentFactory(options) {
|
|
|
66
33
|
function component(options) {
|
|
67
34
|
return createComponentFactory(options);
|
|
68
35
|
}
|
|
36
|
+
function html(options) {
|
|
37
|
+
return createComponentFactory(options);
|
|
38
|
+
}
|
|
39
|
+
function layout(options) {
|
|
40
|
+
return createComponentFactory(options);
|
|
41
|
+
}
|
|
69
42
|
function page(options) {
|
|
70
|
-
const { layout, dependencies, render, staticPaths: staticPaths2, staticProps: staticProps2, metadata: metadata2, cache, requires, middleware } = options;
|
|
43
|
+
const { layout: layout2, dependencies, render, staticPaths: staticPaths2, staticProps: staticProps2, metadata: metadata2, cache, requires, middleware } = options;
|
|
71
44
|
const componentOptions = {
|
|
72
45
|
__eco: options.__eco,
|
|
73
46
|
integration: options.integration,
|
|
74
|
-
dependencies:
|
|
47
|
+
dependencies: layout2 ? {
|
|
75
48
|
...dependencies,
|
|
76
|
-
components: [...dependencies?.components || [],
|
|
49
|
+
components: [...dependencies?.components || [], layout2]
|
|
77
50
|
} : dependencies,
|
|
78
51
|
render
|
|
79
52
|
};
|
|
80
53
|
const pageComponent = createComponentFactory(componentOptions);
|
|
81
|
-
if (
|
|
82
|
-
pageComponent.config.layout =
|
|
54
|
+
if (layout2 && pageComponent.config) {
|
|
55
|
+
pageComponent.config.layout = layout2;
|
|
83
56
|
}
|
|
84
57
|
if (staticPaths2) pageComponent.staticPaths = staticPaths2;
|
|
85
58
|
if (staticProps2) pageComponent.staticProps = staticProps2;
|
|
@@ -100,6 +73,8 @@ function staticProps(fn) {
|
|
|
100
73
|
}
|
|
101
74
|
const eco = {
|
|
102
75
|
component,
|
|
76
|
+
html,
|
|
77
|
+
layout,
|
|
103
78
|
page,
|
|
104
79
|
metadata,
|
|
105
80
|
staticPaths,
|
package/src/eco/eco.types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Type definitions for the eco namespace API
|
|
3
3
|
* @module
|
|
4
4
|
*/
|
|
5
|
-
import type { DependencyLazyTrigger, EcoComponent, EcoComponentDependencies, EcoInjectedMeta, EcoPagesElement, GetMetadata, GetStaticPaths, GetStaticProps, Middleware, RequestLocals, RequestPageContext } from '../public-types.js';
|
|
5
|
+
import type { DependencyLazyTrigger, EcoComponent, EcoComponentDependencies, EcoHtmlComponent, EcoInjectedMeta, EcoLayoutComponent, EcoPageLayoutComponent, EcoPagesElement, GetMetadata, GetStaticPaths, GetStaticProps, HtmlTemplateProps, LayoutProps, Middleware, RequestLocals, RequestPageContext } from '../types/public-types.js';
|
|
6
6
|
import type { CacheStrategy } from '../services/cache/cache.types.js';
|
|
7
7
|
type WithRequiredLocals<K extends keyof RequestLocals> = Omit<RequestLocals, K> & {
|
|
8
8
|
[P in K]-?: Exclude<RequestLocals[P], null | undefined>;
|
|
@@ -26,6 +26,8 @@ export interface ComponentOptions<P, E = EcoPagesElement> {
|
|
|
26
26
|
dependencies?: EcoComponentDependencies;
|
|
27
27
|
render: (props: P) => E | Promise<E>;
|
|
28
28
|
}
|
|
29
|
+
export type HtmlOptions<E = EcoPagesElement> = ComponentOptions<HtmlTemplateProps, E>;
|
|
30
|
+
export type LayoutOptions<E = EcoPagesElement> = ComponentOptions<LayoutProps<E>, E>;
|
|
29
31
|
/**
|
|
30
32
|
* Base options shared by all page variants
|
|
31
33
|
*/
|
|
@@ -34,9 +36,7 @@ export interface PageOptionsBase<T, E = EcoPagesElement> {
|
|
|
34
36
|
__eco?: EcoInjectedMeta;
|
|
35
37
|
integration?: string;
|
|
36
38
|
dependencies?: EcoComponentDependencies;
|
|
37
|
-
layout?:
|
|
38
|
-
children: E;
|
|
39
|
-
} & Partial<RequestPageContext>>;
|
|
39
|
+
layout?: EcoPageLayoutComponent<E>;
|
|
40
40
|
/**
|
|
41
41
|
* Define static paths for dynamic routes (e.g., [slug].tsx).
|
|
42
42
|
* Returns all possible paths that should be pre-rendered at build time.
|
|
@@ -139,6 +139,14 @@ export interface Eco {
|
|
|
139
139
|
* @template E - Element/return type (EcoPagesElement for Kita, ReactNode for React)
|
|
140
140
|
*/
|
|
141
141
|
component: <P = {}, E = EcoPagesElement>(options: ComponentOptions<P, E>) => EcoComponent<P, E>;
|
|
142
|
+
/**
|
|
143
|
+
* Create a document shell component for the HTML wrapper.
|
|
144
|
+
*/
|
|
145
|
+
html: <E = EcoPagesElement>(options: HtmlOptions<E>) => EcoHtmlComponent<E>;
|
|
146
|
+
/**
|
|
147
|
+
* Create a route layout component.
|
|
148
|
+
*/
|
|
149
|
+
layout: <E = EcoPagesElement>(options: LayoutOptions<E>) => EcoLayoutComponent<E>;
|
|
142
150
|
/**
|
|
143
151
|
* Create a page component with type-safe props from getStaticProps.
|
|
144
152
|
* Returns an EcoPageComponent with attached staticPaths, staticProps, and metadata.
|
package/src/eco/eco.utils.d.ts
CHANGED
|
@@ -1,40 +1 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Returns `true` when `value` is a thenable (Promise-like) object.
|
|
4
|
-
*
|
|
5
|
-
* Used to transparently handle both synchronous and asynchronous component
|
|
6
|
-
* render results without requiring every caller to branch on `instanceof Promise`.
|
|
7
|
-
*
|
|
8
|
-
* @typeParam T Expected resolved type of the thenable.
|
|
9
|
-
*/
|
|
10
|
-
export declare function isThenable<T>(value: unknown): value is PromiseLike<T>;
|
|
11
|
-
/**
|
|
12
|
-
* Injects `data-eco-trigger` into the first real HTML element opening tag of
|
|
13
|
-
* a component's rendered output string.
|
|
14
|
-
*
|
|
15
|
-
* The scan skips over leading whitespace, HTML comments (`<!-- -->`), CDATA
|
|
16
|
-
* sections, and doctype declarations so that the attribute is always placed on
|
|
17
|
-
* the first actual element — not spurious markup that can precede it.
|
|
18
|
-
*
|
|
19
|
-
* The insertion point is the end of the element's tag name, before any existing
|
|
20
|
-
* attributes or the closing `>`, which produces output like:
|
|
21
|
-
*
|
|
22
|
-
* ```html
|
|
23
|
-
* <my-element data-eco-trigger="eco-trigger-abc123" class="foo">…</my-element>
|
|
24
|
-
* ```
|
|
25
|
-
*
|
|
26
|
-
* When no eligible opening tag is found the original string is returned
|
|
27
|
-
* unchanged so callers never receive a broken fragment.
|
|
28
|
-
*
|
|
29
|
-
* @param content Rendered HTML string (or any value coercible to string).
|
|
30
|
-
* @param triggerId Stable trigger identifier produced by `buildResolvedLazyTriggers`.
|
|
31
|
-
*/
|
|
32
|
-
export declare function addTriggerAttribute(content: unknown, triggerId: string): string;
|
|
33
|
-
/**
|
|
34
|
-
* Wraps rendered component output in a `<scripts-injector>` element that
|
|
35
|
-
* carries an inline injector map for the legacy (non-global-injector) path.
|
|
36
|
-
*
|
|
37
|
-
* @param content Rendered component HTML.
|
|
38
|
-
* @param lazyGroups Resolved lazy script groups attached to the component config.
|
|
39
|
-
*/
|
|
40
|
-
export declare function wrapWithScriptsInjector(content: unknown, lazyGroups: NonNullable<EcoComponent['config']>['_resolvedLazyScripts']): string;
|
|
1
|
+
export { addTriggerAttribute, isThenable, wrapWithScriptsInjector, } from '../route-renderer/orchestration/render-output.utils.js';
|
package/src/eco/eco.utils.js
CHANGED
|
@@ -1,38 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const str = String(content);
|
|
7
|
-
let i = 0;
|
|
8
|
-
while (i < str.length) {
|
|
9
|
-
if (str[i] !== "<") {
|
|
10
|
-
i++;
|
|
11
|
-
continue;
|
|
12
|
-
}
|
|
13
|
-
const next = str[i + 1];
|
|
14
|
-
if (next === "!" || next === "?") {
|
|
15
|
-
const end = str.indexOf(">", i);
|
|
16
|
-
if (end === -1) break;
|
|
17
|
-
i = end + 1;
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
if (next && /[a-zA-Z]/.test(next)) {
|
|
21
|
-
const tagSlice = str.slice(i + 1);
|
|
22
|
-
const nameEnd = tagSlice.search(/[\s/>]/);
|
|
23
|
-
if (nameEnd === -1) break;
|
|
24
|
-
const insertAt = i + 1 + nameEnd;
|
|
25
|
-
return `${str.slice(0, insertAt)} data-eco-trigger="${triggerId}"${str.slice(insertAt)}`;
|
|
26
|
-
}
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
return str;
|
|
30
|
-
}
|
|
31
|
-
function wrapWithScriptsInjector(content, lazyGroups) {
|
|
32
|
-
const wrappedContent = String(content);
|
|
33
|
-
const injectorMapScript = buildInjectorMapScript(lazyGroups ?? []);
|
|
34
|
-
return `<scripts-injector><script type="ecopages/injector-map">${injectorMapScript}<\/script>${wrappedContent}<\/scripts-injector>`;
|
|
35
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
addTriggerAttribute,
|
|
3
|
+
isThenable,
|
|
4
|
+
wrapWithScriptsInjector
|
|
5
|
+
} from "../route-renderer/orchestration/render-output.utils.js";
|
|
36
6
|
export {
|
|
37
7
|
addTriggerAttribute,
|
|
38
8
|
isThenable,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ResolvedLazyTrigger } from '../public-types.js';
|
|
1
|
+
import type { ResolvedLazyTrigger } from '../types/public-types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Serializes resolved lazy triggers into a JSON string safe for embedding
|
|
4
4
|
* inside an inline `<script type="ecopages/global-injector-map">` tag.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# HMR Layer
|
|
2
|
+
|
|
3
|
+
This directory contains the framework-owned hot-update strategy contracts used by runtime adapters and integrations.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
The HMR layer separates change classification from update execution.
|
|
8
|
+
|
|
9
|
+
It is responsible for:
|
|
10
|
+
|
|
11
|
+
- defining the shared HMR manager and strategy contracts
|
|
12
|
+
- letting integrations contribute framework-specific update strategies
|
|
13
|
+
- keeping adapter transports independent from update policy
|
|
14
|
+
|
|
15
|
+
## How It Fits
|
|
16
|
+
|
|
17
|
+
1. `ProjectWatcher` observes file changes.
|
|
18
|
+
2. `DevelopmentInvalidationService` classifies the change.
|
|
19
|
+
3. The active HMR manager selects a strategy.
|
|
20
|
+
4. The strategy coordinates browser rebuilds, metadata reloads, and client broadcasts.
|
|
21
|
+
|
|
22
|
+
## Design Rule
|
|
23
|
+
|
|
24
|
+
Generic invalidation policy belongs in core services.
|
|
25
|
+
Framework-specific update behavior belongs in HMR strategies.
|
|
26
|
+
Runtime-specific WebSocket or event-stream transport belongs in adapters.
|
|
@@ -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 })) {
|
|
35
37
|
} else {
|
|
36
38
|
location.reload();
|
|
37
39
|
}
|
|
@@ -55,20 +57,41 @@
|
|
|
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
|
+
async function waitForNavigationToSettle(navigationRuntime) {
|
|
75
|
+
if (!navigationRuntime.hasPendingNavigationTransaction()) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
await new Promise((resolve) => {
|
|
79
|
+
const startedAt = performance.now();
|
|
80
|
+
const timeoutMs = 2e3;
|
|
81
|
+
const poll = () => {
|
|
82
|
+
if (!navigationRuntime.hasPendingNavigationTransaction()) {
|
|
83
|
+
resolve();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (performance.now() - startedAt >= timeoutMs) {
|
|
87
|
+
resolve();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
requestAnimationFrame(poll);
|
|
91
|
+
};
|
|
92
|
+
requestAnimationFrame(poll);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
72
95
|
function refreshStylesheet(path) {
|
|
73
96
|
const filename = path.split("/").pop() || "";
|
|
74
97
|
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
|
+
});
|