@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -64
- package/README.md +212 -14
- package/package.json +116 -66
- package/src/adapters/README.md +39 -0
- package/src/adapters/abstract/application-adapter.d.ts +28 -2
- package/src/adapters/abstract/application-adapter.js +14 -2
- package/src/adapters/abstract/router-adapter.d.ts +1 -1
- package/src/adapters/abstract/server-adapter.d.ts +2 -2
- package/src/adapters/bun/client-bridge.d.ts +1 -1
- package/src/adapters/bun/create-app.d.ts +4 -12
- package/src/adapters/bun/create-app.js +4 -5
- package/src/adapters/bun/hmr-manager.d.ts +80 -21
- package/src/adapters/bun/hmr-manager.js +168 -62
- package/src/adapters/bun/index.d.ts +2 -3
- package/src/adapters/bun/index.js +3 -3
- package/src/adapters/bun/server-adapter.d.ts +5 -5
- package/src/adapters/bun/server-adapter.js +40 -34
- package/src/adapters/bun/server-lifecycle.d.ts +28 -17
- package/src/adapters/bun/server-lifecycle.js +34 -62
- package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
- package/src/{create-app.js → adapters/create-app.js} +4 -4
- package/src/adapters/index.d.ts +2 -6
- package/src/adapters/index.js +2 -8
- package/src/adapters/node/create-app.d.ts +6 -9
- package/src/adapters/node/create-app.js +12 -6
- package/src/adapters/node/node-client-bridge.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.d.ts +89 -18
- package/src/adapters/node/node-hmr-manager.js +185 -95
- package/src/adapters/node/server-adapter.d.ts +6 -35
- package/src/adapters/node/server-adapter.js +44 -105
- package/src/adapters/node/static-content-server.d.ts +37 -1
- package/src/adapters/node/static-content-server.js +29 -1
- package/src/adapters/shared/application-adapter.d.ts +1 -1
- package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +2 -2
- package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
- package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
- package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
- package/src/adapters/shared/fs-server-response-factory.js +1 -1
- package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
- package/src/adapters/shared/fs-server-response-matcher.js +10 -18
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
- package/src/adapters/shared/hmr-html-response.d.ts +22 -0
- package/src/adapters/shared/hmr-html-response.js +32 -0
- package/src/adapters/shared/render-context.d.ts +2 -1
- package/src/adapters/shared/render-context.js +6 -3
- package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
- package/src/adapters/shared/runtime-bootstrap.js +43 -0
- package/src/adapters/shared/server-adapter.d.ts +13 -3
- package/src/adapters/shared/server-adapter.js +42 -5
- package/src/adapters/shared/server-route-handler.d.ts +4 -4
- package/src/adapters/shared/server-route-handler.js +6 -15
- package/src/adapters/shared/server-static-builder.d.ts +38 -6
- package/src/adapters/shared/server-static-builder.js +64 -10
- package/src/build/README.md +107 -0
- package/src/build/build-adapter.d.ts +168 -3
- package/src/build/build-adapter.js +604 -16
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -0
- package/src/build/dev-build-coordinator.d.ts +72 -0
- package/src/build/dev-build-coordinator.js +154 -0
- package/src/build/esbuild-build-adapter.d.ts +15 -6
- package/src/build/esbuild-build-adapter.js +189 -74
- package/src/build/runtime-build-executor.d.ts +14 -0
- package/src/build/runtime-build-executor.js +22 -0
- package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
- package/src/build/runtime-specifier-alias-plugin.js +35 -0
- package/src/build/runtime-specifier-aliases.d.ts +5 -0
- package/src/build/runtime-specifier-aliases.js +95 -0
- package/src/config/README.md +36 -0
- package/src/config/config-builder.d.ts +52 -27
- package/src/config/config-builder.js +260 -49
- package/src/{constants.d.ts → config/constants.d.ts} +13 -0
- package/src/{constants.js → config/constants.js} +4 -0
- package/src/declarations.d.ts +19 -14
- package/src/dev/sc-server.d.ts +1 -1
- package/src/dev/sc-server.js +1 -1
- package/src/eco/README.md +70 -16
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +83 -0
- package/src/eco/eco.js +32 -57
- package/src/eco/eco.types.d.ts +12 -4
- package/src/eco/eco.utils.d.ts +1 -40
- package/src/eco/eco.utils.js +5 -35
- package/src/eco/global-injector-map.d.ts +1 -1
- package/src/eco/lazy-injector-map.d.ts +1 -1
- package/src/hmr/README.md +26 -0
- package/src/hmr/client/hmr-runtime.d.ts +1 -6
- package/src/hmr/client/hmr-runtime.js +30 -7
- package/src/hmr/hmr-strategy.d.ts +16 -13
- package/src/hmr/hmr-strategy.js +22 -7
- package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
- package/src/hmr/hmr.postcss.test.e2e.js +31 -0
- package/src/hmr/hmr.test.e2e.js +26 -33
- package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
- package/src/hmr/strategies/default-hmr-strategy.js +1 -1
- package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
- package/src/hmr/strategies/js-hmr-strategy.js +72 -73
- package/src/index.browser.d.ts +2 -2
- package/src/index.browser.js +1 -1
- package/src/index.d.ts +4 -3
- package/src/index.js +16 -5
- package/src/integrations/ghtml/ghtml-renderer.d.ts +7 -2
- package/src/integrations/ghtml/ghtml-renderer.js +33 -30
- package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
- package/src/integrations/ghtml/ghtml.constants.js +4 -0
- package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
- package/src/integrations/ghtml/ghtml.plugin.js +3 -4
- package/src/plugins/README.md +35 -0
- package/src/plugins/alias-resolver-plugin.js +17 -3
- package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
- package/src/plugins/eco-component-meta-plugin.js +27 -21
- package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
- package/src/plugins/foreign-jsx-override-plugin.js +35 -0
- package/src/plugins/integration-plugin.d.ts +145 -28
- package/src/plugins/integration-plugin.js +109 -13
- package/src/plugins/processor.d.ts +15 -2
- package/src/plugins/processor.js +16 -2
- package/src/plugins/runtime-capability.d.ts +9 -0
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/GRAPH.md +64 -98
- package/src/route-renderer/README.md +67 -46
- package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
- package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
- package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
- package/src/route-renderer/orchestration/component-render-context.js +147 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
- package/src/route-renderer/orchestration/integration-renderer.js +957 -0
- package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
- package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
- package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
- package/src/route-renderer/orchestration/render-execution.service.js +106 -0
- package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
- package/src/route-renderer/orchestration/render-output.utils.js +65 -0
- package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
- package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
- package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
- package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
- package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
- package/src/route-renderer/orchestration/template-serialization.js +45 -0
- package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
- package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
- package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
- package/src/route-renderer/route-renderer.d.ts +45 -4
- package/src/route-renderer/route-renderer.js +38 -3
- package/src/router/README.md +97 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.js +34 -0
- package/src/router/client/link-intent.test.browser.d.ts +1 -0
- package/src/router/client/link-intent.test.browser.js +43 -0
- package/src/router/client/navigation-coordinator.d.ts +149 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
- package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
- package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
- package/src/router/{fs-router.js → server/fs-router.js} +1 -1
- package/src/services/README.md +29 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
- package/src/services/assets/asset-processing-service/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/index.js +5 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
- package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/index.js +5 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
- package/src/services/assets/browser-bundle.service.d.ts +32 -0
- package/src/services/assets/browser-bundle.service.js +33 -0
- package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
- package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
- package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
- package/src/services/html/html-rewriter-provider.service.js +68 -0
- package/src/services/html/html-transformer.service.d.ts +77 -0
- package/src/services/html/html-transformer.service.js +215 -0
- package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
- package/src/services/invalidation/development-invalidation.service.js +190 -0
- package/src/services/module-loading/app-module-loader.service.d.ts +28 -0
- package/src/services/module-loading/app-module-loader.service.js +35 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
- package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
- package/src/services/module-loading/host-module-loader-registry.js +15 -0
- package/src/services/module-loading/module-loading-types.d.ts +2 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
- package/src/services/module-loading/page-module-import.service.d.ts +76 -0
- package/src/services/module-loading/page-module-import.service.js +173 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
- package/src/services/module-loading/server-module-transpiler.service.js +64 -0
- package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
- package/src/services/runtime-state/dev-graph.service.js +162 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
- package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
- package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.d.ts +50 -3
- package/src/static-site-generator/static-site-generator.js +71 -5
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
- package/src/types/public-types.js +0 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +6 -0
- package/src/utils/locals-utils.d.ts +1 -1
- package/src/utils/parse-cli-args.d.ts +4 -1
- package/src/utils/parse-cli-args.js +16 -1
- package/src/utils/resolve-work-dir.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/watchers/project-watcher.d.ts +40 -24
- package/src/watchers/project-watcher.js +129 -92
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +1 -0
- package/src/adapters/abstract/application-adapter.ts +0 -337
- package/src/adapters/abstract/router-adapter.ts +0 -30
- package/src/adapters/abstract/server-adapter.ts +0 -79
- package/src/adapters/bun/client-bridge.ts +0 -62
- package/src/adapters/bun/create-app.ts +0 -189
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.ts +0 -281
- package/src/adapters/bun/index.ts +0 -3
- package/src/adapters/bun/server-adapter.ts +0 -492
- package/src/adapters/bun/server-lifecycle.ts +0 -154
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/index.ts +0 -9
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -271
- package/src/adapters/node/server-adapter.ts +0 -561
- package/src/adapters/node/static-content-server.ts +0 -203
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
- package/src/adapters/shared/render-context.ts +0 -105
- package/src/adapters/shared/server-adapter.ts +0 -442
- package/src/adapters/shared/server-route-handler.ts +0 -166
- package/src/adapters/shared/server-static-builder.ts +0 -82
- package/src/build/build-adapter.ts +0 -132
- package/src/build/build-types.ts +0 -83
- package/src/build/esbuild-build-adapter.ts +0 -510
- package/src/config/config-builder.ts +0 -474
- package/src/constants.ts +0 -39
- package/src/create-app.ts +0 -87
- package/src/define-api-handler.js +0 -15
- package/src/define-api-handler.ts +0 -66
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -77
- package/src/eco/component-render-context.ts +0 -202
- package/src/eco/eco.ts +0 -221
- package/src/eco/eco.types.ts +0 -202
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -2
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
- package/src/hmr/client/hmr-runtime.ts +0 -121
- package/src/hmr/hmr-strategy.ts +0 -172
- package/src/hmr/hmr.test.e2e.ts +0 -75
- package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -212
- package/src/plugins/alias-resolver-plugin.ts +0 -45
- package/src/plugins/eco-component-meta-plugin.ts +0 -474
- package/src/plugins/integration-plugin.ts +0 -184
- package/src/plugins/processor.ts +0 -220
- package/src/public-types.ts +0 -1255
- package/src/route-renderer/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph-executor.ts +0 -84
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-graph.ts +0 -159
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/component-marker.ts +0 -117
- package/src/route-renderer/dependency-resolver.ts +0 -596
- package/src/route-renderer/html-post-processing.service.d.ts +0 -40
- package/src/route-renderer/html-post-processing.service.js +0 -86
- package/src/route-renderer/html-post-processing.service.ts +0 -103
- package/src/route-renderer/integration-renderer.d.ts +0 -339
- package/src/route-renderer/integration-renderer.js +0 -526
- package/src/route-renderer/integration-renderer.ts +0 -696
- package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
- package/src/route-renderer/marker-graph-resolver.js +0 -93
- package/src/route-renderer/marker-graph-resolver.ts +0 -153
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.ts +0 -153
- package/src/route-renderer/render-execution.service.d.ts +0 -69
- package/src/route-renderer/render-execution.service.js +0 -91
- package/src/route-renderer/render-execution.service.ts +0 -158
- package/src/route-renderer/render-preparation.service.ts +0 -358
- package/src/route-renderer/route-renderer.ts +0 -80
- package/src/router/fs-router-scanner.ts +0 -217
- package/src/router/fs-router.ts +0 -122
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
- package/src/services/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/asset-processing-service/assets.types.ts +0 -112
- package/src/services/asset-processing-service/index.d.ts +0 -3
- package/src/services/asset-processing-service/index.js +0 -3
- package/src/services/asset-processing-service/index.ts +0 -3
- package/src/services/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
- package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
- package/src/services/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/asset-processing-service/processors/index.js +0 -5
- package/src/services/asset-processing-service/processors/index.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- package/src/services/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.ts +0 -128
- package/src/services/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -359
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/watchers/project-watcher.test-helpers.ts +0 -40
- package/src/watchers/project-watcher.ts +0 -306
- /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
- /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
- /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { fileSystem } from "@ecopages/file-system";
|
|
4
|
-
import { RESOLVED_ASSETS_DIR } from "../../constants.js";
|
|
5
|
-
import { defaultBuildAdapter } from "../../build/build-adapter.js";
|
|
6
2
|
import { appLogger } from "../../global/app-logger.js";
|
|
7
|
-
import { ProjectWatcher } from "../../watchers/project-watcher.js";
|
|
8
3
|
import { NodeClientBridge } from "./node-client-bridge.js";
|
|
9
|
-
import { NodeHmrManager } from "./node-hmr-manager.js";
|
|
10
4
|
import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
|
|
11
5
|
import { SharedServerAdapter } from "../shared/server-adapter.js";
|
|
12
6
|
import { ServerStaticBuilder } from "../shared/server-static-builder.js";
|
|
7
|
+
import {
|
|
8
|
+
bindSharedRuntimeHmrManager,
|
|
9
|
+
initializeSharedRuntimePlugins,
|
|
10
|
+
installSharedRuntimeBuildExecutor,
|
|
11
|
+
prepareSharedRuntimePublicDir,
|
|
12
|
+
startSharedProjectWatching
|
|
13
|
+
} from "../shared/runtime-bootstrap.js";
|
|
13
14
|
import { NodeStaticContentServer } from "./static-content-server.js";
|
|
15
|
+
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
|
|
14
16
|
class ClientAbortError extends Error {
|
|
15
17
|
constructor() {
|
|
16
18
|
super("Client closed the request");
|
|
@@ -26,7 +28,6 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
26
28
|
previewServer = null;
|
|
27
29
|
bridge = null;
|
|
28
30
|
hmrManager = null;
|
|
29
|
-
processorBuildPlugins = [];
|
|
30
31
|
constructor(options) {
|
|
31
32
|
super(options);
|
|
32
33
|
this.apiHandlers = options.apiHandlers || [];
|
|
@@ -47,85 +48,28 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
47
48
|
* processors during their `setup()` calls.
|
|
48
49
|
*/
|
|
49
50
|
async initialize() {
|
|
50
|
-
this.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
installSharedRuntimeBuildExecutor(this.appConfig, {
|
|
52
|
+
development: this.options?.watch === true
|
|
53
|
+
});
|
|
54
|
+
prepareSharedRuntimePublicDir(this.appConfig);
|
|
55
|
+
await initializeSharedRuntimePlugins({
|
|
56
|
+
appConfig: this.appConfig,
|
|
57
|
+
runtimeOrigin: this.runtimeOrigin,
|
|
58
|
+
hmrManager: this.hmrManager ?? void 0
|
|
59
|
+
});
|
|
60
|
+
await this.initializeSharedRouteHandling({
|
|
61
|
+
staticRoutes: this.staticRoutes,
|
|
62
|
+
hmrManager: this.hmrManager ?? void 0
|
|
63
|
+
});
|
|
55
64
|
this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
|
|
56
65
|
this.staticBuilder = new ServerStaticBuilder({
|
|
57
66
|
appConfig: this.appConfig,
|
|
58
67
|
staticSiteGenerator: this.staticSiteGenerator,
|
|
59
|
-
serveOptions: this.serveOptions
|
|
68
|
+
serveOptions: this.serveOptions,
|
|
69
|
+
apiHandlers: this.apiHandlers
|
|
60
70
|
});
|
|
61
71
|
this.initialized = true;
|
|
62
72
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Registers every configured file loader as a build plugin on the shared
|
|
65
|
-
* `defaultBuildAdapter`.
|
|
66
|
-
*
|
|
67
|
-
* Loaders are registered on the *shared* adapter (not on a per-build instance)
|
|
68
|
-
* because they must be available globally to both the SSR build and any dynamic
|
|
69
|
-
* transpile passes that happen outside of a top-level `build()` call (e.g. HMR
|
|
70
|
-
* incremental rebuilds).
|
|
71
|
-
*/
|
|
72
|
-
setupLoaders() {
|
|
73
|
-
for (const loader of this.appConfig.loaders.values()) {
|
|
74
|
-
defaultBuildAdapter.registerPlugin(loader);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
copyPublicDir() {
|
|
78
|
-
const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
|
|
79
|
-
if (fileSystem.exists(srcPublicDir)) {
|
|
80
|
-
fileSystem.copyDir(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
|
|
81
|
-
}
|
|
82
|
-
fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Sets up all configured processors and integrations in two distinct phases.
|
|
86
|
-
*
|
|
87
|
-
* **Phase 1 — Processors:**
|
|
88
|
-
* Each processor's `setup()` is called first. A processor may expose two
|
|
89
|
-
* plugin lists:
|
|
90
|
-
* - `plugins` — transform plugins used during SSR rendering (e.g. PostCSS).
|
|
91
|
-
* - `buildPlugins` — esbuild plugins used during the client bundle step.
|
|
92
|
-
* Both are registered on `defaultBuildAdapter` so later build calls pick them up.
|
|
93
|
-
*
|
|
94
|
-
* **Phase 2 — Integrations:**
|
|
95
|
-
* Integrations receive the fully-resolved app config, the runtime origin, and
|
|
96
|
-
* (if already initialised) the HMR manager before their own `setup()` is called.
|
|
97
|
-
* This ordering ensures integrations can query config values that processors
|
|
98
|
-
* may have mutated during phase 1.
|
|
99
|
-
*/
|
|
100
|
-
async initializePlugins() {
|
|
101
|
-
const processorBuildPlugins = [];
|
|
102
|
-
for (const processor of this.appConfig.processors.values()) {
|
|
103
|
-
await processor.setup();
|
|
104
|
-
if (processor.plugins) {
|
|
105
|
-
for (const plugin of processor.plugins) {
|
|
106
|
-
defaultBuildAdapter.registerPlugin(plugin);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (processor.buildPlugins) {
|
|
110
|
-
processorBuildPlugins.push(...processor.buildPlugins);
|
|
111
|
-
for (const plugin of processor.buildPlugins) {
|
|
112
|
-
defaultBuildAdapter.registerPlugin(plugin);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
for (const integration of this.appConfig.integrations) {
|
|
117
|
-
integration.setConfig(this.appConfig);
|
|
118
|
-
integration.setRuntimeOrigin(this.runtimeOrigin);
|
|
119
|
-
if (this.hmrManager) {
|
|
120
|
-
integration.setHmrManager(this.hmrManager);
|
|
121
|
-
}
|
|
122
|
-
await integration.setup();
|
|
123
|
-
for (const plugin of integration.plugins) {
|
|
124
|
-
defaultBuildAdapter.registerPlugin(plugin);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
this.processorBuildPlugins = processorBuildPlugins;
|
|
128
|
-
}
|
|
129
73
|
getServerOptions() {
|
|
130
74
|
return {
|
|
131
75
|
...this.serveOptions
|
|
@@ -158,12 +102,12 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
158
102
|
appConfig: this.appConfig,
|
|
159
103
|
options: {
|
|
160
104
|
hostname: this.serveOptions.hostname,
|
|
161
|
-
port: Number(this.serveOptions.port ||
|
|
105
|
+
port: Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT)
|
|
162
106
|
}
|
|
163
107
|
});
|
|
164
108
|
await this.previewServer.start();
|
|
165
|
-
const previewHostname = this.serveOptions.hostname ||
|
|
166
|
-
const previewPort = this.serveOptions.port ||
|
|
109
|
+
const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
|
|
110
|
+
const previewPort = this.serveOptions.port || DEFAULT_ECOPAGES_PORT;
|
|
167
111
|
appLogger.info(`Preview running at http://${previewHostname}:${previewPort}`);
|
|
168
112
|
}
|
|
169
113
|
/**
|
|
@@ -254,8 +198,8 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
254
198
|
* `stopBuildRuntimeServer`, so it never overlaps with the actual dev/prod server.
|
|
255
199
|
*/
|
|
256
200
|
async startBuildRuntimeServer() {
|
|
257
|
-
const hostname = String(this.serveOptions.hostname ||
|
|
258
|
-
const port = Number(this.serveOptions.port ||
|
|
201
|
+
const hostname = String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME);
|
|
202
|
+
const port = Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT);
|
|
259
203
|
const server = createServer(async (req, res) => {
|
|
260
204
|
try {
|
|
261
205
|
const webRequest = this.createWebRequest(req);
|
|
@@ -325,12 +269,12 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
325
269
|
* underlying socket closes early — into a 499 response so it does not
|
|
326
270
|
* incorrectly surface as a 500 in application logs.
|
|
327
271
|
*/
|
|
328
|
-
async handleRequest(
|
|
272
|
+
async handleRequest(request) {
|
|
329
273
|
if (!this.initialized) {
|
|
330
274
|
throw new Error("Node server adapter is not initialized. Call createAdapter() first.");
|
|
331
275
|
}
|
|
332
276
|
try {
|
|
333
|
-
return await this.handleSharedRequest(
|
|
277
|
+
return await this.handleSharedRequest(request, {
|
|
334
278
|
apiHandlers: this.apiHandlers,
|
|
335
279
|
errorHandler: this.errorHandler,
|
|
336
280
|
serverInstance: this.serverInstance,
|
|
@@ -353,22 +297,23 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
353
297
|
* broadcast + heartbeat cleanup.
|
|
354
298
|
* - `NodeHmrManager` watches the filesystem and triggers incremental esbuild
|
|
355
299
|
* rebuilds, notifying connected clients via the bridge.
|
|
356
|
-
* -
|
|
357
|
-
* router and response handlers when pages are added or removed.
|
|
300
|
+
* - Shared watcher bootstrapping listens for route-level file changes and
|
|
301
|
+
* refreshes the router and response handlers when pages are added or removed.
|
|
358
302
|
*
|
|
359
303
|
* WebSocket upgrade requests that do not target `/_hmr` are rejected with an
|
|
360
304
|
* immediate socket destroy to prevent unhandled upgrade leaks.
|
|
361
305
|
*/
|
|
362
|
-
async completeInitialization(
|
|
363
|
-
this.serverInstance =
|
|
306
|
+
async completeInitialization(server) {
|
|
307
|
+
this.serverInstance = server;
|
|
364
308
|
if (this.options?.watch) {
|
|
309
|
+
const { NodeHmrManager } = await import("./node-hmr-manager.js");
|
|
365
310
|
const { WebSocketServer } = await import("ws");
|
|
366
311
|
const wss = new WebSocketServer({ noServer: true });
|
|
367
312
|
this.bridge = new NodeClientBridge();
|
|
368
313
|
this.hmrManager = new NodeHmrManager({ appConfig: this.appConfig, bridge: this.bridge });
|
|
369
314
|
this.hmrManager.setEnabled(true);
|
|
370
315
|
await this.hmrManager.buildRuntime();
|
|
371
|
-
|
|
316
|
+
server.on("upgrade", (req, socket, head) => {
|
|
372
317
|
const url = new URL(req.url ?? "/", this.runtimeOrigin);
|
|
373
318
|
if (url.pathname === "/_hmr") {
|
|
374
319
|
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
@@ -380,23 +325,17 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
380
325
|
socket.destroy();
|
|
381
326
|
}
|
|
382
327
|
});
|
|
383
|
-
|
|
384
|
-
const hmrBuildPlugins = [...loaderPlugins, ...this.processorBuildPlugins];
|
|
385
|
-
this.hmrManager.setPlugins(hmrBuildPlugins);
|
|
386
|
-
for (const integration of this.appConfig.integrations) {
|
|
387
|
-
integration.setHmrManager(this.hmrManager);
|
|
388
|
-
}
|
|
328
|
+
bindSharedRuntimeHmrManager(this.appConfig, this.hmrManager);
|
|
389
329
|
this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
refreshRouterRoutesCallback:
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
},
|
|
330
|
+
await startSharedProjectWatching({
|
|
331
|
+
appConfig: this.appConfig,
|
|
332
|
+
refreshRouterRoutesCallback: this.createSharedWatchRefreshCallback({
|
|
333
|
+
staticRoutes: this.staticRoutes,
|
|
334
|
+
hmrManager: this.hmrManager
|
|
335
|
+
}),
|
|
396
336
|
hmrManager: this.hmrManager,
|
|
397
337
|
bridge: this.bridge
|
|
398
338
|
});
|
|
399
|
-
await watcher.createWatcherSubscription();
|
|
400
339
|
}
|
|
401
340
|
appLogger.debug("Node server adapter initialization completed", {
|
|
402
341
|
apiHandlers: this.apiHandlers.length,
|
|
@@ -407,7 +346,7 @@ class NodeServerAdapter extends SharedServerAdapter {
|
|
|
407
346
|
}
|
|
408
347
|
}
|
|
409
348
|
async function createNodeServerAdapter(params) {
|
|
410
|
-
const runtimeOrigin = params.runtimeOrigin ?? `http://${params.serveOptions.hostname ||
|
|
349
|
+
const runtimeOrigin = params.runtimeOrigin ?? `http://${params.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${params.serveOptions.port || DEFAULT_ECOPAGES_PORT}`;
|
|
411
350
|
const adapter = new NodeServerAdapter({
|
|
412
351
|
...params,
|
|
413
352
|
runtimeOrigin
|
|
@@ -1,24 +1,60 @@
|
|
|
1
1
|
import { type Server as NodeHttpServer } from 'node:http';
|
|
2
|
-
import type { EcoPagesAppConfig } from '../../internal-types.js';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
3
3
|
type NodeStaticContentServerOptions = {
|
|
4
4
|
hostname?: string;
|
|
5
5
|
port?: number;
|
|
6
6
|
};
|
|
7
|
+
/**
|
|
8
|
+
* Serves prebuilt static Ecopages output through Node's HTTP server.
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* This server is used by the Node preview/build path once the app has already
|
|
12
|
+
* emitted its static output. It intentionally stays small: path sanitization,
|
|
13
|
+
* content-type selection, optional gzip serving, and 404 handling.
|
|
14
|
+
*/
|
|
7
15
|
export declare class NodeStaticContentServer {
|
|
8
16
|
private readonly appConfig;
|
|
9
17
|
private readonly options;
|
|
10
18
|
private server;
|
|
19
|
+
/**
|
|
20
|
+
* Creates the Node static-content server for one built app output directory.
|
|
21
|
+
*/
|
|
11
22
|
constructor({ appConfig, options }: {
|
|
12
23
|
appConfig: EcoPagesAppConfig;
|
|
13
24
|
options?: NodeStaticContentServerOptions;
|
|
14
25
|
});
|
|
26
|
+
/**
|
|
27
|
+
* Returns whether the given content type should be served from a pre-gzipped
|
|
28
|
+
* companion file when available.
|
|
29
|
+
*/
|
|
15
30
|
private shouldServeGzip;
|
|
31
|
+
/**
|
|
32
|
+
* Normalizes a request pathname and rejects directory traversal attempts.
|
|
33
|
+
*/
|
|
16
34
|
private sanitizePath;
|
|
35
|
+
/**
|
|
36
|
+
* Writes one HTTP response with the provided headers and optional body.
|
|
37
|
+
*/
|
|
17
38
|
private sendResponse;
|
|
39
|
+
/**
|
|
40
|
+
* Serves the generated 404 page when present, or a plain-text fallback.
|
|
41
|
+
*/
|
|
18
42
|
private sendNotFoundPage;
|
|
43
|
+
/**
|
|
44
|
+
* Serves one concrete file path, honoring gzip and HEAD semantics.
|
|
45
|
+
*/
|
|
19
46
|
private serveFile;
|
|
47
|
+
/**
|
|
48
|
+
* Handles one incoming Node HTTP request against the built static output tree.
|
|
49
|
+
*/
|
|
20
50
|
private handleRequest;
|
|
51
|
+
/**
|
|
52
|
+
* Starts the static preview server.
|
|
53
|
+
*/
|
|
21
54
|
start(): Promise<NodeHttpServer>;
|
|
55
|
+
/**
|
|
56
|
+
* Stops the static preview server and optionally closes active connections.
|
|
57
|
+
*/
|
|
22
58
|
stop(force?: boolean): Promise<void>;
|
|
23
59
|
}
|
|
24
60
|
export {};
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
2
|
import { extname, join, normalize, sep } from "node:path";
|
|
3
|
-
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from "../../constants.js";
|
|
3
|
+
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from "../../config/constants.js";
|
|
4
4
|
import { fileSystem } from "@ecopages/file-system";
|
|
5
5
|
import { ServerUtils } from "../../utils/server-utils.module.js";
|
|
6
6
|
class NodeStaticContentServer {
|
|
7
7
|
appConfig;
|
|
8
8
|
options;
|
|
9
9
|
server = null;
|
|
10
|
+
/**
|
|
11
|
+
* Creates the Node static-content server for one built app output directory.
|
|
12
|
+
*/
|
|
10
13
|
constructor({ appConfig, options }) {
|
|
11
14
|
this.appConfig = appConfig;
|
|
12
15
|
this.options = {
|
|
@@ -14,9 +17,16 @@ class NodeStaticContentServer {
|
|
|
14
17
|
port: options?.port ?? DEFAULT_ECOPAGES_PORT
|
|
15
18
|
};
|
|
16
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns whether the given content type should be served from a pre-gzipped
|
|
22
|
+
* companion file when available.
|
|
23
|
+
*/
|
|
17
24
|
shouldServeGzip(contentType) {
|
|
18
25
|
return ["text/javascript", "text/css"].includes(contentType);
|
|
19
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Normalizes a request pathname and rejects directory traversal attempts.
|
|
29
|
+
*/
|
|
20
30
|
sanitizePath(pathname) {
|
|
21
31
|
const withoutLeadingSlash = pathname.replace(/^\/+/, "");
|
|
22
32
|
const normalizedPath = normalize(withoutLeadingSlash);
|
|
@@ -25,6 +35,9 @@ class NodeStaticContentServer {
|
|
|
25
35
|
}
|
|
26
36
|
return normalizedPath;
|
|
27
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Writes one HTTP response with the provided headers and optional body.
|
|
40
|
+
*/
|
|
28
41
|
sendResponse(res, status, headers, body) {
|
|
29
42
|
res.statusCode = status;
|
|
30
43
|
for (const [key, value] of Object.entries(headers)) {
|
|
@@ -36,6 +49,9 @@ class NodeStaticContentServer {
|
|
|
36
49
|
}
|
|
37
50
|
res.end(body);
|
|
38
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Serves the generated 404 page when present, or a plain-text fallback.
|
|
54
|
+
*/
|
|
39
55
|
sendNotFoundPage(req, res) {
|
|
40
56
|
const error404TemplatePath = join(this.appConfig.absolutePaths.distDir, "404.html");
|
|
41
57
|
const isHead = (req.method ?? "GET").toUpperCase() === "HEAD";
|
|
@@ -51,6 +67,9 @@ class NodeStaticContentServer {
|
|
|
51
67
|
const file = fileSystem.readFileAsBuffer(error404TemplatePath);
|
|
52
68
|
this.sendResponse(res, 404, { "Content-Type": "text/html" }, isHead ? void 0 : file);
|
|
53
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Serves one concrete file path, honoring gzip and HEAD semantics.
|
|
72
|
+
*/
|
|
54
73
|
serveFile(req, res, filePath, status = 200) {
|
|
55
74
|
const contentType = ServerUtils.getContentType(extname(filePath));
|
|
56
75
|
const acceptsGzip = req.headers["accept-encoding"]?.includes("gzip");
|
|
@@ -79,6 +98,9 @@ class NodeStaticContentServer {
|
|
|
79
98
|
const file = fileSystem.readFileAsBuffer(filePath);
|
|
80
99
|
this.sendResponse(res, status, { "Content-Type": contentType }, isHead ? void 0 : file);
|
|
81
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Handles one incoming Node HTTP request against the built static output tree.
|
|
103
|
+
*/
|
|
82
104
|
handleRequest(req, res) {
|
|
83
105
|
const method = (req.method ?? "GET").toUpperCase();
|
|
84
106
|
const isHead = method === "HEAD";
|
|
@@ -129,6 +151,9 @@ class NodeStaticContentServer {
|
|
|
129
151
|
}
|
|
130
152
|
this.sendNotFoundPage(req, res);
|
|
131
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Starts the static preview server.
|
|
156
|
+
*/
|
|
132
157
|
async start() {
|
|
133
158
|
if (this.server) {
|
|
134
159
|
return this.server;
|
|
@@ -141,6 +166,9 @@ class NodeStaticContentServer {
|
|
|
141
166
|
});
|
|
142
167
|
return this.server;
|
|
143
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Stops the static preview server and optionally closes active connections.
|
|
171
|
+
*/
|
|
144
172
|
async stop(force = true) {
|
|
145
173
|
if (!this.server) {
|
|
146
174
|
return;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../public-types.js';
|
|
1
|
+
import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../types/public-types.js';
|
|
2
2
|
import { AbstractApplicationAdapter, type ApplicationAdapterOptions, type RouteGroupDefinition, type RouteHandler } from '../abstract/application-adapter.js';
|
|
3
3
|
export declare abstract class SharedApplicationAdapter<TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions, TServer = any, TRequest extends Request = Request> extends AbstractApplicationAdapter<TOptions, TServer, TRequest> {
|
|
4
4
|
protected register<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, method: ApiHandler['method'], handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from '
|
|
1
|
+
import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from '../../types/public-types.js';
|
|
2
2
|
type UniversalContext = ApiHandlerContext<Request, unknown>;
|
|
3
3
|
type SchemaHandlerContext<TSchema extends RouteSchema | undefined, TContext extends UniversalContext> = TSchema extends RouteSchema ? TypedGroupHandlerContext<TSchema, TContext> : TContext;
|
|
4
4
|
export declare function defineApiHandler<TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema'> & {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '../../internal-types.js';
|
|
2
|
-
import type { StaticRoute } from '../../public-types.js';
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
2
|
+
import type { StaticRoute } from '../../types/public-types.js';
|
|
3
3
|
import type { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
|
|
4
4
|
export declare const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS: {
|
|
5
5
|
readonly missingIntegration: (routePath: string) => string;
|
|
@@ -3,6 +3,9 @@ const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
|
|
|
3
3
|
missingIntegration: (routePath) => `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
|
|
4
4
|
noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`
|
|
5
5
|
};
|
|
6
|
+
function getViewIntegrationName(view) {
|
|
7
|
+
return view.config?.integration ?? view.config?.__eco?.integration;
|
|
8
|
+
}
|
|
6
9
|
class ExplicitStaticRouteMatcher {
|
|
7
10
|
appConfig;
|
|
8
11
|
routeRendererFactory;
|
|
@@ -71,7 +74,7 @@ class ExplicitStaticRouteMatcher {
|
|
|
71
74
|
try {
|
|
72
75
|
const mod = await route.loader();
|
|
73
76
|
const view = mod.default;
|
|
74
|
-
const integrationName = view
|
|
77
|
+
const integrationName = getViewIntegrationName(view);
|
|
75
78
|
if (!integrationName) {
|
|
76
79
|
throw new Error(EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS.missingIntegration(route.path));
|
|
77
80
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Middleware, ApiHandlerContext, RequestLocals } from '../../public-types.js';
|
|
1
|
+
import type { Middleware, ApiHandlerContext, RequestLocals } from '../../types/public-types.js';
|
|
2
2
|
import type { PageCacheService } from '../../services/cache/page-cache-service.js';
|
|
3
3
|
export declare const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS: {
|
|
4
4
|
readonly CTX_RENDER_UNAVAILABLE: "[ecopages] ctx.render is not available in file-route middleware";
|
|
@@ -7,6 +7,7 @@ const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS = {
|
|
|
7
7
|
middlewareRequiresDynamic: (filePath) => `[ecopages] Page middleware requires cache: 'dynamic'. Page: ${filePath}`
|
|
8
8
|
};
|
|
9
9
|
class FileRouteMiddlewarePipeline {
|
|
10
|
+
cacheService;
|
|
10
11
|
constructor(cacheService) {
|
|
11
12
|
this.cacheService = cacheService;
|
|
12
13
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig, FileSystemServerOptions } from '../../internal-types.js';
|
|
2
|
-
import type { RouteRendererBody } from '../../public-types.js';
|
|
1
|
+
import type { EcoPagesAppConfig, FileSystemServerOptions } from '../../types/internal-types.js';
|
|
2
|
+
import type { RouteRendererBody } from '../../types/public-types.js';
|
|
3
3
|
import type { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
|
|
4
4
|
export declare class FileSystemServerResponseFactory {
|
|
5
5
|
private appConfig;
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import type { MatchResult } from '../../internal-types.js';
|
|
1
|
+
import type { EcoPagesAppConfig, MatchResult } from '../../types/internal-types.js';
|
|
2
2
|
import type { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
|
|
3
|
-
import type { FSRouter } from '../../router/fs-router.js';
|
|
3
|
+
import type { FSRouter } from '../../router/server/fs-router.js';
|
|
4
4
|
import type { PageCacheService } from '../../services/cache/page-cache-service.js';
|
|
5
5
|
import type { CacheStrategy } from '../../services/cache/cache.types.js';
|
|
6
6
|
import type { FileSystemServerResponseFactory } from './fs-server-response-factory.js';
|
|
7
|
-
export declare const FILE_SYSTEM_RESPONSE_MATCHER_ERRORS: {
|
|
8
|
-
readonly transpilePageModuleFailed: (details: string) => string;
|
|
9
|
-
readonly noTranspiledOutputForPageModule: (filePath: string) => string;
|
|
10
|
-
};
|
|
11
7
|
export interface FileSystemResponseMatcherOptions {
|
|
8
|
+
appConfig: EcoPagesAppConfig;
|
|
12
9
|
router: FSRouter;
|
|
13
10
|
routeRendererFactory: RouteRendererFactory;
|
|
14
11
|
fileSystemResponseFactory: FileSystemServerResponseFactory;
|
|
@@ -20,23 +17,21 @@ export interface FileSystemResponseMatcherOptions {
|
|
|
20
17
|
/**
|
|
21
18
|
* Matches file-system routes to rendered HTML responses.
|
|
22
19
|
*
|
|
23
|
-
* This class sits at the request-time boundary between router matches and the
|
|
24
20
|
* render pipeline. It coordinates page module inspection, request-local policy,
|
|
25
21
|
* renderer invocation, middleware execution, cache integration, and fallback
|
|
26
22
|
* error translation.
|
|
27
23
|
*/
|
|
28
24
|
export declare class FileSystemResponseMatcher {
|
|
25
|
+
private appConfig;
|
|
29
26
|
private router;
|
|
30
27
|
private routeRendererFactory;
|
|
31
28
|
private fileSystemResponseFactory;
|
|
32
|
-
private pageModuleImportService;
|
|
33
29
|
private pageRequestCacheCoordinator;
|
|
34
30
|
private fileRouteMiddlewarePipeline;
|
|
35
|
-
constructor({ router, routeRendererFactory, fileSystemResponseFactory, cacheService, defaultCacheStrategy, }: FileSystemResponseMatcherOptions);
|
|
31
|
+
constructor({ appConfig, router, routeRendererFactory, fileSystemResponseFactory, cacheService, defaultCacheStrategy, }: FileSystemResponseMatcherOptions);
|
|
36
32
|
/**
|
|
37
33
|
* Resolves unmatched paths either as static asset requests or as the custom
|
|
38
34
|
* not-found page.
|
|
39
|
-
*
|
|
40
35
|
* @param requestUrl Incoming pathname.
|
|
41
36
|
* @returns Static file response or rendered 404 response.
|
|
42
37
|
*/
|
|
@@ -57,8 +52,9 @@ export declare class FileSystemResponseMatcher {
|
|
|
57
52
|
* Loads the matched page module for request-time inspection.
|
|
58
53
|
*
|
|
59
54
|
* The matcher needs access to page-level metadata such as `cache` and
|
|
60
|
-
* `middleware` before full rendering starts, so it
|
|
61
|
-
*
|
|
55
|
+
* `middleware` before full rendering starts, so it asks the owning route
|
|
56
|
+
* renderer to load the page module. That preserves integration-specific page
|
|
57
|
+
* import setup for request-time inspection as well as for full rendering.
|
|
62
58
|
*
|
|
63
59
|
* @param filePath Absolute page module path.
|
|
64
60
|
* @returns Imported page module.
|
|
@@ -1,40 +1,35 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { appLogger } from "../../global/app-logger.js";
|
|
3
|
-
import {
|
|
4
|
-
import { PageRequestCacheCoordinator } from "../../services/page-request-cache-coordinator.service.js";
|
|
3
|
+
import { PageRequestCacheCoordinator } from "../../services/cache/page-request-cache-coordinator.service.js";
|
|
5
4
|
import { ServerUtils } from "../../utils/server-utils.module.js";
|
|
6
5
|
import { FileRouteMiddlewarePipeline } from "./file-route-middleware-pipeline.js";
|
|
7
6
|
import { LocalsAccessError } from "../../errors/locals-access-error.js";
|
|
8
7
|
import { isDevelopmentRuntime } from "../../utils/runtime.js";
|
|
9
|
-
const FILE_SYSTEM_RESPONSE_MATCHER_ERRORS = {
|
|
10
|
-
transpilePageModuleFailed: (details) => `Error transpiling page module: ${details}`,
|
|
11
|
-
noTranspiledOutputForPageModule: (filePath) => `No transpiled output generated for page module: ${filePath}`
|
|
12
|
-
};
|
|
13
8
|
class FileSystemResponseMatcher {
|
|
9
|
+
appConfig;
|
|
14
10
|
router;
|
|
15
11
|
routeRendererFactory;
|
|
16
12
|
fileSystemResponseFactory;
|
|
17
|
-
pageModuleImportService;
|
|
18
13
|
pageRequestCacheCoordinator;
|
|
19
14
|
fileRouteMiddlewarePipeline;
|
|
20
15
|
constructor({
|
|
16
|
+
appConfig,
|
|
21
17
|
router,
|
|
22
18
|
routeRendererFactory,
|
|
23
19
|
fileSystemResponseFactory,
|
|
24
20
|
cacheService = null,
|
|
25
21
|
defaultCacheStrategy = "static"
|
|
26
22
|
}) {
|
|
23
|
+
this.appConfig = appConfig;
|
|
27
24
|
this.router = router;
|
|
28
25
|
this.routeRendererFactory = routeRendererFactory;
|
|
29
26
|
this.fileSystemResponseFactory = fileSystemResponseFactory;
|
|
30
|
-
this.pageModuleImportService = new PageModuleImportService();
|
|
31
27
|
this.pageRequestCacheCoordinator = new PageRequestCacheCoordinator(cacheService, defaultCacheStrategy);
|
|
32
28
|
this.fileRouteMiddlewarePipeline = new FileRouteMiddlewarePipeline(cacheService);
|
|
33
29
|
}
|
|
34
30
|
/**
|
|
35
31
|
* Resolves unmatched paths either as static asset requests or as the custom
|
|
36
32
|
* not-found page.
|
|
37
|
-
*
|
|
38
33
|
* @param requestUrl Incoming pathname.
|
|
39
34
|
* @returns Static file response or rendered 404 response.
|
|
40
35
|
*/
|
|
@@ -127,19 +122,17 @@ class FileSystemResponseMatcher {
|
|
|
127
122
|
* Loads the matched page module for request-time inspection.
|
|
128
123
|
*
|
|
129
124
|
* The matcher needs access to page-level metadata such as `cache` and
|
|
130
|
-
* `middleware` before full rendering starts, so it
|
|
131
|
-
*
|
|
125
|
+
* `middleware` before full rendering starts, so it asks the owning route
|
|
126
|
+
* renderer to load the page module. That preserves integration-specific page
|
|
127
|
+
* import setup for request-time inspection as well as for full rendering.
|
|
132
128
|
*
|
|
133
129
|
* @param filePath Absolute page module path.
|
|
134
130
|
* @returns Imported page module.
|
|
135
131
|
*/
|
|
136
132
|
async importPageModule(filePath) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
outdir: path.join(this.router.assetPrefix, ".server-modules-meta"),
|
|
141
|
-
transpileErrorMessage: FILE_SYSTEM_RESPONSE_MATCHER_ERRORS.transpilePageModuleFailed,
|
|
142
|
-
noOutputMessage: FILE_SYSTEM_RESPONSE_MATCHER_ERRORS.noTranspiledOutputForPageModule
|
|
133
|
+
const routeRenderer = this.routeRendererFactory.createRenderer(filePath);
|
|
134
|
+
return routeRenderer.loadPageModule(filePath, {
|
|
135
|
+
cacheScope: "request-metadata"
|
|
143
136
|
});
|
|
144
137
|
}
|
|
145
138
|
/**
|
|
@@ -150,6 +143,5 @@ class FileSystemResponseMatcher {
|
|
|
150
143
|
}
|
|
151
144
|
}
|
|
152
145
|
export {
|
|
153
|
-
FILE_SYSTEM_RESPONSE_MATCHER_ERRORS,
|
|
154
146
|
FileSystemResponseMatcher
|
|
155
147
|
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared runtime state used while registering HMR-owned entrypoints.
|
|
3
|
+
*/
|
|
4
|
+
export interface HmrEntrypointRegistrarOptions {
|
|
5
|
+
/** Absolute source directory used to derive the emitted HMR path. */
|
|
6
|
+
srcDir: string;
|
|
7
|
+
/** Absolute distribution directory where HMR outputs are written. */
|
|
8
|
+
distDir: string;
|
|
9
|
+
/** In-flight registrations keyed by normalized absolute entrypoint path. */
|
|
10
|
+
entrypointRegistrations: Map<string, Promise<string>>;
|
|
11
|
+
/** Stable entrypoint-to-output mapping retained once an entrypoint is registered. */
|
|
12
|
+
watchedFiles: Map<string, string>;
|
|
13
|
+
/** Runtime-specific cleanup invoked when an entrypoint registration fails. */
|
|
14
|
+
clearFailedRegistration?: (entrypointPath: string) => void;
|
|
15
|
+
/** Development-only guardrail for integrations that never finish producing output. */
|
|
16
|
+
registrationTimeoutMs: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Runtime-specific hooks required to materialize a single HMR entrypoint.
|
|
20
|
+
*/
|
|
21
|
+
export interface HmrEntrypointRegistrationOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Emits the browser-consumable HMR artifact for an entrypoint.
|
|
24
|
+
*/
|
|
25
|
+
emit(entrypointPath: string, outputPath: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Creates the runtime-specific error raised when the emit hook completes without producing output.
|
|
28
|
+
*/
|
|
29
|
+
getMissingOutputError(entrypointPath: string, outputPath: string): Error;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Coordinates the shared HMR entrypoint registration lifecycle for both Node and Bun managers.
|
|
33
|
+
*
|
|
34
|
+
* The registrar owns the cross-runtime policy: normalize entrypoint identities, dedupe concurrent
|
|
35
|
+
* registrations, derive the emitted `_hmr` output path, clear stale output before rebuilding, and
|
|
36
|
+
* apply the development timeout that prevents unresolved registrations from hanging navigation.
|
|
37
|
+
* Runtime-specific managers remain responsible for the actual emit step and any cleanup outside
|
|
38
|
+
* this shared registration flow.
|
|
39
|
+
*/
|
|
40
|
+
export declare class HmrEntrypointRegistrar {
|
|
41
|
+
private readonly options;
|
|
42
|
+
constructor(options: HmrEntrypointRegistrarOptions);
|
|
43
|
+
/**
|
|
44
|
+
* Registers a single source entrypoint and returns the browser URL for its emitted HMR module.
|
|
45
|
+
*
|
|
46
|
+
* Concurrent requests for the same normalized entrypoint share the same in-flight promise so the
|
|
47
|
+
* integration only builds once per registration cycle.
|
|
48
|
+
*/
|
|
49
|
+
registerEntrypoint(entrypointPath: string, registrationOptions: HmrEntrypointRegistrationOptions): Promise<string>;
|
|
50
|
+
private registerEntrypointInternal;
|
|
51
|
+
private awaitEntrypointRegistration;
|
|
52
|
+
private getEntrypointOutput;
|
|
53
|
+
private removeStaleEntrypointOutput;
|
|
54
|
+
private encodeDynamicSegments;
|
|
55
|
+
}
|