@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
|
@@ -1,129 +1,132 @@
|
|
|
1
|
-
import { createRequire } from
|
|
2
|
-
import { HttpError } from
|
|
3
|
-
import { ApiResponseBuilder } from
|
|
4
|
-
import { runMiddlewareChain } from
|
|
5
|
-
import { matchApiPathPattern, scoreApiPathPattern } from
|
|
6
|
-
import { appLogger } from
|
|
7
|
-
class ApiRequestPipeline {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
match(request, apiHandlers) {
|
|
17
|
-
const pathname = new URL(request.url).pathname;
|
|
18
|
-
const method = request.method.toUpperCase();
|
|
19
|
-
const sortedHandlers = [...apiHandlers].sort((a, b) => {
|
|
20
|
-
return scoreApiPathPattern(b.path) - scoreApiPathPattern(a.path);
|
|
21
|
-
});
|
|
22
|
-
for (const routeConfig of sortedHandlers) {
|
|
23
|
-
const routeMethod = (routeConfig.method || "GET").toUpperCase();
|
|
24
|
-
if (routeMethod !== method) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
const params = matchApiPathPattern(routeConfig.path, pathname);
|
|
28
|
-
if (params) {
|
|
29
|
-
return { routeConfig, params };
|
|
30
|
-
}
|
|
1
|
+
import { createRequire } from '../../../utils/locals-utils.js';
|
|
2
|
+
import { HttpError } from '../../../errors/http-error.js';
|
|
3
|
+
import { ApiResponseBuilder } from './api-response.js';
|
|
4
|
+
import { runMiddlewareChain } from './run-middleware-chain.js';
|
|
5
|
+
import { matchApiPathPattern, scoreApiPathPattern } from '../../abstract/segment-path-matcher.js';
|
|
6
|
+
import { appLogger } from '../../../global/app-logger.js';
|
|
7
|
+
export class ApiRequestPipeline {
|
|
8
|
+
schemaValidator;
|
|
9
|
+
getRenderContext;
|
|
10
|
+
getCacheService;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.schemaValidator = options.schemaValidator;
|
|
13
|
+
this.getRenderContext = options.getRenderContext;
|
|
14
|
+
this.getCacheService = options.getCacheService;
|
|
31
15
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
16
|
+
match(request, apiHandlers) {
|
|
17
|
+
const pathname = new URL(request.url).pathname;
|
|
18
|
+
const method = request.method.toUpperCase();
|
|
19
|
+
const sortedHandlers = [...apiHandlers].sort((a, b) => {
|
|
20
|
+
return scoreApiPathPattern(b.path) - scoreApiPathPattern(a.path);
|
|
21
|
+
});
|
|
22
|
+
for (const routeConfig of sortedHandlers) {
|
|
23
|
+
const routeMethod = (routeConfig.method || 'GET').toUpperCase();
|
|
24
|
+
if (routeMethod !== method) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const params = matchApiPathPattern(routeConfig.path, pathname);
|
|
28
|
+
if (params) {
|
|
29
|
+
return { routeConfig, params };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
async tryHandle(request, apiHandlers, serverInstance, errorHandler) {
|
|
35
|
+
const apiMatch = this.match(request, apiHandlers);
|
|
36
|
+
if (!apiMatch) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return await this.execute(request, apiMatch.params, apiMatch.routeConfig, serverInstance, errorHandler);
|
|
38
40
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
async execute(request, params, routeConfig, serverInstance, errorHandler) {
|
|
42
|
-
let context;
|
|
43
|
-
try {
|
|
44
|
-
context = this.createContext(request, params, serverInstance);
|
|
45
|
-
const schemaResponse = await this.applyRequestSchema(context, routeConfig.schema);
|
|
46
|
-
if (schemaResponse) {
|
|
47
|
-
return schemaResponse;
|
|
48
|
-
}
|
|
49
|
-
return await this.runMiddlewareChain(context, routeConfig);
|
|
50
|
-
} catch (error) {
|
|
51
|
-
if (error instanceof Response) return error;
|
|
52
|
-
if (errorHandler) {
|
|
41
|
+
async execute(request, params, routeConfig, serverInstance, errorHandler) {
|
|
42
|
+
let context;
|
|
53
43
|
try {
|
|
54
|
-
if (!context) {
|
|
55
44
|
context = this.createContext(request, params, serverInstance);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
45
|
+
const schemaResponse = await this.applyRequestSchema(context, routeConfig.schema);
|
|
46
|
+
if (schemaResponse) {
|
|
47
|
+
return schemaResponse;
|
|
48
|
+
}
|
|
49
|
+
return await this.runMiddlewareChain(context, routeConfig);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof Response)
|
|
53
|
+
return error;
|
|
54
|
+
if (errorHandler) {
|
|
55
|
+
try {
|
|
56
|
+
if (!context) {
|
|
57
|
+
context = this.createContext(request, params, serverInstance);
|
|
58
|
+
}
|
|
59
|
+
return await errorHandler(error, context);
|
|
60
|
+
}
|
|
61
|
+
catch (handlerError) {
|
|
62
|
+
appLogger.error(`[ecopages] Error in custom error handler: ${handlerError}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (error instanceof HttpError)
|
|
66
|
+
return error.toResponse();
|
|
67
|
+
appLogger.error(`[ecopages] Error handling API request: ${error}`);
|
|
68
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
60
69
|
}
|
|
61
|
-
}
|
|
62
|
-
if (error instanceof HttpError) return error.toResponse();
|
|
63
|
-
appLogger.error(`[ecopages] Error handling API request: ${error}`);
|
|
64
|
-
return new Response("Internal Server Error", { status: 500 });
|
|
65
70
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
normalizeParams(params) {
|
|
84
|
-
return Object.fromEntries(
|
|
85
|
-
Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join("/") : value])
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
async applyRequestSchema(context, schema) {
|
|
89
|
-
if (!schema) {
|
|
90
|
-
return void 0;
|
|
71
|
+
createContext(request, params, serverInstance) {
|
|
72
|
+
const locals = {};
|
|
73
|
+
const normalizedParams = this.normalizeParams(params);
|
|
74
|
+
return {
|
|
75
|
+
request,
|
|
76
|
+
params: normalizedParams,
|
|
77
|
+
response: new ApiResponseBuilder(),
|
|
78
|
+
server: serverInstance,
|
|
79
|
+
locals,
|
|
80
|
+
require: createRequire(() => locals),
|
|
81
|
+
services: {
|
|
82
|
+
cache: this.getCacheService(),
|
|
83
|
+
},
|
|
84
|
+
...this.getRenderContext(),
|
|
85
|
+
};
|
|
91
86
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
87
|
+
normalizeParams(params) {
|
|
88
|
+
return Object.fromEntries(Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join('/') : value]));
|
|
89
|
+
}
|
|
90
|
+
async applyRequestSchema(context, schema) {
|
|
91
|
+
if (!schema) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
const url = new URL(context.request.url);
|
|
95
|
+
const queryParams = Object.fromEntries(url.searchParams);
|
|
96
|
+
const headers = Object.fromEntries(context.request.headers);
|
|
97
|
+
let body;
|
|
98
|
+
if (schema.body) {
|
|
99
|
+
try {
|
|
100
|
+
const contentType = context.request.headers.get('Content-Type') || '';
|
|
101
|
+
if (contentType.includes('application/json'))
|
|
102
|
+
body = await context.request.clone().json();
|
|
103
|
+
else if (contentType.includes('text/plain'))
|
|
104
|
+
body = await context.request.clone().text();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return context.response.status(400).json({ error: 'Invalid request body' });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const validationResult = await this.schemaValidator.validateRequest({ body, query: queryParams, headers, params: context.params }, schema);
|
|
111
|
+
if (!validationResult.success) {
|
|
112
|
+
return context.response.status(400).json({
|
|
113
|
+
error: 'Validation failed',
|
|
114
|
+
issues: validationResult.errors,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const validated = validationResult.data;
|
|
118
|
+
if (validated.body !== undefined)
|
|
119
|
+
context.body = validated.body;
|
|
120
|
+
if (validated.query !== undefined)
|
|
121
|
+
context.query = validated.query;
|
|
122
|
+
if (validated.headers !== undefined)
|
|
123
|
+
context.headers = validated.headers;
|
|
124
|
+
if (validated.params !== undefined)
|
|
125
|
+
context.params = validated.params;
|
|
126
|
+
return undefined;
|
|
104
127
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
);
|
|
109
|
-
if (!validationResult.success) {
|
|
110
|
-
return context.response.status(400).json({
|
|
111
|
-
error: "Validation failed",
|
|
112
|
-
issues: validationResult.errors
|
|
113
|
-
});
|
|
128
|
+
async runMiddlewareChain(context, routeConfig) {
|
|
129
|
+
const middleware = routeConfig.middleware ?? [];
|
|
130
|
+
return runMiddlewareChain(middleware, context, async () => await routeConfig.handler(context));
|
|
114
131
|
}
|
|
115
|
-
const validated = validationResult.data;
|
|
116
|
-
if (validated.body !== void 0) context.body = validated.body;
|
|
117
|
-
if (validated.query !== void 0) context.query = validated.query;
|
|
118
|
-
if (validated.headers !== void 0) context.headers = validated.headers;
|
|
119
|
-
if (validated.params !== void 0) context.params = validated.params;
|
|
120
|
-
return void 0;
|
|
121
|
-
}
|
|
122
|
-
async runMiddlewareChain(context, routeConfig) {
|
|
123
|
-
const middleware = routeConfig.middleware ?? [];
|
|
124
|
-
return runMiddlewareChain(middleware, context, async () => await routeConfig.handler(context));
|
|
125
|
-
}
|
|
126
132
|
}
|
|
127
|
-
export {
|
|
128
|
-
ApiRequestPipeline
|
|
129
|
-
};
|
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
import { createBodyResponse } from
|
|
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
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
1
|
+
import { createBodyResponse } from './create-body-response.js';
|
|
2
|
+
/**
|
|
3
|
+
* A builder class for creating Response objects fluently.
|
|
4
|
+
*/
|
|
5
|
+
export class ApiResponseBuilder {
|
|
6
|
+
_status = 200;
|
|
7
|
+
_headers = new Headers();
|
|
8
|
+
/**
|
|
9
|
+
* Sets the HTTP status code for the response.
|
|
10
|
+
* @param code - The HTTP status code.
|
|
11
|
+
* @returns The builder instance for chaining.
|
|
12
|
+
*/
|
|
13
|
+
status(code) {
|
|
14
|
+
this._status = code;
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Adds or merges headers for the response.
|
|
19
|
+
* @param headersInit - Headers to add or merge.
|
|
20
|
+
* @returns The builder instance for chaining.
|
|
21
|
+
*/
|
|
22
|
+
headers(headersInit) {
|
|
23
|
+
const inputHeaders = new Headers(headersInit);
|
|
24
|
+
inputHeaders.forEach((value, key) => {
|
|
25
|
+
this._headers.set(key, value);
|
|
26
|
+
});
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Creates a JSON response using the configured status and headers.
|
|
31
|
+
* @param data - The data to serialize.
|
|
32
|
+
* @returns A Response object.
|
|
33
|
+
*/
|
|
34
|
+
json(data) {
|
|
35
|
+
return createBodyResponse('json', data, { status: this._status, headers: this._headers });
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Creates a plain text response using the configured status and headers.
|
|
39
|
+
* @param data - The text content.
|
|
40
|
+
* @returns A Response object.
|
|
41
|
+
*/
|
|
42
|
+
text(data) {
|
|
43
|
+
return createBodyResponse('text', data, { status: this._status, headers: this._headers });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Creates an HTML response using the configured status and headers.
|
|
47
|
+
* @param data - The HTML content.
|
|
48
|
+
* @returns A Response object.
|
|
49
|
+
*/
|
|
50
|
+
html(data) {
|
|
51
|
+
return createBodyResponse('html', data, { status: this._status, headers: this._headers });
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Creates a redirect response.
|
|
55
|
+
* @param url - The URL to redirect to.
|
|
56
|
+
* @param explicitStatus - Optional explicit status code (overrides status() if provided). Defaults to 302 if not set via status().
|
|
57
|
+
* @returns A Response object.
|
|
58
|
+
*/
|
|
59
|
+
redirect(url, explicitStatus) {
|
|
60
|
+
const redirectStatus = explicitStatus ?? (this._status === 200 ? 302 : this._status); // Default to 302 if status wasn't explicitly set
|
|
61
|
+
this._headers.set('Location', url);
|
|
62
|
+
return new Response(null, { status: redirectStatus, headers: this._headers });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates an error response using the configured status and headers.
|
|
66
|
+
* If data is an object, it's treated as JSON, otherwise as text.
|
|
67
|
+
* @param data - The error data (string or object).
|
|
68
|
+
* @param explicitStatus - Optional explicit status code (overrides status() if provided). Defaults to 500 if not set via status().
|
|
69
|
+
* @returns A Response object.
|
|
70
|
+
*/
|
|
71
|
+
error(data, explicitStatus) {
|
|
72
|
+
const errorStatus = explicitStatus ?? (this._status === 200 ? 500 : this._status); // Default to 500 if status wasn't explicitly set
|
|
73
|
+
this.status(errorStatus);
|
|
74
|
+
if (typeof data === 'object' && data !== null) {
|
|
75
|
+
return createBodyResponse('json', { error: data }, { status: this._status, headers: this._headers });
|
|
76
|
+
}
|
|
77
|
+
return createBodyResponse('text', String(data), { status: this._status, headers: this._headers });
|
|
73
78
|
}
|
|
74
|
-
return createBodyResponse("text", String(data), { status: this._status, headers: this._headers });
|
|
75
|
-
}
|
|
76
79
|
}
|
|
77
|
-
export {
|
|
78
|
-
ApiResponseBuilder
|
|
79
|
-
};
|
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Builds a typed HTTP response body for JSON, HTML, or plain text.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Sole internal emission path for adapter response helpers. Not exported from `@ecopages/core`.
|
|
6
|
+
*/
|
|
7
|
+
export function createBodyResponse(kind, data, init) {
|
|
8
|
+
const headers = new Headers(init?.headers);
|
|
9
|
+
const status = init?.status ?? 200;
|
|
10
|
+
if (kind === 'json') {
|
|
11
|
+
if (!headers.has('Content-Type')) {
|
|
12
|
+
headers.set('Content-Type', 'application/json; charset=utf-8');
|
|
13
|
+
}
|
|
14
|
+
return new Response(JSON.stringify(data), { status, headers });
|
|
7
15
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
16
|
+
if (kind === 'html') {
|
|
17
|
+
if (!headers.has('Content-Type')) {
|
|
18
|
+
headers.set('Content-Type', 'text/html; charset=utf-8');
|
|
19
|
+
}
|
|
20
|
+
return new Response(String(data), { status, headers });
|
|
21
|
+
}
|
|
22
|
+
if (!headers.has('Content-Type')) {
|
|
23
|
+
headers.set('Content-Type', 'text/plain; charset=utf-8');
|
|
13
24
|
}
|
|
14
25
|
return new Response(String(data), { status, headers });
|
|
15
|
-
}
|
|
16
|
-
if (!headers.has("Content-Type")) {
|
|
17
|
-
headers.set("Content-Type", "text/plain; charset=utf-8");
|
|
18
|
-
}
|
|
19
|
-
return new Response(String(data), { status, headers });
|
|
20
26
|
}
|
|
21
|
-
export {
|
|
22
|
-
createBodyResponse
|
|
23
|
-
};
|
|
@@ -1,63 +1,49 @@
|
|
|
1
|
-
import { createBodyResponse } from
|
|
2
|
-
function defineApiHandler(handler) {
|
|
3
|
-
|
|
1
|
+
import { createBodyResponse } from './create-body-response.js';
|
|
2
|
+
export function defineApiHandler(handler) {
|
|
3
|
+
return handler;
|
|
4
4
|
}
|
|
5
5
|
const defineApiMethod = (method) => (handler) => defineApiHandler({ ...handler, method });
|
|
6
|
-
const defineGet = defineApiMethod(
|
|
7
|
-
const definePost = defineApiMethod(
|
|
8
|
-
const definePut = defineApiMethod(
|
|
9
|
-
const defineDelete = defineApiMethod(
|
|
10
|
-
const definePatch = defineApiMethod(
|
|
11
|
-
const defineOptions = defineApiMethod(
|
|
12
|
-
const defineHead = defineApiMethod(
|
|
13
|
-
function json(data, options) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
6
|
+
export const defineGet = defineApiMethod('GET');
|
|
7
|
+
export const definePost = defineApiMethod('POST');
|
|
8
|
+
export const definePut = defineApiMethod('PUT');
|
|
9
|
+
export const defineDelete = defineApiMethod('DELETE');
|
|
10
|
+
export const definePatch = defineApiMethod('PATCH');
|
|
11
|
+
export const defineOptions = defineApiMethod('OPTIONS');
|
|
12
|
+
export const defineHead = defineApiMethod('HEAD');
|
|
13
|
+
export function json(data, options) {
|
|
14
|
+
return createBodyResponse('json', data, {
|
|
15
|
+
status: options?.status,
|
|
16
|
+
headers: options?.headers,
|
|
17
|
+
});
|
|
18
18
|
}
|
|
19
|
-
function html(content, options) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
export function html(content, options) {
|
|
20
|
+
return createBodyResponse('html', content, {
|
|
21
|
+
status: options?.status,
|
|
22
|
+
headers: options?.headers,
|
|
23
|
+
});
|
|
24
24
|
}
|
|
25
|
-
function redirect(url, status = 302) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
export function redirect(url, status = 302) {
|
|
26
|
+
return new Response(null, {
|
|
27
|
+
status,
|
|
28
|
+
headers: { Location: url },
|
|
29
|
+
});
|
|
30
30
|
}
|
|
31
31
|
function createGroupApi() {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
32
|
+
const define = ((handler) => handler);
|
|
33
|
+
return Object.assign(define, {
|
|
34
|
+
get: defineApiMethod('GET'),
|
|
35
|
+
post: defineApiMethod('POST'),
|
|
36
|
+
put: defineApiMethod('PUT'),
|
|
37
|
+
delete: defineApiMethod('DELETE'),
|
|
38
|
+
patch: defineApiMethod('PATCH'),
|
|
39
|
+
options: defineApiMethod('OPTIONS'),
|
|
40
|
+
head: defineApiMethod('HEAD'),
|
|
41
|
+
});
|
|
42
42
|
}
|
|
43
|
-
function defineGroupHandler(config) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
export function defineGroupHandler(config) {
|
|
44
|
+
return {
|
|
45
|
+
prefix: config.prefix,
|
|
46
|
+
middleware: config.middleware,
|
|
47
|
+
routes: config.routes(createGroupApi()),
|
|
48
|
+
};
|
|
49
49
|
}
|
|
50
|
-
export {
|
|
51
|
-
defineApiHandler,
|
|
52
|
-
defineDelete,
|
|
53
|
-
defineGet,
|
|
54
|
-
defineGroupHandler,
|
|
55
|
-
defineHead,
|
|
56
|
-
defineOptions,
|
|
57
|
-
definePatch,
|
|
58
|
-
definePost,
|
|
59
|
-
definePut,
|
|
60
|
-
html,
|
|
61
|
-
json,
|
|
62
|
-
redirect
|
|
63
|
-
};
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
function getViewIntegrationName(view) {
|
|
2
|
-
|
|
2
|
+
return view.config?.integration ?? view.config?.__eco?.integration;
|
|
3
3
|
}
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the renderer and static props needed to render one explicit static
|
|
6
|
+
* view at runtime or during static generation.
|
|
7
|
+
*/
|
|
8
|
+
export async function prepareExplicitStaticRender(input) {
|
|
9
|
+
const integrationName = getViewIntegrationName(input.view);
|
|
10
|
+
if (!integrationName) {
|
|
11
|
+
throw new Error(input.errors.missingIntegration(input.routePath));
|
|
12
|
+
}
|
|
13
|
+
const renderer = input.routeRendererFactory.getExplicitViewRenderer(integrationName);
|
|
14
|
+
if (!renderer) {
|
|
15
|
+
throw new Error(input.errors.noRendererForIntegration(integrationName));
|
|
16
|
+
}
|
|
17
|
+
const props = input.view.staticProps
|
|
18
|
+
? (await input.view.staticProps({
|
|
19
|
+
pathname: { params: input.params },
|
|
20
|
+
appConfig: input.appConfig,
|
|
21
|
+
runtimeOrigin: input.runtimeOrigin,
|
|
22
|
+
})).props
|
|
23
|
+
: {};
|
|
24
|
+
return {
|
|
25
|
+
renderer,
|
|
26
|
+
props,
|
|
27
|
+
view: input.view,
|
|
28
|
+
};
|
|
23
29
|
}
|
|
24
|
-
export {
|
|
25
|
-
prepareExplicitStaticRender
|
|
26
|
-
};
|