@praxisjs/runtime 0.7.1 → 0.8.0

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 (138) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/children.d.ts.map +1 -1
  3. package/dist/children.js +2 -1
  4. package/dist/children.js.map +1 -1
  5. package/dist/component.d.ts +2 -3
  6. package/dist/component.d.ts.map +1 -1
  7. package/dist/component.js +133 -60
  8. package/dist/component.js.map +1 -1
  9. package/dist/context.d.ts +13 -0
  10. package/dist/context.d.ts.map +1 -1
  11. package/dist/context.js +24 -2
  12. package/dist/context.js.map +1 -1
  13. package/dist/dom/constants.d.ts +1 -1
  14. package/dist/dom/constants.d.ts.map +1 -1
  15. package/dist/dom/constants.js +24 -83
  16. package/dist/dom/constants.js.map +1 -1
  17. package/dist/dom/create.d.ts +1 -1
  18. package/dist/dom/create.d.ts.map +1 -1
  19. package/dist/dom/create.js +3 -3
  20. package/dist/dom/create.js.map +1 -1
  21. package/dist/dom/events.d.ts +28 -0
  22. package/dist/dom/events.d.ts.map +1 -1
  23. package/dist/dom/events.js +163 -17
  24. package/dist/dom/events.js.map +1 -1
  25. package/dist/dom/props.d.ts +4 -0
  26. package/dist/dom/props.d.ts.map +1 -1
  27. package/dist/dom/props.js +55 -7
  28. package/dist/dom/props.js.map +1 -1
  29. package/dist/dom/range.d.ts +4 -0
  30. package/dist/dom/range.d.ts.map +1 -0
  31. package/dist/dom/range.js +43 -0
  32. package/dist/dom/range.js.map +1 -0
  33. package/dist/dom/remove.d.ts.map +1 -1
  34. package/dist/dom/remove.js +2 -8
  35. package/dist/dom/remove.js.map +1 -1
  36. package/dist/element.d.ts.map +1 -1
  37. package/dist/element.js +7 -5
  38. package/dist/element.js.map +1 -1
  39. package/dist/hmr.d.ts +35 -0
  40. package/dist/hmr.d.ts.map +1 -0
  41. package/dist/hmr.js +85 -0
  42. package/dist/hmr.js.map +1 -0
  43. package/dist/hydration-context.d.ts +9 -1
  44. package/dist/hydration-context.d.ts.map +1 -1
  45. package/dist/hydration-context.js +34 -13
  46. package/dist/hydration-context.js.map +1 -1
  47. package/dist/hydration.d.ts.map +1 -1
  48. package/dist/hydration.js +4 -11
  49. package/dist/hydration.js.map +1 -1
  50. package/dist/index.d.ts +16 -5
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +31 -7
  53. package/dist/index.js.map +1 -1
  54. package/dist/list.d.ts +72 -0
  55. package/dist/list.d.ts.map +1 -0
  56. package/dist/list.js +786 -0
  57. package/dist/list.js.map +1 -0
  58. package/dist/portal.d.ts.map +1 -1
  59. package/dist/portal.js +3 -0
  60. package/dist/portal.js.map +1 -1
  61. package/dist/reactive.d.ts +2 -2
  62. package/dist/reactive.d.ts.map +1 -1
  63. package/dist/reactive.js +109 -34
  64. package/dist/reactive.js.map +1 -1
  65. package/dist/scope.d.ts +14 -4
  66. package/dist/scope.d.ts.map +1 -1
  67. package/dist/scope.js +55 -15
  68. package/dist/scope.js.map +1 -1
  69. package/dist/template.d.ts +48 -0
  70. package/dist/template.d.ts.map +1 -0
  71. package/dist/template.js +270 -0
  72. package/dist/template.js.map +1 -0
  73. package/package.json +15 -6
  74. package/src/children.ts +2 -1
  75. package/src/component.ts +135 -63
  76. package/src/context.ts +35 -4
  77. package/src/dom/constants.ts +25 -82
  78. package/src/dom/create.ts +3 -3
  79. package/src/dom/events.ts +184 -16
  80. package/src/dom/props.ts +65 -8
  81. package/src/dom/range.ts +45 -0
  82. package/src/dom/remove.ts +3 -7
  83. package/src/element.ts +8 -6
  84. package/src/hmr.ts +110 -0
  85. package/src/hydration-context.ts +34 -13
  86. package/src/hydration.ts +4 -9
  87. package/src/index.ts +54 -7
  88. package/src/list.ts +886 -0
  89. package/src/portal.ts +3 -0
  90. package/src/reactive.ts +147 -40
  91. package/src/scope.ts +63 -16
  92. package/src/template.ts +271 -0
  93. package/dist/__tests__/children.test.d.ts +0 -2
  94. package/dist/__tests__/children.test.d.ts.map +0 -1
  95. package/dist/__tests__/children.test.js +0 -241
  96. package/dist/__tests__/children.test.js.map +0 -1
  97. package/dist/__tests__/component.test.d.ts +0 -2
  98. package/dist/__tests__/component.test.d.ts.map +0 -1
  99. package/dist/__tests__/component.test.js +0 -347
  100. package/dist/__tests__/component.test.js.map +0 -1
  101. package/dist/__tests__/context.test.d.ts +0 -2
  102. package/dist/__tests__/context.test.d.ts.map +0 -1
  103. package/dist/__tests__/context.test.js +0 -111
  104. package/dist/__tests__/context.test.js.map +0 -1
  105. package/dist/__tests__/dom.test.d.ts +0 -2
  106. package/dist/__tests__/dom.test.d.ts.map +0 -1
  107. package/dist/__tests__/dom.test.js +0 -429
  108. package/dist/__tests__/dom.test.js.map +0 -1
  109. package/dist/__tests__/hydration.test.d.ts +0 -2
  110. package/dist/__tests__/hydration.test.d.ts.map +0 -1
  111. package/dist/__tests__/hydration.test.js +0 -299
  112. package/dist/__tests__/hydration.test.js.map +0 -1
  113. package/dist/__tests__/portal.test.d.ts +0 -2
  114. package/dist/__tests__/portal.test.d.ts.map +0 -1
  115. package/dist/__tests__/portal.test.js +0 -157
  116. package/dist/__tests__/portal.test.js.map +0 -1
  117. package/dist/__tests__/remove.test.d.ts +0 -2
  118. package/dist/__tests__/remove.test.d.ts.map +0 -1
  119. package/dist/__tests__/remove.test.js +0 -45
  120. package/dist/__tests__/remove.test.js.map +0 -1
  121. package/dist/__tests__/render.test.d.ts +0 -2
  122. package/dist/__tests__/render.test.d.ts.map +0 -1
  123. package/dist/__tests__/render.test.js +0 -97
  124. package/dist/__tests__/render.test.js.map +0 -1
  125. package/dist/__tests__/scope.test.d.ts +0 -2
  126. package/dist/__tests__/scope.test.d.ts.map +0 -1
  127. package/dist/__tests__/scope.test.js +0 -110
  128. package/dist/__tests__/scope.test.js.map +0 -1
  129. package/src/__tests__/children.test.ts +0 -276
  130. package/src/__tests__/component.test.ts +0 -381
  131. package/src/__tests__/context.test.ts +0 -128
  132. package/src/__tests__/dom.test.ts +0 -483
  133. package/src/__tests__/hydration.test.ts +0 -360
  134. package/src/__tests__/portal.test.ts +0 -177
  135. package/src/__tests__/remove.test.ts +0 -51
  136. package/src/__tests__/render.test.ts +0 -119
  137. package/src/__tests__/scope.test.ts +0 -120
  138. package/tsconfig.json +0 -8
@@ -1,299 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect, vi, afterEach } from "vitest";
3
- import { StatefulComponent } from "@praxisjs/core";
4
- import { isServerRenderPass, setServerRenderPass, signal } from "@praxisjs/core/internal";
5
- import { mountComponent } from "../component";
6
- import { getCurrentScope } from "../context";
7
- import { mountElement } from "../element";
8
- import { reconcile } from "../hydration";
9
- import { registerReactiveNode } from "../hydration-context";
10
- import { render, Portal } from "../index";
11
- import { Scope } from "../scope";
12
- const SSG_MARKER = "data-praxis-ssg";
13
- /** Renders `factory` into a throwaway container and returns the resulting markup, simulating SSR output. */
14
- function ssrHTML(factory) {
15
- const serverContainer = document.createElement("div");
16
- const unmount = render(factory, serverContainer);
17
- const html = serverContainer.innerHTML;
18
- unmount();
19
- return html;
20
- }
21
- function hydratable(factory) {
22
- const container = document.createElement("div");
23
- container.innerHTML = ssrHTML(factory);
24
- container.setAttribute(SSG_MARKER, "1");
25
- document.body.appendChild(container);
26
- return container;
27
- }
28
- afterEach(() => { setServerRenderPass(false); });
29
- describe("render() — hydration (build + reconcile)", () => {
30
- it("adopts a flat element instead of recreating it", () => {
31
- const factory = () => mountElement("p", { id: "greet", children: "hello" }, new Scope());
32
- const container = hydratable(factory);
33
- const serverEl = container.querySelector("#greet");
34
- expect(serverEl).not.toBeNull();
35
- render(factory, container);
36
- expect(container.querySelector("#greet")).toBe(serverEl);
37
- document.body.removeChild(container);
38
- });
39
- it("adopts nested elements at every level — the case that broke the ambient-cursor attempt", () => {
40
- const factory = () => mountElement("div", {
41
- id: "outer",
42
- children: mountElement("span", { id: "inner", children: "text" }, new Scope()),
43
- }, new Scope());
44
- const container = hydratable(factory);
45
- const outerBefore = container.querySelector("#outer");
46
- const innerBefore = container.querySelector("#inner");
47
- render(factory, container);
48
- expect(container.querySelector("#outer")).toBe(outerBefore);
49
- expect(container.querySelector("#inner")).toBe(innerBefore);
50
- expect(container.textContent).toBe("text");
51
- document.body.removeChild(container);
52
- });
53
- it("adopts three levels deep with siblings at each level", () => {
54
- const factory = () => mountElement("ul", {
55
- id: "list",
56
- children: [
57
- mountElement("li", { id: "a", children: mountElement("b", { children: "1" }, new Scope()) }, new Scope()),
58
- mountElement("li", { id: "b", children: "2" }, new Scope()),
59
- ],
60
- }, new Scope());
61
- const container = hydratable(factory);
62
- const before = {
63
- list: container.querySelector("#list"),
64
- a: container.querySelector("#a"),
65
- b: container.querySelector("#b"),
66
- bold: container.querySelector("b"),
67
- };
68
- render(factory, container);
69
- expect(container.querySelector("#list")).toBe(before.list);
70
- expect(container.querySelector("#a")).toBe(before.a);
71
- expect(container.querySelector("#b")).toBe(before.b);
72
- expect(container.querySelector("b")).toBe(before.bold);
73
- document.body.removeChild(container);
74
- });
75
- it("wires event listeners onto the adopted (real) element via replay", () => {
76
- let clicks = 0;
77
- const factory = () => mountElement("div", {
78
- children: mountElement("button", { onClick: () => { clicks++; }, children: "Click" }, new Scope()),
79
- }, new Scope());
80
- const container = hydratable(factory);
81
- const buttonBefore = container.querySelector("button");
82
- render(factory, container);
83
- expect(container.querySelector("button")).toBe(buttonBefore);
84
- container.querySelector("button")?.dispatchEvent(new MouseEvent("click", { bubbles: true }));
85
- expect(clicks).toBe(1);
86
- document.body.removeChild(container);
87
- });
88
- it("hydrates reactive text and keeps reacting to signal changes afterwards", () => {
89
- const text = signal("initial");
90
- const factory = () => mountElement("span", { children: () => text() }, new Scope());
91
- const container = hydratable(factory);
92
- expect(container.textContent).toBe("initial");
93
- render(factory, container);
94
- text.set("updated");
95
- expect(container.textContent).toBe("updated");
96
- text.set("initial");
97
- document.body.removeChild(container);
98
- });
99
- it("hydrates a reactive list of elements, keeping real nodes, and stays correct after a later update", () => {
100
- const items = signal(["a", "b", "c"]);
101
- const factory = () => mountElement("ul", {
102
- id: "list",
103
- children: () => items().map((item) => mountElement("li", { children: item }, new Scope())),
104
- }, new Scope());
105
- const container = hydratable(factory);
106
- const list = container.querySelector("#list");
107
- const firstLiBefore = list.querySelector("li");
108
- expect(container.textContent).toBe("abc");
109
- render(factory, container);
110
- expect(container.querySelector("#list")?.querySelector("li")).toBe(firstLiBefore);
111
- expect(container.textContent).toBe("abc");
112
- // A subsequent reactive update must diff correctly — this only works if
113
- // reconcile() rewrote mountReactive's `currentNodes` bookkeeping in place
114
- // when it kept the real <li> elements instead of the fresh ones.
115
- items.set(["x", "y"]);
116
- expect(container.textContent).toBe("xy");
117
- items.set(["z"]);
118
- expect(container.textContent).toBe("z");
119
- document.body.removeChild(container);
120
- });
121
- it("hydrates a component nested inside another component, firing onMount/onUnmount correctly", async () => {
122
- class Inner extends StatefulComponent {
123
- static __isComponent = true;
124
- static __isStateless = false;
125
- onMount() { }
126
- onUnmount() { }
127
- render() { return mountElement("em", { children: "inner" }, getCurrentScope()); }
128
- }
129
- class Outer extends StatefulComponent {
130
- static __isComponent = true;
131
- static __isStateless = false;
132
- onMount() { }
133
- render() {
134
- return mountElement("section", {
135
- children: mountComponent(Inner, {}, getCurrentScope()),
136
- }, getCurrentScope());
137
- }
138
- }
139
- const factory = () => mountComponent(Outer, {}, getCurrentScope());
140
- const container = hydratable(factory);
141
- const emBefore = container.querySelector("em");
142
- const outerMount = vi.spyOn(Outer.prototype, "onMount");
143
- const innerMount = vi.spyOn(Inner.prototype, "onMount");
144
- const innerUnmount = vi.spyOn(Inner.prototype, "onUnmount");
145
- const dispose = render(factory, container);
146
- await Promise.resolve();
147
- expect(outerMount).toHaveBeenCalledOnce();
148
- expect(innerMount).toHaveBeenCalledOnce();
149
- expect(container.querySelector("em")).toBe(emBefore);
150
- expect(container.textContent).toBe("inner");
151
- dispose();
152
- expect(innerUnmount).toHaveBeenCalledOnce();
153
- outerMount.mockRestore();
154
- innerMount.mockRestore();
155
- innerUnmount.mockRestore();
156
- document.body.removeChild(container);
157
- });
158
- it("a tag mismatch at one node replaces only that node — siblings stay adopted", () => {
159
- const factory = () => mountElement("div", {
160
- id: "wrap",
161
- children: [
162
- mountElement("p", { id: "before", children: "before" }, new Scope()),
163
- mountElement("span", { id: "target", children: "new" }, new Scope()),
164
- mountElement("p", { id: "after", children: "after" }, new Scope()),
165
- ],
166
- }, new Scope());
167
- const container = document.createElement("div");
168
- container.innerHTML =
169
- '<div id="wrap"><p id="before">before</p><strong id="target">old</strong><p id="after">after</p></div>';
170
- container.setAttribute(SSG_MARKER, "1");
171
- document.body.appendChild(container);
172
- const beforeEl = container.querySelector("#before");
173
- const afterEl = container.querySelector("#after");
174
- render(factory, container);
175
- expect(container.querySelector("#before")).toBe(beforeEl);
176
- expect(container.querySelector("#after")).toBe(afterEl);
177
- expect(container.querySelector("#target")?.tagName.toLowerCase()).toBe("span");
178
- expect(container.textContent).toBe("beforenewafter");
179
- document.body.removeChild(container);
180
- });
181
- it("appends extra fresh nodes when the real DOM has fewer children than the fresh tree", () => {
182
- // Client factory produces three items; the server only rendered two —
183
- // exercises reconcile()'s mismatch branch once realCursor has run out.
184
- const factory = () => mountElement("ul", {
185
- id: "list",
186
- children: [
187
- mountElement("li", { id: "a", children: "a" }, new Scope()),
188
- mountElement("li", { id: "b", children: "b" }, new Scope()),
189
- mountElement("li", { id: "c", children: "c" }, new Scope()),
190
- ],
191
- }, new Scope());
192
- const container = document.createElement("div");
193
- container.innerHTML = '<ul id="list"><li id="a">a</li><li id="b">b</li></ul>';
194
- container.setAttribute(SSG_MARKER, "1");
195
- document.body.appendChild(container);
196
- const aBefore = container.querySelector("#a");
197
- const bBefore = container.querySelector("#b");
198
- render(factory, container);
199
- expect(container.querySelector("#a")).toBe(aBefore);
200
- expect(container.querySelector("#b")).toBe(bBefore);
201
- expect(container.querySelector("#c")?.textContent).toBe("c");
202
- expect(container.querySelectorAll("#list > li")).toHaveLength(3);
203
- document.body.removeChild(container);
204
- });
205
- it("keeps the real element even when its fresh counterpart bypassed mountElement (nothing recorded to replay)", () => {
206
- class RawComp extends StatefulComponent {
207
- static __isComponent = true;
208
- static __isStateless = false;
209
- render() {
210
- const el = document.createElement("mark");
211
- el.id = "raw";
212
- el.textContent = "raw content";
213
- return el;
214
- }
215
- }
216
- const factory = () => mountComponent(RawComp, {}, getCurrentScope());
217
- const container = hydratable(factory);
218
- const markBefore = container.querySelector("#raw");
219
- render(factory, container);
220
- expect(container.querySelector("#raw")).toBe(markBefore);
221
- expect(container.textContent).toBe("raw content");
222
- document.body.removeChild(container);
223
- });
224
- it("removes trailing real nodes the fresh tree no longer produces", () => {
225
- // Server rendered three items; the client factory only produces two —
226
- // exercises reconcile()'s cleanup loop for leftover real siblings past
227
- // the end of freshChildren.
228
- const factory = () => mountElement("ul", {
229
- id: "list",
230
- children: [
231
- mountElement("li", { id: "a", children: "a" }, new Scope()),
232
- mountElement("li", { id: "b", children: "b" }, new Scope()),
233
- ],
234
- }, new Scope());
235
- const container = document.createElement("div");
236
- container.innerHTML =
237
- '<ul id="list"><li id="a">a</li><li id="b">b</li><li id="c">c</li></ul>';
238
- container.setAttribute(SSG_MARKER, "1");
239
- document.body.appendChild(container);
240
- const aBefore = container.querySelector("#a");
241
- const bBefore = container.querySelector("#b");
242
- render(factory, container);
243
- expect(container.querySelector("#a")).toBe(aBefore);
244
- expect(container.querySelector("#b")).toBe(bBefore);
245
- expect(container.querySelector("#c")).toBeNull();
246
- expect(container.querySelectorAll("#list > li")).toHaveLength(2);
247
- document.body.removeChild(container);
248
- });
249
- it("reconcile() is a safe no-op when a fresh node's registered reactive owner doesn't actually contain it", () => {
250
- // Defensive guard in notifyReplacement(): registerReactiveNode() always
251
- // registers a node into the exact array collectNodes() just built it
252
- // into, so indexOf() finding nothing shouldn't happen through normal
253
- // mounting — this exercises that branch directly, at the unit level, to
254
- // confirm the guard degrades safely (no throw, no corruption) rather
255
- // than silently trusting it can never occur.
256
- const fresh = document.createElement("span");
257
- const bogusOwner = [];
258
- registerReactiveNode(fresh, bogusOwner);
259
- const container = document.createElement("div");
260
- const real = document.createElement("span");
261
- container.appendChild(real);
262
- expect(() => { reconcile(container, [fresh]); }).not.toThrow();
263
- expect(bogusOwner).toEqual([]);
264
- expect(container.firstChild).toBe(real);
265
- });
266
- it("plain client render (no SSG marker) is completely unaffected", () => {
267
- const factory = () => mountElement("p", { children: "hello" }, new Scope());
268
- const container = document.createElement("div");
269
- document.body.appendChild(container);
270
- render(factory, container);
271
- expect(container.textContent).toBe("hello");
272
- document.body.removeChild(container);
273
- });
274
- });
275
- describe("Portal — server render pass", () => {
276
- it("renders nothing into the target during a server render pass", () => {
277
- setServerRenderPass(true);
278
- expect(isServerRenderPass()).toBe(true);
279
- const target = document.createElement("div");
280
- document.body.appendChild(target);
281
- const scope = new Scope();
282
- const nodes = mountComponent(Portal, { to: target, children: document.createTextNode("hi") }, scope);
283
- expect(target.textContent).toBe("");
284
- expect(nodes.every((n) => n.nodeType === Node.COMMENT_NODE)).toBe(true);
285
- scope.dispose();
286
- document.body.removeChild(target);
287
- });
288
- it("mounts normally on the client once the server pass is over", () => {
289
- setServerRenderPass(false);
290
- const target = document.createElement("div");
291
- document.body.appendChild(target);
292
- const scope = new Scope();
293
- mountComponent(Portal, { to: target, children: document.createTextNode("hi") }, scope);
294
- expect(target.textContent).toBe("hi");
295
- scope.dispose();
296
- document.body.removeChild(target);
297
- });
298
- });
299
- //# sourceMappingURL=hydration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hydration.test.js","sourceRoot":"","sources":["../../src/__tests__/hydration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=portal.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"portal.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/portal.test.ts"],"names":[],"mappings":""}
@@ -1,157 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect, beforeEach, vi } from "vitest";
3
- import { signal } from "@praxisjs/core/internal";
4
- import { mountComponent } from "../component";
5
- import { Portal, resolvePortalTarget } from "../portal";
6
- import { Scope } from "../scope";
7
- function mount(props = {}) {
8
- const scope = new Scope();
9
- const nodes = mountComponent(Portal, props, scope);
10
- return { nodes, scope };
11
- }
12
- beforeEach(() => {
13
- document.body.innerHTML = "";
14
- });
15
- describe("Portal", () => {
16
- it("renders children into document.body by default", () => {
17
- const child = document.createTextNode("portal-content");
18
- const { scope } = mount({ children: child });
19
- expect(document.body.textContent).toContain("portal-content");
20
- scope.dispose();
21
- });
22
- it("renders children into a provided target element", () => {
23
- const target = document.createElement("div");
24
- document.body.appendChild(target);
25
- const child = document.createTextNode("into-target");
26
- const { scope } = mount({ to: target, children: child });
27
- expect(target.textContent).toContain("into-target");
28
- scope.dispose();
29
- });
30
- it("renders children into an element found by CSS selector", () => {
31
- const target = document.createElement("div");
32
- target.id = "portal-root";
33
- document.body.appendChild(target);
34
- const child = document.createTextNode("selector-content");
35
- const { scope } = mount({ to: "#portal-root", children: child });
36
- expect(target.textContent).toContain("selector-content");
37
- scope.dispose();
38
- });
39
- it("returns a comment placeholder at the natural DOM position", () => {
40
- const { nodes, scope } = mount({ children: document.createTextNode("x") });
41
- const placeholder = nodes.find((n) => n.nodeType === Node.COMMENT_NODE && n.data === "portal");
42
- expect(placeholder).toBeDefined();
43
- scope.dispose();
44
- });
45
- it("does not append children into the natural parent", () => {
46
- const container = document.createElement("div");
47
- const child = document.createTextNode("no-leak");
48
- const { nodes, scope } = mount({ children: child });
49
- nodes.forEach((n) => container.appendChild(n));
50
- expect(container.textContent).toBe(""); // no visible content in natural parent
51
- scope.dispose();
52
- });
53
- it("removes portal nodes from target when scope disposes", () => {
54
- const child = document.createTextNode("to-remove");
55
- const { scope } = mount({ children: child });
56
- expect(document.body.textContent).toContain("to-remove");
57
- scope.dispose();
58
- expect(document.body.textContent).toBe("");
59
- });
60
- it("removes nodes cleanly when target has pre-existing content", () => {
61
- const pre = document.createTextNode("pre-existing");
62
- document.body.appendChild(pre);
63
- const child = document.createTextNode("portal-node");
64
- const { scope } = mount({ children: child });
65
- scope.dispose();
66
- expect(document.body.textContent).toBe("pre-existing");
67
- });
68
- it("does not throw if portal anchors were removed before dispose", () => {
69
- const child = document.createTextNode("temporary");
70
- const { scope } = mount({ children: child });
71
- document.body.innerHTML = "";
72
- expect(() => scope.dispose()).not.toThrow();
73
- });
74
- it("multiple portals into the same target clean up independently", () => {
75
- const child1 = document.createTextNode("first");
76
- const child2 = document.createTextNode("second");
77
- const { scope: s1 } = mount({ children: child1 });
78
- const { scope: s2 } = mount({ children: child2 });
79
- expect(document.body.textContent).toContain("first");
80
- expect(document.body.textContent).toContain("second");
81
- s1.dispose();
82
- expect(document.body.textContent).not.toContain("first");
83
- expect(document.body.textContent).toContain("second");
84
- s2.dispose();
85
- expect(document.body.textContent).toBe("");
86
- });
87
- it("renders reactive children into target and updates them", async () => {
88
- const count = signal(0);
89
- const { scope } = mount({
90
- children: () => document.createTextNode(String(count())),
91
- });
92
- expect(document.body.textContent).toBe("0");
93
- count.set(1);
94
- await Promise.resolve();
95
- expect(document.body.textContent).toBe("1");
96
- scope.dispose();
97
- });
98
- it("returns null and mounts nothing when target is not found", () => {
99
- const bodyBefore = document.body.innerHTML;
100
- const { scope } = mount({ to: "#nonexistent", children: document.createTextNode("x") });
101
- expect(document.body.innerHTML).toBe(bodyBefore);
102
- scope.dispose();
103
- });
104
- });
105
- // ── resolvePortalTarget (unit) ────────────────────────────────────────────────
106
- describe("resolvePortalTarget", () => {
107
- it("returns document.body when to is null (browser environment)", () => {
108
- expect(resolvePortalTarget(null)).toBe(document.body);
109
- });
110
- it("returns document.body when to is undefined (browser environment)", () => {
111
- expect(resolvePortalTarget(undefined)).toBe(document.body);
112
- });
113
- it("returns null when to is null and document is not defined (SSR)", () => {
114
- vi.stubGlobal("document", undefined);
115
- try {
116
- const result = resolvePortalTarget(null);
117
- expect(result).toBeNull();
118
- }
119
- finally {
120
- vi.unstubAllGlobals();
121
- }
122
- });
123
- it("resolves an Element directly", () => {
124
- const el = document.createElement("div");
125
- expect(resolvePortalTarget(el)).toBe(el);
126
- });
127
- it("resolves a CSS selector", () => {
128
- const el = document.createElement("div");
129
- el.id = "resolve-test";
130
- document.body.appendChild(el);
131
- expect(resolvePortalTarget("#resolve-test")).toBe(el);
132
- document.body.removeChild(el);
133
- });
134
- it("attaches the whole subtree to the target in one operation", () => {
135
- const target = document.createElement("div");
136
- document.body.appendChild(target);
137
- const spy = vi.spyOn(target, "appendChild");
138
- const children = [document.createElement("p"), document.createElement("span")];
139
- const { scope } = mount({ to: target, children });
140
- expect(spy).toHaveBeenCalledOnce();
141
- expect(target.querySelector("p")).not.toBeNull();
142
- expect(target.querySelector("span")).not.toBeNull();
143
- scope.dispose();
144
- });
145
- it("reactive children mounted through the portal keep updating after attach", () => {
146
- const target = document.createElement("div");
147
- document.body.appendChild(target);
148
- const s = signal("one");
149
- const { scope } = mount({ to: target, children: () => s() });
150
- expect(target.textContent).toContain("one");
151
- s.set("two");
152
- expect(target.textContent).toContain("two");
153
- expect(target.textContent).not.toContain("one");
154
- scope.dispose();
155
- });
156
- });
157
- //# sourceMappingURL=portal.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"portal.test.js","sourceRoot":"","sources":["../../src/__tests__/portal.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=remove.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remove.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/remove.test.ts"],"names":[],"mappings":""}
@@ -1,45 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect } from "vitest";
3
- import { removeNodes } from "../dom/remove";
4
- function siblings(...names) {
5
- const parent = document.createElement("div");
6
- const nodes = names.map((name) => {
7
- const el = document.createElement(name);
8
- parent.appendChild(el);
9
- return el;
10
- });
11
- return { parent, nodes };
12
- }
13
- describe("removeNodes", () => {
14
- it("removes the first-to-last span and leaves the surrounding siblings", () => {
15
- const { parent, nodes } = siblings("a", "b", "c", "d", "e");
16
- removeNodes(nodes.slice(1, 4));
17
- expect([...parent.children].map((c) => c.localName)).toEqual(["a", "e"]);
18
- });
19
- it("also removes nodes inserted between first and last after the list was captured", () => {
20
- const { parent, nodes } = siblings("a", "b");
21
- const late = document.createElement("late");
22
- parent.insertBefore(late, nodes[1]);
23
- removeNodes(nodes);
24
- expect(parent.childNodes).toHaveLength(0);
25
- });
26
- it("removes a single node", () => {
27
- const { parent, nodes } = siblings("a", "b");
28
- removeNodes([nodes[0]]);
29
- expect([...parent.children]).toEqual([nodes[1]]);
30
- });
31
- it("removes the attached nodes individually when the first one is detached", () => {
32
- const { parent, nodes } = siblings("a", "b", "c");
33
- parent.removeChild(nodes[0]);
34
- expect(() => { removeNodes(nodes); }).not.toThrow();
35
- expect(parent.childNodes).toHaveLength(0);
36
- });
37
- it("removes each node from its own parent when first and last have different parents", () => {
38
- const one = siblings("a", "b");
39
- const two = siblings("c", "d");
40
- removeNodes([one.nodes[0], one.nodes[1], two.nodes[0]]);
41
- expect(one.parent.childNodes).toHaveLength(0);
42
- expect([...two.parent.children]).toEqual([two.nodes[1]]);
43
- });
44
- });
45
- //# sourceMappingURL=remove.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remove.test.js","sourceRoot":"","sources":["../../src/__tests__/remove.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=render.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/render.test.ts"],"names":[],"mappings":""}