@furystack/shades 11.1.0 → 12.0.1

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 (166) hide show
  1. package/CHANGELOG.md +312 -0
  2. package/README.md +13 -13
  3. package/esm/component-factory.spec.js +13 -5
  4. package/esm/component-factory.spec.js.map +1 -1
  5. package/esm/components/index.d.ts +4 -1
  6. package/esm/components/index.d.ts.map +1 -1
  7. package/esm/components/index.js +4 -1
  8. package/esm/components/index.js.map +1 -1
  9. package/esm/components/lazy-load.d.ts +2 -4
  10. package/esm/components/lazy-load.d.ts.map +1 -1
  11. package/esm/components/lazy-load.js +40 -24
  12. package/esm/components/lazy-load.js.map +1 -1
  13. package/esm/components/lazy-load.spec.js +57 -50
  14. package/esm/components/lazy-load.spec.js.map +1 -1
  15. package/esm/components/link-to-route.d.ts +2 -0
  16. package/esm/components/link-to-route.d.ts.map +1 -1
  17. package/esm/components/link-to-route.js +3 -2
  18. package/esm/components/link-to-route.js.map +1 -1
  19. package/esm/components/link-to-route.spec.js +13 -9
  20. package/esm/components/link-to-route.spec.js.map +1 -1
  21. package/esm/components/nested-route-link.d.ts +62 -0
  22. package/esm/components/nested-route-link.d.ts.map +1 -0
  23. package/esm/components/nested-route-link.js +66 -0
  24. package/esm/components/nested-route-link.js.map +1 -0
  25. package/esm/components/nested-route-link.spec.d.ts +2 -0
  26. package/esm/components/nested-route-link.spec.d.ts.map +1 -0
  27. package/esm/components/nested-route-link.spec.js +179 -0
  28. package/esm/components/nested-route-link.spec.js.map +1 -0
  29. package/esm/components/nested-route-types.d.ts +37 -0
  30. package/esm/components/nested-route-types.d.ts.map +1 -0
  31. package/esm/components/nested-route-types.js +2 -0
  32. package/esm/components/nested-route-types.js.map +1 -0
  33. package/esm/components/nested-router.d.ts +103 -0
  34. package/esm/components/nested-router.d.ts.map +1 -0
  35. package/esm/components/nested-router.js +183 -0
  36. package/esm/components/nested-router.js.map +1 -0
  37. package/esm/components/nested-router.spec.d.ts +2 -0
  38. package/esm/components/nested-router.spec.d.ts.map +1 -0
  39. package/esm/components/nested-router.spec.js +737 -0
  40. package/esm/components/nested-router.spec.js.map +1 -0
  41. package/esm/components/route-link.d.ts +4 -0
  42. package/esm/components/route-link.d.ts.map +1 -1
  43. package/esm/components/route-link.js +5 -5
  44. package/esm/components/route-link.js.map +1 -1
  45. package/esm/components/route-link.spec.js +16 -12
  46. package/esm/components/route-link.spec.js.map +1 -1
  47. package/esm/components/router.d.ts +20 -2
  48. package/esm/components/router.d.ts.map +1 -1
  49. package/esm/components/router.js +12 -7
  50. package/esm/components/router.js.map +1 -1
  51. package/esm/components/router.spec.js +141 -74
  52. package/esm/components/router.spec.js.map +1 -1
  53. package/esm/initialize.d.ts +11 -0
  54. package/esm/initialize.d.ts.map +1 -1
  55. package/esm/initialize.js +5 -0
  56. package/esm/initialize.js.map +1 -1
  57. package/esm/jsx.d.ts +83 -2
  58. package/esm/jsx.d.ts.map +1 -1
  59. package/esm/models/children-list.d.ts +5 -1
  60. package/esm/models/children-list.d.ts.map +1 -1
  61. package/esm/models/partial-element.d.ts +12 -2
  62. package/esm/models/partial-element.d.ts.map +1 -1
  63. package/esm/models/render-options.d.ts +89 -3
  64. package/esm/models/render-options.d.ts.map +1 -1
  65. package/esm/models/selection-state.d.ts +4 -0
  66. package/esm/models/selection-state.d.ts.map +1 -1
  67. package/esm/services/location-service.d.ts +11 -0
  68. package/esm/services/location-service.d.ts.map +1 -1
  69. package/esm/services/location-service.js +11 -0
  70. package/esm/services/location-service.js.map +1 -1
  71. package/esm/services/resource-manager.d.ts +24 -0
  72. package/esm/services/resource-manager.d.ts.map +1 -1
  73. package/esm/services/resource-manager.js +36 -1
  74. package/esm/services/resource-manager.js.map +1 -1
  75. package/esm/services/resource-manager.spec.js +102 -0
  76. package/esm/services/resource-manager.spec.js.map +1 -1
  77. package/esm/services/screen-service.d.ts +81 -4
  78. package/esm/services/screen-service.d.ts.map +1 -1
  79. package/esm/services/screen-service.js +75 -4
  80. package/esm/services/screen-service.js.map +1 -1
  81. package/esm/services/screen-service.spec.js +91 -7
  82. package/esm/services/screen-service.spec.js.map +1 -1
  83. package/esm/shade-component.d.ts +17 -4
  84. package/esm/shade-component.d.ts.map +1 -1
  85. package/esm/shade-component.js +67 -5
  86. package/esm/shade-component.js.map +1 -1
  87. package/esm/shade-host-props-ref.integration.spec.d.ts +2 -0
  88. package/esm/shade-host-props-ref.integration.spec.d.ts.map +1 -0
  89. package/esm/shade-host-props-ref.integration.spec.js +381 -0
  90. package/esm/shade-host-props-ref.integration.spec.js.map +1 -0
  91. package/esm/shade-resources.integration.spec.js +208 -39
  92. package/esm/shade-resources.integration.spec.js.map +1 -1
  93. package/esm/shade.d.ts +20 -17
  94. package/esm/shade.d.ts.map +1 -1
  95. package/esm/shade.js +172 -33
  96. package/esm/shade.js.map +1 -1
  97. package/esm/shade.spec.js +31 -30
  98. package/esm/shade.spec.js.map +1 -1
  99. package/esm/shades.integration.spec.js +135 -72
  100. package/esm/shades.integration.spec.js.map +1 -1
  101. package/esm/style-manager.d.ts +2 -2
  102. package/esm/style-manager.js +2 -2
  103. package/esm/svg-types.d.ts +389 -0
  104. package/esm/svg-types.d.ts.map +1 -0
  105. package/esm/svg-types.js +9 -0
  106. package/esm/svg-types.js.map +1 -0
  107. package/esm/svg.d.ts +15 -0
  108. package/esm/svg.d.ts.map +1 -0
  109. package/esm/svg.js +76 -0
  110. package/esm/svg.js.map +1 -0
  111. package/esm/svg.spec.d.ts +2 -0
  112. package/esm/svg.spec.d.ts.map +1 -0
  113. package/esm/svg.spec.js +80 -0
  114. package/esm/svg.spec.js.map +1 -0
  115. package/esm/vnode.d.ts +103 -0
  116. package/esm/vnode.d.ts.map +1 -0
  117. package/esm/vnode.integration.spec.d.ts +2 -0
  118. package/esm/vnode.integration.spec.d.ts.map +1 -0
  119. package/esm/vnode.integration.spec.js +494 -0
  120. package/esm/vnode.integration.spec.js.map +1 -0
  121. package/esm/vnode.js +453 -0
  122. package/esm/vnode.js.map +1 -0
  123. package/esm/vnode.spec.d.ts +2 -0
  124. package/esm/vnode.spec.d.ts.map +1 -0
  125. package/esm/vnode.spec.js +473 -0
  126. package/esm/vnode.spec.js.map +1 -0
  127. package/package.json +8 -9
  128. package/src/component-factory.spec.tsx +18 -5
  129. package/src/components/index.ts +4 -1
  130. package/src/components/lazy-load.spec.tsx +82 -75
  131. package/src/components/lazy-load.tsx +49 -27
  132. package/src/components/link-to-route.spec.tsx +25 -21
  133. package/src/components/link-to-route.tsx +4 -2
  134. package/src/components/nested-route-link.spec.tsx +303 -0
  135. package/src/components/nested-route-link.tsx +100 -0
  136. package/src/components/nested-route-types.ts +42 -0
  137. package/src/components/nested-router.spec.tsx +918 -0
  138. package/src/components/nested-router.tsx +260 -0
  139. package/src/components/route-link.spec.tsx +22 -18
  140. package/src/components/route-link.tsx +6 -5
  141. package/src/components/router.spec.tsx +196 -108
  142. package/src/components/router.tsx +21 -8
  143. package/src/initialize.ts +12 -0
  144. package/src/jsx.ts +129 -2
  145. package/src/models/children-list.ts +7 -1
  146. package/src/models/partial-element.ts +13 -2
  147. package/src/models/render-options.ts +90 -3
  148. package/src/models/selection-state.ts +4 -0
  149. package/src/services/location-service.tsx +11 -0
  150. package/src/services/resource-manager.spec.ts +128 -0
  151. package/src/services/resource-manager.ts +36 -1
  152. package/src/services/screen-service.spec.ts +109 -7
  153. package/src/services/screen-service.ts +81 -4
  154. package/src/shade-component.ts +72 -6
  155. package/src/shade-host-props-ref.integration.spec.tsx +460 -0
  156. package/src/shade-resources.integration.spec.tsx +276 -52
  157. package/src/shade.spec.tsx +40 -39
  158. package/src/shade.ts +186 -58
  159. package/src/shades.integration.spec.tsx +154 -80
  160. package/src/style-manager.ts +2 -2
  161. package/src/svg-types.ts +437 -0
  162. package/src/svg.spec.ts +89 -0
  163. package/src/svg.ts +78 -0
  164. package/src/vnode.integration.spec.tsx +657 -0
  165. package/src/vnode.spec.ts +579 -0
  166. package/src/vnode.ts +508 -0
@@ -0,0 +1,473 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { SVG_NS } from './svg.js';
3
+ import { createVNode, EXISTING_NODE, flattenVChildren, FRAGMENT, isVNode, isVTextNode, mountChild, patchChildren, patchProps, shallowEqual, toVChildArray, unmountChild, } from './vnode.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Helpers
6
+ // ---------------------------------------------------------------------------
7
+ const vtext = (text) => ({ _brand: 'vtext', text });
8
+ const vel = (tag, props, ...children) => ({
9
+ _brand: 'vnode',
10
+ type: tag,
11
+ props,
12
+ children,
13
+ });
14
+ // ---------------------------------------------------------------------------
15
+ // Tests
16
+ // ---------------------------------------------------------------------------
17
+ describe('vnode', () => {
18
+ describe('createVNode', () => {
19
+ it('should create an intrinsic element VNode', () => {
20
+ const vnode = createVNode('div', { id: 'test' }, 'hello');
21
+ expect(vnode._brand).toBe('vnode');
22
+ expect(vnode.type).toBe('div');
23
+ expect(vnode.props).toEqual({ id: 'test' });
24
+ expect(vnode.children).toHaveLength(1);
25
+ expect(vnode.children[0]).toEqual({ _brand: 'vtext', text: 'hello' });
26
+ });
27
+ it('should create a fragment VNode', () => {
28
+ const child = createVNode('p', null, 'text');
29
+ const vnode = createVNode(null, null, child);
30
+ expect(vnode.type).toBe(FRAGMENT);
31
+ expect(vnode.children).toEqual([child]);
32
+ });
33
+ it('should flatten nested arrays', () => {
34
+ const vnode = createVNode('ul', null, [createVNode('li', null, 'a'), createVNode('li', null, 'b')]);
35
+ expect(vnode.children).toHaveLength(2);
36
+ });
37
+ it('should skip null and boolean children', () => {
38
+ const vnode = createVNode('div', null, null, false, true, undefined, 'kept');
39
+ expect(vnode.children).toHaveLength(1);
40
+ expect(vnode.children[0].text).toBe('kept');
41
+ });
42
+ it('should inline fragment children', () => {
43
+ const fragment = createVNode(null, null, 'a', 'b');
44
+ const vnode = createVNode('div', null, fragment);
45
+ expect(vnode.children).toHaveLength(2);
46
+ expect(vnode.children[0].text).toBe('a');
47
+ expect(vnode.children[1].text).toBe('b');
48
+ });
49
+ it('should convert numbers to text nodes', () => {
50
+ const vnode = createVNode('span', null, 42);
51
+ expect(vnode.children).toHaveLength(1);
52
+ expect(vnode.children[0].text).toBe('42');
53
+ });
54
+ });
55
+ describe('flattenVChildren', () => {
56
+ it('should wrap real DOM nodes as EXISTING_NODE VNodes', () => {
57
+ const div = document.createElement('div');
58
+ const result = flattenVChildren([div]);
59
+ expect(result).toHaveLength(1);
60
+ expect(isVNode(result[0])).toBe(true);
61
+ expect(result[0].type).toBe(EXISTING_NODE);
62
+ expect(result[0]._el).toBe(div);
63
+ });
64
+ });
65
+ describe('type guards', () => {
66
+ it('isVNode should identify VNodes', () => {
67
+ expect(isVNode(createVNode('div', null))).toBe(true);
68
+ expect(isVNode({ _brand: 'vtext', text: 'hello' })).toBe(false);
69
+ expect(isVNode(null)).toBe(false);
70
+ expect(isVNode('string')).toBe(false);
71
+ });
72
+ it('isVTextNode should identify VTextNodes', () => {
73
+ expect(isVTextNode({ _brand: 'vtext', text: 'hi' })).toBe(true);
74
+ expect(isVTextNode(createVNode('div', null))).toBe(false);
75
+ });
76
+ });
77
+ describe('shallowEqual', () => {
78
+ it('should return true for identical references', () => {
79
+ const obj = { a: 1 };
80
+ expect(shallowEqual(obj, obj)).toBe(true);
81
+ });
82
+ it('should return true for equal props', () => {
83
+ expect(shallowEqual({ a: 1, b: 'x' }, { a: 1, b: 'x' })).toBe(true);
84
+ });
85
+ it('should return false for different values', () => {
86
+ expect(shallowEqual({ a: 1 }, { a: 2 })).toBe(false);
87
+ });
88
+ it('should return false for different key counts', () => {
89
+ expect(shallowEqual({ a: 1 }, { a: 1, b: 2 })).toBe(false);
90
+ });
91
+ it('should handle null comparisons', () => {
92
+ expect(shallowEqual(null, null)).toBe(true);
93
+ expect(shallowEqual(null, {})).toBe(false);
94
+ expect(shallowEqual({}, null)).toBe(false);
95
+ });
96
+ });
97
+ describe('toVChildArray', () => {
98
+ it('should return empty array for null', () => {
99
+ expect(toVChildArray(null)).toEqual([]);
100
+ });
101
+ it('should wrap string as VTextNode', () => {
102
+ const result = toVChildArray('hello');
103
+ expect(result).toHaveLength(1);
104
+ expect(isVTextNode(result[0])).toBe(true);
105
+ });
106
+ it('should unwrap fragment VNode children', () => {
107
+ const fragment = createVNode(null, null, createVNode('p', null, 'a'), createVNode('p', null, 'b'));
108
+ const result = toVChildArray(fragment);
109
+ expect(result).toHaveLength(2);
110
+ });
111
+ it('should wrap single VNode in array', () => {
112
+ const vnode = createVNode('div', null, 'text');
113
+ const result = toVChildArray(vnode);
114
+ expect(result).toEqual([vnode]);
115
+ });
116
+ it('should wrap real DOM element as EXISTING_NODE', () => {
117
+ const el = document.createElement('div');
118
+ const result = toVChildArray(el);
119
+ expect(result).toHaveLength(1);
120
+ expect(result[0].type).toBe(EXISTING_NODE);
121
+ expect(result[0]._el).toBe(el);
122
+ });
123
+ it('should wrap DocumentFragment children as EXISTING_NODE VNodes', () => {
124
+ const fragment = document.createDocumentFragment();
125
+ fragment.appendChild(document.createElement('span'));
126
+ fragment.appendChild(document.createTextNode('text'));
127
+ const result = toVChildArray(fragment);
128
+ expect(result).toHaveLength(2);
129
+ expect(result[0].type).toBe(EXISTING_NODE);
130
+ expect(result[0]._el).toBeInstanceOf(HTMLSpanElement);
131
+ expect(result[1].type).toBe(EXISTING_NODE);
132
+ expect(result[1]._el).toBeInstanceOf(Text);
133
+ });
134
+ it('should convert number to VTextNode', () => {
135
+ const result = toVChildArray(42);
136
+ expect(result).toHaveLength(1);
137
+ expect(isVTextNode(result[0])).toBe(true);
138
+ expect(result[0].text).toBe('42');
139
+ });
140
+ it('should return empty array for undefined', () => {
141
+ expect(toVChildArray(undefined)).toEqual([]);
142
+ });
143
+ });
144
+ describe('mountChild', () => {
145
+ it('should mount a text node', () => {
146
+ const parent = document.createElement('div');
147
+ mountChild(vtext('hello'), parent);
148
+ expect(parent.textContent).toBe('hello');
149
+ });
150
+ it('should mount an intrinsic element with props', () => {
151
+ const parent = document.createElement('div');
152
+ const child = vel('span', { id: 'test', className: 'cls' }, vtext('content'));
153
+ mountChild(child, parent);
154
+ const span = parent.querySelector('span');
155
+ expect(span.id).toBe('test');
156
+ expect(span.className).toBe('cls');
157
+ expect(span.textContent).toBe('content');
158
+ expect(child._el).toBe(span);
159
+ });
160
+ it('should mount nested children', () => {
161
+ const parent = document.createElement('div');
162
+ const child = vel('ul', null, vel('li', null, vtext('a')), vel('li', null, vtext('b')));
163
+ mountChild(child, parent);
164
+ expect(parent.innerHTML).toBe('<ul><li>a</li><li>b</li></ul>');
165
+ });
166
+ it('should mount an EXISTING_NODE by appending the real element', () => {
167
+ const parent = document.createElement('div');
168
+ const existing = document.createElement('span');
169
+ existing.textContent = 'existing';
170
+ const child = { _brand: 'vnode', type: EXISTING_NODE, props: null, children: [], _el: existing };
171
+ mountChild(child, parent);
172
+ expect(parent.firstChild).toBe(existing);
173
+ });
174
+ it('should set _el on text nodes', () => {
175
+ const parent = document.createElement('div');
176
+ const child = vtext('hi');
177
+ mountChild(child, parent);
178
+ expect(child._el).toBeInstanceOf(Text);
179
+ expect(child._el?.textContent).toBe('hi');
180
+ });
181
+ it('should create SVG elements with createElementNS', () => {
182
+ const parent = document.createElement('div');
183
+ const child = vel('svg', { viewBox: '0 0 100 100' }, vel('circle', { cx: '50', cy: '50', r: '40' }));
184
+ mountChild(child, parent);
185
+ const svg = parent.querySelector('svg');
186
+ expect(svg).toBeInstanceOf(SVGElement);
187
+ expect(svg?.namespaceURI).toBe(SVG_NS);
188
+ expect(svg?.getAttribute('viewBox')).toBe('0 0 100 100');
189
+ const circle = svg?.querySelector('circle');
190
+ expect(circle).toBeInstanceOf(SVGElement);
191
+ expect(circle?.namespaceURI).toBe(SVG_NS);
192
+ expect(circle?.getAttribute('cx')).toBe('50');
193
+ });
194
+ it('should set className as class attribute on SVG elements', () => {
195
+ const parent = document.createElement('div');
196
+ const child = vel('g', { className: 'my-group' });
197
+ mountChild(child, parent);
198
+ const g = parent.querySelector('g');
199
+ expect(g?.getAttribute('class')).toBe('my-group');
200
+ });
201
+ it('should attach event handlers as properties on SVG elements', () => {
202
+ const parent = document.createElement('div');
203
+ const handler = vi.fn();
204
+ const child = vel('rect', { onclick: handler });
205
+ mountChild(child, parent);
206
+ const rect = parent.querySelector('rect');
207
+ expect(rect.onclick).toBe(handler);
208
+ });
209
+ it('should handle SVG elements with style props', () => {
210
+ const parent = document.createElement('div');
211
+ const child = vel('rect', { style: { fill: 'red', strokeWidth: '2px' } });
212
+ mountChild(child, parent);
213
+ const rect = parent.querySelector('rect');
214
+ expect(rect.style.fill).toBe('red');
215
+ expect(rect.style.strokeWidth).toBe('2px');
216
+ });
217
+ it('should not mount EXISTING_NODE when _el is undefined', () => {
218
+ const parent = document.createElement('div');
219
+ const child = { _brand: 'vnode', type: EXISTING_NODE, props: null, children: [] };
220
+ const result = mountChild(child, parent);
221
+ expect(result).toBeUndefined();
222
+ expect(parent.childNodes.length).toBe(0);
223
+ });
224
+ it('should set ref on mounted intrinsic elements', () => {
225
+ const parent = document.createElement('div');
226
+ const ref = { current: null };
227
+ const child = vel('input', { ref });
228
+ mountChild(child, parent);
229
+ expect(ref.current).toBeInstanceOf(HTMLInputElement);
230
+ expect(ref.current).toBe(parent.querySelector('input'));
231
+ });
232
+ });
233
+ describe('unmountChild', () => {
234
+ it('should remove a mounted element from the DOM', () => {
235
+ const parent = document.createElement('div');
236
+ const child = vel('span', null, vtext('bye'));
237
+ mountChild(child, parent);
238
+ expect(parent.children.length).toBe(1);
239
+ unmountChild(child);
240
+ expect(parent.children.length).toBe(0);
241
+ });
242
+ it('should remove a mounted text node from the DOM', () => {
243
+ const parent = document.createElement('div');
244
+ const child = vtext('bye');
245
+ mountChild(child, parent);
246
+ expect(parent.childNodes.length).toBe(1);
247
+ unmountChild(child);
248
+ expect(parent.childNodes.length).toBe(0);
249
+ });
250
+ });
251
+ describe('patchProps', () => {
252
+ it('should add new props', () => {
253
+ const el = document.createElement('div');
254
+ patchProps(el, null, { id: 'new' });
255
+ expect(el.id).toBe('new');
256
+ });
257
+ it('should update changed props', () => {
258
+ const el = document.createElement('div');
259
+ el.id = 'old';
260
+ patchProps(el, { id: 'old' }, { id: 'new' });
261
+ expect(el.id).toBe('new');
262
+ });
263
+ it('should remove stale event handlers', () => {
264
+ const el = document.createElement('div');
265
+ const handler = vi.fn();
266
+ el.onclick = handler;
267
+ patchProps(el, { onclick: handler }, {});
268
+ expect(el.onclick).toBeNull();
269
+ });
270
+ it('should update event handlers', () => {
271
+ const el = document.createElement('button');
272
+ const handler1 = vi.fn();
273
+ const handler2 = vi.fn();
274
+ patchProps(el, { onclick: handler1 }, { onclick: handler2 });
275
+ expect(el.onclick).toBe(handler2);
276
+ });
277
+ it('should patch styles', () => {
278
+ const el = document.createElement('div');
279
+ patchProps(el, { style: { color: 'red', fontSize: '14px' } }, { style: { color: 'blue' } });
280
+ expect(el.style.color).toBe('blue');
281
+ expect(el.style.fontSize).toBe('');
282
+ });
283
+ it('should set data attributes', () => {
284
+ const el = document.createElement('div');
285
+ patchProps(el, null, { 'data-testid': 'foo' });
286
+ expect(el.getAttribute('data-testid')).toBe('foo');
287
+ });
288
+ it('should remove data attributes', () => {
289
+ const el = document.createElement('div');
290
+ el.setAttribute('data-testid', 'foo');
291
+ patchProps(el, { 'data-testid': 'foo' }, {});
292
+ expect(el.hasAttribute('data-testid')).toBe(false);
293
+ });
294
+ describe('SVG elements', () => {
295
+ it('should set attributes via setAttribute on SVG elements', () => {
296
+ const el = document.createElementNS(SVG_NS, 'rect');
297
+ patchProps(el, null, { width: '100', height: '50', rx: '5' });
298
+ expect(el.getAttribute('width')).toBe('100');
299
+ expect(el.getAttribute('height')).toBe('50');
300
+ expect(el.getAttribute('rx')).toBe('5');
301
+ });
302
+ it('should set className as class attribute on SVG elements', () => {
303
+ const el = document.createElementNS(SVG_NS, 'g');
304
+ patchProps(el, null, { className: 'my-group' });
305
+ expect(el.getAttribute('class')).toBe('my-group');
306
+ });
307
+ it('should remove attributes from SVG elements', () => {
308
+ const el = document.createElementNS(SVG_NS, 'circle');
309
+ el.setAttribute('fill', 'red');
310
+ patchProps(el, { fill: 'red' }, {});
311
+ expect(el.hasAttribute('fill')).toBe(false);
312
+ });
313
+ it('should remove className as class from SVG elements', () => {
314
+ const el = document.createElementNS(SVG_NS, 'g');
315
+ el.setAttribute('class', 'old');
316
+ patchProps(el, { className: 'old' }, {});
317
+ expect(el.hasAttribute('class')).toBe(false);
318
+ });
319
+ it('should remove attributes when value is null/undefined/false on SVG elements', () => {
320
+ const el = document.createElementNS(SVG_NS, 'rect');
321
+ el.setAttribute('fill', 'red');
322
+ patchProps(el, { fill: 'red' }, { fill: null });
323
+ expect(el.hasAttribute('fill')).toBe(false);
324
+ });
325
+ it('should set event handlers as properties on SVG elements', () => {
326
+ const el = document.createElementNS(SVG_NS, 'rect');
327
+ const handler = vi.fn();
328
+ patchProps(el, null, { onclick: handler });
329
+ expect(el.onclick).toBe(handler);
330
+ });
331
+ });
332
+ });
333
+ describe('patchChildren', () => {
334
+ it('should mount all children when old is empty', () => {
335
+ const parent = document.createElement('div');
336
+ const newChildren = [vel('span', null, vtext('a')), vel('span', null, vtext('b'))];
337
+ patchChildren(parent, [], newChildren);
338
+ expect(parent.children.length).toBe(2);
339
+ expect(parent.children[0].textContent).toBe('a');
340
+ expect(parent.children[1].textContent).toBe('b');
341
+ });
342
+ it('should remove all children when new is empty', () => {
343
+ const parent = document.createElement('div');
344
+ const oldChildren = [vel('span', null, vtext('a'))];
345
+ patchChildren(parent, [], oldChildren); // mount first
346
+ patchChildren(parent, oldChildren, []);
347
+ expect(parent.children.length).toBe(0);
348
+ });
349
+ it('should patch matching text nodes', () => {
350
+ const parent = document.createElement('div');
351
+ const old = [vtext('old')];
352
+ patchChildren(parent, [], old);
353
+ const textNode = parent.firstChild;
354
+ const updated = [vtext('new')];
355
+ patchChildren(parent, old, updated);
356
+ expect(parent.firstChild).toBe(textNode);
357
+ expect(parent.textContent).toBe('new');
358
+ });
359
+ it('should patch matching intrinsic elements in place', () => {
360
+ const parent = document.createElement('div');
361
+ const old = [vel('span', { id: 'a' }, vtext('old'))];
362
+ patchChildren(parent, [], old);
363
+ const span = parent.querySelector('span');
364
+ const updated = [vel('span', { id: 'b' }, vtext('new'))];
365
+ patchChildren(parent, old, updated);
366
+ expect(parent.querySelector('span')).toBe(span);
367
+ expect(span.id).toBe('b');
368
+ expect(span.textContent).toBe('new');
369
+ });
370
+ it('should replace when types differ', () => {
371
+ const parent = document.createElement('div');
372
+ const old = [vel('div', null, vtext('div'))];
373
+ patchChildren(parent, [], old);
374
+ const updated = [vel('span', null, vtext('span'))];
375
+ patchChildren(parent, old, updated);
376
+ expect(parent.children[0].tagName).toBe('SPAN');
377
+ expect(parent.textContent).toBe('span');
378
+ });
379
+ it('should add excess new children', () => {
380
+ const parent = document.createElement('div');
381
+ const old = [vel('p', null, vtext('a'))];
382
+ patchChildren(parent, [], old);
383
+ const updated = [vel('p', null, vtext('a')), vel('p', null, vtext('b'))];
384
+ patchChildren(parent, old, updated);
385
+ expect(parent.children.length).toBe(2);
386
+ });
387
+ it('should remove excess old children', () => {
388
+ const parent = document.createElement('div');
389
+ const old = [vel('p', null, vtext('a')), vel('p', null, vtext('b'))];
390
+ patchChildren(parent, [], old);
391
+ const updated = [vel('p', null, vtext('only'))];
392
+ patchChildren(parent, old, updated);
393
+ expect(parent.children.length).toBe(1);
394
+ expect(parent.textContent).toBe('only');
395
+ });
396
+ it('should preserve element identity across patches', () => {
397
+ const parent = document.createElement('div');
398
+ const old = [vel('input', { type: 'text' })];
399
+ patchChildren(parent, [], old);
400
+ const input = parent.querySelector('input');
401
+ const updated = [vel('input', { type: 'text', id: 'updated' })];
402
+ patchChildren(parent, old, updated);
403
+ expect(parent.querySelector('input')).toBe(input);
404
+ expect(input.id).toBe('updated');
405
+ });
406
+ it('should handle EXISTING_NODE patching (same reference)', () => {
407
+ const parent = document.createElement('div');
408
+ const real = document.createElement('span');
409
+ real.textContent = 'real';
410
+ const old = [{ _brand: 'vnode', type: EXISTING_NODE, props: null, children: [], _el: real }];
411
+ patchChildren(parent, [], old);
412
+ expect(parent.firstChild).toBe(real);
413
+ const updated = [{ _brand: 'vnode', type: EXISTING_NODE, props: null, children: [], _el: real }];
414
+ patchChildren(parent, old, updated);
415
+ expect(parent.firstChild).toBe(real);
416
+ });
417
+ it('should mount new child into parent when types differ and old node is detached', () => {
418
+ const parent = document.createElement('div');
419
+ const old = [vel('div', null, vtext('div'))];
420
+ patchChildren(parent, [], old);
421
+ // Detach old node manually to simulate a detached state
422
+ const oldNode = old[0]._el;
423
+ oldNode.parentNode.removeChild(oldNode);
424
+ const updated = [vel('span', null, vtext('span'))];
425
+ patchChildren(parent, old, updated);
426
+ expect(parent.children.length).toBe(1);
427
+ expect(parent.children[0].tagName).toBe('SPAN');
428
+ });
429
+ it('should clear ref on unmount', () => {
430
+ const parent = document.createElement('div');
431
+ const ref = { current: null };
432
+ const child = vel('input', { ref });
433
+ patchChildren(parent, [], [child]);
434
+ expect(ref.current).toBeInstanceOf(HTMLInputElement);
435
+ patchChildren(parent, [child], []);
436
+ expect(ref.current).toBeNull();
437
+ });
438
+ describe('Shade component boundaries', () => {
439
+ it('should call updateComponent on child Shade when props change', () => {
440
+ const parent = document.createElement('div');
441
+ const fakeShadeEl = document.createElement('my-shade');
442
+ const updateFn = vi.fn();
443
+ fakeShadeEl.updateComponent = updateFn;
444
+ fakeShadeEl.props = { count: 1 };
445
+ fakeShadeEl.shadeChildren = undefined;
446
+ const factory = vi.fn(() => fakeShadeEl);
447
+ const old = [{ _brand: 'vnode', type: factory, props: { count: 1 }, children: [], _el: fakeShadeEl }];
448
+ // Simulate initial mount by manually appending
449
+ parent.appendChild(fakeShadeEl);
450
+ const updated = [{ _brand: 'vnode', type: factory, props: { count: 2 }, children: [] }];
451
+ patchChildren(parent, old, updated);
452
+ expect(updateFn).toHaveBeenCalledOnce();
453
+ expect(fakeShadeEl.props).toEqual({ count: 2 });
454
+ });
455
+ it('should NOT call updateComponent when props are unchanged', () => {
456
+ const parent = document.createElement('div');
457
+ const fakeShadeEl = document.createElement('my-shade-2');
458
+ const updateFn = vi.fn();
459
+ const props = { count: 1 };
460
+ fakeShadeEl.updateComponent = updateFn;
461
+ fakeShadeEl.props = props;
462
+ fakeShadeEl.shadeChildren = undefined;
463
+ const factory = vi.fn(() => fakeShadeEl);
464
+ const old = [{ _brand: 'vnode', type: factory, props: { count: 1 }, children: [], _el: fakeShadeEl }];
465
+ parent.appendChild(fakeShadeEl);
466
+ const updated = [{ _brand: 'vnode', type: factory, props: { count: 1 }, children: [] }];
467
+ patchChildren(parent, old, updated);
468
+ expect(updateFn).not.toHaveBeenCalled();
469
+ });
470
+ });
471
+ });
472
+ });
473
+ //# sourceMappingURL=vnode.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vnode.spec.js","sourceRoot":"","sources":["../src/vnode.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@furystack/shades",
3
- "version": "11.1.0",
3
+ "version": "12.0.1",
4
4
  "description": "A lightweight UI framework for FuryStack with JSX support",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -40,17 +40,16 @@
40
40
  "homepage": "https://github.com/furystack/furystack",
41
41
  "devDependencies": {
42
42
  "@types/jsdom": "^27.0.0",
43
- "@types/node": "^25.0.10",
44
- "jsdom": "^27.4.0",
43
+ "@types/node": "^25.2.3",
44
+ "jsdom": "^28.0.0",
45
45
  "typescript": "^5.9.3",
46
- "vitest": "^4.0.17"
46
+ "vitest": "^4.0.18"
47
47
  },
48
48
  "dependencies": {
49
- "@furystack/inject": "^12.0.28",
50
- "@furystack/rest": "^8.0.34",
51
- "@furystack/utils": "^8.1.9",
52
- "path-to-regexp": "^8.3.0",
53
- "semaphore-async-await": "^1.5.1"
49
+ "@furystack/inject": "^12.0.30",
50
+ "@furystack/rest": "^8.0.36",
51
+ "@furystack/utils": "^8.1.10",
52
+ "path-to-regexp": "^8.3.0"
54
53
  },
55
54
  "engines": {
56
55
  "node": ">=22.0.0"
@@ -2,7 +2,7 @@ import { Injector } from '@furystack/inject'
2
2
  import { describe, expect, it, vi } from 'vitest'
3
3
  import './jsx'
4
4
  import { createComponent } from './shade-component.js'
5
- import { Shade } from './shade.js'
5
+ import { flushUpdates, Shade } from './shade.js'
6
6
 
7
7
  describe('Shades Component Factory', () => {
8
8
  describe('HTML Elements', () => {
@@ -25,6 +25,17 @@ describe('Shades Component Factory', () => {
25
25
  expect(component.getAttribute('data-testid')).toBe('asd-123')
26
26
  })
27
27
 
28
+ it('Should apply aria attributes', () => {
29
+ const component = (
30
+ <div aria-label="My label" aria-hidden="true">
31
+ a
32
+ </div>
33
+ )
34
+ expect(component).toBeInstanceOf(HTMLDivElement)
35
+ expect(component.getAttribute('aria-label')).toBe('My label')
36
+ expect(component.getAttribute('aria-hidden')).toBe('true')
37
+ })
38
+
28
39
  it('Should create a nested component', () => {
29
40
  const component = (
30
41
  <div style={{ display: 'flex' }}>
@@ -64,7 +75,7 @@ describe('Shades Component Factory', () => {
64
75
  expect(shade.shadeChildren).toEqual([])
65
76
  })
66
77
 
67
- it('Should render a component with props', () => {
78
+ it('Should render a component with props', async () => {
68
79
  const Example = Shade<{ foo: string; injector: Injector }>({
69
80
  shadowDomName: 'example-with-props',
70
81
  render: ({ props }) => <div>{props.foo}</div>,
@@ -78,7 +89,8 @@ describe('Shades Component Factory', () => {
78
89
 
79
90
  const shade = component.firstElementChild as JSX.Element<{ foo: string }>
80
91
 
81
- shade.callConstructed()
92
+ shade.updateComponent()
93
+ await flushUpdates()
82
94
 
83
95
  expect(shade.props.foo).toEqual('example')
84
96
  expect(shade.shadeChildren).toEqual([])
@@ -86,7 +98,7 @@ describe('Shades Component Factory', () => {
86
98
  expect(shade.innerHTML).toBe('<div>example</div>')
87
99
  })
88
100
 
89
- it('Should render a component with state', () => {
101
+ it('Should render a component with state', async () => {
90
102
  const Example = Shade({
91
103
  shadowDomName: 'example-with-state',
92
104
  render: ({ useState }) => {
@@ -102,7 +114,8 @@ describe('Shades Component Factory', () => {
102
114
  )
103
115
 
104
116
  const shade = component.firstElementChild as JSX.Element
105
- shade.callConstructed()
117
+ shade.updateComponent()
118
+ await flushUpdates()
106
119
  expect(shade.resourceManager.stateObservers.get('foo')?.getValue()).toEqual('example')
107
120
  expect(shade.shadeChildren).toEqual([])
108
121
  })
@@ -1,4 +1,7 @@
1
1
  export * from './lazy-load.js'
2
2
  export * from './link-to-route.js'
3
- export * from './router.js'
3
+ export * from './nested-route-link.js'
4
+ export * from './nested-route-types.js'
5
+ export * from './nested-router.js'
4
6
  export * from './route-link.js'
7
+ export * from './router.js'