@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.
Files changed (111) hide show
  1. package/README.md +63 -7
  2. package/package.json +4 -47
  3. package/src/adapters/bun/create-app.ts +54 -2
  4. package/src/adapters/bun/hmr-manager.test.ts +0 -2
  5. package/src/adapters/bun/hmr-manager.ts +1 -24
  6. package/src/adapters/bun/server-adapter.ts +30 -4
  7. package/src/adapters/node/node-hmr-manager.test.ts +0 -2
  8. package/src/adapters/node/node-hmr-manager.ts +2 -25
  9. package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
  10. package/src/adapters/shared/explicit-static-route-matcher.test.ts +6 -6
  11. package/src/adapters/shared/explicit-static-route-matcher.ts +22 -31
  12. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +5 -10
  13. package/src/adapters/shared/file-route-middleware-pipeline.ts +8 -17
  14. package/src/adapters/shared/fs-server-response-factory.test.ts +32 -43
  15. package/src/adapters/shared/fs-server-response-factory.ts +15 -37
  16. package/src/adapters/shared/fs-server-response-matcher.test.ts +65 -39
  17. package/src/adapters/shared/fs-server-response-matcher.ts +94 -43
  18. package/src/adapters/shared/hmr-manager.contract.test.ts +0 -4
  19. package/src/adapters/shared/render-context.ts +3 -3
  20. package/src/adapters/shared/server-adapter.test.ts +53 -0
  21. package/src/adapters/shared/server-adapter.ts +228 -159
  22. package/src/adapters/shared/server-route-handler.test.ts +6 -5
  23. package/src/adapters/shared/server-route-handler.ts +4 -4
  24. package/src/adapters/shared/server-static-builder.test.ts +4 -4
  25. package/src/adapters/shared/server-static-builder.ts +4 -4
  26. package/src/config/README.md +1 -1
  27. package/src/config/config-builder.test.ts +0 -1
  28. package/src/config/config-builder.ts +2 -7
  29. package/src/dev/host-runtime.ts +34 -0
  30. package/src/eco/eco.browser.test.ts +2 -2
  31. package/src/eco/eco.browser.ts +2 -2
  32. package/src/eco/eco.test.ts +6 -6
  33. package/src/eco/eco.ts +12 -12
  34. package/src/eco/eco.types.ts +3 -3
  35. package/src/errors/index.ts +1 -0
  36. package/src/hmr/client/hmr-runtime.ts +4 -2
  37. package/src/hmr/strategies/js-hmr-strategy.test.ts +0 -1
  38. package/src/hmr/strategies/js-hmr-strategy.ts +0 -6
  39. package/src/integrations/ghtml/ghtml-renderer.test.ts +7 -7
  40. package/src/integrations/ghtml/ghtml-renderer.ts +1 -11
  41. package/src/plugins/eco-component-meta-plugin.ts +0 -1
  42. package/src/plugins/integration-plugin.test.ts +9 -14
  43. package/src/plugins/integration-plugin.ts +34 -22
  44. package/src/plugins/processor.ts +17 -0
  45. package/src/route-renderer/GRAPH.md +81 -289
  46. package/src/route-renderer/README.md +67 -105
  47. package/src/route-renderer/orchestration/component-render-context.ts +45 -38
  48. package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
  49. package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +383 -0
  50. package/src/route-renderer/orchestration/integration-renderer.test.ts +118 -121
  51. package/src/route-renderer/orchestration/integration-renderer.ts +362 -403
  52. package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
  53. package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
  54. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +1 -1
  55. package/src/route-renderer/orchestration/{queued-boundary-runtime.service.test.ts → queued-foreign-subtree-resolution.service.test.ts} +76 -71
  56. package/src/route-renderer/orchestration/{queued-boundary-runtime.service.ts → queued-foreign-subtree-resolution.service.ts} +68 -63
  57. package/src/route-renderer/orchestration/render-output.utils.ts +21 -13
  58. package/src/route-renderer/orchestration/{render-preparation.service.test.ts → route-render-orchestrator.prepare-render-options.test.ts} +160 -85
  59. package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +265 -0
  60. package/src/route-renderer/orchestration/{render-preparation.service.ts → route-render-orchestrator.ts} +244 -160
  61. package/src/route-renderer/page-loading/component-dependency-collection.ts +9 -3
  62. package/src/route-renderer/page-loading/declared-asset-collection.ts +2 -5
  63. package/src/route-renderer/page-loading/dependency-resolver.test.ts +107 -11
  64. package/src/route-renderer/page-loading/dependency-resolver.ts +6 -12
  65. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +1 -1
  66. package/src/route-renderer/page-loading/lazy-entry-collection.ts +1 -1
  67. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +1 -1
  68. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +1 -1
  69. package/src/route-renderer/page-loading/module-declaration-scripts.ts +1 -1
  70. package/src/route-renderer/page-loading/page-dependency-bundling.ts +105 -66
  71. package/src/route-renderer/route-renderer.ts +28 -31
  72. package/src/router/README.md +16 -19
  73. package/src/router/server/route-registry.test.ts +176 -0
  74. package/src/router/server/route-registry.ts +382 -0
  75. package/src/services/README.md +1 -2
  76. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +1 -1
  77. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +1 -4
  78. package/src/services/assets/asset-processing-service/asset-processing.service.ts +1 -2
  79. package/src/services/assets/asset-processing-service/assets.types.ts +3 -0
  80. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +1 -1
  81. package/src/services/assets/asset-processing-service/index.ts +1 -0
  82. package/src/{route-renderer/orchestration/page-packaging.service.test.ts → services/assets/asset-processing-service/page-package.test.ts} +38 -14
  83. package/src/services/assets/asset-processing-service/page-package.ts +93 -0
  84. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +4 -5
  85. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +13 -10
  86. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +3 -0
  87. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +6 -0
  88. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +2 -0
  89. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +1 -0
  90. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +2 -0
  91. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +1 -1
  92. package/src/services/html/html-transformer.service.test.ts +1 -4
  93. package/src/services/module-loading/app-server-module-transpiler.service.ts +1 -3
  94. package/src/services/module-loading/node-bootstrap-plugin.ts +17 -3
  95. package/src/services/module-loading/page-module-import.service.ts +0 -1
  96. package/src/services/module-loading/source-module-support.ts +1 -1
  97. package/src/static-site-generator/static-site-generator.test.ts +124 -32
  98. package/src/static-site-generator/static-site-generator.ts +168 -185
  99. package/src/types/internal-types.ts +13 -12
  100. package/src/types/public-types.ts +55 -39
  101. package/src/watchers/project-watcher.test-helpers.ts +4 -3
  102. package/src/route-renderer/orchestration/boundary-planning.service.ts +0 -146
  103. package/src/route-renderer/orchestration/page-packaging.service.ts +0 -85
  104. package/src/route-renderer/orchestration/render-execution.service.test.ts +0 -196
  105. package/src/route-renderer/orchestration/render-execution.service.ts +0 -182
  106. package/src/route-renderer/orchestration/route-shell-composer.service.ts +0 -162
  107. package/src/router/server/fs-router-scanner.test.ts +0 -83
  108. package/src/router/server/fs-router-scanner.ts +0 -224
  109. package/src/router/server/fs-router.test.ts +0 -214
  110. package/src/router/server/fs-router.ts +0 -122
  111. 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
- BoundaryRenderPayload,
4
+ ForeignSubtreeRenderPayload,
5
5
  ComponentRenderInput,
6
6
  EcoComponent,
7
7
  } from '../../types/public-types.ts';
8
- import type { ComponentBoundaryRuntime } from './component-render-context.ts';
8
+ import type { ForeignChildRuntime } from './component-render-context.ts';
9
9
 
10
- export type QueuedBoundaryDecisionInput = {
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 QueuedBoundaryResolution = {
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 boundary runtime.
25
+ * Shared mutable state for one renderer-owned queued foreign-subtree runtime.
26
26
  *
27
- * Renderers that cannot resolve foreign boundaries inline can enqueue transport
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 QueuedBoundaryRuntimeContext = {
31
+ export type QueuedForeignSubtreeResolutionContext = {
32
32
  rendererCache: Map<string, unknown>;
33
33
  componentInstanceScope?: string;
34
- nextBoundaryId: number;
35
- queuedResolutions: QueuedBoundaryResolution[];
34
+ nextForeignSubtreeId: number;
35
+ queuedResolutions: QueuedForeignSubtreeResolution[];
36
36
  };
37
37
 
38
- type QueuedBoundaryIntegrationContext = BaseIntegrationContext & Record<string, unknown>;
38
+ type QueuedForeignSubtreeIntegrationContext = BaseIntegrationContext & Record<string, unknown>;
39
39
 
40
- type QueuedBoundaryChildRenderResult = {
40
+ type QueuedForeignSubtreeChildRenderResult = {
41
41
  assets: ProcessedAsset[];
42
42
  html?: string;
43
43
  };
44
44
 
45
45
  /**
46
- * Shared queue orchestration for renderer-owned boundary runtimes that emit
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 `ComponentBoundaryRuntime` that enqueues foreign boundaries
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
- * Renderers still own framework-specific child rendering. This service only
56
- * handles queue bookkeeping, recursion, cycle detection, and asset merging.
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 QueuedBoundaryRuntimeService {
59
+ export class QueuedForeignSubtreeResolutionService {
59
60
  /**
60
- * Reads the queued boundary runtime state previously attached to one render.
61
+ * Reads the queued foreign-subtree runtime state previously attached to one render.
61
62
  */
62
- getRuntimeContext<TContext extends QueuedBoundaryRuntimeContext>(
63
+ getRuntimeContext<TContext extends QueuedForeignSubtreeResolutionContext>(
63
64
  input: ComponentRenderInput,
64
65
  runtimeContextKey: string,
65
66
  ): TContext | undefined {
66
- const integrationContext = input.integrationContext as QueuedBoundaryIntegrationContext | undefined;
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 boundary must be handed off, the runtime returns
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 QueuedBoundaryRuntimeContext>(options: {
84
- boundaryInput: ComponentRenderInput;
84
+ createRuntime<TContext extends QueuedForeignSubtreeResolutionContext>(options: {
85
+ renderInput: ComponentRenderInput;
85
86
  rendererCache: Map<string, unknown>;
86
87
  runtimeContextKey: string;
87
88
  tokenPrefix: string;
88
- shouldQueueBoundary: (input: QueuedBoundaryDecisionInput) => boolean;
89
+ shouldQueueForeignChild: (input: QueuedForeignChildDecisionInput) => boolean;
89
90
  createRuntimeContext?: (
90
- integrationContext: QueuedBoundaryIntegrationContext,
91
+ integrationContext: QueuedForeignSubtreeIntegrationContext,
91
92
  rendererCache: Map<string, unknown>,
92
93
  ) => TContext;
93
- }): ComponentBoundaryRuntime {
94
+ }): ForeignChildRuntime {
94
95
  const runtimeContext = this.ensureRuntimeContext(options);
95
96
 
96
- const interceptBoundary = (input: QueuedBoundaryDecisionInput) => {
97
- if (!options.shouldQueueBoundary(input)) {
97
+ const interceptForeignChild = (input: QueuedForeignChildDecisionInput) => {
98
+ if (!options.shouldQueueForeignChild(input)) {
98
99
  return { kind: 'inline' as const };
99
100
  }
100
101
 
101
- runtimeContext.nextBoundaryId += 1;
102
- const boundaryId = runtimeContext.nextBoundaryId;
103
- const token = this.createBoundaryToken(options.tokenPrefix, runtimeContext, boundaryId);
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_${boundaryId}`
110
- : `n_${boundaryId}`,
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
- interceptBoundary,
121
- interceptBoundarySync: interceptBoundary,
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 QueuedBoundaryRuntimeContext>(options: {
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, QueuedBoundaryResolution>,
140
+ queuedResolutionsByToken: Map<string, QueuedForeignSubtreeResolution>,
140
141
  resolveToken: (token: string) => Promise<string>,
141
- ) => Promise<QueuedBoundaryChildRenderResult>;
142
- resolveBoundary: (
142
+ ) => Promise<QueuedForeignSubtreeChildRenderResult>;
143
+ resolveForeignSubtree: (
143
144
  input: ComponentRenderInput,
144
145
  rendererCache: Map<string, unknown>,
145
- ) => Promise<BoundaryRenderPayload | undefined>;
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} boundary queue contains a cycle or unresolved dependency links.`,
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 boundaryRender = await options.resolveBoundary(
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 (!boundaryRender) {
206
+ if (!foreignSubtreeRender) {
206
207
  throw new Error(
207
- `[ecopages] ${options.queueLabel} queued boundary could not resolve its owning renderer.`,
208
+ `[ecopages] ${options.queueLabel} queued foreign subtree could not resolve its owning renderer.`,
208
209
  );
209
210
  }
210
211
 
211
- if ((boundaryRender.assets?.length ?? 0) > 0) {
212
- collectedAssets.push(...(boundaryRender.assets ?? []));
212
+ if ((foreignSubtreeRender.assets?.length ?? 0) > 0) {
213
+ collectedAssets.push(...(foreignSubtreeRender.assets ?? []));
213
214
  }
214
215
 
215
216
  const resolvedHtml =
216
- boundaryRender.attachmentPolicy.kind === 'first-element' && boundaryRender.rootAttributes
217
- ? options.applyAttributesToFirstElement(boundaryRender.html, boundaryRender.rootAttributes)
218
- : boundaryRender.html;
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 createBoundaryToken(
248
+ private createForeignSubtreeToken(
244
249
  tokenPrefix: string,
245
- runtimeContext: QueuedBoundaryRuntimeContext,
246
- boundaryId: number,
250
+ runtimeContext: QueuedForeignSubtreeResolutionContext,
251
+ foreignSubtreeId: number,
247
252
  ): string {
248
- return `${tokenPrefix}${runtimeContext.componentInstanceScope ?? 'root'}__${boundaryId}__`;
253
+ return `${tokenPrefix}${runtimeContext.componentInstanceScope ?? 'root'}__${foreignSubtreeId}__`;
249
254
  }
250
255
 
251
- private ensureRuntimeContext<TContext extends QueuedBoundaryRuntimeContext>(options: {
252
- boundaryInput: ComponentRenderInput;
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: QueuedBoundaryIntegrationContext,
261
+ integrationContext: QueuedForeignSubtreeIntegrationContext,
257
262
  rendererCache: Map<string, unknown>,
258
263
  ) => TContext;
259
264
  }): TContext {
260
- let integrationContext: QueuedBoundaryIntegrationContext;
265
+ let integrationContext: QueuedForeignSubtreeIntegrationContext;
261
266
  if (
262
- typeof options.boundaryInput.integrationContext === 'object' &&
263
- options.boundaryInput.integrationContext !== null
267
+ typeof options.renderInput.integrationContext === 'object' &&
268
+ options.renderInput.integrationContext !== null
264
269
  ) {
265
- integrationContext = options.boundaryInput.integrationContext as QueuedBoundaryIntegrationContext;
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
- nextBoundaryId: 0,
282
+ nextForeignSubtreeId: 0,
278
283
  queuedResolutions: [],
279
- } satisfies QueuedBoundaryRuntimeContext);
284
+ } satisfies QueuedForeignSubtreeResolutionContext);
280
285
  } else {
281
- (existingRuntimeContext as QueuedBoundaryRuntimeContext).rendererCache = options.rendererCache;
286
+ (existingRuntimeContext as QueuedForeignSubtreeResolutionContext).rendererCache = options.rendererCache;
282
287
  }
283
288
 
284
289
  integrationContext.rendererCache = options.rendererCache;
285
- options.boundaryInput.integrationContext = integrationContext;
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>(content: T, firstString: string): T {
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 typeof value === 'object' && value !== null && typeof (value as { nodeType?: unknown }).nodeType === 'number';
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(content: unknown, triggerId: string): string | TemplateContentShape | MarkupNodeLikeShape;
202
- export function addTriggerAttribute(content: unknown, triggerId: string): string | TemplateContentShape | MarkupNodeLikeShape {
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 normalizeBoundaryArtifactHtml(html: string): string {
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 inspectBoundaryArtifactHtml(html: string): {
293
- hasUnresolvedBoundaryArtifacts: boolean;
300
+ export function inspectUnresolvedMarkerArtifactHtml(html: string): {
301
+ hasUnresolvedMarkerArtifacts: boolean;
294
302
  normalizedHtml: string;
295
303
  } {
296
- const normalizedHtml = normalizeBoundaryArtifactHtml(html);
304
+ const normalizedHtml = normalizeUnresolvedMarkerArtifactHtml(html);
297
305
 
298
306
  return {
299
307
  normalizedHtml,
300
- hasUnresolvedBoundaryArtifacts: normalizedHtml.includes('<eco-marker'),
308
+ hasUnresolvedMarkerArtifacts: normalizedHtml.includes('<eco-marker'),
301
309
  };
302
310
  }