@ecopages/core 0.2.0-alpha.3 → 0.2.0-alpha.30
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 +66 -66
- package/README.md +268 -14
- package/package.json +72 -108
- 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 +5 -12
- package/src/adapters/bun/create-app.js +43 -7
- package/src/adapters/bun/hmr-manager.d.ts +72 -26
- package/src/adapters/bun/hmr-manager.js +153 -81
- 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 +63 -38
- 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 +79 -21
- package/src/adapters/node/node-hmr-manager.js +167 -114
- package/src/adapters/node/server-adapter.d.ts +7 -35
- package/src/adapters/node/server-adapter.js +55 -107
- 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-render-preparation.d.ts +25 -0
- package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
- package/src/adapters/shared/explicit-static-route-matcher.js +14 -13
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
- package/src/adapters/shared/file-route-middleware-pipeline.js +3 -11
- package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
- package/src/adapters/shared/fs-server-response-factory.js +11 -27
- package/src/adapters/shared/fs-server-response-matcher.d.ts +20 -16
- package/src/adapters/shared/fs-server-response-matcher.js +76 -45
- 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 +4 -3
- 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 +33 -12
- package/src/adapters/shared/server-adapter.js +208 -132
- package/src/adapters/shared/server-route-handler.d.ts +5 -5
- package/src/adapters/shared/server-route-handler.js +7 -16
- package/src/adapters/shared/server-static-builder.d.ts +41 -8
- package/src/adapters/shared/server-static-builder.js +65 -11
- 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 +54 -29
- package/src/config/config-builder.js +255 -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/host-runtime.d.ts +10 -0
- package/src/dev/host-runtime.js +24 -0
- 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 +14 -6
- 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 +3 -3
- package/src/eco/global-injector-map.js +2 -2
- package/src/eco/lazy-injector-map.d.ts +2 -2
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +3 -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 +38 -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 -48
- package/src/hmr/strategies/js-hmr-strategy.js +64 -74
- 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 +3 -2
- package/src/integrations/ghtml/ghtml-renderer.js +27 -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 -22
- 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 +142 -29
- package/src/plugins/integration-plugin.js +103 -14
- package/src/plugins/processor.d.ts +17 -2
- package/src/plugins/processor.js +22 -3
- 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 +83 -325
- package/src/route-renderer/README.md +73 -90
- package/src/route-renderer/orchestration/component-render-context.d.ts +89 -0
- package/src/route-renderer/orchestration/component-render-context.js +147 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
- package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +108 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +206 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +516 -0
- package/src/route-renderer/orchestration/integration-renderer.js +909 -0
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
- package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
- package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +2 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +90 -0
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +158 -0
- package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
- package/src/route-renderer/orchestration/render-output.utils.js +171 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +120 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.js +388 -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/page-loading/component-dependency-collection.d.ts +37 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
- package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
- package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
- package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
- package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
- package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
- package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
- 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 +57 -14
- package/src/route-renderer/route-renderer.js +30 -18
- package/src/router/README.md +94 -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 +169 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/server/route-registry.d.ts +78 -0
- package/src/router/server/route-registry.js +262 -0
- package/src/services/README.md +28 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
- 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 +16 -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 +49 -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/grouped-content-bundles.d.ts +30 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
- package/src/services/assets/asset-processing-service/index.d.ts +6 -0
- package/src/services/assets/asset-processing-service/index.js +6 -0
- package/src/services/assets/asset-processing-service/page-package.d.ts +3 -0
- package/src/services/assets/asset-processing-service/page-package.js +74 -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 +11 -5
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
- 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 +3 -2
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
- 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 +28 -7
- 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 +12 -7
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
- 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 +9 -3
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
- package/src/services/assets/browser-bundle.service.d.ts +73 -0
- package/src/services/assets/browser-bundle.service.js +41 -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 +87 -0
- package/src/services/html/html-transformer.service.js +216 -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 +7 -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 +115 -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/module-loading-types.js +0 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +216 -0
- package/src/services/module-loading/page-module-import.service.d.ts +76 -0
- package/src/services/module-loading/page-module-import.service.js +170 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
- package/src/services/module-loading/server-module-transpiler.service.js +64 -0
- package/src/services/module-loading/source-module-support.d.ts +5 -0
- package/src/services/module-loading/source-module-support.js +8 -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/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 +67 -20
- package/src/static-site-generator/static-site-generator.js +182 -138
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +201 -32
- 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 -29
- package/src/watchers/project-watcher.js +126 -116
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +6 -6
- 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 -296
- 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 -289
- 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/eco.utils.ts +0 -89
- 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 -320
- 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 -1260
- 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.js +0 -428
- 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.d.ts +0 -112
- package/src/route-renderer/render-preparation.service.js +0 -243
- 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.d.ts +0 -41
- package/src/router/fs-router-scanner.js +0 -155
- package/src/router/fs-router-scanner.ts +0 -217
- package/src/router/fs-router.d.ts +0 -26
- package/src/router/fs-router.js +0 -100
- 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.d.ts +0 -16
- package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
- 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.js +0 -57
- 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.js +0 -25
- 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 -41
- package/src/watchers/project-watcher.ts +0 -344
- /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/app-module-loader.service.js} +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { EcoComponent } from '../../types/public-types.js';
|
|
2
|
+
import type { AssetDefinition } from '../../services/assets/asset-processing-service/index.js';
|
|
3
|
+
import { type LazyGroup } from './lazy-entry-collection.js';
|
|
4
|
+
/**
|
|
5
|
+
* Aggregated dependency output for one dependency-collection pass.
|
|
6
|
+
*/
|
|
7
|
+
export type CollectedComponentDependencies = {
|
|
8
|
+
/**
|
|
9
|
+
* Flat asset declarations ready for downstream processing.
|
|
10
|
+
*/
|
|
11
|
+
dependencies: AssetDefinition[];
|
|
12
|
+
/**
|
|
13
|
+
* Lazy script groups keyed by component config and trigger key.
|
|
14
|
+
*/
|
|
15
|
+
lazyScriptsByConfig: Map<NonNullable<EcoComponent['config']>, Map<string, LazyGroup>>;
|
|
16
|
+
};
|
|
17
|
+
type CollectComponentDependenciesOptions = {
|
|
18
|
+
components: Array<EcoComponent | Partial<EcoComponent> | undefined | null>;
|
|
19
|
+
integrationName: string;
|
|
20
|
+
resolveLazyScripts: (componentDir: string, scripts: string[]) => string;
|
|
21
|
+
createEcopagesJsxLazyEntryName: (integrationName: string, key: string) => string;
|
|
22
|
+
isEcopagesJsxIntegration: (integrationName: string) => boolean;
|
|
23
|
+
errors: {
|
|
24
|
+
invalidStylesheetEntry: string;
|
|
25
|
+
invalidScriptEntry: string;
|
|
26
|
+
lazyScriptMissingSrc: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Walks component dependency trees and collects declared assets, module declarations,
|
|
31
|
+
* and lazy-script group metadata in one pass.
|
|
32
|
+
*
|
|
33
|
+
* The returned structures intentionally preserve both the flat asset list used by
|
|
34
|
+
* asset processing and the grouped lazy-trigger data used later during render output.
|
|
35
|
+
*/
|
|
36
|
+
export declare function collectComponentDependencies(options: CollectComponentDependenciesOptions): CollectedComponentDependencies;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
|
|
3
|
+
import { extractEcopagesVirtualImports } from "./ecopages-virtual-imports.js";
|
|
4
|
+
import { collectDeclaredAssetEntries } from "./declared-asset-collection.js";
|
|
5
|
+
import { getLazyTriggerKey } from "./lazy-trigger-planning.js";
|
|
6
|
+
import { collectLazyScriptEntries } from "./lazy-entry-collection.js";
|
|
7
|
+
import {
|
|
8
|
+
createModuleScriptName,
|
|
9
|
+
createNamedImportModuleSource,
|
|
10
|
+
createNamespaceImportModuleSource
|
|
11
|
+
} from "./module-declaration-scripts.js";
|
|
12
|
+
import { collectModuleDeclarations } from "./module-declaration-aggregation.js";
|
|
13
|
+
const MODULE_SCRIPT_ATTRIBUTES = {
|
|
14
|
+
type: "module",
|
|
15
|
+
defer: ""
|
|
16
|
+
};
|
|
17
|
+
function createModuleScriptAttributes(attributes) {
|
|
18
|
+
return {
|
|
19
|
+
...MODULE_SCRIPT_ATTRIBUTES,
|
|
20
|
+
...attributes
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function pushUniqueDependency(keys, key, dependencies, dependency) {
|
|
24
|
+
if (keys.has(key)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
keys.add(key);
|
|
28
|
+
dependencies.push(dependency);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
function resolveDependencyPath(componentDir, pathUrl) {
|
|
32
|
+
return path.join(componentDir, pathUrl);
|
|
33
|
+
}
|
|
34
|
+
function collectComponentDependencies(options) {
|
|
35
|
+
const {
|
|
36
|
+
components,
|
|
37
|
+
integrationName,
|
|
38
|
+
resolveLazyScripts,
|
|
39
|
+
createEcopagesJsxLazyEntryName,
|
|
40
|
+
isEcopagesJsxIntegration,
|
|
41
|
+
errors
|
|
42
|
+
} = options;
|
|
43
|
+
const dependencies = [];
|
|
44
|
+
const lazyScriptsByConfig = /* @__PURE__ */ new Map();
|
|
45
|
+
const lazyDependencyKeys = /* @__PURE__ */ new Set();
|
|
46
|
+
for (const component of components) {
|
|
47
|
+
if (!component) continue;
|
|
48
|
+
const componentFile = component.config?.__eco?.file;
|
|
49
|
+
if (!componentFile) continue;
|
|
50
|
+
const stylesheetDependencyKeys = /* @__PURE__ */ new Set();
|
|
51
|
+
const scriptDependencyKeys = /* @__PURE__ */ new Set();
|
|
52
|
+
const modulesMap = /* @__PURE__ */ new Map();
|
|
53
|
+
const collect = (config) => {
|
|
54
|
+
if (!config) return;
|
|
55
|
+
const file = config.__eco?.file;
|
|
56
|
+
if (!file) return;
|
|
57
|
+
const dir = path.dirname(file);
|
|
58
|
+
const dependenciesConfig = config.dependencies;
|
|
59
|
+
const registerLazyScript = ({
|
|
60
|
+
lazy,
|
|
61
|
+
lazyKey,
|
|
62
|
+
fallbackUrl
|
|
63
|
+
}) => {
|
|
64
|
+
let grouped = lazyScriptsByConfig.get(config);
|
|
65
|
+
if (!grouped) {
|
|
66
|
+
grouped = /* @__PURE__ */ new Map();
|
|
67
|
+
lazyScriptsByConfig.set(config, grouped);
|
|
68
|
+
}
|
|
69
|
+
const triggerKey = getLazyTriggerKey(lazy);
|
|
70
|
+
const existing = grouped.get(triggerKey) ?? { lazy, scripts: [] };
|
|
71
|
+
existing.scripts.push({ lazyKey, fallbackUrl });
|
|
72
|
+
grouped.set(triggerKey, existing);
|
|
73
|
+
};
|
|
74
|
+
collectDeclaredAssetEntries({
|
|
75
|
+
stylesheetEntries: dependenciesConfig?.stylesheets ?? [],
|
|
76
|
+
scriptEntries: dependenciesConfig?.scripts ?? [],
|
|
77
|
+
componentDir: dir,
|
|
78
|
+
dependencies,
|
|
79
|
+
stylesheetDependencyKeys,
|
|
80
|
+
scriptDependencyKeys,
|
|
81
|
+
resolveDependencyPath,
|
|
82
|
+
createModuleScriptAttributes,
|
|
83
|
+
pushUniqueDependency,
|
|
84
|
+
getInvalidStylesheetEntryMessage: () => errors.invalidStylesheetEntry,
|
|
85
|
+
getInvalidScriptEntryMessage: () => errors.invalidScriptEntry
|
|
86
|
+
});
|
|
87
|
+
collectModuleDeclarations(modulesMap, dependenciesConfig?.modules, extractEcopagesVirtualImports(file));
|
|
88
|
+
collectLazyScriptEntries({
|
|
89
|
+
scriptEntries: dependenciesConfig?.scripts ?? [],
|
|
90
|
+
componentFile: file,
|
|
91
|
+
componentDir: dir,
|
|
92
|
+
integrationName,
|
|
93
|
+
dependencies,
|
|
94
|
+
lazyDependencyKeys,
|
|
95
|
+
registerLazyScript,
|
|
96
|
+
resolveDependencyPath,
|
|
97
|
+
resolveLazyScripts,
|
|
98
|
+
createModuleScriptAttributes,
|
|
99
|
+
createEcopagesJsxLazyEntryName,
|
|
100
|
+
pushUniqueDependency,
|
|
101
|
+
getLazyScriptMissingSrcMessage: () => errors.lazyScriptMissingSrc,
|
|
102
|
+
isEcopagesJsxIntegration
|
|
103
|
+
});
|
|
104
|
+
if (dependenciesConfig?.components) {
|
|
105
|
+
for (const nestedComponent of dependenciesConfig.components) {
|
|
106
|
+
if (nestedComponent?.config) {
|
|
107
|
+
collect(nestedComponent.config);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
collect(component.config);
|
|
113
|
+
dependencies.push(
|
|
114
|
+
...Array.from(modulesMap.entries()).map(([from, importsSet]) => {
|
|
115
|
+
const imports = importsSet ? Array.from(importsSet) : void 0;
|
|
116
|
+
return AssetFactory.createContentScript({
|
|
117
|
+
position: "head",
|
|
118
|
+
name: createModuleScriptName(from, imports),
|
|
119
|
+
content: imports && imports.length > 0 ? createNamedImportModuleSource(from, imports) : createNamespaceImportModuleSource(from),
|
|
120
|
+
attributes: createModuleScriptAttributes()
|
|
121
|
+
});
|
|
122
|
+
})
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
dependencies,
|
|
127
|
+
lazyScriptsByConfig
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export {
|
|
131
|
+
collectComponentDependencies
|
|
132
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { EcoComponentScriptEntry, EcoComponentStylesheetEntry } from '../../types/public-types.js';
|
|
2
|
+
import type { AssetDefinition } from '../../services/assets/asset-processing-service/index.js';
|
|
3
|
+
type CollectDeclaredAssetEntriesOptions = {
|
|
4
|
+
stylesheetEntries: Array<string | EcoComponentStylesheetEntry>;
|
|
5
|
+
scriptEntries: Array<string | EcoComponentScriptEntry>;
|
|
6
|
+
componentDir: string;
|
|
7
|
+
dependencies: AssetDefinition[];
|
|
8
|
+
stylesheetDependencyKeys: Set<string>;
|
|
9
|
+
scriptDependencyKeys: Set<string>;
|
|
10
|
+
resolveDependencyPath: (componentDir: string, pathUrl: string) => string;
|
|
11
|
+
createModuleScriptAttributes: (attributes?: Record<string, string>) => Record<string, string>;
|
|
12
|
+
pushUniqueDependency: (keys: Set<string>, key: string, dependencies: AssetDefinition[], dependency: AssetDefinition) => boolean;
|
|
13
|
+
getInvalidStylesheetEntryMessage: () => string;
|
|
14
|
+
getInvalidScriptEntryMessage: () => string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes non-lazy stylesheet and script declarations into asset definitions.
|
|
18
|
+
*
|
|
19
|
+
* Duplicate declarations are filtered through the provided key sets so callers can
|
|
20
|
+
* compose this helper into larger recursive collection passes without re-emitting
|
|
21
|
+
* the same asset multiple times.
|
|
22
|
+
*/
|
|
23
|
+
export declare function collectDeclaredAssetEntries(options: CollectDeclaredAssetEntriesOptions): void;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
|
|
2
|
+
function isDependencyEntryObject(entry) {
|
|
3
|
+
return typeof entry === "object" && entry !== null;
|
|
4
|
+
}
|
|
5
|
+
function getDependencyEntrySrc(entry) {
|
|
6
|
+
return isDependencyEntryObject(entry) ? entry.src : entry;
|
|
7
|
+
}
|
|
8
|
+
function getDependencyEntryContent(entry) {
|
|
9
|
+
return isDependencyEntryObject(entry) ? entry.content : void 0;
|
|
10
|
+
}
|
|
11
|
+
function getDependencyEntryAttributes(entry) {
|
|
12
|
+
return isDependencyEntryObject(entry) ? entry.attributes : void 0;
|
|
13
|
+
}
|
|
14
|
+
function collectDeclaredAssetEntries(options) {
|
|
15
|
+
const {
|
|
16
|
+
stylesheetEntries,
|
|
17
|
+
scriptEntries,
|
|
18
|
+
componentDir,
|
|
19
|
+
dependencies,
|
|
20
|
+
stylesheetDependencyKeys,
|
|
21
|
+
scriptDependencyKeys,
|
|
22
|
+
resolveDependencyPath,
|
|
23
|
+
createModuleScriptAttributes,
|
|
24
|
+
pushUniqueDependency,
|
|
25
|
+
getInvalidStylesheetEntryMessage,
|
|
26
|
+
getInvalidScriptEntryMessage
|
|
27
|
+
} = options;
|
|
28
|
+
for (const style of stylesheetEntries) {
|
|
29
|
+
const content = getDependencyEntryContent(style);
|
|
30
|
+
const src = getDependencyEntrySrc(style);
|
|
31
|
+
const attributes = getDependencyEntryAttributes(style);
|
|
32
|
+
if (content) {
|
|
33
|
+
const depKey2 = `style:content:${content}:${JSON.stringify(attributes ?? {})}`;
|
|
34
|
+
pushUniqueDependency(
|
|
35
|
+
stylesheetDependencyKeys,
|
|
36
|
+
depKey2,
|
|
37
|
+
dependencies,
|
|
38
|
+
AssetFactory.createContentStylesheet({
|
|
39
|
+
content,
|
|
40
|
+
position: "head",
|
|
41
|
+
attributes
|
|
42
|
+
})
|
|
43
|
+
);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (!src) {
|
|
47
|
+
throw new Error(getInvalidStylesheetEntryMessage());
|
|
48
|
+
}
|
|
49
|
+
const resolvedPath = resolveDependencyPath(componentDir, src);
|
|
50
|
+
const depKey = `style:file:${resolvedPath}:${JSON.stringify(attributes ?? {})}`;
|
|
51
|
+
pushUniqueDependency(
|
|
52
|
+
stylesheetDependencyKeys,
|
|
53
|
+
depKey,
|
|
54
|
+
dependencies,
|
|
55
|
+
AssetFactory.createFileStylesheet({
|
|
56
|
+
filepath: resolvedPath,
|
|
57
|
+
position: "head",
|
|
58
|
+
attributes: {
|
|
59
|
+
rel: "stylesheet",
|
|
60
|
+
...attributes
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
for (const script of scriptEntries) {
|
|
66
|
+
if (isDependencyEntryObject(script) && "lazy" in script && script.lazy) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const content = getDependencyEntryContent(script);
|
|
70
|
+
const src = getDependencyEntrySrc(script);
|
|
71
|
+
const attributes = getDependencyEntryAttributes(script);
|
|
72
|
+
if (content) {
|
|
73
|
+
const depKey2 = `script:content:${content}:${JSON.stringify(attributes ?? {})}`;
|
|
74
|
+
pushUniqueDependency(
|
|
75
|
+
scriptDependencyKeys,
|
|
76
|
+
depKey2,
|
|
77
|
+
dependencies,
|
|
78
|
+
AssetFactory.createInlineContentScript({
|
|
79
|
+
position: "head",
|
|
80
|
+
content,
|
|
81
|
+
bundle: false,
|
|
82
|
+
attributes
|
|
83
|
+
})
|
|
84
|
+
);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (!src) {
|
|
88
|
+
throw new Error(getInvalidScriptEntryMessage());
|
|
89
|
+
}
|
|
90
|
+
const resolvedPath = resolveDependencyPath(componentDir, src);
|
|
91
|
+
const depKey = `script:file:${resolvedPath}:${JSON.stringify(attributes ?? {})}`;
|
|
92
|
+
pushUniqueDependency(
|
|
93
|
+
scriptDependencyKeys,
|
|
94
|
+
depKey,
|
|
95
|
+
dependencies,
|
|
96
|
+
AssetFactory.createFileScript({
|
|
97
|
+
filepath: resolvedPath,
|
|
98
|
+
position: "head",
|
|
99
|
+
attributes: createModuleScriptAttributes(attributes)
|
|
100
|
+
})
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
collectDeclaredAssetEntries
|
|
106
|
+
};
|
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
|
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { rapidhash } from "../../utils/hash.js";
|
|
3
|
+
import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
|
|
4
|
+
import { buildResolvedLazyTriggers } from "./lazy-trigger-planning.js";
|
|
5
|
+
import { collectComponentDependencies } from "./component-dependency-collection.js";
|
|
6
|
+
import { packagePageDependencies } from "./page-dependency-bundling.js";
|
|
7
|
+
const DEPENDENCY_ERRORS = {
|
|
8
|
+
INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content",
|
|
9
|
+
INVALID_SCRIPT_ENTRY: "Invalid script dependency entry: expected src or content",
|
|
10
|
+
LAZY_SCRIPT_MISSING_SRC: "Lazy script dependency entry in dependencies.scripts requires a src value"
|
|
11
|
+
};
|
|
12
|
+
function resolveLazyScripts(appConfig, componentDir, scripts) {
|
|
13
|
+
const getSafeFileName = (filepath) => {
|
|
14
|
+
const EXTENSIONS_TO_JS = ["ts", "tsx"];
|
|
15
|
+
const safe = filepath.replace(new RegExp(`\\.(${EXTENSIONS_TO_JS.join("|")})$`), ".js");
|
|
16
|
+
return safe.startsWith("./") ? safe.slice(2) : safe;
|
|
17
|
+
};
|
|
18
|
+
const baseDir = componentDir.split(appConfig.srcDir)[1] ?? "";
|
|
19
|
+
const resolvedPaths = scripts.map((script) => {
|
|
20
|
+
const relativePath = [AssetFactory.RESOLVED_ASSETS_DIR, baseDir, getSafeFileName(script)].filter(Boolean).join("/").replace(/\/+/g, "/");
|
|
21
|
+
return `/${relativePath.replace(/^\/+/, "")}`;
|
|
22
|
+
});
|
|
23
|
+
return resolvedPaths.join(",");
|
|
24
|
+
}
|
|
25
|
+
const ECOPAGES_JSX_INTEGRATION_NAME = "ecopages-jsx";
|
|
26
|
+
function isEcopagesJsxIntegration(integrationName) {
|
|
27
|
+
return integrationName === ECOPAGES_JSX_INTEGRATION_NAME;
|
|
28
|
+
}
|
|
29
|
+
function createEcopagesJsxLazyEntryName(integrationName, key) {
|
|
30
|
+
return `ecopages-${integrationName}-lazy-${rapidhash(key).toString(16)}`;
|
|
31
|
+
}
|
|
32
|
+
class DependencyResolverService {
|
|
33
|
+
appConfig;
|
|
34
|
+
assetProcessingService;
|
|
35
|
+
/**
|
|
36
|
+
* Creates the dependency resolver used by route and component rendering.
|
|
37
|
+
*
|
|
38
|
+
* @remarks
|
|
39
|
+
* The resolver stays intentionally separate from HTML rendering so component
|
|
40
|
+
* dependency collection, lazy trigger grouping, and processed-asset generation
|
|
41
|
+
* can evolve without changing renderer implementations.
|
|
42
|
+
*/
|
|
43
|
+
constructor(appConfig, assetProcessingService) {
|
|
44
|
+
this.appConfig = appConfig;
|
|
45
|
+
this.assetProcessingService = assetProcessingService;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolves one dependency path relative to the component that declared it.
|
|
49
|
+
*/
|
|
50
|
+
resolveDependencyPath(componentDir, pathUrl) {
|
|
51
|
+
return path.join(componentDir, pathUrl);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Maps lazy script source entries to deterministic fallback public URLs
|
|
55
|
+
* used when bundling output URLs are unavailable.
|
|
56
|
+
*/
|
|
57
|
+
resolveLazyScripts(componentDir, scripts) {
|
|
58
|
+
return resolveLazyScripts(this.appConfig, componentDir, scripts);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Collects and processes component dependencies (styles, scripts, modules, lazy scripts).
|
|
62
|
+
* Lazy dependencies are always resolved into global-injector trigger maps.
|
|
63
|
+
*/
|
|
64
|
+
async processComponentDependencies(components, integrationName) {
|
|
65
|
+
if (!this.assetProcessingService?.processDependencies) return [];
|
|
66
|
+
const { dependencies, lazyScriptsByConfig } = collectComponentDependencies({
|
|
67
|
+
components,
|
|
68
|
+
integrationName,
|
|
69
|
+
resolveLazyScripts: (componentDir, scripts) => this.resolveLazyScripts(componentDir, scripts),
|
|
70
|
+
createEcopagesJsxLazyEntryName,
|
|
71
|
+
isEcopagesJsxIntegration,
|
|
72
|
+
errors: {
|
|
73
|
+
invalidStylesheetEntry: DEPENDENCY_ERRORS.INVALID_STYLESHEET_ENTRY,
|
|
74
|
+
invalidScriptEntry: DEPENDENCY_ERRORS.INVALID_SCRIPT_ENTRY,
|
|
75
|
+
lazyScriptMissingSrc: DEPENDENCY_ERRORS.LAZY_SCRIPT_MISSING_SRC
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const packagedDependencies = packagePageDependencies(dependencies, integrationName);
|
|
79
|
+
const hasLazyDependencies = packagedDependencies.some(
|
|
80
|
+
(dep) => dep.kind === "script" && dep.excludeFromHtml === true
|
|
81
|
+
);
|
|
82
|
+
const processedDependencies = await this.assetProcessingService.processDependencies(
|
|
83
|
+
packagedDependencies,
|
|
84
|
+
integrationName
|
|
85
|
+
);
|
|
86
|
+
const lazyKeyToOutputUrl = /* @__PURE__ */ new Map();
|
|
87
|
+
for (const dependency of processedDependencies) {
|
|
88
|
+
if (dependency.kind === "script" && dependency.srcUrl) {
|
|
89
|
+
const lazyKey = dependency.attributes?.["data-eco-lazy-key"];
|
|
90
|
+
if (lazyKey) {
|
|
91
|
+
lazyKeyToOutputUrl.set(lazyKey, dependency.srcUrl);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const [config, lazyGroupsMap] of lazyScriptsByConfig.entries()) {
|
|
96
|
+
const rawGroups = [];
|
|
97
|
+
for (const group of lazyGroupsMap.values()) {
|
|
98
|
+
const resolvedUrls = group.scripts.map(({ lazyKey, fallbackUrl }) => lazyKeyToOutputUrl.get(lazyKey) ?? fallbackUrl).filter((url) => Boolean(url && url.length > 0));
|
|
99
|
+
if (resolvedUrls.length === 0) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
rawGroups.push({ lazy: group.lazy, scripts: Array.from(new Set(resolvedUrls)) });
|
|
103
|
+
}
|
|
104
|
+
if (hasLazyDependencies) {
|
|
105
|
+
config._resolvedLazyTriggers = buildResolvedLazyTriggers(config, rawGroups);
|
|
106
|
+
config._resolvedLazyScripts = void 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return processedDependencies;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export {
|
|
113
|
+
DEPENDENCY_ERRORS,
|
|
114
|
+
DependencyResolverService
|
|
115
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type EcopagesVirtualImport = {
|
|
2
|
+
from: string;
|
|
3
|
+
imports: string[] | undefined;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Extracts runtime `ecopages:` virtual-module imports from a component source file.
|
|
7
|
+
*
|
|
8
|
+
* Type-only imports are skipped and bare namespace imports are represented by an
|
|
9
|
+
* `undefined` import list so downstream module generation can preserve that shape.
|
|
10
|
+
*/
|
|
11
|
+
export declare function extractEcopagesVirtualImports(file: string): EcopagesVirtualImport[];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { parseSync } from "oxc-parser";
|
|
3
|
+
function extractEcopagesVirtualImports(file) {
|
|
4
|
+
let source;
|
|
5
|
+
try {
|
|
6
|
+
source = readFileSync(file, "utf-8");
|
|
7
|
+
} catch {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
let result;
|
|
11
|
+
try {
|
|
12
|
+
result = parseSync(file, source, { sourceType: "module" });
|
|
13
|
+
} catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const found = /* @__PURE__ */ new Map();
|
|
17
|
+
for (const node of result.program.body ?? []) {
|
|
18
|
+
if (node.type !== "ImportDeclaration") continue;
|
|
19
|
+
if (node.importKind === "type") continue;
|
|
20
|
+
const specifier = node.source?.value ?? "";
|
|
21
|
+
if (!specifier.startsWith("ecopages:")) continue;
|
|
22
|
+
if (found.get(specifier) === null) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const namedImports = [];
|
|
26
|
+
for (const spec of node.specifiers ?? []) {
|
|
27
|
+
if (spec.type === "ImportSpecifier") {
|
|
28
|
+
let importedName = spec.local?.name;
|
|
29
|
+
if (spec.imported?.type === "Identifier") {
|
|
30
|
+
importedName = spec.imported.name;
|
|
31
|
+
} else if (spec.imported?.type === "Literal") {
|
|
32
|
+
importedName = spec.imported.value;
|
|
33
|
+
}
|
|
34
|
+
namedImports.push(importedName);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (namedImports.length === 0) {
|
|
38
|
+
found.set(specifier, null);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const existing = found.get(specifier);
|
|
42
|
+
if (!existing) {
|
|
43
|
+
found.set(specifier, new Set(namedImports));
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
for (const imported of namedImports) {
|
|
47
|
+
existing.add(imported);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return Array.from(found.entries()).map(([from, importsSet]) => ({
|
|
51
|
+
from,
|
|
52
|
+
imports: importsSet ? Array.from(importsSet) : void 0
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
extractEcopagesVirtualImports
|
|
57
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { DependencyLazyTrigger, EcoComponentScriptEntry } from '../../types/public-types.js';
|
|
2
|
+
import type { AssetDefinition } from '../../services/assets/asset-processing-service/index.js';
|
|
3
|
+
type LazyScriptRef = {
|
|
4
|
+
lazyKey: string;
|
|
5
|
+
fallbackUrl?: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Lazy scripts grouped by one trigger declaration.
|
|
9
|
+
*/
|
|
10
|
+
export type LazyGroup = {
|
|
11
|
+
lazy: DependencyLazyTrigger;
|
|
12
|
+
scripts: LazyScriptRef[];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Callback used to record one normalized lazy-script registration.
|
|
16
|
+
*/
|
|
17
|
+
export type RegisterLazyScript = (input: {
|
|
18
|
+
lazy: DependencyLazyTrigger;
|
|
19
|
+
lazyKey: string;
|
|
20
|
+
fallbackUrl?: string;
|
|
21
|
+
}) => void;
|
|
22
|
+
type CollectLazyEntriesOptions = {
|
|
23
|
+
scriptEntries: Array<string | EcoComponentScriptEntry>;
|
|
24
|
+
componentFile: string;
|
|
25
|
+
componentDir: string;
|
|
26
|
+
integrationName: string;
|
|
27
|
+
dependencies: AssetDefinition[];
|
|
28
|
+
lazyDependencyKeys: Set<string>;
|
|
29
|
+
registerLazyScript: RegisterLazyScript;
|
|
30
|
+
resolveDependencyPath: (componentDir: string, pathUrl: string) => string;
|
|
31
|
+
resolveLazyScripts: (componentDir: string, scripts: string[]) => string;
|
|
32
|
+
createModuleScriptAttributes: (attributes?: Record<string, string>) => Record<string, string>;
|
|
33
|
+
createEcopagesJsxLazyEntryName: (integrationName: string, key: string) => string;
|
|
34
|
+
pushUniqueDependency: (keys: Set<string>, key: string, dependencies: AssetDefinition[], dependency: AssetDefinition) => boolean;
|
|
35
|
+
getLazyScriptMissingSrcMessage: () => string;
|
|
36
|
+
isEcopagesJsxIntegration: (integrationName: string) => boolean;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Collects lazy script dependency entries and emits their hidden bundle inputs.
|
|
40
|
+
*
|
|
41
|
+
* This helper also reports the trigger-to-script relationship back to the caller so
|
|
42
|
+
* later stages can build the lazy-trigger manifest without reparsing dependency config.
|
|
43
|
+
*/
|
|
44
|
+
export declare function collectLazyScriptEntries(options: CollectLazyEntriesOptions): void;
|
|
45
|
+
export {};
|