@ecopages/core 0.2.0-alpha.1 → 0.2.0-alpha.11
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 +16 -64
- package/README.md +210 -13
- package/package.json +88 -62
- 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 +163 -56
- 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 +180 -89
- package/src/adapters/node/server-adapter.d.ts +4 -33
- package/src/adapters/node/server-adapter.js +39 -100
- 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 +9 -5
- package/src/adapters/shared/fs-server-response-matcher.js +13 -8
- 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 +160 -3
- package/src/build/build-adapter.js +494 -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 -18
- package/src/config/config-builder.js +258 -48
- 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/component-render-context.d.ts +2 -2
- package/src/eco/component-render-context.js +33 -16
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +83 -0
- package/src/eco/eco.js +91 -16
- package/src/eco/eco.types.d.ts +12 -4
- package/src/eco/eco.utils.d.ts +1 -1
- 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 +8 -7
- 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 +2 -2
- package/src/integrations/ghtml/ghtml-renderer.js +3 -1
- package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -2
- package/src/integrations/ghtml/ghtml.plugin.js +2 -2
- 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/integration-plugin.d.ts +48 -9
- package/src/plugins/integration-plugin.js +39 -2
- 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 +18 -22
- package/src/route-renderer/README.md +15 -26
- package/src/route-renderer/{component-graph-executor.d.ts → component-graph/component-graph-executor.d.ts} +3 -2
- package/src/route-renderer/{component-graph-executor.js → component-graph/component-graph-executor.js} +2 -3
- package/src/route-renderer/{component-graph.d.ts → component-graph/component-graph.d.ts} +13 -2
- package/src/route-renderer/{component-graph.js → component-graph/component-graph.js} +26 -4
- package/src/route-renderer/component-graph/component-reference.d.ts +11 -0
- package/src/route-renderer/component-graph/component-reference.js +39 -0
- package/src/route-renderer/{marker-graph-resolver.d.ts → component-graph/marker-graph-resolver.d.ts} +9 -6
- package/src/route-renderer/{marker-graph-resolver.js → component-graph/marker-graph-resolver.js} +36 -12
- package/src/route-renderer/{integration-renderer.d.ts → orchestration/integration-renderer.d.ts} +65 -13
- package/src/route-renderer/{integration-renderer.js → orchestration/integration-renderer.js} +206 -30
- package/src/route-renderer/{render-execution.service.d.ts → orchestration/render-execution.service.d.ts} +42 -6
- package/src/route-renderer/orchestration/render-execution.service.js +191 -0
- package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +13 -4
- package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +95 -5
- 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} +18 -4
- package/src/route-renderer/page-loading/page-module-loader.d.ts +89 -0
- package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +38 -14
- package/src/route-renderer/route-renderer.d.ts +41 -4
- package/src/route-renderer/route-renderer.js +32 -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} +8 -7
- 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 +25 -0
- package/src/services/module-loading/app-module-loader.service.js +31 -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 +22 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +179 -0
- package/src/services/module-loading/page-module-import.service.d.ts +75 -0
- package/src/services/module-loading/page-module-import.service.js +161 -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 +55 -3
- package/src/static-site-generator/static-site-generator.js +86 -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} +73 -17
- package/src/types/public-types.js +0 -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 +105 -68
- 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.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/__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.ts +0 -84
- package/src/route-renderer/component-graph.ts +0 -159
- 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.ts +0 -696
- 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.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/route-renderer/{component-marker.d.ts → component-graph/component-marker.d.ts} +0 -0
- /package/src/route-renderer/{component-marker.js → component-graph/component-marker.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
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.
|
|
@@ -21,23 +24,7 @@ export interface JsHmrContext {
|
|
|
21
24
|
* Map of bare specifiers to vendor URLs for import resolution.
|
|
22
25
|
*/
|
|
23
26
|
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;
|
|
27
|
+
getEntrypointDependencyGraph(): EntrypointDependencyGraph;
|
|
41
28
|
/**
|
|
42
29
|
* Directory where HMR bundles are written.
|
|
43
30
|
*/
|
|
@@ -50,23 +37,47 @@ export interface JsHmrContext {
|
|
|
50
37
|
* Absolute path to the source directory.
|
|
51
38
|
*/
|
|
52
39
|
getSrcDir(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Absolute path to the pages directory.
|
|
42
|
+
*/
|
|
43
|
+
getPagesDir(): string;
|
|
44
|
+
/**
|
|
45
|
+
* Absolute path to the layouts directory.
|
|
46
|
+
*/
|
|
47
|
+
getLayoutsDir(): string;
|
|
48
|
+
/**
|
|
49
|
+
* All configured route-template extensions across integrations.
|
|
50
|
+
*/
|
|
51
|
+
getTemplateExtensions(): string[];
|
|
52
|
+
/**
|
|
53
|
+
* Browser bundler used to rebuild changed entrypoints.
|
|
54
|
+
*/
|
|
55
|
+
getBrowserBundleService(): BrowserBundleExecutor;
|
|
56
|
+
/**
|
|
57
|
+
* Returns whether a watched entrypoint should be rebuilt by the generic JS strategy.
|
|
58
|
+
*
|
|
59
|
+
* @remarks
|
|
60
|
+
* Integrations with higher-priority HMR strategies can use this to keep the
|
|
61
|
+
* generic JS strategy from overwriting their emitted entrypoints when a shared
|
|
62
|
+
* dependency changes.
|
|
63
|
+
*/
|
|
64
|
+
shouldProcessEntrypoint?(entrypointPath: string): boolean;
|
|
53
65
|
}
|
|
54
66
|
/**
|
|
55
67
|
* Strategy for handling JavaScript/TypeScript file changes with hot reloading.
|
|
56
68
|
*
|
|
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
69
|
* The processing steps are:
|
|
61
70
|
* 1. Check if any entrypoints are registered
|
|
62
|
-
* 2. Rebuild
|
|
63
|
-
*
|
|
71
|
+
* 2. Rebuild impacted entrypoints, or all watched entrypoints when no runtime
|
|
72
|
+
* dependency graph is available
|
|
73
|
+
* 3. Emit rebuilt entrypoint bundles for browser delivery
|
|
64
74
|
* 4. Inject generic HMR boilerplate
|
|
65
75
|
* 5. Broadcast update events for each rebuilt entrypoint
|
|
66
76
|
*
|
|
67
77
|
* @remarks
|
|
68
|
-
*
|
|
69
|
-
*
|
|
78
|
+
* Node can provide dependency-graph metadata, so this strategy can rebuild only
|
|
79
|
+
* the entrypoints impacted by a changed dependency. Runtimes that do not expose
|
|
80
|
+
* that metadata intentionally keep the rebuild-all fallback.
|
|
70
81
|
*
|
|
71
82
|
* @see https://bun.sh/docs/runtime/transpiler
|
|
72
83
|
*
|
|
@@ -83,8 +94,8 @@ export interface JsHmrContext {
|
|
|
83
94
|
* ```
|
|
84
95
|
*/
|
|
85
96
|
export declare class JsHmrStrategy extends HmrStrategy {
|
|
97
|
+
readonly type: 25;
|
|
86
98
|
private context;
|
|
87
|
-
readonly type = HmrStrategyType.SCRIPT;
|
|
88
99
|
constructor(context: JsHmrContext);
|
|
89
100
|
/**
|
|
90
101
|
* Determines if the file is a JS/TS file that could affect registered entrypoints.
|
|
@@ -105,32 +116,24 @@ export declare class JsHmrStrategy extends HmrStrategy {
|
|
|
105
116
|
* @remarks
|
|
106
117
|
* If runtime-specific dependency graph hooks are unavailable, this strategy
|
|
107
118
|
* falls back to rebuilding all watched entrypoints.
|
|
119
|
+
* When multiple entrypoints are impacted they are bundled in a single esbuild
|
|
120
|
+
* invocation to share AST parsing and chunk deduplication.
|
|
108
121
|
* @returns Action to broadcast update events
|
|
109
122
|
*/
|
|
110
123
|
process(filePath: string): Promise<HmrAction>;
|
|
111
124
|
/**
|
|
112
|
-
* Bundles
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* @param outputUrl - URL path for the bundled file
|
|
116
|
-
* @returns True if bundling was successful
|
|
125
|
+
* Bundles one or more entrypoints in a single esbuild invocation.
|
|
126
|
+
* Uses the source directory as the output base so that the directory structure
|
|
127
|
+
* is preserved under the HMR dist folder.
|
|
117
128
|
*/
|
|
118
|
-
private
|
|
129
|
+
private bundleEntrypoints;
|
|
119
130
|
/**
|
|
120
|
-
* Processes bundled output
|
|
131
|
+
* Processes bundled output and determines whether the browser can hot-accept
|
|
132
|
+
* the update or must fall back to a full reload.
|
|
121
133
|
*
|
|
122
134
|
* @param filepath - Path to the bundled output file
|
|
123
135
|
* @param url - URL path for the bundled file
|
|
124
136
|
* @returns True if processing was successful and update should be broadcast
|
|
125
137
|
*/
|
|
126
138
|
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
139
|
}
|
|
@@ -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,10 +23,25 @@ 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 isRouteTemplate = filePath.startsWith(this.context.getPagesDir()) || filePath.startsWith(this.context.getLayoutsDir());
|
|
27
|
+
const isIntegrationTemplate = isRouteTemplate && this.context.getTemplateExtensions().some((extension) => filePath.endsWith(extension));
|
|
26
28
|
if (watchedFiles.size === 0) {
|
|
27
29
|
return false;
|
|
28
30
|
}
|
|
29
|
-
|
|
31
|
+
if (!isJsTs || !isInSrc) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (isIntegrationTemplate) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (watchedFiles.has(filePath)) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
const entrypointDependencyGraph = this.context.getEntrypointDependencyGraph();
|
|
41
|
+
if (entrypointDependencyGraph.supportsSelectiveInvalidation()) {
|
|
42
|
+
return entrypointDependencyGraph.getDependencyEntrypoints(filePath).size > 0;
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
30
45
|
}
|
|
31
46
|
/**
|
|
32
47
|
* Processes a file change by rebuilding affected entrypoints.
|
|
@@ -36,6 +51,8 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
36
51
|
* @remarks
|
|
37
52
|
* If runtime-specific dependency graph hooks are unavailable, this strategy
|
|
38
53
|
* falls back to rebuilding all watched entrypoints.
|
|
54
|
+
* When multiple entrypoints are impacted they are bundled in a single esbuild
|
|
55
|
+
* invocation to share AST parsing and chunk deduplication.
|
|
39
56
|
* @returns Action to broadcast update events
|
|
40
57
|
*/
|
|
41
58
|
async process(filePath) {
|
|
@@ -45,24 +62,37 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
45
62
|
appLogger.debug(`[JsHmrStrategy] No watched files to rebuild`);
|
|
46
63
|
return { type: "none" };
|
|
47
64
|
}
|
|
48
|
-
const
|
|
49
|
-
let reloadRequired = false;
|
|
50
|
-
const dependencyHits = this.context.getDependencyEntrypoints?.(filePath) ?? /* @__PURE__ */ new Set();
|
|
65
|
+
const dependencyHits = this.context.getEntrypointDependencyGraph().getDependencyEntrypoints(filePath);
|
|
51
66
|
const hasDependencyHit = dependencyHits.size > 0;
|
|
52
67
|
const impactedEntrypoints = hasDependencyHit ? Array.from(dependencyHits).filter((entrypoint) => watchedFiles.has(entrypoint)) : Array.from(watchedFiles.keys());
|
|
68
|
+
const buildableEntrypoints = impactedEntrypoints.filter(
|
|
69
|
+
(entrypoint) => this.context.shouldProcessEntrypoint?.(entrypoint) ?? true
|
|
70
|
+
);
|
|
53
71
|
if (!hasDependencyHit) {
|
|
54
72
|
appLogger.debug("[JsHmrStrategy] Dependency graph miss, rebuilding all watched entrypoints");
|
|
55
73
|
}
|
|
56
|
-
|
|
74
|
+
if (buildableEntrypoints.length === 0) {
|
|
75
|
+
return { type: "none" };
|
|
76
|
+
}
|
|
77
|
+
const buildResult = await this.bundleEntrypoints(buildableEntrypoints);
|
|
78
|
+
if (!buildResult.success) {
|
|
79
|
+
return { type: "none" };
|
|
80
|
+
}
|
|
81
|
+
const updates = [];
|
|
82
|
+
let reloadRequired = false;
|
|
83
|
+
for (const entrypoint of buildableEntrypoints) {
|
|
57
84
|
const outputUrl = watchedFiles.get(entrypoint);
|
|
58
|
-
if (!outputUrl)
|
|
59
|
-
|
|
85
|
+
if (!outputUrl) continue;
|
|
86
|
+
if (buildResult.dependencies) {
|
|
87
|
+
const entrypointDeps = buildResult.dependencies.get(path.resolve(entrypoint)) ?? [];
|
|
88
|
+
this.context.getEntrypointDependencyGraph().setEntrypointDependencies(entrypoint, entrypointDeps);
|
|
60
89
|
}
|
|
61
|
-
const
|
|
90
|
+
const srcDir = this.context.getSrcDir();
|
|
91
|
+
const relativePath = path.relative(srcDir, entrypoint);
|
|
92
|
+
const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
|
|
93
|
+
const outputPath = path.join(this.context.getDistDir(), relativePathJs);
|
|
94
|
+
const result = await this.processOutput(outputPath, outputUrl);
|
|
62
95
|
if (result.success) {
|
|
63
|
-
if (result.dependencies && this.context.setEntrypointDependencies) {
|
|
64
|
-
this.context.setEntrypointDependencies(entrypoint, result.dependencies);
|
|
65
|
-
}
|
|
66
96
|
updates.push(outputUrl);
|
|
67
97
|
if (result.requiresReload) {
|
|
68
98
|
reloadRequired = true;
|
|
@@ -74,18 +104,14 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
74
104
|
appLogger.debug(`[JsHmrStrategy] Full reload required (no HMR accept found)`);
|
|
75
105
|
return {
|
|
76
106
|
type: "broadcast",
|
|
77
|
-
events: [
|
|
78
|
-
{
|
|
79
|
-
type: "reload"
|
|
80
|
-
}
|
|
81
|
-
]
|
|
107
|
+
events: [{ type: "reload" }]
|
|
82
108
|
};
|
|
83
109
|
}
|
|
84
110
|
return {
|
|
85
111
|
type: "broadcast",
|
|
86
|
-
events: updates.map((
|
|
112
|
+
events: updates.map((p) => ({
|
|
87
113
|
type: "update",
|
|
88
|
-
path:
|
|
114
|
+
path: p,
|
|
89
115
|
timestamp: Date.now()
|
|
90
116
|
}))
|
|
91
117
|
};
|
|
@@ -93,44 +119,40 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
93
119
|
return { type: "none" };
|
|
94
120
|
}
|
|
95
121
|
/**
|
|
96
|
-
* Bundles
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* @param outputUrl - URL path for the bundled file
|
|
100
|
-
* @returns True if bundling was successful
|
|
122
|
+
* Bundles one or more entrypoints in a single esbuild invocation.
|
|
123
|
+
* Uses the source directory as the output base so that the directory structure
|
|
124
|
+
* is preserved under the HMR dist folder.
|
|
101
125
|
*/
|
|
102
|
-
async
|
|
126
|
+
async bundleEntrypoints(entrypoints) {
|
|
103
127
|
try {
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const outputPath = path.join(this.context.getDistDir(), relativePathJs);
|
|
108
|
-
const result = await defaultBuildAdapter.build({
|
|
109
|
-
entrypoints: [entrypointPath],
|
|
128
|
+
const result = await this.context.getBrowserBundleService().bundle({
|
|
129
|
+
profile: "hmr-entrypoint",
|
|
130
|
+
entrypoints,
|
|
110
131
|
outdir: this.context.getDistDir(),
|
|
111
|
-
|
|
112
|
-
|
|
132
|
+
outbase: this.context.getSrcDir(),
|
|
133
|
+
naming: "[dir]/[name]",
|
|
113
134
|
plugins: this.context.getPlugins(),
|
|
114
|
-
minify: false
|
|
115
|
-
external: ["react", "react-dom"]
|
|
135
|
+
minify: false
|
|
116
136
|
});
|
|
117
137
|
if (!result.success) {
|
|
118
|
-
appLogger.error(
|
|
119
|
-
return { success: false
|
|
138
|
+
appLogger.error("[JsHmrStrategy] Batched build failed:", result.logs);
|
|
139
|
+
return { success: false };
|
|
120
140
|
}
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
141
|
+
const dependencies = /* @__PURE__ */ new Map();
|
|
142
|
+
if (result.dependencyGraph?.entrypoints) {
|
|
143
|
+
for (const [entrypoint, deps] of Object.entries(result.dependencyGraph.entrypoints)) {
|
|
144
|
+
dependencies.set(path.resolve(entrypoint), deps);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { success: true, dependencies };
|
|
127
148
|
} catch (error) {
|
|
128
|
-
appLogger.error(
|
|
129
|
-
return { success: false
|
|
149
|
+
appLogger.error("[JsHmrStrategy] Error in batched build:", error);
|
|
150
|
+
return { success: false };
|
|
130
151
|
}
|
|
131
152
|
}
|
|
132
153
|
/**
|
|
133
|
-
* Processes bundled output
|
|
154
|
+
* Processes bundled output and determines whether the browser can hot-accept
|
|
155
|
+
* the update or must fall back to a full reload.
|
|
134
156
|
*
|
|
135
157
|
* @param filepath - Path to the bundled output file
|
|
136
158
|
* @param url - URL path for the bundled file
|
|
@@ -138,12 +160,10 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
138
160
|
*/
|
|
139
161
|
async processOutput(filepath, url) {
|
|
140
162
|
try {
|
|
141
|
-
|
|
163
|
+
const code = await fileSystem.readFile(filepath);
|
|
142
164
|
if (code.includes("/* [ecopages] hmr */")) {
|
|
143
165
|
return { success: true, requiresReload: !code.includes("import.meta.hot.accept") };
|
|
144
166
|
}
|
|
145
|
-
code = this.replaceBareSpecifiers(code);
|
|
146
|
-
await fileSystem.writeAsync(filepath, code);
|
|
147
167
|
appLogger.debug(`[JsHmrStrategy] Processed ${url}`);
|
|
148
168
|
const hasHmrAccept = code.includes("import.meta.hot.accept");
|
|
149
169
|
return { success: true, requiresReload: !hasHmrAccept };
|
|
@@ -152,27 +172,6 @@ class JsHmrStrategy extends HmrStrategy {
|
|
|
152
172
|
return { success: false, requiresReload: false };
|
|
153
173
|
}
|
|
154
174
|
}
|
|
155
|
-
/**
|
|
156
|
-
* Replaces bare specifiers with vendor URLs.
|
|
157
|
-
*
|
|
158
|
-
* Handles both static imports and dynamic imports.
|
|
159
|
-
*
|
|
160
|
-
* @param code - The bundled code to transform
|
|
161
|
-
* @returns The transformed code with vendor URLs
|
|
162
|
-
*/
|
|
163
|
-
replaceBareSpecifiers(code) {
|
|
164
|
-
const specifierMap = this.context.getSpecifierMap();
|
|
165
|
-
if (specifierMap.size === 0) {
|
|
166
|
-
return code;
|
|
167
|
-
}
|
|
168
|
-
let result = code;
|
|
169
|
-
for (const [bareSpec, vendorUrl] of specifierMap.entries()) {
|
|
170
|
-
const escaped = bareSpec.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
171
|
-
result = result.replace(new RegExp(`from\\s*["']${escaped}["']`, "g"), `from "${vendorUrl}"`);
|
|
172
|
-
result = result.replace(new RegExp(`import\\(["']${escaped}["']\\)`, "g"), `import("${vendorUrl}")`);
|
|
173
|
-
}
|
|
174
|
-
return result;
|
|
175
|
-
}
|
|
176
175
|
}
|
|
177
176
|
export {
|
|
178
177
|
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
package/src/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
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
3
|
export { eco } from './eco/eco.js';
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
4
|
+
export { defineApiHandler, defineGroupHandler, type GroupHandler } from './adapters/shared/define-api-handler.js';
|
|
5
|
+
export { createEcoBuildPluginFromSourceTransform, createVitePluginsFromAppSourceTransforms, getAppSourceTransforms, createVitePluginFromSourceTransform, normalizeTransformId, type EcoSourceTransform, type EcoSourceTransformResult, type EcoViteCompatiblePlugin, } from './plugins/source-transform.js';
|
|
6
|
+
export { createEcoComponentMetaTransform } from './plugins/eco-component-meta-plugin.js';
|
package/src/index.js
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import { eco } from "./eco/eco.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { defineApiHandler, defineGroupHandler } from "./adapters/shared/define-api-handler.js";
|
|
3
|
+
import {
|
|
4
|
+
createEcoBuildPluginFromSourceTransform,
|
|
5
|
+
createVitePluginsFromAppSourceTransforms,
|
|
6
|
+
getAppSourceTransforms,
|
|
7
|
+
createVitePluginFromSourceTransform,
|
|
8
|
+
normalizeTransformId
|
|
9
|
+
} from "./plugins/source-transform.js";
|
|
10
|
+
import { createEcoComponentMetaTransform } from "./plugins/eco-component-meta-plugin.js";
|
|
4
11
|
export {
|
|
5
|
-
|
|
6
|
-
|
|
12
|
+
createEcoBuildPluginFromSourceTransform,
|
|
13
|
+
createEcoComponentMetaTransform,
|
|
14
|
+
createVitePluginFromSourceTransform,
|
|
15
|
+
createVitePluginsFromAppSourceTransforms,
|
|
7
16
|
defineApiHandler,
|
|
8
17
|
defineGroupHandler,
|
|
9
|
-
eco
|
|
18
|
+
eco,
|
|
19
|
+
getAppSourceTransforms,
|
|
20
|
+
normalizeTransformId
|
|
10
21
|
};
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* This module contains the ghtml renderer
|
|
3
3
|
* @module
|
|
4
4
|
*/
|
|
5
|
-
import type { EcoComponent, EcoPagesElement, IntegrationRendererRenderOptions, RouteRendererBody } from '../../public-types.js';
|
|
6
|
-
import { IntegrationRenderer, type RenderToResponseContext } from '../../route-renderer/integration-renderer.js';
|
|
5
|
+
import type { EcoComponent, EcoPagesElement, IntegrationRendererRenderOptions, RouteRendererBody } from '../../types/public-types.js';
|
|
6
|
+
import { IntegrationRenderer, type RenderToResponseContext } from '../../route-renderer/orchestration/integration-renderer.js';
|
|
7
7
|
/**
|
|
8
8
|
* A renderer for the ghtml integration.
|
|
9
9
|
* It renders a page using the HtmlTemplate and Page components.
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
IntegrationRenderer
|
|
3
|
+
} from "../../route-renderer/orchestration/integration-renderer.js";
|
|
2
4
|
import { GHTML_PLUGIN_NAME } from "./ghtml.plugin.js";
|
|
3
5
|
class GhtmlRenderer extends IntegrationRenderer {
|
|
4
6
|
name = GHTML_PLUGIN_NAME;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IntegrationPlugin, type IntegrationPluginConfig } from '../../plugins/integration-plugin';
|
|
2
|
-
import { GhtmlRenderer } from './ghtml-renderer';
|
|
1
|
+
import { IntegrationPlugin, type IntegrationPluginConfig } from '../../plugins/integration-plugin.js';
|
|
2
|
+
import { GhtmlRenderer } from './ghtml-renderer.js';
|
|
3
3
|
/**
|
|
4
4
|
* The name of the ghtml plugin
|
|
5
5
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IntegrationPlugin } from "../../plugins/integration-plugin";
|
|
2
|
-
import { GhtmlRenderer } from "./ghtml-renderer";
|
|
1
|
+
import { IntegrationPlugin } from "../../plugins/integration-plugin.js";
|
|
2
|
+
import { GhtmlRenderer } from "./ghtml-renderer.js";
|
|
3
3
|
const GHTML_PLUGIN_NAME = "ghtml";
|
|
4
4
|
class GhtmlPlugin extends IntegrationPlugin {
|
|
5
5
|
renderer = GhtmlRenderer;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Plugin Contracts
|
|
2
|
+
|
|
3
|
+
This directory contains the authoring contracts for Ecopages integrations, processors, and related plugin-facing runtime declarations.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
The plugin layer defines what packages are allowed to declare about themselves, while core retains orchestration ownership.
|
|
8
|
+
|
|
9
|
+
These contracts are responsible for:
|
|
10
|
+
|
|
11
|
+
- integration registration and lifecycle hooks
|
|
12
|
+
- processor registration and asset capability declaration
|
|
13
|
+
- runtime capability declaration and validation input
|
|
14
|
+
- shared build-plugin bridge types used by integrations and processors
|
|
15
|
+
|
|
16
|
+
## Main Files
|
|
17
|
+
|
|
18
|
+
- `integration-plugin.ts`: framework-semantics contract for render integrations
|
|
19
|
+
- `processor.ts`: asset-transformation contract for processors
|
|
20
|
+
- `runtime-capability.ts`: runtime compatibility declaration types
|
|
21
|
+
- `source-transform.ts`: bundler-neutral source-transform primitive with Ecopages adapters plus app-level Vite plugin composition helpers
|
|
22
|
+
- `eco-component-meta-plugin.ts`: shared metadata transform used by core loading/build paths
|
|
23
|
+
|
|
24
|
+
## Ownership Rules
|
|
25
|
+
|
|
26
|
+
- Integrations own rendering semantics, hydration behavior, and integration-specific HMR strategy.
|
|
27
|
+
- Processors own asset semantics, cache ownership, and processor-specific watch behavior.
|
|
28
|
+
- Core owns lifecycle ordering, startup orchestration, and manifest assembly.
|
|
29
|
+
|
|
30
|
+
## Lifecycle Summary
|
|
31
|
+
|
|
32
|
+
1. Config build validates and prepares plugin contributions.
|
|
33
|
+
2. Core seals the app-owned build manifest.
|
|
34
|
+
3. Runtime startup calls runtime-only setup hooks.
|
|
35
|
+
4. Request-time rendering and development invalidation reuse those finalized contracts.
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
const RESOLVABLE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mdx", ".css", ".scss", ".sass", ".less"];
|
|
4
4
|
function findResolvablePath(candidate) {
|
|
5
5
|
if (path.extname(candidate)) {
|
|
6
|
-
|
|
6
|
+
if (existsSync(candidate)) {
|
|
7
|
+
return candidate;
|
|
8
|
+
}
|
|
7
9
|
}
|
|
8
10
|
for (const extension of RESOLVABLE_EXTENSIONS) {
|
|
9
11
|
const fileCandidate = `${candidate}${extension}`;
|
|
@@ -19,6 +21,18 @@ function findResolvablePath(candidate) {
|
|
|
19
21
|
}
|
|
20
22
|
return void 0;
|
|
21
23
|
}
|
|
24
|
+
function resolveAliasedBarrelTarget(resolvedPath) {
|
|
25
|
+
if (!path.basename(resolvedPath).startsWith("index.")) {
|
|
26
|
+
return resolvedPath;
|
|
27
|
+
}
|
|
28
|
+
const source = readFileSync(resolvedPath, "utf8").trim();
|
|
29
|
+
const match = source.match(/^export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?$/);
|
|
30
|
+
if (!match?.[1]?.startsWith(".")) {
|
|
31
|
+
return resolvedPath;
|
|
32
|
+
}
|
|
33
|
+
const target = findResolvablePath(path.resolve(path.dirname(resolvedPath), match[1]));
|
|
34
|
+
return target ?? resolvedPath;
|
|
35
|
+
}
|
|
22
36
|
function createAliasResolverPlugin(srcDir) {
|
|
23
37
|
return {
|
|
24
38
|
name: "ecopages-alias-resolver",
|
|
@@ -27,7 +41,7 @@ function createAliasResolverPlugin(srcDir) {
|
|
|
27
41
|
const candidate = path.join(srcDir, args.path.slice(2));
|
|
28
42
|
const resolved = findResolvablePath(candidate);
|
|
29
43
|
if (resolved) {
|
|
30
|
-
return { path: resolved };
|
|
44
|
+
return { path: resolveAliasedBarrelTarget(resolved) };
|
|
31
45
|
}
|
|
32
46
|
return {};
|
|
33
47
|
});
|