@ecopages/core 0.2.0-beta.31 → 0.2.0-beta.33
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 +90 -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/README.md +23 -0
- 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/client/navigation-lifecycle.d.ts +55 -0
- package/src/router/client/navigation-lifecycle.js +50 -0
- package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
- package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
- 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,66 +1,59 @@
|
|
|
1
|
-
import { appLogger } from
|
|
2
|
-
import { prepareExplicitStaticRender } from
|
|
3
|
-
import { matchExplicitStaticPathPattern } from
|
|
4
|
-
const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { appLogger } from '../../../global/app-logger.js';
|
|
2
|
+
import { prepareExplicitStaticRender } from './explicit-static-render-preparation.js';
|
|
3
|
+
import { matchExplicitStaticPathPattern } from '../../abstract/segment-path-matcher.js';
|
|
4
|
+
export const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
|
|
5
|
+
missingIntegration: (routePath) => `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
|
|
6
|
+
noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`,
|
|
7
7
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* Returns the matched route and extracted params, or null if no match.
|
|
20
|
-
*/
|
|
21
|
-
match(url) {
|
|
22
|
-
const pathname = new URL(url).pathname;
|
|
23
|
-
for (const route of this.staticRoutes) {
|
|
24
|
-
const params = matchExplicitStaticPathPattern(route.path, pathname);
|
|
25
|
-
if (params !== null) {
|
|
26
|
-
return { route, params };
|
|
27
|
-
}
|
|
8
|
+
/**
|
|
9
|
+
* Matches and renders explicit static routes declared through `app.static()`.
|
|
10
|
+
*/
|
|
11
|
+
export class ExplicitStaticRouteMatcher {
|
|
12
|
+
appConfig;
|
|
13
|
+
routeRendererFactory;
|
|
14
|
+
staticRoutes;
|
|
15
|
+
constructor({ appConfig, routeRendererFactory, staticRoutes }) {
|
|
16
|
+
this.appConfig = appConfig;
|
|
17
|
+
this.routeRendererFactory = routeRendererFactory;
|
|
18
|
+
this.staticRoutes = staticRoutes;
|
|
28
19
|
}
|
|
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
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Match a request URL against explicit static routes.
|
|
22
|
+
* Returns the matched route and extracted params, or null if no match.
|
|
23
|
+
*/
|
|
24
|
+
match(url) {
|
|
25
|
+
const pathname = new URL(url).pathname;
|
|
26
|
+
for (const route of this.staticRoutes) {
|
|
27
|
+
const params = matchExplicitStaticPathPattern(route.path, pathname);
|
|
28
|
+
if (params !== null) {
|
|
29
|
+
return { route, params };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Handle a matched explicit static route.
|
|
36
|
+
* Resolves the loader and renders the view using the appropriate integration renderer.
|
|
37
|
+
*/
|
|
38
|
+
async handleMatch(match) {
|
|
39
|
+
const { route, params } = match;
|
|
40
|
+
try {
|
|
41
|
+
const mod = await route.loader();
|
|
42
|
+
const view = mod.default;
|
|
43
|
+
const { renderer, props, view: renderableView, } = await prepareExplicitStaticRender({
|
|
44
|
+
routePath: route.path,
|
|
45
|
+
view,
|
|
46
|
+
params,
|
|
47
|
+
appConfig: this.appConfig,
|
|
48
|
+
runtimeOrigin: this.appConfig.baseUrl,
|
|
49
|
+
routeRendererFactory: this.routeRendererFactory,
|
|
50
|
+
errors: EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS,
|
|
51
|
+
});
|
|
52
|
+
return renderer.renderToResponse(renderableView, props, {});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
appLogger.error(`Error rendering explicit static route ${route.path}:`, error instanceof Error ? error : String(error));
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
60
58
|
}
|
|
61
|
-
}
|
|
62
59
|
}
|
|
63
|
-
export {
|
|
64
|
-
EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS,
|
|
65
|
-
ExplicitStaticRouteMatcher
|
|
66
|
-
};
|
|
@@ -1,78 +1,84 @@
|
|
|
1
|
-
import { createRequire } from
|
|
2
|
-
import { ApiResponseBuilder } from
|
|
3
|
-
import { runMiddlewareChain } from
|
|
4
|
-
import { LocalsAccessError } from
|
|
5
|
-
const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS = {
|
|
6
|
-
|
|
1
|
+
import { createRequire } from '../../../utils/locals-utils.js';
|
|
2
|
+
import { ApiResponseBuilder } from './api-response.js';
|
|
3
|
+
import { runMiddlewareChain } from './run-middleware-chain.js';
|
|
4
|
+
import { LocalsAccessError } from '../../../errors/locals-access-error.js';
|
|
5
|
+
export const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS = {
|
|
6
|
+
middlewareRequiresDynamic: (filePath) => `[ecopages] Page middleware requires cache: 'dynamic'. Page: ${filePath}`,
|
|
7
7
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Executes middleware for file-based page routes.
|
|
10
|
+
*
|
|
11
|
+
* This pipeline owns the middleware-specific rules that are distinct from route
|
|
12
|
+
* matching and rendering, including request-local storage, the middleware
|
|
13
|
+
* execution context, and the invariant that page middleware only runs for
|
|
14
|
+
* request-time dynamic rendering.
|
|
15
|
+
*/
|
|
16
|
+
export class FileRouteMiddlewarePipeline {
|
|
17
|
+
cacheService;
|
|
18
|
+
constructor(cacheService) {
|
|
19
|
+
this.cacheService = cacheService;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Enforces the current middleware contract for file-routed pages.
|
|
23
|
+
*
|
|
24
|
+
* Middleware depends on request-scoped locals and therefore must not run when
|
|
25
|
+
* the page is treated as statically cacheable.
|
|
26
|
+
*
|
|
27
|
+
* @param input Middleware list, effective cache strategy, and page path.
|
|
28
|
+
* @throws LocalsAccessError When middleware is configured for a non-dynamic page.
|
|
29
|
+
*/
|
|
30
|
+
assertValidConfiguration(input) {
|
|
31
|
+
if (input.middleware.length > 0 && input.pageCacheStrategy !== 'dynamic') {
|
|
32
|
+
throw new LocalsAccessError(FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS.middlewareRequiresDynamic(input.filePath));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Creates the request-scoped middleware context used by page middleware.
|
|
37
|
+
*
|
|
38
|
+
* The context intentionally omits `render()` and `renderPartial()` because
|
|
39
|
+
* rendering is owned by the page route pipeline, not by middleware stages.
|
|
40
|
+
*
|
|
41
|
+
* @param input Request details and the mutable locals store.
|
|
42
|
+
* @returns Middleware execution context.
|
|
43
|
+
*/
|
|
44
|
+
createContext(input) {
|
|
45
|
+
const context = {
|
|
46
|
+
request: input.request,
|
|
47
|
+
params: input.params,
|
|
48
|
+
response: new ApiResponseBuilder(),
|
|
49
|
+
server: null,
|
|
50
|
+
services: {
|
|
51
|
+
cache: this.cacheService,
|
|
52
|
+
},
|
|
53
|
+
locals: input.locals,
|
|
54
|
+
require: createRequire(() => context.locals),
|
|
55
|
+
json: (data, options) => {
|
|
56
|
+
if (options?.status)
|
|
57
|
+
context.response.status(options.status);
|
|
58
|
+
if (options?.headers)
|
|
59
|
+
context.response.headers(options.headers);
|
|
60
|
+
return context.response.json(data);
|
|
61
|
+
},
|
|
62
|
+
html: (content, options) => {
|
|
63
|
+
if (options?.status)
|
|
64
|
+
context.response.status(options.status);
|
|
65
|
+
if (options?.headers)
|
|
66
|
+
context.response.headers(options.headers);
|
|
67
|
+
return context.response.html(content);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
return context;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Runs the middleware chain and eventually delegates to the render callback.
|
|
74
|
+
*
|
|
75
|
+
* Middleware may short-circuit by returning a response directly. If the chain
|
|
76
|
+
* completes, the supplied `renderResponse` callback is executed exactly once.
|
|
77
|
+
*
|
|
78
|
+
* @param input Middleware context, chain, and terminal render callback.
|
|
79
|
+
* @returns Response from middleware or final render stage.
|
|
80
|
+
*/
|
|
81
|
+
async run(input) {
|
|
82
|
+
return runMiddlewareChain(input.middleware, input.context, input.renderResponse);
|
|
27
83
|
}
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Creates the request-scoped middleware context used by page middleware.
|
|
31
|
-
*
|
|
32
|
-
* The context intentionally omits `render()` and `renderPartial()` because
|
|
33
|
-
* rendering is owned by the page route pipeline, not by middleware stages.
|
|
34
|
-
*
|
|
35
|
-
* @param input Request details and the mutable locals store.
|
|
36
|
-
* @returns Middleware execution context.
|
|
37
|
-
*/
|
|
38
|
-
createContext(input) {
|
|
39
|
-
const context = {
|
|
40
|
-
request: input.request,
|
|
41
|
-
params: input.params,
|
|
42
|
-
response: new ApiResponseBuilder(),
|
|
43
|
-
server: null,
|
|
44
|
-
services: {
|
|
45
|
-
cache: this.cacheService
|
|
46
|
-
},
|
|
47
|
-
locals: input.locals,
|
|
48
|
-
require: createRequire(() => context.locals),
|
|
49
|
-
json: (data, options) => {
|
|
50
|
-
if (options?.status) context.response.status(options.status);
|
|
51
|
-
if (options?.headers) context.response.headers(options.headers);
|
|
52
|
-
return context.response.json(data);
|
|
53
|
-
},
|
|
54
|
-
html: (content, options) => {
|
|
55
|
-
if (options?.status) context.response.status(options.status);
|
|
56
|
-
if (options?.headers) context.response.headers(options.headers);
|
|
57
|
-
return context.response.html(content);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
return context;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Runs the middleware chain and eventually delegates to the render callback.
|
|
64
|
-
*
|
|
65
|
-
* Middleware may short-circuit by returning a response directly. If the chain
|
|
66
|
-
* completes, the supplied `renderResponse` callback is executed exactly once.
|
|
67
|
-
*
|
|
68
|
-
* @param input Middleware context, chain, and terminal render callback.
|
|
69
|
-
* @returns Response from middleware or final render stage.
|
|
70
|
-
*/
|
|
71
|
-
async run(input) {
|
|
72
|
-
return runMiddlewareChain(input.middleware, input.context, input.renderResponse);
|
|
73
|
-
}
|
|
74
84
|
}
|
|
75
|
-
export {
|
|
76
|
-
FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS,
|
|
77
|
-
FileRouteMiddlewarePipeline
|
|
78
|
-
};
|
|
@@ -1,101 +1,106 @@
|
|
|
1
|
-
import { STATUS_MESSAGE } from
|
|
2
|
-
import { appLogger } from
|
|
3
|
-
import { fileSystem } from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
shouldEnableGzip(contentType) {
|
|
13
|
-
if (this.options.watchMode) return false;
|
|
14
|
-
const gzipEnabledExtensions = ["text/javascript", "text/css"];
|
|
15
|
-
return gzipEnabledExtensions.includes(contentType);
|
|
16
|
-
}
|
|
17
|
-
async createResponseWithBody(body, init = {
|
|
18
|
-
headers: {
|
|
19
|
-
"Content-Type": "text/html"
|
|
1
|
+
import { STATUS_MESSAGE } from '../../../config/constants.js';
|
|
2
|
+
import { appLogger } from '../../../global/app-logger.js';
|
|
3
|
+
import { fileSystem } from '@ecopages/file-system';
|
|
4
|
+
/**
|
|
5
|
+
* Builds HTTP responses for static files and shared file-system fallbacks.
|
|
6
|
+
*/
|
|
7
|
+
export class FileSystemServerResponseFactory {
|
|
8
|
+
options;
|
|
9
|
+
constructor({ options }) {
|
|
10
|
+
this.options = options;
|
|
20
11
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
*/
|
|
32
|
-
async createHtmlNotFoundResponse(body) {
|
|
33
|
-
return await this.createResponseWithBody(body, {
|
|
34
|
-
status: 404,
|
|
35
|
-
statusText: STATUS_MESSAGE[404],
|
|
36
|
-
headers: {
|
|
37
|
-
"Content-Type": "text/html"
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
async createDefaultServerErrorResponse() {
|
|
42
|
-
return new Response(STATUS_MESSAGE[500], {
|
|
43
|
-
status: 500,
|
|
44
|
-
headers: {
|
|
45
|
-
"Content-Type": "text/plain; charset=utf-8"
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Wraps already-rendered HTML in a 500 response envelope.
|
|
51
|
-
*/
|
|
52
|
-
async createHtmlServerErrorResponse(body) {
|
|
53
|
-
return await this.createResponseWithBody(body, {
|
|
54
|
-
status: 500,
|
|
55
|
-
statusText: STATUS_MESSAGE[500],
|
|
56
|
-
headers: {
|
|
57
|
-
"Content-Type": "text/html"
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Reads a static file response, returning `null` when the file is missing.
|
|
63
|
-
*/
|
|
64
|
-
async createFileResponse(filePath, contentType) {
|
|
65
|
-
try {
|
|
66
|
-
let file;
|
|
67
|
-
const contentEncodingHeader = {};
|
|
68
|
-
if (this.shouldEnableGzip(contentType)) {
|
|
69
|
-
const gzipPath = `${filePath}.gz`;
|
|
70
|
-
if (fileSystem.exists(gzipPath)) {
|
|
71
|
-
file = fileSystem.readFileAsBuffer(gzipPath);
|
|
72
|
-
contentEncodingHeader["Content-Encoding"] = "gzip";
|
|
73
|
-
contentEncodingHeader["Vary"] = "Accept-Encoding";
|
|
74
|
-
} else {
|
|
75
|
-
appLogger.debug("Gzip file not found, serving uncompressed", gzipPath);
|
|
76
|
-
file = fileSystem.readFileAsBuffer(filePath);
|
|
77
|
-
}
|
|
78
|
-
} else {
|
|
79
|
-
file = fileSystem.readFileAsBuffer(filePath);
|
|
80
|
-
}
|
|
81
|
-
return await this.createResponseWithBody(file, {
|
|
12
|
+
isHtml(contentType) {
|
|
13
|
+
return contentType === 'text/html';
|
|
14
|
+
}
|
|
15
|
+
shouldEnableGzip(contentType) {
|
|
16
|
+
if (this.options.watchMode)
|
|
17
|
+
return false;
|
|
18
|
+
const gzipEnabledExtensions = ['text/javascript', 'text/css'];
|
|
19
|
+
return gzipEnabledExtensions.includes(contentType);
|
|
20
|
+
}
|
|
21
|
+
async createResponseWithBody(body, init = {
|
|
82
22
|
headers: {
|
|
83
|
-
|
|
84
|
-
|
|
23
|
+
'Content-Type': 'text/html',
|
|
24
|
+
},
|
|
25
|
+
}) {
|
|
26
|
+
return new Response(body, init);
|
|
27
|
+
}
|
|
28
|
+
async createDefaultNotFoundResponse() {
|
|
29
|
+
return new Response(STATUS_MESSAGE[404], {
|
|
30
|
+
status: 404,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Wraps already-rendered HTML in a 404 response envelope.
|
|
35
|
+
*/
|
|
36
|
+
async createHtmlNotFoundResponse(body) {
|
|
37
|
+
return await this.createResponseWithBody(body, {
|
|
38
|
+
status: 404,
|
|
39
|
+
statusText: STATUS_MESSAGE[404],
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'text/html',
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async createDefaultServerErrorResponse() {
|
|
46
|
+
return new Response(STATUS_MESSAGE[500], {
|
|
47
|
+
status: 500,
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'text/plain; charset=utf-8',
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Wraps already-rendered HTML in a 500 response envelope.
|
|
55
|
+
*/
|
|
56
|
+
async createHtmlServerErrorResponse(body) {
|
|
57
|
+
return await this.createResponseWithBody(body, {
|
|
58
|
+
status: 500,
|
|
59
|
+
statusText: STATUS_MESSAGE[500],
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'text/html',
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reads a static file response, returning `null` when the file is missing.
|
|
67
|
+
*/
|
|
68
|
+
async createFileResponse(filePath, contentType) {
|
|
69
|
+
try {
|
|
70
|
+
let file;
|
|
71
|
+
const contentEncodingHeader = {};
|
|
72
|
+
if (this.shouldEnableGzip(contentType)) {
|
|
73
|
+
const gzipPath = `${filePath}.gz`;
|
|
74
|
+
if (fileSystem.exists(gzipPath)) {
|
|
75
|
+
file = fileSystem.readFileAsBuffer(gzipPath);
|
|
76
|
+
contentEncodingHeader['Content-Encoding'] = 'gzip';
|
|
77
|
+
contentEncodingHeader['Vary'] = 'Accept-Encoding';
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
appLogger.debug('Gzip file not found, serving uncompressed', gzipPath);
|
|
81
|
+
file = fileSystem.readFileAsBuffer(filePath);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
file = fileSystem.readFileAsBuffer(filePath);
|
|
86
|
+
}
|
|
87
|
+
return await this.createResponseWithBody(file, {
|
|
88
|
+
headers: {
|
|
89
|
+
'Content-Type': contentType,
|
|
90
|
+
...contentEncodingHeader,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const err = error;
|
|
96
|
+
const code = err.code || err.cause?.code;
|
|
97
|
+
if (code === 'ENOENT') {
|
|
98
|
+
appLogger.debug('File not found', filePath);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
appLogger.error('Error reading file', filePath, err);
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
85
104
|
}
|
|
86
|
-
});
|
|
87
|
-
} catch (error) {
|
|
88
|
-
const err = error;
|
|
89
|
-
const code = err.code || err.cause?.code;
|
|
90
|
-
if (code === "ENOENT") {
|
|
91
|
-
appLogger.debug("File not found", filePath);
|
|
92
|
-
} else {
|
|
93
|
-
appLogger.error("Error reading file", filePath, err);
|
|
94
|
-
}
|
|
95
|
-
return null;
|
|
96
105
|
}
|
|
97
|
-
}
|
|
98
106
|
}
|
|
99
|
-
export {
|
|
100
|
-
FileSystemServerResponseFactory
|
|
101
|
-
};
|