@ecopages/core 0.2.0-alpha.1 → 0.2.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -70
- package/README.md +213 -12
- package/package.json +50 -18
- package/src/adapters/README.md +39 -0
- package/src/adapters/bun/hmr-manager.d.ts +77 -18
- package/src/adapters/bun/hmr-manager.js +159 -52
- package/src/adapters/bun/index.d.ts +1 -2
- package/src/adapters/bun/index.js +1 -1
- package/src/adapters/bun/server-adapter.js +35 -30
- package/src/adapters/bun/server-lifecycle.d.ts +24 -13
- package/src/adapters/bun/server-lifecycle.js +32 -60
- package/src/adapters/index.d.ts +1 -1
- package/src/adapters/index.js +1 -1
- package/src/adapters/node/bootstrap-dependency-resolver.d.ts +44 -0
- package/src/adapters/node/bootstrap-dependency-resolver.js +172 -0
- package/src/adapters/node/index.d.ts +2 -0
- package/src/adapters/node/index.js +3 -0
- package/src/adapters/node/node-hmr-manager.d.ts +87 -16
- package/src/adapters/node/node-hmr-manager.js +179 -88
- package/src/adapters/node/runtime-adapter.d.ts +46 -0
- package/src/adapters/node/runtime-adapter.js +306 -0
- package/src/adapters/node/server-adapter.d.ts +2 -31
- package/src/adapters/node/server-adapter.js +31 -93
- package/src/adapters/node/static-content-server.d.ts +36 -0
- package/src/adapters/node/static-content-server.js +28 -0
- package/src/adapters/node/write-runtime-manifest.d.ts +26 -0
- package/src/adapters/node/write-runtime-manifest.js +12 -0
- package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
- package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
- package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
- package/src/adapters/shared/fs-server-response-matcher.d.ts +9 -5
- package/src/adapters/shared/fs-server-response-matcher.js +13 -8
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
- package/src/adapters/shared/hmr-html-response.d.ts +22 -0
- package/src/adapters/shared/hmr-html-response.js +32 -0
- package/src/adapters/shared/render-context.js +3 -2
- package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
- package/src/adapters/shared/runtime-bootstrap.js +43 -0
- package/src/adapters/shared/server-adapter.d.ts +12 -2
- package/src/adapters/shared/server-adapter.js +37 -4
- package/src/adapters/shared/server-route-handler.d.ts +1 -1
- package/src/adapters/shared/server-route-handler.js +4 -13
- package/src/adapters/shared/server-static-builder.d.ts +35 -3
- package/src/adapters/shared/server-static-builder.js +59 -6
- package/src/build/README.md +101 -0
- package/src/build/build-adapter.d.ts +114 -2
- package/src/build/build-adapter.js +119 -5
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -0
- package/src/build/dev-build-coordinator.d.ts +74 -0
- package/src/build/dev-build-coordinator.js +161 -0
- package/src/build/esbuild-build-adapter.d.ts +9 -6
- package/src/build/esbuild-build-adapter.js +103 -71
- package/src/build/runtime-build-executor.d.ts +13 -0
- package/src/build/runtime-build-executor.js +20 -0
- package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
- package/src/build/runtime-specifier-alias-plugin.js +31 -0
- package/src/config/README.md +33 -0
- package/src/config/config-builder.d.ts +28 -17
- package/src/config/config-builder.js +221 -48
- package/src/constants.d.ts +13 -0
- package/src/constants.js +4 -0
- package/src/declarations.d.ts +18 -13
- package/src/eco/README.md +70 -16
- package/src/eco/component-render-context.d.ts +1 -1
- package/src/eco/component-render-context.js +26 -16
- package/src/eco/eco.js +16 -12
- package/src/eco/eco.types.d.ts +12 -4
- package/src/hmr/README.md +26 -0
- package/src/hmr/client/hmr-runtime.d.ts +1 -6
- package/src/hmr/client/hmr-runtime.js +30 -7
- package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
- package/src/hmr/hmr.postcss.test.e2e.js +31 -0
- package/src/hmr/hmr.test.e2e.js +26 -33
- package/src/hmr/strategies/js-hmr-strategy.d.ts +45 -42
- package/src/hmr/strategies/js-hmr-strategy.js +70 -71
- package/src/index.d.ts +1 -1
- package/src/index.js +1 -1
- package/src/integrations/ghtml/ghtml-renderer.d.ts +1 -1
- package/src/integrations/ghtml/ghtml-renderer.js +3 -1
- package/src/internal-types.d.ts +39 -18
- package/src/plugins/README.md +34 -0
- package/src/plugins/alias-resolver-plugin.js +17 -3
- package/src/plugins/eco-component-meta-plugin.d.ts +2 -0
- package/src/plugins/eco-component-meta-plugin.js +1 -1
- package/src/plugins/integration-plugin.d.ts +38 -4
- package/src/plugins/integration-plugin.js +34 -1
- package/src/plugins/processor.d.ts +14 -1
- package/src/plugins/processor.js +15 -1
- package/src/plugins/runtime-capability.d.ts +9 -0
- package/src/public-types.d.ts +65 -10
- package/src/route-renderer/GRAPH.md +16 -20
- package/src/route-renderer/README.md +8 -21
- package/src/route-renderer/component-graph/component-reference.d.ts +10 -0
- package/src/route-renderer/component-graph/component-reference.js +19 -0
- package/src/route-renderer/{marker-graph-resolver.d.ts → component-graph/marker-graph-resolver.d.ts} +6 -5
- package/src/route-renderer/{marker-graph-resolver.js → component-graph/marker-graph-resolver.js} +10 -8
- package/src/route-renderer/{integration-renderer.d.ts → orchestration/integration-renderer.d.ts} +45 -12
- package/src/route-renderer/{integration-renderer.js → orchestration/integration-renderer.js} +79 -16
- package/src/route-renderer/{render-execution.service.d.ts → orchestration/render-execution.service.d.ts} +39 -5
- package/src/route-renderer/{render-execution.service.js → orchestration/render-execution.service.js} +58 -28
- package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +13 -4
- package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +92 -3
- package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +18 -4
- package/src/route-renderer/page-loading/page-module-loader.d.ts +87 -0
- package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +36 -14
- package/src/route-renderer/route-renderer.d.ts +36 -1
- package/src/route-renderer/route-renderer.js +19 -0
- package/src/router/README.md +26 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.js +34 -0
- package/src/router/client/link-intent.test.browser.d.ts +1 -0
- package/src/router/client/link-intent.test.browser.js +43 -0
- package/src/router/client/navigation-coordinator.d.ts +149 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
- package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +8 -7
- package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
- package/src/router/{fs-router.js → server/fs-router.js} +1 -1
- package/src/services/README.md +29 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +88 -7
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
- package/src/services/assets/asset-processing-service/assets.types.js +0 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/index.d.ts +2 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/index.js +2 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +3 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +14 -22
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +5 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +4 -1
- package/src/services/assets/browser-bundle.service.d.ts +32 -0
- package/src/services/assets/browser-bundle.service.js +33 -0
- package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
- package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
- package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
- package/src/services/html/html-rewriter-provider.service.js +65 -0
- package/src/services/html/html-transformer.service.d.ts +77 -0
- package/src/services/html/html-transformer.service.js +221 -0
- package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
- package/src/services/invalidation/development-invalidation.service.js +189 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +16 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +34 -0
- package/src/services/module-loading/page-module-import.service.d.ts +71 -0
- package/src/services/module-loading/page-module-import.service.js +132 -0
- package/src/services/module-loading/server-loader.service.d.ts +96 -0
- package/src/services/module-loading/server-loader.service.js +32 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +69 -0
- package/src/services/module-loading/server-module-transpiler.service.js +61 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +35 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.js +60 -0
- package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
- package/src/services/runtime-state/dev-graph.service.js +162 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
- package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
- package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.d.ts +53 -1
- package/src/static-site-generator/static-site-generator.js +86 -5
- package/src/utils/resolve-work-dir.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/watchers/project-watcher.d.ts +37 -21
- package/src/watchers/project-watcher.js +109 -66
- package/src/watchers/project-watcher.test-helpers.js +1 -0
- package/src/adapters/abstract/application-adapter.ts +0 -337
- package/src/adapters/abstract/router-adapter.ts +0 -30
- package/src/adapters/abstract/server-adapter.ts +0 -79
- package/src/adapters/bun/client-bridge.ts +0 -62
- package/src/adapters/bun/create-app.ts +0 -189
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.ts +0 -281
- package/src/adapters/bun/index.ts +0 -3
- package/src/adapters/bun/server-adapter.ts +0 -492
- package/src/adapters/bun/server-lifecycle.ts +0 -154
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.ts +0 -9
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -271
- package/src/adapters/node/server-adapter.ts +0 -561
- package/src/adapters/node/static-content-server.ts +0 -203
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
- package/src/adapters/shared/render-context.ts +0 -105
- package/src/adapters/shared/server-adapter.ts +0 -442
- package/src/adapters/shared/server-route-handler.ts +0 -166
- package/src/adapters/shared/server-static-builder.ts +0 -82
- package/src/build/build-adapter.ts +0 -132
- package/src/build/build-types.ts +0 -83
- package/src/build/esbuild-build-adapter.ts +0 -510
- package/src/config/config-builder.ts +0 -474
- package/src/constants.ts +0 -39
- package/src/create-app.ts +0 -87
- package/src/define-api-handler.js +0 -15
- package/src/define-api-handler.ts +0 -66
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/component-render-context.ts +0 -202
- package/src/eco/eco.ts +0 -221
- package/src/eco/eco.types.ts +0 -202
- package/src/eco/eco.utils.ts +0 -89
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -2
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
- package/src/hmr/client/hmr-runtime.ts +0 -121
- package/src/hmr/hmr-strategy.ts +0 -172
- package/src/hmr/hmr.test.e2e.ts +0 -75
- package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -212
- package/src/plugins/alias-resolver-plugin.ts +0 -45
- package/src/plugins/eco-component-meta-plugin.ts +0 -474
- package/src/plugins/integration-plugin.ts +0 -184
- package/src/plugins/processor.ts +0 -220
- package/src/public-types.ts +0 -1255
- package/src/route-renderer/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph.ts +0 -159
- package/src/route-renderer/component-marker.ts +0 -117
- package/src/route-renderer/dependency-resolver.ts +0 -596
- package/src/route-renderer/html-post-processing.service.d.ts +0 -40
- package/src/route-renderer/html-post-processing.service.js +0 -86
- package/src/route-renderer/html-post-processing.service.ts +0 -103
- package/src/route-renderer/integration-renderer.ts +0 -696
- package/src/route-renderer/marker-graph-resolver.ts +0 -153
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.ts +0 -153
- package/src/route-renderer/render-execution.service.ts +0 -158
- package/src/route-renderer/render-preparation.service.ts +0 -358
- package/src/route-renderer/route-renderer.ts +0 -80
- package/src/router/fs-router-scanner.ts +0 -217
- package/src/router/fs-router.ts +0 -122
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
- package/src/services/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/asset-processing-service/assets.types.ts +0 -112
- package/src/services/asset-processing-service/index.ts +0 -3
- package/src/services/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
- package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
- package/src/services/asset-processing-service/processors/index.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.ts +0 -128
- package/src/services/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -359
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/watchers/project-watcher.test-helpers.ts +0 -40
- package/src/watchers/project-watcher.ts +0 -306
- /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
- /package/src/{services/asset-processing-service/assets.types.js → plugins/runtime-capability.js} +0 -0
- /package/src/route-renderer/{component-graph-executor.d.ts → component-graph/component-graph-executor.d.ts} +0 -0
- /package/src/route-renderer/{component-graph-executor.js → component-graph/component-graph-executor.js} +0 -0
- /package/src/route-renderer/{component-graph.d.ts → component-graph/component-graph.d.ts} +0 -0
- /package/src/route-renderer/{component-graph.js → component-graph/component-graph.js} +0 -0
- /package/src/route-renderer/{component-marker.d.ts → component-graph/component-marker.d.ts} +0 -0
- /package/src/route-renderer/{component-marker.js → component-graph/component-marker.js} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.d.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
package/src/route-renderer/{integration-renderer.js → orchestration/integration-renderer.js}
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { PageModuleLoaderService } from "
|
|
9
|
-
import { MarkerGraphResolver } from "
|
|
1
|
+
import {
|
|
2
|
+
} from "../../services/assets/asset-processing-service/index.js";
|
|
3
|
+
import { HtmlTransformerService } from "../../services/html/html-transformer.service.js";
|
|
4
|
+
import { invariant } from "../../utils/invariant.js";
|
|
5
|
+
import { HttpError } from "../../errors/http-error.js";
|
|
6
|
+
import { LocalsAccessError } from "../../errors/locals-access-error.js";
|
|
7
|
+
import { DependencyResolverService } from "../page-loading/dependency-resolver.js";
|
|
8
|
+
import { PageModuleLoaderService } from "../page-loading/page-module-loader.js";
|
|
9
|
+
import { MarkerGraphResolver } from "../component-graph/marker-graph-resolver.js";
|
|
10
10
|
import { RenderExecutionService } from "./render-execution.service.js";
|
|
11
11
|
import { RenderPreparationService } from "./render-preparation.service.js";
|
|
12
12
|
function createLocalsProxy(filePath) {
|
|
@@ -49,7 +49,6 @@ class IntegrationRenderer {
|
|
|
49
49
|
pageModuleLoaderService;
|
|
50
50
|
markerGraphResolver;
|
|
51
51
|
renderPreparationService;
|
|
52
|
-
htmlPostProcessingService;
|
|
53
52
|
renderExecutionService;
|
|
54
53
|
DOC_TYPE = "<!DOCTYPE html>";
|
|
55
54
|
setHmrManager(hmrManager) {
|
|
@@ -104,7 +103,7 @@ class IntegrationRenderer {
|
|
|
104
103
|
async prepareViewDependencies(view, layout) {
|
|
105
104
|
const HtmlTemplate = await this.getHtmlTemplate();
|
|
106
105
|
const componentsToResolve = layout ? [HtmlTemplate, layout, view] : [HtmlTemplate, view];
|
|
107
|
-
const resolvedDependencies = this.
|
|
106
|
+
const resolvedDependencies = this.htmlTransformer.dedupeProcessedAssets(
|
|
108
107
|
await this.resolveDependencies(componentsToResolve)
|
|
109
108
|
);
|
|
110
109
|
this.htmlTransformer.setProcessedDependencies(resolvedDependencies);
|
|
@@ -125,7 +124,6 @@ class IntegrationRenderer {
|
|
|
125
124
|
this.pageModuleLoaderService = new PageModuleLoaderService(appConfig, runtimeOrigin);
|
|
126
125
|
this.markerGraphResolver = new MarkerGraphResolver();
|
|
127
126
|
this.renderPreparationService = new RenderPreparationService(appConfig, assetProcessingService);
|
|
128
|
-
this.htmlPostProcessingService = new HtmlPostProcessingService();
|
|
129
127
|
this.renderExecutionService = new RenderExecutionService();
|
|
130
128
|
}
|
|
131
129
|
/**
|
|
@@ -292,7 +290,7 @@ class IntegrationRenderer {
|
|
|
292
290
|
}),
|
|
293
291
|
getComponentRenderBoundaryContext: () => this.getComponentRenderBoundaryContext(),
|
|
294
292
|
setProcessedDependencies: (dependencies) => this.htmlTransformer.setProcessedDependencies(dependencies),
|
|
295
|
-
dedupeProcessedAssets: (assets) => this.
|
|
293
|
+
dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets),
|
|
296
294
|
createPageLocalsProxy: (filePath) => createLocalsProxy(filePath)
|
|
297
295
|
});
|
|
298
296
|
}
|
|
@@ -353,10 +351,12 @@ class IntegrationRenderer {
|
|
|
353
351
|
componentsToResolve: input.componentsToResolve,
|
|
354
352
|
graphContext: input.graphContext
|
|
355
353
|
}),
|
|
356
|
-
|
|
354
|
+
getDocumentAttributes: (renderOptions) => this.getDocumentAttributes(renderOptions),
|
|
355
|
+
dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets),
|
|
357
356
|
getProcessedDependencies: () => this.htmlTransformer.getProcessedDependencies(),
|
|
358
357
|
setProcessedDependencies: (dependencies) => this.htmlTransformer.setProcessedDependencies(dependencies),
|
|
359
|
-
|
|
358
|
+
applyAttributesToHtmlElement: (html, attributes) => this.htmlTransformer.applyAttributesToHtmlElement(html, attributes),
|
|
359
|
+
applyAttributesToFirstBodyElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstBodyElement(html, attributes),
|
|
360
360
|
transformHtml: async (html) => {
|
|
361
361
|
const response = await this.htmlTransformer.transform(
|
|
362
362
|
new Response(html, {
|
|
@@ -369,6 +369,69 @@ class IntegrationRenderer {
|
|
|
369
369
|
}
|
|
370
370
|
});
|
|
371
371
|
}
|
|
372
|
+
/**
|
|
373
|
+
* Captures a render pass as immutable HTML along with the graph context needed
|
|
374
|
+
* for deferred marker resolution.
|
|
375
|
+
*
|
|
376
|
+
* This is the shared entry point for direct `renderToResponse()` flows that
|
|
377
|
+
* need the same component graph capture semantics as route execution without
|
|
378
|
+
* going through `prepareRenderOptions()`.
|
|
379
|
+
*/
|
|
380
|
+
async captureHtmlRender(render) {
|
|
381
|
+
return this.renderExecutionService.captureHtmlRender(
|
|
382
|
+
this.name,
|
|
383
|
+
this.getComponentRenderBoundaryContext(),
|
|
384
|
+
render
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Finalizes previously captured HTML by resolving deferred markers, merging
|
|
389
|
+
* any emitted assets, stamping optional attributes, and optionally running the
|
|
390
|
+
* HTML transformer for full-document flows.
|
|
391
|
+
*/
|
|
392
|
+
async finalizeCapturedHtmlRender(options) {
|
|
393
|
+
const finalization = await this.renderExecutionService.finalizeHtmlRender(
|
|
394
|
+
{
|
|
395
|
+
html: options.html,
|
|
396
|
+
graphContext: options.graphContext,
|
|
397
|
+
componentsToResolve: options.componentsToResolve,
|
|
398
|
+
componentRootAttributes: options.componentRootAttributes,
|
|
399
|
+
documentAttributes: options.documentAttributes,
|
|
400
|
+
mergeAssets: options.mergeAssets ?? !options.partial
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
resolveMarkerGraphHtml: (input) => this.resolveMarkerGraphHtml({
|
|
404
|
+
html: input.html,
|
|
405
|
+
componentsToResolve: input.componentsToResolve,
|
|
406
|
+
graphContext: input.graphContext
|
|
407
|
+
}),
|
|
408
|
+
dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets),
|
|
409
|
+
getProcessedDependencies: () => this.htmlTransformer.getProcessedDependencies(),
|
|
410
|
+
setProcessedDependencies: (dependencies) => this.htmlTransformer.setProcessedDependencies(dependencies),
|
|
411
|
+
applyAttributesToHtmlElement: (html, attributes) => this.htmlTransformer.applyAttributesToHtmlElement(html, attributes),
|
|
412
|
+
applyAttributesToFirstBodyElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstBodyElement(html, attributes)
|
|
413
|
+
}
|
|
414
|
+
);
|
|
415
|
+
const shouldTransform = options.transformHtml ?? !options.partial;
|
|
416
|
+
if (!shouldTransform) {
|
|
417
|
+
return finalization.html;
|
|
418
|
+
}
|
|
419
|
+
const transformedResponse = await this.htmlTransformer.transform(
|
|
420
|
+
new Response(finalization.html, {
|
|
421
|
+
headers: { "Content-Type": "text/html" }
|
|
422
|
+
})
|
|
423
|
+
);
|
|
424
|
+
return await transformedResponse.text();
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Returns document-level attributes to stamp onto the rendered `<html>` tag.
|
|
428
|
+
*
|
|
429
|
+
* Integrations can override this to expose explicit document ownership or
|
|
430
|
+
* other runtime coordination markers without relying on script sniffing.
|
|
431
|
+
*/
|
|
432
|
+
getDocumentAttributes(_renderOptions) {
|
|
433
|
+
return void 0;
|
|
434
|
+
}
|
|
372
435
|
/**
|
|
373
436
|
* Resolves all `eco-marker` placeholders in rendered HTML using integration
|
|
374
437
|
* dispatch and bottom-up graph execution.
|
|
@@ -399,7 +462,7 @@ class IntegrationRenderer {
|
|
|
399
462
|
componentsToResolve: options.componentsToResolve,
|
|
400
463
|
graphContext: options.graphContext,
|
|
401
464
|
resolveRenderer: (integrationName) => this.getIntegrationRendererForName(integrationName, integrationRendererCache),
|
|
402
|
-
applyAttributesToFirstElement: (html, attributes) => this.
|
|
465
|
+
applyAttributesToFirstElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstElement(html, attributes)
|
|
403
466
|
});
|
|
404
467
|
}
|
|
405
468
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type ComponentRenderBoundaryContext } from '
|
|
2
|
-
import type { EcoComponent, IntegrationRendererRenderOptions, RouteRendererBody, RouteRendererOptions, RouteRenderResult } from '
|
|
3
|
-
import type { ProcessedAsset } from '
|
|
4
|
-
import type { MarkerGraphContext } from '
|
|
1
|
+
import { type ComponentRenderBoundaryContext } from '../../eco/component-render-context.js';
|
|
2
|
+
import type { EcoComponent, IntegrationRendererRenderOptions, RouteRendererBody, RouteRendererOptions, RouteRenderResult } from '../../public-types.js';
|
|
3
|
+
import type { ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
|
|
4
|
+
import type { MarkerGraphContext } from '../component-graph/marker-graph-resolver.js';
|
|
5
5
|
/**
|
|
6
6
|
* Serializable graph context merged from render-time captured references and
|
|
7
7
|
* optional explicit page-module graph metadata.
|
|
@@ -10,10 +10,23 @@ export type RenderExecutionGraphContext = {
|
|
|
10
10
|
propsByRef?: Record<string, Record<string, unknown>>;
|
|
11
11
|
slotChildrenByRef?: MarkerGraphContext['slotChildrenByRef'];
|
|
12
12
|
};
|
|
13
|
+
export interface CapturedHtmlRenderResult {
|
|
14
|
+
html: string;
|
|
15
|
+
graphContext: RenderExecutionGraphContext;
|
|
16
|
+
}
|
|
17
|
+
export interface FinalizeHtmlRenderOptions {
|
|
18
|
+
html: string;
|
|
19
|
+
graphContext: RenderExecutionGraphContext;
|
|
20
|
+
componentsToResolve: EcoComponent[];
|
|
21
|
+
componentRootAttributes?: Record<string, string>;
|
|
22
|
+
documentAttributes?: Record<string, string>;
|
|
23
|
+
mergeAssets?: boolean;
|
|
24
|
+
}
|
|
13
25
|
export interface RenderExecutionCallbacks<C> {
|
|
14
26
|
prepareRenderOptions(options: RouteRendererOptions): Promise<IntegrationRendererRenderOptions<C>>;
|
|
15
27
|
render(renderOptions: IntegrationRendererRenderOptions<C>): Promise<RouteRendererBody>;
|
|
16
28
|
getComponentRenderBoundaryContext(): ComponentRenderBoundaryContext;
|
|
29
|
+
getDocumentAttributes(renderOptions: IntegrationRendererRenderOptions<C>): Record<string, string> | undefined;
|
|
17
30
|
resolveMarkerGraphHtml(input: {
|
|
18
31
|
html: string;
|
|
19
32
|
componentsToResolve: EcoComponent[];
|
|
@@ -25,9 +38,25 @@ export interface RenderExecutionCallbacks<C> {
|
|
|
25
38
|
dedupeProcessedAssets(assets: ProcessedAsset[]): ProcessedAsset[];
|
|
26
39
|
getProcessedDependencies(): ProcessedAsset[];
|
|
27
40
|
setProcessedDependencies(dependencies: ProcessedAsset[]): void;
|
|
41
|
+
applyAttributesToHtmlElement(html: string, attributes: Record<string, string>): string;
|
|
28
42
|
applyAttributesToFirstBodyElement(html: string, attributes: Record<string, string>): string;
|
|
29
43
|
transformHtml(html: string): Promise<RouteRendererBody>;
|
|
30
44
|
}
|
|
45
|
+
export interface FinalizeHtmlRenderCallbacks {
|
|
46
|
+
resolveMarkerGraphHtml(input: {
|
|
47
|
+
html: string;
|
|
48
|
+
componentsToResolve: EcoComponent[];
|
|
49
|
+
graphContext: RenderExecutionGraphContext;
|
|
50
|
+
}): Promise<{
|
|
51
|
+
html: string;
|
|
52
|
+
assets: ProcessedAsset[];
|
|
53
|
+
}>;
|
|
54
|
+
dedupeProcessedAssets(assets: ProcessedAsset[]): ProcessedAsset[];
|
|
55
|
+
getProcessedDependencies(): ProcessedAsset[];
|
|
56
|
+
setProcessedDependencies(dependencies: ProcessedAsset[]): void;
|
|
57
|
+
applyAttributesToHtmlElement(html: string, attributes: Record<string, string>): string;
|
|
58
|
+
applyAttributesToFirstBodyElement(html: string, attributes: Record<string, string>): string;
|
|
59
|
+
}
|
|
31
60
|
/**
|
|
32
61
|
* Executes the main post-preparation rendering flow for integration renderers.
|
|
33
62
|
*
|
|
@@ -37,6 +66,7 @@ export interface RenderExecutionCallbacks<C> {
|
|
|
37
66
|
* transformation into a response body stream.
|
|
38
67
|
*/
|
|
39
68
|
export declare class RenderExecutionService {
|
|
69
|
+
captureHtmlRender(currentIntegrationName: string, boundaryContext: ComponentRenderBoundaryContext, render: () => Promise<RouteRendererBody>): Promise<CapturedHtmlRenderResult>;
|
|
40
70
|
/**
|
|
41
71
|
* Executes one integration render pass and returns the final route render
|
|
42
72
|
* result.
|
|
@@ -56,7 +86,11 @@ export declare class RenderExecutionService {
|
|
|
56
86
|
* @param explicitGraphContext Optional page-module graph metadata.
|
|
57
87
|
* @returns Merged graph context used during marker resolution.
|
|
58
88
|
*/
|
|
59
|
-
|
|
89
|
+
mergeGraphContext(capturedGraphContext: RenderExecutionGraphContext, explicitGraphContext?: RenderExecutionGraphContext): RenderExecutionGraphContext;
|
|
90
|
+
finalizeHtmlRender(options: FinalizeHtmlRenderOptions, callbacks: FinalizeHtmlRenderCallbacks): Promise<{
|
|
91
|
+
html: string;
|
|
92
|
+
assets: ProcessedAsset[];
|
|
93
|
+
}>;
|
|
60
94
|
/**
|
|
61
95
|
* Returns the component set that participates in marker graph resolution for a
|
|
62
96
|
* render pass.
|
package/src/route-renderer/{render-execution.service.js → orchestration/render-execution.service.js}
RENAMED
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runWithComponentRenderContext
|
|
3
|
-
} from "
|
|
3
|
+
} from "../../eco/component-render-context.js";
|
|
4
4
|
class RenderExecutionService {
|
|
5
|
+
async captureHtmlRender(currentIntegrationName, boundaryContext, render) {
|
|
6
|
+
const renderExecution = await runWithComponentRenderContext(
|
|
7
|
+
{
|
|
8
|
+
currentIntegration: currentIntegrationName,
|
|
9
|
+
boundaryContext
|
|
10
|
+
},
|
|
11
|
+
render
|
|
12
|
+
);
|
|
13
|
+
return {
|
|
14
|
+
html: await new Response(renderExecution.value).text(),
|
|
15
|
+
graphContext: renderExecution.graphContext
|
|
16
|
+
};
|
|
17
|
+
}
|
|
5
18
|
/**
|
|
6
19
|
* Executes one integration render pass and returns the final route render
|
|
7
20
|
* result.
|
|
@@ -15,40 +28,27 @@ class RenderExecutionService {
|
|
|
15
28
|
async execute(options, currentIntegrationName, callbacks) {
|
|
16
29
|
const renderOptions = await callbacks.prepareRenderOptions(options);
|
|
17
30
|
const shouldApplyComponentRootAttributes = renderOptions.componentRender?.canAttachAttributes && renderOptions.componentRender.rootAttributes && Object.keys(renderOptions.componentRender.rootAttributes).length > 0;
|
|
18
|
-
const renderExecution = await
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
boundaryContext: callbacks.getComponentRenderBoundaryContext()
|
|
22
|
-
},
|
|
31
|
+
const renderExecution = await this.captureHtmlRender(
|
|
32
|
+
currentIntegrationName,
|
|
33
|
+
callbacks.getComponentRenderBoundaryContext(),
|
|
23
34
|
async () => callbacks.render(renderOptions)
|
|
24
35
|
);
|
|
25
|
-
let renderedHtml = await new Response(renderExecution.value).text();
|
|
26
36
|
const componentGraphContext = this.mergeGraphContext(
|
|
27
37
|
renderExecution.graphContext,
|
|
28
38
|
renderOptions.componentGraphContext
|
|
29
39
|
);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
html:
|
|
40
|
+
const finalization = await this.finalizeHtmlRender(
|
|
41
|
+
{
|
|
42
|
+
html: renderExecution.html,
|
|
43
|
+
graphContext: componentGraphContext,
|
|
33
44
|
componentsToResolve: this.getComponentsToResolve(renderOptions),
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
]);
|
|
42
|
-
callbacks.setProcessedDependencies(mergedDependencies);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
if (shouldApplyComponentRootAttributes) {
|
|
46
|
-
renderedHtml = callbacks.applyAttributesToFirstBodyElement(
|
|
47
|
-
renderedHtml,
|
|
48
|
-
renderOptions.componentRender?.rootAttributes
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
const body = await callbacks.transformHtml(renderedHtml);
|
|
45
|
+
componentRootAttributes: shouldApplyComponentRootAttributes ? renderOptions.componentRender?.rootAttributes : void 0,
|
|
46
|
+
documentAttributes: callbacks.getDocumentAttributes(renderOptions),
|
|
47
|
+
mergeAssets: true
|
|
48
|
+
},
|
|
49
|
+
callbacks
|
|
50
|
+
);
|
|
51
|
+
const body = await callbacks.transformHtml(finalization.html);
|
|
52
52
|
return {
|
|
53
53
|
body,
|
|
54
54
|
cacheStrategy: renderOptions.cacheStrategy
|
|
@@ -74,6 +74,36 @@ class RenderExecutionService {
|
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
|
+
async finalizeHtmlRender(options, callbacks) {
|
|
78
|
+
let renderedHtml = options.html;
|
|
79
|
+
let markerAssets = [];
|
|
80
|
+
if (renderedHtml.includes("<eco-marker")) {
|
|
81
|
+
const markerResolution = await callbacks.resolveMarkerGraphHtml({
|
|
82
|
+
html: renderedHtml,
|
|
83
|
+
componentsToResolve: options.componentsToResolve,
|
|
84
|
+
graphContext: options.graphContext
|
|
85
|
+
});
|
|
86
|
+
renderedHtml = markerResolution.html;
|
|
87
|
+
markerAssets = markerResolution.assets;
|
|
88
|
+
if (options.mergeAssets !== false && markerResolution.assets.length > 0) {
|
|
89
|
+
const mergedDependencies = callbacks.dedupeProcessedAssets([
|
|
90
|
+
...callbacks.getProcessedDependencies(),
|
|
91
|
+
...markerResolution.assets
|
|
92
|
+
]);
|
|
93
|
+
callbacks.setProcessedDependencies(mergedDependencies);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (options.componentRootAttributes && Object.keys(options.componentRootAttributes).length > 0) {
|
|
97
|
+
renderedHtml = callbacks.applyAttributesToFirstBodyElement(renderedHtml, options.componentRootAttributes);
|
|
98
|
+
}
|
|
99
|
+
if (options.documentAttributes && Object.keys(options.documentAttributes).length > 0) {
|
|
100
|
+
renderedHtml = callbacks.applyAttributesToHtmlElement(renderedHtml, options.documentAttributes);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
html: renderedHtml,
|
|
104
|
+
assets: markerAssets
|
|
105
|
+
};
|
|
106
|
+
}
|
|
77
107
|
/**
|
|
78
108
|
* Returns the component set that participates in marker graph resolution for a
|
|
79
109
|
* render pass.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '
|
|
2
|
-
import type { ComponentRenderResult, EcoComponent, EcoPageComponent, EcoPageFile, EcoPagesElement, GetMetadata, GetStaticProps, HtmlTemplateProps, IntegrationRendererRenderOptions, PageMetadataProps, RouteRendererOptions } from '
|
|
3
|
-
import { type AssetProcessingService, type ProcessedAsset } from '
|
|
4
|
-
import { type ComponentRenderBoundaryContext } from '
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../internal-types.js';
|
|
2
|
+
import type { ComponentRenderResult, EcoComponent, EcoPageComponent, EcoPageFile, EcoPagesElement, GetMetadata, GetStaticProps, HtmlTemplateProps, IntegrationRendererRenderOptions, PageMetadataProps, RouteRendererOptions } from '../../public-types.js';
|
|
3
|
+
import { type AssetProcessingService, type ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
|
|
4
|
+
import { type ComponentRenderBoundaryContext } from '../../eco/component-render-context.js';
|
|
5
5
|
type ResolvedPageModule = {
|
|
6
6
|
Page: EcoPageFile['default'] | EcoPageComponent<any>;
|
|
7
7
|
getStaticProps?: GetStaticProps<Record<string, unknown>>;
|
|
@@ -49,6 +49,13 @@ export interface RenderPreparationCallbacks {
|
|
|
49
49
|
export declare class RenderPreparationService {
|
|
50
50
|
private appConfig;
|
|
51
51
|
private assetProcessingService;
|
|
52
|
+
/**
|
|
53
|
+
* Creates the render-preparation orchestrator for one app instance.
|
|
54
|
+
*
|
|
55
|
+
* @remarks
|
|
56
|
+
* The service is app-scoped because it depends on finalized config defaults and
|
|
57
|
+
* the app-owned asset-processing pipeline while remaining renderer-agnostic.
|
|
58
|
+
*/
|
|
52
59
|
constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService);
|
|
53
60
|
/**
|
|
54
61
|
* Builds the final render options object used by the integration-specific
|
|
@@ -108,5 +115,7 @@ export declare class RenderPreparationService {
|
|
|
108
115
|
* @returns Processed assets that should be merged into the final dependency set.
|
|
109
116
|
*/
|
|
110
117
|
private buildGlobalInjectorAssets;
|
|
118
|
+
private buildEagerSsrLazyAssets;
|
|
119
|
+
private collectEagerSsrLazyDependencies;
|
|
111
120
|
}
|
|
112
121
|
export {};
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import {
|
|
3
3
|
AssetFactory
|
|
4
|
-
} from "
|
|
5
|
-
import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "
|
|
6
|
-
import {
|
|
4
|
+
} from "../../services/assets/asset-processing-service/index.js";
|
|
5
|
+
import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../../eco/global-injector-map.js";
|
|
6
|
+
import {
|
|
7
|
+
runWithComponentRenderContext
|
|
8
|
+
} from "../../eco/component-render-context.js";
|
|
7
9
|
const coreRequire = createRequire(import.meta.url);
|
|
8
10
|
class RenderPreparationService {
|
|
11
|
+
appConfig;
|
|
12
|
+
assetProcessingService;
|
|
13
|
+
/**
|
|
14
|
+
* Creates the render-preparation orchestrator for one app instance.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* The service is app-scoped because it depends on finalized config defaults and
|
|
18
|
+
* the app-owned asset-processing pipeline while remaining renderer-agnostic.
|
|
19
|
+
*/
|
|
9
20
|
constructor(appConfig, assetProcessingService) {
|
|
10
21
|
this.appConfig = appConfig;
|
|
11
22
|
this.assetProcessingService = assetProcessingService;
|
|
@@ -56,6 +67,10 @@ class RenderPreparationService {
|
|
|
56
67
|
const globalAssets = await this.buildGlobalInjectorAssets(triggers, currentIntegrationName);
|
|
57
68
|
allDependencies.push(...globalAssets);
|
|
58
69
|
}
|
|
70
|
+
const eagerSsrLazyAssets = await this.buildEagerSsrLazyAssets(componentsToResolve, currentIntegrationName);
|
|
71
|
+
if (eagerSsrLazyAssets.length > 0) {
|
|
72
|
+
allDependencies.push(...eagerSsrLazyAssets);
|
|
73
|
+
}
|
|
59
74
|
callbacks.setProcessedDependencies(callbacks.dedupeProcessedAssets(allDependencies));
|
|
60
75
|
const pageProps = {
|
|
61
76
|
...props,
|
|
@@ -237,6 +252,80 @@ class RenderPreparationService {
|
|
|
237
252
|
currentIntegrationName
|
|
238
253
|
);
|
|
239
254
|
}
|
|
255
|
+
async buildEagerSsrLazyAssets(components, currentIntegrationName) {
|
|
256
|
+
const dependencies = this.collectEagerSsrLazyDependencies(components);
|
|
257
|
+
if (dependencies.length === 0) {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
return this.assetProcessingService.processDependencies(dependencies, `${currentIntegrationName}:ssr-lazy`);
|
|
261
|
+
}
|
|
262
|
+
collectEagerSsrLazyDependencies(components) {
|
|
263
|
+
const dependencies = [];
|
|
264
|
+
const visitedConfigs = /* @__PURE__ */ new Set();
|
|
265
|
+
const seenKeys = /* @__PURE__ */ new Set();
|
|
266
|
+
const normalizeAttributes = (attributes) => ({
|
|
267
|
+
type: "module",
|
|
268
|
+
defer: "",
|
|
269
|
+
...attributes ?? {}
|
|
270
|
+
});
|
|
271
|
+
const collect = (config) => {
|
|
272
|
+
if (!config || visitedConfigs.has(config)) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
visitedConfigs.add(config);
|
|
276
|
+
const componentFile = config.__eco?.file;
|
|
277
|
+
if (componentFile) {
|
|
278
|
+
const componentDir = coreRequire("node:path").dirname(componentFile);
|
|
279
|
+
for (const script of config.dependencies?.scripts ?? []) {
|
|
280
|
+
if (typeof script === "string" || !script.lazy || script.ssr !== true) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const attributes = normalizeAttributes(script.attributes);
|
|
284
|
+
if (script.content) {
|
|
285
|
+
const key2 = `content:${script.content}:${JSON.stringify(attributes)}`;
|
|
286
|
+
if (seenKeys.has(key2)) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
seenKeys.add(key2);
|
|
290
|
+
dependencies.push(
|
|
291
|
+
AssetFactory.createContentScript({
|
|
292
|
+
position: "head",
|
|
293
|
+
content: script.content,
|
|
294
|
+
attributes
|
|
295
|
+
})
|
|
296
|
+
);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (!script.src) {
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
const resolvedPath = coreRequire("node:path").resolve(componentDir, script.src);
|
|
303
|
+
const key = `file:${resolvedPath}:${JSON.stringify(attributes)}`;
|
|
304
|
+
if (seenKeys.has(key)) {
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
seenKeys.add(key);
|
|
308
|
+
dependencies.push(
|
|
309
|
+
AssetFactory.createFileScript({
|
|
310
|
+
filepath: resolvedPath,
|
|
311
|
+
position: "head",
|
|
312
|
+
attributes
|
|
313
|
+
})
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (config.layout?.config) {
|
|
318
|
+
collect(config.layout.config);
|
|
319
|
+
}
|
|
320
|
+
for (const nestedComponent of config.dependencies?.components ?? []) {
|
|
321
|
+
collect(nestedComponent?.config);
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
for (const component of components) {
|
|
325
|
+
collect(component.config);
|
|
326
|
+
}
|
|
327
|
+
return dependencies;
|
|
328
|
+
}
|
|
240
329
|
}
|
|
241
330
|
export {
|
|
242
331
|
RenderPreparationService
|
package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EcoComponent } from '
|
|
2
|
-
import type { EcoPagesAppConfig } from '
|
|
3
|
-
import type { AssetProcessingService, ProcessedAsset } from '
|
|
1
|
+
import type { EcoComponent } from '../../public-types.js';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../../internal-types.js';
|
|
3
|
+
import type { AssetProcessingService, ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
|
|
4
4
|
export declare const DEPENDENCY_ERRORS: {
|
|
5
5
|
readonly INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content";
|
|
6
6
|
readonly INVALID_SCRIPT_ENTRY: "Invalid script dependency entry: expected src or content";
|
|
@@ -9,7 +9,18 @@ export declare const DEPENDENCY_ERRORS: {
|
|
|
9
9
|
export declare class DependencyResolverService {
|
|
10
10
|
private appConfig;
|
|
11
11
|
private assetProcessingService;
|
|
12
|
+
/**
|
|
13
|
+
* Creates the dependency resolver used by route and component rendering.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* The resolver stays intentionally separate from HTML rendering so component
|
|
17
|
+
* dependency collection, lazy trigger grouping, and processed-asset generation
|
|
18
|
+
* can evolve without changing renderer implementations.
|
|
19
|
+
*/
|
|
12
20
|
constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService);
|
|
21
|
+
/**
|
|
22
|
+
* Resolves one dependency path relative to the component that declared it.
|
|
23
|
+
*/
|
|
13
24
|
resolveDependencyPath(componentDir: string, pathUrl: string): string;
|
|
14
25
|
/**
|
|
15
26
|
* Maps lazy script source entries to deterministic fallback public URLs
|
|
@@ -20,5 +31,5 @@ export declare class DependencyResolverService {
|
|
|
20
31
|
* Collects and processes component dependencies (styles, scripts, modules, lazy scripts).
|
|
21
32
|
* Lazy dependencies are always resolved into global-injector trigger maps.
|
|
22
33
|
*/
|
|
23
|
-
processComponentDependencies(components:
|
|
34
|
+
processComponentDependencies(components: Array<EcoComponent | Partial<EcoComponent> | undefined | null>, integrationName: string): Promise<ProcessedAsset[]>;
|
|
24
35
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
|
-
import { rapidhash } from "
|
|
4
|
-
import { AssetFactory } from "
|
|
5
|
-
import { normalizeModuleDeclarations } from "
|
|
3
|
+
import { rapidhash } from "../../utils/hash.js";
|
|
4
|
+
import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
|
|
5
|
+
import { normalizeModuleDeclarations } from "../../eco/module-dependencies.js";
|
|
6
6
|
import { parseSync } from "oxc-parser";
|
|
7
7
|
const DEPENDENCY_ERRORS = {
|
|
8
8
|
INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content",
|
|
@@ -139,10 +139,23 @@ function buildResolvedLazyTriggers(config, groups) {
|
|
|
139
139
|
return [{ triggerId, rules }];
|
|
140
140
|
}
|
|
141
141
|
class DependencyResolverService {
|
|
142
|
+
appConfig;
|
|
143
|
+
assetProcessingService;
|
|
144
|
+
/**
|
|
145
|
+
* Creates the dependency resolver used by route and component rendering.
|
|
146
|
+
*
|
|
147
|
+
* @remarks
|
|
148
|
+
* The resolver stays intentionally separate from HTML rendering so component
|
|
149
|
+
* dependency collection, lazy trigger grouping, and processed-asset generation
|
|
150
|
+
* can evolve without changing renderer implementations.
|
|
151
|
+
*/
|
|
142
152
|
constructor(appConfig, assetProcessingService) {
|
|
143
153
|
this.appConfig = appConfig;
|
|
144
154
|
this.assetProcessingService = assetProcessingService;
|
|
145
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Resolves one dependency path relative to the component that declared it.
|
|
158
|
+
*/
|
|
146
159
|
resolveDependencyPath(componentDir, pathUrl) {
|
|
147
160
|
return resolveDependencyPath(componentDir, pathUrl);
|
|
148
161
|
}
|
|
@@ -163,6 +176,7 @@ class DependencyResolverService {
|
|
|
163
176
|
const lazyScriptsByConfig = /* @__PURE__ */ new Map();
|
|
164
177
|
const lazyDependencyKeys = /* @__PURE__ */ new Set();
|
|
165
178
|
for (const component of components) {
|
|
179
|
+
if (!component) continue;
|
|
166
180
|
const componentFile = component.config?.__eco?.file;
|
|
167
181
|
if (!componentFile) continue;
|
|
168
182
|
const stylesheetDependencyKeys = /* @__PURE__ */ new Set();
|
|
@@ -357,7 +371,7 @@ class DependencyResolverService {
|
|
|
357
371
|
}
|
|
358
372
|
if (dependenciesConfig?.components) {
|
|
359
373
|
for (const nestedComponent of dependenciesConfig.components) {
|
|
360
|
-
if (nestedComponent
|
|
374
|
+
if (nestedComponent?.config) {
|
|
361
375
|
collect(nestedComponent.config);
|
|
362
376
|
}
|
|
363
377
|
}
|