@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.
- package/CHANGELOG.md +312 -0
- package/README.md +13 -13
- package/esm/component-factory.spec.js +13 -5
- package/esm/component-factory.spec.js.map +1 -1
- package/esm/components/index.d.ts +4 -1
- package/esm/components/index.d.ts.map +1 -1
- package/esm/components/index.js +4 -1
- package/esm/components/index.js.map +1 -1
- package/esm/components/lazy-load.d.ts +2 -4
- package/esm/components/lazy-load.d.ts.map +1 -1
- package/esm/components/lazy-load.js +40 -24
- package/esm/components/lazy-load.js.map +1 -1
- package/esm/components/lazy-load.spec.js +57 -50
- package/esm/components/lazy-load.spec.js.map +1 -1
- package/esm/components/link-to-route.d.ts +2 -0
- package/esm/components/link-to-route.d.ts.map +1 -1
- package/esm/components/link-to-route.js +3 -2
- package/esm/components/link-to-route.js.map +1 -1
- package/esm/components/link-to-route.spec.js +13 -9
- package/esm/components/link-to-route.spec.js.map +1 -1
- package/esm/components/nested-route-link.d.ts +62 -0
- package/esm/components/nested-route-link.d.ts.map +1 -0
- package/esm/components/nested-route-link.js +66 -0
- package/esm/components/nested-route-link.js.map +1 -0
- package/esm/components/nested-route-link.spec.d.ts +2 -0
- package/esm/components/nested-route-link.spec.d.ts.map +1 -0
- package/esm/components/nested-route-link.spec.js +179 -0
- package/esm/components/nested-route-link.spec.js.map +1 -0
- package/esm/components/nested-route-types.d.ts +37 -0
- package/esm/components/nested-route-types.d.ts.map +1 -0
- package/esm/components/nested-route-types.js +2 -0
- package/esm/components/nested-route-types.js.map +1 -0
- package/esm/components/nested-router.d.ts +103 -0
- package/esm/components/nested-router.d.ts.map +1 -0
- package/esm/components/nested-router.js +183 -0
- package/esm/components/nested-router.js.map +1 -0
- package/esm/components/nested-router.spec.d.ts +2 -0
- package/esm/components/nested-router.spec.d.ts.map +1 -0
- package/esm/components/nested-router.spec.js +737 -0
- package/esm/components/nested-router.spec.js.map +1 -0
- package/esm/components/route-link.d.ts +4 -0
- package/esm/components/route-link.d.ts.map +1 -1
- package/esm/components/route-link.js +5 -5
- package/esm/components/route-link.js.map +1 -1
- package/esm/components/route-link.spec.js +16 -12
- package/esm/components/route-link.spec.js.map +1 -1
- package/esm/components/router.d.ts +20 -2
- package/esm/components/router.d.ts.map +1 -1
- package/esm/components/router.js +12 -7
- package/esm/components/router.js.map +1 -1
- package/esm/components/router.spec.js +141 -74
- package/esm/components/router.spec.js.map +1 -1
- package/esm/initialize.d.ts +11 -0
- package/esm/initialize.d.ts.map +1 -1
- package/esm/initialize.js +5 -0
- package/esm/initialize.js.map +1 -1
- package/esm/jsx.d.ts +83 -2
- package/esm/jsx.d.ts.map +1 -1
- package/esm/models/children-list.d.ts +5 -1
- package/esm/models/children-list.d.ts.map +1 -1
- package/esm/models/partial-element.d.ts +12 -2
- package/esm/models/partial-element.d.ts.map +1 -1
- package/esm/models/render-options.d.ts +89 -3
- package/esm/models/render-options.d.ts.map +1 -1
- package/esm/models/selection-state.d.ts +4 -0
- package/esm/models/selection-state.d.ts.map +1 -1
- package/esm/services/location-service.d.ts +11 -0
- package/esm/services/location-service.d.ts.map +1 -1
- package/esm/services/location-service.js +11 -0
- package/esm/services/location-service.js.map +1 -1
- package/esm/services/resource-manager.d.ts +24 -0
- package/esm/services/resource-manager.d.ts.map +1 -1
- package/esm/services/resource-manager.js +36 -1
- package/esm/services/resource-manager.js.map +1 -1
- package/esm/services/resource-manager.spec.js +102 -0
- package/esm/services/resource-manager.spec.js.map +1 -1
- package/esm/services/screen-service.d.ts +81 -4
- package/esm/services/screen-service.d.ts.map +1 -1
- package/esm/services/screen-service.js +75 -4
- package/esm/services/screen-service.js.map +1 -1
- package/esm/services/screen-service.spec.js +91 -7
- package/esm/services/screen-service.spec.js.map +1 -1
- package/esm/shade-component.d.ts +17 -4
- package/esm/shade-component.d.ts.map +1 -1
- package/esm/shade-component.js +67 -5
- package/esm/shade-component.js.map +1 -1
- package/esm/shade-host-props-ref.integration.spec.d.ts +2 -0
- package/esm/shade-host-props-ref.integration.spec.d.ts.map +1 -0
- package/esm/shade-host-props-ref.integration.spec.js +381 -0
- package/esm/shade-host-props-ref.integration.spec.js.map +1 -0
- package/esm/shade-resources.integration.spec.js +208 -39
- package/esm/shade-resources.integration.spec.js.map +1 -1
- package/esm/shade.d.ts +20 -17
- package/esm/shade.d.ts.map +1 -1
- package/esm/shade.js +172 -33
- package/esm/shade.js.map +1 -1
- package/esm/shade.spec.js +31 -30
- package/esm/shade.spec.js.map +1 -1
- package/esm/shades.integration.spec.js +135 -72
- package/esm/shades.integration.spec.js.map +1 -1
- package/esm/style-manager.d.ts +2 -2
- package/esm/style-manager.js +2 -2
- package/esm/svg-types.d.ts +389 -0
- package/esm/svg-types.d.ts.map +1 -0
- package/esm/svg-types.js +9 -0
- package/esm/svg-types.js.map +1 -0
- package/esm/svg.d.ts +15 -0
- package/esm/svg.d.ts.map +1 -0
- package/esm/svg.js +76 -0
- package/esm/svg.js.map +1 -0
- package/esm/svg.spec.d.ts +2 -0
- package/esm/svg.spec.d.ts.map +1 -0
- package/esm/svg.spec.js +80 -0
- package/esm/svg.spec.js.map +1 -0
- package/esm/vnode.d.ts +103 -0
- package/esm/vnode.d.ts.map +1 -0
- package/esm/vnode.integration.spec.d.ts +2 -0
- package/esm/vnode.integration.spec.d.ts.map +1 -0
- package/esm/vnode.integration.spec.js +494 -0
- package/esm/vnode.integration.spec.js.map +1 -0
- package/esm/vnode.js +453 -0
- package/esm/vnode.js.map +1 -0
- package/esm/vnode.spec.d.ts +2 -0
- package/esm/vnode.spec.d.ts.map +1 -0
- package/esm/vnode.spec.js +473 -0
- package/esm/vnode.spec.js.map +1 -0
- package/package.json +8 -9
- package/src/component-factory.spec.tsx +18 -5
- package/src/components/index.ts +4 -1
- package/src/components/lazy-load.spec.tsx +82 -75
- package/src/components/lazy-load.tsx +49 -27
- package/src/components/link-to-route.spec.tsx +25 -21
- package/src/components/link-to-route.tsx +4 -2
- package/src/components/nested-route-link.spec.tsx +303 -0
- package/src/components/nested-route-link.tsx +100 -0
- package/src/components/nested-route-types.ts +42 -0
- package/src/components/nested-router.spec.tsx +918 -0
- package/src/components/nested-router.tsx +260 -0
- package/src/components/route-link.spec.tsx +22 -18
- package/src/components/route-link.tsx +6 -5
- package/src/components/router.spec.tsx +196 -108
- package/src/components/router.tsx +21 -8
- package/src/initialize.ts +12 -0
- package/src/jsx.ts +129 -2
- package/src/models/children-list.ts +7 -1
- package/src/models/partial-element.ts +13 -2
- package/src/models/render-options.ts +90 -3
- package/src/models/selection-state.ts +4 -0
- package/src/services/location-service.tsx +11 -0
- package/src/services/resource-manager.spec.ts +128 -0
- package/src/services/resource-manager.ts +36 -1
- package/src/services/screen-service.spec.ts +109 -7
- package/src/services/screen-service.ts +81 -4
- package/src/shade-component.ts +72 -6
- package/src/shade-host-props-ref.integration.spec.tsx +460 -0
- package/src/shade-resources.integration.spec.tsx +276 -52
- package/src/shade.spec.tsx +40 -39
- package/src/shade.ts +186 -58
- package/src/shades.integration.spec.tsx +154 -80
- package/src/style-manager.ts +2 -2
- package/src/svg-types.ts +437 -0
- package/src/svg.spec.ts +89 -0
- package/src/svg.ts +78 -0
- package/src/vnode.integration.spec.tsx +657 -0
- package/src/vnode.spec.ts +579 -0
- 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": "
|
|
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.
|
|
44
|
-
"jsdom": "^
|
|
43
|
+
"@types/node": "^25.2.3",
|
|
44
|
+
"jsdom": "^28.0.0",
|
|
45
45
|
"typescript": "^5.9.3",
|
|
46
|
-
"vitest": "^4.0.
|
|
46
|
+
"vitest": "^4.0.18"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@furystack/inject": "^12.0.
|
|
50
|
-
"@furystack/rest": "^8.0.
|
|
51
|
-
"@furystack/utils": "^8.1.
|
|
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.
|
|
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.
|
|
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
|
})
|
package/src/components/index.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export * from './lazy-load.js'
|
|
2
2
|
export * from './link-to-route.js'
|
|
3
|
-
export * from './
|
|
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'
|