@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
package/esm/vnode.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VNode-based reconciliation for Shades.
|
|
3
|
+
*
|
|
4
|
+
* Instead of creating real DOM elements during each render and then diffing them,
|
|
5
|
+
* the JSX factory produces lightweight VNode descriptors. A reconciler diffs the
|
|
6
|
+
* previous VNode tree against the new one and applies surgical DOM updates using
|
|
7
|
+
* tracked `_el` references.
|
|
8
|
+
*/
|
|
9
|
+
declare const VNODE_BRAND: "vnode";
|
|
10
|
+
declare const VTEXT_BRAND: "vtext";
|
|
11
|
+
/**
|
|
12
|
+
* Sentinel type used as VNode.type for JSX fragments (`<>...</>`).
|
|
13
|
+
*/
|
|
14
|
+
export declare const FRAGMENT: unique symbol;
|
|
15
|
+
/**
|
|
16
|
+
* Sentinel type for VNodes that wrap a pre-existing real DOM node.
|
|
17
|
+
* Used when shadeChildren (created outside render mode) flow into a VNode render.
|
|
18
|
+
*/
|
|
19
|
+
export declare const EXISTING_NODE: unique symbol;
|
|
20
|
+
/**
|
|
21
|
+
* A lightweight descriptor for a DOM element or Shade component.
|
|
22
|
+
*/
|
|
23
|
+
export type VNode = {
|
|
24
|
+
_brand: typeof VNODE_BRAND;
|
|
25
|
+
type: string | ((...args: unknown[]) => unknown) | typeof FRAGMENT | typeof EXISTING_NODE;
|
|
26
|
+
props: Record<string, unknown> | null;
|
|
27
|
+
children: VChild[];
|
|
28
|
+
_el?: Node;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* A lightweight descriptor for a DOM text node.
|
|
32
|
+
*/
|
|
33
|
+
export type VTextNode = {
|
|
34
|
+
_brand: typeof VTEXT_BRAND;
|
|
35
|
+
text: string;
|
|
36
|
+
_el?: Text;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* A single child in a VNode tree -- either an element/component or a text node.
|
|
40
|
+
*/
|
|
41
|
+
export type VChild = VNode | VTextNode;
|
|
42
|
+
export declare const isVNode: (v: unknown) => v is VNode;
|
|
43
|
+
export declare const isVTextNode: (v: unknown) => v is VTextNode;
|
|
44
|
+
/**
|
|
45
|
+
* Recursively flattens raw JSX children into a flat VChild array.
|
|
46
|
+
* - Strings and numbers become VTextNodes.
|
|
47
|
+
* - Fragment VNodes are inlined (their children are spliced in).
|
|
48
|
+
* - Nullish / boolean values are skipped.
|
|
49
|
+
*/
|
|
50
|
+
export declare const flattenVChildren: (raw: unknown[]) => VChild[];
|
|
51
|
+
/**
|
|
52
|
+
* Creates a VNode descriptor. Used as the JSX factory during renders.
|
|
53
|
+
*
|
|
54
|
+
* For intrinsic elements (string type), the returned VNode includes DOM-shim
|
|
55
|
+
* methods (`setAttribute`, `appendChild`, etc.) so that component code which
|
|
56
|
+
* creates intermediate JSX and calls DOM methods on it continues to work.
|
|
57
|
+
*
|
|
58
|
+
* @param type Tag name, Shade factory function, or null (fragment)
|
|
59
|
+
* @param props Element props / component props
|
|
60
|
+
* @param rawChildren Varargs children (strings, VNodes, arrays, etc.)
|
|
61
|
+
*/
|
|
62
|
+
export declare const createVNode: (type: string | ((...args: unknown[]) => unknown) | null, props: Record<string, unknown> | null, ...rawChildren: unknown[]) => VNode;
|
|
63
|
+
/**
|
|
64
|
+
* Shallow-compares two props objects. Returns true if all keys and values match.
|
|
65
|
+
*/
|
|
66
|
+
export declare const shallowEqual: (a: Record<string, unknown> | null, b: Record<string, unknown> | null) => boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Converts a render result (VNode | HTMLElement | string | null) into a flat
|
|
69
|
+
* VChild array suitable for `patchChildren`.
|
|
70
|
+
*
|
|
71
|
+
* Real DOM elements can appear here when component state stores elements created
|
|
72
|
+
* outside renderMode (e.g. in async callbacks like Router's `updateUrl`).
|
|
73
|
+
*/
|
|
74
|
+
export declare const toVChildArray: (renderResult: unknown) => VChild[];
|
|
75
|
+
/**
|
|
76
|
+
* Diffs old and new props and applies minimal updates to a live DOM element.
|
|
77
|
+
*/
|
|
78
|
+
export declare const patchProps: (el: Element, oldProps: Record<string, unknown> | null, newProps: Record<string, unknown> | null) => void;
|
|
79
|
+
/**
|
|
80
|
+
* Creates real DOM nodes from a VChild and optionally appends to a parent.
|
|
81
|
+
* Sets `_el` on the VChild so subsequent patches can find the DOM node.
|
|
82
|
+
* @returns The created DOM node.
|
|
83
|
+
*/
|
|
84
|
+
export declare const mountChild: (child: VChild, parent: Node | null) => Node;
|
|
85
|
+
/**
|
|
86
|
+
* Removes the DOM node associated with a VChild from its parent.
|
|
87
|
+
*/
|
|
88
|
+
export declare const unmountChild: (child: VChild) => void;
|
|
89
|
+
/**
|
|
90
|
+
* Reconciles an array of old VChildren against new VChildren inside a parent
|
|
91
|
+
* DOM element. Patches matching pairs, removes excess old children, and
|
|
92
|
+
* mounts excess new children.
|
|
93
|
+
*
|
|
94
|
+
* **Note:** This uses positional (index-based) matching, not key-based
|
|
95
|
+
* reconciliation. Reordering list items will cause all children from the
|
|
96
|
+
* reorder point onward to be patched/replaced rather than moved. For
|
|
97
|
+
* dynamic lists where order changes frequently, wrap each item in its own
|
|
98
|
+
* Shade component so that the component boundary prevents unnecessary
|
|
99
|
+
* inner-DOM churn.
|
|
100
|
+
*/
|
|
101
|
+
export declare const patchChildren: (parentEl: Node, oldChildren: VChild[], newChildren: VChild[]) => void;
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=vnode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnode.d.ts","sourceRoot":"","sources":["../src/vnode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,QAAA,MAAM,WAAW,EAAG,OAAgB,CAAA;AACpC,QAAA,MAAM,WAAW,EAAG,OAAgB,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,MAA2B,CAAA;AAEzD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,MAAgC,CAAA;AAMnE;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,OAAO,WAAW,CAAA;IAC1B,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,GAAG,OAAO,QAAQ,GAAG,OAAO,aAAa,CAAA;IACzF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,IAAI,CAAA;CACX,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,OAAO,WAAW,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,IAAI,CAAA;CACX,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,SAAS,CAAA;AAMtC,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,KACkC,CAAA;AAE5E,eAAO,MAAM,WAAW,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,SACkC,CAAA;AAMhF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,OAAO,EAAE,KAAG,MAAM,EAyBvD,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,GAAG,IAAI,EACvD,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACrC,GAAG,aAAa,OAAO,EAAE,KACxB,KAuCF,CAAA;AAMD;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAAG,OAUnG,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,cAAc,OAAO,KAAG,MAAM,EAuB3D,CAAA;AAwFD;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,IAAI,OAAO,EACX,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACxC,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KACvC,IAmBF,CAAA;AAMD;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,EAAE,QAAQ,IAAI,GAAG,IAAI,KAAG,IA0C/D,CAAA;AAMD;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,IAU5C,CAAA;AAiFD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAI,UAAU,IAAI,EAAE,aAAa,MAAM,EAAE,EAAE,aAAa,MAAM,EAAE,KAAG,IAgB5F,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnode.integration.spec.d.ts","sourceRoot":"","sources":["../src/vnode.integration.spec.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import { Injector } from '@furystack/inject';
|
|
2
|
+
import { ObservableValue, usingAsync } from '@furystack/utils';
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { initializeShadeRoot } from './initialize.js';
|
|
5
|
+
import { createComponent } from './shade-component.js';
|
|
6
|
+
import { flushUpdates, Shade } from './shade.js';
|
|
7
|
+
describe('VNode reconciliation integration tests', () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
document.body.innerHTML = '<div id="root"></div>';
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
document.body.innerHTML = '';
|
|
13
|
+
});
|
|
14
|
+
describe('focus preservation', () => {
|
|
15
|
+
it('should preserve focus on an input element across re-renders', async () => {
|
|
16
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
17
|
+
const rootElement = document.getElementById('root');
|
|
18
|
+
const ExampleComponent = Shade({
|
|
19
|
+
shadowDomName: 'morph-focus-test',
|
|
20
|
+
render: ({ useState }) => {
|
|
21
|
+
const [label, setLabel] = useState('label', 'initial');
|
|
22
|
+
return (createComponent("div", null,
|
|
23
|
+
createComponent("label", null, label),
|
|
24
|
+
createComponent("input", { id: "my-input", type: "text" }),
|
|
25
|
+
createComponent("button", { id: "update-label", onclick: () => setLabel('updated') }, "Update")));
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
initializeShadeRoot({
|
|
29
|
+
injector,
|
|
30
|
+
rootElement,
|
|
31
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
32
|
+
});
|
|
33
|
+
await flushUpdates();
|
|
34
|
+
const input = document.getElementById('my-input');
|
|
35
|
+
input.focus();
|
|
36
|
+
expect(document.activeElement).toBe(input);
|
|
37
|
+
// Trigger a re-render by clicking the button
|
|
38
|
+
document.getElementById('update-label')?.click();
|
|
39
|
+
await flushUpdates();
|
|
40
|
+
// The label should have updated
|
|
41
|
+
expect(document.querySelector('label')?.textContent).toBe('updated');
|
|
42
|
+
// The same input element should still be in the DOM and focused
|
|
43
|
+
const inputAfter = document.getElementById('my-input');
|
|
44
|
+
expect(inputAfter).toBe(input);
|
|
45
|
+
expect(document.activeElement).toBe(input);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
it('should preserve focus on a textarea across re-renders', async () => {
|
|
49
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
50
|
+
const rootElement = document.getElementById('root');
|
|
51
|
+
const ExampleComponent = Shade({
|
|
52
|
+
shadowDomName: 'morph-focus-textarea-test',
|
|
53
|
+
render: ({ useState }) => {
|
|
54
|
+
const [count, setCount] = useState('count', 0);
|
|
55
|
+
return (createComponent("div", null,
|
|
56
|
+
createComponent("span", null,
|
|
57
|
+
"Count: ",
|
|
58
|
+
count),
|
|
59
|
+
createComponent("textarea", { id: "my-textarea" }),
|
|
60
|
+
createComponent("button", { id: "increment", onclick: () => setCount(count + 1) }, "+")));
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
initializeShadeRoot({
|
|
64
|
+
injector,
|
|
65
|
+
rootElement,
|
|
66
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
67
|
+
});
|
|
68
|
+
await flushUpdates();
|
|
69
|
+
const textarea = document.getElementById('my-textarea');
|
|
70
|
+
textarea.focus();
|
|
71
|
+
expect(document.activeElement).toBe(textarea);
|
|
72
|
+
document.getElementById('increment')?.click();
|
|
73
|
+
await flushUpdates();
|
|
74
|
+
expect(document.querySelector('span')?.textContent).toBe('Count: 1');
|
|
75
|
+
expect(document.getElementById('my-textarea')).toBe(textarea);
|
|
76
|
+
expect(document.activeElement).toBe(textarea);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('form value preservation', () => {
|
|
81
|
+
it('should preserve user-typed input value across re-renders when value is not controlled', async () => {
|
|
82
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
83
|
+
const rootElement = document.getElementById('root');
|
|
84
|
+
const ExampleComponent = Shade({
|
|
85
|
+
shadowDomName: 'morph-form-value-test',
|
|
86
|
+
render: ({ useState }) => {
|
|
87
|
+
const [title, setTitle] = useState('title', 'Title');
|
|
88
|
+
return (createComponent("div", null,
|
|
89
|
+
createComponent("h1", null, title),
|
|
90
|
+
createComponent("input", { id: "user-input", type: "text" }),
|
|
91
|
+
createComponent("button", { id: "change-title", onclick: () => setTitle('New Title') }, "Change")));
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
initializeShadeRoot({
|
|
95
|
+
injector,
|
|
96
|
+
rootElement,
|
|
97
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
98
|
+
});
|
|
99
|
+
await flushUpdates();
|
|
100
|
+
// Simulate user typing
|
|
101
|
+
const input = document.getElementById('user-input');
|
|
102
|
+
input.value = 'user typed this';
|
|
103
|
+
// Trigger re-render
|
|
104
|
+
document.getElementById('change-title')?.click();
|
|
105
|
+
await flushUpdates();
|
|
106
|
+
// Title should have changed
|
|
107
|
+
expect(document.querySelector('h1')?.textContent).toBe('New Title');
|
|
108
|
+
// Input value should be preserved (same element, value not in render props)
|
|
109
|
+
const inputAfter = document.getElementById('user-input');
|
|
110
|
+
expect(inputAfter).toBe(input);
|
|
111
|
+
expect(inputAfter.value).toBe('user typed this');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
it('should preserve checkbox checked state across re-renders', async () => {
|
|
115
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
116
|
+
const rootElement = document.getElementById('root');
|
|
117
|
+
const ExampleComponent = Shade({
|
|
118
|
+
shadowDomName: 'morph-checkbox-test',
|
|
119
|
+
render: ({ useState }) => {
|
|
120
|
+
const [count, setCount] = useState('count', 0);
|
|
121
|
+
return (createComponent("div", null,
|
|
122
|
+
createComponent("span", null,
|
|
123
|
+
"Count: ",
|
|
124
|
+
count),
|
|
125
|
+
createComponent("input", { id: "my-checkbox", type: "checkbox" }),
|
|
126
|
+
createComponent("button", { id: "increment", onclick: () => setCount(count + 1) }, "+")));
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
initializeShadeRoot({
|
|
130
|
+
injector,
|
|
131
|
+
rootElement,
|
|
132
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
133
|
+
});
|
|
134
|
+
await flushUpdates();
|
|
135
|
+
// User checks the checkbox
|
|
136
|
+
const checkbox = document.getElementById('my-checkbox');
|
|
137
|
+
checkbox.checked = true;
|
|
138
|
+
// Trigger re-render
|
|
139
|
+
document.getElementById('increment')?.click();
|
|
140
|
+
await flushUpdates();
|
|
141
|
+
expect(document.querySelector('span')?.textContent).toBe('Count: 1');
|
|
142
|
+
// Checkbox should still be checked
|
|
143
|
+
const checkboxAfter = document.getElementById('my-checkbox');
|
|
144
|
+
expect(checkboxAfter).toBe(checkbox);
|
|
145
|
+
expect(checkboxAfter.checked).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
it('should preserve select value across re-renders', async () => {
|
|
149
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
150
|
+
const rootElement = document.getElementById('root');
|
|
151
|
+
const ExampleComponent = Shade({
|
|
152
|
+
shadowDomName: 'morph-select-test',
|
|
153
|
+
render: ({ useState }) => {
|
|
154
|
+
const [label, setLabel] = useState('label', 'Pick one');
|
|
155
|
+
return (createComponent("div", null,
|
|
156
|
+
createComponent("label", null, label),
|
|
157
|
+
createComponent("select", { id: "my-select" },
|
|
158
|
+
createComponent("option", { value: "a" }, "A"),
|
|
159
|
+
createComponent("option", { value: "b" }, "B"),
|
|
160
|
+
createComponent("option", { value: "c" }, "C")),
|
|
161
|
+
createComponent("button", { id: "update-label", onclick: () => setLabel('Updated label') }, "Update")));
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
initializeShadeRoot({
|
|
165
|
+
injector,
|
|
166
|
+
rootElement,
|
|
167
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
168
|
+
});
|
|
169
|
+
await flushUpdates();
|
|
170
|
+
// User selects option B
|
|
171
|
+
const select = document.getElementById('my-select');
|
|
172
|
+
select.value = 'b';
|
|
173
|
+
// Trigger re-render
|
|
174
|
+
document.getElementById('update-label')?.click();
|
|
175
|
+
await flushUpdates();
|
|
176
|
+
expect(document.querySelector('label')?.textContent).toBe('Updated label');
|
|
177
|
+
// Select should still have value 'b'
|
|
178
|
+
const selectAfter = document.getElementById('my-select');
|
|
179
|
+
expect(selectAfter).toBe(select);
|
|
180
|
+
expect(selectAfter.value).toBe('b');
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe('element identity preservation', () => {
|
|
185
|
+
it('should preserve DOM element references across re-renders', async () => {
|
|
186
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
187
|
+
const rootElement = document.getElementById('root');
|
|
188
|
+
const ExampleComponent = Shade({
|
|
189
|
+
shadowDomName: 'morph-identity-test',
|
|
190
|
+
render: ({ useState }) => {
|
|
191
|
+
const [count, setCount] = useState('count', 0);
|
|
192
|
+
return (createComponent("div", { id: "container" },
|
|
193
|
+
createComponent("span", { id: "counter" },
|
|
194
|
+
"Count: ",
|
|
195
|
+
count),
|
|
196
|
+
createComponent("button", { id: "increment", onclick: () => setCount(count + 1) }, "+")));
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
initializeShadeRoot({
|
|
200
|
+
injector,
|
|
201
|
+
rootElement,
|
|
202
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
203
|
+
});
|
|
204
|
+
await flushUpdates();
|
|
205
|
+
const container = document.getElementById('container');
|
|
206
|
+
const counter = document.getElementById('counter');
|
|
207
|
+
const button = document.getElementById('increment');
|
|
208
|
+
// Trigger re-render
|
|
209
|
+
button?.click();
|
|
210
|
+
await flushUpdates();
|
|
211
|
+
// Same elements should be reused
|
|
212
|
+
expect(document.getElementById('container')).toBe(container);
|
|
213
|
+
expect(document.getElementById('counter')).toBe(counter);
|
|
214
|
+
expect(document.getElementById('increment')).toBe(button);
|
|
215
|
+
expect(counter?.textContent).toBe('Count: 1');
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
it('should replace element when tag changes between renders', async () => {
|
|
219
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
220
|
+
const rootElement = document.getElementById('root');
|
|
221
|
+
const ExampleComponent = Shade({
|
|
222
|
+
shadowDomName: 'morph-tag-change-test',
|
|
223
|
+
render: ({ useState }) => {
|
|
224
|
+
const [useDiv, setUseDiv] = useState('useDiv', true);
|
|
225
|
+
return useDiv ? (createComponent("div", { id: "content" },
|
|
226
|
+
createComponent("button", { id: "toggle", onclick: () => setUseDiv(false) }, "Toggle"))) : (createComponent("section", { id: "content" },
|
|
227
|
+
createComponent("button", { id: "toggle", onclick: () => setUseDiv(true) }, "Toggle")));
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
initializeShadeRoot({
|
|
231
|
+
injector,
|
|
232
|
+
rootElement,
|
|
233
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
234
|
+
});
|
|
235
|
+
await flushUpdates();
|
|
236
|
+
const oldContent = document.getElementById('content');
|
|
237
|
+
expect(oldContent?.tagName).toBe('DIV');
|
|
238
|
+
document.getElementById('toggle')?.click();
|
|
239
|
+
await flushUpdates();
|
|
240
|
+
const newContent = document.getElementById('content');
|
|
241
|
+
expect(newContent?.tagName).toBe('SECTION');
|
|
242
|
+
// Different tag means different element
|
|
243
|
+
expect(newContent).not.toBe(oldContent);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
describe('animation continuity', () => {
|
|
248
|
+
it('should preserve CSS class-based transitions by keeping element identity', async () => {
|
|
249
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
250
|
+
const rootElement = document.getElementById('root');
|
|
251
|
+
const ExampleComponent = Shade({
|
|
252
|
+
shadowDomName: 'morph-animation-test',
|
|
253
|
+
render: ({ useState }) => {
|
|
254
|
+
const [isActive, setIsActive] = useState('isActive', false);
|
|
255
|
+
return (createComponent("div", null,
|
|
256
|
+
createComponent("div", { id: "animated-box", className: isActive ? 'active' : 'inactive' }),
|
|
257
|
+
createComponent("button", { id: "activate", onclick: () => setIsActive(true) }, "Activate")));
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
initializeShadeRoot({
|
|
261
|
+
injector,
|
|
262
|
+
rootElement,
|
|
263
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
264
|
+
});
|
|
265
|
+
await flushUpdates();
|
|
266
|
+
const box = document.getElementById('animated-box');
|
|
267
|
+
expect(box?.className).toBe('inactive');
|
|
268
|
+
document.getElementById('activate')?.click();
|
|
269
|
+
await flushUpdates();
|
|
270
|
+
// Same element, class updated in place (animation would continue)
|
|
271
|
+
const boxAfter = document.getElementById('animated-box');
|
|
272
|
+
expect(boxAfter).toBe(box);
|
|
273
|
+
expect(boxAfter?.className).toBe('active');
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
it('should preserve inline style transitions by keeping element identity', async () => {
|
|
277
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
278
|
+
const rootElement = document.getElementById('root');
|
|
279
|
+
const ExampleComponent = Shade({
|
|
280
|
+
shadowDomName: 'morph-style-transition-test',
|
|
281
|
+
render: ({ useState }) => {
|
|
282
|
+
const [isExpanded, setIsExpanded] = useState('isExpanded', false);
|
|
283
|
+
return (createComponent("div", null,
|
|
284
|
+
createComponent("div", { id: "expandable", style: {
|
|
285
|
+
height: isExpanded ? '200px' : '50px',
|
|
286
|
+
transition: 'height 0.3s ease',
|
|
287
|
+
} }),
|
|
288
|
+
createComponent("button", { id: "expand", onclick: () => setIsExpanded(!isExpanded) }, "Toggle")));
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
initializeShadeRoot({
|
|
292
|
+
injector,
|
|
293
|
+
rootElement,
|
|
294
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
295
|
+
});
|
|
296
|
+
await flushUpdates();
|
|
297
|
+
const expandable = document.getElementById('expandable');
|
|
298
|
+
expect(expandable?.style.height).toBe('50px');
|
|
299
|
+
document.getElementById('expand')?.click();
|
|
300
|
+
await flushUpdates();
|
|
301
|
+
// Same element, style updated in place (transition would animate)
|
|
302
|
+
const expandableAfter = document.getElementById('expandable');
|
|
303
|
+
expect(expandableAfter).toBe(expandable);
|
|
304
|
+
expect(expandableAfter?.style.height).toBe('200px');
|
|
305
|
+
expect(expandableAfter?.style.transition).toBe('height 0.3s ease');
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
describe('event handler updates', () => {
|
|
310
|
+
it('should update event handlers after re-render (closures capture new state)', async () => {
|
|
311
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
312
|
+
const rootElement = document.getElementById('root');
|
|
313
|
+
const clicks = [];
|
|
314
|
+
const ExampleComponent = Shade({
|
|
315
|
+
shadowDomName: 'morph-handler-test',
|
|
316
|
+
render: ({ useState }) => {
|
|
317
|
+
const [count, setCount] = useState('count', 0);
|
|
318
|
+
return (createComponent("div", null,
|
|
319
|
+
createComponent("span", { id: "count" }, count),
|
|
320
|
+
createComponent("button", { id: "increment", onclick: () => {
|
|
321
|
+
clicks.push(count);
|
|
322
|
+
setCount(count + 1);
|
|
323
|
+
} }, "+")));
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
initializeShadeRoot({
|
|
327
|
+
injector,
|
|
328
|
+
rootElement,
|
|
329
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
330
|
+
});
|
|
331
|
+
await flushUpdates();
|
|
332
|
+
const button = document.getElementById('increment');
|
|
333
|
+
// First click: count is 0
|
|
334
|
+
button.click();
|
|
335
|
+
await flushUpdates();
|
|
336
|
+
expect(clicks).toEqual([0]);
|
|
337
|
+
expect(document.getElementById('count')?.textContent).toBe('1');
|
|
338
|
+
// Second click: handler should capture count=1 after morph
|
|
339
|
+
button.click();
|
|
340
|
+
await flushUpdates();
|
|
341
|
+
expect(clicks).toEqual([0, 1]);
|
|
342
|
+
expect(document.getElementById('count')?.textContent).toBe('2');
|
|
343
|
+
// Third click: handler should capture count=2
|
|
344
|
+
button.click();
|
|
345
|
+
await flushUpdates();
|
|
346
|
+
expect(clicks).toEqual([0, 1, 2]);
|
|
347
|
+
expect(document.getElementById('count')?.textContent).toBe('3');
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
describe('observable-driven re-renders with morphing', () => {
|
|
352
|
+
it('should morph correctly when observable drives updates', async () => {
|
|
353
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
354
|
+
const rootElement = document.getElementById('root');
|
|
355
|
+
const obs = new ObservableValue('hello');
|
|
356
|
+
const ExampleComponent = Shade({
|
|
357
|
+
shadowDomName: 'morph-observable-test',
|
|
358
|
+
render: ({ useObservable }) => {
|
|
359
|
+
const [value] = useObservable('obs', obs);
|
|
360
|
+
return (createComponent("div", null,
|
|
361
|
+
createComponent("span", { id: "value" }, value),
|
|
362
|
+
createComponent("input", { id: "my-input", type: "text" })));
|
|
363
|
+
},
|
|
364
|
+
});
|
|
365
|
+
initializeShadeRoot({
|
|
366
|
+
injector,
|
|
367
|
+
rootElement,
|
|
368
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
369
|
+
});
|
|
370
|
+
await flushUpdates();
|
|
371
|
+
const input = document.getElementById('my-input');
|
|
372
|
+
const span = document.getElementById('value');
|
|
373
|
+
input.value = 'user text';
|
|
374
|
+
input.focus();
|
|
375
|
+
// External observable change
|
|
376
|
+
obs.setValue('world');
|
|
377
|
+
await flushUpdates();
|
|
378
|
+
// Text should update
|
|
379
|
+
expect(document.getElementById('value')).toBe(span);
|
|
380
|
+
expect(span.textContent).toBe('world');
|
|
381
|
+
// Input should be preserved
|
|
382
|
+
expect(document.getElementById('my-input')).toBe(input);
|
|
383
|
+
expect(input.value).toBe('user text');
|
|
384
|
+
expect(document.activeElement).toBe(input);
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
describe('fragment render result morphing', () => {
|
|
389
|
+
it('should morph fragment children across re-renders', async () => {
|
|
390
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
391
|
+
const rootElement = document.getElementById('root');
|
|
392
|
+
const ExampleComponent = Shade({
|
|
393
|
+
shadowDomName: 'morph-fragment-test',
|
|
394
|
+
render: ({ useState }) => {
|
|
395
|
+
const [count, setCount] = useState('count', 0);
|
|
396
|
+
return (createComponent(createComponent, null,
|
|
397
|
+
createComponent("p", { id: "counter" },
|
|
398
|
+
"Count: ",
|
|
399
|
+
count),
|
|
400
|
+
createComponent("button", { id: "increment", onclick: () => setCount(count + 1) }, "+")));
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
initializeShadeRoot({
|
|
404
|
+
injector,
|
|
405
|
+
rootElement,
|
|
406
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
407
|
+
});
|
|
408
|
+
await flushUpdates();
|
|
409
|
+
const counter = document.getElementById('counter');
|
|
410
|
+
const button = document.getElementById('increment');
|
|
411
|
+
button?.click();
|
|
412
|
+
await flushUpdates();
|
|
413
|
+
// Elements should be reused
|
|
414
|
+
expect(document.getElementById('counter')).toBe(counter);
|
|
415
|
+
expect(document.getElementById('increment')).toBe(button);
|
|
416
|
+
expect(counter?.textContent).toBe('Count: 1');
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
describe('text render result optimization', () => {
|
|
421
|
+
it('should efficiently update text-only render results', async () => {
|
|
422
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
423
|
+
const rootElement = document.getElementById('root');
|
|
424
|
+
const ExampleComponent = Shade({
|
|
425
|
+
shadowDomName: 'morph-text-result-test',
|
|
426
|
+
render: ({ useState }) => {
|
|
427
|
+
const [text] = useState('text', 'initial');
|
|
428
|
+
return text;
|
|
429
|
+
},
|
|
430
|
+
});
|
|
431
|
+
initializeShadeRoot({
|
|
432
|
+
injector,
|
|
433
|
+
rootElement,
|
|
434
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
435
|
+
});
|
|
436
|
+
await flushUpdates();
|
|
437
|
+
const shadeEl = document.querySelector('morph-text-result-test');
|
|
438
|
+
expect(shadeEl.textContent).toBe('initial');
|
|
439
|
+
const textNode = shadeEl.firstChild;
|
|
440
|
+
// Trigger update via the shade element
|
|
441
|
+
const el = shadeEl;
|
|
442
|
+
el.resourceManager.stateObservers
|
|
443
|
+
.get('text')
|
|
444
|
+
?.setValue('updated');
|
|
445
|
+
await flushUpdates();
|
|
446
|
+
expect(shadeEl.textContent).toBe('updated');
|
|
447
|
+
// Text node should be reused (not recreated)
|
|
448
|
+
expect(shadeEl.firstChild).toBe(textNode);
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
describe('Shade component boundary morphing', () => {
|
|
453
|
+
it('should update child Shade component props without recreating it', async () => {
|
|
454
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
455
|
+
const rootElement = document.getElementById('root');
|
|
456
|
+
const childRenderSpy = vi.fn();
|
|
457
|
+
const ChildComponent = Shade({
|
|
458
|
+
shadowDomName: 'morph-child-component',
|
|
459
|
+
render: ({ props }) => {
|
|
460
|
+
childRenderSpy();
|
|
461
|
+
return createComponent("span", { id: "child-value" }, props.value);
|
|
462
|
+
},
|
|
463
|
+
});
|
|
464
|
+
const ParentComponent = Shade({
|
|
465
|
+
shadowDomName: 'morph-parent-component',
|
|
466
|
+
render: ({ useState }) => {
|
|
467
|
+
const [count, setCount] = useState('count', 0);
|
|
468
|
+
return (createComponent("div", null,
|
|
469
|
+
createComponent(ChildComponent, { value: count }),
|
|
470
|
+
createComponent("button", { id: "parent-increment", onclick: () => setCount(count + 1) }, "+")));
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
initializeShadeRoot({
|
|
474
|
+
injector,
|
|
475
|
+
rootElement,
|
|
476
|
+
jsxElement: createComponent(ParentComponent, null),
|
|
477
|
+
});
|
|
478
|
+
await flushUpdates();
|
|
479
|
+
await flushUpdates();
|
|
480
|
+
expect(document.getElementById('child-value')?.textContent).toBe('0');
|
|
481
|
+
const childElement = document.querySelector('morph-child-component');
|
|
482
|
+
// Trigger parent re-render
|
|
483
|
+
document.getElementById('parent-increment')?.click();
|
|
484
|
+
await flushUpdates();
|
|
485
|
+
await flushUpdates();
|
|
486
|
+
// Child should be the same DOM element (not recreated)
|
|
487
|
+
expect(document.querySelector('morph-child-component')).toBe(childElement);
|
|
488
|
+
// Child should have been updated with new props
|
|
489
|
+
expect(document.getElementById('child-value')?.textContent).toBe('1');
|
|
490
|
+
});
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
//# sourceMappingURL=vnode.integration.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnode.integration.spec.js","sourceRoot":"","sources":["../src/vnode.integration.spec.tsx"],"names":[],"mappings":"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"}
|