@ecopages/core 0.2.0-beta.2 → 0.2.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +163 -3
- package/src/adapters/abstract/application-adapter.d.ts +104 -5
- package/src/adapters/abstract/application-adapter.js +125 -1
- package/src/adapters/abstract/server-adapter.d.ts +6 -2
- package/src/adapters/abstract/ws-pattern-matcher.d.ts +60 -0
- package/src/adapters/abstract/ws-pattern-matcher.js +61 -0
- package/src/adapters/bun/client-bridge.d.ts +1 -0
- package/src/adapters/bun/client-bridge.js +3 -0
- package/src/adapters/bun/create-app.d.ts +6 -4
- package/src/adapters/bun/create-app.js +65 -43
- package/src/adapters/bun/hmr-manager.d.ts +2 -1
- package/src/adapters/bun/hmr-manager.js +2 -2
- package/src/adapters/bun/server-adapter.d.ts +90 -22
- package/src/adapters/bun/server-adapter.js +265 -84
- package/src/adapters/bun/static-preview-host.js +25 -20
- package/src/adapters/create-app.d.ts +13 -11
- package/src/adapters/create-app.js +2 -51
- package/src/adapters/index.d.ts +1 -1
- package/src/adapters/index.js +1 -2
- package/src/adapters/node/create-app.d.ts +5 -1
- package/src/adapters/node/create-app.js +51 -12
- package/src/adapters/node/node-client-bridge.d.ts +1 -0
- package/src/adapters/node/node-client-bridge.js +3 -0
- package/src/adapters/node/node-hmr-manager.d.ts +2 -1
- package/src/adapters/node/node-hmr-manager.js +2 -2
- package/src/adapters/node/server-adapter-dependencies.js +4 -0
- package/src/adapters/node/server-adapter.d.ts +62 -20
- package/src/adapters/node/server-adapter.js +161 -131
- package/src/adapters/node/static-content-server.d.ts +1 -0
- package/src/adapters/node/static-content-server.js +10 -2
- package/src/adapters/node/static-preview-host.js +27 -12
- package/src/adapters/shared/bun-user-websocket-lifecycle.d.ts +22 -0
- package/src/adapters/shared/bun-user-websocket-lifecycle.js +96 -0
- package/src/adapters/shared/copy-runtime-public-dir.d.ts +6 -0
- package/src/adapters/shared/copy-runtime-public-dir.js +24 -0
- package/src/adapters/shared/fs-server-response-matcher.d.ts +2 -0
- package/src/adapters/shared/fs-server-response-matcher.js +40 -18
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -2
- package/src/adapters/shared/hmr-entrypoint-registrar.js +3 -26
- package/src/adapters/shared/hmr-html-response.d.ts +1 -1
- package/src/adapters/shared/hmr-html-response.js +4 -1
- package/src/adapters/shared/node-http-websocket-upgrades.d.ts +21 -0
- package/src/adapters/shared/node-http-websocket-upgrades.js +100 -0
- package/src/adapters/shared/port-manager.d.ts +116 -0
- package/src/adapters/shared/port-manager.js +196 -0
- package/src/adapters/shared/runtime-app-bootstrap.d.ts +2 -1
- package/src/adapters/shared/runtime-app-bootstrap.js +3 -6
- package/src/adapters/shared/runtime-server-lifecycle.d.ts +38 -0
- package/src/adapters/shared/runtime-server-lifecycle.js +43 -0
- package/src/adapters/shared/server-adapter.d.ts +2 -1
- package/src/adapters/shared/server-adapter.js +13 -6
- package/src/adapters/shared/server-route-handler.d.ts +4 -1
- package/src/adapters/shared/server-route-handler.js +5 -2
- package/src/adapters/shared/server-static-builder.d.ts +23 -32
- package/src/adapters/shared/server-static-builder.js +97 -73
- package/src/adapters/shared/shared-hmr-manager.d.ts +28 -0
- package/src/adapters/shared/shared-hmr-manager.js +119 -9
- package/src/adapters/shared/static-preview-host.d.ts +5 -0
- package/src/adapters/shared/websocket-lifecycle.d.ts +24 -0
- package/src/adapters/shared/websocket-lifecycle.js +55 -0
- package/src/build/README.md +77 -14
- package/src/build/app-build-manifest-runtime.d.ts +10 -0
- package/src/build/app-build-manifest-runtime.js +90 -0
- package/src/build/build-adapter.d.ts +17 -319
- package/src/build/build-adapter.js +28 -94
- package/src/build/build-contracts.d.ts +97 -0
- package/src/build/build-contracts.js +0 -0
- package/src/build/build-input-fingerprint.d.ts +28 -0
- package/src/build/build-input-fingerprint.js +31 -0
- package/src/build/build-profile-options.d.ts +7 -0
- package/src/build/build-profile-options.js +37 -0
- package/src/build/build-runtime.d.ts +24 -0
- package/src/build/build-runtime.js +65 -0
- package/src/build/deduping-build-executor.d.ts +28 -0
- package/src/build/deduping-build-executor.js +56 -0
- package/src/build/jsx-ownership-plugins.d.ts +24 -0
- package/src/build/jsx-ownership-plugins.js +41 -0
- package/src/build/pages-unified-graph-build.d.ts +31 -0
- package/src/build/pages-unified-graph-build.js +206 -0
- package/src/build/parallel-build-executor.d.ts +21 -0
- package/src/build/parallel-build-executor.js +52 -0
- package/src/build/production-build-cache.d.ts +20 -0
- package/src/build/production-build-cache.js +63 -0
- package/src/build/rolldown-adapter-helpers.d.ts +3 -6
- package/src/build/rolldown-adapter-helpers.js +71 -6
- package/src/build/rolldown-build-adapter.d.ts +2 -6
- package/src/build/rolldown-build-adapter.js +3 -3
- package/src/build/rolldown-build-invocation-metrics.d.ts +12 -0
- package/src/build/rolldown-build-invocation-metrics.js +43 -0
- package/src/build/rolldown-plugin-bridge.d.ts +15 -1
- package/src/build/rolldown-plugin-bridge.js +20 -5
- package/src/build/rolldown-source-transform-pass.d.ts +15 -0
- package/src/build/rolldown-source-transform-pass.js +58 -0
- package/src/build/runtime-build-executor.d.ts +8 -15
- package/src/build/runtime-build-executor.js +12 -15
- package/src/build/runtime-build-output-normalizer.d.ts +7 -0
- package/src/build/runtime-build-output-normalizer.js +94 -2
- package/src/build/server-entry-build-cache.d.ts +44 -0
- package/src/build/server-entry-build-cache.js +161 -0
- package/src/client/navigation-scripts/classification.d.ts +16 -0
- package/src/client/navigation-scripts/classification.js +41 -0
- package/src/client/navigation-scripts/index.d.ts +3 -0
- package/src/client/navigation-scripts/index.js +23 -0
- package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
- package/src/client/navigation-scripts/registry.d.ts +11 -0
- package/src/client/navigation-scripts/registry.js +12 -0
- package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
- package/src/client/navigation-scripts/rerun-queue.js +73 -0
- package/src/client/scroll.d.ts +17 -0
- package/src/client/scroll.js +25 -0
- package/src/client/scroll.test.browser.js +37 -0
- package/src/client/view-transitions.d.ts +16 -0
- package/src/client/view-transitions.js +63 -0
- package/src/config/config-builder.d.ts +12 -7
- package/src/config/config-builder.js +12 -9
- package/src/dev/client-bridge-registry.d.ts +5 -0
- package/src/dev/client-bridge-registry.js +15 -0
- package/src/dev/dev-client-ownership.d.ts +7 -0
- package/src/dev/dev-client-ownership.js +6 -0
- package/src/dev/hmr-manager-registry.d.ts +8 -0
- package/src/dev/hmr-manager-registry.js +15 -0
- package/src/dev/host-runtime.d.ts +3 -0
- package/src/dev/host-runtime.js +7 -0
- package/src/dev/runtime-server-started-message.d.ts +2 -0
- package/src/dev/runtime-server-started-message.js +6 -0
- package/src/eco/README.md +11 -0
- package/src/eco/eco-declared-component.d.ts +14 -0
- package/src/eco/eco-declared-component.js +16 -0
- package/src/eco/eco.browser.js +5 -6
- package/src/eco/eco.js +5 -6
- package/src/eco/eco.types.d.ts +2 -2
- package/src/eco/page-layout-normalization.d.ts +21 -0
- package/src/eco/page-layout-normalization.js +59 -0
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +7 -1
- package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
- package/src/errors/undeclared-component-dependency-error.js +17 -0
- package/src/hmr/client/hmr-runtime.js +5 -2
- package/src/hmr/hmr-entrypoint-output.d.ts +28 -0
- package/src/hmr/hmr-entrypoint-output.js +58 -0
- package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -0
- package/src/hmr/strategies/js-hmr-strategy.js +68 -18
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
- package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
- package/src/integrations/ghtml/ghtml-renderer.js +2 -51
- package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
- package/src/integrations/ghtml/ghtml.plugin.js +7 -14
- package/src/plugins/define-integration.d.ts +26 -0
- package/src/plugins/define-integration.js +19 -0
- package/src/plugins/eco-component-meta-plugin.js +5 -8
- package/src/plugins/foreign-jsx-override-plugin.js +4 -6
- package/src/plugins/integration-plugin.d.ts +19 -9
- package/src/plugins/integration-plugin.js +7 -4
- package/src/plugins/jsx-import-source.utils.d.ts +8 -0
- package/src/plugins/jsx-import-source.utils.js +26 -0
- package/src/plugins/processor.d.ts +19 -4
- package/src/plugins/processor.js +22 -4
- package/src/plugins/source-transform.d.ts +31 -0
- package/src/plugins/source-transform.js +23 -1
- package/src/route-renderer/GRAPH.md +8 -8
- package/src/route-renderer/README.md +30 -28
- package/src/route-renderer/orchestration/component-graph-collectors.d.ts +10 -0
- package/src/route-renderer/orchestration/component-graph-collectors.js +143 -0
- package/src/route-renderer/orchestration/component-graph.d.ts +36 -0
- package/src/route-renderer/orchestration/component-graph.js +98 -0
- package/src/route-renderer/orchestration/component-render-context.d.ts +3 -10
- package/src/route-renderer/orchestration/component-render-context.js +3 -1
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +1 -18
- package/src/route-renderer/orchestration/declared-ownership-graph.js +5 -31
- package/src/route-renderer/orchestration/document-shell-render.service.d.ts +90 -0
- package/src/route-renderer/orchestration/document-shell-render.service.js +120 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +59 -29
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +164 -35
- package/src/route-renderer/orchestration/global-injector-assets.service.d.ts +7 -0
- package/src/route-renderer/orchestration/global-injector-assets.service.js +32 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +18 -54
- package/src/route-renderer/orchestration/integration-renderer.js +113 -195
- package/src/route-renderer/orchestration/integration-route-render-adapter.d.ts +38 -0
- package/src/route-renderer/orchestration/integration-route-render-adapter.js +27 -0
- package/src/route-renderer/orchestration/layout-shell-props.service.d.ts +20 -0
- package/src/route-renderer/orchestration/layout-shell-props.service.js +31 -0
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +5 -0
- package/src/route-renderer/orchestration/ownership-validation.service.js +29 -1
- package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.d.ts +9 -0
- package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.js +7 -0
- package/src/route-renderer/orchestration/page-browser-graph.service.d.ts +25 -0
- package/src/route-renderer/orchestration/page-browser-graph.service.js +174 -0
- package/src/route-renderer/orchestration/render-output.utils.d.ts +2 -0
- package/src/route-renderer/orchestration/render-output.utils.js +4 -0
- package/src/route-renderer/orchestration/route-html-finalization.service.d.ts +17 -0
- package/src/route-renderer/orchestration/route-html-finalization.service.js +26 -0
- package/src/route-renderer/orchestration/route-prepared-options.builder.d.ts +26 -0
- package/src/route-renderer/orchestration/route-prepared-options.builder.js +54 -0
- package/src/route-renderer/orchestration/route-prepared-options.utils.d.ts +4 -0
- package/src/route-renderer/orchestration/route-prepared-options.utils.js +33 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +8 -39
- package/src/route-renderer/orchestration/route-render-orchestrator.js +53 -461
- package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
- package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
- package/src/router/client/link-intent.d.ts +11 -21
- package/src/router/client/link-intent.js +10 -0
- package/src/router/client/link-intent.test.browser.js +12 -1
- package/src/router/client/link-navigation-policy.d.ts +45 -0
- package/src/router/client/link-navigation-policy.js +101 -0
- package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
- package/src/router/client/link-navigation-policy.test.browser.js +92 -0
- package/src/router/client/navigation-coordinator.d.ts +1 -1
- package/src/router/client/navigation-coordinator.js +12 -2
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +27 -7
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +36 -14
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
- package/src/services/assets/browser-bundle.service.d.ts +3 -1
- package/src/services/assets/browser-bundle.service.js +17 -5
- package/src/services/html/html-transformer.service.d.ts +1 -1
- package/src/services/html/html-transformer.service.js +4 -4
- package/src/services/invalidation/development-invalidation.service.d.ts +20 -2
- package/src/services/invalidation/development-invalidation.service.js +56 -2
- package/src/services/module-loading/README.md +49 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +5 -17
- package/src/services/module-loading/page-module-import.service.d.ts +5 -1
- package/src/services/module-loading/page-module-import.service.js +97 -45
- package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
- package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
- package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
- package/src/services/module-loading/route-module-build-cache.js +38 -0
- package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
- package/src/services/module-loading/route-module-build-cache.store.js +207 -0
- package/src/services/module-loading/route-module-build-manifest.d.ts +61 -0
- package/src/services/module-loading/route-module-build-manifest.js +116 -0
- package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
- package/src/services/module-loading/route-module-dependency-hasher.js +121 -0
- package/src/services/module-loading/server-module-transpiler.service.js +1 -1
- package/src/static-site-generator/README.md +33 -0
- package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
- package/src/static-site-generator/static-build-invalidation.js +59 -0
- package/src/static-site-generator/static-export-context.d.ts +22 -0
- package/src/static-site-generator/static-export-context.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +17 -20
- package/src/static-site-generator/static-site-generator.js +188 -85
- package/src/types/internal-types.d.ts +16 -9
- package/src/types/public-types.d.ts +138 -26
- package/src/utils/parse-cli-args.d.ts +2 -0
- package/src/utils/parse-cli-args.js +6 -0
- package/src/utils/server-utils.module.d.ts +3 -2
- package/src/utils/server-utils.module.js +5 -6
- package/src/utils/static-file-extensions.d.ts +12 -0
- package/src/utils/static-file-extensions.js +48 -0
- package/src/watchers/project-watcher-ignore.d.ts +11 -0
- package/src/watchers/project-watcher-ignore.js +16 -0
- package/src/watchers/project-watcher.d.ts +25 -2
- package/src/watchers/project-watcher.js +130 -23
- package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
- package/src/build/rolldown-dev-build-adapter.js +0 -166
- package/src/hmr/hmr.postcss.test.e2e.js +0 -31
- package/src/hmr/hmr.test.e2e.js +0 -43
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
- package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
- /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
- /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../types/internal-types.js';
|
|
2
|
+
export declare function createJsxImportSourcePragma(jsxImportSource: string): string;
|
|
3
|
+
export declare function prependJsxImportSourceIfMissing(code: string, jsxImportSource: string | undefined): string;
|
|
4
|
+
export declare function isJsxSourceExtension(extension: string): boolean;
|
|
5
|
+
export declare function filterJsxSourceExtensions(extensions: string[]): string[];
|
|
6
|
+
export declare function collectJsxExtensions(integrations: NonNullable<EcoPagesAppConfig['integrations']>, options?: {
|
|
7
|
+
excludeIntegrationName?: string;
|
|
8
|
+
}): string[];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
function createJsxImportSourcePragma(jsxImportSource) {
|
|
2
|
+
return `/** @jsxImportSource ${jsxImportSource} */
|
|
3
|
+
`;
|
|
4
|
+
}
|
|
5
|
+
function prependJsxImportSourceIfMissing(code, jsxImportSource) {
|
|
6
|
+
if (!jsxImportSource || code.includes("@jsxImportSource")) {
|
|
7
|
+
return code;
|
|
8
|
+
}
|
|
9
|
+
return createJsxImportSourcePragma(jsxImportSource) + code;
|
|
10
|
+
}
|
|
11
|
+
function isJsxSourceExtension(extension) {
|
|
12
|
+
return extension.endsWith(".tsx") || extension.endsWith(".jsx");
|
|
13
|
+
}
|
|
14
|
+
function filterJsxSourceExtensions(extensions) {
|
|
15
|
+
return extensions.filter(isJsxSourceExtension);
|
|
16
|
+
}
|
|
17
|
+
function collectJsxExtensions(integrations, options) {
|
|
18
|
+
return integrations.filter((integration) => integration.jsxImportSource).filter((integration) => integration.name !== options?.excludeIntegrationName).flatMap((integration) => filterJsxSourceExtensions(integration.extensions));
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
collectJsxExtensions,
|
|
22
|
+
createJsxImportSourcePragma,
|
|
23
|
+
filterJsxSourceExtensions,
|
|
24
|
+
isJsxSourceExtension,
|
|
25
|
+
prependJsxImportSourceIfMissing
|
|
26
|
+
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { EcoBuildPlugin } from '../build/build-types.js';
|
|
2
2
|
import type { EcoPagesAppConfig, IClientBridge } from '../types/internal-types.js';
|
|
3
|
-
import type { AssetDefinition } from '../services/assets/asset-processing-service/assets.types.js';
|
|
4
3
|
import type { RuntimeCapabilityDeclaration } from './runtime-capability.js';
|
|
5
4
|
export type { RuntimeCapabilityDeclaration, RuntimeCapabilityTag } from './runtime-capability.js';
|
|
6
5
|
export type { EcoBuildLoader, EcoBuildOnLoadArgs, EcoBuildOnLoadResult, EcoBuildOnResolveArgs, EcoBuildOnResolveResult, EcoBuildPlugin, EcoBuildPluginBuilder, } from '../build/build-types.js';
|
|
@@ -59,7 +58,6 @@ export interface ProcessorContext {
|
|
|
59
58
|
*/
|
|
60
59
|
export declare abstract class Processor<TOptions = Record<string, unknown>> {
|
|
61
60
|
readonly name: string;
|
|
62
|
-
protected dependencies: AssetDefinition[];
|
|
63
61
|
protected context?: ProcessorContext;
|
|
64
62
|
protected options?: TOptions;
|
|
65
63
|
protected watchConfig?: ProcessorWatchConfig;
|
|
@@ -80,14 +78,31 @@ export declare abstract class Processor<TOptions = Record<string, unknown>> {
|
|
|
80
78
|
* warming or watcher registration should stay in `setup()`.
|
|
81
79
|
*/
|
|
82
80
|
prepareBuildContributions(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Reports whether this processor's build inputs changed since the last
|
|
83
|
+
* incremental static build.
|
|
84
|
+
*
|
|
85
|
+
* @remarks
|
|
86
|
+
* No shipped processor overrides this today. Integrations and processors can
|
|
87
|
+
* opt in when they own build inputs that should invalidate incremental static
|
|
88
|
+
* exports without a full rebuild.
|
|
89
|
+
*/
|
|
90
|
+
didChange(): boolean;
|
|
83
91
|
abstract setup(): Promise<void>;
|
|
84
|
-
abstract teardown(): Promise<void>;
|
|
85
92
|
abstract process(input: unknown, filePath?: string): Promise<unknown>;
|
|
93
|
+
/**
|
|
94
|
+
* Releases runtime resources owned by the processor.
|
|
95
|
+
*
|
|
96
|
+
* @remarks
|
|
97
|
+
* Core does not call this hook today. Override only when a processor owns
|
|
98
|
+
* watchers, compiler handles, or other resources that outlive individual
|
|
99
|
+
* requests.
|
|
100
|
+
*/
|
|
101
|
+
teardown(): Promise<void>;
|
|
86
102
|
protected getCachePath(key: string): string;
|
|
87
103
|
protected readCache<T>(key: string): Promise<T | null>;
|
|
88
104
|
protected writeCache<T>(key: string, data: T): Promise<void>;
|
|
89
105
|
getWatchConfig(): ProcessorWatchConfig | undefined;
|
|
90
|
-
getDependencies(): AssetDefinition[];
|
|
91
106
|
getName(): string;
|
|
92
107
|
getAssetCapabilities(): ProcessorAssetCapability[];
|
|
93
108
|
matchesFileFilter(_filepath: string): boolean;
|
package/src/plugins/processor.js
CHANGED
|
@@ -16,7 +16,6 @@ function resolveGeneratedPath(type, options) {
|
|
|
16
16
|
}
|
|
17
17
|
class Processor {
|
|
18
18
|
name;
|
|
19
|
-
dependencies = [];
|
|
20
19
|
context;
|
|
21
20
|
options;
|
|
22
21
|
watchConfig;
|
|
@@ -54,6 +53,28 @@ class Processor {
|
|
|
54
53
|
*/
|
|
55
54
|
async prepareBuildContributions() {
|
|
56
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Reports whether this processor's build inputs changed since the last
|
|
58
|
+
* incremental static build.
|
|
59
|
+
*
|
|
60
|
+
* @remarks
|
|
61
|
+
* No shipped processor overrides this today. Integrations and processors can
|
|
62
|
+
* opt in when they own build inputs that should invalidate incremental static
|
|
63
|
+
* exports without a full rebuild.
|
|
64
|
+
*/
|
|
65
|
+
didChange() {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Releases runtime resources owned by the processor.
|
|
70
|
+
*
|
|
71
|
+
* @remarks
|
|
72
|
+
* Core does not call this hook today. Override only when a processor owns
|
|
73
|
+
* watchers, compiler handles, or other resources that outlive individual
|
|
74
|
+
* requests.
|
|
75
|
+
*/
|
|
76
|
+
async teardown() {
|
|
77
|
+
}
|
|
57
78
|
getCachePath(key) {
|
|
58
79
|
return `${this.context?.cache}/${key}`;
|
|
59
80
|
}
|
|
@@ -76,9 +97,6 @@ class Processor {
|
|
|
76
97
|
getWatchConfig() {
|
|
77
98
|
return this.watchConfig;
|
|
78
99
|
}
|
|
79
|
-
getDependencies() {
|
|
80
|
-
return this.dependencies;
|
|
81
|
-
}
|
|
82
100
|
getName() {
|
|
83
101
|
return this.name;
|
|
84
102
|
}
|
|
@@ -4,9 +4,21 @@ export interface EcoSourceTransformResult {
|
|
|
4
4
|
code: string;
|
|
5
5
|
map?: unknown;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Bundler-neutral source transform registered on {@link EcoPagesAppConfig.sourceTransforms}.
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* Prefer this shape over a competing {@link EcoBuildPlugin} `onLoad` handler when
|
|
12
|
+
* the transform only rewrites module source. Browser/HMR builds run source
|
|
13
|
+
* transforms after first-wins `onLoad` plugins, so metadata injection and similar
|
|
14
|
+
* passes still run on rewritten output from boundary/runtime plugins.
|
|
15
|
+
*/
|
|
7
16
|
export interface EcoSourceTransform {
|
|
17
|
+
/** Stable transform name. Also used to dedupe loader plugins in browser builds. */
|
|
8
18
|
name: string;
|
|
19
|
+
/** File-path filter tested against {@link normalizeTransformId | normalized ids}. */
|
|
9
20
|
filter: RegExp;
|
|
21
|
+
/** Runs before default transforms, or after them when set to `post`. */
|
|
10
22
|
enforce?: 'pre' | 'post';
|
|
11
23
|
transform(code: string, id: string): EcoSourceTransformResult | string | undefined;
|
|
12
24
|
}
|
|
@@ -24,8 +36,27 @@ export declare function normalizeTransformId(id: string): string;
|
|
|
24
36
|
* Applies one source transform if the normalized id matches its filter.
|
|
25
37
|
*/
|
|
26
38
|
export declare function applySourceTransform(transform: EcoSourceTransform, code: string, id: string): EcoSourceTransformResult | string | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Applies app-owned source transforms in deterministic `pre` → default → `post` order.
|
|
41
|
+
*
|
|
42
|
+
* @remarks
|
|
43
|
+
* Used by the Rolldown plugin bridge after `onLoad` plugins produce final module
|
|
44
|
+
* contents. Transforms that do not match `filter` are skipped; matching transforms
|
|
45
|
+
* are chained left-to-right on the current source string.
|
|
46
|
+
*
|
|
47
|
+
* @param transforms - App-owned transforms, usually from {@link getAppSourceTransforms}.
|
|
48
|
+
* @param code - Current module source.
|
|
49
|
+
* @param id - Module id forwarded to each transform after query/hash normalization.
|
|
50
|
+
* @returns The transformed source, or the original `code` when no transform matches.
|
|
51
|
+
*/
|
|
52
|
+
export declare function applySourceTransforms(transforms: readonly EcoSourceTransform[], code: string, id: string): string;
|
|
27
53
|
/**
|
|
28
54
|
* Adapts a source transform into the existing Ecopages build-plugin contract.
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
* Server-oriented builds and loader registration still use this adapter.
|
|
58
|
+
* Browser/HMR builds should register the transform in `appConfig.sourceTransforms`
|
|
59
|
+
* instead so the Rolldown bridge can run it after competing `onLoad` plugins.
|
|
29
60
|
*/
|
|
30
61
|
export declare function createEcoBuildPluginFromSourceTransform(transform: EcoSourceTransform): EcoBuildPlugin;
|
|
31
62
|
/**
|
|
@@ -13,6 +13,27 @@ function applySourceTransform(transform, code, id) {
|
|
|
13
13
|
}
|
|
14
14
|
return transform.transform(code, normalizedId);
|
|
15
15
|
}
|
|
16
|
+
const SOURCE_TRANSFORM_ENFORCE_ORDER = {
|
|
17
|
+
pre: 0,
|
|
18
|
+
default: 1,
|
|
19
|
+
post: 2
|
|
20
|
+
};
|
|
21
|
+
function getSourceTransformEnforceOrder(transform) {
|
|
22
|
+
return SOURCE_TRANSFORM_ENFORCE_ORDER[transform.enforce ?? "default"];
|
|
23
|
+
}
|
|
24
|
+
function applySourceTransforms(transforms, code, id) {
|
|
25
|
+
let current = code;
|
|
26
|
+
for (const transform of [...transforms].sort(
|
|
27
|
+
(left, right) => getSourceTransformEnforceOrder(left) - getSourceTransformEnforceOrder(right)
|
|
28
|
+
)) {
|
|
29
|
+
const result = applySourceTransform(transform, current, id);
|
|
30
|
+
if (!result) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
current = typeof result === "string" ? result : result.code;
|
|
34
|
+
}
|
|
35
|
+
return current;
|
|
36
|
+
}
|
|
16
37
|
function inferLoaderFromPath(filePath) {
|
|
17
38
|
const extension = path.extname(filePath).toLowerCase();
|
|
18
39
|
switch (extension) {
|
|
@@ -56,13 +77,14 @@ function createVitePluginFromSourceTransform(transform) {
|
|
|
56
77
|
};
|
|
57
78
|
}
|
|
58
79
|
function getAppSourceTransforms(appConfig) {
|
|
59
|
-
return Array.from(appConfig.sourceTransforms.values());
|
|
80
|
+
return appConfig.sourceTransforms ? Array.from(appConfig.sourceTransforms.values()) : [];
|
|
60
81
|
}
|
|
61
82
|
function createVitePluginsFromAppSourceTransforms(appConfig) {
|
|
62
83
|
return getAppSourceTransforms(appConfig).map((transform) => createVitePluginFromSourceTransform(transform));
|
|
63
84
|
}
|
|
64
85
|
export {
|
|
65
86
|
applySourceTransform,
|
|
87
|
+
applySourceTransforms,
|
|
66
88
|
createEcoBuildPluginFromSourceTransform,
|
|
67
89
|
createVitePluginFromSourceTransform,
|
|
68
90
|
createVitePluginsFromAppSourceTransforms,
|
|
@@ -33,15 +33,15 @@ flowchart TD
|
|
|
33
33
|
|
|
34
34
|
## 2) Route Render Flow
|
|
35
35
|
|
|
36
|
-
`IntegrationRenderer.execute()` delegates shared route orchestration to `
|
|
36
|
+
`IntegrationRenderer.execute()` delegates shared route orchestration to `RouteRenderOrchestrator`.
|
|
37
37
|
|
|
38
38
|
```mermaid
|
|
39
39
|
flowchart TD
|
|
40
|
-
A[IntegrationRenderer.execute] --> B[
|
|
40
|
+
A[IntegrationRenderer.execute] --> B[RouteRenderOrchestrator.prepareRenderOptions]
|
|
41
41
|
B --> C[resolvePageModule]
|
|
42
42
|
C --> D[ownershipValidationService.validate]
|
|
43
43
|
D --> E[resolvePageData]
|
|
44
|
-
E --> F[
|
|
44
|
+
E --> F[ownershipValidationService.validate + throwIfOwnershipInvalid]
|
|
45
45
|
F --> G[resolveDependencies]
|
|
46
46
|
G --> H[buildPageBrowserGraph]
|
|
47
47
|
H --> I{shouldRenderPageComponent?}
|
|
@@ -77,7 +77,7 @@ flowchart TD
|
|
|
77
77
|
D -- Yes --> E[render inline]
|
|
78
78
|
D -- No --> F[delegate to owning renderer]
|
|
79
79
|
F --> G[owning renderer renderComponentWithForeignChildren]
|
|
80
|
-
G --> H[owning renderer
|
|
80
|
+
G --> H[owning renderer renderComponentWithForeignChildren mapped via toForeignSubtreeRenderPayload]
|
|
81
81
|
H --> I[resolved html plus assets and attachment policy]
|
|
82
82
|
```
|
|
83
83
|
|
|
@@ -121,12 +121,12 @@ flowchart TD
|
|
|
121
121
|
The most useful reading order is:
|
|
122
122
|
|
|
123
123
|
1. `route-renderer.ts`
|
|
124
|
-
2. `orchestration/route-render-
|
|
124
|
+
2. `orchestration/route-render-orchestrator.ts`
|
|
125
125
|
3. `orchestration/integration-renderer.ts`
|
|
126
126
|
4. `orchestration/ownership-validation.service.ts`
|
|
127
127
|
5. `orchestration/ownership-planning.service.ts`
|
|
128
128
|
6. `orchestration/component-render-context.ts`
|
|
129
|
-
7. `orchestration/
|
|
129
|
+
7. `orchestration/foreign-subtree-execution.service.ts`
|
|
130
130
|
8. `page-loading/page-module-loader.ts`
|
|
131
131
|
9. `page-loading/dependency-resolver.ts`
|
|
132
132
|
10. `eco/eco.ts`
|
|
@@ -134,12 +134,12 @@ The most useful reading order is:
|
|
|
134
134
|
## 7) Key Files
|
|
135
135
|
|
|
136
136
|
- `packages/core/src/route-renderer/route-renderer.ts`
|
|
137
|
-
- `packages/core/src/route-renderer/orchestration/route-render-
|
|
137
|
+
- `packages/core/src/route-renderer/orchestration/route-render-orchestrator.ts`
|
|
138
138
|
- `packages/core/src/route-renderer/orchestration/integration-renderer.ts`
|
|
139
139
|
- `packages/core/src/route-renderer/orchestration/ownership-validation.service.ts`
|
|
140
140
|
- `packages/core/src/route-renderer/orchestration/ownership-planning.service.ts`
|
|
141
141
|
- `packages/core/src/route-renderer/orchestration/component-render-context.ts`
|
|
142
|
-
- `packages/core/src/route-renderer/orchestration/
|
|
142
|
+
- `packages/core/src/route-renderer/orchestration/foreign-subtree-execution.service.ts`
|
|
143
143
|
- `packages/core/src/route-renderer/page-loading/page-module-loader.ts`
|
|
144
144
|
- `packages/core/src/route-renderer/page-loading/dependency-resolver.ts`
|
|
145
145
|
- `packages/core/src/eco/eco.ts`
|
|
@@ -16,18 +16,30 @@ The route renderer layer is responsible for:
|
|
|
16
16
|
|
|
17
17
|
The architecture is organized around three distinct concepts:
|
|
18
18
|
|
|
19
|
-
- `ownership`:
|
|
19
|
+
- `ownership`: declared component dependency metadata validated before render
|
|
20
20
|
- `foreign child`: a component encountered during render whose owning integration differs from the current integration
|
|
21
21
|
- `foreign subtree`: the resolved HTML, assets, and root-attachment metadata returned by the owning renderer for that foreign child
|
|
22
22
|
|
|
23
23
|
These concepts intentionally live in different places:
|
|
24
24
|
|
|
25
|
-
- `ownership-
|
|
26
|
-
- `ownership-validation.service.ts` validates declared foreign ownership up front
|
|
25
|
+
- `ownership-validation.service.ts` validates declared foreign ownership up front and fails the render on misconfiguration
|
|
27
26
|
- `component-render-context.ts` intercepts foreign children during active component render
|
|
28
|
-
- `
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
27
|
+
- `foreign-subtree-execution.service.ts` owns mixed-integration execution policy and queued token resolution
|
|
28
|
+
- `document-shell-render.service.ts` composes page, layout, and html template shells with one execution-scoped renderer cache
|
|
29
|
+
- `integration-renderer.ts` owns renderer-to-renderer delegation and integration-specific render hooks
|
|
30
|
+
- `route-render-orchestrator.ts` owns route preparation, final response capture, and unresolved artifact enforcement
|
|
31
|
+
|
|
32
|
+
## Build-Time JSX vs Runtime Foreign Children
|
|
33
|
+
|
|
34
|
+
Mixed-integration apps use two separate mechanisms:
|
|
35
|
+
|
|
36
|
+
| Layer | Mechanism | Purpose |
|
|
37
|
+
| ------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
38
|
+
| Build | `getJsxOwnershipPlugins()` / `getHostScopedJsxOwnershipPlugins()` | Prepend `@jsxImportSource` so bundled `.tsx` files compile with the correct JSX runtime |
|
|
39
|
+
| Build | `eco-component-meta-plugin` | Prepends the owning integration pragma when injecting `__eco` metadata into native files |
|
|
40
|
+
| Runtime | `eco.component()` / `eco.embed()` + foreign-child runtime | Hand off cross-integration children during SSR |
|
|
41
|
+
|
|
42
|
+
See [`../build/README.md`](../build/README.md) for the JSX ownership helper split.
|
|
31
43
|
|
|
32
44
|
## Main Files
|
|
33
45
|
|
|
@@ -38,12 +50,12 @@ These concepts intentionally live in different places:
|
|
|
38
50
|
|
|
39
51
|
### `orchestration/`
|
|
40
52
|
|
|
41
|
-
- `route-render-
|
|
53
|
+
- `route-render-orchestrator.ts`: one route render from page-module loading through final HTML output
|
|
42
54
|
- `integration-renderer.ts`: abstract base class for route rendering, explicit view rendering, and foreign-child delegation
|
|
43
|
-
- `ownership-planning.service.ts`: declared ownership graph construction
|
|
44
55
|
- `ownership-validation.service.ts`: up-front ownership validation for route roots and declared descendants
|
|
56
|
+
- `foreign-subtree-execution.service.ts`: foreign-child execution policy, queue token resolution, and `toForeignSubtreeRenderPayload()`
|
|
57
|
+
- `document-shell-render.service.ts`: shared page/layout/html shell composition and attribute stamping helpers
|
|
45
58
|
- `component-render-context.ts`: active render context used by `eco.component()` to intercept foreign children
|
|
46
|
-
- `queued-foreign-subtree-resolution.service.ts`: queue resolution for renderers that need token-based foreign-subtree handoff
|
|
47
59
|
- `render-output.utils.ts`: unresolved artifact normalization and marker inspection
|
|
48
60
|
|
|
49
61
|
### `page-loading/`
|
|
@@ -56,11 +68,11 @@ These concepts intentionally live in different places:
|
|
|
56
68
|
The route-render contract is:
|
|
57
69
|
|
|
58
70
|
1. `RouteRendererFactory` selects the owning integration renderer.
|
|
59
|
-
2. `IntegrationRenderer.execute()` delegates preparation and finalization to `
|
|
60
|
-
3. `
|
|
71
|
+
2. `IntegrationRenderer.execute()` delegates preparation and finalization to `RouteRenderOrchestrator`.
|
|
72
|
+
3. `RouteRenderOrchestrator.prepareRenderOptions()` loads the page module, validates ownership (fail-fast), resolves page data, resolves dependencies, and builds the page browser graph.
|
|
61
73
|
4. The integration renderer performs page, layout, and document-shell rendering. When it encounters a foreign child, it delegates that child back to the owning renderer.
|
|
62
74
|
5. If a renderer needs queued handoff, it emits internal foreign-subtree tokens and resolves them before returning final HTML.
|
|
63
|
-
6. `
|
|
75
|
+
6. `RouteRenderOrchestrator.executePrepared()` captures the final body, rejects unresolved `<eco-marker>` artifacts, stamps root or document attributes when needed, and runs the HTML transformer.
|
|
64
76
|
|
|
65
77
|
Important:
|
|
66
78
|
|
|
@@ -72,38 +84,28 @@ Important:
|
|
|
72
84
|
|
|
73
85
|
Mixed-integration component configs must declare every possible foreign child in `config.dependencies.components`.
|
|
74
86
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
- `OwnershipValidationService` surfaces missing metadata or unknown integrations before render execution
|
|
78
|
-
- `OwnershipPlanningService` records the expected ownership shape in `ownershipPlan`
|
|
87
|
+
`OwnershipValidationService` surfaces missing metadata or unknown integrations during `prepareRenderOptions()` and throws before render execution starts.
|
|
79
88
|
|
|
80
89
|
At runtime, renderers still discover actual foreign children through the active component render context.
|
|
81
90
|
|
|
82
91
|
## Foreign Subtree Contract
|
|
83
92
|
|
|
84
|
-
`
|
|
85
|
-
|
|
86
|
-
- `html`
|
|
87
|
-
- `assets`
|
|
88
|
-
- `rootTag`
|
|
89
|
-
- optional `rootAttributes`
|
|
90
|
-
- `attachmentPolicy`
|
|
91
|
-
- `integrationName`
|
|
92
|
-
|
|
93
|
-
`renderComponentWithForeignChildren()` is the higher-level renderer entrypoint. It is responsible for:
|
|
93
|
+
`renderComponentWithForeignChildren()` is the renderer entrypoint for mixed-integration trees. It is responsible for:
|
|
94
94
|
|
|
95
95
|
- reusing the execution-scoped owning-renderer cache
|
|
96
96
|
- deciding whether the current component can stay local
|
|
97
97
|
- creating a foreign-child runtime when nested foreign ownership must be resolved
|
|
98
98
|
- normalizing unresolved artifact HTML before the render leaves the renderer
|
|
99
99
|
|
|
100
|
+
Queue resolution maps owning-renderer output into the foreign-subtree payload shape via `toForeignSubtreeRenderPayload()` inside `foreign-subtree-execution.service.ts`.
|
|
101
|
+
|
|
100
102
|
## Queue Model
|
|
101
103
|
|
|
102
104
|
Not every integration needs queue-based handoff.
|
|
103
105
|
|
|
104
106
|
- If a renderer can resolve a foreign child inline, it returns resolved output immediately.
|
|
105
107
|
- If it cannot, it may emit internal foreign-subtree tokens and resolve them before returning final HTML.
|
|
106
|
-
-
|
|
108
|
+
- Queue mechanics live inside `ForeignSubtreeExecutionService`; they are renderer-owned transport inside one render pass, not a general route-level fallback mechanism.
|
|
107
109
|
|
|
108
110
|
## React Island Notes
|
|
109
111
|
|
|
@@ -114,5 +116,5 @@ Not every integration needs queue-based handoff.
|
|
|
114
116
|
|
|
115
117
|
## Current Limits
|
|
116
118
|
|
|
117
|
-
- `ownershipPlan` is still diagnostic and preparatory metadata; it does not yet drive a full route-composer execution model.
|
|
118
119
|
- Different integrations still own different foreign-child runtime strategies, which is intentional where child transport or hydration behavior differs.
|
|
120
|
+
- `integration-renderer.ts` remains the largest integration hook surface even after document-shell extraction.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../../types/internal-types.js';
|
|
2
|
+
import type { EcoComponent, ResolvedLazyTrigger } from '../../types/public-types.js';
|
|
3
|
+
import type { AssetDefinition } from '../../services/assets/asset-processing-service/index.js';
|
|
4
|
+
import type { AssetProcessingService, ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
|
|
5
|
+
export declare function collectIntegrationNamesFromGraph(components: (EcoComponent | Partial<EcoComponent>)[], currentIntegrationName: string): Set<string>;
|
|
6
|
+
export declare function collectResolvedLazyTriggersFromGraph(components: (EcoComponent | Partial<EcoComponent>)[], currentIntegrationName: string): ResolvedLazyTrigger[];
|
|
7
|
+
export declare function hasForeignChildDescendantsInGraph(component: EcoComponent, currentIntegrationName: string): boolean;
|
|
8
|
+
export declare function collectEagerSsrLazyScriptDefinitions(components: (EcoComponent | Partial<EcoComponent>)[]): AssetDefinition[];
|
|
9
|
+
export declare function collectUsedIntegrationDependenciesFromGraph(appConfig: EcoPagesAppConfig, components: (EcoComponent | Partial<EcoComponent>)[], currentIntegrationName: string): ProcessedAsset[];
|
|
10
|
+
export declare function buildEagerSsrLazyAssetsFromGraph(assetProcessingService: AssetProcessingService, components: (EcoComponent | Partial<EcoComponent>)[], currentIntegrationName: string): Promise<ProcessedAsset[]>;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
|
|
3
|
+
import { walkComponentGraph } from "./component-graph.js";
|
|
4
|
+
function toGraphRoots(components) {
|
|
5
|
+
return components.filter(Boolean).map((component) => ({ component }));
|
|
6
|
+
}
|
|
7
|
+
function collectIntegrationNamesFromGraph(components, currentIntegrationName) {
|
|
8
|
+
const integrationNames = /* @__PURE__ */ new Set();
|
|
9
|
+
walkComponentGraph({
|
|
10
|
+
roots: toGraphRoots(components),
|
|
11
|
+
currentIntegrationName,
|
|
12
|
+
onComponent: ({ component }) => {
|
|
13
|
+
const integrationName = component.config?.integration ?? component.config?.__eco?.integration;
|
|
14
|
+
if (integrationName) {
|
|
15
|
+
integrationNames.add(integrationName);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
return integrationNames;
|
|
20
|
+
}
|
|
21
|
+
function collectResolvedLazyTriggersFromGraph(components, currentIntegrationName) {
|
|
22
|
+
const triggers = [];
|
|
23
|
+
walkComponentGraph({
|
|
24
|
+
roots: toGraphRoots(components),
|
|
25
|
+
currentIntegrationName,
|
|
26
|
+
onComponent: ({ component }) => {
|
|
27
|
+
const ownTriggers = component.config?._resolvedLazyTriggers;
|
|
28
|
+
if (ownTriggers?.length) {
|
|
29
|
+
triggers.push(...ownTriggers);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return triggers;
|
|
34
|
+
}
|
|
35
|
+
function hasForeignChildDescendantsInGraph(component, currentIntegrationName) {
|
|
36
|
+
let foundForeign = false;
|
|
37
|
+
walkComponentGraph({
|
|
38
|
+
roots: [{ component }],
|
|
39
|
+
currentIntegrationName,
|
|
40
|
+
onComponent: ({ component: currentComponent }) => {
|
|
41
|
+
if (foundForeign) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const integrationName = currentComponent.config?.integration ?? currentComponent.config?.__eco?.integration;
|
|
45
|
+
if (integrationName && integrationName !== currentIntegrationName) {
|
|
46
|
+
foundForeign = true;
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return foundForeign;
|
|
52
|
+
}
|
|
53
|
+
function collectEagerSsrLazyScriptDefinitions(components) {
|
|
54
|
+
const dependencies = [];
|
|
55
|
+
const seenKeys = /* @__PURE__ */ new Set();
|
|
56
|
+
const normalizeAttributes = (attributes) => ({
|
|
57
|
+
type: "module",
|
|
58
|
+
defer: "",
|
|
59
|
+
...attributes ?? {}
|
|
60
|
+
});
|
|
61
|
+
walkComponentGraph({
|
|
62
|
+
roots: toGraphRoots(components),
|
|
63
|
+
currentIntegrationName: "",
|
|
64
|
+
visitLayout: true,
|
|
65
|
+
onConfig: (config) => {
|
|
66
|
+
const componentFile = config?.__eco?.file;
|
|
67
|
+
if (!componentFile) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const componentDir = path.dirname(componentFile);
|
|
71
|
+
for (const script of config.dependencies?.scripts ?? []) {
|
|
72
|
+
if (typeof script === "string" || !script.lazy || script.ssr !== true) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const attributes = normalizeAttributes(script.attributes);
|
|
76
|
+
if (script.content) {
|
|
77
|
+
const key2 = `content:${script.content}:${JSON.stringify(attributes)}`;
|
|
78
|
+
if (seenKeys.has(key2)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
seenKeys.add(key2);
|
|
82
|
+
dependencies.push(
|
|
83
|
+
AssetFactory.createContentScript({
|
|
84
|
+
position: "head",
|
|
85
|
+
content: script.content,
|
|
86
|
+
attributes,
|
|
87
|
+
packageRole: "dynamic-chunk"
|
|
88
|
+
})
|
|
89
|
+
);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (!script.src) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const resolvedPath = path.resolve(componentDir, script.src);
|
|
96
|
+
const key = `file:${resolvedPath}:${JSON.stringify(attributes)}`;
|
|
97
|
+
if (seenKeys.has(key)) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
seenKeys.add(key);
|
|
101
|
+
dependencies.push(
|
|
102
|
+
AssetFactory.createFileScript({
|
|
103
|
+
filepath: resolvedPath,
|
|
104
|
+
position: "head",
|
|
105
|
+
attributes,
|
|
106
|
+
packageRole: "dynamic-chunk"
|
|
107
|
+
})
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
return dependencies;
|
|
113
|
+
}
|
|
114
|
+
function collectUsedIntegrationDependenciesFromGraph(appConfig, components, currentIntegrationName) {
|
|
115
|
+
const integrationNames = collectIntegrationNamesFromGraph(components, currentIntegrationName);
|
|
116
|
+
const dependencies = [];
|
|
117
|
+
for (const integrationName of integrationNames) {
|
|
118
|
+
if (integrationName === currentIntegrationName) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const integrationPlugin = appConfig.integrations.find((integration) => integration.name === integrationName);
|
|
122
|
+
if (!integrationPlugin || typeof integrationPlugin.getResolvedIntegrationDependencies !== "function") {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
dependencies.push(...integrationPlugin.getResolvedIntegrationDependencies());
|
|
126
|
+
}
|
|
127
|
+
return dependencies;
|
|
128
|
+
}
|
|
129
|
+
async function buildEagerSsrLazyAssetsFromGraph(assetProcessingService, components, currentIntegrationName) {
|
|
130
|
+
const dependencies = collectEagerSsrLazyScriptDefinitions(components);
|
|
131
|
+
if (dependencies.length === 0) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
return assetProcessingService.processDependencies(dependencies, `${currentIntegrationName}:ssr-lazy`);
|
|
135
|
+
}
|
|
136
|
+
export {
|
|
137
|
+
buildEagerSsrLazyAssetsFromGraph,
|
|
138
|
+
collectEagerSsrLazyScriptDefinitions,
|
|
139
|
+
collectIntegrationNamesFromGraph,
|
|
140
|
+
collectResolvedLazyTriggersFromGraph,
|
|
141
|
+
collectUsedIntegrationDependenciesFromGraph,
|
|
142
|
+
hasForeignChildDescendantsInGraph
|
|
143
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { EcoComponent, OwnershipPlanNodeSource } from '../../types/public-types.js';
|
|
2
|
+
export type DeclaredOwnershipRoot = {
|
|
3
|
+
component: EcoComponent;
|
|
4
|
+
source: Extract<OwnershipPlanNodeSource, 'page' | 'layout' | 'html-template'>;
|
|
5
|
+
};
|
|
6
|
+
export type DeclaredOwnershipNodeInput = {
|
|
7
|
+
component: EcoComponent;
|
|
8
|
+
source: Exclude<OwnershipPlanNodeSource, 'route'>;
|
|
9
|
+
parentIntegrationName: string;
|
|
10
|
+
integrationName: string;
|
|
11
|
+
componentId: string;
|
|
12
|
+
isForeignToParent: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type ComponentGraphRoot = {
|
|
15
|
+
component: EcoComponent | Partial<EcoComponent>;
|
|
16
|
+
source?: Exclude<OwnershipPlanNodeSource, 'route'>;
|
|
17
|
+
};
|
|
18
|
+
export type ComponentGraphWalkInput = {
|
|
19
|
+
component: EcoComponent;
|
|
20
|
+
parentIntegrationName: string;
|
|
21
|
+
source?: Exclude<OwnershipPlanNodeSource, 'route'>;
|
|
22
|
+
};
|
|
23
|
+
export declare function walkComponentGraph(input: {
|
|
24
|
+
roots: ComponentGraphRoot[];
|
|
25
|
+
currentIntegrationName: string;
|
|
26
|
+
visitLayout?: boolean;
|
|
27
|
+
onComponent?: (node: ComponentGraphWalkInput) => void | boolean;
|
|
28
|
+
onConfig?: (config: EcoComponent['config']) => void;
|
|
29
|
+
}): void;
|
|
30
|
+
export declare function mapComponentGraph<T>(input: {
|
|
31
|
+
roots: DeclaredOwnershipRoot[];
|
|
32
|
+
currentIntegrationName: string;
|
|
33
|
+
mapNode: (node: DeclaredOwnershipNodeInput, children: T[]) => T;
|
|
34
|
+
}): T[];
|
|
35
|
+
/** @deprecated Use `mapComponentGraph` from `component-graph.ts`. */
|
|
36
|
+
export declare const mapDeclaredOwnershipGraph: typeof mapComponentGraph;
|