@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.20
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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
3
|
+
import { appLogger } from "../../global/app-logger.js";
|
|
4
|
+
import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
|
|
5
|
+
class HmrEntrypointRegistrar {
|
|
6
|
+
options;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Registers a single source entrypoint and returns the browser URL for its emitted HMR module.
|
|
12
|
+
*
|
|
13
|
+
* Concurrent requests for the same normalized entrypoint share the same in-flight promise so the
|
|
14
|
+
* integration only builds once per registration cycle.
|
|
15
|
+
*/
|
|
16
|
+
async registerEntrypoint(entrypointPath, registrationOptions) {
|
|
17
|
+
const normalizedEntrypoint = path.resolve(entrypointPath);
|
|
18
|
+
const existingRegistration = this.options.entrypointRegistrations.get(normalizedEntrypoint);
|
|
19
|
+
if (existingRegistration) {
|
|
20
|
+
return await this.awaitEntrypointRegistration(existingRegistration, normalizedEntrypoint);
|
|
21
|
+
}
|
|
22
|
+
const registration = this.registerEntrypointInternal(normalizedEntrypoint, registrationOptions);
|
|
23
|
+
this.options.entrypointRegistrations.set(normalizedEntrypoint, registration);
|
|
24
|
+
try {
|
|
25
|
+
return await this.awaitEntrypointRegistration(registration, normalizedEntrypoint);
|
|
26
|
+
} catch (error) {
|
|
27
|
+
this.options.clearFailedRegistration?.(normalizedEntrypoint);
|
|
28
|
+
throw error;
|
|
29
|
+
} finally {
|
|
30
|
+
this.options.entrypointRegistrations.delete(normalizedEntrypoint);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async registerEntrypointInternal(entrypointPath, registrationOptions) {
|
|
34
|
+
if (this.options.watchedFiles.has(entrypointPath)) {
|
|
35
|
+
return this.options.watchedFiles.get(entrypointPath);
|
|
36
|
+
}
|
|
37
|
+
const { outputPath, outputUrl } = this.getEntrypointOutput(entrypointPath);
|
|
38
|
+
this.options.watchedFiles.set(entrypointPath, outputUrl);
|
|
39
|
+
this.removeStaleEntrypointOutput(outputPath);
|
|
40
|
+
await registrationOptions.emit(entrypointPath, outputPath);
|
|
41
|
+
if (!fileSystem.exists(outputPath)) {
|
|
42
|
+
throw registrationOptions.getMissingOutputError(entrypointPath, outputPath);
|
|
43
|
+
}
|
|
44
|
+
return outputUrl;
|
|
45
|
+
}
|
|
46
|
+
async awaitEntrypointRegistration(registration, entrypointPath) {
|
|
47
|
+
if (process.env.NODE_ENV !== "development") {
|
|
48
|
+
return await registration;
|
|
49
|
+
}
|
|
50
|
+
return await Promise.race([
|
|
51
|
+
registration,
|
|
52
|
+
new Promise((_, reject) => {
|
|
53
|
+
setTimeout(() => {
|
|
54
|
+
reject(new Error(`[HMR] Timed out registering entrypoint: ${entrypointPath}`));
|
|
55
|
+
}, this.options.registrationTimeoutMs);
|
|
56
|
+
})
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
getEntrypointOutput(entrypointPath) {
|
|
60
|
+
const relativePath = path.relative(this.options.srcDir, entrypointPath);
|
|
61
|
+
const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
|
|
62
|
+
const encodedPathJs = this.encodeDynamicSegments(relativePathJs);
|
|
63
|
+
const urlPath = encodedPathJs.split(path.sep).join("/");
|
|
64
|
+
return {
|
|
65
|
+
outputUrl: `/${path.join(RESOLVED_ASSETS_DIR, "_hmr", urlPath)}`,
|
|
66
|
+
outputPath: path.join(this.options.distDir, urlPath)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
removeStaleEntrypointOutput(outputPath) {
|
|
70
|
+
if (!fileSystem.exists(outputPath)) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
fileSystem.remove(outputPath);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
appLogger.warn(
|
|
77
|
+
`[HMR] Failed to remove stale entrypoint output ${outputPath}: ${error instanceof Error ? error.message : String(error)}`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
encodeDynamicSegments(filepath) {
|
|
82
|
+
return filepath.replace(/\[([^\]]+)\]/g, "_$1_");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
HmrEntrypointRegistrar
|
|
87
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IHmrManager } from '../../types/public-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns whether a response is HTML and therefore eligible for development HMR
|
|
4
|
+
* runtime injection.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isHtmlResponse(response: Response): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Returns whether HTML responses should receive the HMR runtime bootstrap.
|
|
9
|
+
*
|
|
10
|
+
* This is shared because filesystem page responses and adapter-level HTML
|
|
11
|
+
* responses flow through different layers, but both need identical injection
|
|
12
|
+
* behavior in watch mode.
|
|
13
|
+
*/
|
|
14
|
+
export declare function shouldInjectHmrHtmlResponse(watch: boolean, hmrManager?: Pick<IHmrManager, 'isEnabled'>): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Injects the development HMR runtime script into an HTML response if it is not
|
|
17
|
+
* already present.
|
|
18
|
+
*
|
|
19
|
+
* The check is intentionally idempotent because an HTML response can pass
|
|
20
|
+
* through more than one development-layer wrapper before reaching the client.
|
|
21
|
+
*/
|
|
22
|
+
export declare function injectHmrRuntimeIntoHtmlResponse(response: Response): Promise<Response>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const HMR_RUNTIME_IMPORT = "import '/_hmr_runtime.js'";
|
|
2
|
+
const HMR_RUNTIME_SCRIPT = `<script type="module">${HMR_RUNTIME_IMPORT};<\/script>`;
|
|
3
|
+
function isHtmlResponse(response) {
|
|
4
|
+
const contentType = response.headers.get("Content-Type");
|
|
5
|
+
return contentType !== null && contentType.startsWith("text/html");
|
|
6
|
+
}
|
|
7
|
+
function shouldInjectHmrHtmlResponse(watch, hmrManager) {
|
|
8
|
+
return watch && hmrManager?.isEnabled() === true;
|
|
9
|
+
}
|
|
10
|
+
async function injectHmrRuntimeIntoHtmlResponse(response) {
|
|
11
|
+
const html = await response.text();
|
|
12
|
+
if (html.includes(HMR_RUNTIME_IMPORT)) {
|
|
13
|
+
return new Response(html, {
|
|
14
|
+
status: response.status,
|
|
15
|
+
statusText: response.statusText,
|
|
16
|
+
headers: response.headers
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const updatedHtml = html.replace(/<\/html>/i, `${HMR_RUNTIME_SCRIPT}</html>`);
|
|
20
|
+
const headers = new Headers(response.headers);
|
|
21
|
+
headers.delete("Content-Length");
|
|
22
|
+
return new Response(updatedHtml, {
|
|
23
|
+
status: response.status,
|
|
24
|
+
statusText: response.statusText,
|
|
25
|
+
headers
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
injectHmrRuntimeIntoHtmlResponse,
|
|
30
|
+
isHtmlResponse,
|
|
31
|
+
shouldInjectHmrHtmlResponse
|
|
32
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { RenderContext } from '../../public-types.js';
|
|
1
|
+
import type { RenderContext } from '../../types/public-types.js';
|
|
2
2
|
import type { IntegrationPlugin } from '../../plugins/integration-plugin.js';
|
|
3
3
|
export interface CreateRenderContextOptions {
|
|
4
4
|
integrations: IntegrationPlugin[];
|
|
5
|
+
rendererModules?: unknown;
|
|
5
6
|
}
|
|
6
7
|
/**
|
|
7
8
|
* Creates a render context for route handlers.
|
|
@@ -15,12 +15,14 @@ function createRenderContext(options) {
|
|
|
15
15
|
);
|
|
16
16
|
const integration = integrations.find((i) => i.name === integrationName);
|
|
17
17
|
invariant(!!integration, `No integration found for: ${integrationName}`);
|
|
18
|
-
return integration.initializeRenderer(
|
|
18
|
+
return integration.initializeRenderer({
|
|
19
|
+
rendererModules: options.rendererModules
|
|
20
|
+
});
|
|
19
21
|
};
|
|
20
|
-
|
|
22
|
+
const renderContext = {
|
|
21
23
|
async render(view, props, renderOptions) {
|
|
22
24
|
const locals = this?.locals;
|
|
23
|
-
const mergedProps = mergePropsWithLocals(props, locals);
|
|
25
|
+
const mergedProps = mergePropsWithLocals(props ?? {}, locals);
|
|
24
26
|
const renderer = getRendererForView(view);
|
|
25
27
|
const ctx = {
|
|
26
28
|
partial: false,
|
|
@@ -63,6 +65,7 @@ function createRenderContext(options) {
|
|
|
63
65
|
});
|
|
64
66
|
}
|
|
65
67
|
};
|
|
68
|
+
return renderContext;
|
|
66
69
|
}
|
|
67
70
|
export {
|
|
68
71
|
createRenderContext
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type BuildExecutor } from '../../build/build-adapter.js';
|
|
2
|
+
import type { EcoBuildPlugin } from '../../build/build-types.js';
|
|
3
|
+
import type { EcoPagesAppConfig, IClientBridge, IHmrManager } from '../../types/internal-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Installs and returns the app-owned runtime build executor used by adapter
|
|
6
|
+
* startup and follow-up runtime work.
|
|
7
|
+
*/
|
|
8
|
+
export declare function installSharedRuntimeBuildExecutor(appConfig: EcoPagesAppConfig, options: {
|
|
9
|
+
development: boolean;
|
|
10
|
+
}): BuildExecutor;
|
|
11
|
+
/**
|
|
12
|
+
* Copies app public assets into dist and ensures the resolved assets directory
|
|
13
|
+
* exists before request handling begins.
|
|
14
|
+
*/
|
|
15
|
+
export declare function prepareSharedRuntimePublicDir(appConfig: EcoPagesAppConfig): void;
|
|
16
|
+
/**
|
|
17
|
+
* Runs runtime plugin setup against app-owned config/runtime state and optional
|
|
18
|
+
* host plugin registration hooks.
|
|
19
|
+
*/
|
|
20
|
+
export declare function initializeSharedRuntimePlugins(options: {
|
|
21
|
+
appConfig: EcoPagesAppConfig;
|
|
22
|
+
runtimeOrigin: string;
|
|
23
|
+
hmrManager?: IHmrManager;
|
|
24
|
+
onRuntimePlugin?: (plugin: unknown) => void;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Starts shared project watching for runtime adapters.
|
|
28
|
+
*/
|
|
29
|
+
export declare function startSharedProjectWatching(options: {
|
|
30
|
+
appConfig: EcoPagesAppConfig;
|
|
31
|
+
refreshRouterRoutesCallback: () => Promise<void>;
|
|
32
|
+
hmrManager: IHmrManager;
|
|
33
|
+
bridge: IClientBridge;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Binds a runtime HMR manager to app-owned plugin and integration state.
|
|
37
|
+
*/
|
|
38
|
+
export declare function bindSharedRuntimeHmrManager(appConfig: EcoPagesAppConfig, hmrManager: IHmrManager): EcoBuildPlugin[];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
3
|
+
import { getAppBrowserBuildPlugins, setupAppRuntimePlugins } from "../../build/build-adapter.js";
|
|
4
|
+
import { installAppRuntimeBuildExecutor } from "../../build/runtime-build-executor.js";
|
|
5
|
+
import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
|
|
6
|
+
import { ProjectWatcher } from "../../watchers/project-watcher.js";
|
|
7
|
+
function installSharedRuntimeBuildExecutor(appConfig, options) {
|
|
8
|
+
return installAppRuntimeBuildExecutor(appConfig, options);
|
|
9
|
+
}
|
|
10
|
+
function prepareSharedRuntimePublicDir(appConfig) {
|
|
11
|
+
const srcPublicDir = path.join(appConfig.rootDir, appConfig.srcDir, appConfig.publicDir);
|
|
12
|
+
if (fileSystem.exists(srcPublicDir)) {
|
|
13
|
+
fileSystem.copyDir(srcPublicDir, path.join(appConfig.rootDir, appConfig.distDir));
|
|
14
|
+
}
|
|
15
|
+
fileSystem.ensureDir(path.join(appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
|
|
16
|
+
}
|
|
17
|
+
async function initializeSharedRuntimePlugins(options) {
|
|
18
|
+
await setupAppRuntimePlugins(options);
|
|
19
|
+
}
|
|
20
|
+
async function startSharedProjectWatching(options) {
|
|
21
|
+
const watcher = new ProjectWatcher({
|
|
22
|
+
config: options.appConfig,
|
|
23
|
+
refreshRouterRoutesCallback: options.refreshRouterRoutesCallback,
|
|
24
|
+
hmrManager: options.hmrManager,
|
|
25
|
+
bridge: options.bridge
|
|
26
|
+
});
|
|
27
|
+
await watcher.createWatcherSubscription();
|
|
28
|
+
}
|
|
29
|
+
function bindSharedRuntimeHmrManager(appConfig, hmrManager) {
|
|
30
|
+
const browserBuildPlugins = getAppBrowserBuildPlugins(appConfig);
|
|
31
|
+
hmrManager.setPlugins(browserBuildPlugins);
|
|
32
|
+
for (const integration of appConfig.integrations) {
|
|
33
|
+
integration.setHmrManager(hmrManager);
|
|
34
|
+
}
|
|
35
|
+
return browserBuildPlugins;
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
bindSharedRuntimeHmrManager,
|
|
39
|
+
initializeSharedRuntimePlugins,
|
|
40
|
+
installSharedRuntimeBuildExecutor,
|
|
41
|
+
prepareSharedRuntimePublicDir,
|
|
42
|
+
startSharedProjectWatching
|
|
43
|
+
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { AbstractServerAdapter } from '../abstract/server-adapter.js';
|
|
2
2
|
import type { ServerAdapterOptions, ServerAdapterResult } from '../abstract/server-adapter.js';
|
|
3
3
|
import { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
|
|
4
|
-
import { FSRouter } from '../../router/fs-router.js';
|
|
5
|
-
import { SchemaValidationService } from '../../services/schema-validation-service.js';
|
|
4
|
+
import { FSRouter } from '../../router/server/fs-router.js';
|
|
5
|
+
import { SchemaValidationService } from '../../services/validation/schema-validation-service.js';
|
|
6
6
|
import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
|
|
7
7
|
import { ServerStaticBuilder } from './server-static-builder.js';
|
|
8
8
|
import { FileSystemResponseMatcher } from './fs-server-response-matcher.js';
|
|
9
9
|
import { ServerRouteHandler } from './server-route-handler.js';
|
|
10
|
-
import type { ApiHandler, CacheInvalidator, ErrorHandler, RenderContext, StaticRoute } from '../../public-types.js';
|
|
10
|
+
import type { ApiHandler, CacheInvalidator, ErrorHandler, RenderContext, StaticRoute } from '../../types/public-types.js';
|
|
11
11
|
export declare abstract class SharedServerAdapter<TOptions extends ServerAdapterOptions, TResult extends ServerAdapterResult> extends AbstractServerAdapter<TOptions, TResult> {
|
|
12
12
|
protected router: FSRouter;
|
|
13
13
|
protected fileSystemResponseMatcher: FileSystemResponseMatcher;
|
|
@@ -16,6 +16,16 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
|
|
|
16
16
|
protected staticSiteGenerator: StaticSiteGenerator;
|
|
17
17
|
protected staticBuilder: ServerStaticBuilder;
|
|
18
18
|
protected readonly schemaValidator: SchemaValidationService;
|
|
19
|
+
protected initializeSharedRouteHandling(options: {
|
|
20
|
+
staticRoutes: StaticRoute[];
|
|
21
|
+
hmrManager?: any;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
protected createSharedWatchRefreshCallback(options: {
|
|
24
|
+
staticRoutes: StaticRoute[];
|
|
25
|
+
hmrManager?: any;
|
|
26
|
+
onRoutesReady?: () => Promise<void> | void;
|
|
27
|
+
onError?: (error: Error) => Promise<void> | void;
|
|
28
|
+
}): () => Promise<void>;
|
|
19
29
|
/**
|
|
20
30
|
* Scans the filesystem and dynamically constructs the universal router map.
|
|
21
31
|
*
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { AbstractServerAdapter } from "../abstract/server-adapter.js";
|
|
3
3
|
import { RouteRendererFactory } from "../../route-renderer/route-renderer.js";
|
|
4
|
-
import { FSRouter } from "../../router/fs-router.js";
|
|
5
|
-
import { FSRouterScanner } from "../../router/fs-router-scanner.js";
|
|
4
|
+
import { FSRouter } from "../../router/server/fs-router.js";
|
|
5
|
+
import { FSRouterScanner } from "../../router/server/fs-router-scanner.js";
|
|
6
6
|
import { MemoryCacheStore } from "../../services/cache/memory-cache-store.js";
|
|
7
7
|
import { PageCacheService } from "../../services/cache/page-cache-service.js";
|
|
8
|
-
import { SchemaValidationService } from "../../services/schema-validation-service.js";
|
|
8
|
+
import { SchemaValidationService } from "../../services/validation/schema-validation-service.js";
|
|
9
9
|
import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
|
|
10
10
|
import { ServerStaticBuilder } from "./server-static-builder.js";
|
|
11
11
|
import { ExplicitStaticRouteMatcher } from "./explicit-static-route-matcher.js";
|
|
@@ -17,6 +17,7 @@ import { createRequire } from "../../utils/locals-utils.js";
|
|
|
17
17
|
import { HttpError } from "../../errors/http-error.js";
|
|
18
18
|
import { ApiResponseBuilder } from "./api-response.js";
|
|
19
19
|
import { appLogger } from "../../global/app-logger.js";
|
|
20
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
20
21
|
class SharedServerAdapter extends AbstractServerAdapter {
|
|
21
22
|
router;
|
|
22
23
|
fileSystemResponseMatcher;
|
|
@@ -25,6 +26,29 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
25
26
|
staticSiteGenerator;
|
|
26
27
|
staticBuilder;
|
|
27
28
|
schemaValidator = new SchemaValidationService();
|
|
29
|
+
async initializeSharedRouteHandling(options) {
|
|
30
|
+
await this.initSharedRouter();
|
|
31
|
+
this.configureSharedResponseHandlers(options.staticRoutes, options.hmrManager);
|
|
32
|
+
}
|
|
33
|
+
createSharedWatchRefreshCallback(options) {
|
|
34
|
+
return async () => {
|
|
35
|
+
try {
|
|
36
|
+
await this.initializeSharedRouteHandling({
|
|
37
|
+
staticRoutes: options.staticRoutes,
|
|
38
|
+
hmrManager: options.hmrManager
|
|
39
|
+
});
|
|
40
|
+
if (options.onRoutesReady) {
|
|
41
|
+
await options.onRoutesReady();
|
|
42
|
+
}
|
|
43
|
+
} catch (error) {
|
|
44
|
+
if (options.onError) {
|
|
45
|
+
await options.onError(error instanceof Error ? error : new Error(String(error)));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
28
52
|
/**
|
|
29
53
|
* Scans the filesystem and dynamically constructs the universal router map.
|
|
30
54
|
*
|
|
@@ -67,6 +91,7 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
67
91
|
configureSharedResponseHandlers(staticRoutes, hmrManager) {
|
|
68
92
|
this.routeRendererFactory = new RouteRendererFactory({
|
|
69
93
|
appConfig: this.appConfig,
|
|
94
|
+
rendererModules: this.appConfig.runtime?.rendererModuleContext,
|
|
70
95
|
runtimeOrigin: this.runtimeOrigin
|
|
71
96
|
});
|
|
72
97
|
const fileSystemResponseFactory = new FileSystemServerResponseFactory({
|
|
@@ -84,6 +109,7 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
84
109
|
cacheService = new PageCacheService({ store, enabled: true });
|
|
85
110
|
}
|
|
86
111
|
this.fileSystemResponseMatcher = new FileSystemResponseMatcher({
|
|
112
|
+
appConfig: this.appConfig,
|
|
87
113
|
router: this.router,
|
|
88
114
|
routeRendererFactory: this.routeRendererFactory,
|
|
89
115
|
fileSystemResponseFactory,
|
|
@@ -107,7 +133,10 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
107
133
|
return this.fileSystemResponseMatcher?.getCacheService() ?? null;
|
|
108
134
|
}
|
|
109
135
|
getRenderContext() {
|
|
110
|
-
return createRenderContext({
|
|
136
|
+
return createRenderContext({
|
|
137
|
+
integrations: this.appConfig.integrations,
|
|
138
|
+
rendererModules: this.appConfig.runtime?.rendererModuleContext
|
|
139
|
+
});
|
|
111
140
|
}
|
|
112
141
|
/**
|
|
113
142
|
* Executes an Application Programming Interface (API) handler in an environment-agnostic manner.
|
|
@@ -328,13 +357,21 @@ class SharedServerAdapter extends AbstractServerAdapter {
|
|
|
328
357
|
const url = new URL(request.url);
|
|
329
358
|
if (url.pathname === "/_hmr_runtime.js" && context.hmrManager) {
|
|
330
359
|
const runtimePath = context.hmrManager.getRuntimePath();
|
|
331
|
-
const fileSystem = (await import("@ecopages/file-system")).fileSystem;
|
|
332
360
|
if (fileSystem.exists(runtimePath)) {
|
|
333
361
|
return new Response(fileSystem.readFileAsBuffer(runtimePath), {
|
|
334
362
|
headers: { "Content-Type": "application/javascript" }
|
|
335
363
|
});
|
|
336
364
|
}
|
|
337
365
|
}
|
|
366
|
+
if (url.pathname.startsWith("/assets/_hmr/") && context.hmrManager) {
|
|
367
|
+
const relativePath = url.pathname.slice("/assets/_hmr/".length);
|
|
368
|
+
const assetPath = path.join(context.hmrManager.getDistDir(), relativePath);
|
|
369
|
+
if (fileSystem.exists(assetPath)) {
|
|
370
|
+
return new Response(fileSystem.readFileAsBuffer(assetPath), {
|
|
371
|
+
headers: { "Content-Type": "application/javascript" }
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
338
375
|
const apiMatch = this.matchApiHandler(request, context.apiHandlers);
|
|
339
376
|
if (apiMatch) {
|
|
340
377
|
return this.executeApiHandler(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { IHmrManager } from '../../public-types';
|
|
2
|
-
import type { FSRouter } from '../../router/fs-router';
|
|
3
|
-
import type { ExplicitStaticRouteMatcher } from './explicit-static-route-matcher';
|
|
4
|
-
import type { FileSystemResponseMatcher } from './fs-server-response-matcher';
|
|
1
|
+
import type { IHmrManager } from '../../types/public-types.js';
|
|
2
|
+
import type { FSRouter } from '../../router/server/fs-router.js';
|
|
3
|
+
import type { ExplicitStaticRouteMatcher } from './explicit-static-route-matcher.js';
|
|
4
|
+
import type { FileSystemResponseMatcher } from './fs-server-response-matcher.js';
|
|
5
5
|
/**
|
|
6
6
|
* Configuration parameters for ServerRouteHandler.
|
|
7
7
|
*/
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { appLogger } from "../../global/app-logger";
|
|
2
|
-
import { HttpError } from "../../errors/http-error";
|
|
1
|
+
import { appLogger } from "../../global/app-logger.js";
|
|
2
|
+
import { HttpError } from "../../errors/http-error.js";
|
|
3
|
+
import { injectHmrRuntimeIntoHtmlResponse, isHtmlResponse, shouldInjectHmrHtmlResponse } from "./hmr-html-response.js";
|
|
3
4
|
class ServerRouteHandler {
|
|
4
5
|
router;
|
|
5
6
|
fileSystemResponseMatcher;
|
|
@@ -30,7 +31,7 @@ class ServerRouteHandler {
|
|
|
30
31
|
* @returns true if in watch mode and HMR manager is enabled
|
|
31
32
|
*/
|
|
32
33
|
shouldInjectHmrScript() {
|
|
33
|
-
return this.watch
|
|
34
|
+
return shouldInjectHmrHtmlResponse(this.watch, this.hmrManager);
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* Checks if a response contains HTML content.
|
|
@@ -39,8 +40,7 @@ class ServerRouteHandler {
|
|
|
39
40
|
* @returns true if Content-Type header starts with 'text/html'
|
|
40
41
|
*/
|
|
41
42
|
isHtmlResponse(response) {
|
|
42
|
-
|
|
43
|
-
return contentType !== null && contentType.startsWith("text/html");
|
|
43
|
+
return isHtmlResponse(response);
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* Handles HTTP requests from the router adapter.
|
|
@@ -75,16 +75,7 @@ class ServerRouteHandler {
|
|
|
75
75
|
*/
|
|
76
76
|
async maybeInjectHmrScript(response) {
|
|
77
77
|
if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
|
|
78
|
-
|
|
79
|
-
const hmrScript = `<script type="module">import '/_hmr_runtime.js';<\/script>`;
|
|
80
|
-
const updatedHtml = html.replace(/<\/html>/i, `${hmrScript}</html>`);
|
|
81
|
-
const headers = new Headers(response.headers);
|
|
82
|
-
headers.delete("Content-Length");
|
|
83
|
-
return new Response(updatedHtml, {
|
|
84
|
-
status: response.status,
|
|
85
|
-
statusText: response.statusText,
|
|
86
|
-
headers
|
|
87
|
-
});
|
|
78
|
+
return injectHmrRuntimeIntoHtmlResponse(response);
|
|
88
79
|
}
|
|
89
80
|
return response;
|
|
90
81
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from '../../internal-types';
|
|
2
|
-
import type { StaticRoute } from '../../public-types';
|
|
3
|
-
import type { RouteRendererFactory } from '../../route-renderer/route-renderer';
|
|
4
|
-
import type { FSRouter } from '../../router/fs-router';
|
|
5
|
-
import type { StaticSiteGenerator } from '../../static-site-generator/static-site-generator';
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
2
|
+
import type { ApiHandler, StaticRoute } from '../../types/public-types.js';
|
|
3
|
+
import type { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
|
|
4
|
+
import type { FSRouter } from '../../router/server/fs-router.js';
|
|
5
|
+
import type { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
|
|
6
6
|
export interface StaticBuildOptions {
|
|
7
7
|
preview?: boolean;
|
|
8
8
|
}
|
|
@@ -14,6 +14,32 @@ export interface ServerStaticBuilderParams {
|
|
|
14
14
|
appConfig: EcoPagesAppConfig;
|
|
15
15
|
staticSiteGenerator: StaticSiteGenerator;
|
|
16
16
|
serveOptions: ServeOptions;
|
|
17
|
+
apiHandlers?: ApiHandler[];
|
|
18
|
+
logger?: ServerStaticBuilderLogger;
|
|
19
|
+
previewServerFactory?: ServerStaticPreviewServerFactory;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Minimal logger dependency used by the static builder.
|
|
23
|
+
*/
|
|
24
|
+
export interface ServerStaticBuilderLogger {
|
|
25
|
+
warn(message: string, detail?: string): unknown;
|
|
26
|
+
info(message: string): unknown;
|
|
27
|
+
error(message: string): unknown;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Preview server factory dependency used when static preview mode is enabled.
|
|
31
|
+
*/
|
|
32
|
+
export interface ServerStaticPreviewServerFactory {
|
|
33
|
+
createServer(args: {
|
|
34
|
+
appConfig: EcoPagesAppConfig;
|
|
35
|
+
options: {
|
|
36
|
+
port: number;
|
|
37
|
+
};
|
|
38
|
+
}): {
|
|
39
|
+
server?: {
|
|
40
|
+
port?: number;
|
|
41
|
+
} | null;
|
|
42
|
+
};
|
|
17
43
|
}
|
|
18
44
|
/**
|
|
19
45
|
* Handles static site generation and previews.
|
|
@@ -22,7 +48,13 @@ export declare class ServerStaticBuilder {
|
|
|
22
48
|
private readonly appConfig;
|
|
23
49
|
private readonly staticSiteGenerator;
|
|
24
50
|
private readonly serveOptions;
|
|
25
|
-
|
|
51
|
+
private readonly apiHandlers;
|
|
52
|
+
private readonly logger;
|
|
53
|
+
private readonly previewServerFactory;
|
|
54
|
+
constructor({ appConfig, staticSiteGenerator, serveOptions, apiHandlers, logger, previewServerFactory, }: ServerStaticBuilderParams);
|
|
55
|
+
private warnApiHandlersUnavailableInStaticMode;
|
|
56
|
+
private prepareExportDirectory;
|
|
57
|
+
private refreshRuntimeAssets;
|
|
26
58
|
/**
|
|
27
59
|
* Generates a static build of the site for deployment.
|
|
28
60
|
* @param options.preview - If true, starts a preview server after build
|
|
@@ -1,13 +1,64 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
3
|
+
import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
|
|
4
|
+
import { StaticContentServer } from "../../dev/sc-server.js";
|
|
5
|
+
import { appLogger } from "../../global/app-logger.js";
|
|
3
6
|
class ServerStaticBuilder {
|
|
4
7
|
appConfig;
|
|
5
8
|
staticSiteGenerator;
|
|
6
9
|
serveOptions;
|
|
7
|
-
|
|
10
|
+
apiHandlers;
|
|
11
|
+
logger;
|
|
12
|
+
previewServerFactory;
|
|
13
|
+
constructor({
|
|
14
|
+
appConfig,
|
|
15
|
+
staticSiteGenerator,
|
|
16
|
+
serveOptions,
|
|
17
|
+
apiHandlers,
|
|
18
|
+
logger,
|
|
19
|
+
previewServerFactory
|
|
20
|
+
}) {
|
|
8
21
|
this.appConfig = appConfig;
|
|
9
22
|
this.staticSiteGenerator = staticSiteGenerator;
|
|
10
23
|
this.serveOptions = serveOptions;
|
|
24
|
+
this.apiHandlers = apiHandlers ?? [];
|
|
25
|
+
this.logger = logger ?? appLogger;
|
|
26
|
+
this.previewServerFactory = previewServerFactory ?? StaticContentServer;
|
|
27
|
+
}
|
|
28
|
+
warnApiHandlersUnavailableInStaticMode() {
|
|
29
|
+
if (this.apiHandlers.length === 0) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const uniqueHandlers = Array.from(
|
|
33
|
+
new Set(this.apiHandlers.map((handler) => `${handler.method} ${handler.path}`))
|
|
34
|
+
);
|
|
35
|
+
const visibleHandlers = uniqueHandlers.slice(0, 5).join(", ");
|
|
36
|
+
const remainingCount = uniqueHandlers.length - Math.min(uniqueHandlers.length, 5);
|
|
37
|
+
const summary = remainingCount > 0 ? `${visibleHandlers}, +${remainingCount} more` : visibleHandlers;
|
|
38
|
+
this.logger.warn(
|
|
39
|
+
"Registered API endpoints are not available in static build or preview modes because no server runtime is started. They are excluded from the generated output.\n",
|
|
40
|
+
`\u27A4 ${summary}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
prepareExportDirectory() {
|
|
44
|
+
const exportDir = this.appConfig.absolutePaths?.distDir ?? path.join(this.appConfig.rootDir, this.appConfig.distDir);
|
|
45
|
+
fileSystem.ensureDir(exportDir, true);
|
|
46
|
+
const srcPublicDir = path.join(
|
|
47
|
+
this.appConfig.rootDir,
|
|
48
|
+
this.appConfig.srcDir ?? "src",
|
|
49
|
+
this.appConfig.publicDir ?? "public"
|
|
50
|
+
);
|
|
51
|
+
if (fileSystem.exists(srcPublicDir)) {
|
|
52
|
+
fileSystem.copyDir(srcPublicDir, exportDir);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async refreshRuntimeAssets() {
|
|
56
|
+
for (const processor of this.appConfig.processors.values()) {
|
|
57
|
+
await processor.setup();
|
|
58
|
+
}
|
|
59
|
+
for (const integration of this.appConfig.integrations) {
|
|
60
|
+
await integration.setup();
|
|
61
|
+
}
|
|
11
62
|
}
|
|
12
63
|
/**
|
|
13
64
|
* Generates a static build of the site for deployment.
|
|
@@ -18,7 +69,10 @@ class ServerStaticBuilder {
|
|
|
18
69
|
*/
|
|
19
70
|
async build(options, dependencies) {
|
|
20
71
|
const { preview = false } = options ?? {};
|
|
21
|
-
const baseUrl = `http://${this.serveOptions.hostname ||
|
|
72
|
+
const baseUrl = `http://${this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${this.serveOptions.port || DEFAULT_ECOPAGES_PORT}`;
|
|
73
|
+
this.warnApiHandlersUnavailableInStaticMode();
|
|
74
|
+
this.prepareExportDirectory();
|
|
75
|
+
await this.refreshRuntimeAssets();
|
|
22
76
|
await this.staticSiteGenerator.run({
|
|
23
77
|
router: dependencies.router,
|
|
24
78
|
baseUrl,
|
|
@@ -26,18 +80,18 @@ class ServerStaticBuilder {
|
|
|
26
80
|
staticRoutes: dependencies.staticRoutes
|
|
27
81
|
});
|
|
28
82
|
if (!preview) {
|
|
29
|
-
|
|
83
|
+
this.logger.info("Build completed");
|
|
30
84
|
return;
|
|
31
85
|
}
|
|
32
|
-
const previewPort = this.serveOptions.port ||
|
|
33
|
-
const { server } =
|
|
86
|
+
const previewPort = this.serveOptions.port || DEFAULT_ECOPAGES_PORT;
|
|
87
|
+
const { server } = this.previewServerFactory.createServer({
|
|
34
88
|
appConfig: this.appConfig,
|
|
35
89
|
options: { port: Number(previewPort) }
|
|
36
90
|
});
|
|
37
|
-
if (server) {
|
|
38
|
-
|
|
91
|
+
if (server?.port) {
|
|
92
|
+
this.logger.info(`Preview running at http://localhost:${server.port}`);
|
|
39
93
|
} else {
|
|
40
|
-
|
|
94
|
+
this.logger.error("Failed to start preview server");
|
|
41
95
|
}
|
|
42
96
|
}
|
|
43
97
|
}
|