@ecopages/core 0.2.0-beta.31 → 0.2.0-beta.32
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 +1 -0
- package/package.json +82 -3
- package/src/adapters/abstract/application-adapter.d.ts +0 -8
- package/src/adapters/abstract/application-adapter.js +252 -261
- package/src/adapters/abstract/router-adapter.js +12 -4
- package/src/adapters/abstract/segment-path-matcher.js +132 -134
- package/src/adapters/abstract/server-adapter.js +22 -14
- package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
- package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
- package/src/adapters/bun/client-bridge.js +51 -50
- package/src/adapters/bun/create-app.js +171 -161
- package/src/adapters/bun/hmr-manager.js +62 -57
- package/src/adapters/bun/index.js +2 -31
- package/src/adapters/bun/runtime-host.js +61 -54
- package/src/adapters/bun/server-adapter.d.ts +0 -1
- package/src/adapters/bun/server-adapter.js +561 -561
- package/src/adapters/bun/static-preview-host.js +43 -46
- package/src/adapters/create-app.js +11 -14
- package/src/adapters/index.js +2 -30
- package/src/adapters/node/create-app.js +123 -129
- package/src/adapters/node/http-request-bridge.js +147 -106
- package/src/adapters/node/node-client-bridge.js +62 -64
- package/src/adapters/node/node-hmr-manager.js +58 -48
- package/src/adapters/node/runtime-host.js +96 -89
- package/src/adapters/node/server-adapter-dependencies.js +18 -21
- package/src/adapters/node/server-adapter.d.ts +0 -1
- package/src/adapters/node/server-adapter.js +347 -326
- package/src/adapters/node/static-content-server.js +172 -191
- package/src/adapters/node/static-preview-host.js +87 -78
- package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
- package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
- package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
- package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
- package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
- package/src/adapters/shared/http/api-request-pipeline.js +122 -119
- package/src/adapters/shared/http/api-response.js +77 -77
- package/src/adapters/shared/http/create-body-response.js +22 -19
- package/src/adapters/shared/http/define-api-handler.js +41 -55
- package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
- package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
- package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
- package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
- package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
- package/src/adapters/shared/http/run-middleware-chain.js +15 -15
- package/src/adapters/shared/runtime/application-adapter.js +72 -87
- package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
- package/src/adapters/shared/runtime/port-manager.js +207 -177
- package/src/adapters/shared/runtime/render-context.js +94 -79
- package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
- package/src/adapters/shared/runtime/runtime-host.js +1 -0
- package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
- package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
- package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
- package/src/adapters/shared/runtime/server-adapter.js +233 -217
- package/src/adapters/shared/runtime/server-route-handler.js +74 -70
- package/src/adapters/shared/runtime/server-static-builder.js +165 -184
- package/src/adapters/shared/runtime/static-preview-host.js +1 -0
- package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
- package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
- package/src/build/README.md +52 -1
- package/src/build/app-build-manifest-runtime.js +129 -108
- package/src/build/browser/browser-runtime-manifest.js +47 -50
- package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
- package/src/build/browser/browser-runtime-plugin.js +206 -160
- package/src/build/browser/jsx-ownership-plugins.js +51 -37
- package/src/build/browser/lit-static-render-worker-context.js +3 -5
- package/src/build/build-adapter.js +276 -139
- package/src/build/cache/build-input-fingerprint.js +28 -26
- package/src/build/cache/cache-constants.js +4 -6
- package/src/build/cache/cache-keys.js +64 -56
- package/src/build/cache/pages-unified-graph-build.js +179 -178
- package/src/build/cache/production-build-cache.js +47 -54
- package/src/build/cache/server-entry-build-cache.js +134 -146
- package/src/build/contracts/build-contracts.d.ts +4 -4
- package/src/build/contracts/build-contracts.js +1 -0
- package/src/build/contracts/build-manifest.js +58 -43
- package/src/build/contracts/build-types.js +1 -0
- package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
- package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
- package/src/build/rolldown/rolldown-build-adapter.js +53 -61
- package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
- package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
- package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
- package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
- package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
- package/src/build/runtime/build-profile-options.js +36 -36
- package/src/build/runtime/build-request-identity.js +70 -45
- package/src/build/runtime/build-request-policy.js +80 -42
- package/src/build/runtime/build-runtime.js +64 -54
- package/src/build/runtime/deduping-build-executor.js +38 -32
- package/src/build/runtime/parallel-build-executor.js +58 -50
- package/src/build/runtime/serialized-build-executor.js +78 -62
- package/src/cache/index.js +6 -6
- package/src/cache/module-parse-cache.js +99 -68
- package/src/client/navigation-scripts/classification.js +45 -37
- package/src/client/navigation-scripts/index.js +3 -23
- package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
- package/src/client/navigation-scripts/registry.js +15 -11
- package/src/client/navigation-scripts/rerun-queue.js +81 -64
- package/src/client/scroll.js +32 -24
- package/src/client/scroll.test.browser.js +27 -33
- package/src/client/view-transitions.js +68 -55
- package/src/config/config-builder.d.ts +8 -0
- package/src/config/config-builder.js +637 -642
- package/src/config/constants.js +44 -24
- package/src/declarations.d.ts +1 -0
- package/src/dev/README.md +24 -0
- package/src/dev/client-bridge-registry.js +7 -12
- package/src/dev/dev-client-ownership.js +7 -5
- package/src/dev/hmr-manager-registry.js +7 -12
- package/src/dev/host-runtime.js +25 -30
- package/src/dev/runtime-server-started-message.js +2 -5
- package/src/dev/sc-server.js +106 -103
- package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
- package/src/dev/transform-server/dev-transform-bundler.js +79 -0
- package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
- package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
- package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
- package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
- package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
- package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
- package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
- package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
- package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
- package/src/dev/transform-server/dev-transform-server.js +191 -0
- package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
- package/src/dev/transform-server/dev-transform-url.js +58 -0
- package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
- package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
- package/src/dev/transform-server/index.d.ts +6 -0
- package/src/dev/transform-server/index.js +4 -0
- package/src/dev/transform-server/types.d.ts +15 -0
- package/src/dev/transform-server/types.js +1 -0
- package/src/dev-toolbar/README.md +51 -0
- package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
- package/src/dev-toolbar/define-dev-tool.js +9 -0
- package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
- package/src/dev-toolbar/dev-toolbar-config.js +19 -0
- package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
- package/src/dev-toolbar/dev-toolbar-host.js +117 -0
- package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
- package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
- package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
- package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
- package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
- package/src/dev-toolbar/dev-toolbar-package.js +72 -0
- package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
- package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
- package/src/diagnostics/request-build-dedupe.js +34 -28
- package/src/diagnostics/startup-trace.d.ts +10 -1
- package/src/diagnostics/startup-trace.js +269 -241
- package/src/eco/README.md +6 -0
- package/src/eco/eco-declared-component.js +19 -14
- package/src/eco/eco.browser.js +56 -69
- package/src/eco/eco.js +156 -96
- package/src/eco/eco.types.js +5 -0
- package/src/eco/eco.utils.js +1 -10
- package/src/eco/global-injector-map.js +55 -41
- package/src/eco/lazy-injector-map.js +90 -60
- package/src/eco/module-dependencies.js +52 -44
- package/src/eco/page-layout-normalization.js +59 -49
- package/src/errors/http-error.js +50 -49
- package/src/errors/index.js +3 -12
- package/src/errors/locals-access-error.js +5 -8
- package/src/errors/undeclared-component-dependency-error.js +15 -15
- package/src/global/app-logger.js +3 -6
- package/src/hmr/README.md +10 -0
- package/src/hmr/client/hmr-runtime.js +117 -113
- package/src/hmr/client/module-update.d.ts +13 -0
- package/src/hmr/client/module-update.js +39 -0
- package/src/hmr/hmr-asset-paths.d.ts +14 -0
- package/src/hmr/hmr-asset-paths.js +22 -0
- package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
- package/src/hmr/hmr-entrypoint-output.js +28 -54
- package/src/hmr/hmr-file-change-prep.js +13 -16
- package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
- package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
- package/src/hmr/hmr-runtime-paths.d.ts +10 -0
- package/src/hmr/hmr-runtime-paths.js +13 -0
- package/src/hmr/hmr-strategy.d.ts +5 -11
- package/src/hmr/hmr-strategy.js +113 -61
- package/src/hmr/strategies/default-hmr-strategy.js +55 -33
- package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
- package/src/hmr/strategies/js-hmr-strategy.js +104 -217
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
- package/src/index.browser.js +1 -4
- package/src/index.d.ts +1 -0
- package/src/index.js +6 -47
- package/src/integrations/ghtml/ghtml-renderer.js +12 -7
- package/src/integrations/ghtml/ghtml.constants.js +1 -4
- package/src/integrations/ghtml/ghtml.plugin.js +9 -12
- package/src/islands/README.md +25 -0
- package/src/islands/island-host.d.ts +37 -0
- package/src/islands/island-host.js +55 -0
- package/src/plugins/alias-resolver-cache.js +114 -97
- package/src/plugins/alias-resolver-plugin.js +33 -47
- package/src/plugins/define-integration.js +18 -17
- package/src/plugins/eco-component-meta-plugin.js +387 -145
- package/src/plugins/foreign-jsx-override-plugin.js +49 -35
- package/src/plugins/integration-plugin.js +212 -203
- package/src/plugins/jsx-import-source.utils.js +16 -21
- package/src/plugins/processor.js +159 -149
- package/src/plugins/runtime-capability.js +1 -0
- package/src/plugins/source-transform.js +109 -79
- package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
- package/src/plugins/tsconfig-import-resolver.js +218 -142
- package/src/route-renderer/README.md +12 -1
- package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
- package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
- package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
- package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
- package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
- package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
- package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
- package/src/route-renderer/orchestration/integration-renderer.js +731 -750
- package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
- package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
- package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
- package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
- package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
- package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
- package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
- package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
- package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
- package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
- package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
- package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
- package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
- package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
- package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
- package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
- package/src/route-renderer/page-loading/page-module-loader.js +130 -124
- package/src/route-renderer/route-renderer.js +74 -76
- package/src/router/client/link-intent.js +55 -39
- package/src/router/client/link-intent.test.browser.js +49 -49
- package/src/router/client/link-navigation-policy.js +114 -93
- package/src/router/client/link-navigation-policy.test.browser.js +70 -80
- package/src/router/client/navigation-coordinator.js +235 -211
- package/src/router/server/route-registry.js +237 -242
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
- package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
- package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
- package/src/services/assets/asset-processing-service/assets.types.js +1 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
- package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
- package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
- package/src/services/assets/asset-processing-service/index.js +8 -8
- package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
- package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
- package/src/services/assets/asset-processing-service/page-package.js +70 -72
- package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
- package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
- package/src/services/assets/asset-processing-service/processors/index.js +5 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
- package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
- package/src/services/assets/browser-bundle.service.js +52 -47
- package/src/services/cache/cache.types.js +5 -0
- package/src/services/cache/index.js +6 -7
- package/src/services/cache/memory-cache-store.js +101 -89
- package/src/services/cache/page-cache-service.js +156 -145
- package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
- package/src/services/html/html-rewriter-provider.service.js +61 -61
- package/src/services/html/html-transformer.service.js +249 -266
- package/src/services/invalidation/development-invalidation.service.js +252 -241
- package/src/services/module-loading/app-module-loader.service.js +1 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
- package/src/services/module-loading/host-module-loader-registry.js +6 -11
- package/src/services/module-loading/module-loading-types.js +1 -0
- package/src/services/module-loading/page-module-import.service.js +235 -243
- package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
- package/src/services/module-loading/route-module-build-cache.js +3 -38
- package/src/services/module-loading/route-module-build-cache.store.js +195 -200
- package/src/services/module-loading/route-module-build-manifest.js +61 -74
- package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
- package/src/services/module-loading/server-module-transpiler.service.js +68 -62
- package/src/services/module-loading/source-module-support.js +15 -7
- package/src/services/runtime-state/dev-graph.service.js +165 -157
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
- package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
- package/src/services/validation/schema-validation-service.js +157 -95
- package/src/services/validation/standard-schema.types.js +1 -0
- package/src/services/validation/validate-standard-schema.js +13 -13
- package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
- package/src/static-site-generator/sitemap-routes.js +33 -28
- package/src/static-site-generator/sitemap.js +38 -29
- package/src/static-site-generator/static-build-invalidation.js +34 -56
- package/src/static-site-generator/static-export-context.js +1 -0
- package/src/static-site-generator/static-site-generator.js +517 -553
- package/src/types/internal-types.d.ts +19 -3
- package/src/types/internal-types.js +1 -0
- package/src/types/public-types.d.ts +16 -46
- package/src/types/public-types.js +1 -0
- package/src/utils/deep-merge.js +39 -26
- package/src/utils/ecopages-route-info.js +27 -23
- package/src/utils/hash.js +3 -6
- package/src/utils/html-escaping.js +21 -8
- package/src/utils/html.js +1 -4
- package/src/utils/invariant.js +11 -10
- package/src/utils/locals-utils.js +32 -22
- package/src/utils/parse-cli-args.js +73 -65
- package/src/utils/path-pattern.js +38 -23
- package/src/utils/path-utils.module.js +8 -11
- package/src/utils/resolve-entry-file.js +70 -38
- package/src/utils/resolve-work-dir.js +23 -27
- package/src/utils/runtime.js +24 -33
- package/src/utils/server-utils.module.js +60 -52
- package/src/utils/static-file-extensions.js +52 -46
- package/src/watchers/project-watcher-ignore.js +16 -15
- package/src/watchers/project-watcher.js +385 -366
- package/src/watchers/project-watcher.test-helpers.js +45 -50
- package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
- package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
- package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
- package/src/build/cache/dev-browser-script-cache.js +0 -90
package/src/eco/eco.browser.js
CHANGED
|
@@ -1,87 +1,74 @@
|
|
|
1
|
-
import { applyPageLayoutConfig, mergeLayoutDependencies, normalizePageLayouts } from
|
|
1
|
+
import { applyPageLayoutConfig, mergeLayoutDependencies, normalizePageLayouts } from './page-layout-normalization.js';
|
|
2
2
|
function createComponentFactory(options) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
const component = ((props) => options.render(props));
|
|
4
|
+
component.config = {
|
|
5
|
+
__eco: options.__eco,
|
|
6
|
+
integration: options.integration,
|
|
7
|
+
dependencies: options.dependencies,
|
|
8
|
+
};
|
|
9
|
+
return component;
|
|
10
10
|
}
|
|
11
11
|
function component(options) {
|
|
12
|
-
|
|
12
|
+
return createComponentFactory(options);
|
|
13
13
|
}
|
|
14
|
-
function embed(
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
function embed(component, props, children) {
|
|
15
|
+
const nextProps = (children === undefined ? props : { ...props, children });
|
|
16
|
+
return component(nextProps);
|
|
17
17
|
}
|
|
18
18
|
function html(options) {
|
|
19
|
-
|
|
19
|
+
return createComponentFactory(options);
|
|
20
20
|
}
|
|
21
21
|
function layout(options) {
|
|
22
|
-
|
|
22
|
+
return createComponentFactory(options);
|
|
23
23
|
}
|
|
24
24
|
function page(options) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (cache) {
|
|
56
|
-
pageComponent.cache = cache;
|
|
57
|
-
}
|
|
58
|
-
if (requires) {
|
|
59
|
-
pageComponent.requires = requires;
|
|
60
|
-
}
|
|
61
|
-
if (middleware) {
|
|
62
|
-
pageComponent.middleware = middleware;
|
|
63
|
-
}
|
|
64
|
-
return pageComponent;
|
|
25
|
+
const { layout: pageLayout, dependencies, render, staticPaths, staticProps, metadata, cache, requires, middleware, } = options;
|
|
26
|
+
const layoutEntries = normalizePageLayouts(pageLayout);
|
|
27
|
+
const pageComponent = createComponentFactory({
|
|
28
|
+
__eco: options.__eco,
|
|
29
|
+
integration: options.integration,
|
|
30
|
+
dependencies: mergeLayoutDependencies(dependencies, layoutEntries),
|
|
31
|
+
render,
|
|
32
|
+
});
|
|
33
|
+
if (pageComponent.config) {
|
|
34
|
+
applyPageLayoutConfig(pageComponent.config, layoutEntries);
|
|
35
|
+
}
|
|
36
|
+
if (staticPaths) {
|
|
37
|
+
pageComponent.staticPaths = staticPaths;
|
|
38
|
+
}
|
|
39
|
+
if (staticProps) {
|
|
40
|
+
pageComponent.staticProps = staticProps;
|
|
41
|
+
}
|
|
42
|
+
if (metadata) {
|
|
43
|
+
pageComponent.metadata = metadata;
|
|
44
|
+
}
|
|
45
|
+
if (cache) {
|
|
46
|
+
pageComponent.cache = cache;
|
|
47
|
+
}
|
|
48
|
+
if (requires) {
|
|
49
|
+
pageComponent.requires = requires;
|
|
50
|
+
}
|
|
51
|
+
if (middleware) {
|
|
52
|
+
pageComponent.middleware = middleware;
|
|
53
|
+
}
|
|
54
|
+
return pageComponent;
|
|
65
55
|
}
|
|
66
56
|
function metadata(fn) {
|
|
67
|
-
|
|
57
|
+
return fn;
|
|
68
58
|
}
|
|
69
59
|
function staticPaths(fn) {
|
|
70
|
-
|
|
60
|
+
return fn;
|
|
71
61
|
}
|
|
72
62
|
function staticProps(fn) {
|
|
73
|
-
|
|
63
|
+
return fn;
|
|
74
64
|
}
|
|
75
|
-
const eco = {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
};
|
|
85
|
-
export {
|
|
86
|
-
eco
|
|
65
|
+
export const eco = {
|
|
66
|
+
component,
|
|
67
|
+
embed,
|
|
68
|
+
html,
|
|
69
|
+
layout,
|
|
70
|
+
page,
|
|
71
|
+
metadata,
|
|
72
|
+
staticPaths,
|
|
73
|
+
staticProps,
|
|
87
74
|
};
|
package/src/eco/eco.js
CHANGED
|
@@ -1,118 +1,178 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from
|
|
6
|
-
import { isThenable } from
|
|
7
|
-
import { applyPageLayoutConfig, mergeLayoutDependencies, normalizePageLayouts } from
|
|
1
|
+
/**
|
|
2
|
+
* The eco namespace - unified component and page factory API
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
import { finalizeComponentRender, getComponentRenderContext, interceptForeignChild, } from '../route-renderer/orchestration/foreign-child/component-render-context.js';
|
|
6
|
+
import { isThenable } from '../route-renderer/orchestration/foreign-child/foreign-child-output.utils.js';
|
|
7
|
+
import { applyPageLayoutConfig, mergeLayoutDependencies, normalizePageLayouts } from './page-layout-normalization.js';
|
|
8
|
+
/**
|
|
9
|
+
* Creates a component factory with lazy-trigger support and foreign-child-runtime
|
|
10
|
+
* interception.
|
|
11
|
+
*
|
|
12
|
+
* Behavior:
|
|
13
|
+
* - In normal render flow, returns `options.render(props)` with optional lazy
|
|
14
|
+
* trigger/script wrapping.
|
|
15
|
+
* - When rendering under an active foreign-child runtime and the current
|
|
16
|
+
* renderer-owned foreign-child runtime resolves the foreign child immediately, returns
|
|
17
|
+
* that resolved output instead of rendering the component inline.
|
|
18
|
+
*
|
|
19
|
+
* @param options Component options for rendering and dependency declaration.
|
|
20
|
+
* @returns Configured eco component.
|
|
21
|
+
*/
|
|
8
22
|
function createComponentFactory(options) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
const integrationName = options.integration ?? options.__eco?.integration;
|
|
24
|
+
const comp = ((props) => {
|
|
25
|
+
const componentProps = (props ?? {});
|
|
26
|
+
const renderInline = (nextProps = props) => finalizeComponentRender(comp, options.render(nextProps));
|
|
27
|
+
const activeRenderContext = getComponentRenderContext();
|
|
28
|
+
const foreignChildRender = interceptForeignChild({
|
|
29
|
+
component: comp,
|
|
30
|
+
props: componentProps,
|
|
31
|
+
targetIntegration: integrationName,
|
|
32
|
+
});
|
|
33
|
+
if (isThenable(foreignChildRender)) {
|
|
34
|
+
return foreignChildRender.then((resolvedForeignChildRender) => {
|
|
35
|
+
if (resolvedForeignChildRender?.kind === 'resolved') {
|
|
36
|
+
return resolvedForeignChildRender.value;
|
|
37
|
+
}
|
|
38
|
+
return renderInline((resolvedForeignChildRender?.props ?? props));
|
|
39
|
+
});
|
|
23
40
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
};
|
|
45
|
-
return comp;
|
|
41
|
+
if (foreignChildRender?.kind === 'resolved') {
|
|
42
|
+
return foreignChildRender.value;
|
|
43
|
+
}
|
|
44
|
+
if (foreignChildRender?.kind === 'inline') {
|
|
45
|
+
return renderInline((foreignChildRender.props ?? props));
|
|
46
|
+
}
|
|
47
|
+
if (activeRenderContext &&
|
|
48
|
+
activeRenderContext.foreignChildRuntime &&
|
|
49
|
+
integrationName &&
|
|
50
|
+
integrationName !== activeRenderContext.currentIntegration) {
|
|
51
|
+
throw new Error(`[ecopages] Missing foreign-child interception from ${activeRenderContext.currentIntegration} to ${integrationName} for ${options.__eco?.file ?? 'unknown component'}.`);
|
|
52
|
+
}
|
|
53
|
+
return renderInline();
|
|
54
|
+
});
|
|
55
|
+
comp.config = {
|
|
56
|
+
__eco: options.__eco,
|
|
57
|
+
integration: options.integration,
|
|
58
|
+
dependencies: options.dependencies,
|
|
59
|
+
};
|
|
60
|
+
return comp;
|
|
46
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates a reusable component with optional dependencies.
|
|
64
|
+
*
|
|
65
|
+
* @param options Component definition options.
|
|
66
|
+
* @returns Eco component function.
|
|
67
|
+
*/
|
|
47
68
|
function component(options) {
|
|
48
|
-
|
|
69
|
+
return createComponentFactory(options);
|
|
49
70
|
}
|
|
50
71
|
function isMissingForeignChildInterceptionError(error) {
|
|
51
|
-
|
|
72
|
+
return error instanceof Error && error.message.startsWith('[ecopages] Missing foreign-child interception from ');
|
|
52
73
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Renders a component explicitly and optionally injects `children` into the
|
|
76
|
+
* props bag before invocation.
|
|
77
|
+
*/
|
|
78
|
+
function embed(component, props, children) {
|
|
79
|
+
const activeRenderContext = getComponentRenderContext();
|
|
80
|
+
const ecoComponent = component;
|
|
81
|
+
const targetIntegration = ecoComponent.config?.integration ?? ecoComponent.config?.__eco?.integration;
|
|
82
|
+
const componentFile = ecoComponent.config?.__eco?.file ?? 'unknown component';
|
|
83
|
+
const nextProps = (children === undefined ? props : { ...props, children });
|
|
84
|
+
try {
|
|
85
|
+
return component(nextProps);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (!isMissingForeignChildInterceptionError(error)) {
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`[ecopages] eco.embed() could not hand off the Foreign Child from ${activeRenderContext?.currentIntegration ?? 'unknown integration'} to ${targetIntegration ?? 'unknown integration'} for ${componentFile}. The active Integration renderer exposed a foreign-child runtime, but it did not intercept this cross-integration render. Ensure mixed-integration Page, Layout, Html, or Component renders install foreign-child handoff before calling eco.embed().`);
|
|
64
92
|
}
|
|
65
|
-
throw new Error(
|
|
66
|
-
`[ecopages] eco.embed() could not hand off the Foreign Child from ${activeRenderContext?.currentIntegration ?? "unknown integration"} to ${targetIntegration ?? "unknown integration"} for ${componentFile}. The active Integration renderer exposed a foreign-child runtime, but it did not intercept this cross-integration render. Ensure mixed-integration Page, Layout, Html, or Component renders install foreign-child handoff before calling eco.embed().`
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Creates a document shell component.
|
|
96
|
+
*/
|
|
70
97
|
function html(options) {
|
|
71
|
-
|
|
98
|
+
return createComponentFactory(options);
|
|
72
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates a route layout component.
|
|
102
|
+
*/
|
|
73
103
|
function layout(options) {
|
|
74
|
-
|
|
104
|
+
return createComponentFactory(options);
|
|
75
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Creates a page component and attaches optional static APIs.
|
|
108
|
+
*
|
|
109
|
+
* @param options Page options.
|
|
110
|
+
* @returns Eco page component.
|
|
111
|
+
*/
|
|
76
112
|
function page(options) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
113
|
+
const { layout, dependencies, render, staticPaths, staticProps, metadata, cache, requires, middleware } = options;
|
|
114
|
+
const layoutEntries = normalizePageLayouts(layout);
|
|
115
|
+
const componentOptions = {
|
|
116
|
+
__eco: options.__eco,
|
|
117
|
+
integration: options.integration,
|
|
118
|
+
dependencies: mergeLayoutDependencies(dependencies, layoutEntries),
|
|
119
|
+
render,
|
|
120
|
+
};
|
|
121
|
+
const pageComponent = createComponentFactory(componentOptions);
|
|
122
|
+
if (pageComponent.config) {
|
|
123
|
+
applyPageLayoutConfig(pageComponent.config, layoutEntries);
|
|
124
|
+
}
|
|
125
|
+
if (staticPaths)
|
|
126
|
+
pageComponent.staticPaths = staticPaths;
|
|
127
|
+
if (staticProps)
|
|
128
|
+
pageComponent.staticProps = staticProps;
|
|
129
|
+
if (metadata)
|
|
130
|
+
pageComponent.metadata = metadata;
|
|
131
|
+
if (cache)
|
|
132
|
+
pageComponent.cache = cache;
|
|
133
|
+
if (requires)
|
|
134
|
+
pageComponent.requires = requires;
|
|
135
|
+
if (middleware)
|
|
136
|
+
pageComponent.middleware = middleware;
|
|
137
|
+
return pageComponent;
|
|
96
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Type-safe wrapper for metadata functions.
|
|
141
|
+
*
|
|
142
|
+
* @param fn Metadata factory function.
|
|
143
|
+
* @returns The same function.
|
|
144
|
+
*/
|
|
97
145
|
function metadata(fn) {
|
|
98
|
-
|
|
146
|
+
return fn;
|
|
99
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Type-safe wrapper for static paths functions.
|
|
150
|
+
*
|
|
151
|
+
* @param fn Static paths function.
|
|
152
|
+
* @returns The same function.
|
|
153
|
+
*/
|
|
100
154
|
function staticPaths(fn) {
|
|
101
|
-
|
|
155
|
+
return fn;
|
|
102
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Type-safe wrapper for static props functions.
|
|
159
|
+
*
|
|
160
|
+
* @param fn Static props function.
|
|
161
|
+
* @returns The same function.
|
|
162
|
+
*/
|
|
103
163
|
function staticProps(fn) {
|
|
104
|
-
|
|
164
|
+
return fn;
|
|
105
165
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
166
|
+
/**
|
|
167
|
+
* The eco namespace - provides factories for components and pages
|
|
168
|
+
*/
|
|
169
|
+
export const eco = {
|
|
170
|
+
component,
|
|
171
|
+
embed,
|
|
172
|
+
html,
|
|
173
|
+
layout,
|
|
174
|
+
page,
|
|
175
|
+
metadata,
|
|
176
|
+
staticPaths,
|
|
177
|
+
staticProps,
|
|
118
178
|
};
|
package/src/eco/eco.types.js
CHANGED
package/src/eco/eco.utils.js
CHANGED
|
@@ -1,10 +1 @@
|
|
|
1
|
-
|
|
2
|
-
addTriggerAttribute,
|
|
3
|
-
isThenable,
|
|
4
|
-
wrapWithScriptsInjector
|
|
5
|
-
} from "../route-renderer/orchestration/foreign-child/foreign-child-output.utils.js";
|
|
6
|
-
export {
|
|
7
|
-
addTriggerAttribute,
|
|
8
|
-
isThenable,
|
|
9
|
-
wrapWithScriptsInjector
|
|
10
|
-
};
|
|
1
|
+
export { addTriggerAttribute, isThenable, wrapWithScriptsInjector, } from '../route-renderer/orchestration/foreign-child/foreign-child-output.utils.js';
|
|
@@ -1,44 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a flat list of resolved triggers into the map structure consumed
|
|
3
|
+
* by the `initGlobalInjector` bootstrap. Multiple triggers sharing the same
|
|
4
|
+
* `triggerId` are merged so their script lists are deduplicated.
|
|
5
|
+
*/
|
|
1
6
|
function buildGlobalInjectorMap(triggers) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
7
|
+
const map = {};
|
|
8
|
+
for (const { triggerId, rules } of triggers) {
|
|
9
|
+
const entry = map[triggerId] ?? {};
|
|
10
|
+
for (const rule of rules) {
|
|
11
|
+
if ('on:idle' in rule) {
|
|
12
|
+
const { scripts } = rule['on:idle'];
|
|
13
|
+
entry['on:idle'] = {
|
|
14
|
+
scripts: Array.from(new Set([...(entry['on:idle']?.scripts ?? []), ...scripts])),
|
|
15
|
+
};
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if ('on:interaction' in rule) {
|
|
19
|
+
const { value, scripts } = rule['on:interaction'];
|
|
20
|
+
entry['on:interaction'] = {
|
|
21
|
+
value,
|
|
22
|
+
scripts: Array.from(new Set([...(entry['on:interaction']?.scripts ?? []), ...scripts])),
|
|
23
|
+
};
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if ('on:visible' in rule) {
|
|
27
|
+
const { value, scripts } = rule['on:visible'];
|
|
28
|
+
entry['on:visible'] = {
|
|
29
|
+
...(value ? { value } : {}),
|
|
30
|
+
scripts: Array.from(new Set([...(entry['on:visible']?.scripts ?? []), ...scripts])),
|
|
31
|
+
};
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (Object.keys(entry).length > 0) {
|
|
36
|
+
map[triggerId] = entry;
|
|
37
|
+
}
|
|
29
38
|
}
|
|
30
|
-
|
|
31
|
-
map[triggerId] = entry;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return map;
|
|
39
|
+
return map;
|
|
35
40
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Serializes resolved lazy triggers into a JSON string safe for embedding
|
|
43
|
+
* inside an inline `<script type="ecopages/global-injector-map">` tag.
|
|
44
|
+
*
|
|
45
|
+
* The `</script` sequence is escaped because an unescaped occurrence in inline
|
|
46
|
+
* script content causes the HTML parser to close the script tag prematurely,
|
|
47
|
+
* breaking page rendering. `JSON.stringify` does not perform this escape by
|
|
48
|
+
* default, so a targeted replacement is applied after serialization.
|
|
49
|
+
*/
|
|
50
|
+
export function buildGlobalInjectorMapScript(triggers) {
|
|
51
|
+
const map = buildGlobalInjectorMap(triggers);
|
|
52
|
+
return JSON.stringify(map).replace(/<\/script/gi, '<\\/script');
|
|
39
53
|
}
|
|
40
|
-
|
|
41
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Builds the module source that boots the global lazy injector on the client.
|
|
56
|
+
* Emitted once per page alongside the `ecopages/global-injector-map` script block.
|
|
57
|
+
*/
|
|
58
|
+
export function buildGlobalInjectorBootstrapContent(globalInjectorModuleSpecifier) {
|
|
59
|
+
return `import { initGlobalInjector } from ${JSON.stringify(globalInjectorModuleSpecifier)};
|
|
42
60
|
|
|
43
61
|
function pruneStaleTriggerMaps() {
|
|
44
62
|
const mapScripts = Array.from(document.querySelectorAll('script[type="ecopages/global-injector-map"]'));
|
|
@@ -74,7 +92,3 @@ globalScope.__ecoGlobalInjectorCleanup = () => {
|
|
|
74
92
|
injector.cleanup();
|
|
75
93
|
};`;
|
|
76
94
|
}
|
|
77
|
-
export {
|
|
78
|
-
buildGlobalInjectorBootstrapContent,
|
|
79
|
-
buildGlobalInjectorMapScript
|
|
80
|
-
};
|