@ecopages/core 0.2.0-alpha.4 → 0.2.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +213 -12
- package/package.json +100 -188
- package/src/adapters/README.md +39 -0
- package/src/adapters/bun/hmr-manager.test.ts +267 -0
- package/src/adapters/bun/hmr-manager.ts +181 -68
- package/src/adapters/bun/index.ts +1 -2
- package/src/adapters/bun/server-adapter.ts +41 -34
- package/src/adapters/bun/server-lifecycle.ts +40 -70
- package/src/adapters/index.ts +1 -1
- package/src/adapters/node/bootstrap-dependency-resolver.test.ts +282 -0
- package/src/adapters/node/bootstrap-dependency-resolver.ts +301 -0
- package/src/adapters/node/index.ts +7 -0
- package/src/adapters/node/node-client-bridge.test.ts +198 -0
- package/src/adapters/node/node-hmr-manager.test.ts +322 -0
- package/src/adapters/node/node-hmr-manager.ts +208 -116
- package/src/adapters/node/runtime-adapter.test.ts +868 -0
- package/src/adapters/node/runtime-adapter.ts +439 -0
- package/src/adapters/node/server-adapter.ts +31 -104
- package/src/adapters/node/static-content-server.test.ts +60 -0
- package/src/adapters/node/static-content-server.ts +36 -0
- package/src/adapters/node/write-runtime-manifest.ts +38 -0
- package/src/adapters/shared/api-response.test.ts +97 -0
- package/src/{define-api-handler.ts → adapters/shared/define-api-handler.ts} +1 -1
- package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
- package/src/adapters/shared/explicit-static-route-matcher.ts +7 -1
- package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
- package/src/adapters/shared/file-route-middleware-pipeline.ts +6 -2
- package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
- package/src/adapters/shared/fs-server-response-matcher.test.ts +286 -0
- package/src/adapters/shared/fs-server-response-matcher.ts +17 -10
- package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
- package/src/adapters/shared/hmr-html-response.ts +52 -0
- package/src/adapters/shared/hmr-manager.contract.test.ts +196 -0
- package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
- package/src/adapters/shared/render-context.test.ts +146 -0
- package/src/adapters/shared/render-context.ts +21 -6
- package/src/adapters/shared/runtime-bootstrap.ts +79 -0
- package/src/adapters/shared/server-adapter.test.ts +77 -0
- package/src/adapters/shared/server-adapter.ts +51 -4
- package/src/adapters/shared/server-route-handler.test.ts +110 -0
- package/src/adapters/shared/server-route-handler.ts +5 -18
- package/src/adapters/shared/server-static-builder.test.ts +316 -0
- package/src/adapters/shared/server-static-builder.ts +92 -8
- package/src/build/README.md +101 -0
- package/src/build/build-adapter-serialization.test.ts +268 -0
- package/src/build/build-adapter.test.ts +815 -0
- package/src/build/build-adapter.ts +235 -6
- package/src/build/build-manifest.ts +54 -0
- package/src/build/dev-build-coordinator.ts +221 -0
- package/src/build/esbuild-build-adapter.ts +132 -83
- package/src/build/runtime-build-executor.ts +34 -0
- package/src/build/runtime-specifier-alias-plugin.test.ts +43 -0
- package/src/build/runtime-specifier-alias-plugin.ts +58 -0
- package/src/config/README.md +33 -0
- package/src/config/config-builder.test.ts +410 -0
- package/src/config/config-builder.ts +281 -49
- package/src/constants.ts +15 -0
- package/src/declarations.d.ts +18 -13
- package/src/eco/README.md +70 -16
- package/src/eco/component-render-context.ts +39 -17
- package/src/eco/eco.test.ts +678 -0
- package/src/eco/eco.ts +29 -8
- package/src/eco/eco.types.ts +20 -1
- package/src/eco/eco.utils.test.ts +124 -0
- package/src/eco/global-injector-map.test.ts +42 -0
- package/src/eco/lazy-injector-map.test.ts +66 -0
- package/src/eco/module-dependencies.test.ts +30 -0
- package/src/errors/http-error.test.ts +134 -0
- package/src/global/utils.test.ts +12 -0
- package/src/hmr/README.md +26 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
- package/src/hmr/client/hmr-runtime.ts +38 -7
- package/src/hmr/hmr-strategy.test.ts +124 -0
- package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
- package/src/hmr/hmr.test.e2e.ts +29 -38
- package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
- package/src/hmr/strategies/js-hmr-strategy.ts +115 -115
- package/src/index.ts +1 -1
- package/src/integrations/ghtml/ghtml-renderer.test.ts +63 -0
- package/src/integrations/ghtml/ghtml-renderer.ts +4 -1
- package/src/internal-types.ts +39 -19
- package/src/plugins/README.md +34 -0
- package/src/plugins/alias-resolver-plugin.test.ts +41 -0
- package/src/plugins/alias-resolver-plugin.ts +21 -3
- package/src/plugins/eco-component-meta-plugin.test.ts +380 -0
- package/src/plugins/eco-component-meta-plugin.ts +10 -3
- package/src/plugins/integration-plugin.test.ts +111 -0
- package/src/plugins/integration-plugin.ts +45 -3
- package/src/plugins/processor.test.ts +148 -0
- package/src/plugins/processor.ts +22 -2
- package/src/plugins/runtime-capability.ts +14 -0
- package/src/public-types.ts +73 -16
- package/src/route-renderer/GRAPH.md +16 -20
- package/src/route-renderer/README.md +8 -21
- package/src/route-renderer/component-graph/component-graph-executor.test.ts +41 -0
- package/src/route-renderer/component-graph/component-graph.test.ts +63 -0
- package/src/route-renderer/component-graph/component-marker.test.ts +73 -0
- package/src/route-renderer/component-graph/component-reference.ts +29 -0
- package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +135 -0
- package/src/route-renderer/{marker-graph-resolver.ts → component-graph/marker-graph-resolver.ts} +11 -9
- package/src/route-renderer/orchestration/integration-renderer.test.ts +936 -0
- package/src/route-renderer/{integration-renderer.ts → orchestration/integration-renderer.ts} +113 -19
- package/src/route-renderer/orchestration/render-execution.service.test.ts +97 -0
- package/src/route-renderer/{render-execution.service.ts → orchestration/render-execution.service.ts} +109 -37
- package/src/route-renderer/orchestration/render-preparation.service.test.ts +235 -0
- package/src/route-renderer/{render-preparation.service.ts → orchestration/render-preparation.service.ts} +127 -9
- package/src/route-renderer/page-loading/dependency-resolver.test.ts +345 -0
- package/src/route-renderer/{dependency-resolver.ts → page-loading/dependency-resolver.ts} +28 -12
- package/src/route-renderer/page-loading/page-module-loader.test.ts +96 -0
- package/src/route-renderer/{page-module-loader.ts → page-loading/page-module-loader.ts} +49 -21
- package/src/route-renderer/route-renderer.ts +36 -1
- package/src/router/README.md +26 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.test.browser.ts +51 -0
- package/src/router/client/link-intent.ts +92 -0
- package/src/router/client/navigation-coordinator.test.ts +237 -0
- package/src/router/client/navigation-coordinator.ts +433 -0
- package/src/router/server/fs-router-scanner.test.ts +83 -0
- package/src/router/{fs-router-scanner.ts → server/fs-router-scanner.ts} +12 -10
- package/src/router/server/fs-router.test.ts +214 -0
- package/src/router/{fs-router.ts → server/fs-router.ts} +2 -2
- package/src/services/README.md +29 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +385 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.ts +101 -6
- package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.ts +2 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +72 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +95 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/index.ts +2 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.ts +1 -1
- package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.ts +11 -5
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.ts +17 -27
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +286 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.ts +3 -3
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.ts +5 -4
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +199 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.ts +4 -1
- package/src/services/assets/browser-bundle.service.test.ts +36 -0
- package/src/services/assets/browser-bundle.service.ts +53 -0
- package/src/services/cache/index.ts +3 -3
- package/src/services/cache/memory-cache-store.test.ts +225 -0
- package/src/services/cache/memory-cache-store.ts +1 -1
- package/src/services/cache/page-cache-service.test.ts +175 -0
- package/src/services/cache/page-cache-service.ts +3 -3
- package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
- package/src/services/{page-request-cache-coordinator.service.ts → cache/page-request-cache-coordinator.service.ts} +9 -6
- package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
- package/src/services/html/html-rewriter-provider.service.ts +103 -0
- package/src/services/html/html-transformer.service.test.ts +378 -0
- package/src/services/html/html-transformer.service.ts +279 -0
- package/src/services/invalidation/development-invalidation.service.test.ts +77 -0
- package/src/services/invalidation/development-invalidation.service.ts +261 -0
- package/src/services/module-loading/app-server-module-transpiler.service.ts +52 -0
- package/src/services/module-loading/page-module-import.service.test.ts +253 -0
- package/src/services/module-loading/page-module-import.service.ts +200 -0
- package/src/services/module-loading/server-loader.service.test.ts +161 -0
- package/src/services/module-loading/server-loader.service.ts +130 -0
- package/src/services/module-loading/server-module-transpiler.service.test.ts +115 -0
- package/src/services/module-loading/server-module-transpiler.service.ts +105 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +95 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.ts +101 -0
- package/src/services/runtime-state/dev-graph.service.ts +217 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
- package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
- package/src/services/validation/schema-validation-service.test.ts +223 -0
- package/src/services/{schema-validation-service.ts → validation/schema-validation-service.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.test.ts +307 -0
- package/src/static-site-generator/static-site-generator.ts +109 -6
- package/src/utils/deep-merge.test.ts +114 -0
- package/src/utils/invariant.test.ts +22 -0
- package/src/utils/path-utils.test.ts +15 -0
- package/src/utils/resolve-work-dir.ts +45 -0
- package/src/utils/server-utils.test.ts +38 -0
- package/src/watchers/project-watcher.integration.test.ts +337 -0
- package/src/watchers/project-watcher.test-helpers.ts +1 -1
- package/src/watchers/project-watcher.test.ts +678 -0
- package/src/watchers/project-watcher.ts +130 -111
- package/CHANGELOG.md +0 -91
- package/src/adapters/abstract/application-adapter.d.ts +0 -168
- package/src/adapters/abstract/application-adapter.js +0 -109
- package/src/adapters/abstract/router-adapter.d.ts +0 -26
- package/src/adapters/abstract/router-adapter.js +0 -5
- package/src/adapters/abstract/server-adapter.d.ts +0 -69
- package/src/adapters/abstract/server-adapter.js +0 -15
- package/src/adapters/bun/client-bridge.d.ts +0 -34
- package/src/adapters/bun/client-bridge.js +0 -48
- package/src/adapters/bun/create-app.d.ts +0 -60
- package/src/adapters/bun/create-app.js +0 -117
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.js +0 -15
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.d.ts +0 -85
- package/src/adapters/bun/hmr-manager.js +0 -240
- package/src/adapters/bun/index.d.ts +0 -3
- package/src/adapters/bun/index.js +0 -8
- package/src/adapters/bun/server-adapter.d.ts +0 -155
- package/src/adapters/bun/server-adapter.js +0 -368
- package/src/adapters/bun/server-lifecycle.d.ts +0 -52
- package/src/adapters/bun/server-lifecycle.js +0 -120
- package/src/adapters/index.d.ts +0 -6
- package/src/adapters/index.js +0 -14
- package/src/adapters/node/create-app.d.ts +0 -21
- package/src/adapters/node/create-app.js +0 -143
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/node-client-bridge.d.ts +0 -26
- package/src/adapters/node/node-client-bridge.js +0 -66
- package/src/adapters/node/node-hmr-manager.d.ts +0 -63
- package/src/adapters/node/node-hmr-manager.js +0 -237
- package/src/adapters/node/server-adapter.d.ts +0 -190
- package/src/adapters/node/server-adapter.js +0 -420
- package/src/adapters/node/static-content-server.d.ts +0 -24
- package/src/adapters/node/static-content-server.js +0 -166
- package/src/adapters/shared/api-response.d.ts +0 -52
- package/src/adapters/shared/api-response.js +0 -96
- package/src/adapters/shared/application-adapter.d.ts +0 -18
- package/src/adapters/shared/application-adapter.js +0 -90
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
- package/src/adapters/shared/explicit-static-route-matcher.js +0 -100
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
- package/src/adapters/shared/file-route-middleware-pipeline.js +0 -98
- package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
- package/src/adapters/shared/fs-server-response-factory.js +0 -97
- package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -71
- package/src/adapters/shared/fs-server-response-matcher.js +0 -155
- package/src/adapters/shared/render-context.d.ts +0 -14
- package/src/adapters/shared/render-context.js +0 -69
- package/src/adapters/shared/server-adapter.d.ts +0 -87
- package/src/adapters/shared/server-adapter.js +0 -353
- package/src/adapters/shared/server-route-handler.d.ts +0 -89
- package/src/adapters/shared/server-route-handler.js +0 -120
- package/src/adapters/shared/server-static-builder.d.ts +0 -38
- package/src/adapters/shared/server-static-builder.js +0 -46
- package/src/build/build-adapter.d.ts +0 -74
- package/src/build/build-adapter.js +0 -54
- package/src/build/build-types.d.ts +0 -57
- package/src/build/build-types.js +0 -0
- package/src/build/esbuild-build-adapter.d.ts +0 -69
- package/src/build/esbuild-build-adapter.js +0 -390
- package/src/config/config-builder.d.ts +0 -227
- package/src/config/config-builder.js +0 -392
- package/src/constants.d.ts +0 -32
- package/src/constants.js +0 -21
- package/src/create-app.d.ts +0 -17
- package/src/create-app.js +0 -66
- package/src/define-api-handler.d.ts +0 -25
- package/src/define-api-handler.js +0 -15
- package/src/dev/sc-server.d.ts +0 -30
- package/src/dev/sc-server.js +0 -111
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -77
- package/src/eco/eco.d.ts +0 -9
- package/src/eco/eco.js +0 -110
- package/src/eco/eco.types.d.ts +0 -170
- package/src/eco/eco.types.js +0 -0
- package/src/eco/eco.utils.d.ts +0 -40
- package/src/eco/eco.utils.js +0 -40
- package/src/eco/global-injector-map.d.ts +0 -16
- package/src/eco/global-injector-map.js +0 -80
- package/src/eco/lazy-injector-map.d.ts +0 -8
- package/src/eco/lazy-injector-map.js +0 -70
- package/src/eco/module-dependencies.d.ts +0 -18
- package/src/eco/module-dependencies.js +0 -49
- package/src/errors/http-error.d.ts +0 -31
- package/src/errors/http-error.js +0 -50
- package/src/errors/index.d.ts +0 -2
- package/src/errors/index.js +0 -4
- package/src/errors/locals-access-error.d.ts +0 -4
- package/src/errors/locals-access-error.js +0 -9
- package/src/global/app-logger.d.ts +0 -2
- package/src/global/app-logger.js +0 -6
- package/src/hmr/client/hmr-runtime.d.ts +0 -10
- package/src/hmr/client/hmr-runtime.js +0 -86
- package/src/hmr/hmr-strategy.d.ts +0 -159
- package/src/hmr/hmr-strategy.js +0 -29
- package/src/hmr/hmr.test.e2e.d.ts +0 -1
- package/src/hmr/hmr.test.e2e.js +0 -50
- package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
- package/src/hmr/strategies/default-hmr-strategy.js +0 -34
- package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -136
- package/src/hmr/strategies/js-hmr-strategy.js +0 -188
- package/src/index.browser.d.ts +0 -3
- package/src/index.browser.js +0 -4
- package/src/index.d.ts +0 -5
- package/src/index.js +0 -10
- package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -15
- package/src/integrations/ghtml/ghtml-renderer.js +0 -60
- package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -20
- package/src/integrations/ghtml/ghtml.plugin.js +0 -21
- package/src/internal-types.d.ts +0 -200
- package/src/internal-types.js +0 -0
- package/src/plugins/alias-resolver-plugin.d.ts +0 -2
- package/src/plugins/alias-resolver-plugin.js +0 -39
- package/src/plugins/eco-component-meta-plugin.d.ts +0 -95
- package/src/plugins/eco-component-meta-plugin.js +0 -157
- package/src/plugins/integration-plugin.d.ts +0 -102
- package/src/plugins/integration-plugin.js +0 -100
- package/src/plugins/processor.d.ts +0 -82
- package/src/plugins/processor.js +0 -122
- package/src/public-types.d.ts +0 -1098
- package/src/public-types.js +0 -0
- package/src/route-renderer/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/dependency-resolver.d.ts +0 -24
- package/src/route-renderer/dependency-resolver.js +0 -428
- package/src/route-renderer/html-post-processing.service.d.ts +0 -40
- package/src/route-renderer/html-post-processing.service.js +0 -86
- package/src/route-renderer/html-post-processing.service.ts +0 -103
- package/src/route-renderer/integration-renderer.d.ts +0 -339
- package/src/route-renderer/integration-renderer.js +0 -526
- package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
- package/src/route-renderer/marker-graph-resolver.js +0 -93
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.js +0 -102
- package/src/route-renderer/render-execution.service.d.ts +0 -69
- package/src/route-renderer/render-execution.service.js +0 -91
- package/src/route-renderer/render-preparation.service.d.ts +0 -112
- package/src/route-renderer/render-preparation.service.js +0 -243
- package/src/route-renderer/route-renderer.d.ts +0 -26
- package/src/route-renderer/route-renderer.js +0 -68
- package/src/router/fs-router-scanner.d.ts +0 -41
- package/src/router/fs-router-scanner.js +0 -155
- package/src/router/fs-router.d.ts +0 -26
- package/src/router/fs-router.js +0 -100
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.js +0 -250
- package/src/services/asset-processing-service/asset.factory.d.ts +0 -17
- package/src/services/asset-processing-service/asset.factory.js +0 -82
- package/src/services/asset-processing-service/assets.types.d.ts +0 -88
- package/src/services/asset-processing-service/assets.types.js +0 -0
- package/src/services/asset-processing-service/index.d.ts +0 -3
- package/src/services/asset-processing-service/index.js +0 -3
- package/src/services/asset-processing-service/processor.interface.d.ts +0 -22
- package/src/services/asset-processing-service/processor.interface.js +0 -6
- package/src/services/asset-processing-service/processor.registry.d.ts +0 -8
- package/src/services/asset-processing-service/processor.registry.js +0 -15
- package/src/services/asset-processing-service/processors/base/base-processor.d.ts +0 -24
- package/src/services/asset-processing-service/processors/base/base-processor.js +0 -59
- package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
- package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
- package/src/services/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/asset-processing-service/processors/index.js +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
- package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +0 -8
- package/src/services/asset-processing-service/processors/script/file-script.processor.js +0 -76
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -63
- package/src/services/cache/cache.types.d.ts +0 -107
- package/src/services/cache/cache.types.js +0 -0
- package/src/services/cache/index.d.ts +0 -7
- package/src/services/cache/index.js +0 -7
- package/src/services/cache/memory-cache-store.d.ts +0 -42
- package/src/services/cache/memory-cache-store.js +0 -98
- package/src/services/cache/page-cache-service.d.ts +0 -70
- package/src/services/cache/page-cache-service.js +0 -152
- package/src/services/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.d.ts +0 -75
- package/src/services/page-request-cache-coordinator.service.js +0 -107
- package/src/services/schema-validation-service.d.ts +0 -122
- package/src/services/schema-validation-service.js +0 -101
- package/src/services/validation/standard-schema.types.d.ts +0 -65
- package/src/services/validation/standard-schema.types.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +0 -57
- package/src/static-site-generator/static-site-generator.js +0 -272
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/deep-merge.d.ts +0 -14
- package/src/utils/deep-merge.js +0 -32
- package/src/utils/hash.d.ts +0 -1
- package/src/utils/hash.js +0 -7
- package/src/utils/html.d.ts +0 -1
- package/src/utils/html.js +0 -4
- package/src/utils/invariant.d.ts +0 -5
- package/src/utils/invariant.js +0 -11
- package/src/utils/locals-utils.d.ts +0 -15
- package/src/utils/locals-utils.js +0 -24
- package/src/utils/parse-cli-args.d.ts +0 -24
- package/src/utils/parse-cli-args.js +0 -47
- package/src/utils/path-utils.module.d.ts +0 -5
- package/src/utils/path-utils.module.js +0 -14
- package/src/utils/runtime.d.ts +0 -11
- package/src/utils/runtime.js +0 -40
- package/src/utils/server-utils.module.d.ts +0 -19
- package/src/utils/server-utils.module.js +0 -56
- package/src/watchers/project-watcher.d.ts +0 -125
- package/src/watchers/project-watcher.js +0 -265
- package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
- package/src/watchers/project-watcher.test-helpers.js +0 -52
- /package/src/route-renderer/{component-graph-executor.ts → component-graph/component-graph-executor.ts} +0 -0
- /package/src/route-renderer/{component-graph.ts → component-graph/component-graph.ts} +0 -0
- /package/src/route-renderer/{component-marker.ts → component-graph/component-marker.ts} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.ts +0 -0
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import type { BunPlugin } from 'bun';
|
|
2
2
|
import type { EcoBuildPlugin } from './build-types.ts';
|
|
3
|
+
import {
|
|
4
|
+
createAppBuildManifest,
|
|
5
|
+
getBrowserBuildPlugins,
|
|
6
|
+
getServerBuildPlugins,
|
|
7
|
+
type AppBuildManifest,
|
|
8
|
+
} from './build-manifest.ts';
|
|
3
9
|
import { EsbuildBuildAdapter } from './esbuild-build-adapter.ts';
|
|
4
10
|
import { getRequiredBunRuntime } from '../utils/runtime.ts';
|
|
11
|
+
import type { EcoPagesAppConfig } from '../internal-types.ts';
|
|
12
|
+
import type { IHmrManager } from '../public-types.ts';
|
|
5
13
|
|
|
6
14
|
export { EsbuildBuildAdapter } from './esbuild-build-adapter.ts';
|
|
7
15
|
|
|
@@ -45,7 +53,10 @@ export interface BuildResult {
|
|
|
45
53
|
export interface BuildOptions {
|
|
46
54
|
entrypoints: string[];
|
|
47
55
|
outdir?: string;
|
|
56
|
+
outbase?: string;
|
|
48
57
|
naming?: string;
|
|
58
|
+
conditions?: string[];
|
|
59
|
+
define?: Record<string, string>;
|
|
49
60
|
minify?: boolean;
|
|
50
61
|
treeshaking?: boolean;
|
|
51
62
|
target?: string;
|
|
@@ -69,12 +80,38 @@ export interface BuildTranspileOptions {
|
|
|
69
80
|
}
|
|
70
81
|
|
|
71
82
|
export interface BuildAdapter {
|
|
83
|
+
/**
|
|
84
|
+
* Executes one concrete backend build.
|
|
85
|
+
*
|
|
86
|
+
* @remarks
|
|
87
|
+
* `BuildAdapter` is the low-level backend contract. The default adapter is
|
|
88
|
+
* `EsbuildBuildAdapter`, but alternate adapters may satisfy the same shape.
|
|
89
|
+
*/
|
|
72
90
|
build(options: BuildOptions): Promise<BuildResult>;
|
|
73
91
|
resolve(importPath: string, rootDir: string): string;
|
|
74
|
-
registerPlugin(plugin: EcoBuildPlugin): void;
|
|
75
92
|
getTranspileOptions(profile: BuildTranspileProfile): BuildTranspileOptions;
|
|
76
93
|
}
|
|
77
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Runtime-owned facade for issuing builds.
|
|
97
|
+
*
|
|
98
|
+
* @remarks
|
|
99
|
+
* This is intentionally narrower than `BuildAdapter`. A build executor answers
|
|
100
|
+
* only the question "how should this app execute a build right now?".
|
|
101
|
+
*
|
|
102
|
+
* In production and non-watch flows the executor is usually the adapter itself,
|
|
103
|
+
* which today means `EsbuildBuildAdapter`. In development watch flows the
|
|
104
|
+
* executor is typically `DevBuildCoordinator`, which wraps the shared esbuild
|
|
105
|
+
* adapter to serialize callers and recover from known worker faults.
|
|
106
|
+
*/
|
|
107
|
+
export interface BuildExecutor {
|
|
108
|
+
build(options: BuildOptions): Promise<BuildResult>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function createBuildAdapter(): BuildAdapter {
|
|
112
|
+
return new EsbuildBuildAdapter();
|
|
113
|
+
}
|
|
114
|
+
|
|
78
115
|
function transpileProfileToOptions(profile: BuildTranspileProfile): BuildTranspileOptions {
|
|
79
116
|
switch (profile) {
|
|
80
117
|
case 'browser-script':
|
|
@@ -120,13 +157,205 @@ export class BunBuildAdapter implements BuildAdapter {
|
|
|
120
157
|
return getRequiredBunRuntime().resolveSync(importPath, rootDir);
|
|
121
158
|
}
|
|
122
159
|
|
|
123
|
-
registerPlugin(plugin: EcoBuildPlugin): void {
|
|
124
|
-
getRequiredBunRuntime().plugin(plugin as BunPlugin);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
160
|
getTranspileOptions(profile: BuildTranspileProfile): BuildTranspileOptions {
|
|
128
161
|
return transpileProfileToOptions(profile);
|
|
129
162
|
}
|
|
130
163
|
}
|
|
131
164
|
|
|
132
|
-
export const defaultBuildAdapter: BuildAdapter =
|
|
165
|
+
export const defaultBuildAdapter: BuildAdapter = createBuildAdapter();
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Returns the adapter owned by an app/runtime instance.
|
|
169
|
+
*
|
|
170
|
+
* @remarks
|
|
171
|
+
* The config builder installs a dedicated adapter per app. The shared default
|
|
172
|
+
* adapter remains only as a compatibility fallback for older tests and helpers
|
|
173
|
+
* that do not yet thread app runtime state explicitly.
|
|
174
|
+
*/
|
|
175
|
+
export function getAppBuildAdapter(appConfig: EcoPagesAppConfig): BuildAdapter {
|
|
176
|
+
return appConfig.runtime?.buildAdapter ?? defaultBuildAdapter;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Installs the adapter that should serve future builds for one app instance.
|
|
181
|
+
*/
|
|
182
|
+
export function setAppBuildAdapter(appConfig: EcoPagesAppConfig, buildAdapter: BuildAdapter): void {
|
|
183
|
+
appConfig.runtime = {
|
|
184
|
+
...(appConfig.runtime ?? {}),
|
|
185
|
+
buildAdapter,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Returns the build manifest owned by an app/runtime instance.
|
|
191
|
+
*/
|
|
192
|
+
export function getAppBuildManifest(appConfig: EcoPagesAppConfig): AppBuildManifest {
|
|
193
|
+
return (
|
|
194
|
+
appConfig.runtime?.buildManifest ??
|
|
195
|
+
createAppBuildManifest({
|
|
196
|
+
loaderPlugins: Array.from(appConfig.loaders.values()),
|
|
197
|
+
})
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Installs the build manifest that should be visible to one app instance.
|
|
203
|
+
*/
|
|
204
|
+
export function setAppBuildManifest(appConfig: EcoPagesAppConfig, buildManifest: AppBuildManifest): void {
|
|
205
|
+
appConfig.runtime = {
|
|
206
|
+
...(appConfig.runtime ?? {}),
|
|
207
|
+
buildManifest,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Rebuilds an app-owned manifest from config-owned loaders plus explicit
|
|
213
|
+
* runtime/browser contribution input.
|
|
214
|
+
*
|
|
215
|
+
* @remarks
|
|
216
|
+
* This keeps loader ownership with config finalization while still letting a
|
|
217
|
+
* caller supply the non-loader plugin buckets that were discovered elsewhere.
|
|
218
|
+
*/
|
|
219
|
+
export function createConfiguredAppBuildManifest(
|
|
220
|
+
appConfig: EcoPagesAppConfig,
|
|
221
|
+
input?: Partial<AppBuildManifest>,
|
|
222
|
+
): AppBuildManifest {
|
|
223
|
+
return createAppBuildManifest({
|
|
224
|
+
loaderPlugins: input?.loaderPlugins ?? Array.from(appConfig.loaders.values()),
|
|
225
|
+
runtimePlugins: input?.runtimePlugins,
|
|
226
|
+
browserBundlePlugins: input?.browserBundlePlugins,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Replaces the app-owned manifest using config-owned loaders and explicit
|
|
232
|
+
* contribution input.
|
|
233
|
+
*/
|
|
234
|
+
export function updateAppBuildManifest(appConfig: EcoPagesAppConfig, input?: Partial<AppBuildManifest>): void {
|
|
235
|
+
setAppBuildManifest(appConfig, createConfiguredAppBuildManifest(appConfig, input));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Collects the build-facing processor and integration contributions that should
|
|
240
|
+
* be sealed into the app manifest during config finalization.
|
|
241
|
+
*
|
|
242
|
+
* @remarks
|
|
243
|
+
* This runs `prepareBuildContributions()` only. Runtime-only side effects such
|
|
244
|
+
* as HMR registration, cache prewarming, and runtime-origin wiring belong to
|
|
245
|
+
* the startup path and must not be triggered here.
|
|
246
|
+
*/
|
|
247
|
+
export async function collectConfiguredAppBuildManifestContributions(
|
|
248
|
+
appConfig: EcoPagesAppConfig,
|
|
249
|
+
): Promise<Pick<AppBuildManifest, 'runtimePlugins' | 'browserBundlePlugins'>> {
|
|
250
|
+
const runtimePlugins: EcoBuildPlugin[] = [];
|
|
251
|
+
const browserBundlePlugins: EcoBuildPlugin[] = [];
|
|
252
|
+
|
|
253
|
+
for (const processor of appConfig.processors.values()) {
|
|
254
|
+
await processor.prepareBuildContributions();
|
|
255
|
+
|
|
256
|
+
if (processor.plugins) {
|
|
257
|
+
runtimePlugins.push(...processor.plugins);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (processor.buildPlugins) {
|
|
261
|
+
browserBundlePlugins.push(...processor.buildPlugins);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
for (const integration of appConfig.integrations) {
|
|
266
|
+
integration.setConfig(appConfig);
|
|
267
|
+
await integration.prepareBuildContributions();
|
|
268
|
+
runtimePlugins.push(...integration.plugins);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return {
|
|
272
|
+
runtimePlugins,
|
|
273
|
+
browserBundlePlugins,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Runs runtime-only processor and integration setup against an already sealed
|
|
279
|
+
* app manifest.
|
|
280
|
+
*
|
|
281
|
+
* @remarks
|
|
282
|
+
* Startup paths call this after config build has finalized manifest
|
|
283
|
+
* contributions. The manifest is reused as-is; this helper only performs the
|
|
284
|
+
* runtime side effects that still need live startup context.
|
|
285
|
+
*/
|
|
286
|
+
export async function setupAppRuntimePlugins(options: {
|
|
287
|
+
appConfig: EcoPagesAppConfig;
|
|
288
|
+
runtimeOrigin: string;
|
|
289
|
+
hmrManager?: IHmrManager;
|
|
290
|
+
onRuntimePlugin?: (plugin: EcoBuildPlugin) => void;
|
|
291
|
+
}): Promise<void> {
|
|
292
|
+
for (const processor of options.appConfig.processors.values()) {
|
|
293
|
+
await processor.setup();
|
|
294
|
+
|
|
295
|
+
if (processor.plugins) {
|
|
296
|
+
for (const plugin of processor.plugins) {
|
|
297
|
+
options.onRuntimePlugin?.(plugin);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
for (const integration of options.appConfig.integrations) {
|
|
303
|
+
integration.setConfig(options.appConfig);
|
|
304
|
+
integration.setRuntimeOrigin(options.runtimeOrigin);
|
|
305
|
+
if (options.hmrManager) {
|
|
306
|
+
integration.setHmrManager(options.hmrManager);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
await integration.setup();
|
|
310
|
+
|
|
311
|
+
for (const plugin of integration.plugins) {
|
|
312
|
+
options.onRuntimePlugin?.(plugin);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export function getAppServerBuildPlugins(appConfig: EcoPagesAppConfig): EcoBuildPlugin[] {
|
|
318
|
+
return getServerBuildPlugins(getAppBuildManifest(appConfig));
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export function getAppBrowserBuildPlugins(appConfig: EcoPagesAppConfig): EcoBuildPlugin[] {
|
|
322
|
+
return getBrowserBuildPlugins(getAppBuildManifest(appConfig));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Returns the executor owned by an app/runtime instance.
|
|
327
|
+
*
|
|
328
|
+
* @remarks
|
|
329
|
+
* The config builder seeds this with the shared default adapter. Runtime
|
|
330
|
+
* adapters may replace it with a coordinator that still delegates to the same
|
|
331
|
+
* backend while adding development policy.
|
|
332
|
+
*/
|
|
333
|
+
export function getAppBuildExecutor(appConfig: EcoPagesAppConfig): BuildExecutor {
|
|
334
|
+
return appConfig.runtime?.buildExecutor ?? getAppBuildAdapter(appConfig);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Installs the executor that should serve future builds for one app instance.
|
|
339
|
+
*/
|
|
340
|
+
export function setAppBuildExecutor(appConfig: EcoPagesAppConfig, buildExecutor: BuildExecutor): void {
|
|
341
|
+
appConfig.runtime = {
|
|
342
|
+
...(appConfig.runtime ?? {}),
|
|
343
|
+
buildExecutor,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Runs a build through the active pipeline.
|
|
349
|
+
*
|
|
350
|
+
* @remarks
|
|
351
|
+
* Callers can pass an explicit executor when builds should be routed through an
|
|
352
|
+
* app-owned development coordinator. Without one, the shared default adapter is
|
|
353
|
+
* used directly.
|
|
354
|
+
*/
|
|
355
|
+
export function build(options: BuildOptions, executor: BuildExecutor = defaultBuildAdapter): Promise<BuildResult> {
|
|
356
|
+
return executor.build(options);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export function getTranspileOptions(profile: BuildTranspileProfile): BuildTranspileOptions {
|
|
360
|
+
return defaultBuildAdapter.getTranspileOptions(profile);
|
|
361
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { EcoBuildPlugin } from './build-types.ts';
|
|
2
|
+
|
|
3
|
+
export interface AppBuildManifest {
|
|
4
|
+
loaderPlugins: EcoBuildPlugin[];
|
|
5
|
+
runtimePlugins: EcoBuildPlugin[];
|
|
6
|
+
browserBundlePlugins: EcoBuildPlugin[];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Merges plugin lists while preserving first-registration precedence by name.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* Build manifests treat plugin names as stable identities. The first plugin
|
|
14
|
+
* with a given name wins so config-time assembly stays deterministic across
|
|
15
|
+
* loader, runtime, and browser buckets.
|
|
16
|
+
*/
|
|
17
|
+
export function mergeEcoBuildPlugins(...pluginLists: Array<EcoBuildPlugin[] | undefined>): EcoBuildPlugin[] {
|
|
18
|
+
const byName = new Map<string, EcoBuildPlugin>();
|
|
19
|
+
|
|
20
|
+
for (const plugins of pluginLists) {
|
|
21
|
+
for (const plugin of plugins ?? []) {
|
|
22
|
+
if (!byName.has(plugin.name)) {
|
|
23
|
+
byName.set(plugin.name, plugin);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return Array.from(byName.values());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Creates one app-owned build manifest from the supplied plugin buckets.
|
|
33
|
+
*/
|
|
34
|
+
export function createAppBuildManifest(input?: Partial<AppBuildManifest>): AppBuildManifest {
|
|
35
|
+
return {
|
|
36
|
+
loaderPlugins: mergeEcoBuildPlugins(input?.loaderPlugins),
|
|
37
|
+
runtimePlugins: mergeEcoBuildPlugins(input?.runtimePlugins),
|
|
38
|
+
browserBundlePlugins: mergeEcoBuildPlugins(input?.browserBundlePlugins),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Returns the plugin list used for server-oriented builds.
|
|
44
|
+
*/
|
|
45
|
+
export function getServerBuildPlugins(manifest: AppBuildManifest): EcoBuildPlugin[] {
|
|
46
|
+
return mergeEcoBuildPlugins(manifest.loaderPlugins, manifest.runtimePlugins);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns the plugin list used for browser-oriented builds.
|
|
51
|
+
*/
|
|
52
|
+
export function getBrowserBuildPlugins(manifest: AppBuildManifest): EcoBuildPlugin[] {
|
|
53
|
+
return mergeEcoBuildPlugins(manifest.loaderPlugins, manifest.runtimePlugins, manifest.browserBundlePlugins);
|
|
54
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { appLogger } from '../global/app-logger.ts';
|
|
2
|
+
import {
|
|
3
|
+
defaultBuildAdapter,
|
|
4
|
+
type BuildAdapter,
|
|
5
|
+
type BuildExecutor,
|
|
6
|
+
type BuildOptions,
|
|
7
|
+
type BuildResult,
|
|
8
|
+
EsbuildBuildAdapter,
|
|
9
|
+
} from './build-adapter.ts';
|
|
10
|
+
import { mergeEcoBuildPlugins } from './build-manifest.ts';
|
|
11
|
+
import type { EcoBuildPlugin } from './build-types.ts';
|
|
12
|
+
|
|
13
|
+
function mergeBuildPlugins(options: BuildOptions, appPlugins: EcoBuildPlugin[]): BuildOptions {
|
|
14
|
+
if (appPlugins.length === 0) {
|
|
15
|
+
return options;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
...options,
|
|
20
|
+
plugins: mergeEcoBuildPlugins(options.plugins, appPlugins),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
class BuildExecutorWithPlugins implements BuildExecutor {
|
|
25
|
+
private readonly executor: BuildExecutor;
|
|
26
|
+
private readonly getPlugins: () => EcoBuildPlugin[];
|
|
27
|
+
|
|
28
|
+
constructor(executor: BuildExecutor, getPlugins: () => EcoBuildPlugin[]) {
|
|
29
|
+
this.executor = executor;
|
|
30
|
+
this.getPlugins = getPlugins;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async build(options: BuildOptions): Promise<BuildResult> {
|
|
34
|
+
return await this.executor.build(mergeBuildPlugins(options, this.getPlugins()));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
unwrap(): BuildExecutor {
|
|
38
|
+
return this.executor;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function unwrapBuildExecutor(executor: BuildExecutor): BuildExecutor {
|
|
43
|
+
if (executor instanceof BuildExecutorWithPlugins) {
|
|
44
|
+
return unwrapBuildExecutor(executor.unwrap());
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return executor;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function withBuildExecutorPlugins(executor: BuildExecutor, getPlugins: () => EcoBuildPlugin[]): BuildExecutor {
|
|
51
|
+
return new BuildExecutorWithPlugins(executor, getPlugins);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Serialized development build coordinator for the shared esbuild adapter.
|
|
56
|
+
*
|
|
57
|
+
* The underlying adapter remains responsible for plain build execution. This
|
|
58
|
+
* coordinator owns the policy that must be shared across callers in dev mode:
|
|
59
|
+
*
|
|
60
|
+
* - serialized access to the shared esbuild service
|
|
61
|
+
* - warm-service recycling for Node-target builds
|
|
62
|
+
* - recovery from known esbuild worker protocol faults
|
|
63
|
+
*
|
|
64
|
+
* Unlike the previous design, the coordinator does not monkey-patch the adapter
|
|
65
|
+
* or install process-level fault handlers. The owning app/runtime passes this
|
|
66
|
+
* executor explicitly to build consumers that need coordinated development
|
|
67
|
+
* builds.
|
|
68
|
+
*/
|
|
69
|
+
export class DevBuildCoordinator implements BuildExecutor {
|
|
70
|
+
private buildQueue: Promise<void> = Promise.resolve();
|
|
71
|
+
private esbuildSessionWarm = false;
|
|
72
|
+
private esbuildModuleGeneration = 0;
|
|
73
|
+
private readonly adapter: EsbuildBuildAdapter;
|
|
74
|
+
|
|
75
|
+
constructor(adapter: EsbuildBuildAdapter) {
|
|
76
|
+
this.adapter = adapter;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Executes a build through the serialized development queue.
|
|
81
|
+
*
|
|
82
|
+
* Node-target builds recycle the warmed esbuild service between requests to
|
|
83
|
+
* avoid stale worker state accumulating across long-lived dev sessions.
|
|
84
|
+
*
|
|
85
|
+
* If an esbuild protocol fault is detected, the coordinator resets the queue,
|
|
86
|
+
* stops the corrupted service, increments the module generation, and retries
|
|
87
|
+
* the build once.
|
|
88
|
+
*/
|
|
89
|
+
async build(options: BuildOptions): Promise<BuildResult> {
|
|
90
|
+
return this.runSerialized(async () => {
|
|
91
|
+
try {
|
|
92
|
+
if (this.shouldRecycleEsbuildService(options)) {
|
|
93
|
+
await this.adapter.stopEsbuildService(this.esbuildModuleGeneration);
|
|
94
|
+
this.esbuildSessionWarm = false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const result = await this.adapter.buildOrThrow(options, this.esbuildModuleGeneration);
|
|
98
|
+
this.esbuildSessionWarm = true;
|
|
99
|
+
return result;
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (await this.recoverFromProtocolFault(error)) {
|
|
102
|
+
appLogger.warn('Recovered from esbuild protocol fault. Retrying build.');
|
|
103
|
+
try {
|
|
104
|
+
const retry = await this.adapter.buildOrThrow(options, this.esbuildModuleGeneration);
|
|
105
|
+
this.esbuildSessionWarm = true;
|
|
106
|
+
return retry;
|
|
107
|
+
} catch (retryError) {
|
|
108
|
+
return this.adapter.createFailureResult(retryError);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return this.adapter.createFailureResult(error);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Attempts recovery from a known esbuild worker protocol fault.
|
|
118
|
+
*
|
|
119
|
+
* Returns `true` only when the error matches the protocol-fault signature and
|
|
120
|
+
* the coordinator successfully reset its shared state.
|
|
121
|
+
*/
|
|
122
|
+
async recoverFromProtocolFault(error: unknown): Promise<boolean> {
|
|
123
|
+
if (!this.adapter.isEsbuildProtocolError(error)) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
this.buildQueue = Promise.resolve();
|
|
127
|
+
this.esbuildSessionWarm = false;
|
|
128
|
+
await this.adapter.stopEsbuildService(this.esbuildModuleGeneration);
|
|
129
|
+
this.esbuildModuleGeneration += 1;
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Clears internal coordinator state for isolated tests.
|
|
135
|
+
*/
|
|
136
|
+
resetForTests(): void {
|
|
137
|
+
this.buildQueue = Promise.resolve();
|
|
138
|
+
this.esbuildSessionWarm = false;
|
|
139
|
+
this.esbuildModuleGeneration = 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Overrides the internal queue promise for fault-recovery tests.
|
|
144
|
+
*/
|
|
145
|
+
setBuildQueueForTests(queue: Promise<void>): void {
|
|
146
|
+
this.buildQueue = queue;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Returns the current internal queue promise for fault-recovery tests.
|
|
151
|
+
*/
|
|
152
|
+
getBuildQueueForTests(): Promise<void> {
|
|
153
|
+
return this.buildQueue;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private shouldRecycleEsbuildService(options: BuildOptions): boolean {
|
|
157
|
+
return process.env.NODE_ENV === 'development' && options.target !== 'browser' && this.esbuildSessionWarm;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private async runSerialized<T>(operation: () => Promise<T>): Promise<T> {
|
|
161
|
+
let releaseBuild: (() => void) | undefined;
|
|
162
|
+
const currentBuild = new Promise<void>((resolve) => {
|
|
163
|
+
releaseBuild = resolve;
|
|
164
|
+
});
|
|
165
|
+
const previousBuild = this.buildQueue;
|
|
166
|
+
|
|
167
|
+
this.buildQueue = previousBuild.catch(() => undefined).then(async () => await currentBuild);
|
|
168
|
+
await previousBuild.catch(() => undefined);
|
|
169
|
+
|
|
170
|
+
try {
|
|
171
|
+
return await operation();
|
|
172
|
+
} finally {
|
|
173
|
+
releaseBuild?.();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Creates the appropriate build executor for one app/runtime instance.
|
|
180
|
+
*
|
|
181
|
+
* Development runtimes get a dedicated coordinator around the shared esbuild
|
|
182
|
+
* adapter. Non-development runtimes use the adapter directly.
|
|
183
|
+
*/
|
|
184
|
+
export function createAppBuildExecutor(options: {
|
|
185
|
+
development: boolean;
|
|
186
|
+
adapter?: BuildAdapter;
|
|
187
|
+
getPlugins?: () => EcoBuildPlugin[];
|
|
188
|
+
}): BuildExecutor {
|
|
189
|
+
const adapter = options.adapter ?? defaultBuildAdapter;
|
|
190
|
+
const baseExecutor =
|
|
191
|
+
!options.development || !(adapter instanceof EsbuildBuildAdapter) ? adapter : new DevBuildCoordinator(adapter);
|
|
192
|
+
|
|
193
|
+
if (!options.getPlugins) {
|
|
194
|
+
return baseExecutor;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return new BuildExecutorWithPlugins(baseExecutor, options.getPlugins);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function createOrReuseAppBuildExecutor(options: {
|
|
201
|
+
development: boolean;
|
|
202
|
+
adapter?: BuildAdapter;
|
|
203
|
+
currentExecutor?: BuildExecutor;
|
|
204
|
+
getPlugins?: () => EcoBuildPlugin[];
|
|
205
|
+
}): BuildExecutor {
|
|
206
|
+
const adapter = options.adapter ?? defaultBuildAdapter;
|
|
207
|
+
const currentBaseExecutor = options.currentExecutor ? unwrapBuildExecutor(options.currentExecutor) : undefined;
|
|
208
|
+
const baseExecutor =
|
|
209
|
+
options.development && currentBaseExecutor instanceof DevBuildCoordinator
|
|
210
|
+
? currentBaseExecutor
|
|
211
|
+
: createAppBuildExecutor({
|
|
212
|
+
development: options.development,
|
|
213
|
+
adapter,
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
if (!options.getPlugins) {
|
|
217
|
+
return baseExecutor;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return withBuildExecutorPlugins(baseExecutor, options.getPlugins);
|
|
221
|
+
}
|