@ecopages/core 0.2.0-alpha.5 → 0.2.0-alpha.7
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 +180 -47
- 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 +207 -97
- 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 +234 -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 -84
- 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 +71 -78
- 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 -11
- 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 -0
- package/src/watchers/project-watcher.test.ts +678 -0
- package/src/watchers/project-watcher.ts +49 -50
- package/CHANGELOG.md +0 -94
- 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 -79
- package/src/adapters/bun/hmr-manager.js +0 -222
- 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 -62
- package/src/adapters/node/node-hmr-manager.js +0 -221
- 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 -75
- 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 -391
- 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 -192
- 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 -1094
- 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 -132
- package/src/watchers/project-watcher.js +0 -281
- package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
- package/src/watchers/project-watcher.test-helpers.js +0 -51
- /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,148 @@
|
|
|
1
|
+
import { afterAll, beforeEach, describe, expect, test } from 'vitest';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import type { EcoBuildPlugin } from '../build/build-types.ts';
|
|
5
|
+
import type { EcoPagesAppConfig } from '../internal-types';
|
|
6
|
+
import { Processor, type ProcessorConfig } from './processor.ts';
|
|
7
|
+
|
|
8
|
+
class TestProcessor extends Processor {
|
|
9
|
+
override buildPlugins?: EcoBuildPlugin[] = [];
|
|
10
|
+
override plugins?: EcoBuildPlugin[] = [];
|
|
11
|
+
|
|
12
|
+
override async setup(): Promise<void> {}
|
|
13
|
+
|
|
14
|
+
override async process(input: unknown, _filePath?: string): Promise<unknown> {
|
|
15
|
+
return input;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
override async teardown(): Promise<void> {}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('Processor', () => {
|
|
22
|
+
let processor: TestProcessor;
|
|
23
|
+
let config: ProcessorConfig;
|
|
24
|
+
let appConfig: EcoPagesAppConfig;
|
|
25
|
+
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
config = {
|
|
28
|
+
name: 'test-processor',
|
|
29
|
+
options: { test: true },
|
|
30
|
+
watch: {
|
|
31
|
+
paths: ['/test'],
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const testRoot = path.join(process.cwd(), '.test-tmp', 'processor-test');
|
|
36
|
+
|
|
37
|
+
if (fs.existsSync(testRoot)) {
|
|
38
|
+
fs.rmSync(testRoot, { recursive: true, force: true });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
appConfig = {
|
|
42
|
+
rootDir: testRoot,
|
|
43
|
+
absolutePaths: {
|
|
44
|
+
srcDir: path.join(testRoot, 'src'),
|
|
45
|
+
distDir: path.join(testRoot, 'dist'),
|
|
46
|
+
},
|
|
47
|
+
} as EcoPagesAppConfig;
|
|
48
|
+
|
|
49
|
+
processor = new TestProcessor(config);
|
|
50
|
+
processor.setContext(appConfig);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
afterAll(() => {
|
|
54
|
+
fs.rmSync(path.join(process.cwd(), '.test-tmp'), { recursive: true, force: true });
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('should initialize with correct name', () => {
|
|
58
|
+
expect(processor.getName()).toBe('test-processor');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('should retain runtime capability declarations', () => {
|
|
62
|
+
const runtimeProcessor = new TestProcessor({
|
|
63
|
+
name: 'runtime-processor',
|
|
64
|
+
runtimeCapability: {
|
|
65
|
+
tags: ['requires-node-builtins'],
|
|
66
|
+
minRuntimeVersion: '18.0.0',
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
expect(runtimeProcessor.runtimeCapability).toEqual({
|
|
71
|
+
tags: ['requires-node-builtins'],
|
|
72
|
+
minRuntimeVersion: '18.0.0',
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('should return watch config', () => {
|
|
77
|
+
expect(processor.getWatchConfig()).toEqual({
|
|
78
|
+
paths: ['/test'],
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe('Processor capability matching', () => {
|
|
84
|
+
test('matches all extensions with * pattern', () => {
|
|
85
|
+
const processor = new TestProcessor({
|
|
86
|
+
name: 'wildcard-all',
|
|
87
|
+
capabilities: [{ kind: 'stylesheet', extensions: ['*'] }],
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
91
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test('matches explicit *.ext patterns', () => {
|
|
95
|
+
const processor = new TestProcessor({
|
|
96
|
+
name: 'wildcard-explicit',
|
|
97
|
+
capabilities: [{ kind: 'stylesheet', extensions: ['*.css'] }],
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
101
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('matches grouped extension patterns', () => {
|
|
105
|
+
const processor = new TestProcessor({
|
|
106
|
+
name: 'wildcard-group',
|
|
107
|
+
capabilities: [{ kind: 'stylesheet', extensions: ['*.{css,scss,sass}'] }],
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
111
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
|
|
112
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(true);
|
|
113
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.less')).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('matches grouped patterns with mixed case and spacing', () => {
|
|
117
|
+
const processor = new TestProcessor({
|
|
118
|
+
name: 'wildcard-group-normalized',
|
|
119
|
+
capabilities: [{ kind: 'stylesheet', extensions: ['*.{ CSS, ScSs , .SASS }'] }],
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
123
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
|
|
124
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(true);
|
|
125
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.less')).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('matches plain extension and dotted extension forms', () => {
|
|
129
|
+
const processor = new TestProcessor({
|
|
130
|
+
name: 'plain-ext',
|
|
131
|
+
capabilities: [{ kind: 'stylesheet', extensions: ['css', '.scss'] }],
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
135
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
|
|
136
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(false);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test('respects capability kind filtering', () => {
|
|
140
|
+
const processor = new TestProcessor({
|
|
141
|
+
name: 'kind-filter',
|
|
142
|
+
capabilities: [{ kind: 'image', extensions: ['*.png'] }],
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(false);
|
|
146
|
+
expect(processor.canProcessAsset('image', '/src/assets/logo.png')).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
});
|
package/src/plugins/processor.ts
CHANGED
|
@@ -2,8 +2,12 @@ import path from 'node:path';
|
|
|
2
2
|
import { fileSystem } from '@ecopages/file-system';
|
|
3
3
|
import type { EcoBuildPlugin } from '../build/build-types.ts';
|
|
4
4
|
import type { EcoPagesAppConfig, IClientBridge } from '../internal-types';
|
|
5
|
-
import type { AssetDefinition } from '../services/asset-processing-service';
|
|
5
|
+
import type { AssetDefinition } from '../services/assets/asset-processing-service';
|
|
6
|
+
import { DEFAULT_ECOPAGES_WORK_DIR } from '../constants.ts';
|
|
6
7
|
import { GENERATED_BASE_PATHS } from '../constants';
|
|
8
|
+
import type { RuntimeCapabilityDeclaration } from './runtime-capability.ts';
|
|
9
|
+
|
|
10
|
+
export type { RuntimeCapabilityDeclaration, RuntimeCapabilityTag } from './runtime-capability.ts';
|
|
7
11
|
|
|
8
12
|
export const PROCESSOR_ERRORS = {
|
|
9
13
|
CACHE_DIRECTORY_NOT_SET: 'Cache directory not set in context',
|
|
@@ -56,6 +60,7 @@ export interface ProcessorConfig<TOptions = Record<string, unknown>> {
|
|
|
56
60
|
options?: TOptions;
|
|
57
61
|
watch?: ProcessorWatchConfig;
|
|
58
62
|
capabilities?: ProcessorAssetCapability[];
|
|
63
|
+
runtimeCapability?: RuntimeCapabilityDeclaration;
|
|
59
64
|
}
|
|
60
65
|
export interface ProcessorContext {
|
|
61
66
|
config: EcoPagesAppConfig;
|
|
@@ -78,6 +83,7 @@ export abstract class Processor<TOptions = Record<string, unknown>> {
|
|
|
78
83
|
protected options?: TOptions;
|
|
79
84
|
protected watchConfig?: ProcessorWatchConfig;
|
|
80
85
|
protected capabilities: ProcessorAssetCapability[] = [];
|
|
86
|
+
readonly runtimeCapability?: RuntimeCapabilityDeclaration;
|
|
81
87
|
|
|
82
88
|
/** Plugins that are only used during the build process */
|
|
83
89
|
abstract buildPlugins?: EcoBuildPlugin[];
|
|
@@ -90,11 +96,15 @@ export abstract class Processor<TOptions = Record<string, unknown>> {
|
|
|
90
96
|
this.options = config.options;
|
|
91
97
|
this.watchConfig = config.watch;
|
|
92
98
|
this.capabilities = config.capabilities ?? [];
|
|
99
|
+
this.runtimeCapability = config.runtimeCapability;
|
|
93
100
|
}
|
|
94
101
|
|
|
95
102
|
setContext(appConfig: EcoPagesAppConfig): void {
|
|
103
|
+
const workDir =
|
|
104
|
+
appConfig.absolutePaths.workDir ??
|
|
105
|
+
path.join(appConfig.rootDir, appConfig.workDir ?? DEFAULT_ECOPAGES_WORK_DIR);
|
|
96
106
|
const cachePath = resolveGeneratedPath('cache', {
|
|
97
|
-
root:
|
|
107
|
+
root: workDir,
|
|
98
108
|
module: this.name,
|
|
99
109
|
});
|
|
100
110
|
|
|
@@ -109,6 +119,16 @@ export abstract class Processor<TOptions = Record<string, unknown>> {
|
|
|
109
119
|
};
|
|
110
120
|
}
|
|
111
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Prepares build-facing processor contributions before config finalization.
|
|
124
|
+
*
|
|
125
|
+
* @remarks
|
|
126
|
+
* Override this when a processor must compute runtime/build plugins or other
|
|
127
|
+
* manifest-owned state before startup. Runtime-only work such as cache
|
|
128
|
+
* warming or watcher registration should stay in `setup()`.
|
|
129
|
+
*/
|
|
130
|
+
async prepareBuildContributions(): Promise<void> {}
|
|
131
|
+
|
|
112
132
|
abstract setup(): Promise<void>;
|
|
113
133
|
abstract teardown(): Promise<void>;
|
|
114
134
|
abstract process(input: unknown, filePath?: string): Promise<unknown>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type RuntimeCapabilityTag =
|
|
2
|
+
| 'bun-only'
|
|
3
|
+
| 'node-compatible'
|
|
4
|
+
| 'requires-native-bun-api'
|
|
5
|
+
| 'requires-node-builtins';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Declares the runtime assumptions a plugin makes so config finalization can
|
|
9
|
+
* reject incompatible startup environments before bootstrapping the app.
|
|
10
|
+
*/
|
|
11
|
+
export interface RuntimeCapabilityDeclaration {
|
|
12
|
+
tags: RuntimeCapabilityTag[];
|
|
13
|
+
minRuntimeVersion?: string;
|
|
14
|
+
}
|
package/src/public-types.ts
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import type { Readable } from 'node:stream';
|
|
2
|
-
import type { ApiResponseBuilder } from './adapters/shared/api-response.
|
|
2
|
+
import type { ApiResponseBuilder } from './adapters/shared/api-response.ts';
|
|
3
|
+
import type { BuildExecutor } from './build/build-adapter.ts';
|
|
3
4
|
import type { EcoBuildPlugin } from './build/build-types.ts';
|
|
4
5
|
import type { EcoPageComponent } from './eco/eco.types.ts';
|
|
5
6
|
import type { EcoPagesAppConfig } from './internal-types.ts';
|
|
6
7
|
import type { HmrStrategy } from './hmr/hmr-strategy.ts';
|
|
7
|
-
import type {
|
|
8
|
+
import type { BrowserBundleExecutor } from './services/assets/browser-bundle.service.ts';
|
|
9
|
+
import type { ProcessedAsset } from './services/assets/asset-processing-service/assets.types.ts';
|
|
8
10
|
import type { CacheStats, CacheStrategy } from './services/cache/cache.types.ts';
|
|
9
11
|
import type { InteractionEventsString as ScriptsInjectorInteractionEventsString } from '@ecopages/scripts-injector/types';
|
|
10
12
|
|
|
11
13
|
export type { EcoPageComponent } from './eco/eco.types.ts';
|
|
14
|
+
export type { MarkerGraphContext } from './route-renderer/component-graph/marker-graph-resolver.ts';
|
|
15
|
+
export type { ProcessedAsset } from './services/assets/asset-processing-service/assets.types.ts';
|
|
12
16
|
|
|
13
17
|
import type {
|
|
14
18
|
StandardSchema,
|
|
@@ -98,7 +102,7 @@ export interface CacheInvalidator {
|
|
|
98
102
|
|
|
99
103
|
/**
|
|
100
104
|
* Context interface for HMR strategies.
|
|
101
|
-
* Provides access to watched files, specifier mappings, and build configuration.
|
|
105
|
+
* Provides access to watched files, registered bare-specifier mappings, and build configuration.
|
|
102
106
|
*/
|
|
103
107
|
export interface DefaultHmrContext {
|
|
104
108
|
/**
|
|
@@ -107,7 +111,7 @@ export interface DefaultHmrContext {
|
|
|
107
111
|
getWatchedFiles(): Map<string, string>;
|
|
108
112
|
|
|
109
113
|
/**
|
|
110
|
-
* Map of bare specifiers to
|
|
114
|
+
* Map of bare specifiers to runtime URLs for browser import resolution.
|
|
111
115
|
*/
|
|
112
116
|
getSpecifierMap(): Map<string, string>;
|
|
113
117
|
|
|
@@ -137,6 +141,20 @@ export interface DefaultHmrContext {
|
|
|
137
141
|
* Used by plugins to identify page files for transformation.
|
|
138
142
|
*/
|
|
139
143
|
getPagesDir(): string;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Build executor owned by the active app/runtime.
|
|
147
|
+
*/
|
|
148
|
+
getBuildExecutor(): BuildExecutor;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Browser bundler owned by the active app/runtime.
|
|
152
|
+
*/
|
|
153
|
+
getBrowserBundleService(): BrowserBundleExecutor;
|
|
154
|
+
/**
|
|
155
|
+
* Server-side module loader owned by the active app/runtime.
|
|
156
|
+
*/
|
|
157
|
+
importServerModule<T = unknown>(filePath: string): Promise<T>;
|
|
140
158
|
}
|
|
141
159
|
|
|
142
160
|
/**
|
|
@@ -180,12 +198,31 @@ export interface IClientBridge {
|
|
|
180
198
|
*/
|
|
181
199
|
export interface IHmrManager {
|
|
182
200
|
/**
|
|
183
|
-
* Registers
|
|
201
|
+
* Registers an integration-owned client entrypoint to be built and watched.
|
|
202
|
+
*
|
|
203
|
+
* @remarks
|
|
204
|
+
* This path is strict: the owning integration must emit the expected `_hmr`
|
|
205
|
+
* bundle. Missing output is treated as a development pipeline failure.
|
|
184
206
|
*/
|
|
185
207
|
registerEntrypoint(entrypointPath: string): Promise<string>;
|
|
186
208
|
|
|
187
209
|
/**
|
|
188
|
-
* Registers
|
|
210
|
+
* Registers a generic script asset entrypoint to be built and watched.
|
|
211
|
+
*
|
|
212
|
+
* @remarks
|
|
213
|
+
* This path exists for non-page script assets that are not owned by a
|
|
214
|
+
* framework integration. Unlike `registerEntrypoint()`, it may use the generic
|
|
215
|
+
* script bundling path.
|
|
216
|
+
*/
|
|
217
|
+
registerScriptEntrypoint(entrypointPath: string): Promise<string>;
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Registers mappings from bare specifiers to runtime URLs.
|
|
221
|
+
*
|
|
222
|
+
* @remarks
|
|
223
|
+
* This is the shared registration seam for integration-owned runtime alias
|
|
224
|
+
* maps. The registry may later back a broader import-map-style facility, but
|
|
225
|
+
* the mappings themselves remain integration-owned.
|
|
189
226
|
*/
|
|
190
227
|
registerSpecifierMap(map: Record<string, string>): void;
|
|
191
228
|
|
|
@@ -225,7 +262,7 @@ export interface IHmrManager {
|
|
|
225
262
|
getWatchedFiles(): Map<string, string>;
|
|
226
263
|
|
|
227
264
|
/**
|
|
228
|
-
* Gets the specifier map.
|
|
265
|
+
* Gets the registered bare-specifier map.
|
|
229
266
|
*/
|
|
230
267
|
getSpecifierMap(): Map<string, string>;
|
|
231
268
|
|
|
@@ -327,7 +364,7 @@ export type EcoComponentConfig = {
|
|
|
327
364
|
* MyPage.config = { layout: Layout };
|
|
328
365
|
* ```
|
|
329
366
|
*/
|
|
330
|
-
layout?:
|
|
367
|
+
layout?: EcoPageLayoutComponent<any>;
|
|
331
368
|
dependencies?: EcoComponentDependencies;
|
|
332
369
|
/**
|
|
333
370
|
* Internal: Resolved lazy scripts grouped by trigger.
|
|
@@ -450,6 +487,13 @@ export interface PageHeadProps<T = EcoPagesElement> {
|
|
|
450
487
|
children?: T;
|
|
451
488
|
}
|
|
452
489
|
|
|
490
|
+
/**
|
|
491
|
+
* Represents the props for a route layout.
|
|
492
|
+
*/
|
|
493
|
+
export interface LayoutProps<T = EcoPagesElement> extends Partial<RequestPageContext> {
|
|
494
|
+
children: T;
|
|
495
|
+
}
|
|
496
|
+
|
|
453
497
|
/**
|
|
454
498
|
* Represents the props for the HTML template of a page.
|
|
455
499
|
*/
|
|
@@ -460,6 +504,24 @@ export interface HtmlTemplateProps extends PageHeadProps {
|
|
|
460
504
|
pageProps: Record<string, unknown>;
|
|
461
505
|
}
|
|
462
506
|
|
|
507
|
+
/**
|
|
508
|
+
* Layout components accepted by pages.
|
|
509
|
+
*
|
|
510
|
+
* This preserves compatibility with existing `eco.component()` layouts while
|
|
511
|
+
* also supporting semantic `eco.layout()` declarations.
|
|
512
|
+
*/
|
|
513
|
+
export type EcoPageLayoutComponent<T = EcoPagesElement> = EcoLayoutComponent<T> | EcoComponent<any, T>;
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Represents a layout component created with eco.layout().
|
|
517
|
+
*/
|
|
518
|
+
export type EcoLayoutComponent<T = EcoPagesElement> = EcoComponent<LayoutProps<T>, T>;
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Represents an HTML shell component created with eco.html().
|
|
522
|
+
*/
|
|
523
|
+
export type EcoHtmlComponent<T = EcoPagesElement> = EcoComponent<HtmlTemplateProps, T>;
|
|
524
|
+
|
|
463
525
|
/**
|
|
464
526
|
* Represents the props for the error 404 template.
|
|
465
527
|
*/
|
|
@@ -683,9 +745,9 @@ type StylesheetContentIntegrationPluginDependencies = {
|
|
|
683
745
|
export type IntegrationRendererRenderOptions<C = EcoPagesElement> = RouteRendererOptions & {
|
|
684
746
|
props?: Record<string, unknown>;
|
|
685
747
|
metadata: PageMetadataProps;
|
|
686
|
-
HtmlTemplate:
|
|
748
|
+
HtmlTemplate: EcoHtmlComponent<C>;
|
|
687
749
|
Page: EcoComponent<PageProps, C>;
|
|
688
|
-
Layout?:
|
|
750
|
+
Layout?: EcoPageLayoutComponent<any>;
|
|
689
751
|
dependencies?: EcoComponentDependencies;
|
|
690
752
|
resolvedDependencies: ProcessedAsset[];
|
|
691
753
|
componentRender?: ComponentRenderResult;
|
|
@@ -762,7 +824,7 @@ export interface RenderContext {
|
|
|
762
824
|
* @param props - Props to pass to the view
|
|
763
825
|
* @param options - Optional status code and headers
|
|
764
826
|
*/
|
|
765
|
-
render<P = Record<string, unknown>>(view: EcoComponent<P>, props
|
|
827
|
+
render<P = Record<string, unknown>>(view: EcoComponent<P>, props?: P, options?: RenderOptions): Promise<Response>;
|
|
766
828
|
|
|
767
829
|
/**
|
|
768
830
|
* Render an eco.page view without layout (for partials/fragments).
|
|
@@ -136,7 +136,7 @@ flowchart TD
|
|
|
136
136
|
K -- Yes --> L[buildGlobalInjectorAssets]
|
|
137
137
|
K -- No --> M[continue]
|
|
138
138
|
L --> M
|
|
139
|
-
M --> N[
|
|
139
|
+
M --> N[HtmlTransformerService dedupeProcessedAssets]
|
|
140
140
|
N --> O[htmlTransformer setProcessedDependencies]
|
|
141
141
|
O --> P[return normalized render options]
|
|
142
142
|
```
|
|
@@ -155,11 +155,11 @@ flowchart TD
|
|
|
155
155
|
F --> G{contains eco marker token?}
|
|
156
156
|
G -- Yes --> H[resolveMarkerGraphHtml]
|
|
157
157
|
G -- No --> I[skip graph resolution]
|
|
158
|
-
H --> J[
|
|
158
|
+
H --> J[HtmlTransformerService dedupeProcessedAssets]
|
|
159
159
|
J --> K[merge marker assets into transformer deps]
|
|
160
160
|
I --> L{root attributes attachable?}
|
|
161
161
|
K --> L
|
|
162
|
-
L -- Yes --> M[
|
|
162
|
+
L -- Yes --> M[HtmlTransformerService applyAttributesToFirstBodyElement]
|
|
163
163
|
L -- No --> N[leave html unchanged]
|
|
164
164
|
M --> O[htmlTransformer transform]
|
|
165
165
|
N --> O
|
|
@@ -190,16 +190,14 @@ flowchart LR
|
|
|
190
190
|
A[IntegrationRenderer] --> B[RenderPreparationService]
|
|
191
191
|
A --> C[RenderExecutionService]
|
|
192
192
|
A --> D[MarkerGraphResolver]
|
|
193
|
-
A --> E[HtmlPostProcessingService]
|
|
194
193
|
A --> F[PageModuleLoaderService]
|
|
195
194
|
A --> G[DependencyResolverService]
|
|
196
195
|
A --> H[HtmlTransformerService]
|
|
197
196
|
|
|
198
197
|
B --> F
|
|
199
198
|
B --> G
|
|
200
|
-
B -->
|
|
199
|
+
B --> H
|
|
201
200
|
C --> D
|
|
202
|
-
C --> E
|
|
203
201
|
C --> H
|
|
204
202
|
```
|
|
205
203
|
|
|
@@ -348,7 +346,7 @@ For someone new to the rendering system, this is probably the most useful order
|
|
|
348
346
|
7. `render-preparation.service.ts`
|
|
349
347
|
8. `render-execution.service.ts`
|
|
350
348
|
9. `marker-graph-resolver.ts`
|
|
351
|
-
10. `html-
|
|
349
|
+
10. `html-transformer.service.ts`
|
|
352
350
|
11. `page-module-loader.ts`
|
|
353
351
|
12. `dependency-resolver.ts`
|
|
354
352
|
13. `component-marker.ts`
|
|
@@ -356,7 +354,6 @@ For someone new to the rendering system, this is probably the most useful order
|
|
|
356
354
|
15. `component-graph-executor.ts`
|
|
357
355
|
16. `eco.ts`
|
|
358
356
|
17. `component-render-context.ts`
|
|
359
|
-
18. `html-transformer.service.ts`
|
|
360
357
|
|
|
361
358
|
## 9) Key Files
|
|
362
359
|
|
|
@@ -368,18 +365,17 @@ For someone new to the rendering system, this is probably the most useful order
|
|
|
368
365
|
- `packages/core/src/adapters/shared/explicit-static-route-matcher.ts`
|
|
369
366
|
- `packages/core/src/adapters/shared/render-context.ts`
|
|
370
367
|
- `packages/core/src/route-renderer/route-renderer.ts`
|
|
371
|
-
- `packages/core/src/route-renderer/integration-renderer.ts`
|
|
372
|
-
- `packages/core/src/route-renderer/render-preparation.service.ts`
|
|
373
|
-
- `packages/core/src/route-renderer/render-execution.service.ts`
|
|
374
|
-
- `packages/core/src/route-renderer/
|
|
375
|
-
- `packages/core/src/route-renderer/
|
|
376
|
-
- `packages/core/src/route-renderer/component-
|
|
377
|
-
- `packages/core/src/route-renderer/component-graph.ts`
|
|
378
|
-
- `packages/core/src/route-renderer/
|
|
379
|
-
- `packages/core/src/route-renderer/page-
|
|
380
|
-
- `packages/core/src/
|
|
381
|
-
- `packages/core/src/services/page-
|
|
382
|
-
- `packages/core/src/services/page-request-cache-coordinator.service.ts`
|
|
368
|
+
- `packages/core/src/route-renderer/orchestration/integration-renderer.ts`
|
|
369
|
+
- `packages/core/src/route-renderer/orchestration/render-preparation.service.ts`
|
|
370
|
+
- `packages/core/src/route-renderer/orchestration/render-execution.service.ts`
|
|
371
|
+
- `packages/core/src/route-renderer/component-graph/marker-graph-resolver.ts`
|
|
372
|
+
- `packages/core/src/route-renderer/component-graph/component-marker.ts`
|
|
373
|
+
- `packages/core/src/route-renderer/component-graph/component-graph.ts`
|
|
374
|
+
- `packages/core/src/route-renderer/component-graph/component-graph-executor.ts`
|
|
375
|
+
- `packages/core/src/route-renderer/page-loading/page-module-loader.ts`
|
|
376
|
+
- `packages/core/src/route-renderer/page-loading/dependency-resolver.ts`
|
|
377
|
+
- `packages/core/src/services/module-loading/page-module-import.service.ts`
|
|
378
|
+
- `packages/core/src/services/cache/page-request-cache-coordinator.service.ts`
|
|
383
379
|
- `packages/core/src/eco/component-render-context.ts`
|
|
384
380
|
- `packages/core/src/eco/eco.ts`
|
|
385
381
|
- `packages/core/src/services/html-transformer.service.ts`
|
|
@@ -19,15 +19,13 @@ The route renderer layer is responsible for:
|
|
|
19
19
|
- `RouteRendererFactory` chooses integration renderers based on route file extension.
|
|
20
20
|
- `RouteRenderer` delegates route execution to the selected integration renderer.
|
|
21
21
|
|
|
22
|
-
### `
|
|
22
|
+
### `orchestration/`
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Framework-owned orchestration services and renderer base class:
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
4. Render HTML via integration-specific `render()`.
|
|
30
|
-
5. Inject processed assets into final HTML through `HtmlTransformerService`.
|
|
26
|
+
- `integration-renderer.ts`: abstract base class that coordinates end-to-end route rendering.
|
|
27
|
+
- `render-preparation.service.ts`: page module/data/dependency preparation before render.
|
|
28
|
+
- `render-execution.service.ts`: render capture, marker-graph resolution, and finalization.
|
|
31
29
|
|
|
32
30
|
It also provides:
|
|
33
31
|
|
|
@@ -35,26 +33,17 @@ It also provides:
|
|
|
35
33
|
- `renderComponent()` contract for component-level orchestration and artifact reporting.
|
|
36
34
|
- marker graph resolution for nested cross-integration component boundaries.
|
|
37
35
|
|
|
38
|
-
### `component-
|
|
36
|
+
### `component-graph/`
|
|
39
37
|
|
|
40
|
-
|
|
38
|
+
Component marker contracts and graph resolution:
|
|
41
39
|
|
|
42
40
|
- `createComponentMarker()` for canonical `<eco-marker ...></eco-marker>` generation.
|
|
43
41
|
- `parseComponentMarkers()` for marker extraction from rendered HTML.
|
|
44
|
-
|
|
45
|
-
### `component-graph.ts`
|
|
46
|
-
|
|
47
|
-
Builds a deterministic DAG from marker nodes:
|
|
48
|
-
|
|
49
42
|
- node collection by marker id.
|
|
50
43
|
- parent/child edges from slot reference registry.
|
|
51
44
|
- topological levels for bottom-up execution.
|
|
52
45
|
|
|
53
|
-
### `
|
|
54
|
-
|
|
55
|
-
Resolves graph levels in reverse order (leaf to root) and replaces markers with rendered HTML via integration `renderComponent()`.
|
|
56
|
-
|
|
57
|
-
### `page-module-loader.ts`
|
|
46
|
+
### `page-loading/`
|
|
58
47
|
|
|
59
48
|
Service for loading page modules and deriving page data:
|
|
60
49
|
|
|
@@ -62,8 +51,6 @@ Service for loading page modules and deriving page data:
|
|
|
62
51
|
- `resolvePageModule()` normalizes exports and statics.
|
|
63
52
|
- `resolvePageData()` resolves static props then metadata.
|
|
64
53
|
|
|
65
|
-
### `dependency-resolver.ts`
|
|
66
|
-
|
|
67
54
|
Builds processed assets from component dependency declarations:
|
|
68
55
|
|
|
69
56
|
- Scripts/styles/components/modules.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createComponentMarker } from './component-marker.ts';
|
|
3
|
+
import { extractComponentGraph } from './component-graph.ts';
|
|
4
|
+
import { resolveComponentGraph } from './component-graph-executor.ts';
|
|
5
|
+
|
|
6
|
+
describe('component graph executor', () => {
|
|
7
|
+
it('resolves markers bottom-up using graph levels', async () => {
|
|
8
|
+
const html = [
|
|
9
|
+
'<main>',
|
|
10
|
+
createComponentMarker({
|
|
11
|
+
nodeId: 'n_1',
|
|
12
|
+
integration: 'lit',
|
|
13
|
+
componentRef: 'c_parent',
|
|
14
|
+
propsRef: 'p_parent',
|
|
15
|
+
slotRef: 's_parent',
|
|
16
|
+
}),
|
|
17
|
+
createComponentMarker({
|
|
18
|
+
nodeId: 'n_2',
|
|
19
|
+
integration: 'react',
|
|
20
|
+
componentRef: 'c_child',
|
|
21
|
+
propsRef: 'p_child',
|
|
22
|
+
}),
|
|
23
|
+
'</main>',
|
|
24
|
+
].join('');
|
|
25
|
+
|
|
26
|
+
const graph = extractComponentGraph(html, {
|
|
27
|
+
s_parent: ['n_2'],
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const resolved = await resolveComponentGraph(html, graph, async (marker) => {
|
|
31
|
+
if (marker.nodeId === 'n_2') {
|
|
32
|
+
return { html: '<section>child</section>' };
|
|
33
|
+
}
|
|
34
|
+
return { html: '<article>parent</article>' };
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
expect(resolved).toContain('<article>parent</article>');
|
|
38
|
+
expect(resolved).toContain('<section>child</section>');
|
|
39
|
+
expect(resolved).not.toContain('<eco-marker');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createComponentMarker } from './component-marker.ts';
|
|
3
|
+
import { extractComponentGraph } from './component-graph.ts';
|
|
4
|
+
|
|
5
|
+
describe('component graph extraction', () => {
|
|
6
|
+
it('extracts nodes in deterministic order without slot links', () => {
|
|
7
|
+
const html = [
|
|
8
|
+
createComponentMarker({ nodeId: 'n_1', integration: 'lit', componentRef: 'c_1', propsRef: 'p_1' }),
|
|
9
|
+
createComponentMarker({ nodeId: 'n_2', integration: 'react', componentRef: 'c_2', propsRef: 'p_2' }),
|
|
10
|
+
].join('');
|
|
11
|
+
|
|
12
|
+
const graph = extractComponentGraph(html);
|
|
13
|
+
expect([...graph.nodes.keys()]).toEqual(['n_1', 'n_2']);
|
|
14
|
+
expect(graph.levels).toEqual([['n_1', 'n_2']]);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('builds parent child edges from slot registry', () => {
|
|
18
|
+
const html = [
|
|
19
|
+
createComponentMarker({
|
|
20
|
+
nodeId: 'n_1',
|
|
21
|
+
integration: 'lit',
|
|
22
|
+
componentRef: 'c_1',
|
|
23
|
+
propsRef: 'p_1',
|
|
24
|
+
slotRef: 's_1',
|
|
25
|
+
}),
|
|
26
|
+
createComponentMarker({ nodeId: 'n_2', integration: 'react', componentRef: 'c_2', propsRef: 'p_2' }),
|
|
27
|
+
].join('');
|
|
28
|
+
|
|
29
|
+
const graph = extractComponentGraph(html, {
|
|
30
|
+
s_1: ['n_2'],
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
expect(graph.edges.get('n_1')).toEqual(new Set(['n_2']));
|
|
34
|
+
expect(graph.reverseEdges.get('n_2')).toEqual(new Set(['n_1']));
|
|
35
|
+
expect(graph.levels).toEqual([['n_1'], ['n_2']]);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('throws when slot links create cycles', () => {
|
|
39
|
+
const html = [
|
|
40
|
+
createComponentMarker({
|
|
41
|
+
nodeId: 'n_1',
|
|
42
|
+
integration: 'lit',
|
|
43
|
+
componentRef: 'c_1',
|
|
44
|
+
propsRef: 'p_1',
|
|
45
|
+
slotRef: 's_1',
|
|
46
|
+
}),
|
|
47
|
+
createComponentMarker({
|
|
48
|
+
nodeId: 'n_2',
|
|
49
|
+
integration: 'react',
|
|
50
|
+
componentRef: 'c_2',
|
|
51
|
+
propsRef: 'p_2',
|
|
52
|
+
slotRef: 's_2',
|
|
53
|
+
}),
|
|
54
|
+
].join('');
|
|
55
|
+
|
|
56
|
+
expect(() =>
|
|
57
|
+
extractComponentGraph(html, {
|
|
58
|
+
s_1: ['n_2'],
|
|
59
|
+
s_2: ['n_1'],
|
|
60
|
+
}),
|
|
61
|
+
).toThrow('Component marker graph contains a cycle');
|
|
62
|
+
});
|
|
63
|
+
});
|