@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
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { describe, expect, it, beforeAll, afterAll } from 'vitest';
|
|
3
|
+
import {
|
|
4
|
+
ServerStaticBuilder,
|
|
5
|
+
type ServeOptions,
|
|
6
|
+
type ServerStaticBuilderLogger,
|
|
7
|
+
type ServerStaticPreviewServerFactory,
|
|
8
|
+
} from './server-static-builder';
|
|
9
|
+
import type { EcoPagesAppConfig } from '../../internal-types';
|
|
10
|
+
import type { StaticSiteGenerator } from '../../static-site-generator/static-site-generator';
|
|
11
|
+
import type { FSRouter } from '../../router/server/fs-router';
|
|
12
|
+
import type { RouteRendererFactory } from '../../route-renderer/route-renderer';
|
|
13
|
+
import fs from 'node:fs';
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
import os from 'node:os';
|
|
16
|
+
|
|
17
|
+
const TMP_DIR = path.join(os.tmpdir(), 'server-static-builder-test');
|
|
18
|
+
|
|
19
|
+
function createMockDependencies() {
|
|
20
|
+
const calls = {
|
|
21
|
+
staticSiteGeneratorRun: [] as Array<unknown>,
|
|
22
|
+
integrationSetup: 0,
|
|
23
|
+
processorSetup: 0,
|
|
24
|
+
warn: [] as Array<[string, string | undefined]>,
|
|
25
|
+
info: [] as string[],
|
|
26
|
+
error: [] as string[],
|
|
27
|
+
createServer: [] as Array<{
|
|
28
|
+
appConfig: EcoPagesAppConfig;
|
|
29
|
+
options: { port: number };
|
|
30
|
+
}>,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const StaticSiteGenerator = {
|
|
34
|
+
run: async (options: unknown) => {
|
|
35
|
+
calls.staticSiteGeneratorRun.push(options);
|
|
36
|
+
},
|
|
37
|
+
} as unknown as StaticSiteGenerator;
|
|
38
|
+
|
|
39
|
+
const mockIntegration = {
|
|
40
|
+
setup: async () => {
|
|
41
|
+
calls.integrationSetup += 1;
|
|
42
|
+
},
|
|
43
|
+
} as any;
|
|
44
|
+
|
|
45
|
+
const mockProcessor = {
|
|
46
|
+
setup: async () => {
|
|
47
|
+
calls.processorSetup += 1;
|
|
48
|
+
fs.mkdirSync(path.join(TMP_DIR, 'dist', 'images'), { recursive: true });
|
|
49
|
+
fs.writeFileSync(path.join(TMP_DIR, 'dist', 'images', 'processor.webp'), 'processor-output');
|
|
50
|
+
},
|
|
51
|
+
} as any;
|
|
52
|
+
|
|
53
|
+
const AppConfig = {
|
|
54
|
+
rootDir: TMP_DIR,
|
|
55
|
+
srcDir: 'src',
|
|
56
|
+
publicDir: 'public',
|
|
57
|
+
distDir: 'dist',
|
|
58
|
+
integrations: [mockIntegration],
|
|
59
|
+
processors: new Map([['image-processor', mockProcessor]]),
|
|
60
|
+
absolutePaths: {
|
|
61
|
+
distDir: path.join(TMP_DIR, 'dist'),
|
|
62
|
+
workDir: path.join(TMP_DIR, '.eco'),
|
|
63
|
+
} as EcoPagesAppConfig['absolutePaths'],
|
|
64
|
+
} as unknown as EcoPagesAppConfig;
|
|
65
|
+
|
|
66
|
+
const ServeOptions: ServeOptions = {
|
|
67
|
+
hostname: 'localhost',
|
|
68
|
+
port: 3000,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const Router = {} as FSRouter;
|
|
72
|
+
const RouteRendererFactory = {} as RouteRendererFactory;
|
|
73
|
+
const logger: ServerStaticBuilderLogger = {
|
|
74
|
+
warn: (message: string, detail?: string) => {
|
|
75
|
+
calls.warn.push([message, detail]);
|
|
76
|
+
},
|
|
77
|
+
info: (message: string) => {
|
|
78
|
+
calls.info.push(message);
|
|
79
|
+
},
|
|
80
|
+
error: (message: string) => {
|
|
81
|
+
calls.error.push(message);
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
const previewServerFactory: ServerStaticPreviewServerFactory = {
|
|
85
|
+
createServer: ({ appConfig, options }) => {
|
|
86
|
+
calls.createServer.push({ appConfig, options });
|
|
87
|
+
return {
|
|
88
|
+
server: { port: 3000 },
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
calls,
|
|
95
|
+
StaticSiteGenerator,
|
|
96
|
+
AppConfig,
|
|
97
|
+
mockIntegration,
|
|
98
|
+
mockProcessor,
|
|
99
|
+
logger,
|
|
100
|
+
previewServerFactory,
|
|
101
|
+
ServeOptions,
|
|
102
|
+
Router,
|
|
103
|
+
RouteRendererFactory,
|
|
104
|
+
ApiHandlers: [],
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
describe('ServerStaticBuilder', () => {
|
|
109
|
+
beforeAll(() => {
|
|
110
|
+
fs.mkdirSync(TMP_DIR, { recursive: true });
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
afterAll(() => {
|
|
114
|
+
fs.rmSync(TMP_DIR, { recursive: true, force: true });
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('should warn when API handlers are registered for static build modes', async () => {
|
|
118
|
+
const { AppConfig, StaticSiteGenerator, ServeOptions, Router, RouteRendererFactory, logger, calls } =
|
|
119
|
+
createMockDependencies();
|
|
120
|
+
|
|
121
|
+
const builder = new ServerStaticBuilder({
|
|
122
|
+
appConfig: AppConfig,
|
|
123
|
+
staticSiteGenerator: StaticSiteGenerator,
|
|
124
|
+
serveOptions: ServeOptions,
|
|
125
|
+
logger,
|
|
126
|
+
apiHandlers: [
|
|
127
|
+
{ method: 'GET', path: '/api/auth/*', handler: () => undefined } as any,
|
|
128
|
+
{ method: 'POST', path: '/api/auth/*', handler: () => undefined } as any,
|
|
129
|
+
],
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
await builder.build(undefined, {
|
|
133
|
+
router: Router,
|
|
134
|
+
routeRendererFactory: RouteRendererFactory,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
assert.deepEqual(calls.warn, [
|
|
138
|
+
[
|
|
139
|
+
'Registered API endpoints are not available in static build or preview modes because no server runtime is started. They are excluded from the generated output.\n',
|
|
140
|
+
'➤ GET /api/auth/*, POST /api/auth/*',
|
|
141
|
+
],
|
|
142
|
+
]);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe('constructor', () => {
|
|
146
|
+
it('should create instance with provided options', () => {
|
|
147
|
+
const { AppConfig, StaticSiteGenerator, ServeOptions, logger, previewServerFactory } =
|
|
148
|
+
createMockDependencies();
|
|
149
|
+
const builder = new ServerStaticBuilder({
|
|
150
|
+
appConfig: AppConfig,
|
|
151
|
+
staticSiteGenerator: StaticSiteGenerator,
|
|
152
|
+
serveOptions: ServeOptions,
|
|
153
|
+
logger,
|
|
154
|
+
previewServerFactory,
|
|
155
|
+
});
|
|
156
|
+
expect(builder).toBeDefined();
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe('build', () => {
|
|
161
|
+
it('should run static site generator with correct options', async () => {
|
|
162
|
+
const { AppConfig, StaticSiteGenerator, ServeOptions, Router, RouteRendererFactory, logger, calls } =
|
|
163
|
+
createMockDependencies();
|
|
164
|
+
|
|
165
|
+
const builder = new ServerStaticBuilder({
|
|
166
|
+
appConfig: AppConfig,
|
|
167
|
+
staticSiteGenerator: StaticSiteGenerator,
|
|
168
|
+
serveOptions: ServeOptions,
|
|
169
|
+
logger,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
await builder.build(undefined, {
|
|
173
|
+
router: Router,
|
|
174
|
+
routeRendererFactory: RouteRendererFactory,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
assert.deepEqual(calls.staticSiteGeneratorRun, [
|
|
178
|
+
{
|
|
179
|
+
router: Router,
|
|
180
|
+
baseUrl: 'http://localhost:3000',
|
|
181
|
+
routeRendererFactory: RouteRendererFactory,
|
|
182
|
+
staticRoutes: undefined,
|
|
183
|
+
},
|
|
184
|
+
]);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('should handle custom serve options for base URL', async () => {
|
|
188
|
+
const { AppConfig, StaticSiteGenerator, Router, RouteRendererFactory, logger, calls } =
|
|
189
|
+
createMockDependencies();
|
|
190
|
+
|
|
191
|
+
const customServeOptions: ServeOptions = {
|
|
192
|
+
hostname: '0.0.0.0',
|
|
193
|
+
port: 8080,
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const builder = new ServerStaticBuilder({
|
|
197
|
+
appConfig: AppConfig,
|
|
198
|
+
staticSiteGenerator: StaticSiteGenerator,
|
|
199
|
+
serveOptions: customServeOptions,
|
|
200
|
+
logger,
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
await builder.build(undefined, {
|
|
204
|
+
router: Router,
|
|
205
|
+
routeRendererFactory: RouteRendererFactory,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
assert.equal((calls.staticSiteGeneratorRun[0] as { baseUrl: string }).baseUrl, 'http://0.0.0.0:8080');
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('should start preview server when preview option is true', async () => {
|
|
212
|
+
const {
|
|
213
|
+
AppConfig,
|
|
214
|
+
StaticSiteGenerator,
|
|
215
|
+
ServeOptions,
|
|
216
|
+
Router,
|
|
217
|
+
RouteRendererFactory,
|
|
218
|
+
logger,
|
|
219
|
+
previewServerFactory,
|
|
220
|
+
calls,
|
|
221
|
+
} = createMockDependencies();
|
|
222
|
+
|
|
223
|
+
const builder = new ServerStaticBuilder({
|
|
224
|
+
appConfig: AppConfig,
|
|
225
|
+
staticSiteGenerator: StaticSiteGenerator,
|
|
226
|
+
serveOptions: ServeOptions,
|
|
227
|
+
logger,
|
|
228
|
+
previewServerFactory,
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
await builder.build(
|
|
232
|
+
{ preview: true },
|
|
233
|
+
{
|
|
234
|
+
router: Router,
|
|
235
|
+
routeRendererFactory: RouteRendererFactory,
|
|
236
|
+
},
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
assert.deepEqual(calls.createServer, [
|
|
240
|
+
{
|
|
241
|
+
appConfig: AppConfig,
|
|
242
|
+
options: { port: 3000 },
|
|
243
|
+
},
|
|
244
|
+
]);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it('should rebuild integration runtime assets after resetting the export directory', async () => {
|
|
248
|
+
const { AppConfig, StaticSiteGenerator, ServeOptions, Router, RouteRendererFactory, logger, calls } =
|
|
249
|
+
createMockDependencies();
|
|
250
|
+
|
|
251
|
+
const builder = new ServerStaticBuilder({
|
|
252
|
+
appConfig: AppConfig,
|
|
253
|
+
staticSiteGenerator: StaticSiteGenerator,
|
|
254
|
+
serveOptions: ServeOptions,
|
|
255
|
+
logger,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
await builder.build(undefined, {
|
|
259
|
+
router: Router,
|
|
260
|
+
routeRendererFactory: RouteRendererFactory,
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
assert.equal(calls.integrationSetup, 1);
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
it('should rebuild processor-owned assets after resetting the export directory', async () => {
|
|
267
|
+
const { AppConfig, StaticSiteGenerator, ServeOptions, Router, RouteRendererFactory, logger, calls } =
|
|
268
|
+
createMockDependencies();
|
|
269
|
+
|
|
270
|
+
const builder = new ServerStaticBuilder({
|
|
271
|
+
appConfig: AppConfig,
|
|
272
|
+
staticSiteGenerator: StaticSiteGenerator,
|
|
273
|
+
serveOptions: ServeOptions,
|
|
274
|
+
logger,
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
await builder.build(undefined, {
|
|
278
|
+
router: Router,
|
|
279
|
+
routeRendererFactory: RouteRendererFactory,
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
assert.equal(calls.processorSetup, 1);
|
|
283
|
+
assert.equal(
|
|
284
|
+
fs.readFileSync(path.join(TMP_DIR, 'dist', 'images', 'processor.webp'), 'utf8'),
|
|
285
|
+
'processor-output',
|
|
286
|
+
);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
it('should reset stale export contents before regenerating the public output', async () => {
|
|
290
|
+
const { AppConfig, StaticSiteGenerator, ServeOptions, Router, RouteRendererFactory, logger } =
|
|
291
|
+
createMockDependencies();
|
|
292
|
+
|
|
293
|
+
const publicDir = path.join(TMP_DIR, 'src', 'public');
|
|
294
|
+
const distDir = AppConfig.absolutePaths.distDir;
|
|
295
|
+
fs.mkdirSync(publicDir, { recursive: true });
|
|
296
|
+
fs.mkdirSync(path.join(distDir, '.server-modules-meta'), { recursive: true });
|
|
297
|
+
fs.writeFileSync(path.join(publicDir, 'site.css'), 'body { color: red; }');
|
|
298
|
+
fs.writeFileSync(path.join(distDir, '.server-modules-meta', 'stale.js'), 'stale');
|
|
299
|
+
|
|
300
|
+
const builder = new ServerStaticBuilder({
|
|
301
|
+
appConfig: AppConfig,
|
|
302
|
+
staticSiteGenerator: StaticSiteGenerator,
|
|
303
|
+
serveOptions: ServeOptions,
|
|
304
|
+
logger,
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
await builder.build(undefined, {
|
|
308
|
+
router: Router,
|
|
309
|
+
routeRendererFactory: RouteRendererFactory,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
expect(fs.existsSync(path.join(distDir, '.server-modules-meta'))).toBe(false);
|
|
313
|
+
expect(fs.readFileSync(path.join(distDir, 'site.css'), 'utf8')).toBe('body { color: red; }');
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
});
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileSystem } from '@ecopages/file-system';
|
|
1
3
|
import { StaticContentServer } from '../../dev/sc-server';
|
|
2
4
|
import { appLogger } from '../../global/app-logger';
|
|
3
5
|
import type { EcoPagesAppConfig } from '../../internal-types';
|
|
4
|
-
import type { StaticRoute } from '../../public-types';
|
|
6
|
+
import type { ApiHandler, StaticRoute } from '../../public-types';
|
|
5
7
|
import type { RouteRendererFactory } from '../../route-renderer/route-renderer';
|
|
6
|
-
import type { FSRouter } from '../../router/fs-router';
|
|
8
|
+
import type { FSRouter } from '../../router/server/fs-router';
|
|
7
9
|
import type { StaticSiteGenerator } from '../../static-site-generator/static-site-generator';
|
|
8
10
|
|
|
9
11
|
export interface StaticBuildOptions {
|
|
@@ -19,6 +21,29 @@ export interface ServerStaticBuilderParams {
|
|
|
19
21
|
appConfig: EcoPagesAppConfig;
|
|
20
22
|
staticSiteGenerator: StaticSiteGenerator;
|
|
21
23
|
serveOptions: ServeOptions;
|
|
24
|
+
apiHandlers?: ApiHandler[];
|
|
25
|
+
logger?: ServerStaticBuilderLogger;
|
|
26
|
+
previewServerFactory?: ServerStaticPreviewServerFactory;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Minimal logger dependency used by the static builder.
|
|
31
|
+
*/
|
|
32
|
+
export interface ServerStaticBuilderLogger {
|
|
33
|
+
warn(message: string, detail?: string): unknown;
|
|
34
|
+
info(message: string): unknown;
|
|
35
|
+
error(message: string): unknown;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Preview server factory dependency used when static preview mode is enabled.
|
|
40
|
+
*/
|
|
41
|
+
export interface ServerStaticPreviewServerFactory {
|
|
42
|
+
createServer(args: { appConfig: EcoPagesAppConfig; options: { port: number } }): {
|
|
43
|
+
server?: {
|
|
44
|
+
port?: number;
|
|
45
|
+
} | null;
|
|
46
|
+
};
|
|
22
47
|
}
|
|
23
48
|
|
|
24
49
|
/**
|
|
@@ -28,11 +53,67 @@ export class ServerStaticBuilder {
|
|
|
28
53
|
private readonly appConfig: EcoPagesAppConfig;
|
|
29
54
|
private readonly staticSiteGenerator: StaticSiteGenerator;
|
|
30
55
|
private readonly serveOptions: ServeOptions;
|
|
56
|
+
private readonly apiHandlers: ApiHandler[];
|
|
57
|
+
private readonly logger: ServerStaticBuilderLogger;
|
|
58
|
+
private readonly previewServerFactory: ServerStaticPreviewServerFactory;
|
|
31
59
|
|
|
32
|
-
constructor({
|
|
60
|
+
constructor({
|
|
61
|
+
appConfig,
|
|
62
|
+
staticSiteGenerator,
|
|
63
|
+
serveOptions,
|
|
64
|
+
apiHandlers,
|
|
65
|
+
logger,
|
|
66
|
+
previewServerFactory,
|
|
67
|
+
}: ServerStaticBuilderParams) {
|
|
33
68
|
this.appConfig = appConfig;
|
|
34
69
|
this.staticSiteGenerator = staticSiteGenerator;
|
|
35
70
|
this.serveOptions = serveOptions;
|
|
71
|
+
this.apiHandlers = apiHandlers ?? [];
|
|
72
|
+
this.logger = logger ?? appLogger;
|
|
73
|
+
this.previewServerFactory = previewServerFactory ?? StaticContentServer;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private warnApiHandlersUnavailableInStaticMode(): void {
|
|
77
|
+
if (this.apiHandlers.length === 0) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const uniqueHandlers = Array.from(
|
|
82
|
+
new Set(this.apiHandlers.map((handler) => `${handler.method} ${handler.path}`)),
|
|
83
|
+
);
|
|
84
|
+
const visibleHandlers = uniqueHandlers.slice(0, 5).join(', ');
|
|
85
|
+
const remainingCount = uniqueHandlers.length - Math.min(uniqueHandlers.length, 5);
|
|
86
|
+
const summary = remainingCount > 0 ? `${visibleHandlers}, +${remainingCount} more` : visibleHandlers;
|
|
87
|
+
|
|
88
|
+
this.logger.warn(
|
|
89
|
+
'Registered API endpoints are not available in static build or preview modes because no server runtime is started. They are excluded from the generated output.\n',
|
|
90
|
+
`➤ ${summary}`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private prepareExportDirectory(): void {
|
|
95
|
+
const exportDir =
|
|
96
|
+
this.appConfig.absolutePaths?.distDir ?? path.join(this.appConfig.rootDir, this.appConfig.distDir);
|
|
97
|
+
fileSystem.ensureDir(exportDir, true);
|
|
98
|
+
|
|
99
|
+
const srcPublicDir = path.join(
|
|
100
|
+
this.appConfig.rootDir,
|
|
101
|
+
this.appConfig.srcDir ?? 'src',
|
|
102
|
+
this.appConfig.publicDir ?? 'public',
|
|
103
|
+
);
|
|
104
|
+
if (fileSystem.exists(srcPublicDir)) {
|
|
105
|
+
fileSystem.copyDir(srcPublicDir, exportDir);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private async refreshRuntimeAssets(): Promise<void> {
|
|
110
|
+
for (const processor of this.appConfig.processors.values()) {
|
|
111
|
+
await processor.setup();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
for (const integration of this.appConfig.integrations) {
|
|
115
|
+
await integration.setup();
|
|
116
|
+
}
|
|
36
117
|
}
|
|
37
118
|
|
|
38
119
|
/**
|
|
@@ -53,6 +134,9 @@ export class ServerStaticBuilder {
|
|
|
53
134
|
const { preview = false } = options ?? {};
|
|
54
135
|
|
|
55
136
|
const baseUrl = `http://${this.serveOptions.hostname || 'localhost'}:${this.serveOptions.port || 3000}`;
|
|
137
|
+
this.warnApiHandlersUnavailableInStaticMode();
|
|
138
|
+
this.prepareExportDirectory();
|
|
139
|
+
await this.refreshRuntimeAssets();
|
|
56
140
|
|
|
57
141
|
await this.staticSiteGenerator.run({
|
|
58
142
|
router: dependencies.router,
|
|
@@ -62,21 +146,21 @@ export class ServerStaticBuilder {
|
|
|
62
146
|
});
|
|
63
147
|
|
|
64
148
|
if (!preview) {
|
|
65
|
-
|
|
149
|
+
this.logger.info('Build completed');
|
|
66
150
|
return;
|
|
67
151
|
}
|
|
68
152
|
|
|
69
153
|
const previewPort = this.serveOptions.port || 3000;
|
|
70
154
|
|
|
71
|
-
const { server } =
|
|
155
|
+
const { server } = this.previewServerFactory.createServer({
|
|
72
156
|
appConfig: this.appConfig,
|
|
73
157
|
options: { port: Number(previewPort) },
|
|
74
158
|
});
|
|
75
159
|
|
|
76
|
-
if (server) {
|
|
77
|
-
|
|
160
|
+
if (server?.port) {
|
|
161
|
+
this.logger.info(`Preview running at http://localhost:${server.port}`);
|
|
78
162
|
} else {
|
|
79
|
-
|
|
163
|
+
this.logger.error('Failed to start preview server');
|
|
80
164
|
}
|
|
81
165
|
}
|
|
82
166
|
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Build Layer
|
|
2
|
+
|
|
3
|
+
This directory contains the runtime-neutral build contract used across Ecopages and the esbuild-backed implementation that currently powers the default fallback adapter.
|
|
4
|
+
|
|
5
|
+
## Files
|
|
6
|
+
|
|
7
|
+
- `build-adapter.ts`: shared build interfaces, result types, app-owned adapter/executor helpers, the exported `defaultBuildAdapter` fallback, and the top-level `build()` / `getTranspileOptions()` pipeline functions.
|
|
8
|
+
- `build-types.ts`: plugin bridge types used by integrations and processors.
|
|
9
|
+
- `esbuild-build-adapter.ts`: the concrete esbuild backend.
|
|
10
|
+
- `dev-build-coordinator.ts`: development-only orchestration around the shared esbuild backend.
|
|
11
|
+
- `*.test.ts`: focused regression coverage for plain builds and development serialization and recovery.
|
|
12
|
+
|
|
13
|
+
## Responsibilities
|
|
14
|
+
|
|
15
|
+
The build layer is intentionally split into two parts.
|
|
16
|
+
|
|
17
|
+
`BuildExecutor` is the runtime-facing contract.
|
|
18
|
+
|
|
19
|
+
- It is the narrow facade stored on `appConfig.runtime.buildExecutor`.
|
|
20
|
+
- It answers only how a given app instance should execute builds right now.
|
|
21
|
+
- `EsbuildBuildAdapter` satisfies this contract directly in plain flows.
|
|
22
|
+
- `DevBuildCoordinator` also satisfies this contract by wrapping the shared esbuild adapter with development-only serialization and recovery policy.
|
|
23
|
+
|
|
24
|
+
`EsbuildBuildAdapter` is the backend. It knows how to:
|
|
25
|
+
|
|
26
|
+
- load the esbuild module
|
|
27
|
+
- translate Ecopages `BuildOptions` into esbuild options
|
|
28
|
+
- bridge Ecopages build plugins into esbuild hooks
|
|
29
|
+
- normalize build output, logs, and dependency graph metadata
|
|
30
|
+
- detect the subset of runtime faults that mean the esbuild worker protocol is corrupted
|
|
31
|
+
|
|
32
|
+
`DevBuildCoordinator` is the development policy layer. It exists because one app/runtime can have many build callers during dev mode, including:
|
|
33
|
+
|
|
34
|
+
- page module imports
|
|
35
|
+
- HMR entrypoint builds
|
|
36
|
+
- script and asset processors
|
|
37
|
+
- React integration build paths
|
|
38
|
+
|
|
39
|
+
Those callers must not race each other against one long-lived esbuild worker. The coordinator therefore owns:
|
|
40
|
+
|
|
41
|
+
- serialized access to the shared adapter in development
|
|
42
|
+
- recycling warm Node-target esbuild sessions between builds
|
|
43
|
+
- recovery from known esbuild worker protocol faults
|
|
44
|
+
|
|
45
|
+
## Default Flow
|
|
46
|
+
|
|
47
|
+
Each `EcoPagesAppConfig` owns a build adapter, build manifest, and `buildExecutor` in `appConfig.runtime`. `ConfigBuilder.build()` now creates that app-owned build state up front so later runtime startup can reuse it rather than mutating a shared adapter.
|
|
48
|
+
|
|
49
|
+
When a Node or Bun server adapter starts in watch mode, it replaces that executor with a per-app `DevBuildCoordinator`. Build consumers then either call the executor directly or pass it explicitly to the top-level `build()` helper.
|
|
50
|
+
|
|
51
|
+
Plugins are part of app-owned manifest or per-build input now. The source build contract no longer exposes adapter-level plugin registration, which keeps build composition scoped to an app/runtime instance instead of leaking across instances.
|
|
52
|
+
|
|
53
|
+
HMR callers follow the same ownership model. Integration-specific runtime aliasing stays with the integration that owns those specifiers, rather than in generic core HMR bundling.
|
|
54
|
+
|
|
55
|
+
## Orchestration Diagram
|
|
56
|
+
|
|
57
|
+
```mermaid
|
|
58
|
+
flowchart TD
|
|
59
|
+
Config["ConfigBuilder.build()"] --> DefaultExec["appConfig.runtime.buildExecutor = createAppBuildExecutor(app adapter, manifest)"]
|
|
60
|
+
Adapter["Server adapter initialize() in watch mode"] --> DevExec["appConfig.runtime.buildExecutor = DevBuildCoordinator"]
|
|
61
|
+
Caller["Any build caller with app/runtime context"] --> Build["executor.build(options) or build(options, executor)"]
|
|
62
|
+
Build --> Executor["BuildExecutor"]
|
|
63
|
+
Executor --> Coordinator["DevBuildCoordinator.build()"]
|
|
64
|
+
Coordinator --> Backend["EsbuildBuildAdapter.buildOrThrow()"]
|
|
65
|
+
Executor -->|plain flow| Direct["EsbuildBuildAdapter.build()"]
|
|
66
|
+
Backend --> Result["BuildResult"]
|
|
67
|
+
Direct --> Result["BuildResult"]
|
|
68
|
+
Result --> Browser["Browser consumes emitted bundle directly"]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Recovery Model
|
|
72
|
+
|
|
73
|
+
The recovery path is narrow on purpose. The coordinator only treats an error as recoverable when `EsbuildBuildAdapter.isEsbuildProtocolError()` matches one of the known worker-protocol failure signatures.
|
|
74
|
+
|
|
75
|
+
When that happens, recovery does three things in order:
|
|
76
|
+
|
|
77
|
+
1. Reset the serialized queue so future builds are not stuck behind a wedged promise.
|
|
78
|
+
2. Stop the current esbuild service instance.
|
|
79
|
+
3. Increment the esbuild module generation so the next import gets a fresh worker instance.
|
|
80
|
+
|
|
81
|
+
After that reset, the coordinator retries the failed build once.
|
|
82
|
+
|
|
83
|
+
## Why Explicit App Ownership
|
|
84
|
+
|
|
85
|
+
There are many build callsites across core and integrations. The coordinator still needs to stay centralized, but process-global installation hid the real dependency and tied behavior to startup order.
|
|
86
|
+
|
|
87
|
+
The explicit app-owned executor model keeps the design honest:
|
|
88
|
+
|
|
89
|
+
- each app/runtime owns its own build executor
|
|
90
|
+
- development policy stays in one place (`DevBuildCoordinator`)
|
|
91
|
+
- callers with app context use that executor explicitly instead of consulting global state
|
|
92
|
+
- tests can still instantiate `EsbuildBuildAdapter` or `DevBuildCoordinator` directly when they want the raw backend only
|
|
93
|
+
|
|
94
|
+
## Testing Strategy
|
|
95
|
+
|
|
96
|
+
The build tests are split by concern.
|
|
97
|
+
|
|
98
|
+
- `build-adapter.test.ts` verifies plain backend behavior and plugin bridging.
|
|
99
|
+
- `build-adapter-serialization.test.ts` verifies development orchestration behavior such as serialization, warm-session recycling, and protocol-fault recovery.
|
|
100
|
+
|
|
101
|
+
If you change the build orchestration rules, update the coordinator tests first. If you change esbuild option mapping or plugin behavior, update the backend tests first.
|