@alloy-js/core 0.24.0-dev.6 → 0.24.0-dev.7

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 (229) hide show
  1. package/dist/dev/src/components/AccessExpression.test.js +30 -38
  2. package/dist/dev/src/components/AccessExpression.test.js.map +1 -1
  3. package/dist/dev/src/content-slot.test.js +16 -18
  4. package/dist/dev/src/content-slot.test.js.map +1 -1
  5. package/dist/dev/src/symbols/symbol-slot.test.js +4 -4
  6. package/dist/dev/src/symbols/symbol-slot.test.js.map +1 -1
  7. package/dist/dev/test/children.test.js +9 -11
  8. package/dist/dev/test/children.test.js.map +1 -1
  9. package/dist/dev/test/components/append-file.test.js +26 -27
  10. package/dist/dev/test/components/append-file.test.js.map +1 -1
  11. package/dist/dev/test/components/block.test.js +9 -11
  12. package/dist/dev/test/components/block.test.js.map +1 -1
  13. package/dist/dev/test/components/copy-file.test.js +6 -7
  14. package/dist/dev/test/components/copy-file.test.js.map +1 -1
  15. package/dist/dev/test/components/declaration.test.js +2 -2
  16. package/dist/dev/test/components/declaration.test.js.map +1 -1
  17. package/dist/dev/test/components/list.test.js +41 -43
  18. package/dist/dev/test/components/list.test.js.map +1 -1
  19. package/dist/dev/test/components/prose.test.js +4 -5
  20. package/dist/dev/test/components/prose.test.js.map +1 -1
  21. package/dist/dev/test/components/reference-or-content.test.js +32 -33
  22. package/dist/dev/test/components/reference-or-content.test.js.map +1 -1
  23. package/dist/dev/test/components/source-file.test.js +8 -7
  24. package/dist/dev/test/components/source-file.test.js.map +1 -1
  25. package/dist/dev/test/components/template-file.test.js +16 -17
  26. package/dist/dev/test/components/template-file.test.js.map +1 -1
  27. package/dist/dev/test/components/update-file.test.js +10 -11
  28. package/dist/dev/test/components/update-file.test.js.map +1 -1
  29. package/dist/dev/test/components/wrap.test.js +6 -8
  30. package/dist/dev/test/components/wrap.test.js.map +1 -1
  31. package/dist/dev/test/control-flow/for.test.js +58 -42
  32. package/dist/dev/test/control-flow/for.test.js.map +1 -1
  33. package/dist/dev/test/control-flow/match.test.js +15 -17
  34. package/dist/dev/test/control-flow/match.test.js.map +1 -1
  35. package/dist/dev/test/control-flow/show.test.js +5 -8
  36. package/dist/dev/test/control-flow/show.test.js.map +1 -1
  37. package/dist/dev/test/lazy-isempty.test.js +24 -26
  38. package/dist/dev/test/lazy-isempty.test.js.map +1 -1
  39. package/dist/dev/test/name-policy.test.js +2 -3
  40. package/dist/dev/test/name-policy.test.js.map +1 -1
  41. package/dist/dev/test/reactivity/circular-reactives.test.js +9 -9
  42. package/dist/dev/test/reactivity/circular-reactives.test.js.map +1 -1
  43. package/dist/dev/test/reactivity/cleanup.test.js +5 -6
  44. package/dist/dev/test/reactivity/cleanup.test.js.map +1 -1
  45. package/dist/dev/test/reactivity/ref-rendering.test.js +15 -15
  46. package/dist/dev/test/reactivity/ref-rendering.test.js.map +1 -1
  47. package/dist/dev/test/reactivity/test.test.js +18 -18
  48. package/dist/dev/test/reactivity/test.test.js.map +1 -1
  49. package/dist/dev/test/rendering/basic.test.js +18 -19
  50. package/dist/dev/test/rendering/basic.test.js.map +1 -1
  51. package/dist/dev/test/rendering/code.test.js +2 -3
  52. package/dist/dev/test/rendering/code.test.js.map +1 -1
  53. package/dist/dev/test/rendering/formatting.test.js +115 -121
  54. package/dist/dev/test/rendering/formatting.test.js.map +1 -1
  55. package/dist/dev/test/rendering/indent.test.js +23 -24
  56. package/dist/dev/test/rendering/indent.test.js.map +1 -1
  57. package/dist/dev/test/rendering/memoization.test.js +4 -5
  58. package/dist/dev/test/rendering/memoization.test.js.map +1 -1
  59. package/dist/dev/test/rendering/print-render-stack.test.js +20 -21
  60. package/dist/dev/test/rendering/print-render-stack.test.js.map +1 -1
  61. package/dist/dev/test/rendering/refkeys.test.js +1 -2
  62. package/dist/dev/test/rendering/refkeys.test.js.map +1 -1
  63. package/dist/dev/test/stc.test.js +0 -1
  64. package/dist/dev/test/stc.test.js.map +1 -1
  65. package/dist/dev/test/utils.test.js +34 -33
  66. package/dist/dev/test/utils.test.js.map +1 -1
  67. package/dist/dev/test/vitest.setup.js +2 -0
  68. package/dist/dev/test/vitest.setup.js.map +1 -0
  69. package/dist/dev/testing/extend-expect.js +23 -1
  70. package/dist/dev/testing/extend-expect.js.map +1 -1
  71. package/dist/src/components/AccessExpression.test.d.ts +1 -1
  72. package/dist/src/components/AccessExpression.test.d.ts.map +1 -1
  73. package/dist/src/components/AccessExpression.test.js +5 -13
  74. package/dist/src/components/AccessExpression.test.js.map +1 -1
  75. package/dist/src/content-slot.test.d.ts +1 -1
  76. package/dist/src/content-slot.test.d.ts.map +1 -1
  77. package/dist/src/content-slot.test.js +8 -10
  78. package/dist/src/content-slot.test.js.map +1 -1
  79. package/dist/src/symbols/symbol-slot.test.js +4 -4
  80. package/dist/src/symbols/symbol-slot.test.js.map +1 -1
  81. package/dist/test/children.test.js +5 -7
  82. package/dist/test/children.test.js.map +1 -1
  83. package/dist/test/components/append-file.test.d.ts +1 -1
  84. package/dist/test/components/append-file.test.d.ts.map +1 -1
  85. package/dist/test/components/append-file.test.js +0 -1
  86. package/dist/test/components/append-file.test.js.map +1 -1
  87. package/dist/test/components/block.test.d.ts +1 -1
  88. package/dist/test/components/block.test.d.ts.map +1 -1
  89. package/dist/test/components/block.test.js +4 -6
  90. package/dist/test/components/block.test.js.map +1 -1
  91. package/dist/test/components/copy-file.test.d.ts +1 -1
  92. package/dist/test/components/copy-file.test.d.ts.map +1 -1
  93. package/dist/test/components/copy-file.test.js +0 -1
  94. package/dist/test/components/copy-file.test.js.map +1 -1
  95. package/dist/test/components/declaration.test.js +2 -2
  96. package/dist/test/components/declaration.test.js.map +1 -1
  97. package/dist/test/components/list.test.d.ts +1 -1
  98. package/dist/test/components/list.test.d.ts.map +1 -1
  99. package/dist/test/components/list.test.js +20 -22
  100. package/dist/test/components/list.test.js.map +1 -1
  101. package/dist/test/components/prose.test.d.ts +1 -1
  102. package/dist/test/components/prose.test.d.ts.map +1 -1
  103. package/dist/test/components/prose.test.js +0 -1
  104. package/dist/test/components/prose.test.js.map +1 -1
  105. package/dist/test/components/reference-or-content.test.js +8 -9
  106. package/dist/test/components/reference-or-content.test.js.map +1 -1
  107. package/dist/test/components/source-file.test.d.ts +1 -1
  108. package/dist/test/components/source-file.test.d.ts.map +1 -1
  109. package/dist/test/components/source-file.test.js +5 -4
  110. package/dist/test/components/source-file.test.js.map +1 -1
  111. package/dist/test/components/template-file.test.d.ts +1 -1
  112. package/dist/test/components/template-file.test.d.ts.map +1 -1
  113. package/dist/test/components/template-file.test.js +0 -1
  114. package/dist/test/components/template-file.test.js.map +1 -1
  115. package/dist/test/components/update-file.test.d.ts +1 -1
  116. package/dist/test/components/update-file.test.d.ts.map +1 -1
  117. package/dist/test/components/update-file.test.js +0 -1
  118. package/dist/test/components/update-file.test.js.map +1 -1
  119. package/dist/test/components/wrap.test.d.ts +1 -1
  120. package/dist/test/components/wrap.test.d.ts.map +1 -1
  121. package/dist/test/components/wrap.test.js +3 -5
  122. package/dist/test/components/wrap.test.js.map +1 -1
  123. package/dist/test/control-flow/for.test.d.ts +1 -1
  124. package/dist/test/control-flow/for.test.d.ts.map +1 -1
  125. package/dist/test/control-flow/for.test.js +40 -24
  126. package/dist/test/control-flow/for.test.js.map +1 -1
  127. package/dist/test/control-flow/match.test.d.ts +1 -1
  128. package/dist/test/control-flow/match.test.d.ts.map +1 -1
  129. package/dist/test/control-flow/match.test.js +4 -6
  130. package/dist/test/control-flow/match.test.js.map +1 -1
  131. package/dist/test/control-flow/show.test.d.ts +1 -1
  132. package/dist/test/control-flow/show.test.d.ts.map +1 -1
  133. package/dist/test/control-flow/show.test.js +3 -6
  134. package/dist/test/control-flow/show.test.js.map +1 -1
  135. package/dist/test/lazy-isempty.test.d.ts +1 -1
  136. package/dist/test/lazy-isempty.test.d.ts.map +1 -1
  137. package/dist/test/lazy-isempty.test.js +11 -13
  138. package/dist/test/lazy-isempty.test.js.map +1 -1
  139. package/dist/test/name-policy.test.d.ts +1 -1
  140. package/dist/test/name-policy.test.d.ts.map +1 -1
  141. package/dist/test/name-policy.test.js +0 -1
  142. package/dist/test/name-policy.test.js.map +1 -1
  143. package/dist/test/reactivity/circular-reactives.test.js +6 -6
  144. package/dist/test/reactivity/circular-reactives.test.js.map +1 -1
  145. package/dist/test/reactivity/cleanup.test.js +2 -3
  146. package/dist/test/reactivity/cleanup.test.js.map +1 -1
  147. package/dist/test/reactivity/ref-rendering.test.js +15 -15
  148. package/dist/test/reactivity/ref-rendering.test.js.map +1 -1
  149. package/dist/test/reactivity/test.test.js +15 -15
  150. package/dist/test/reactivity/test.test.js.map +1 -1
  151. package/dist/test/rendering/basic.test.d.ts +1 -1
  152. package/dist/test/rendering/basic.test.d.ts.map +1 -1
  153. package/dist/test/rendering/basic.test.js +0 -1
  154. package/dist/test/rendering/basic.test.js.map +1 -1
  155. package/dist/test/rendering/code.test.d.ts +1 -1
  156. package/dist/test/rendering/code.test.d.ts.map +1 -1
  157. package/dist/test/rendering/code.test.js +0 -1
  158. package/dist/test/rendering/code.test.js.map +1 -1
  159. package/dist/test/rendering/formatting.test.d.ts +1 -1
  160. package/dist/test/rendering/formatting.test.d.ts.map +1 -1
  161. package/dist/test/rendering/formatting.test.js +17 -23
  162. package/dist/test/rendering/formatting.test.js.map +1 -1
  163. package/dist/test/rendering/indent.test.d.ts +1 -1
  164. package/dist/test/rendering/indent.test.d.ts.map +1 -1
  165. package/dist/test/rendering/indent.test.js +0 -1
  166. package/dist/test/rendering/indent.test.js.map +1 -1
  167. package/dist/test/rendering/memoization.test.js +2 -3
  168. package/dist/test/rendering/memoization.test.js.map +1 -1
  169. package/dist/test/rendering/print-render-stack.test.d.ts +1 -1
  170. package/dist/test/rendering/print-render-stack.test.d.ts.map +1 -1
  171. package/dist/test/rendering/print-render-stack.test.js +0 -1
  172. package/dist/test/rendering/print-render-stack.test.js.map +1 -1
  173. package/dist/test/rendering/refkeys.test.d.ts +1 -1
  174. package/dist/test/rendering/refkeys.test.d.ts.map +1 -1
  175. package/dist/test/rendering/refkeys.test.js +0 -1
  176. package/dist/test/rendering/refkeys.test.js.map +1 -1
  177. package/dist/test/stc.test.d.ts +1 -1
  178. package/dist/test/stc.test.d.ts.map +1 -1
  179. package/dist/test/stc.test.js +0 -1
  180. package/dist/test/stc.test.js.map +1 -1
  181. package/dist/test/utils.test.d.ts +1 -1
  182. package/dist/test/utils.test.d.ts.map +1 -1
  183. package/dist/test/utils.test.js +12 -11
  184. package/dist/test/utils.test.js.map +1 -1
  185. package/dist/test/vitest.setup.d.ts +2 -0
  186. package/dist/test/vitest.setup.d.ts.map +1 -0
  187. package/dist/test/vitest.setup.js +2 -0
  188. package/dist/test/vitest.setup.js.map +1 -0
  189. package/dist/testing/extend-expect.d.ts.map +1 -1
  190. package/dist/testing/extend-expect.js +23 -1
  191. package/dist/testing/extend-expect.js.map +1 -1
  192. package/dist/tsconfig.tsbuildinfo +1 -1
  193. package/package.json +1 -1
  194. package/src/components/AccessExpression.test.tsx +5 -13
  195. package/src/content-slot.test.tsx +8 -10
  196. package/src/symbols/symbol-slot.test.tsx +4 -4
  197. package/test/children.test.tsx +4 -7
  198. package/test/components/append-file.test.tsx +0 -1
  199. package/test/components/block.test.tsx +4 -6
  200. package/test/components/copy-file.test.tsx +0 -1
  201. package/test/components/declaration.test.tsx +2 -2
  202. package/test/components/list.test.tsx +20 -29
  203. package/test/components/prose.test.tsx +0 -1
  204. package/test/components/reference-or-content.test.tsx +8 -9
  205. package/test/components/source-file.test.tsx +4 -4
  206. package/test/components/template-file.test.tsx +0 -1
  207. package/test/components/update-file.test.tsx +0 -1
  208. package/test/components/wrap.test.tsx +3 -5
  209. package/test/control-flow/for.test.tsx +39 -31
  210. package/test/control-flow/match.test.tsx +4 -6
  211. package/test/control-flow/show.test.tsx +3 -6
  212. package/test/lazy-isempty.test.tsx +12 -14
  213. package/test/name-policy.test.tsx +0 -1
  214. package/test/reactivity/circular-reactives.test.tsx +6 -6
  215. package/test/reactivity/cleanup.test.tsx +2 -3
  216. package/test/reactivity/ref-rendering.test.tsx +15 -15
  217. package/test/reactivity/test.test.tsx +14 -14
  218. package/test/rendering/basic.test.tsx +0 -1
  219. package/test/rendering/code.test.tsx +0 -1
  220. package/test/rendering/formatting.test.tsx +21 -29
  221. package/test/rendering/indent.test.tsx +0 -1
  222. package/test/rendering/memoization.test.tsx +2 -3
  223. package/test/rendering/print-render-stack.test.tsx +0 -1
  224. package/test/rendering/refkeys.test.tsx +0 -1
  225. package/test/stc.test.tsx +0 -1
  226. package/test/utils.test.tsx +10 -9
  227. package/test/vitest.setup.ts +1 -0
  228. package/testing/extend-expect.ts +24 -1
  229. package/vitest.config.ts +3 -0
@@ -1,8 +1,6 @@
1
- import "@alloy-js/core/testing";
2
1
  import { ref } from "@vue/reactivity";
3
2
  import { expect, it } from "vitest";
4
3
  import { Match, Switch } from "../../src/components/Switch.jsx";
5
- import { printTree, renderTree } from "../../src/test-render.js";
6
4
 
7
5
  it("selects the true branch", () => {
8
6
  const template = (
@@ -40,10 +38,10 @@ it("works with reactivity", () => {
40
38
  <Match else>odd</Match>
41
39
  </Switch>
42
40
  );
43
- const tree = renderTree(template);
44
- expect(printTree(tree)).toBe(`even`);
41
+ const tree = template;
42
+ expect(tree).toRenderTo("even");
45
43
  count.value++;
46
- expect(printTree(tree)).toBe(`odd`);
44
+ expect(tree).toRenderTo("odd");
47
45
  count.value++;
48
- expect(printTree(tree)).toBe(`even`);
46
+ expect(tree).toRenderTo("even");
49
47
  });
@@ -1,8 +1,6 @@
1
- import "@alloy-js/core/testing";
2
1
  import { ref } from "@vue/reactivity";
3
2
  import { expect, it } from "vitest";
4
3
  import { Show } from "../../src/components/Show.jsx";
5
- import { printTree, renderTree } from "../../src/test-render.js";
6
4
 
7
5
  it("selects the true branch", () => {
8
6
  const template = <Show when={true}>true</Show>;
@@ -16,10 +14,9 @@ it("works with reactivity", () => {
16
14
  even
17
15
  </Show>
18
16
  );
19
- const tree = renderTree(template);
20
- expect(printTree(tree)).toBe(`even`);
17
+ expect(template).toRenderTo("even");
21
18
  count.value++;
22
- expect(printTree(tree)).toBe(`odd`);
19
+ expect(template).toRenderTo("odd");
23
20
  count.value++;
24
- expect(printTree(tree)).toBe(`even`);
21
+ expect(template).toRenderTo("even");
25
22
  });
@@ -3,8 +3,6 @@ import { describe, expect, it } from "vitest";
3
3
  import { Show } from "../src/components/Show.jsx";
4
4
  import { createContentSlot } from "../src/content-slot.jsx";
5
5
  import { Context, ensureIsEmpty, getContext } from "../src/reactivity.js";
6
- import { printTree, renderTree } from "../src/test-render.js";
7
- import "../testing/extend-expect.js";
8
6
 
9
7
  describe("lazy isEmpty", () => {
10
8
  it("context starts without isEmpty ref allocated", () => {
@@ -15,7 +13,7 @@ describe("lazy isEmpty", () => {
15
13
  return "content";
16
14
  }
17
15
 
18
- renderTree(<Capture />);
16
+ expect(<Capture />).toRenderTo("content");
19
17
 
20
18
  // The isEmpty ref should NOT be allocated unless someone observes it.
21
19
  expect(ctx).not.toBeNull();
@@ -31,7 +29,7 @@ describe("lazy isEmpty", () => {
31
29
  return "content";
32
30
  }
33
31
 
34
- renderTree(<Capture />);
32
+ expect(<Capture />).toRenderTo("content");
35
33
 
36
34
  expect(ctx!.isEmpty).toBeUndefined();
37
35
  const isEmptyRef = ensureIsEmpty(ctx!);
@@ -53,12 +51,12 @@ describe("lazy isEmpty", () => {
53
51
  return "has content";
54
52
  }
55
53
 
56
- renderTree(
54
+ expect(
57
55
  <>
58
56
  <EmptyCapture />
59
57
  <FullCapture />
60
58
  </>,
61
- );
59
+ ).toRenderTo("has content");
62
60
 
63
61
  expect(emptyCtx!.childrenWithContent).toBe(0);
64
62
  expect(fullCtx!.childrenWithContent).toBe(1);
@@ -68,39 +66,39 @@ describe("lazy isEmpty", () => {
68
66
  const ContentSlot = createContentSlot();
69
67
  const showContent = ref(false);
70
68
 
71
- const tree = renderTree(
69
+ const tree = (
72
70
  <>
73
71
  {ContentSlot.isEmpty && "empty"}
74
72
  <ContentSlot>
75
73
  <Show when={showContent.value}>content</Show>
76
74
  </ContentSlot>
77
- </>,
75
+ </>
78
76
  );
79
77
 
80
- expect(printTree(tree)).toBe("empty");
78
+ expect(tree).toRenderTo("empty");
81
79
 
82
80
  showContent.value = true;
83
- expect(printTree(tree)).toBe("content");
81
+ expect(tree).toRenderTo("content");
84
82
  });
85
83
 
86
84
  it("propagates empty state up through parent contexts", () => {
87
85
  const OuterSlot = createContentSlot();
88
86
  const showContent = ref(false);
89
87
 
90
- const tree = renderTree(
88
+ const tree = (
91
89
  <>
92
90
  {OuterSlot.isEmpty && "outer-empty"}
93
91
  <OuterSlot>
94
92
  <Show when={showContent.value}>content</Show>
95
93
  </OuterSlot>
96
- </>,
94
+ </>
97
95
  );
98
96
 
99
97
  // Outer should be empty initially.
100
- expect(printTree(tree)).toBe("outer-empty");
98
+ expect(tree).toRenderTo("outer-empty");
101
99
 
102
100
  // Show content — outer should become non-empty.
103
101
  showContent.value = true;
104
- expect(printTree(tree)).toBe("content");
102
+ expect(tree).toRenderTo("content");
105
103
  });
106
104
  });
@@ -1,6 +1,5 @@
1
1
  import { createNamePolicy, Output, useNamePolicy } from "@alloy-js/core";
2
2
  import { expect, it } from "vitest";
3
- import "../testing/extend-expect.js";
4
3
 
5
4
  it("is applied by output", () => {
6
5
  const policy = createNamePolicy((name) => {
@@ -1,8 +1,6 @@
1
1
  import { shallowReactive } from "@vue/reactivity";
2
2
  import { expect, it } from "vitest";
3
3
  import { For } from "../../src/index.js";
4
- import { printTree, renderTree } from "../../src/test-render.js";
5
- import { d } from "../../testing/render.js";
6
4
 
7
5
  it("it should work with circular reactives", () => {
8
6
  const items: string[] = shallowReactive([]);
@@ -23,9 +21,10 @@ it("it should work with circular reactives", () => {
23
21
  </For>
24
22
  </>
25
23
  );
26
- const tree = renderTree(template);
24
+ const tree = template;
25
+ expect(tree).toRenderTo("");
27
26
  items.push("item start");
28
- expect(printTree(tree)).toBe(d`
27
+ expect(tree).toRenderTo(`
29
28
  item start
30
29
  item 1
31
30
  `);
@@ -43,9 +42,10 @@ it("should work with immediately recursive reactives", () => {
43
42
  </For>
44
43
  </>
45
44
  );
46
- const tree = renderTree(template);
45
+ const tree = template;
46
+ expect(tree).toRenderTo("");
47
47
  items.add("item start");
48
- expect(printTree(tree)).toBe(d`
48
+ expect(tree).toRenderTo(`
49
49
  item start
50
50
  item 1
51
51
  `);
@@ -3,7 +3,6 @@ import { describe, expect, it } from "vitest";
3
3
  import { effect, memo, onCleanup } from "../../src/reactivity.js";
4
4
  import type { Children } from "../../src/runtime/component.js";
5
5
  import { flushJobs } from "../../src/scheduler.js";
6
- import { renderTree } from "../../src/test-render.js";
7
6
 
8
7
  describe("memo cleanup", () => {
9
8
  it("cleans up when memo value is recomputed", () => {
@@ -60,7 +59,7 @@ describe("element cleanup", () => {
60
59
  }
61
60
  const el = ref<unknown>(<Component />);
62
61
  const template = <>{el}</>;
63
- renderTree(template);
62
+ expect(template).toRenderTo("hi!");
64
63
  el.value = "";
65
64
  flushJobs();
66
65
  expect(cleanedUp).toBe(true);
@@ -88,7 +87,7 @@ describe("element cleanup", () => {
88
87
  </C1>,
89
88
  );
90
89
  const template = <>{el}</>;
91
- renderTree(template);
90
+ expect(template).toRenderTo("");
92
91
  el.value = "";
93
92
  flushJobs();
94
93
  expect(cleanedUpC1).toBe(true);
@@ -1,45 +1,45 @@
1
- import { code, memo, printTree, renderTree } from "@alloy-js/core";
1
+ import { code, memo } from "@alloy-js/core";
2
2
  import { ref } from "@vue/reactivity";
3
3
  import { expect, it } from "vitest";
4
4
 
5
5
  it("handles refs in the tree", () => {
6
6
  const r = ref(42);
7
- const tree = renderTree(<>The number is {r}</>);
7
+ const tree = <>The number is {r}</>;
8
8
 
9
- expect(printTree(tree)).toBe("The number is 42");
9
+ expect(tree).toRenderTo("The number is 42");
10
10
  r.value = 12;
11
- expect(printTree(tree)).toBe("The number is 12");
11
+ expect(tree).toRenderTo("The number is 12");
12
12
  });
13
13
 
14
14
  it("handles refs in the tree with code", () => {
15
15
  const r = ref(42);
16
- const tree = renderTree(code`
16
+ const tree = code`
17
17
  The number is ${r}
18
- `);
18
+ `;
19
19
 
20
- expect(printTree(tree)).toBe("The number is 42");
20
+ expect(tree).toRenderTo("The number is 42");
21
21
  r.value = 12;
22
- expect(printTree(tree)).toBe("The number is 12");
22
+ expect(tree).toRenderTo("The number is 12");
23
23
  });
24
24
 
25
25
  it("handles memos in the tree", () => {
26
26
  const r = ref(42);
27
27
  const m = memo(() => r.value + 10);
28
- const tree = renderTree(<>The number is {m}</>);
28
+ const tree = <>The number is {m}</>;
29
29
 
30
- expect(printTree(tree)).toBe("The number is 52");
30
+ expect(tree).toRenderTo("The number is 52");
31
31
  r.value = 12;
32
- expect(printTree(tree)).toBe("The number is 22");
32
+ expect(tree).toRenderTo("The number is 22");
33
33
  });
34
34
 
35
35
  it("handles memos in the tree with code", () => {
36
36
  const r = ref(42);
37
37
  const m = memo(() => r.value + 10);
38
- const tree = renderTree(code`
38
+ const tree = code`
39
39
  The number is ${m}
40
- `);
40
+ `;
41
41
 
42
- expect(printTree(tree)).toBe("The number is 52");
42
+ expect(tree).toRenderTo("The number is 52");
43
43
  r.value = 12;
44
- expect(printTree(tree)).toBe("The number is 22");
44
+ expect(tree).toRenderTo("The number is 22");
45
45
  });
@@ -1,8 +1,8 @@
1
- import { memo, printTree, renderTree } from "@alloy-js/core";
1
+ import { memo } from "@alloy-js/core";
2
2
  import { computed, reactive, ref } from "@vue/reactivity";
3
3
  import { expect, it } from "vitest";
4
+ import { flushJobs } from "../../src/scheduler.js";
4
5
  import { mapJoin } from "../../src/utils.js";
5
- import { d } from "../../testing/render.js";
6
6
 
7
7
  it("splices in new nodes", () => {
8
8
  const r = ref(["one"]);
@@ -14,11 +14,11 @@ it("splices in new nodes", () => {
14
14
  return <>{mapped.value} done</>;
15
15
  }
16
16
 
17
- const tree = renderTree(<Foo />);
18
- expect(printTree(tree)).toEqual("mapped one done");
17
+ const tree = <Foo />;
18
+ expect(tree).toRenderTo("mapped one done");
19
19
  r.value = [...r.value, "two"];
20
20
 
21
- expect(printTree(tree)).toEqual("mapped one mapped two done");
21
+ expect(tree).toRenderTo("mapped one mapped two done");
22
22
  });
23
23
 
24
24
  it("works with a complex case", () => {
@@ -56,20 +56,20 @@ it("works with a complex case", () => {
56
56
  `import { ${[...props.types.values()].join(", ")} } from "${props.path}";`;
57
57
  }
58
58
 
59
- const tree = renderTree(<ImportStatements records={importRecords} />);
59
+ const tree = <ImportStatements records={importRecords} />;
60
60
  // the tree is empty.
61
61
 
62
- expect(printTree(tree)).toEqual("");
62
+ expect(tree).toRenderTo("");
63
63
 
64
64
  addImport("./foo.js", "hi");
65
- printTree(tree);
66
- expect(printTree(tree)).toEqual('import { hi } from "./foo.js";');
65
+ flushJobs();
66
+ expect(tree).toRenderTo('import { hi } from "./foo.js";');
67
67
 
68
68
  addImport("./foo.js", "bye");
69
- expect(printTree(tree)).toEqual('import { hi, bye } from "./foo.js";');
69
+ expect(tree).toRenderTo('import { hi, bye } from "./foo.js";');
70
70
 
71
71
  addImport("node:assert", "strictEqual");
72
- expect(printTree(tree)).toEqual(d`
72
+ expect(tree).toRenderTo(`
73
73
  import { hi, bye } from "./foo.js";
74
74
  import { strictEqual } from "node:assert";
75
75
  `);
@@ -77,8 +77,8 @@ it("works with a complex case", () => {
77
77
 
78
78
  it("works with memos of memos", () => {
79
79
  const test = ref(1);
80
- const tree = renderTree(memo(() => memo(() => test.value)));
81
- expect(printTree(tree)).toEqual("1");
80
+ const tree = memo(() => memo(() => test.value));
81
+ expect(tree).toRenderTo("1");
82
82
  test.value = 2;
83
- expect(printTree(tree)).toEqual("2");
83
+ expect(tree).toRenderTo("2");
84
84
  });
@@ -1,6 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { Children, RENDERABLE } from "../../src/runtime/component.js";
3
- import "../../testing/extend-expect.js";
4
3
  describe("string nodes", () => {
5
4
  it("renders string nodes with substitutions", () => {
6
5
  const str = "hi";
@@ -1,6 +1,5 @@
1
1
  import { code } from "@alloy-js/core";
2
2
  import { expect, it } from "vitest";
3
- import "../../testing/extend-expect.js";
4
3
 
5
4
  it("renders simple strings", () => {
6
5
  expect(code`foo`).toRenderTo("foo");
@@ -1,13 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import {
3
- ContentOutputFile,
4
- For,
5
- Output,
6
- render,
7
- SourceFile,
8
- } from "../../src/index.js";
9
- import "../../testing/extend-expect.js";
10
- import { d } from "../../testing/render.js";
2
+ import { For, Output, SourceFile } from "../../src/index.js";
11
3
 
12
4
  describe("group", () => {
13
5
  it("breaks when shouldBreak is passed", () => {
@@ -459,16 +451,16 @@ it("formats based on the output component props", () => {
459
451
  </Output>
460
452
  );
461
453
 
462
- const tree = render(template);
463
- expect((tree.contents[0] as ContentOutputFile).contents).toEqual(d`
464
- 1
465
- 2
466
- 3
467
- 4
468
- 5
469
- 6
470
-
471
- `);
454
+ expect(template).toRenderTo(
455
+ `
456
+ 1
457
+ 2
458
+ 3
459
+ 4
460
+ 5
461
+ 6
462
+ `,
463
+ );
472
464
  });
473
465
 
474
466
  it("formats based on the source file component props", () => {
@@ -482,14 +474,14 @@ it("formats based on the source file component props", () => {
482
474
  </Output>
483
475
  );
484
476
 
485
- const tree = render(template);
486
- expect((tree.contents[0] as ContentOutputFile).contents).toEqual(d`
487
- 1
488
- 2
489
- 3
490
- 4
491
- 5
492
- 6
493
-
494
- `);
477
+ expect(template).toRenderTo(
478
+ `
479
+ 1
480
+ 2
481
+ 3
482
+ 4
483
+ 5
484
+ 6
485
+ `,
486
+ );
495
487
  });
@@ -1,7 +1,6 @@
1
1
  // prettier-ignore
2
2
  import { Indent } from "@alloy-js/core";
3
3
  import { describe, expect, it } from "vitest";
4
- import "../../testing/extend-expect.js";
5
4
 
6
5
  describe("Indent component", () => {
7
6
  it("indents explicitly indented content on a subsequent line", () => {
@@ -2,13 +2,12 @@ import { ref } from "@vue/reactivity";
2
2
  import { expect, it } from "vitest";
3
3
  import { memo } from "../../src/reactivity.js";
4
4
  import { flushJobs } from "../../src/scheduler.js";
5
- import { renderTree } from "../../src/test-render.js";
6
5
 
7
6
  it("memoizes child components", () => {
8
7
  let renderCount = 0;
9
8
  function Child() {
10
9
  renderCount++;
11
- return "hi " + String(Math.random());
10
+ return "hi";
12
11
  }
13
12
 
14
13
  const doThing = ref();
@@ -25,7 +24,7 @@ it("memoizes child components", () => {
25
24
 
26
25
  const template = <>{items}</>;
27
26
 
28
- renderTree(template);
27
+ expect(template).toRenderTo("hi");
29
28
  doThing.value = true;
30
29
  flushJobs();
31
30
  // Without element-cache (legacy), each component creator is invoked on
@@ -12,7 +12,6 @@ import {
12
12
  resetDevtoolsServerForTests,
13
13
  } from "../../src/devtools/devtools-server.js";
14
14
  import { clearRenderStack } from "../../src/render-stack.js";
15
- import "../../testing/extend-expect.js";
16
15
 
17
16
  // Strip ANSI escape codes from a string for consistent testing across environments
18
17
  function stripAnsi(str: string): string {
@@ -1,7 +1,6 @@
1
1
  import { refkey, Refkey } from "@alloy-js/core";
2
2
  import { SourceFile } from "@alloy-js/core/stc";
3
3
  import { expect, it } from "vitest";
4
- import "../../testing/extend-expect.js";
5
4
 
6
5
  it("is rendered properly in the tree", () => {
7
6
  const key = refkey("foo");
package/test/stc.test.tsx CHANGED
@@ -1,7 +1,6 @@
1
1
  import { stc } from "@alloy-js/core";
2
2
  import { hbr, indent, Indent } from "@alloy-js/core/stc";
3
3
  import { describe, expect, it } from "vitest";
4
- import "../testing/extend-expect.js";
5
4
 
6
5
  it("is applied by output", () => {
7
6
  function Foo() {
@@ -2,9 +2,7 @@ import { computed, ref, triggerRef } from "@vue/reactivity";
2
2
  import { describe, expect, it } from "vitest";
3
3
  import { Children } from "../src/index.js";
4
4
  import { flushJobs } from "../src/scheduler.js";
5
- import { renderTree } from "../src/test-render.js";
6
5
  import { children, join, mapJoin } from "../src/utils.js";
7
- import "../testing/extend-expect.js";
8
6
 
9
7
  describe("mapJoin", () => {
10
8
  it("can map a map", () => {
@@ -107,7 +105,10 @@ describe("mapJoin", () => {
107
105
  },
108
106
  );
109
107
 
110
- renderTree(joined);
108
+ expect(joined).toRenderTo(`
109
+ Value: 1
110
+ Value: 2
111
+ `);
111
112
 
112
113
  expect(callCount).toBe(2);
113
114
  arr.value.push(3);
@@ -246,34 +247,34 @@ describe("children", () => {
246
247
  }
247
248
 
248
249
  it("resolves a single child", () => {
249
- renderTree(<ResolveChildren>1</ResolveChildren>);
250
+ expect(<ResolveChildren>1</ResolveChildren>).toRenderTo("");
250
251
  expect(resolvedChildren).toEqual("1");
251
252
  });
252
253
 
253
254
  it("resolves multiple children", () => {
254
- renderTree(<ResolveChildren>1{"2"}3</ResolveChildren>);
255
+ expect(<ResolveChildren>1{"2"}3</ResolveChildren>).toRenderTo("");
255
256
  expect(resolvedChildren).toEqual(["1", "2", "3"]);
256
257
  });
257
258
 
258
259
  it("resolves fragments by default", () => {
259
- renderTree(
260
+ expect(
260
261
  <ResolveChildren>
261
262
  <>1</>
262
263
  <>2</>
263
264
  <>3</>
264
265
  </ResolveChildren>,
265
- );
266
+ ).toRenderTo("");
266
267
  expect(resolvedChildren).toEqual(["1", "2", "3"]);
267
268
  });
268
269
 
269
270
  it("preserves fragments if asked", () => {
270
- renderTree(
271
+ expect(
271
272
  <ResolveChildren preserveFragments>
272
273
  <>1</>
273
274
  <>2</>
274
275
  <>3</>
275
276
  </ResolveChildren>,
276
- );
277
+ ).toRenderTo("");
277
278
  expect(resolvedChildren).toEqual([["1"], ["2"], ["3"]]);
278
279
  });
279
280
  });
@@ -0,0 +1 @@
1
+ import "@alloy-js/core/testing";
@@ -1,6 +1,7 @@
1
1
  import { Children, Diagnostic } from "@alloy-js/core";
2
2
  import "vitest";
3
3
  import { expect } from "vitest";
4
+ import { ElementNode } from "../src/render/node.js";
4
5
  import { flushJobs, flushJobsAsync } from "../src/scheduler.js";
5
6
  import {
6
7
  getDiagnosticsForTree,
@@ -9,6 +10,28 @@ import {
9
10
  } from "../src/test-render.js";
10
11
  import { dedent } from "./render.js";
11
12
 
13
+ // Cache rendered trees so the same Children reference reuses its tree across
14
+ // multiple toRenderTo assertions (enables reactive test patterns without
15
+ // explicit renderTree calls).
16
+ const renderedTrees = new WeakMap<object, ElementNode>();
17
+
18
+ function getOrRenderTree(received: Children): ElementNode {
19
+ if (received instanceof ElementNode) {
20
+ return received;
21
+ }
22
+ // If received is an object (array/JSX node), check cache
23
+ if (typeof received === "object" && received !== null) {
24
+ const cached = renderedTrees.get(received as object);
25
+ if (cached) {
26
+ return cached;
27
+ }
28
+ const tree = renderTree(received);
29
+ renderedTrees.set(received as object, tree);
30
+ return tree;
31
+ }
32
+ return renderTree(received);
33
+ }
34
+
12
35
  /**
13
36
  * Print options passed to `toRenderTo` / `toRenderToAsync`. These override
14
37
  * the per-`SourceFile` print settings for the duration of the assertion,
@@ -47,7 +70,7 @@ expect.extend({
47
70
  expectedRaw: string | Record<string, string>,
48
71
  renderOptions?: ToRenderToOptions,
49
72
  ) {
50
- const tree = renderTree(received);
73
+ const tree = getOrRenderTree(received);
51
74
  flushJobs();
52
75
  const actual = getFilesFromTree(tree, renderOptions);
53
76
 
package/vitest.config.ts CHANGED
@@ -14,5 +14,8 @@ export default defineConfig({
14
14
  jsx: "preserve",
15
15
  sourcemap: "both",
16
16
  },
17
+ test: {
18
+ setupFiles: ["./test/vitest.setup.ts"],
19
+ },
17
20
  plugins: [alloyPlugin()],
18
21
  });