@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,14 +1,25 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
+
import path from "node:path";
|
|
2
3
|
import {
|
|
3
4
|
AssetFactory
|
|
4
|
-
} from "
|
|
5
|
-
import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "
|
|
6
|
-
import {
|
|
7
|
-
const coreRequire = createRequire(import.meta.url);
|
|
5
|
+
} from "../../services/assets/asset-processing-service/index.js";
|
|
6
|
+
import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../../eco/global-injector-map.js";
|
|
7
|
+
import { BoundaryPlanningService } from "./boundary-planning.service.js";
|
|
8
8
|
class RenderPreparationService {
|
|
9
|
-
|
|
9
|
+
appConfig;
|
|
10
|
+
assetProcessingService;
|
|
11
|
+
boundaryPlanningService;
|
|
12
|
+
/**
|
|
13
|
+
* Creates the render-preparation orchestrator for one app instance.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* The service is app-scoped because it depends on finalized config defaults and
|
|
17
|
+
* the app-owned asset-processing pipeline while remaining renderer-agnostic.
|
|
18
|
+
*/
|
|
19
|
+
constructor(appConfig, assetProcessingService, dependencies = {}) {
|
|
10
20
|
this.appConfig = appConfig;
|
|
11
21
|
this.assetProcessingService = assetProcessingService;
|
|
22
|
+
this.boundaryPlanningService = dependencies.boundaryPlanningService ?? new BoundaryPlanningService(appConfig);
|
|
12
23
|
}
|
|
13
24
|
/**
|
|
14
25
|
* Builds the final render options object used by the integration-specific
|
|
@@ -30,6 +41,13 @@ class RenderPreparationService {
|
|
|
30
41
|
const HtmlTemplate = await callbacks.getHtmlTemplate();
|
|
31
42
|
const { props, metadata } = await callbacks.resolvePageData(pageModule, routeOptions);
|
|
32
43
|
const Layout = Page.config?.layout;
|
|
44
|
+
const boundaryPlan = this.boundaryPlanningService.buildPlan({
|
|
45
|
+
routeFile: routeOptions.file,
|
|
46
|
+
currentIntegrationName,
|
|
47
|
+
HtmlTemplate,
|
|
48
|
+
Layout,
|
|
49
|
+
Page
|
|
50
|
+
});
|
|
33
51
|
const componentsToResolve = Layout ? [HtmlTemplate, Layout, Page] : [HtmlTemplate, Page];
|
|
34
52
|
const resolvedDependencies = await callbacks.resolveDependencies(componentsToResolve);
|
|
35
53
|
const usedIntegrationDependencies = this.collectUsedIntegrationDependencies(
|
|
@@ -40,13 +58,13 @@ class RenderPreparationService {
|
|
|
40
58
|
const allDependencies = [...resolvedDependencies, ...usedIntegrationDependencies, ...pageDeps];
|
|
41
59
|
let componentRender;
|
|
42
60
|
if (callbacks.shouldRenderPageComponent({ Page, Layout, options: routeOptions })) {
|
|
43
|
-
|
|
44
|
-
currentIntegrationName,
|
|
61
|
+
const pageRootRender = await this.renderPageRoot({
|
|
45
62
|
Page,
|
|
46
63
|
props,
|
|
47
64
|
routeOptions,
|
|
48
65
|
callbacks
|
|
49
66
|
});
|
|
67
|
+
componentRender = pageRootRender.componentRender;
|
|
50
68
|
if (componentRender.assets?.length) {
|
|
51
69
|
allDependencies.push(...componentRender.assets);
|
|
52
70
|
}
|
|
@@ -56,6 +74,10 @@ class RenderPreparationService {
|
|
|
56
74
|
const globalAssets = await this.buildGlobalInjectorAssets(triggers, currentIntegrationName);
|
|
57
75
|
allDependencies.push(...globalAssets);
|
|
58
76
|
}
|
|
77
|
+
const eagerSsrLazyAssets = await this.buildEagerSsrLazyAssets(componentsToResolve, currentIntegrationName);
|
|
78
|
+
if (eagerSsrLazyAssets.length > 0) {
|
|
79
|
+
allDependencies.push(...eagerSsrLazyAssets);
|
|
80
|
+
}
|
|
59
81
|
callbacks.setProcessedDependencies(callbacks.dedupeProcessedAssets(allDependencies));
|
|
60
82
|
const pageProps = {
|
|
61
83
|
...props,
|
|
@@ -82,7 +104,8 @@ class RenderPreparationService {
|
|
|
82
104
|
pageProps,
|
|
83
105
|
locals,
|
|
84
106
|
pageLocals,
|
|
85
|
-
cacheStrategy
|
|
107
|
+
cacheStrategy,
|
|
108
|
+
boundaryPlan
|
|
86
109
|
};
|
|
87
110
|
return {
|
|
88
111
|
...integrationSpecificProps,
|
|
@@ -102,6 +125,9 @@ class RenderPreparationService {
|
|
|
102
125
|
collectResolvedTriggers(components, seen = /* @__PURE__ */ new Set()) {
|
|
103
126
|
const triggers = [];
|
|
104
127
|
for (const comp of components) {
|
|
128
|
+
if (!comp) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
105
131
|
const ecoComp = comp;
|
|
106
132
|
if (seen.has(ecoComp)) {
|
|
107
133
|
continue;
|
|
@@ -152,6 +178,9 @@ class RenderPreparationService {
|
|
|
152
178
|
collectIntegrationNames(components, seen = /* @__PURE__ */ new Set()) {
|
|
153
179
|
const integrationNames = /* @__PURE__ */ new Set();
|
|
154
180
|
for (const comp of components) {
|
|
181
|
+
if (!comp) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
155
184
|
const ecoComp = comp;
|
|
156
185
|
if (seen.has(ecoComp)) {
|
|
157
186
|
continue;
|
|
@@ -180,12 +209,8 @@ class RenderPreparationService {
|
|
|
180
209
|
* @returns Structured component render result.
|
|
181
210
|
*/
|
|
182
211
|
async renderPageRoot(input) {
|
|
183
|
-
|
|
184
|
-
{
|
|
185
|
-
currentIntegration: input.currentIntegrationName,
|
|
186
|
-
boundaryContext: input.callbacks.getComponentRenderBoundaryContext()
|
|
187
|
-
},
|
|
188
|
-
async () => input.callbacks.renderPageComponent({
|
|
212
|
+
return {
|
|
213
|
+
componentRender: await input.callbacks.renderPageComponent({
|
|
189
214
|
component: input.Page,
|
|
190
215
|
props: {
|
|
191
216
|
...input.props,
|
|
@@ -193,8 +218,7 @@ class RenderPreparationService {
|
|
|
193
218
|
query: input.routeOptions.query || {}
|
|
194
219
|
}
|
|
195
220
|
})
|
|
196
|
-
|
|
197
|
-
return execution.value;
|
|
221
|
+
};
|
|
198
222
|
}
|
|
199
223
|
/**
|
|
200
224
|
* Builds the runtime assets needed to bootstrap global lazy trigger execution.
|
|
@@ -203,7 +227,7 @@ class RenderPreparationService {
|
|
|
203
227
|
* @returns Processed assets that should be merged into the final dependency set.
|
|
204
228
|
*/
|
|
205
229
|
async buildGlobalInjectorAssets(triggers, currentIntegrationName) {
|
|
206
|
-
const globalInjectorImportPath =
|
|
230
|
+
const globalInjectorImportPath = createRequire(import.meta.url).resolve("@ecopages/scripts-injector/global");
|
|
207
231
|
const globalInjectorRuntimeAsset = AssetFactory.createNodeModuleScript({
|
|
208
232
|
position: "head",
|
|
209
233
|
name: "ecopages-scripts-injector-global",
|
|
@@ -237,6 +261,80 @@ class RenderPreparationService {
|
|
|
237
261
|
currentIntegrationName
|
|
238
262
|
);
|
|
239
263
|
}
|
|
264
|
+
async buildEagerSsrLazyAssets(components, currentIntegrationName) {
|
|
265
|
+
const dependencies = this.collectEagerSsrLazyDependencies(components);
|
|
266
|
+
if (dependencies.length === 0) {
|
|
267
|
+
return [];
|
|
268
|
+
}
|
|
269
|
+
return this.assetProcessingService.processDependencies(dependencies, `${currentIntegrationName}:ssr-lazy`);
|
|
270
|
+
}
|
|
271
|
+
collectEagerSsrLazyDependencies(components) {
|
|
272
|
+
const dependencies = [];
|
|
273
|
+
const visitedConfigs = /* @__PURE__ */ new Set();
|
|
274
|
+
const seenKeys = /* @__PURE__ */ new Set();
|
|
275
|
+
const normalizeAttributes = (attributes) => ({
|
|
276
|
+
type: "module",
|
|
277
|
+
defer: "",
|
|
278
|
+
...attributes ?? {}
|
|
279
|
+
});
|
|
280
|
+
const collect = (config) => {
|
|
281
|
+
if (!config || visitedConfigs.has(config)) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
visitedConfigs.add(config);
|
|
285
|
+
const componentFile = config.__eco?.file;
|
|
286
|
+
if (componentFile) {
|
|
287
|
+
const componentDir = path.dirname(componentFile);
|
|
288
|
+
for (const script of config.dependencies?.scripts ?? []) {
|
|
289
|
+
if (typeof script === "string" || !script.lazy || script.ssr !== true) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const attributes = normalizeAttributes(script.attributes);
|
|
293
|
+
if (script.content) {
|
|
294
|
+
const key2 = `content:${script.content}:${JSON.stringify(attributes)}`;
|
|
295
|
+
if (seenKeys.has(key2)) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
seenKeys.add(key2);
|
|
299
|
+
dependencies.push(
|
|
300
|
+
AssetFactory.createContentScript({
|
|
301
|
+
position: "head",
|
|
302
|
+
content: script.content,
|
|
303
|
+
attributes
|
|
304
|
+
})
|
|
305
|
+
);
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
if (!script.src) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
const resolvedPath = path.resolve(componentDir, script.src);
|
|
312
|
+
const key = `file:${resolvedPath}:${JSON.stringify(attributes)}`;
|
|
313
|
+
if (seenKeys.has(key)) {
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
seenKeys.add(key);
|
|
317
|
+
dependencies.push(
|
|
318
|
+
AssetFactory.createFileScript({
|
|
319
|
+
filepath: resolvedPath,
|
|
320
|
+
position: "head",
|
|
321
|
+
attributes
|
|
322
|
+
})
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (config.layout?.config) {
|
|
327
|
+
collect(config.layout.config);
|
|
328
|
+
}
|
|
329
|
+
for (const nestedComponent of config.dependencies?.components ?? []) {
|
|
330
|
+
collect(nestedComponent?.config);
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
for (const component of components) {
|
|
334
|
+
collect(component.config);
|
|
335
|
+
}
|
|
336
|
+
return dependencies;
|
|
337
|
+
}
|
|
240
338
|
}
|
|
241
339
|
export {
|
|
242
340
|
RenderPreparationService
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ComponentRenderInput, ComponentRenderResult, EcoComponent, HtmlTemplateProps, PageMetadataProps } from '../../types/public-types.js';
|
|
2
|
+
import type { ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
|
|
3
|
+
import type { RenderToResponseContext } from './integration-renderer.js';
|
|
4
|
+
export interface RouteShellComposerCallbacks {
|
|
5
|
+
hasForeignBoundaryDescendants(component: EcoComponent): boolean;
|
|
6
|
+
createHtmlResponse(body: BodyInit, ctx: RenderToResponseContext): Response;
|
|
7
|
+
renderComponentBoundary(input: ComponentRenderInput): Promise<ComponentRenderResult>;
|
|
8
|
+
prepareViewDependencies(view: EcoComponent, layout?: EcoComponent): Promise<ProcessedAsset[]>;
|
|
9
|
+
getHtmlTemplate(): Promise<EcoComponent<HtmlTemplateProps>>;
|
|
10
|
+
resolveViewMetadata<P>(view: EcoComponent<P>, props: P): Promise<PageMetadataProps>;
|
|
11
|
+
appendProcessedDependencies(...assetGroups: Array<readonly ProcessedAsset[] | undefined>): ProcessedAsset[];
|
|
12
|
+
finalizeResolvedHtml(options: {
|
|
13
|
+
html: string;
|
|
14
|
+
partial?: boolean;
|
|
15
|
+
componentRootAttributes?: Record<string, string>;
|
|
16
|
+
documentAttributes?: Record<string, string>;
|
|
17
|
+
transformHtml?: boolean;
|
|
18
|
+
}): Promise<string>;
|
|
19
|
+
docType: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class RouteShellComposer {
|
|
22
|
+
renderPartialViewResponse<P>(input: {
|
|
23
|
+
view: EcoComponent<P>;
|
|
24
|
+
props: P;
|
|
25
|
+
ctx: RenderToResponseContext;
|
|
26
|
+
renderInline?: () => Promise<BodyInit>;
|
|
27
|
+
transformHtml?: (html: string) => string;
|
|
28
|
+
}, callbacks: RouteShellComposerCallbacks): Promise<Response>;
|
|
29
|
+
renderViewWithDocumentShell<P>(input: {
|
|
30
|
+
view: EcoComponent<P>;
|
|
31
|
+
props: P;
|
|
32
|
+
ctx: RenderToResponseContext;
|
|
33
|
+
layout?: EcoComponent;
|
|
34
|
+
}, callbacks: RouteShellComposerCallbacks): Promise<Response>;
|
|
35
|
+
renderPageWithDocumentShell(input: {
|
|
36
|
+
page: {
|
|
37
|
+
component: EcoComponent;
|
|
38
|
+
props: Record<string, unknown>;
|
|
39
|
+
};
|
|
40
|
+
layout?: {
|
|
41
|
+
component: EcoComponent;
|
|
42
|
+
props?: Record<string, unknown>;
|
|
43
|
+
};
|
|
44
|
+
htmlTemplate: EcoComponent;
|
|
45
|
+
metadata: PageMetadataProps;
|
|
46
|
+
pageProps: Record<string, unknown>;
|
|
47
|
+
documentProps?: Record<string, unknown>;
|
|
48
|
+
transformDocumentHtml?: (html: string) => string;
|
|
49
|
+
}, callbacks: RouteShellComposerCallbacks): Promise<string>;
|
|
50
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
class RouteShellComposer {
|
|
2
|
+
async renderPartialViewResponse(input, callbacks) {
|
|
3
|
+
if (input.renderInline && !callbacks.hasForeignBoundaryDescendants(input.view)) {
|
|
4
|
+
return callbacks.createHtmlResponse(await input.renderInline(), input.ctx);
|
|
5
|
+
}
|
|
6
|
+
const rendererCache = /* @__PURE__ */ new Map();
|
|
7
|
+
const viewRender = await callbacks.renderComponentBoundary({
|
|
8
|
+
component: input.view,
|
|
9
|
+
props: input.props ?? {},
|
|
10
|
+
integrationContext: { rendererCache }
|
|
11
|
+
});
|
|
12
|
+
const html = input.transformHtml ? input.transformHtml(viewRender.html) : viewRender.html;
|
|
13
|
+
return callbacks.createHtmlResponse(html, input.ctx);
|
|
14
|
+
}
|
|
15
|
+
async renderViewWithDocumentShell(input, callbacks) {
|
|
16
|
+
const normalizedProps = input.props ?? {};
|
|
17
|
+
if (input.ctx.partial) {
|
|
18
|
+
return this.renderPartialViewResponse(input, callbacks);
|
|
19
|
+
}
|
|
20
|
+
await callbacks.prepareViewDependencies(input.view, input.layout);
|
|
21
|
+
const HtmlTemplate = await callbacks.getHtmlTemplate();
|
|
22
|
+
const metadata = await callbacks.resolveViewMetadata(input.view, input.props);
|
|
23
|
+
const rendererCache = /* @__PURE__ */ new Map();
|
|
24
|
+
const viewRender = await callbacks.renderComponentBoundary({
|
|
25
|
+
component: input.view,
|
|
26
|
+
props: normalizedProps,
|
|
27
|
+
integrationContext: { rendererCache }
|
|
28
|
+
});
|
|
29
|
+
const layoutRender = input.layout ? await callbacks.renderComponentBoundary({
|
|
30
|
+
component: input.layout,
|
|
31
|
+
props: {},
|
|
32
|
+
children: viewRender.html,
|
|
33
|
+
integrationContext: { rendererCache }
|
|
34
|
+
}) : void 0;
|
|
35
|
+
const documentRender = await callbacks.renderComponentBoundary({
|
|
36
|
+
component: HtmlTemplate,
|
|
37
|
+
props: {
|
|
38
|
+
metadata,
|
|
39
|
+
pageProps: normalizedProps
|
|
40
|
+
},
|
|
41
|
+
children: layoutRender?.html ?? viewRender.html,
|
|
42
|
+
integrationContext: { rendererCache }
|
|
43
|
+
});
|
|
44
|
+
callbacks.appendProcessedDependencies(viewRender.assets, layoutRender?.assets, documentRender.assets);
|
|
45
|
+
const html = await callbacks.finalizeResolvedHtml({
|
|
46
|
+
html: `${callbacks.docType}${documentRender.html}`,
|
|
47
|
+
partial: false
|
|
48
|
+
});
|
|
49
|
+
return callbacks.createHtmlResponse(html, input.ctx);
|
|
50
|
+
}
|
|
51
|
+
async renderPageWithDocumentShell(input, callbacks) {
|
|
52
|
+
const rendererCache = /* @__PURE__ */ new Map();
|
|
53
|
+
const pageRender = await callbacks.renderComponentBoundary({
|
|
54
|
+
component: input.page.component,
|
|
55
|
+
props: input.page.props,
|
|
56
|
+
integrationContext: { rendererCache }
|
|
57
|
+
});
|
|
58
|
+
const layoutRender = input.layout ? await callbacks.renderComponentBoundary({
|
|
59
|
+
component: input.layout.component,
|
|
60
|
+
props: input.layout.props ?? {},
|
|
61
|
+
children: pageRender.html,
|
|
62
|
+
integrationContext: { rendererCache }
|
|
63
|
+
}) : void 0;
|
|
64
|
+
const documentRender = await callbacks.renderComponentBoundary({
|
|
65
|
+
component: input.htmlTemplate,
|
|
66
|
+
props: {
|
|
67
|
+
metadata: input.metadata,
|
|
68
|
+
pageProps: input.pageProps,
|
|
69
|
+
...input.documentProps ?? {}
|
|
70
|
+
},
|
|
71
|
+
children: layoutRender?.html ?? pageRender.html,
|
|
72
|
+
integrationContext: { rendererCache }
|
|
73
|
+
});
|
|
74
|
+
callbacks.appendProcessedDependencies(pageRender.assets, layoutRender?.assets, documentRender.assets);
|
|
75
|
+
const documentHtml = input.transformDocumentHtml ? input.transformDocumentHtml(documentRender.html) : documentRender.html;
|
|
76
|
+
return `${callbacks.docType}${documentHtml}`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export {
|
|
80
|
+
RouteShellComposer
|
|
81
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal template-result shape that core can serialize generically.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Core intentionally models only the transport shape used during deferred
|
|
6
|
+
* cross-integration child passing: alternating static string segments plus
|
|
7
|
+
* interpolated runtime values. Concrete runtime markers that identify a given
|
|
8
|
+
* framework's template payload must stay outside core and be registered by the
|
|
9
|
+
* owning integration package.
|
|
10
|
+
*/
|
|
11
|
+
export type SerializableTemplateShape = {
|
|
12
|
+
strings: readonly string[];
|
|
13
|
+
values?: readonly unknown[];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Integration-owned adapter that teaches core how to serialize one deferred
|
|
17
|
+
* template payload shape.
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* The separation here is intentional: core owns the HTML serialization logic,
|
|
21
|
+
* but integrations own runtime-shape detection. That keeps package-specific
|
|
22
|
+
* markers such as framework template sentinels out of core while still letting
|
|
23
|
+
* deferred children round-trip through mixed renderer boundaries.
|
|
24
|
+
*/
|
|
25
|
+
export type DeferredTemplateSerializer<TTemplate extends SerializableTemplateShape = SerializableTemplateShape> = {
|
|
26
|
+
matches(value: unknown): value is TTemplate;
|
|
27
|
+
serialize(template: TTemplate, serializeValue: (value: unknown) => string | undefined): string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Serializes a generic template shape into HTML.
|
|
31
|
+
*
|
|
32
|
+
* @remarks
|
|
33
|
+
* This handles only HTML reconstruction semantics: quoted attribute values,
|
|
34
|
+
* boolean attributes, and omission of client-only event or property bindings.
|
|
35
|
+
* It does not decide whether an arbitrary value belongs to a framework-specific
|
|
36
|
+
* template runtime; integrations must make that decision before delegating here.
|
|
37
|
+
*/
|
|
38
|
+
export declare function serializeTemplateShape(template: SerializableTemplateShape, serializeValue: (value: unknown) => string | undefined): string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { escapeHtmlAttribute } from "../../utils/html-escaping.js";
|
|
2
|
+
const ATTRIBUTE_TAIL_PATTERN = /(\s+)([@.?!]?)([^\s"'<>/=`@.?!]+)=$/;
|
|
3
|
+
function getSerializableTemplateAttribute(stringPart) {
|
|
4
|
+
const match = ATTRIBUTE_TAIL_PATTERN.exec(stringPart);
|
|
5
|
+
if (!match) return void 0;
|
|
6
|
+
return {
|
|
7
|
+
leading: stringPart.slice(0, match.index),
|
|
8
|
+
whitespace: match[1],
|
|
9
|
+
prefix: match[2],
|
|
10
|
+
name: match[3]
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function serializeTemplateShape(template, serializeValue) {
|
|
14
|
+
const values = template.values ?? [];
|
|
15
|
+
let html = "";
|
|
16
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
17
|
+
const stringPart = template.strings[index] ?? "";
|
|
18
|
+
const serializedValue = serializeValue(values[index]);
|
|
19
|
+
const attribute = getSerializableTemplateAttribute(stringPart);
|
|
20
|
+
if (!attribute) {
|
|
21
|
+
html += stringPart;
|
|
22
|
+
html += serializedValue ?? "";
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
html += attribute.leading;
|
|
26
|
+
if (attribute.prefix === "@" || attribute.prefix === "!" || attribute.prefix === ".") {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (attribute.prefix === "?") {
|
|
30
|
+
if (serializedValue) {
|
|
31
|
+
html += `${attribute.whitespace}${attribute.name}`;
|
|
32
|
+
}
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (serializedValue === void 0) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
html += `${attribute.whitespace}${attribute.name}="${escapeHtmlAttribute(serializedValue)}"`;
|
|
39
|
+
}
|
|
40
|
+
html += template.strings[values.length] ?? "";
|
|
41
|
+
return html;
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
serializeTemplateShape
|
|
45
|
+
};
|
package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EcoComponent } from '
|
|
2
|
-
import type { EcoPagesAppConfig } from '
|
|
3
|
-
import type { AssetProcessingService, ProcessedAsset } from '
|
|
1
|
+
import type { EcoComponent } from '../../types/public-types.js';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
3
|
+
import type { AssetProcessingService, ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
|
|
4
4
|
export declare const DEPENDENCY_ERRORS: {
|
|
5
5
|
readonly INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content";
|
|
6
6
|
readonly INVALID_SCRIPT_ENTRY: "Invalid script dependency entry: expected src or content";
|
|
@@ -9,7 +9,18 @@ export declare const DEPENDENCY_ERRORS: {
|
|
|
9
9
|
export declare class DependencyResolverService {
|
|
10
10
|
private appConfig;
|
|
11
11
|
private assetProcessingService;
|
|
12
|
+
/**
|
|
13
|
+
* Creates the dependency resolver used by route and component rendering.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* The resolver stays intentionally separate from HTML rendering so component
|
|
17
|
+
* dependency collection, lazy trigger grouping, and processed-asset generation
|
|
18
|
+
* can evolve without changing renderer implementations.
|
|
19
|
+
*/
|
|
12
20
|
constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService);
|
|
21
|
+
/**
|
|
22
|
+
* Resolves one dependency path relative to the component that declared it.
|
|
23
|
+
*/
|
|
13
24
|
resolveDependencyPath(componentDir: string, pathUrl: string): string;
|
|
14
25
|
/**
|
|
15
26
|
* Maps lazy script source entries to deterministic fallback public URLs
|
|
@@ -20,5 +31,5 @@ export declare class DependencyResolverService {
|
|
|
20
31
|
* Collects and processes component dependencies (styles, scripts, modules, lazy scripts).
|
|
21
32
|
* Lazy dependencies are always resolved into global-injector trigger maps.
|
|
22
33
|
*/
|
|
23
|
-
processComponentDependencies(components:
|
|
34
|
+
processComponentDependencies(components: Array<EcoComponent | Partial<EcoComponent> | undefined | null>, integrationName: string): Promise<ProcessedAsset[]>;
|
|
24
35
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
|
-
import { rapidhash } from "
|
|
4
|
-
import { AssetFactory } from "
|
|
5
|
-
import { normalizeModuleDeclarations } from "
|
|
3
|
+
import { rapidhash } from "../../utils/hash.js";
|
|
4
|
+
import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
|
|
5
|
+
import { normalizeModuleDeclarations } from "../../eco/module-dependencies.js";
|
|
6
6
|
import { parseSync } from "oxc-parser";
|
|
7
7
|
const DEPENDENCY_ERRORS = {
|
|
8
8
|
INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content",
|
|
@@ -34,7 +34,12 @@ function extractEcopagesVirtualImports(file) {
|
|
|
34
34
|
const namedImports = [];
|
|
35
35
|
for (const spec of node.specifiers ?? []) {
|
|
36
36
|
if (spec.type === "ImportSpecifier") {
|
|
37
|
-
|
|
37
|
+
let importedName = spec.local?.name;
|
|
38
|
+
if (spec.imported?.type === "Identifier") {
|
|
39
|
+
importedName = spec.imported.name;
|
|
40
|
+
} else if (spec.imported?.type === "Literal") {
|
|
41
|
+
importedName = spec.imported.value;
|
|
42
|
+
}
|
|
38
43
|
namedImports.push(importedName);
|
|
39
44
|
}
|
|
40
45
|
}
|
|
@@ -62,7 +67,7 @@ function createModuleScriptName(from, imports) {
|
|
|
62
67
|
return `module-${hash}`;
|
|
63
68
|
}
|
|
64
69
|
function createNamedImportModuleSource(from, imports) {
|
|
65
|
-
const namedImports = imports.join(", ");
|
|
70
|
+
const namedImports = [...new Set(imports)].sort().join(", ");
|
|
66
71
|
return `export { ${namedImports} } from '${from}';`;
|
|
67
72
|
}
|
|
68
73
|
function createNamespaceImportModuleSource(from) {
|
|
@@ -139,10 +144,23 @@ function buildResolvedLazyTriggers(config, groups) {
|
|
|
139
144
|
return [{ triggerId, rules }];
|
|
140
145
|
}
|
|
141
146
|
class DependencyResolverService {
|
|
147
|
+
appConfig;
|
|
148
|
+
assetProcessingService;
|
|
149
|
+
/**
|
|
150
|
+
* Creates the dependency resolver used by route and component rendering.
|
|
151
|
+
*
|
|
152
|
+
* @remarks
|
|
153
|
+
* The resolver stays intentionally separate from HTML rendering so component
|
|
154
|
+
* dependency collection, lazy trigger grouping, and processed-asset generation
|
|
155
|
+
* can evolve without changing renderer implementations.
|
|
156
|
+
*/
|
|
142
157
|
constructor(appConfig, assetProcessingService) {
|
|
143
158
|
this.appConfig = appConfig;
|
|
144
159
|
this.assetProcessingService = assetProcessingService;
|
|
145
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Resolves one dependency path relative to the component that declared it.
|
|
163
|
+
*/
|
|
146
164
|
resolveDependencyPath(componentDir, pathUrl) {
|
|
147
165
|
return resolveDependencyPath(componentDir, pathUrl);
|
|
148
166
|
}
|
|
@@ -163,6 +181,7 @@ class DependencyResolverService {
|
|
|
163
181
|
const lazyScriptsByConfig = /* @__PURE__ */ new Map();
|
|
164
182
|
const lazyDependencyKeys = /* @__PURE__ */ new Set();
|
|
165
183
|
for (const component of components) {
|
|
184
|
+
if (!component) continue;
|
|
166
185
|
const componentFile = component.config?.__eco?.file;
|
|
167
186
|
if (!componentFile) continue;
|
|
168
187
|
const stylesheetDependencyKeys = /* @__PURE__ */ new Set();
|
|
@@ -245,14 +264,11 @@ class DependencyResolverService {
|
|
|
245
264
|
}
|
|
246
265
|
scriptDependencyKeys.add(depKey2);
|
|
247
266
|
dependencies.push(
|
|
248
|
-
AssetFactory.
|
|
267
|
+
AssetFactory.createInlineContentScript({
|
|
249
268
|
position: "head",
|
|
250
269
|
content,
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
defer: "",
|
|
254
|
-
...attributes
|
|
255
|
-
}
|
|
270
|
+
bundle: false,
|
|
271
|
+
attributes
|
|
256
272
|
})
|
|
257
273
|
);
|
|
258
274
|
continue;
|
|
@@ -357,7 +373,7 @@ class DependencyResolverService {
|
|
|
357
373
|
}
|
|
358
374
|
if (dependenciesConfig?.components) {
|
|
359
375
|
for (const nestedComponent of dependenciesConfig.components) {
|
|
360
|
-
if (nestedComponent
|
|
376
|
+
if (nestedComponent?.config) {
|
|
361
377
|
collect(nestedComponent.config);
|
|
362
378
|
}
|
|
363
379
|
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { EcoPageFile, GetMetadata, GetMetadataContext, GetStaticProps, PageMetadataProps, RouteRendererOptions, EcoPageComponent } from '../../types/public-types.js';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Loads route page modules and normalizes their data hooks for rendering.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* This service keeps the render pipeline from depending directly on raw module
|
|
8
|
+
* imports. It owns the shared server-module transpiler setup, the precedence
|
|
9
|
+
* rules between component statics and module exports, and the normalization of
|
|
10
|
+
* page props and metadata into one renderer-facing shape.
|
|
11
|
+
*/
|
|
12
|
+
export declare class PageModuleLoaderService {
|
|
13
|
+
private appModuleLoader;
|
|
14
|
+
private appConfig;
|
|
15
|
+
private runtimeOrigin;
|
|
16
|
+
/**
|
|
17
|
+
* Creates the page-module loader for one app/runtime instance.
|
|
18
|
+
*
|
|
19
|
+
* @param appConfig Finalized app config that owns build and invalidation state.
|
|
20
|
+
* @param runtimeOrigin Runtime origin exposed to page data hooks.
|
|
21
|
+
*/
|
|
22
|
+
constructor(appConfig: EcoPagesAppConfig, runtimeOrigin: string);
|
|
23
|
+
/**
|
|
24
|
+
* Imports one page module through the shared server-side module loading path.
|
|
25
|
+
*
|
|
26
|
+
* @remarks
|
|
27
|
+
* The underlying transpiler keeps Bun and Node aligned on one framework-owned
|
|
28
|
+
* loading contract even though the runtime-specific execution transport differs.
|
|
29
|
+
*/
|
|
30
|
+
importPageFile(file: string, options?: {
|
|
31
|
+
bypassCache?: boolean;
|
|
32
|
+
cacheScope?: string;
|
|
33
|
+
}): Promise<EcoPageFile>;
|
|
34
|
+
/**
|
|
35
|
+
* Executes the page's static-props hook with Ecopages runtime context.
|
|
36
|
+
*
|
|
37
|
+
* @remarks
|
|
38
|
+
* Pages without a static-props hook still return a normalized empty props
|
|
39
|
+
* object so downstream render preparation does not branch on hook presence.
|
|
40
|
+
*/
|
|
41
|
+
getStaticPropsForPage(options: {
|
|
42
|
+
getStaticProps?: GetStaticProps<Record<string, unknown>>;
|
|
43
|
+
params?: RouteRendererOptions['params'];
|
|
44
|
+
}): Promise<{
|
|
45
|
+
props: Record<string, unknown>;
|
|
46
|
+
metadata?: PageMetadataProps;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Builds the final page metadata object for one render request.
|
|
50
|
+
*
|
|
51
|
+
* @remarks
|
|
52
|
+
* App-level default metadata forms the baseline, then page-level metadata is
|
|
53
|
+
* overlaid so route-specific fields win without dropping global defaults.
|
|
54
|
+
*/
|
|
55
|
+
getMetadataPropsForPage(options: {
|
|
56
|
+
getMetadata: GetMetadata | undefined;
|
|
57
|
+
context: GetMetadataContext;
|
|
58
|
+
}): Promise<PageMetadataProps>;
|
|
59
|
+
/**
|
|
60
|
+
* Loads a page module and normalizes integration-facing exports.
|
|
61
|
+
* When both component static methods and module exports exist, component statics win.
|
|
62
|
+
*/
|
|
63
|
+
resolvePageModule(options: {
|
|
64
|
+
file: string;
|
|
65
|
+
importPageFileFn?: (file: string) => Promise<EcoPageFile>;
|
|
66
|
+
}): Promise<{
|
|
67
|
+
Page: EcoPageFile['default'] | EcoPageComponent<any>;
|
|
68
|
+
getStaticProps?: GetStaticProps<Record<string, unknown>>;
|
|
69
|
+
getMetadata?: GetMetadata;
|
|
70
|
+
integrationSpecificProps: Record<string, unknown>;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* Resolves the page data needed by the render pipeline.
|
|
74
|
+
*
|
|
75
|
+
* @remarks
|
|
76
|
+
* Static props are resolved first because page metadata may depend on those
|
|
77
|
+
* props. This preserves the same ordering whether data hooks are declared as
|
|
78
|
+
* component statics or module exports.
|
|
79
|
+
*/
|
|
80
|
+
resolvePageData(options: {
|
|
81
|
+
pageModule: {
|
|
82
|
+
getStaticProps?: GetStaticProps<Record<string, unknown>>;
|
|
83
|
+
getMetadata?: GetMetadata;
|
|
84
|
+
};
|
|
85
|
+
routeOptions: RouteRendererOptions;
|
|
86
|
+
}): Promise<{
|
|
87
|
+
props: Record<string, unknown>;
|
|
88
|
+
metadata: PageMetadataProps;
|
|
89
|
+
}>;
|
|
90
|
+
}
|