@craft-ts/component 0.7.0-beta.13 → 0.7.0-beta.16

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 (195) hide show
  1. package/package.json +7 -2
  2. package/src/index.d.ts +40 -40
  3. package/src/index.js +35 -35
  4. package/src/lib/a11y-control.d.ts +0 -1
  5. package/src/lib/a11y-control.js +0 -1
  6. package/src/lib/a11y.d.ts +4 -5
  7. package/src/lib/a11y.js +3 -4
  8. package/src/lib/ai/ai-context-menu.d.ts +24 -25
  9. package/src/lib/ai/ai-context-menu.js +2 -3
  10. package/src/lib/ai/ai-send-dialog.d.ts +277 -278
  11. package/src/lib/ai/ai-send-dialog.js +4 -5
  12. package/src/lib/ai/send-context-to-ai.d.ts +1 -2
  13. package/src/lib/ai/send-context-to-ai.js +4 -5
  14. package/src/lib/assert-defined-input.d.ts +1 -2
  15. package/src/lib/assert-defined-input.js +0 -1
  16. package/src/lib/bootstrap.d.ts +4 -3
  17. package/src/lib/bootstrap.js +6 -8
  18. package/src/lib/bridge.d.ts +9 -10
  19. package/src/lib/bridge.js +3 -4
  20. package/src/lib/catch-node.d.ts +35 -0
  21. package/src/lib/{block.js → catch-node.js} +9 -10
  22. package/src/lib/component.d.ts +23 -10
  23. package/src/lib/component.js +5 -6
  24. package/src/lib/composition.d.ts +1 -2
  25. package/src/lib/composition.js +2 -3
  26. package/src/lib/craft-defaults.d.ts +0 -1
  27. package/src/lib/craft-defaults.js +4 -5
  28. package/src/lib/craft-host-tokens.d.ts +0 -1
  29. package/src/lib/craft-host-tokens.js +0 -1
  30. package/src/lib/craft-router-outlet.d.ts +1 -2
  31. package/src/lib/craft-router-outlet.js +1 -2
  32. package/src/lib/css-vars.d.ts +0 -1
  33. package/src/lib/css-vars.js +0 -1
  34. package/src/lib/css-vars.type.d.ts +1 -2
  35. package/src/lib/css-vars.type.js +0 -1
  36. package/src/lib/{defer.d.ts → defer-node.d.ts} +4 -5
  37. package/src/lib/{defer.js → defer-node.js} +1 -2
  38. package/src/lib/directive.d.ts +1 -2
  39. package/src/lib/directive.js +1 -2
  40. package/src/lib/factory-runtime.d.ts +1 -2
  41. package/src/lib/factory-runtime.js +0 -1
  42. package/src/lib/{field-exception-block.d.ts → field-error-node.d.ts} +22 -23
  43. package/src/lib/{field-exception-block.js → field-error-node.js} +8 -9
  44. package/src/lib/for-node.d.ts +28 -0
  45. package/src/lib/{each.js → for-node.js} +4 -5
  46. package/src/lib/for-scheduling.d.ts +58 -0
  47. package/src/lib/{each-scheduling.js → for-scheduling.js} +14 -15
  48. package/src/lib/host-runtime.d.ts +0 -1
  49. package/src/lib/host-runtime.js +0 -1
  50. package/src/lib/hydrate.d.ts +2 -3
  51. package/src/lib/hydrate.js +57 -18
  52. package/src/lib/hyperscript.d.ts +1 -2
  53. package/src/lib/hyperscript.js +1 -2
  54. package/src/lib/if-node.d.ts +7 -0
  55. package/src/lib/{if-block.js → if-node.js} +2 -3
  56. package/src/lib/locator.d.ts +5 -6
  57. package/src/lib/locator.js +1 -2
  58. package/src/lib/{match-block.d.ts → match-node.d.ts} +8 -9
  59. package/src/lib/{match-block.js → match-node.js} +3 -4
  60. package/src/lib/{pending-block.d.ts → pending-node.d.ts} +28 -29
  61. package/src/lib/{pending-block.js → pending-node.js} +12 -13
  62. package/src/lib/project.d.ts +2 -3
  63. package/src/lib/project.js +2 -3
  64. package/src/lib/render/hydration-metadata.d.ts +0 -1
  65. package/src/lib/render/hydration-metadata.js +0 -1
  66. package/src/lib/render/hydration.d.ts +0 -1
  67. package/src/lib/render/hydration.js +0 -1
  68. package/src/lib/render/interpreter.d.ts +9 -8
  69. package/src/lib/render/interpreter.js +156 -81
  70. package/src/lib/render/server-style-collector.d.ts +0 -1
  71. package/src/lib/render/server-style-collector.js +0 -1
  72. package/src/lib/render/ssr-coordinator.d.ts +4 -2
  73. package/src/lib/render/ssr-coordinator.js +14 -3
  74. package/src/lib/render/string-dom.d.ts +0 -1
  75. package/src/lib/render/string-dom.js +48 -7
  76. package/src/lib/render/style-registry.d.ts +3 -2
  77. package/src/lib/render/style-registry.js +3 -2
  78. package/src/lib/render/style-scope.d.ts +0 -1
  79. package/src/lib/render/style-scope.js +0 -1
  80. package/src/lib/render/vnode.d.ts +117 -54
  81. package/src/lib/render/vnode.js +26 -27
  82. package/src/lib/security.d.ts +54 -0
  83. package/src/lib/security.js +502 -0
  84. package/src/lib/server-render.d.ts +12 -3
  85. package/src/lib/server-render.js +76 -17
  86. package/src/lib/start.d.ts +2 -3
  87. package/src/lib/start.js +3 -3
  88. package/src/lib/template-contract.d.ts +22 -23
  89. package/src/lib/template-contract.js +0 -1
  90. package/src/lib/template.d.ts +2 -3
  91. package/src/lib/template.js +2 -3
  92. package/src/lib/testing.d.ts +3 -4
  93. package/src/lib/testing.js +5 -6
  94. package/src/lib/types.d.ts +40 -28
  95. package/src/lib/types.js +3 -4
  96. package/testing/public-api.d.ts +0 -1
  97. package/testing/public-api.js +0 -1
  98. package/src/index.d.ts.map +0 -1
  99. package/src/index.js.map +0 -1
  100. package/src/lib/a11y-control.d.ts.map +0 -1
  101. package/src/lib/a11y-control.js.map +0 -1
  102. package/src/lib/a11y.d.ts.map +0 -1
  103. package/src/lib/a11y.js.map +0 -1
  104. package/src/lib/ai/ai-context-menu.d.ts.map +0 -1
  105. package/src/lib/ai/ai-context-menu.js.map +0 -1
  106. package/src/lib/ai/ai-send-dialog.d.ts.map +0 -1
  107. package/src/lib/ai/ai-send-dialog.js.map +0 -1
  108. package/src/lib/ai/send-context-to-ai.d.ts.map +0 -1
  109. package/src/lib/ai/send-context-to-ai.js.map +0 -1
  110. package/src/lib/assert-defined-input.d.ts.map +0 -1
  111. package/src/lib/assert-defined-input.js.map +0 -1
  112. package/src/lib/block.d.ts +0 -36
  113. package/src/lib/block.d.ts.map +0 -1
  114. package/src/lib/block.js.map +0 -1
  115. package/src/lib/bootstrap.d.ts.map +0 -1
  116. package/src/lib/bootstrap.js.map +0 -1
  117. package/src/lib/bridge.d.ts.map +0 -1
  118. package/src/lib/bridge.js.map +0 -1
  119. package/src/lib/component.d.ts.map +0 -1
  120. package/src/lib/component.js.map +0 -1
  121. package/src/lib/composition.d.ts.map +0 -1
  122. package/src/lib/composition.js.map +0 -1
  123. package/src/lib/craft-defaults.d.ts.map +0 -1
  124. package/src/lib/craft-defaults.js.map +0 -1
  125. package/src/lib/craft-host-tokens.d.ts.map +0 -1
  126. package/src/lib/craft-host-tokens.js.map +0 -1
  127. package/src/lib/craft-router-outlet.d.ts.map +0 -1
  128. package/src/lib/craft-router-outlet.js.map +0 -1
  129. package/src/lib/css-vars.d.ts.map +0 -1
  130. package/src/lib/css-vars.js.map +0 -1
  131. package/src/lib/css-vars.type.d.ts.map +0 -1
  132. package/src/lib/css-vars.type.js.map +0 -1
  133. package/src/lib/defer.d.ts.map +0 -1
  134. package/src/lib/defer.js.map +0 -1
  135. package/src/lib/directive.d.ts.map +0 -1
  136. package/src/lib/directive.js.map +0 -1
  137. package/src/lib/each-scheduling.d.ts +0 -59
  138. package/src/lib/each-scheduling.d.ts.map +0 -1
  139. package/src/lib/each-scheduling.js.map +0 -1
  140. package/src/lib/each.d.ts +0 -29
  141. package/src/lib/each.d.ts.map +0 -1
  142. package/src/lib/each.js.map +0 -1
  143. package/src/lib/factory-runtime.d.ts.map +0 -1
  144. package/src/lib/factory-runtime.js.map +0 -1
  145. package/src/lib/field-exception-block.d.ts.map +0 -1
  146. package/src/lib/field-exception-block.js.map +0 -1
  147. package/src/lib/host-runtime.d.ts.map +0 -1
  148. package/src/lib/host-runtime.js.map +0 -1
  149. package/src/lib/hydrate.d.ts.map +0 -1
  150. package/src/lib/hydrate.js.map +0 -1
  151. package/src/lib/hyperscript.d.ts.map +0 -1
  152. package/src/lib/hyperscript.js.map +0 -1
  153. package/src/lib/if-block.d.ts +0 -8
  154. package/src/lib/if-block.d.ts.map +0 -1
  155. package/src/lib/if-block.js.map +0 -1
  156. package/src/lib/locator.d.ts.map +0 -1
  157. package/src/lib/locator.js.map +0 -1
  158. package/src/lib/match-block.d.ts.map +0 -1
  159. package/src/lib/match-block.js.map +0 -1
  160. package/src/lib/pending-block.d.ts.map +0 -1
  161. package/src/lib/pending-block.js.map +0 -1
  162. package/src/lib/project.d.ts.map +0 -1
  163. package/src/lib/project.js.map +0 -1
  164. package/src/lib/render/hydration-metadata.d.ts.map +0 -1
  165. package/src/lib/render/hydration-metadata.js.map +0 -1
  166. package/src/lib/render/hydration.d.ts.map +0 -1
  167. package/src/lib/render/hydration.js.map +0 -1
  168. package/src/lib/render/interpreter.d.ts.map +0 -1
  169. package/src/lib/render/interpreter.js.map +0 -1
  170. package/src/lib/render/server-style-collector.d.ts.map +0 -1
  171. package/src/lib/render/server-style-collector.js.map +0 -1
  172. package/src/lib/render/ssr-coordinator.d.ts.map +0 -1
  173. package/src/lib/render/ssr-coordinator.js.map +0 -1
  174. package/src/lib/render/string-dom.d.ts.map +0 -1
  175. package/src/lib/render/string-dom.js.map +0 -1
  176. package/src/lib/render/style-registry.d.ts.map +0 -1
  177. package/src/lib/render/style-registry.js.map +0 -1
  178. package/src/lib/render/style-scope.d.ts.map +0 -1
  179. package/src/lib/render/style-scope.js.map +0 -1
  180. package/src/lib/render/vnode.d.ts.map +0 -1
  181. package/src/lib/render/vnode.js.map +0 -1
  182. package/src/lib/server-render.d.ts.map +0 -1
  183. package/src/lib/server-render.js.map +0 -1
  184. package/src/lib/start.d.ts.map +0 -1
  185. package/src/lib/start.js.map +0 -1
  186. package/src/lib/template-contract.d.ts.map +0 -1
  187. package/src/lib/template-contract.js.map +0 -1
  188. package/src/lib/template.d.ts.map +0 -1
  189. package/src/lib/template.js.map +0 -1
  190. package/src/lib/testing.d.ts.map +0 -1
  191. package/src/lib/testing.js.map +0 -1
  192. package/src/lib/types.d.ts.map +0 -1
  193. package/src/lib/types.js.map +0 -1
  194. package/testing/public-api.d.ts.map +0 -1
  195. package/testing/public-api.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { type CraftInjector, type CraftTransferSnapshot } from '@craft-ts/core';
2
- import { type CraftComponent, type PropsOf } from './types';
1
+ import { type CraftInjector, type CraftSecurityPolicyInput, type CraftRuntimeMode, type CraftTransferSnapshot } from '@craft-ts/core';
2
+ import { type CraftComponent, type PropsOf } from './types.js';
3
3
  export declare const CRAFT_TRANSFER_SCRIPT_ID = "__CRAFT_TRANSFER__";
4
4
  export type RenderCraftOptions = Readonly<{
5
5
  config: {
@@ -11,6 +11,13 @@ export type RenderCraftOptions = Readonly<{
11
11
  signal?: AbortSignal;
12
12
  includeStyles?: boolean;
13
13
  includeSnapshotScript?: boolean;
14
+ mode?: CraftRuntimeMode;
15
+ securityPolicy?: CraftSecurityPolicyInput;
16
+ /**
17
+ * Nonce CSP de la requête. Il est reporté sur les styles rendus, ce qui
18
+ * permet une politique sans `'unsafe-inline'`.
19
+ */
20
+ cspNonce?: string;
14
21
  }>;
15
22
  export type RenderCraftResult = Readonly<{
16
23
  html: string;
@@ -26,9 +33,11 @@ export type RenderToStringOptions<Component extends CraftComponent<any>> = Reado
26
33
  url?: string;
27
34
  timeoutMs?: number;
28
35
  signal?: AbortSignal;
36
+ mode?: CraftRuntimeMode;
37
+ securityPolicy?: CraftSecurityPolicyInput;
38
+ cspNonce?: string;
29
39
  }>;
30
40
  /** Low-level component convenience API built on the same per-request runtime. */
31
41
  export declare function renderToString<Component extends CraftComponent<any>>(component: Component, options?: RenderToStringOptions<Component>): Promise<string>;
32
42
  /** Kept type-visible for adapters that need to share the request injector. */
33
43
  export type CraftServerInjector = CraftInjector;
34
- //# sourceMappingURL=server-render.d.ts.map
@@ -1,28 +1,58 @@
1
- import { CRAFT_PLATFORM, CRAFT_PRIMITIVE_REGISTRY, CRAFT_SSR_RUNTIME, captureCraftTransferSnapshot, createCraftRenderIdentity, createServerPlatform, serializeCraftTransferSnapshot, } from '@craft-ts/core';
2
- import { ɵcreateCraftApplicationInjector, ɵrunCraftAppInitializers, } from './bootstrap';
3
- import { CRAFT_ROOT_COMPONENT } from './craft-host-tokens';
4
- import { provideCraftRootComponent } from './bridge';
5
- import { mountInterpretedComponentWithOptions, } from './render/interpreter';
6
- import { createServerStyleCollector } from './render/server-style-collector';
7
- import { CraftSsrCoordinator } from './render/ssr-coordinator';
8
- import { createStringDomAdapter } from './render/string-dom';
9
- import { CRAFT_COMPONENT } from './types';
1
+ import { CRAFT_PLATFORM, CRAFT_PRIMITIVE_REGISTRY, CRAFT_SECURITY_POLICY, CRAFT_SSR_RUNTIME, CraftCspNonce, captureCraftTransferSnapshot, createCraftSecurityPolicy, createCraftRenderIdentity, createServerPlatform, assertCraftCspNonce, serializeCraftTransferSnapshot, } from '@craft-ts/core';
2
+ import { ɵcreateCraftApplicationInjector, ɵrunCraftAppInitializers, } from './bootstrap.js';
3
+ import { CRAFT_ROOT_COMPONENT } from './craft-host-tokens.js';
4
+ import { provideCraftRootComponent } from './bridge.js';
5
+ import { mountInterpretedComponentWithOptions, } from './render/interpreter.js';
6
+ import { createServerStyleCollector } from './render/server-style-collector.js';
7
+ import { CraftSsrCoordinator } from './render/ssr-coordinator.js';
8
+ import { createStringDomAdapter } from './render/string-dom.js';
9
+ import { CRAFT_COMPONENT } from './types.js';
10
10
  export const CRAFT_TRANSFER_SCRIPT_ID = '__CRAFT_TRANSFER__';
11
11
  /** Renders one fully isolated Craft application request to deterministic HTML. */
12
12
  export async function renderCraft(options) {
13
+ const requestedPolicy = options.securityPolicy
14
+ ? createCraftSecurityPolicy(options.securityPolicy)
15
+ : undefined;
16
+ const defaultPolicy = requestedPolicy ?? createCraftSecurityPolicy();
17
+ const hasConfiguredPolicy = options.config.providers.some((provider) => typeof provider === 'object' &&
18
+ provider !== null &&
19
+ ('provide' in provider
20
+ ? provider.provide === CRAFT_SECURITY_POLICY
21
+ : 'token' in provider && provider.token === CRAFT_SECURITY_POLICY));
22
+ const controller = new AbortController();
23
+ const removeExternalAbort = forwardAbort(options.signal, controller);
24
+ const timeoutMs = options.timeoutMs ?? defaultPolicy.ssr.timeoutMs;
25
+ const timeout = setTimeout(() => controller.abort(new Error(`Craft SSR timed out after ${timeoutMs}ms.`)), timeoutMs);
13
26
  const dom = createStringDomAdapter();
14
27
  const platform = createServerPlatform({
15
28
  url: options.url,
16
29
  document: dom.document,
17
- signal: options.signal,
30
+ signal: controller.signal,
18
31
  });
19
- const coordinator = new CraftSsrCoordinator((source, mode) => platform.serverResources?.decide(source, mode));
32
+ const coordinator = new CraftSsrCoordinator((source, mode) => platform.serverResources?.decide(source, mode), defaultPolicy.ssr.sourceTimeoutMs);
20
33
  const injector = ɵcreateCraftApplicationInjector(options.config, [
21
34
  { provide: CRAFT_PLATFORM, useValue: platform },
22
35
  { provide: CRAFT_SSR_RUNTIME, useValue: coordinator },
23
- ]);
36
+ ...(requestedPolicy || !hasConfiguredPolicy
37
+ ? [
38
+ {
39
+ provide: CRAFT_SECURITY_POLICY,
40
+ useValue: requestedPolicy ?? defaultPolicy,
41
+ },
42
+ ]
43
+ : []),
44
+ ...(options.cspNonce
45
+ ? [
46
+ {
47
+ provide: CraftCspNonce,
48
+ useValue: assertCraftCspNonce(options.cspNonce),
49
+ },
50
+ ]
51
+ : []),
52
+ ], options.mode);
24
53
  let mounted;
25
54
  try {
55
+ const securityPolicy = injector.get(CRAFT_SECURITY_POLICY, defaultPolicy);
26
56
  await Promise.all(ɵrunCraftAppInitializers(injector));
27
57
  const root = injector.get(CRAFT_ROOT_COMPONENT);
28
58
  if (!root) {
@@ -39,16 +69,21 @@ export async function renderCraft(options) {
39
69
  ssr: coordinator,
40
70
  serverStyles,
41
71
  });
42
- await coordinator.untilSettled(options.timeoutMs ?? 5_000, options.signal);
72
+ await coordinator.untilSettled(timeoutMs, controller.signal);
43
73
  const styles = serverStyles.cssText();
44
- const snapshot = captureCraftTransferSnapshot(injector.get(CRAFT_PRIMITIVE_REGISTRY));
74
+ const snapshot = captureCraftTransferSnapshot(injector.get(CRAFT_PRIMITIVE_REGISTRY), { policy: securityPolicy.transfer });
45
75
  const rootHtml = dom.serialize(host);
76
+ const htmlSize = byteLength(rootHtml) + byteLength(styles);
77
+ if (htmlSize > securityPolicy.ssr.maxHtmlBytes) {
78
+ throw new Error(`CRAFT_SSR_HTML_TOO_LARGE: generated HTML exceeds ${securityPolicy.ssr.maxHtmlBytes} bytes.`);
79
+ }
80
+ const nonce = injector.get(CraftCspNonce, null);
46
81
  const styleHtml = options.includeStyles === false || !styles
47
82
  ? ''
48
- : `<style data-craft-ssr>${escapeStyleText(styles)}</style>`;
83
+ : `<style data-craft-ssr${nonce ? ` nonce="${escapeAttribute(nonce)}"` : ''}>${escapeStyleText(styles)}</style>`;
49
84
  const snapshotHtml = options.includeSnapshotScript === false
50
85
  ? ''
51
- : `<script id="${CRAFT_TRANSFER_SCRIPT_ID}" type="application/json">${serializeCraftTransferSnapshot(snapshot)}</script>`;
86
+ : `<script id="${CRAFT_TRANSFER_SCRIPT_ID}" type="application/json">${serializeCraftTransferSnapshot(snapshot, securityPolicy.transfer)}</script>`;
52
87
  return {
53
88
  html: `${styleHtml}${rootHtml}${snapshotHtml}`,
54
89
  rootHtml,
@@ -57,6 +92,9 @@ export async function renderCraft(options) {
57
92
  };
58
93
  }
59
94
  finally {
95
+ clearTimeout(timeout);
96
+ removeExternalAbort();
97
+ coordinator.dispose();
60
98
  mounted?.destroy();
61
99
  platform.history.dispose();
62
100
  injector.destroy?.();
@@ -75,10 +113,31 @@ export async function renderToString(component, options = {}) {
75
113
  url: options.url,
76
114
  timeoutMs: options.timeoutMs,
77
115
  signal: options.signal,
116
+ mode: options.mode,
117
+ ...(options.securityPolicy ? { securityPolicy: options.securityPolicy } : {}),
118
+ ...(options.cspNonce ? { cspNonce: options.cspNonce } : {}),
78
119
  });
79
120
  return result.html;
80
121
  }
81
122
  function escapeStyleText(value) {
82
123
  return value.replace(/<\/style/gi, '<\\/style');
83
124
  }
84
- //# sourceMappingURL=server-render.js.map
125
+ function escapeAttribute(value) {
126
+ return value
127
+ .replace(/&/g, '&amp;')
128
+ .replace(/"/g, '&quot;')
129
+ .replace(/'/g, '&#39;');
130
+ }
131
+ function byteLength(value) {
132
+ return new TextEncoder().encode(value).byteLength;
133
+ }
134
+ function forwardAbort(source, target) {
135
+ if (!source)
136
+ return () => undefined;
137
+ const abort = () => target.abort(source.reason);
138
+ if (source.aborted)
139
+ abort();
140
+ else
141
+ source.addEventListener('abort', abort, { once: true });
142
+ return () => source.removeEventListener('abort', abort);
143
+ }
@@ -1,5 +1,5 @@
1
- import { type CraftAppRef } from './bootstrap';
2
- import { type HydrateCraftOptions, type HydratedCraftAppRef } from './hydrate';
1
+ import { type CraftAppRef } from './bootstrap.js';
2
+ import { type HydrateCraftOptions, type HydratedCraftAppRef } from './hydrate.js';
3
3
  /** Options shared by a normal browser start and an SSR hydration. */
4
4
  export type StartCraftOptions = HydrateCraftOptions;
5
5
  export type StartedCraftAppRef = CraftAppRef | HydratedCraftAppRef;
@@ -10,4 +10,3 @@ export type StartedCraftAppRef = CraftAppRef | HydratedCraftAppRef;
10
10
  * hydrated; otherwise a fresh client render is mounted.
11
11
  */
12
12
  export declare function startCraft(options: StartCraftOptions): StartedCraftAppRef;
13
- //# sourceMappingURL=start.d.ts.map
package/src/lib/start.js CHANGED
@@ -1,5 +1,5 @@
1
- import { bootstrapCraft, } from './bootstrap';
2
- import { hydrateCraft, } from './hydrate';
1
+ import { bootstrapCraft, } from './bootstrap.js';
2
+ import { hydrateCraft, } from './hydrate.js';
3
3
  /**
4
4
  * Starts a Craft application in the browser.
5
5
  *
@@ -14,7 +14,7 @@ export function startCraft(options) {
14
14
  const bootstrapOptions = {
15
15
  config: options.config,
16
16
  host,
17
+ mode: options.mode,
17
18
  };
18
19
  return bootstrapCraft(bootstrapOptions);
19
20
  }
20
- //# sourceMappingURL=start.js.map
@@ -1,6 +1,6 @@
1
- import type { CraftComponent, ComponentTemplateOf, ComponentTemplateNameOf, FactoryContext, Output, PropsOf, TemplateMethodUse } from './types';
1
+ import type { CraftComponent, ComponentTemplateOf, ComponentTemplateNameOf, FactoryContext, Output, PropsOf, TemplateMethodUse } from './types.js';
2
2
  import type { NamedYieldableValue, Yieldable, YieldableMethod } from '@craft-ts/core';
3
- import type { ComponentNode, CraftDirectiveNode, CraftNodeChildren, DeferNode, EachNode, IfBlockNode, ElementNodeBase } from './render/vnode';
3
+ import type { ComponentNode, CraftDirectiveNode, CraftNodeChildren, DeferNode, ForNode, IfNode, ElementNodeBase } from './render/vnode.js';
4
4
  export type TemplateContractError<Message extends string> = {
5
5
  readonly error: Message;
6
6
  };
@@ -32,7 +32,7 @@ type InvalidOutputCallbacks<ActualProps, Component extends CraftComponent<any, a
32
32
  type ComponentOfNode<Node> = Node extends {
33
33
  readonly component: infer Component;
34
34
  } ? Component extends CraftComponent<any, any> ? Component : never : never;
35
- type VisitChildren<Children, Registry extends readonly CraftComponent<any, any>[], Seen extends readonly unknown[]> = Children extends readonly (infer Child)[] ? VisitChildren<Child, Registry, Seen> : Children extends ElementNodeBase<any, any, infer Props, infer Nested> ? InvalidElementCallbacks<Props> | VisitChildren<Nested, Registry, Seen> : Children extends ComponentNode<infer ActualProps, any, any> ? ComponentPropsMatch<ActualProps, ComponentOfNode<Children>> | InvalidOutputCallbacks<ActualProps, ComponentOfNode<Children>> | VisitComponent<ComponentOfNode<Children>, Registry, Seen> : Children extends CraftDirectiveNode<any> ? VisitChildren<Children['node'], Registry, Seen> : Children extends EachNode<infer _Item, infer _Key, infer _Dependencies> ? VisitChildren<ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never), Registry, Seen> : Children extends DeferNode<infer Loaded, infer _Dependencies> ? VisitChildren<Loaded extends CraftComponent<any, any> ? ComponentNode<PropsOf<Loaded>, {}, Loaded> : ReturnType<Children['resolve']>, Registry, Seen> : true;
35
+ type VisitChildren<Children, Registry extends readonly CraftComponent<any, any>[], Seen extends readonly unknown[]> = Children extends readonly (infer Child)[] ? VisitChildren<Child, Registry, Seen> : Children extends ElementNodeBase<any, any, infer Props, infer Nested> ? InvalidElementCallbacks<Props> | VisitChildren<Nested, Registry, Seen> : Children extends ComponentNode<infer ActualProps, any, any> ? ComponentPropsMatch<ActualProps, ComponentOfNode<Children>> | InvalidOutputCallbacks<ActualProps, ComponentOfNode<Children>> | VisitComponent<ComponentOfNode<Children>, Registry, Seen> : Children extends CraftDirectiveNode<any> ? VisitChildren<Children['node'], Registry, Seen> : Children extends ForNode<infer _Item, infer _Key, infer _Dependencies> ? VisitChildren<ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never), Registry, Seen> : Children extends DeferNode<infer Loaded, infer _Dependencies> ? VisitChildren<Loaded extends CraftComponent<any, any> ? ComponentNode<PropsOf<Loaded>, {}, Loaded> : ReturnType<Children['resolve']>, Registry, Seen> : true;
36
36
  type VisitComponent<Component extends CraftComponent<any, any>, Registry extends readonly CraftComponent<any, any>[], Seen extends readonly unknown[]> = IsAny<Component> extends true ? TemplateContractError<'Dynamic component references cannot be resolved.'> : IsUnion<Component> extends true ? TemplateContractError<'Union component references cannot be resolved by the template contract; register a concrete component.'> : Registered<Component, Registry> extends true ? Component extends Seen[number] ? true : VisitChildren<ReturnType<ComponentTemplateOf<Component>>, Registry, [
37
37
  ...Seen,
38
38
  Component
@@ -51,21 +51,21 @@ export type TemplateContractAssertions<Component extends CraftComponent<any, any
51
51
  */
52
52
  export type SetupTestComponentTemplate<Component extends CraftComponent<any, any>, Registry extends readonly CraftComponent<any, any>[] = []> = ContractResult<RootVisit<Component, Registry>> extends infer Result ? Result extends TemplateContractError<any> ? Result : TemplateContractAssertions<Component, Registry> : never;
53
53
  type ElementMatching<Children, Tag extends string, Props> = Children extends ElementNodeBase<any, infer ActualTag, infer ActualProps> ? ActualTag extends Tag ? [Props] extends [never] ? true : ActualProps extends Props ? Props extends ActualProps ? true : false : false : false : never;
54
- type FindElement<Children, Tag extends string, Props = never> = Children extends readonly (infer Child)[] ? FindElement<Child, Tag, Props> : Children extends ElementNodeBase<any, infer ActualTag, any> ? ActualTag extends Tag ? ElementMatching<Children, Tag, Props> : FindElement<Children['children'], Tag, Props> : Children extends CraftDirectiveNode<any> ? FindElement<Children['node'], Tag, Props> : Children extends ComponentNode<any, any, infer Component> ? FindElement<ReturnType<ComponentTemplateOf<Component>>, Tag, Props> : Children extends EachNode<any, any> ? FindElement<ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never), Tag, Props> : Children extends IfBlockNode<infer ConditionName, any, infer True, infer False> ? FindElement<True | False, Tag, Props> : Children extends DeferNode<infer Loaded> ? FindElement<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Tag, Props> : false;
54
+ type FindElement<Children, Tag extends string, Props = never> = Children extends readonly (infer Child)[] ? FindElement<Child, Tag, Props> : Children extends ElementNodeBase<any, infer ActualTag, any> ? ActualTag extends Tag ? ElementMatching<Children, Tag, Props> : FindElement<Children['children'], Tag, Props> : Children extends CraftDirectiveNode<any> ? FindElement<Children['node'], Tag, Props> : Children extends ComponentNode<any, any, infer Component> ? FindElement<ReturnType<ComponentTemplateOf<Component>>, Tag, Props> : Children extends ForNode<any, any> ? FindElement<ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never), Tag, Props> : Children extends IfNode<infer ConditionName, any, infer True, infer False> ? FindElement<True | False, Tag, Props> : Children extends DeferNode<infer Loaded> ? FindElement<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Tag, Props> : false;
55
55
  export type TemplateHasElement<Children extends CraftNodeChildren, Tag extends string> = FindElement<Children, Tag>;
56
56
  /** Checks the exact tag and props of a matching element. */
57
57
  export type TemplateHasElementWithProps<Children extends CraftNodeChildren, Tag extends string, Props extends object> = FindElement<Children, Tag, Props>;
58
- type VisitProperty<Children, Tag extends string, Property extends string, Value> = Children extends readonly (infer Child)[] ? VisitProperty<Child, Tag, Property, Value> : Children extends ElementNodeBase<any, infer ActualTag, infer Props, infer Nested> ? ActualTag extends Tag ? Property extends keyof Props ? NonNullable<Props[Property]> extends Value ? true : false : false : VisitProperty<Nested, Tag, Property, Value> : Children extends CraftDirectiveNode<any> ? VisitProperty<Children['node'], Tag, Property, Value> : Children extends ComponentNode<any, any, infer Component> ? VisitProperty<ReturnType<ComponentTemplateOf<Component>>, Tag, Property, Value> : Children extends EachNode<any, any> ? VisitProperty<(ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never)) & CraftNodeChildren, Tag, Property, Value> : Children extends DeferNode<infer Loaded> ? VisitProperty<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Tag, Property, Value> : false;
58
+ type VisitProperty<Children, Tag extends string, Property extends string, Value> = Children extends readonly (infer Child)[] ? VisitProperty<Child, Tag, Property, Value> : Children extends ElementNodeBase<any, infer ActualTag, infer Props, infer Nested> ? ActualTag extends Tag ? Property extends keyof Props ? NonNullable<Props[Property]> extends Value ? true : false : false : VisitProperty<Nested, Tag, Property, Value> : Children extends CraftDirectiveNode<any> ? VisitProperty<Children['node'], Tag, Property, Value> : Children extends ComponentNode<any, any, infer Component> ? VisitProperty<ReturnType<ComponentTemplateOf<Component>>, Tag, Property, Value> : Children extends ForNode<any, any> ? VisitProperty<(ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never)) & CraftNodeChildren, Tag, Property, Value> : Children extends DeferNode<infer Loaded> ? VisitProperty<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Tag, Property, Value> : false;
59
59
  /** Checks the type of a static or dynamic property on an element. */
60
60
  export type TemplateHasProperty<Children extends CraftNodeChildren, Tag extends string, Property extends string, Value> = VisitProperty<Children, Tag, Property, Value>;
61
61
  /** Checks that an element property is driven by a no-argument generator. */
62
62
  export type TemplateHasYieldableProperty<Children extends CraftNodeChildren, Tag extends string, Property extends string, Result> = TemplateHasProperty<Children, Tag, Property, Yieldable<[], Result, unknown>>;
63
- type VisitContextUse<Children, Tag extends string, Property extends string, ContextMethod extends string> = Children extends readonly (infer Child)[] ? VisitContextUse<Child, Tag, Property, ContextMethod> : Children extends ElementNodeBase<any, infer ActualTag, infer Props, infer Nested> ? ActualTag extends Tag ? Property extends keyof Props ? NonNullable<Props[Property]> extends (...args: any[]) => Generator<infer Yielded, infer Returned, any> ? TemplateMethodUse<ContextMethod> extends Yielded | Returned ? true : Extract<Yielded | Returned, TemplateMethodUse<ContextMethod>> extends never ? false : true : false : false : VisitContextUse<Nested, Tag, Property, ContextMethod> : Children extends CraftDirectiveNode<any> ? VisitContextUse<Children['node'], Tag, Property, ContextMethod> : Children extends ComponentNode<any, any, infer Component> ? VisitContextUse<ReturnType<ComponentTemplateOf<Component>>, Tag, Property, ContextMethod> : Children extends EachNode<any, any> ? VisitContextUse<(ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never)) & CraftNodeChildren, Tag, Property, ContextMethod> : Children extends DeferNode<infer Loaded> ? VisitContextUse<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Tag, Property, ContextMethod> : false;
63
+ type VisitContextUse<Children, Tag extends string, Property extends string, ContextMethod extends string> = Children extends readonly (infer Child)[] ? VisitContextUse<Child, Tag, Property, ContextMethod> : Children extends ElementNodeBase<any, infer ActualTag, infer Props, infer Nested> ? ActualTag extends Tag ? Property extends keyof Props ? NonNullable<Props[Property]> extends (...args: any[]) => Generator<infer Yielded, infer Returned, any> ? TemplateMethodUse<ContextMethod> extends Yielded | Returned ? true : Extract<Yielded | Returned, TemplateMethodUse<ContextMethod>> extends never ? false : true : false : false : VisitContextUse<Nested, Tag, Property, ContextMethod> : Children extends CraftDirectiveNode<any> ? VisitContextUse<Children['node'], Tag, Property, ContextMethod> : Children extends ComponentNode<any, any, infer Component> ? VisitContextUse<ReturnType<ComponentTemplateOf<Component>>, Tag, Property, ContextMethod> : Children extends ForNode<any, any> ? VisitContextUse<(ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never)) & CraftNodeChildren, Tag, Property, ContextMethod> : Children extends DeferNode<infer Loaded> ? VisitContextUse<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Tag, Property, ContextMethod> : false;
64
64
  /** Checks that a property callback delegates to a named template context member. */
65
65
  export type TemplateDelegatesToContext<Children extends CraftNodeChildren, Tag extends string, Property extends string, ContextMethod extends string = Property> = VisitContextUse<Children, Tag, Property, ContextMethod>;
66
66
  type EventHandlerOf<Props, EventName extends string> = EventName extends keyof Props ? Props[EventName] : `on${Capitalize<EventName>}` extends keyof Props ? Props[`on${Capitalize<EventName>}`] : never;
67
67
  type VisitEvent<Children, Tag extends string, EventName extends string, Handler extends (...args: any[]) => any> = Children extends readonly (infer Child)[] ? VisitEvent<Child, Tag, EventName, Handler> : Children extends ElementNodeBase<any, infer ActualTag, infer Props> ? ActualTag extends Tag ? EventHandlerOf<Props, EventName> extends Handler ? Handler extends EventHandlerOf<Props, EventName> ? true : false : false : VisitEvent<Children['children'], Tag, EventName, Handler> : Children extends CraftDirectiveNode<any> ? VisitEvent<Children['node'], Tag, EventName, Handler> : Children extends ComponentNode<any, any, infer Component> ? VisitEvent<ReturnType<ComponentTemplateOf<Component>>, Tag, EventName, Handler> : false;
68
- type VisitOutput<Children, Target extends CraftComponent<any, any>, Name extends keyof PropsOf<Target> & string, Handler extends (...args: any[]) => any> = Children extends readonly (infer Child)[] ? VisitOutput<Child, Target, Name, Handler> : Children extends ElementNodeBase<any, any, any, infer Nested> ? VisitOutput<Nested, Target, Name, Handler> : Children extends CraftDirectiveNode<any> ? VisitOutput<Children['node'], Target, Name, Handler> : Children extends ComponentNode<infer Props, any, infer Actual> ? [Actual] extends [Target] ? Name extends keyof Props ? Props[Name] extends Handler ? Handler extends Props[Name] ? true : false : false : false : VisitOutput<ReturnType<ComponentTemplateOf<Actual>>, Target, Name, Handler> : Children extends EachNode<any, any> ? VisitOutput<ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never), Target, Name, Handler> : Children extends DeferNode<infer Loaded> ? VisitOutput<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Target, Name, Handler> : false;
68
+ type VisitOutput<Children, Target extends CraftComponent<any, any>, Name extends keyof PropsOf<Target> & string, Handler extends (...args: any[]) => any> = Children extends readonly (infer Child)[] ? VisitOutput<Child, Target, Name, Handler> : Children extends ElementNodeBase<any, any, any, infer Nested> ? VisitOutput<Nested, Target, Name, Handler> : Children extends CraftDirectiveNode<any> ? VisitOutput<Children['node'], Target, Name, Handler> : Children extends ComponentNode<infer Props, any, infer Actual> ? [Actual] extends [Target] ? Name extends keyof Props ? Props[Name] extends Handler ? Handler extends Props[Name] ? true : false : false : false : VisitOutput<ReturnType<ComponentTemplateOf<Actual>>, Target, Name, Handler> : Children extends ForNode<any, any> ? VisitOutput<ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never), Target, Name, Handler> : Children extends DeferNode<infer Loaded> ? VisitOutput<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Target, Name, Handler> : false;
69
69
  /** Checks an event callback and therefore preserves its argument type. */
70
70
  export type TemplateHasEvent<Children extends CraftNodeChildren, Tag extends string, EventName extends string, Handler extends (...args: any[]) => any> = VisitEvent<Children, Tag, EventName, Handler>;
71
71
  /** Checks that a DOM event is a generator callback with the given arguments. */
@@ -75,7 +75,7 @@ export type TemplateHasYieldableMethodEvent<Children extends CraftNodeChildren,
75
75
  type VisitYieldableEvent<Children, Tag extends string, EventName extends string, Args extends unknown[]> = Children extends readonly (infer Child)[] ? VisitYieldableEvent<Child, Tag, EventName, Args> : Children extends ElementNodeBase<any, infer ActualTag, infer Props> ? ActualTag extends Tag ? EventHandlerOf<Props, EventName> extends (...args: infer ActualArgs) => Generator<any, any, any> ? ActualArgs extends Args ? Args extends ActualArgs ? true : false : false : false : VisitYieldableEvent<Children['children'], Tag, EventName, Args> : Children extends CraftDirectiveNode<any> ? VisitYieldableEvent<Children['node'], Tag, EventName, Args> : Children extends ComponentNode<any, any, infer Component> ? VisitYieldableEvent<ReturnType<ComponentTemplateOf<Component>>, Tag, EventName, Args> : false;
76
76
  /** Checks an output callback passed to a concrete Craft child component. */
77
77
  export type TemplateHasOutput<Children extends CraftNodeChildren, Component extends CraftComponent<any, any>, Name extends keyof PropsOf<Component> & string, Handler extends (...args: any[]) => any> = VisitOutput<Children, Component, Name, Handler>;
78
- export type TemplateUsesComponent<Children extends CraftNodeChildren, Component extends CraftComponent<any, any>> = Children extends readonly (infer Child)[] ? TemplateUsesComponent<Child & CraftNodeChildren, Component> : Children extends ComponentNode<any, any, infer Actual> ? [Actual] extends [Component] ? true : TemplateUsesComponent<ReturnType<ComponentTemplateOf<Actual>>, Component> : Children extends ElementNodeBase<any, any, any, infer Nested> ? TemplateUsesComponent<Nested, Component> : Children extends CraftDirectiveNode<any> ? TemplateUsesComponent<Children['node'], Component> : Children extends EachNode<any, any> ? TemplateUsesComponent<(ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never)) & CraftNodeChildren, Component> : Children extends DeferNode<infer Loaded> ? Loaded extends CraftComponent<any, any> ? [Loaded] extends [Component] ? true : TemplateUsesComponent<ReturnType<ComponentTemplateOf<Loaded>>, Component> : TemplateUsesComponent<ReturnType<Children['resolve']>, Component> : false;
78
+ export type TemplateUsesComponent<Children extends CraftNodeChildren, Component extends CraftComponent<any, any>> = Children extends readonly (infer Child)[] ? TemplateUsesComponent<Child & CraftNodeChildren, Component> : Children extends ComponentNode<any, any, infer Actual> ? [Actual] extends [Component] ? true : TemplateUsesComponent<ReturnType<ComponentTemplateOf<Actual>>, Component> : Children extends ElementNodeBase<any, any, any, infer Nested> ? TemplateUsesComponent<Nested, Component> : Children extends CraftDirectiveNode<any> ? TemplateUsesComponent<Children['node'], Component> : Children extends ForNode<any, any> ? TemplateUsesComponent<(ReturnType<Children['itemTemplate']> | (Children['empty'] extends (...args: any[]) => infer Empty ? Empty : never)) & CraftNodeChildren, Component> : Children extends DeferNode<infer Loaded> ? Loaded extends CraftComponent<any, any> ? [Loaded] extends [Component] ? true : TemplateUsesComponent<ReturnType<ComponentTemplateOf<Loaded>>, Component> : TemplateUsesComponent<ReturnType<Children['resolve']>, Component> : false;
79
79
  type VisibilityValue = boolean | 'nonEmpty' | 'empty';
80
80
  type Visibility = Readonly<Record<string, VisibilityValue>>;
81
81
  type VisibilityMatches<Actual extends Visibility, Expected extends Visibility> = keyof Expected extends never ? keyof Actual extends never ? true : false : {
@@ -105,13 +105,13 @@ type VisitRenderedState<Children, StateName extends string, Expected extends Vis
105
105
  ], [
106
106
  ...Depth,
107
107
  unknown
108
- ]> : Children extends EachNode<any, any, any, infer SourceName, infer Item, infer Empty> ? VisitRenderedState<Item, StateName, Expected, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'nonEmpty'>, Seen, [
108
+ ]> : Children extends ForNode<any, any, any, infer SourceName, infer Item, infer Empty> ? VisitRenderedState<Item, StateName, Expected, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'nonEmpty'>, Seen, [
109
109
  ...Depth,
110
110
  unknown
111
111
  ]> | VisitRenderedState<Empty, StateName, Expected, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'empty'>, Seen, [
112
112
  ...Depth,
113
113
  unknown
114
- ]> : Children extends IfBlockNode<infer ConditionName, any, infer True, infer False> ? VisitRenderedState<True, StateName, Expected, AddVisibility<Current, ConditionName, true>, Seen, [
114
+ ]> : Children extends IfNode<infer ConditionName, any, infer True, infer False> ? VisitRenderedState<True, StateName, Expected, AddVisibility<Current, ConditionName, true>, Seen, [
115
115
  ...Depth,
116
116
  unknown
117
117
  ]> | VisitRenderedState<False, StateName, Expected, AddVisibility<Current, ConditionName, false>, Seen, [
@@ -145,13 +145,13 @@ type VisitAvailableAction<Children, EventName extends string, LocalName extends
145
145
  ], [
146
146
  ...Depth,
147
147
  unknown
148
- ]> : Children extends EachNode<any, any, any, infer SourceName, infer Item, infer Empty> ? VisitAvailableAction<Item, EventName, LocalName, Expected, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'nonEmpty'>, Seen, [
148
+ ]> : Children extends ForNode<any, any, any, infer SourceName, infer Item, infer Empty> ? VisitAvailableAction<Item, EventName, LocalName, Expected, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'nonEmpty'>, Seen, [
149
149
  ...Depth,
150
150
  unknown
151
151
  ]> | VisitAvailableAction<Empty, EventName, LocalName, Expected, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'empty'>, Seen, [
152
152
  ...Depth,
153
153
  unknown
154
- ]> : Children extends IfBlockNode<infer ConditionName, any, infer True, infer False> ? VisitAvailableAction<True, EventName, LocalName, Expected, AddVisibility<Current, ConditionName, true>, Seen, [
154
+ ]> : Children extends IfNode<infer ConditionName, any, infer True, infer False> ? VisitAvailableAction<True, EventName, LocalName, Expected, AddVisibility<Current, ConditionName, true>, Seen, [
155
155
  ...Depth,
156
156
  unknown
157
157
  ]> | VisitAvailableAction<False, EventName, LocalName, Expected, AddVisibility<Current, ConditionName, false>, Seen, [
@@ -191,10 +191,10 @@ type VisitNamedElementIdentities<Children, Owner extends string = never, Seen ex
191
191
  ], [
192
192
  ...Depth,
193
193
  unknown
194
- ]> : Children extends EachNode<any, any, any, any, infer Item, infer Empty> ? VisitNamedElementIdentities<Item | Empty, Owner, Seen, [
194
+ ]> : Children extends ForNode<any, any, any, any, infer Item, infer Empty> ? VisitNamedElementIdentities<Item | Empty, Owner, Seen, [
195
195
  ...Depth,
196
196
  unknown
197
- ]> : Children extends IfBlockNode<any, any, infer True, infer False> ? VisitNamedElementIdentities<True | False, Owner, Seen, [
197
+ ]> : Children extends IfNode<any, any, infer True, infer False> ? VisitNamedElementIdentities<True | False, Owner, Seen, [
198
198
  ...Depth,
199
199
  unknown
200
200
  ]> : Children extends DeferNode<infer Loaded> ? VisitNamedElementIdentities<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Owner, Seen, [
@@ -227,10 +227,10 @@ type NamedElementPropsOf<Children, Identity extends string, Owner extends string
227
227
  ], [
228
228
  ...Depth,
229
229
  unknown
230
- ]> : Children extends EachNode<any, any, any, any, infer Item, infer Empty> ? NamedElementPropsOf<Item | Empty, Identity, Owner, Seen, [
230
+ ]> : Children extends ForNode<any, any, any, any, infer Item, infer Empty> ? NamedElementPropsOf<Item | Empty, Identity, Owner, Seen, [
231
231
  ...Depth,
232
232
  unknown
233
- ]> : Children extends IfBlockNode<any, any, infer True, infer False> ? NamedElementPropsOf<True | False, Identity, Owner, Seen, [
233
+ ]> : Children extends IfNode<any, any, infer True, infer False> ? NamedElementPropsOf<True | False, Identity, Owner, Seen, [
234
234
  ...Depth,
235
235
  unknown
236
236
  ]> : Children extends DeferNode<infer Loaded> ? NamedElementPropsOf<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Identity, Owner, Seen, [
@@ -256,10 +256,10 @@ type NamedElementDelegatesToContextOf<Children, Identity extends string, Propert
256
256
  ], [
257
257
  ...Depth,
258
258
  unknown
259
- ]> : Children extends EachNode<any, any, any, any, infer Item, infer Empty> ? NamedElementDelegatesToContextOf<Item | Empty, Identity, Property, ContextMethod, Owner, Seen, [
259
+ ]> : Children extends ForNode<any, any, any, any, infer Item, infer Empty> ? NamedElementDelegatesToContextOf<Item | Empty, Identity, Property, ContextMethod, Owner, Seen, [
260
260
  ...Depth,
261
261
  unknown
262
- ]> : Children extends IfBlockNode<any, any, infer True, infer False> ? NamedElementDelegatesToContextOf<True | False, Identity, Property, ContextMethod, Owner, Seen, [
262
+ ]> : Children extends IfNode<any, any, infer True, infer False> ? NamedElementDelegatesToContextOf<True | False, Identity, Property, ContextMethod, Owner, Seen, [
263
263
  ...Depth,
264
264
  unknown
265
265
  ]> : Children extends DeferNode<infer Loaded> ? NamedElementDelegatesToContextOf<Loaded extends CraftComponent<any, any> ? ReturnType<ComponentTemplateOf<Loaded>> : ReturnType<Children['resolve']>, Identity, Property, ContextMethod, Owner, Seen, [
@@ -283,13 +283,13 @@ type NamedElementRendersStateWhenOf<Children, Identity extends string, Property
283
283
  ], [
284
284
  ...Depth,
285
285
  unknown
286
- ]> : Children extends EachNode<any, any, any, infer SourceName, infer Item, infer Empty> ? NamedElementRendersStateWhenOf<Item, Identity, Property, StateName, Expected, Owner, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'nonEmpty'>, Seen, [
286
+ ]> : Children extends ForNode<any, any, any, infer SourceName, infer Item, infer Empty> ? NamedElementRendersStateWhenOf<Item, Identity, Property, StateName, Expected, Owner, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'nonEmpty'>, Seen, [
287
287
  ...Depth,
288
288
  unknown
289
289
  ]> | NamedElementRendersStateWhenOf<Empty, Identity, Property, StateName, Expected, Owner, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'empty'>, Seen, [
290
290
  ...Depth,
291
291
  unknown
292
- ]> : Children extends IfBlockNode<infer ConditionName, any, infer True, infer False> ? NamedElementRendersStateWhenOf<True, Identity, Property, StateName, Expected, Owner, AddVisibility<Current, ConditionName, true>, Seen, [
292
+ ]> : Children extends IfNode<infer ConditionName, any, infer True, infer False> ? NamedElementRendersStateWhenOf<True, Identity, Property, StateName, Expected, Owner, AddVisibility<Current, ConditionName, true>, Seen, [
293
293
  ...Depth,
294
294
  unknown
295
295
  ]> | NamedElementRendersStateWhenOf<False, Identity, Property, StateName, Expected, Owner, AddVisibility<Current, ConditionName, false>, Seen, [
@@ -320,13 +320,13 @@ type VisitNamedElement<Children, Identity extends string, Expected extends Visib
320
320
  ], [
321
321
  ...Depth,
322
322
  unknown
323
- ]> : Children extends EachNode<any, any, any, infer SourceName, infer Item, infer Empty> ? VisitNamedElement<Item, Identity, Expected, Owner, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'nonEmpty'>, Seen, [
323
+ ]> : Children extends ForNode<any, any, any, infer SourceName, infer Item, infer Empty> ? VisitNamedElement<Item, Identity, Expected, Owner, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'nonEmpty'>, Seen, [
324
324
  ...Depth,
325
325
  unknown
326
326
  ]> | VisitNamedElement<Empty, Identity, Expected, Owner, Extract<SourceName, string> extends never ? Current : AddVisibility<Current, Extract<SourceName, string>, 'empty'>, Seen, [
327
327
  ...Depth,
328
328
  unknown
329
- ]> : Children extends IfBlockNode<infer ConditionName, any, infer True, infer False> ? VisitNamedElement<True, Identity, Expected, Owner, AddVisibility<Current, ConditionName, true>, Seen, [
329
+ ]> : Children extends IfNode<infer ConditionName, any, infer True, infer False> ? VisitNamedElement<True, Identity, Expected, Owner, AddVisibility<Current, ConditionName, true>, Seen, [
330
330
  ...Depth,
331
331
  unknown
332
332
  ]> | VisitNamedElement<False, Identity, Expected, Owner, AddVisibility<Current, ConditionName, false>, Seen, [
@@ -344,4 +344,3 @@ export type TemplateRendersNamedElementWhen<Children, Identity extends TemplateN
344
344
  readonly when: infer When extends Visibility;
345
345
  } ? When : {}, TemplateContractOwner<Children>>>;
346
346
  export {};
347
- //# sourceMappingURL=template-contract.d.ts.map
@@ -1 +0,0 @@
1
- //# sourceMappingURL=template-contract.js.map
@@ -1,5 +1,5 @@
1
- import type { CraftNodeChildren, CraftNodeChildrenDependencies, TemplateNode } from './render/vnode';
2
- import { type CraftTemplate, type InputValue } from './types';
1
+ import type { CraftNodeChildren, CraftNodeChildrenDependencies, TemplateNode } from './render/vnode.js';
2
+ import { type CraftTemplate, type InputValue } from './types.js';
3
3
  type TemplateContextInput<Context> = Context extends object ? {
4
4
  [Key in keyof Context]: Context[Key] | InputValue<Context[Key]>;
5
5
  } : Context | InputValue<Context>;
@@ -8,4 +8,3 @@ export declare function craftTemplate<Context, Output extends CraftNodeChildren
8
8
  /** Schedules a typed template for rendering without evaluating it eagerly. */
9
9
  export declare function renderTemplate<Context, Output extends CraftNodeChildren>(template: CraftTemplate<Context, Output>, context: TemplateContextInput<NoInfer<Context>>): TemplateNode<Context, Output, CraftNodeChildrenDependencies<Output>>;
10
10
  export {};
11
- //# sourceMappingURL=template.d.ts.map
@@ -1,5 +1,5 @@
1
- import { CRAFT_TEMPLATE, } from './types';
2
- import { currentCraftRenderContext } from './render/vnode';
1
+ import { CRAFT_TEMPLATE, } from './types.js';
2
+ import { currentCraftRenderContext } from './render/vnode.js';
3
3
  /** Creates an inert, reusable and context-checked Craft template fragment. */
4
4
  export function craftTemplate(renderer) {
5
5
  const template = ((context) => renderer(context));
@@ -18,4 +18,3 @@ export function renderTemplate(template, context) {
18
18
  declarationContext: currentCraftRenderContext(),
19
19
  };
20
20
  }
21
- //# sourceMappingURL=template.js.map
@@ -1,6 +1,6 @@
1
1
  import { type CraftServiceProvider, type CompleteServiceDependencyMapFromYielded, type FlattenDependencyTree } from '@craft-ts/core';
2
- import { type ComponentFactory, type ComponentTemplate, type CraftComponent, type CraftDirective, type FactoryContext, type FactoryYielded, type PropsOf, type TemplateDependencies } from './types';
3
- import type { CraftTemplateLocatorApi } from './locator';
2
+ import { type ComponentFactory, type ComponentTemplate, type CraftComponent, type CraftDirective, type FactoryContext, type FactoryYielded, type PropsOf, type TemplateDependencies } from './types.js';
3
+ import type { CraftTemplateLocatorApi } from './locator.js';
4
4
  type IsAny<T> = 0 extends 1 & T ? true : false;
5
5
  type ComponentFactoryOf<Component> = Component extends CraftComponent<any, any, infer Factory extends ComponentFactory> ? Factory : ComponentFactory;
6
6
  type ComponentTemplateDepsOf<Component> = Component extends CraftComponent<any, any, any, any, any, infer TemplateDeps> ? TemplateDeps : {};
@@ -105,7 +105,7 @@ export declare function renderCraftComponent<Component extends CraftComponent<an
105
105
  }): Promise<{
106
106
  nativeElement: HTMLDivElement;
107
107
  element: HTMLDivElement;
108
- mounted: import("./render/interpreter").MountedCraftComponent<PropsOf<Component>>;
108
+ mounted: import("./render/interpreter.js").MountedCraftComponent<PropsOf<Component>>;
109
109
  injector: import("@craft-ts/core").ɵEnvironmentInjector & import("@craft-ts/core").CraftInjector;
110
110
  detectChanges: () => void;
111
111
  flush: () => Promise<void>;
@@ -154,4 +154,3 @@ export declare const setupCraftDirectiveTemplateTest: typeof setupCraftDirective
154
154
  */
155
155
  export declare function assertAccessible(container: Element): Promise<void>;
156
156
  export {};
157
- //# sourceMappingURL=testing.d.ts.map
@@ -1,9 +1,9 @@
1
- import { createEnvironmentInjector, ElementRef, Injector, runInInjectionContext, ɵEffectScheduler, ɵINJECTOR_SCOPE, } from './host-runtime';
1
+ import { createEnvironmentInjector, ElementRef, Injector, runInInjectionContext, ɵEffectScheduler, ɵINJECTOR_SCOPE, } from './host-runtime.js';
2
2
  import { CRAFT_SERVICE_PROVIDER_BRAND, createExposedServiceValue, getRegisteredAppStartServices, getServiceMetaData, runServiceAppStart, SERVICE_RUNTIME_OVERRIDES, } from '@craft-ts/core';
3
- import { mountInterpretedComponent, mountInterpretedComponentTemplate, } from './render/interpreter';
4
- import { craftComponent } from './component';
5
- import { executeCraftComponentFactory } from './factory-runtime';
6
- import { CRAFT_COMPONENT, CRAFT_DIRECTIVE, } from './types';
3
+ import { mountInterpretedComponent, mountInterpretedComponentTemplate, } from './render/interpreter.js';
4
+ import { craftComponent } from './component.js';
5
+ import { executeCraftComponentFactory } from './factory-runtime.js';
6
+ import { CRAFT_COMPONENT, CRAFT_DIRECTIVE, } from './types.js';
7
7
  function isProvider(value) {
8
8
  return (typeof value === 'object' &&
9
9
  value !== null &&
@@ -413,4 +413,3 @@ export async function assertAccessible(container) {
413
413
  throw new Error(`Accessibility violations:\n- ${violations.join('\n- ')}`);
414
414
  }
415
415
  }
416
- //# sourceMappingURL=testing.js.map