@domql/element 3.1.1 → 3.2.3

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 (90) hide show
  1. package/README.md +4 -6
  2. package/__tests__/checkIfOnUpdate.test.js +12 -12
  3. package/__tests__/children.test.js +34 -38
  4. package/__tests__/inheritStateUpdates.test.js +12 -12
  5. package/__tests__/renderElement.test.js +11 -11
  6. package/__tests__/resetElement.test.js +6 -6
  7. package/__tests__/set.test.js +32 -36
  8. package/__tests__/throughExecProps.test.js +12 -12
  9. package/__tests__/throughInitialDefine.test.js +16 -16
  10. package/__tests__/throughInitialExec.test.js +16 -16
  11. package/__tests__/throughUpdatedDefine.test.js +14 -14
  12. package/__tests__/throughUpdatedExec.test.js +17 -16
  13. package/__tests__/update.test.js +54 -54
  14. package/children.js +5 -6
  15. package/create.js +18 -20
  16. package/dist/cjs/children.js +4 -2
  17. package/dist/cjs/create.js +16 -16
  18. package/dist/cjs/extend.js +88 -0
  19. package/dist/cjs/iterate.js +76 -20
  20. package/dist/cjs/mixins/content.js +73 -0
  21. package/dist/cjs/mixins/html.js +1 -1
  22. package/dist/cjs/mixins/registry.js +2 -2
  23. package/dist/cjs/mixins/scope.js +1 -1
  24. package/dist/cjs/mixins/state.js +2 -2
  25. package/dist/cjs/mixins/text.js +4 -4
  26. package/dist/cjs/node.js +15 -15
  27. package/dist/cjs/set.js +22 -27
  28. package/dist/cjs/update.js +24 -33
  29. package/dist/cjs/utils/applyParam.js +4 -4
  30. package/dist/cjs/utils/extendUtils.js +132 -0
  31. package/dist/cjs/utils/propEvents.js +39 -0
  32. package/dist/esm/children.js +5 -3
  33. package/dist/esm/create.js +16 -16
  34. package/dist/esm/extend.js +74 -0
  35. package/dist/esm/iterate.js +77 -22
  36. package/dist/esm/mixins/content.js +53 -0
  37. package/dist/esm/mixins/html.js +1 -1
  38. package/dist/esm/mixins/registry.js +1 -1
  39. package/dist/esm/mixins/scope.js +1 -1
  40. package/dist/esm/mixins/state.js +3 -3
  41. package/dist/esm/mixins/text.js +4 -4
  42. package/dist/esm/node.js +15 -15
  43. package/dist/esm/set.js +23 -28
  44. package/dist/esm/update.js +24 -33
  45. package/dist/esm/utils/applyParam.js +5 -5
  46. package/dist/esm/utils/extendUtils.js +119 -0
  47. package/dist/esm/utils/propEvents.js +19 -0
  48. package/extend.js +98 -0
  49. package/iterate.js +80 -25
  50. package/mixins/content.js +65 -0
  51. package/mixins/html.js +1 -1
  52. package/mixins/registry.js +1 -1
  53. package/mixins/scope.js +1 -1
  54. package/mixins/state.js +3 -3
  55. package/mixins/text.js +4 -4
  56. package/node.js +15 -15
  57. package/package.json +8 -8
  58. package/set.js +23 -28
  59. package/update.js +25 -34
  60. package/utils/applyParam.js +5 -5
  61. package/utils/extendUtils.js +149 -0
  62. package/utils/propEvents.js +19 -0
  63. package/dist/cjs/__tests__/checkIfOnUpdate.test.js +0 -73
  64. package/dist/cjs/__tests__/children.test.js +0 -177
  65. package/dist/cjs/__tests__/define.test.js +0 -75
  66. package/dist/cjs/__tests__/inheritStateUpdates.test.js +0 -62
  67. package/dist/cjs/__tests__/renderElement.test.js +0 -138
  68. package/dist/cjs/__tests__/resetElement.test.js +0 -35
  69. package/dist/cjs/__tests__/set.test.js +0 -256
  70. package/dist/cjs/__tests__/throughExecProps.test.js +0 -62
  71. package/dist/cjs/__tests__/throughInitialDefine.test.js +0 -79
  72. package/dist/cjs/__tests__/throughInitialExec.test.js +0 -73
  73. package/dist/cjs/__tests__/throughUpdatedDefine.test.js +0 -69
  74. package/dist/cjs/__tests__/throughUpdatedExec.test.js +0 -84
  75. package/dist/cjs/__tests__/tree.test.js +0 -11
  76. package/dist/cjs/__tests__/update.test.js +0 -222
  77. package/dist/esm/__tests__/checkIfOnUpdate.test.js +0 -73
  78. package/dist/esm/__tests__/children.test.js +0 -177
  79. package/dist/esm/__tests__/define.test.js +0 -53
  80. package/dist/esm/__tests__/inheritStateUpdates.test.js +0 -62
  81. package/dist/esm/__tests__/renderElement.test.js +0 -116
  82. package/dist/esm/__tests__/resetElement.test.js +0 -35
  83. package/dist/esm/__tests__/set.test.js +0 -256
  84. package/dist/esm/__tests__/throughExecProps.test.js +0 -62
  85. package/dist/esm/__tests__/throughInitialDefine.test.js +0 -79
  86. package/dist/esm/__tests__/throughInitialExec.test.js +0 -73
  87. package/dist/esm/__tests__/throughUpdatedDefine.test.js +0 -69
  88. package/dist/esm/__tests__/throughUpdatedExec.test.js +0 -84
  89. package/dist/esm/__tests__/tree.test.js +0 -11
  90. package/dist/esm/__tests__/update.test.js +0 -222
@@ -1,73 +0,0 @@
1
- var import_iterate = require("../iterate");
2
- describe("throughInitialExec", () => {
3
- let element, ref;
4
- beforeEach(() => {
5
- ref = { __exec: {} };
6
- element = {
7
- __ref: ref,
8
- state: { testState: true },
9
- context: { testContext: true },
10
- // Default non-method function
11
- customFn: () => "executed"
12
- };
13
- });
14
- it("should process non-method functions and update element properties", async () => {
15
- await (0, import_iterate.throughInitialExec)(element);
16
- expect(element.customFn).toBe("executed");
17
- expect(ref.__exec.customFn).toBeInstanceOf(Function);
18
- });
19
- it("should skip excluded parameters", async () => {
20
- element.excludedFn = () => "should not execute";
21
- await (0, import_iterate.throughInitialExec)(element, { excludedFn: true });
22
- expect(element.excludedFn).toBeInstanceOf(Function);
23
- expect(ref.__exec).not.toHaveProperty("excludedFn");
24
- });
25
- it("should skip methods from METHODS array", async () => {
26
- element.update = () => "built-in method";
27
- await (0, import_iterate.throughInitialExec)(element);
28
- expect(element.update).toBeInstanceOf(Function);
29
- expect(ref.__exec).not.toHaveProperty("update");
30
- });
31
- it("should skip methods from context.methods", async () => {
32
- element.context.methods = { contextMethod: true };
33
- element.contextMethod = () => "context method";
34
- await (0, import_iterate.throughInitialExec)(element);
35
- expect(element.contextMethod).toBeInstanceOf(Function);
36
- expect(ref.__exec).not.toHaveProperty("contextMethod");
37
- });
38
- it("should leave non-function properties unchanged", async () => {
39
- element.stringProp = "text";
40
- await (0, import_iterate.throughInitialExec)(element);
41
- expect(element.stringProp).toBe("text");
42
- expect(ref.__exec).not.toHaveProperty("stringProp");
43
- });
44
- it("should store original functions in __exec", async () => {
45
- const originalFn = () => "original";
46
- element.testFn = originalFn;
47
- await (0, import_iterate.throughInitialExec)(element);
48
- expect(ref.__exec.testFn).toBe(originalFn);
49
- expect(element.testFn).toBe("original");
50
- });
51
- it("should execute functions with correct arguments", async () => {
52
- element.argChecker = (el, state, context) => ({
53
- elIsElement: el === element,
54
- stateMatch: state === element.state,
55
- contextMatch: context === element.context
56
- });
57
- await (0, import_iterate.throughInitialExec)(element);
58
- expect(element.argChecker).toEqual({
59
- elIsElement: true,
60
- stateMatch: true,
61
- contextMatch: true
62
- });
63
- });
64
- it("should handle empty exclude object", async () => {
65
- element.fn1 = () => "one";
66
- element.fn2 = () => "two";
67
- await (0, import_iterate.throughInitialExec)(element, {});
68
- expect(element.fn1).toBe("one");
69
- expect(element.fn2).toBe("two");
70
- expect(ref.__exec).toHaveProperty("fn1");
71
- expect(ref.__exec).toHaveProperty("fn2");
72
- });
73
- });
@@ -1,69 +0,0 @@
1
- var import_iterate = require("../iterate");
2
- describe("throughUpdatedDefine", () => {
3
- let element, ref;
4
- beforeEach(() => {
5
- ref = {
6
- __exec: {},
7
- __defineCache: {}
8
- };
9
- element = {
10
- __ref: ref,
11
- define: {},
12
- state: { testState: true },
13
- context: { testContext: true }
14
- };
15
- });
16
- it("should merge local and global define objects", async () => {
17
- element.define = { localProp: () => "local" };
18
- element.context.define = { globalProp: () => "global" };
19
- await (0, import_iterate.throughUpdatedDefine)(element);
20
- expect(element.localProp).toBe("local");
21
- expect(element.globalProp).toBe("global");
22
- });
23
- it("should update element properties using cached exec functions", async () => {
24
- ref.__exec.testProp = () => "cached value";
25
- element.define.testProp = (cached) => `updated ${cached}`;
26
- await (0, import_iterate.throughUpdatedDefine)(element);
27
- expect(element.testProp).toBe("updated cached value");
28
- expect(ref.__defineCache.testProp).toBe("cached value");
29
- });
30
- it("should handle non-function cached values", async () => {
31
- ref.__defineCache.testProp = "static value";
32
- element.define.testProp = (cached) => `updated ${cached}`;
33
- await (0, import_iterate.throughUpdatedDefine)(element);
34
- expect(element.testProp).toBe("updated static value");
35
- });
36
- it("should skip updates for undefined or null results", async () => {
37
- ref.__exec.testProp = () => "cached value";
38
- element.define.testProp = () => null;
39
- element.testProp = "original value";
40
- await (0, import_iterate.throughUpdatedDefine)(element);
41
- expect(element.testProp).toBe("original value");
42
- });
43
- it("should handle empty define objects", async () => {
44
- const originalElement = { ...element };
45
- await (0, import_iterate.throughUpdatedDefine)(element);
46
- expect(element).toEqual(originalElement);
47
- });
48
- it("should pass correct arguments to define functions", async () => {
49
- element.define.testProp = (cached, el, state, context) => ({
50
- cachedMatch: cached === "cached value",
51
- elMatch: el === element,
52
- stateMatch: state === element.state,
53
- contextMatch: context === element.context
54
- });
55
- ref.__defineCache.testProp = "cached value";
56
- await (0, import_iterate.throughUpdatedDefine)(element);
57
- expect(element.testProp).toEqual({
58
- cachedMatch: true,
59
- elMatch: true,
60
- stateMatch: true,
61
- contextMatch: true
62
- });
63
- });
64
- it("should return an empty changes object", async () => {
65
- element.define.testProp = () => "updated value";
66
- const changes = await (0, import_iterate.throughUpdatedDefine)(element);
67
- expect(changes).toEqual({});
68
- });
69
- });
@@ -1,84 +0,0 @@
1
- var import_iterate = require("../iterate");
2
- describe("throughUpdatedExec", () => {
3
- let element, ref;
4
- beforeEach(() => {
5
- ref = {
6
- __exec: {},
7
- __defineCache: {}
8
- };
9
- element = {
10
- __ref: ref,
11
- state: { testState: true },
12
- context: { testContext: true }
13
- };
14
- });
15
- it("should skip execution for params in __defineCache", () => {
16
- ref.__defineCache.cachedParam = true;
17
- ref.__exec.cachedParam = () => "should not execute";
18
- element.cachedParam = "original";
19
- const changes = (0, import_iterate.throughUpdatedExec)(element);
20
- expect(element.cachedParam).toBe("original");
21
- expect(changes).toEqual({});
22
- });
23
- it("should update element properties when newExec differs from current value", () => {
24
- ref.__exec.testParam = () => "new value";
25
- element.testParam = "old value";
26
- const changes = (0, import_iterate.throughUpdatedExec)(element);
27
- expect(element.testParam).toBe("new value");
28
- expect(changes).toEqual({ testParam: "old value" });
29
- });
30
- it("should overwrite text property for nodes when exec returns string or number", () => {
31
- const node = { node: true, text: "old text" };
32
- ref.__exec.testParam = () => "new text";
33
- element.testParam = node;
34
- const changes = (0, import_iterate.throughUpdatedExec)(element);
35
- expect(element.testParam.text).toBe("new text");
36
- expect(changes).toEqual({});
37
- });
38
- it("should handle component naming matches and overwrite with context component", () => {
39
- const contextComponent = { extends: "Component", prop: "value" };
40
- element.context.components = { TestComponent: contextComponent };
41
- ref.__exec.TestComponent = () => contextComponent;
42
- element.TestComponent = { oldProp: "oldValue" };
43
- const changes = (0, import_iterate.throughUpdatedExec)(element);
44
- expect(element.TestComponent).toEqual({
45
- oldProp: "oldValue",
46
- prop: "value"
47
- });
48
- expect(changes).toEqual({});
49
- });
50
- it("should not update element properties when newExec matches current value", () => {
51
- ref.__exec.testParam = () => "same value";
52
- element.testParam = "same value";
53
- const changes = (0, import_iterate.throughUpdatedExec)(element);
54
- expect(element.testParam).toBe("same value");
55
- expect(changes).toEqual({});
56
- });
57
- it("should handle non-string/non-number exec returns for non-node properties", () => {
58
- const newValue = { complex: "object" };
59
- ref.__exec.testParam = () => newValue;
60
- element.testParam = "old value";
61
- const changes = (0, import_iterate.throughUpdatedExec)(element);
62
- expect(element.testParam).toBe(newValue);
63
- expect(changes).toEqual({ testParam: "old value" });
64
- });
65
- it("should return an empty changes object when no updates occur", () => {
66
- ref.__exec.testParam = () => "same value";
67
- element.testParam = "same value";
68
- const changes = (0, import_iterate.throughUpdatedExec)(element);
69
- expect(changes).toEqual({});
70
- });
71
- it("should handle multiple properties and return correct changes", () => {
72
- ref.__exec.param1 = () => "new value 1";
73
- ref.__exec.param2 = () => "new value 2";
74
- element.param1 = "old value 1";
75
- element.param2 = "old value 2";
76
- const changes = (0, import_iterate.throughUpdatedExec)(element);
77
- expect(element.param1).toBe("new value 1");
78
- expect(element.param2).toBe("new value 2");
79
- expect(changes).toEqual({
80
- param1: "old value 1",
81
- param2: "old value 2"
82
- });
83
- });
84
- });
@@ -1,11 +0,0 @@
1
- var import_tree = require("../tree");
2
- describe("ROOT/TREE initialization and report()", () => {
3
- it("initializes ROOT with :root key and document.body node", () => {
4
- expect(import_tree.ROOT.key).toBe(":root");
5
- expect(import_tree.ROOT.node).toBe(document.body);
6
- });
7
- it("assigns TREE to reference ROOT", () => {
8
- expect(import_tree.TREE).toBe(import_tree.ROOT);
9
- expect(import_tree.TREE.node).toBe(document.body);
10
- });
11
- });
@@ -1,222 +0,0 @@
1
- var import_update = require("../update");
2
- describe("update()", () => {
3
- let element, params, opts;
4
- beforeEach(() => {
5
- element = {
6
- __ref: {
7
- __if: true,
8
- __execProps: {},
9
- __exec: {},
10
- __defineCache: {},
11
- __propsStack: [],
12
- __props: [],
13
- __state: "state"
14
- },
15
- state: "string",
16
- props: {},
17
- parent: {
18
- props: {}
19
- },
20
- context: {},
21
- define: {},
22
- node: document.createElement("div"),
23
- key: "testElement",
24
- on: {},
25
- update: import_update.update
26
- };
27
- opts = {
28
- preventUpdate: [],
29
- preventDefineUpdate: [],
30
- preventBeforeStateUpdateListener: false,
31
- preventListeners: false,
32
- preventStateUpdateListener: false
33
- };
34
- params = {};
35
- });
36
- it("does not modify opts when params and opts are empty", async () => {
37
- await element.update({}, opts);
38
- expect(opts).toEqual({
39
- calleeElement: false,
40
- cleanExec: true,
41
- currentSnapshot: false,
42
- exclude: [],
43
- preventRecursive: false,
44
- stackChanges: false,
45
- preventUpdate: [],
46
- preventDefineUpdate: [],
47
- preventBeforeStateUpdateListener: false,
48
- preventListeners: false,
49
- preventStateUpdateListener: false
50
- });
51
- });
52
- it("initializes options with UPDATE_DEFAULT_OPTIONS when opts is empty", async () => {
53
- await element.update({}, opts);
54
- expect(opts.calleeElement).toBe(false);
55
- expect(element.__ref).toBeDefined();
56
- });
57
- it("merges opts with UPDATE_DEFAULT_OPTIONS using deepMerge", async () => {
58
- opts.customOption = true;
59
- await element.update({}, opts);
60
- expect(opts.customOption).toBe(true);
61
- });
62
- it("converts string params to { text: params }", async () => {
63
- await element.update("testString", opts);
64
- expect(element.text).toBe("testString");
65
- });
66
- it("converts number params to { text: params }", async () => {
67
- await element.update(123, opts);
68
- expect(element.text).toBe(123);
69
- });
70
- it("returns early if preventInheritAtCurrentState matches element", async () => {
71
- opts.preventInheritAtCurrentState = { __element: element };
72
- await element.update({}, opts);
73
- expect(element.__ref.__currentSnapshot).toBe(6);
74
- });
75
- it("initializes __ref if not present", async () => {
76
- delete element.__ref;
77
- await element.update({}, opts);
78
- expect(element.__ref).toBeDefined();
79
- });
80
- it("merges options with UPDATE_DEFAULT_OPTIONS when exclude is missing", async () => {
81
- await element.update({}, opts);
82
- expect(opts.exclude).toBeDefined();
83
- });
84
- it("does not throw or modify opts when params is undefined", async () => {
85
- await element.update(void 0, opts);
86
- expect(opts).toEqual({
87
- calleeElement: false,
88
- cleanExec: true,
89
- currentSnapshot: false,
90
- exclude: [],
91
- preventRecursive: false,
92
- preventUpdate: [],
93
- preventDefineUpdate: [],
94
- stackChanges: false,
95
- preventBeforeStateUpdateListener: false,
96
- preventListeners: false,
97
- preventStateUpdateListener: false
98
- });
99
- });
100
- it("does not throw when opts is undefined", async () => {
101
- await element.update({}, void 0);
102
- expect(element.__ref).toBeDefined();
103
- });
104
- it("does not throw when opts is null", async () => {
105
- await element.update({}, null);
106
- expect(element.__ref).toBeDefined();
107
- });
108
- it("does not modify the params object", async () => {
109
- params = { key: "value" };
110
- await element.update(params, opts);
111
- expect(params).toEqual({ key: "value" });
112
- });
113
- it("does modify opts when params is an empty object", async () => {
114
- await element.update({}, opts);
115
- expect(opts).toEqual({
116
- calleeElement: false,
117
- cleanExec: true,
118
- currentSnapshot: false,
119
- exclude: [],
120
- preventRecursive: false,
121
- stackChanges: false,
122
- preventUpdate: [],
123
- preventDefineUpdate: [],
124
- preventBeforeStateUpdateListener: false,
125
- preventListeners: false,
126
- preventStateUpdateListener: false
127
- });
128
- });
129
- it("moves regular properties to element.props", async () => {
130
- params = { props: { title: "Test", description: "Content" } };
131
- await element.update(params, opts);
132
- expect(element.props).toEqual({
133
- title: "Test",
134
- description: "Content"
135
- });
136
- expect(element.title).toBeUndefined();
137
- });
138
- it("keeps element-rooted properties", async () => {
139
- params = { Header: {}, Footer: {}, 0: "index" };
140
- await element.update(params, opts);
141
- expect(element.Header).toBeDefined();
142
- expect(element.Footer).toBeDefined();
143
- expect(element["0"]).toBe("index");
144
- expect(element.props).toEqual({});
145
- });
146
- it("preserves built-in properties on element", async () => {
147
- params = { props: { className: "container", hidden: true } };
148
- await element.update(params, opts);
149
- expect(element.props.className).toBe("container");
150
- expect(element.props.hidden).toBe(true);
151
- expect(element.props).toEqual({ className: "container", hidden: true });
152
- });
153
- it("moves element-like properties from props to root", async () => {
154
- params = { props: { Header: {} } };
155
- await element.update(params, opts);
156
- expect(element.Header).toBeDefined();
157
- expect(element.props.Header).toBeUndefined();
158
- });
159
- it("exits early when inheritStateUpdates returns false", async () => {
160
- element.__ref.__stateBlocked = true;
161
- await element.update({ props: { shouldChange: true } }, opts);
162
- expect(element.props.shouldChange).toBe(true);
163
- expect(element.__ref.__stateBlocked).toBe(true);
164
- });
165
- it("exits early when checkIfOnUpdate fails", async () => {
166
- element.parent.props.ifCondition = false;
167
- await element.update({ state: { newState: true } }, opts);
168
- expect(element.state.newState).toBe(true);
169
- });
170
- it("updates props from parent key match", async () => {
171
- element.parent.props.testKey = { inherited: true };
172
- await element.update({}, opts);
173
- expect(element.props.inherited).toBeUndefined();
174
- });
175
- it("updates props when functions exist in __props", async () => {
176
- element.__ref.__props.push(() => "dynamic");
177
- await element.update({}, opts);
178
- expect(element.props).toEqual(expect.any(Object));
179
- });
180
- it("skips props update when preventPropsUpdate=true", async () => {
181
- opts.preventPropsUpdate = true;
182
- opts.preventUpdateAfter = true;
183
- element.parent.props.testKey = { shouldExist: true };
184
- await element.update({}, opts);
185
- expect(element.props.shouldExist).toBeUndefined();
186
- });
187
- it("should not skips props update when preventPropsUpdate=false", async () => {
188
- opts.preventPropsUpdate = false;
189
- opts.lazyLoad = true;
190
- opts.onEachUpdate = () => {
191
- return true;
192
- };
193
- element.parent.props.testKey = { shouldExist: true };
194
- element.__ref.__propsStack = [];
195
- element.__ref.__if = true;
196
- element.off = { text: "off" };
197
- await element.update({}, opts);
198
- expect(element.props.shouldExist).toBeUndefined();
199
- });
200
- it("should set preventUpdateAfterCount to 1 when is not a number", async () => {
201
- opts.preventPropsUpdate = true;
202
- opts.preventUpdateAfter = 2;
203
- opts.preventUpdateAfterCount = void 0;
204
- element.parent.props.testKey = { shouldExist: true };
205
- await element.update({}, opts);
206
- expect(element.props.shouldExist).toBeUndefined();
207
- });
208
- it("processes parent.childProps", async () => {
209
- element.parent.props.childProps = { global: true };
210
- await element.update({}, opts);
211
- expect(element.props.global).toBe(true);
212
- });
213
- it("processes function props", async () => {
214
- await element.update({ props: { calc: () => 42 } }, opts);
215
- expect(element.props.calc()).toBe(42);
216
- });
217
- it("returns element when beforeUpdate rejects", async () => {
218
- element.on.beforeUpdate = () => false;
219
- const result = await element.update({}, opts);
220
- expect(result).toBe(element);
221
- });
222
- });
@@ -1,73 +0,0 @@
1
- import { update } from "../update";
2
- describe("checkIfOnUpdate via update()", () => {
3
- let element, parent, options;
4
- beforeEach(() => {
5
- parent = {
6
- node: document.createElement("div"),
7
- props: {},
8
- state: {}
9
- };
10
- element = {
11
- __ref: {
12
- __if: void 0,
13
- __state: null,
14
- __hasRootState: false,
15
- __execProps: {},
16
- contentElementKey: "content"
17
- },
18
- parent,
19
- props: {},
20
- state: {
21
- update: (el, st) => {
22
- return st;
23
- }
24
- },
25
- context: {
26
- defaultExtends: {}
27
- },
28
- node: document.createElement("div"),
29
- if: () => true,
30
- previousElement: () => {
31
- return {};
32
- },
33
- nextElement: () => {
34
- return {};
35
- },
36
- removeContent: () => {
37
- return true;
38
- }
39
- };
40
- options = {};
41
- });
42
- it("uses props.if when element.if missing", async () => {
43
- delete element.if;
44
- element.props.if = () => false;
45
- await update.call(element, {}, options);
46
- expect(element.node).toEqual(document.createElement("div"));
47
- });
48
- it("retains state when __hasRootState=true", async () => {
49
- element.__ref.__hasRootState = true;
50
- element.state.critical = true;
51
- element.__ref.__if = false;
52
- await update.call(element, {}, options);
53
- expect(element.state.critical).toBe(true);
54
- expect(element.state.preserved).toBeUndefined();
55
- });
56
- it("processes nested content with parseDeep", async () => {
57
- element.content = {
58
- parseDeep: () => ({ parsed: true }),
59
- existing: "data"
60
- };
61
- await update.call(element, {}, options);
62
- expect(element.content.parsed).toBe(true);
63
- expect(element.content.existing).toBeUndefined();
64
- });
65
- it("reattaches after previous sibling", async () => {
66
- const prevNode = document.createElement("span");
67
- parent.node.appendChild(prevNode);
68
- await update.call(element, {}, options);
69
- const newElement = parent.node.children[0];
70
- expect(newElement).toEqual(document.createElement("span"));
71
- expect(newElement.previousSibling).toBe(null);
72
- });
73
- });