@ecopages/core 0.2.0-alpha.25 → 0.2.0-alpha.27
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 +63 -7
- package/package.json +4 -47
- package/src/adapters/bun/create-app.ts +54 -2
- package/src/adapters/bun/hmr-manager.test.ts +0 -2
- package/src/adapters/bun/hmr-manager.ts +1 -24
- package/src/adapters/bun/server-adapter.ts +30 -4
- package/src/adapters/node/node-hmr-manager.test.ts +0 -2
- package/src/adapters/node/node-hmr-manager.ts +2 -25
- package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
- package/src/adapters/shared/explicit-static-route-matcher.test.ts +6 -6
- package/src/adapters/shared/explicit-static-route-matcher.ts +22 -31
- package/src/adapters/shared/file-route-middleware-pipeline.test.ts +5 -10
- package/src/adapters/shared/file-route-middleware-pipeline.ts +8 -17
- package/src/adapters/shared/fs-server-response-factory.test.ts +32 -43
- package/src/adapters/shared/fs-server-response-factory.ts +15 -37
- package/src/adapters/shared/fs-server-response-matcher.test.ts +65 -39
- package/src/adapters/shared/fs-server-response-matcher.ts +94 -43
- package/src/adapters/shared/hmr-manager.contract.test.ts +0 -4
- package/src/adapters/shared/render-context.ts +3 -3
- package/src/adapters/shared/server-adapter.test.ts +53 -0
- package/src/adapters/shared/server-adapter.ts +228 -159
- package/src/adapters/shared/server-route-handler.test.ts +6 -5
- package/src/adapters/shared/server-route-handler.ts +4 -4
- package/src/adapters/shared/server-static-builder.test.ts +4 -4
- package/src/adapters/shared/server-static-builder.ts +4 -4
- package/src/config/README.md +1 -1
- package/src/config/config-builder.test.ts +0 -1
- package/src/config/config-builder.ts +2 -7
- package/src/dev/host-runtime.ts +34 -0
- package/src/eco/eco.browser.test.ts +2 -2
- package/src/eco/eco.browser.ts +2 -2
- package/src/eco/eco.test.ts +6 -6
- package/src/eco/eco.ts +12 -12
- package/src/eco/eco.types.ts +3 -3
- package/src/errors/index.ts +1 -0
- package/src/hmr/client/hmr-runtime.ts +4 -2
- package/src/hmr/strategies/js-hmr-strategy.test.ts +0 -1
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -6
- package/src/integrations/ghtml/ghtml-renderer.test.ts +7 -7
- package/src/integrations/ghtml/ghtml-renderer.ts +1 -11
- package/src/plugins/eco-component-meta-plugin.ts +0 -1
- package/src/plugins/integration-plugin.test.ts +9 -14
- package/src/plugins/integration-plugin.ts +34 -22
- package/src/plugins/processor.ts +17 -0
- package/src/route-renderer/GRAPH.md +81 -289
- package/src/route-renderer/README.md +67 -105
- package/src/route-renderer/orchestration/component-render-context.ts +45 -38
- package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +383 -0
- package/src/route-renderer/orchestration/integration-renderer.test.ts +118 -121
- package/src/route-renderer/orchestration/integration-renderer.ts +362 -403
- package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
- package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
- package/src/route-renderer/orchestration/processed-asset-dedupe.ts +1 -1
- package/src/route-renderer/orchestration/{queued-boundary-runtime.service.test.ts → queued-foreign-subtree-resolution.service.test.ts} +76 -71
- package/src/route-renderer/orchestration/{queued-boundary-runtime.service.ts → queued-foreign-subtree-resolution.service.ts} +68 -63
- package/src/route-renderer/orchestration/render-output.utils.ts +21 -13
- package/src/route-renderer/orchestration/{render-preparation.service.test.ts → route-render-orchestrator.prepare-render-options.test.ts} +160 -85
- package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +265 -0
- package/src/route-renderer/orchestration/{render-preparation.service.ts → route-render-orchestrator.ts} +244 -160
- package/src/route-renderer/page-loading/component-dependency-collection.ts +9 -3
- package/src/route-renderer/page-loading/declared-asset-collection.ts +2 -5
- package/src/route-renderer/page-loading/dependency-resolver.test.ts +107 -11
- package/src/route-renderer/page-loading/dependency-resolver.ts +6 -12
- package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +1 -1
- package/src/route-renderer/page-loading/lazy-entry-collection.ts +1 -1
- package/src/route-renderer/page-loading/lazy-trigger-planning.ts +1 -1
- package/src/route-renderer/page-loading/module-declaration-aggregation.ts +1 -1
- package/src/route-renderer/page-loading/module-declaration-scripts.ts +1 -1
- package/src/route-renderer/page-loading/page-dependency-bundling.ts +105 -66
- package/src/route-renderer/route-renderer.ts +28 -31
- package/src/router/README.md +16 -19
- package/src/router/server/route-registry.test.ts +176 -0
- package/src/router/server/route-registry.ts +382 -0
- package/src/services/README.md +1 -2
- package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +1 -1
- package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +1 -4
- package/src/services/assets/asset-processing-service/asset-processing.service.ts +1 -2
- package/src/services/assets/asset-processing-service/assets.types.ts +3 -0
- package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +1 -1
- package/src/services/assets/asset-processing-service/index.ts +1 -0
- package/src/{route-renderer/orchestration/page-packaging.service.test.ts → services/assets/asset-processing-service/page-package.test.ts} +38 -14
- package/src/services/assets/asset-processing-service/page-package.ts +93 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +4 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +13 -10
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +3 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +6 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +2 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +1 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +2 -0
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +1 -1
- package/src/services/html/html-transformer.service.test.ts +1 -4
- package/src/services/module-loading/app-server-module-transpiler.service.ts +1 -3
- package/src/services/module-loading/node-bootstrap-plugin.ts +17 -3
- package/src/services/module-loading/page-module-import.service.ts +0 -1
- package/src/services/module-loading/source-module-support.ts +1 -1
- package/src/static-site-generator/static-site-generator.test.ts +124 -32
- package/src/static-site-generator/static-site-generator.ts +168 -185
- package/src/types/internal-types.ts +13 -12
- package/src/types/public-types.ts +55 -39
- package/src/watchers/project-watcher.test-helpers.ts +4 -3
- package/src/route-renderer/orchestration/boundary-planning.service.ts +0 -146
- package/src/route-renderer/orchestration/page-packaging.service.ts +0 -85
- package/src/route-renderer/orchestration/render-execution.service.test.ts +0 -196
- package/src/route-renderer/orchestration/render-execution.service.ts +0 -182
- package/src/route-renderer/orchestration/route-shell-composer.service.ts +0 -162
- package/src/router/server/fs-router-scanner.test.ts +0 -83
- package/src/router/server/fs-router-scanner.ts +0 -224
- package/src/router/server/fs-router.test.ts +0 -214
- package/src/router/server/fs-router.ts +0 -122
- package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import type { ProcessedAsset } from '../../services/assets/asset-processing-service/index.ts';
|
|
2
2
|
import type {
|
|
3
3
|
BaseIntegrationContext,
|
|
4
|
-
|
|
4
|
+
ForeignSubtreeRenderPayload,
|
|
5
5
|
ComponentRenderInput,
|
|
6
6
|
EcoComponent,
|
|
7
7
|
} from '../../types/public-types.ts';
|
|
8
|
-
import type {
|
|
8
|
+
import type { ForeignChildRuntime } from './component-render-context.ts';
|
|
9
9
|
|
|
10
|
-
export type
|
|
10
|
+
export type QueuedForeignChildDecisionInput = {
|
|
11
11
|
currentIntegration: string;
|
|
12
12
|
targetIntegration?: string;
|
|
13
13
|
component: EcoComponent;
|
|
14
14
|
props: Record<string, unknown>;
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
export type
|
|
17
|
+
export type QueuedForeignSubtreeResolution = {
|
|
18
18
|
token: string;
|
|
19
19
|
component: EcoComponent;
|
|
20
20
|
props: Record<string, unknown>;
|
|
@@ -22,48 +22,49 @@ export type QueuedBoundaryResolution = {
|
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* Shared mutable state for one renderer-owned queued
|
|
25
|
+
* Shared mutable state for one renderer-owned queued foreign-subtree runtime.
|
|
26
26
|
*
|
|
27
|
-
* Renderers that cannot resolve foreign
|
|
27
|
+
* Renderers that cannot resolve foreign children inline can enqueue transport
|
|
28
28
|
* tokens during their initial render, then resolve those tokens against the
|
|
29
29
|
* owning renderer before returning final HTML.
|
|
30
30
|
*/
|
|
31
|
-
export type
|
|
31
|
+
export type QueuedForeignSubtreeResolutionContext = {
|
|
32
32
|
rendererCache: Map<string, unknown>;
|
|
33
33
|
componentInstanceScope?: string;
|
|
34
|
-
|
|
35
|
-
queuedResolutions:
|
|
34
|
+
nextForeignSubtreeId: number;
|
|
35
|
+
queuedResolutions: QueuedForeignSubtreeResolution[];
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
-
type
|
|
38
|
+
type QueuedForeignSubtreeIntegrationContext = BaseIntegrationContext & Record<string, unknown>;
|
|
39
39
|
|
|
40
|
-
type
|
|
40
|
+
type QueuedForeignSubtreeChildRenderResult = {
|
|
41
41
|
assets: ProcessedAsset[];
|
|
42
42
|
html?: string;
|
|
43
43
|
};
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
46
|
+
* Lower-level queue orchestration for renderer-owned foreign-child runtimes that emit
|
|
47
47
|
* temporary transport tokens during one render pass.
|
|
48
48
|
*
|
|
49
49
|
* The service keeps three responsibilities in one place:
|
|
50
50
|
* - storing per-render queue state on the active integration context
|
|
51
|
-
* - creating a `
|
|
51
|
+
* - creating a `ForeignChildRuntime` that enqueues foreign children
|
|
52
52
|
* - resolving queued tokens back through the owning renderer before final HTML
|
|
53
53
|
* leaves the current renderer
|
|
54
54
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
55
|
+
* The deeper Foreign Subtree execution module composes this queue helper with
|
|
56
|
+
* renderer-cache delegation and active render-context execution. This service
|
|
57
|
+
* stays focused on queue bookkeeping, recursion, cycle detection, and asset merging.
|
|
57
58
|
*/
|
|
58
|
-
export class
|
|
59
|
+
export class QueuedForeignSubtreeResolutionService {
|
|
59
60
|
/**
|
|
60
|
-
* Reads the queued
|
|
61
|
+
* Reads the queued foreign-subtree runtime state previously attached to one render.
|
|
61
62
|
*/
|
|
62
|
-
getRuntimeContext<TContext extends
|
|
63
|
+
getRuntimeContext<TContext extends QueuedForeignSubtreeResolutionContext>(
|
|
63
64
|
input: ComponentRenderInput,
|
|
64
65
|
runtimeContextKey: string,
|
|
65
66
|
): TContext | undefined {
|
|
66
|
-
const integrationContext = input.integrationContext as
|
|
67
|
+
const integrationContext = input.integrationContext as QueuedForeignSubtreeIntegrationContext | undefined;
|
|
67
68
|
const runtimeContext = integrationContext?.[runtimeContextKey];
|
|
68
69
|
|
|
69
70
|
if (typeof runtimeContext !== 'object' || runtimeContext === null) {
|
|
@@ -77,37 +78,37 @@ export class QueuedBoundaryRuntimeService {
|
|
|
77
78
|
* Creates the runtime hook used by `runWithComponentRenderContext()` for one
|
|
78
79
|
* renderer-owned queue.
|
|
79
80
|
*
|
|
80
|
-
* When the renderer decides a
|
|
81
|
+
* When the renderer decides a foreign child must be handed off, the runtime returns
|
|
81
82
|
* a resolved transport token instead of rendering the foreign component inline.
|
|
82
83
|
*/
|
|
83
|
-
createRuntime<TContext extends
|
|
84
|
-
|
|
84
|
+
createRuntime<TContext extends QueuedForeignSubtreeResolutionContext>(options: {
|
|
85
|
+
renderInput: ComponentRenderInput;
|
|
85
86
|
rendererCache: Map<string, unknown>;
|
|
86
87
|
runtimeContextKey: string;
|
|
87
88
|
tokenPrefix: string;
|
|
88
|
-
|
|
89
|
+
shouldQueueForeignChild: (input: QueuedForeignChildDecisionInput) => boolean;
|
|
89
90
|
createRuntimeContext?: (
|
|
90
|
-
integrationContext:
|
|
91
|
+
integrationContext: QueuedForeignSubtreeIntegrationContext,
|
|
91
92
|
rendererCache: Map<string, unknown>,
|
|
92
93
|
) => TContext;
|
|
93
|
-
}):
|
|
94
|
+
}): ForeignChildRuntime {
|
|
94
95
|
const runtimeContext = this.ensureRuntimeContext(options);
|
|
95
96
|
|
|
96
|
-
const
|
|
97
|
-
if (!options.
|
|
97
|
+
const interceptForeignChild = (input: QueuedForeignChildDecisionInput) => {
|
|
98
|
+
if (!options.shouldQueueForeignChild(input)) {
|
|
98
99
|
return { kind: 'inline' as const };
|
|
99
100
|
}
|
|
100
101
|
|
|
101
|
-
runtimeContext.
|
|
102
|
-
const
|
|
103
|
-
const token = this.
|
|
102
|
+
runtimeContext.nextForeignSubtreeId += 1;
|
|
103
|
+
const foreignSubtreeId = runtimeContext.nextForeignSubtreeId;
|
|
104
|
+
const token = this.createForeignSubtreeToken(options.tokenPrefix, runtimeContext, foreignSubtreeId);
|
|
104
105
|
runtimeContext.queuedResolutions.push({
|
|
105
106
|
token,
|
|
106
107
|
component: input.component,
|
|
107
108
|
props: { ...input.props },
|
|
108
109
|
componentInstanceId: runtimeContext.componentInstanceScope
|
|
109
|
-
? `${runtimeContext.componentInstanceScope}_n_${
|
|
110
|
-
: `n_${
|
|
110
|
+
? `${runtimeContext.componentInstanceScope}_n_${foreignSubtreeId}`
|
|
111
|
+
: `n_${foreignSubtreeId}`,
|
|
111
112
|
});
|
|
112
113
|
|
|
113
114
|
return {
|
|
@@ -117,8 +118,8 @@ export class QueuedBoundaryRuntimeService {
|
|
|
117
118
|
};
|
|
118
119
|
|
|
119
120
|
return {
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
interceptForeignChild,
|
|
122
|
+
interceptForeignChildSync: interceptForeignChild,
|
|
122
123
|
};
|
|
123
124
|
}
|
|
124
125
|
|
|
@@ -129,20 +130,20 @@ export class QueuedBoundaryRuntimeService {
|
|
|
129
130
|
* handles recursive token replacement, cycle detection, root-attribute
|
|
130
131
|
* application, and merged asset collection.
|
|
131
132
|
*/
|
|
132
|
-
async resolveQueuedHtml<TContext extends
|
|
133
|
+
async resolveQueuedHtml<TContext extends QueuedForeignSubtreeResolutionContext>(options: {
|
|
133
134
|
html: string;
|
|
134
135
|
runtimeContext?: TContext;
|
|
135
136
|
queueLabel: string;
|
|
136
137
|
renderQueuedChildren: (
|
|
137
138
|
children: unknown,
|
|
138
139
|
runtimeContext: TContext,
|
|
139
|
-
queuedResolutionsByToken: Map<string,
|
|
140
|
+
queuedResolutionsByToken: Map<string, QueuedForeignSubtreeResolution>,
|
|
140
141
|
resolveToken: (token: string) => Promise<string>,
|
|
141
|
-
) => Promise<
|
|
142
|
-
|
|
142
|
+
) => Promise<QueuedForeignSubtreeChildRenderResult>;
|
|
143
|
+
resolveForeignSubtree: (
|
|
143
144
|
input: ComponentRenderInput,
|
|
144
145
|
rendererCache: Map<string, unknown>,
|
|
145
|
-
) => Promise<
|
|
146
|
+
) => Promise<ForeignSubtreeRenderPayload | undefined>;
|
|
146
147
|
applyAttributesToFirstElement: (html: string, attributes: Record<string, string>) => string;
|
|
147
148
|
dedupeProcessedAssets: (assets: ProcessedAsset[]) => ProcessedAsset[];
|
|
148
149
|
}): Promise<{ assets: ProcessedAsset[]; html: string }> {
|
|
@@ -171,7 +172,7 @@ export class QueuedBoundaryRuntimeService {
|
|
|
171
172
|
|
|
172
173
|
if (resolvingTokens.has(token)) {
|
|
173
174
|
throw new Error(
|
|
174
|
-
`[ecopages] ${options.queueLabel}
|
|
175
|
+
`[ecopages] ${options.queueLabel} foreign-subtree queue contains a cycle or unresolved dependency links.`,
|
|
175
176
|
);
|
|
176
177
|
}
|
|
177
178
|
|
|
@@ -189,7 +190,7 @@ export class QueuedBoundaryRuntimeService {
|
|
|
189
190
|
collectedAssets.push(...renderedChildren.assets);
|
|
190
191
|
}
|
|
191
192
|
|
|
192
|
-
const
|
|
193
|
+
const foreignSubtreeRender = await options.resolveForeignSubtree(
|
|
193
194
|
{
|
|
194
195
|
component: resolution.component,
|
|
195
196
|
props: { ...resolution.props },
|
|
@@ -202,20 +203,24 @@ export class QueuedBoundaryRuntimeService {
|
|
|
202
203
|
runtimeContext.rendererCache,
|
|
203
204
|
);
|
|
204
205
|
|
|
205
|
-
if (!
|
|
206
|
+
if (!foreignSubtreeRender) {
|
|
206
207
|
throw new Error(
|
|
207
|
-
`[ecopages] ${options.queueLabel} queued
|
|
208
|
+
`[ecopages] ${options.queueLabel} queued foreign subtree could not resolve its owning renderer.`,
|
|
208
209
|
);
|
|
209
210
|
}
|
|
210
211
|
|
|
211
|
-
if ((
|
|
212
|
-
collectedAssets.push(...(
|
|
212
|
+
if ((foreignSubtreeRender.assets?.length ?? 0) > 0) {
|
|
213
|
+
collectedAssets.push(...(foreignSubtreeRender.assets ?? []));
|
|
213
214
|
}
|
|
214
215
|
|
|
215
216
|
const resolvedHtml =
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
217
|
+
foreignSubtreeRender.attachmentPolicy.kind === 'first-element' &&
|
|
218
|
+
foreignSubtreeRender.rootAttributes
|
|
219
|
+
? options.applyAttributesToFirstElement(
|
|
220
|
+
foreignSubtreeRender.html,
|
|
221
|
+
foreignSubtreeRender.rootAttributes,
|
|
222
|
+
)
|
|
223
|
+
: foreignSubtreeRender.html;
|
|
219
224
|
|
|
220
225
|
resolvedHtmlByToken.set(token, resolvedHtml);
|
|
221
226
|
return resolvedHtml;
|
|
@@ -240,29 +245,29 @@ export class QueuedBoundaryRuntimeService {
|
|
|
240
245
|
};
|
|
241
246
|
}
|
|
242
247
|
|
|
243
|
-
private
|
|
248
|
+
private createForeignSubtreeToken(
|
|
244
249
|
tokenPrefix: string,
|
|
245
|
-
runtimeContext:
|
|
246
|
-
|
|
250
|
+
runtimeContext: QueuedForeignSubtreeResolutionContext,
|
|
251
|
+
foreignSubtreeId: number,
|
|
247
252
|
): string {
|
|
248
|
-
return `${tokenPrefix}${runtimeContext.componentInstanceScope ?? 'root'}__${
|
|
253
|
+
return `${tokenPrefix}${runtimeContext.componentInstanceScope ?? 'root'}__${foreignSubtreeId}__`;
|
|
249
254
|
}
|
|
250
255
|
|
|
251
|
-
private ensureRuntimeContext<TContext extends
|
|
252
|
-
|
|
256
|
+
private ensureRuntimeContext<TContext extends QueuedForeignSubtreeResolutionContext>(options: {
|
|
257
|
+
renderInput: ComponentRenderInput;
|
|
253
258
|
rendererCache: Map<string, unknown>;
|
|
254
259
|
runtimeContextKey: string;
|
|
255
260
|
createRuntimeContext?: (
|
|
256
|
-
integrationContext:
|
|
261
|
+
integrationContext: QueuedForeignSubtreeIntegrationContext,
|
|
257
262
|
rendererCache: Map<string, unknown>,
|
|
258
263
|
) => TContext;
|
|
259
264
|
}): TContext {
|
|
260
|
-
let integrationContext:
|
|
265
|
+
let integrationContext: QueuedForeignSubtreeIntegrationContext;
|
|
261
266
|
if (
|
|
262
|
-
typeof options.
|
|
263
|
-
options.
|
|
267
|
+
typeof options.renderInput.integrationContext === 'object' &&
|
|
268
|
+
options.renderInput.integrationContext !== null
|
|
264
269
|
) {
|
|
265
|
-
integrationContext = options.
|
|
270
|
+
integrationContext = options.renderInput.integrationContext as QueuedForeignSubtreeIntegrationContext;
|
|
266
271
|
} else {
|
|
267
272
|
integrationContext = {};
|
|
268
273
|
}
|
|
@@ -274,15 +279,15 @@ export class QueuedBoundaryRuntimeService {
|
|
|
274
279
|
({
|
|
275
280
|
rendererCache: options.rendererCache,
|
|
276
281
|
componentInstanceScope: integrationContext.componentInstanceId,
|
|
277
|
-
|
|
282
|
+
nextForeignSubtreeId: 0,
|
|
278
283
|
queuedResolutions: [],
|
|
279
|
-
} satisfies
|
|
284
|
+
} satisfies QueuedForeignSubtreeResolutionContext);
|
|
280
285
|
} else {
|
|
281
|
-
(existingRuntimeContext as
|
|
286
|
+
(existingRuntimeContext as QueuedForeignSubtreeResolutionContext).rendererCache = options.rendererCache;
|
|
282
287
|
}
|
|
283
288
|
|
|
284
289
|
integrationContext.rendererCache = options.rendererCache;
|
|
285
|
-
options.
|
|
290
|
+
options.renderInput.integrationContext = integrationContext;
|
|
286
291
|
|
|
287
292
|
return integrationContext[options.runtimeContextKey] as TContext;
|
|
288
293
|
}
|
|
@@ -34,7 +34,10 @@ function cloneTemplateStrings(strings: readonly string[], firstString: string):
|
|
|
34
34
|
return nextStrings;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
function cloneTemplateContentWithUpdatedFirstString<T extends TemplateContentShape>(
|
|
37
|
+
function cloneTemplateContentWithUpdatedFirstString<T extends TemplateContentShape>(
|
|
38
|
+
content: T,
|
|
39
|
+
firstString: string,
|
|
40
|
+
): T {
|
|
38
41
|
const descriptors = Object.getOwnPropertyDescriptors(content);
|
|
39
42
|
const clonedContent = Object.create(Object.getPrototypeOf(content)) as T;
|
|
40
43
|
const stringsDescriptor = descriptors.strings;
|
|
@@ -138,7 +141,9 @@ function isTemplateContentShape(value: unknown): value is TemplateContentShape {
|
|
|
138
141
|
}
|
|
139
142
|
|
|
140
143
|
function isMarkupNodeLikeShape(value: unknown): value is MarkupNodeLikeShape {
|
|
141
|
-
return
|
|
144
|
+
return (
|
|
145
|
+
typeof value === 'object' && value !== null && typeof (value as { nodeType?: unknown }).nodeType === 'number'
|
|
146
|
+
);
|
|
142
147
|
}
|
|
143
148
|
|
|
144
149
|
function injectTriggerAttributeIntoString(content: string, triggerId: string): string {
|
|
@@ -198,8 +203,14 @@ function injectTriggerAttributeIntoString(content: string, triggerId: string): s
|
|
|
198
203
|
export function addTriggerAttribute(content: string, triggerId: string): string;
|
|
199
204
|
export function addTriggerAttribute<T extends TemplateContentShape>(content: T, triggerId: string): T;
|
|
200
205
|
export function addTriggerAttribute<T extends MarkupNodeLikeShape>(content: T, triggerId: string): T;
|
|
201
|
-
export function addTriggerAttribute(
|
|
202
|
-
|
|
206
|
+
export function addTriggerAttribute(
|
|
207
|
+
content: unknown,
|
|
208
|
+
triggerId: string,
|
|
209
|
+
): string | TemplateContentShape | MarkupNodeLikeShape;
|
|
210
|
+
export function addTriggerAttribute(
|
|
211
|
+
content: unknown,
|
|
212
|
+
triggerId: string,
|
|
213
|
+
): string | TemplateContentShape | MarkupNodeLikeShape {
|
|
203
214
|
if (isTemplateContentShape(content)) {
|
|
204
215
|
if (content.strings.length === 0) {
|
|
205
216
|
return String(content);
|
|
@@ -228,10 +239,7 @@ export function addTriggerAttribute(content: unknown, triggerId: string): string
|
|
|
228
239
|
* @param content Rendered component HTML.
|
|
229
240
|
* @param lazyGroups Resolved lazy script groups attached to the component config.
|
|
230
241
|
*/
|
|
231
|
-
export function wrapWithScriptsInjector(
|
|
232
|
-
content: string,
|
|
233
|
-
lazyGroups: ResolvedLazyScriptGroups,
|
|
234
|
-
): string;
|
|
242
|
+
export function wrapWithScriptsInjector(content: string, lazyGroups: ResolvedLazyScriptGroups): string;
|
|
235
243
|
export function wrapWithScriptsInjector<T extends TemplateContentShape>(
|
|
236
244
|
content: T,
|
|
237
245
|
lazyGroups: ResolvedLazyScriptGroups,
|
|
@@ -282,21 +290,21 @@ export function decodeHtmlEntities(value: string): string {
|
|
|
282
290
|
return decoded;
|
|
283
291
|
}
|
|
284
292
|
|
|
285
|
-
export function
|
|
293
|
+
export function normalizeUnresolvedMarkerArtifactHtml(html: string): string {
|
|
286
294
|
return html.replace(
|
|
287
295
|
/&(?:amp;)?lt;eco-marker\b[\s\S]*?&(?:amp;)?gt;&(?:amp;)?lt;\/eco-marker&(?:amp;)?gt;/g,
|
|
288
296
|
(marker) => decodeHtmlEntities(marker),
|
|
289
297
|
);
|
|
290
298
|
}
|
|
291
299
|
|
|
292
|
-
export function
|
|
293
|
-
|
|
300
|
+
export function inspectUnresolvedMarkerArtifactHtml(html: string): {
|
|
301
|
+
hasUnresolvedMarkerArtifacts: boolean;
|
|
294
302
|
normalizedHtml: string;
|
|
295
303
|
} {
|
|
296
|
-
const normalizedHtml =
|
|
304
|
+
const normalizedHtml = normalizeUnresolvedMarkerArtifactHtml(html);
|
|
297
305
|
|
|
298
306
|
return {
|
|
299
307
|
normalizedHtml,
|
|
300
|
-
|
|
308
|
+
hasUnresolvedMarkerArtifacts: normalizedHtml.includes('<eco-marker'),
|
|
301
309
|
};
|
|
302
310
|
}
|