@domql/element 2.5.200 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +1 -1
  2. package/__tests__/checkIfOnUpdate.test.js +103 -0
  3. package/__tests__/children.test.js +213 -0
  4. package/__tests__/define.test.js +75 -0
  5. package/__tests__/inheritStateUpdates.test.js +79 -0
  6. package/__tests__/renderElement.test.js +131 -0
  7. package/__tests__/resetElement.test.js +44 -0
  8. package/__tests__/set.test.js +316 -0
  9. package/__tests__/throughExecProps.test.js +86 -0
  10. package/__tests__/throughInitialDefine.test.js +104 -0
  11. package/__tests__/throughInitialExec.test.js +92 -0
  12. package/__tests__/throughUpdatedDefine.test.js +92 -0
  13. package/__tests__/throughUpdatedExec.test.js +110 -0
  14. package/__tests__/tree.test.js +15 -0
  15. package/__tests__/update.test.js +253 -0
  16. package/children.js +105 -0
  17. package/create.js +125 -252
  18. package/dist/cjs/__tests__/checkIfOnUpdate.test.js +73 -0
  19. package/dist/cjs/__tests__/children.test.js +177 -0
  20. package/dist/cjs/__tests__/define.test.js +75 -0
  21. package/dist/cjs/__tests__/inheritStateUpdates.test.js +62 -0
  22. package/dist/cjs/__tests__/renderElement.test.js +138 -0
  23. package/dist/cjs/__tests__/resetElement.test.js +35 -0
  24. package/dist/cjs/__tests__/set.test.js +256 -0
  25. package/dist/cjs/__tests__/throughExecProps.test.js +62 -0
  26. package/dist/cjs/__tests__/throughInitialDefine.test.js +79 -0
  27. package/dist/cjs/__tests__/throughInitialExec.test.js +73 -0
  28. package/dist/cjs/__tests__/throughUpdatedDefine.test.js +69 -0
  29. package/dist/cjs/__tests__/throughUpdatedExec.test.js +84 -0
  30. package/dist/cjs/__tests__/tree.test.js +11 -0
  31. package/dist/cjs/__tests__/update.test.js +219 -0
  32. package/dist/cjs/children.js +87 -0
  33. package/dist/cjs/create.js +79 -177
  34. package/dist/cjs/iterate.js +29 -13
  35. package/dist/cjs/methods/set.js +27 -25
  36. package/dist/cjs/methods/v2.js +1 -5
  37. package/dist/cjs/mixins/attr.js +7 -6
  38. package/dist/cjs/mixins/index.js +0 -4
  39. package/dist/cjs/mixins/registry.js +7 -67
  40. package/dist/cjs/mixins/scope.js +1 -1
  41. package/dist/cjs/mixins/state.js +3 -4
  42. package/dist/cjs/mixins/text.js +3 -3
  43. package/dist/cjs/node.js +32 -22
  44. package/dist/cjs/set.js +112 -40
  45. package/dist/cjs/update.js +119 -64
  46. package/dist/cjs/utils/applyParam.js +2 -2
  47. package/dist/cjs/utils/index.js +8 -4
  48. package/dist/cjs/utils/onlyResolveExtends.js +4 -7
  49. package/dist/esm/__tests__/checkIfOnUpdate.test.js +73 -0
  50. package/dist/esm/__tests__/children.test.js +177 -0
  51. package/dist/esm/__tests__/define.test.js +53 -0
  52. package/dist/esm/__tests__/inheritStateUpdates.test.js +62 -0
  53. package/dist/esm/__tests__/renderElement.test.js +116 -0
  54. package/dist/esm/__tests__/resetElement.test.js +35 -0
  55. package/dist/esm/__tests__/set.test.js +256 -0
  56. package/dist/esm/__tests__/throughExecProps.test.js +62 -0
  57. package/dist/esm/__tests__/throughInitialDefine.test.js +79 -0
  58. package/dist/esm/__tests__/throughInitialExec.test.js +73 -0
  59. package/dist/esm/__tests__/throughUpdatedDefine.test.js +69 -0
  60. package/dist/esm/__tests__/throughUpdatedExec.test.js +84 -0
  61. package/dist/esm/__tests__/tree.test.js +11 -0
  62. package/dist/esm/__tests__/update.test.js +219 -0
  63. package/dist/esm/children.js +81 -0
  64. package/dist/esm/create.js +85 -188
  65. package/dist/esm/iterate.js +33 -16
  66. package/dist/esm/methods/set.js +6 -4
  67. package/dist/esm/methods/v2.js +1 -5
  68. package/dist/esm/mixins/attr.js +8 -7
  69. package/dist/esm/mixins/data.js +1 -1
  70. package/dist/esm/mixins/index.js +0 -4
  71. package/dist/esm/mixins/registry.js +7 -67
  72. package/dist/esm/mixins/scope.js +1 -1
  73. package/dist/esm/mixins/state.js +4 -5
  74. package/dist/esm/mixins/text.js +4 -7
  75. package/dist/esm/node.js +23 -23
  76. package/dist/esm/set.js +112 -40
  77. package/dist/esm/update.js +122 -68
  78. package/dist/esm/utils/applyParam.js +2 -2
  79. package/dist/esm/utils/index.js +4 -3
  80. package/dist/esm/utils/onlyResolveExtends.js +12 -8
  81. package/iterate.js +44 -26
  82. package/methods/set.js +5 -4
  83. package/methods/v2.js +5 -4
  84. package/mixins/attr.js +13 -7
  85. package/mixins/classList.js +7 -2
  86. package/mixins/data.js +1 -1
  87. package/mixins/index.js +1 -6
  88. package/mixins/registry.js +6 -53
  89. package/mixins/scope.js +1 -1
  90. package/mixins/state.js +4 -5
  91. package/mixins/text.js +4 -7
  92. package/node.js +31 -28
  93. package/package.json +7 -6
  94. package/set.js +129 -41
  95. package/update.js +169 -89
  96. package/utils/applyParam.js +7 -4
  97. package/utils/index.js +1 -3
  98. package/utils/onlyResolveExtends.js +27 -16
  99. package/cache/index.js +0 -3
  100. package/cache/options.js +0 -4
  101. package/dist/cjs/cache/index.js +0 -24
  102. package/dist/cjs/cache/options.js +0 -26
  103. package/dist/cjs/extend.js +0 -81
  104. package/dist/cjs/methods/index.js +0 -320
  105. package/dist/cjs/mixins/content.js +0 -67
  106. package/dist/cjs/props/create.js +0 -92
  107. package/dist/cjs/props/ignore.js +0 -24
  108. package/dist/cjs/props/index.js +0 -21
  109. package/dist/cjs/props/inherit.js +0 -51
  110. package/dist/cjs/props/update.js +0 -34
  111. package/dist/cjs/utils/component.js +0 -74
  112. package/dist/cjs/utils/extendUtils.js +0 -133
  113. package/dist/cjs/utils/object.js +0 -171
  114. package/dist/cjs/utils/propEvents.js +0 -39
  115. package/dist/esm/cache/index.js +0 -4
  116. package/dist/esm/cache/options.js +0 -6
  117. package/dist/esm/extend.js +0 -67
  118. package/dist/esm/methods/index.js +0 -300
  119. package/dist/esm/mixins/content.js +0 -47
  120. package/dist/esm/props/create.js +0 -72
  121. package/dist/esm/props/ignore.js +0 -4
  122. package/dist/esm/props/index.js +0 -4
  123. package/dist/esm/props/inherit.js +0 -31
  124. package/dist/esm/props/update.js +0 -14
  125. package/dist/esm/utils/component.js +0 -62
  126. package/dist/esm/utils/extendUtils.js +0 -113
  127. package/dist/esm/utils/object.js +0 -151
  128. package/dist/esm/utils/propEvents.js +0 -19
  129. package/extend.js +0 -90
  130. package/methods/index.js +0 -317
  131. package/mixins/content.js +0 -55
  132. package/props/create.js +0 -87
  133. package/props/ignore.js +0 -3
  134. package/props/index.js +0 -6
  135. package/props/inherit.js +0 -35
  136. package/props/update.js +0 -17
  137. package/utils/component.js +0 -68
  138. package/utils/extendUtils.js +0 -134
  139. package/utils/object.js +0 -172
  140. package/utils/propEvents.js +0 -19
@@ -0,0 +1,110 @@
1
+ import { throughUpdatedExec } from '../iterate'
2
+
3
+ describe('throughUpdatedExec', () => {
4
+ let element, ref
5
+
6
+ beforeEach(() => {
7
+ ref = {
8
+ __exec: {},
9
+ __defineCache: {}
10
+ }
11
+ element = {
12
+ __ref: ref,
13
+ state: { testState: true },
14
+ context: { testContext: true }
15
+ }
16
+ })
17
+
18
+ it('should skip execution for params in __defineCache', () => {
19
+ ref.__defineCache.cachedParam = true
20
+ ref.__exec.cachedParam = () => 'should not execute'
21
+ element.cachedParam = 'original'
22
+
23
+ const changes = throughUpdatedExec(element)
24
+
25
+ expect(element.cachedParam).toBe('original')
26
+ expect(changes).toEqual({})
27
+ })
28
+
29
+ it('should update element properties when newExec differs from current value', () => {
30
+ ref.__exec.testParam = () => 'new value'
31
+ element.testParam = 'old value'
32
+
33
+ const changes = throughUpdatedExec(element)
34
+
35
+ expect(element.testParam).toBe('new value')
36
+ expect(changes).toEqual({ testParam: 'old value' })
37
+ })
38
+
39
+ it('should overwrite text property for nodes when exec returns string or number', () => {
40
+ const node = { node: true, text: 'old text' }
41
+ ref.__exec.testParam = () => 'new text'
42
+ element.testParam = node
43
+
44
+ const changes = throughUpdatedExec(element)
45
+
46
+ expect(element.testParam.text).toBe('new text')
47
+ expect(changes).toEqual({})
48
+ })
49
+
50
+ it('should handle component naming matches and overwrite with context component', () => {
51
+ const contextComponent = { extends: 'Component', prop: 'value' }
52
+ element.context.components = { TestComponent: contextComponent }
53
+ ref.__exec.TestComponent = () => contextComponent
54
+ element.TestComponent = { oldProp: 'oldValue' }
55
+
56
+ const changes = throughUpdatedExec(element)
57
+
58
+ expect(element.TestComponent).toEqual({
59
+ oldProp: 'oldValue',
60
+ prop: 'value'
61
+ })
62
+ expect(changes).toEqual({})
63
+ })
64
+
65
+ it('should not update element properties when newExec matches current value', () => {
66
+ ref.__exec.testParam = () => 'same value'
67
+ element.testParam = 'same value'
68
+
69
+ const changes = throughUpdatedExec(element)
70
+
71
+ expect(element.testParam).toBe('same value')
72
+ expect(changes).toEqual({})
73
+ })
74
+
75
+ it('should handle non-string/non-number exec returns for non-node properties', () => {
76
+ const newValue = { complex: 'object' }
77
+ ref.__exec.testParam = () => newValue
78
+ element.testParam = 'old value'
79
+
80
+ const changes = throughUpdatedExec(element)
81
+
82
+ expect(element.testParam).toBe(newValue)
83
+ expect(changes).toEqual({ testParam: 'old value' })
84
+ })
85
+
86
+ it('should return an empty changes object when no updates occur', () => {
87
+ ref.__exec.testParam = () => 'same value'
88
+ element.testParam = 'same value'
89
+
90
+ const changes = throughUpdatedExec(element)
91
+
92
+ expect(changes).toEqual({})
93
+ })
94
+
95
+ it('should handle multiple properties and return correct changes', () => {
96
+ ref.__exec.param1 = () => 'new value 1'
97
+ ref.__exec.param2 = () => 'new value 2'
98
+ element.param1 = 'old value 1'
99
+ element.param2 = 'old value 2'
100
+
101
+ const changes = throughUpdatedExec(element)
102
+
103
+ expect(element.param1).toBe('new value 1')
104
+ expect(element.param2).toBe('new value 2')
105
+ expect(changes).toEqual({
106
+ param1: 'old value 1',
107
+ param2: 'old value 2'
108
+ })
109
+ })
110
+ })
@@ -0,0 +1,15 @@
1
+ import { ROOT, TREE } from '../tree'
2
+
3
+ describe('ROOT/TREE initialization and report()', () => {
4
+ // Test 1: ROOT object structure
5
+ it('initializes ROOT with :root key and document.body node', () => {
6
+ expect(ROOT.key).toBe(':root')
7
+ expect(ROOT.node).toBe(document.body) // Works in JSDOM
8
+ })
9
+
10
+ // Test 2: TREE === ROOT
11
+ it('assigns TREE to reference ROOT', () => {
12
+ expect(TREE).toBe(ROOT)
13
+ expect(TREE.node).toBe(document.body)
14
+ })
15
+ })
@@ -0,0 +1,253 @@
1
+ import { update } from '../update'
2
+
3
+ describe('update()', () => {
4
+ let element, params, opts
5
+
6
+ beforeEach(() => {
7
+ element = {
8
+ __ref: {
9
+ __execProps: {},
10
+ __exec: {},
11
+ __defineCache: {},
12
+ __props: [],
13
+ __state: 'state'
14
+ },
15
+ state: 'string',
16
+ props: {},
17
+ parent: {
18
+ props: {}
19
+ },
20
+ define: {},
21
+ node: document.createElement('div'),
22
+ key: 'testElement',
23
+ on: {},
24
+ update
25
+ }
26
+ opts = {
27
+ preventUpdate: [],
28
+ preventDefineUpdate: [],
29
+ preventBeforeStateUpdateListener: false,
30
+ preventListeners: false,
31
+ preventStateUpdateListener: false
32
+ }
33
+ params = {}
34
+ })
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
+
53
+ it('initializes options with UPDATE_DEFAULT_OPTIONS when opts is empty', async () => {
54
+ await element.update({}, opts)
55
+ expect(opts.calleeElement).toBe(false) // Ensure opts is not mutated
56
+ expect(element.__ref).toBeDefined() // Ensure __ref is initialized
57
+ })
58
+
59
+ it('merges opts with UPDATE_DEFAULT_OPTIONS using deepMerge', async () => {
60
+ opts.customOption = true
61
+ await element.update({}, opts)
62
+ expect(opts.customOption).toBe(true) // Ensure custom options are preserved
63
+ })
64
+
65
+ it('converts string params to { text: params }', async () => {
66
+ await element.update('testString', opts)
67
+ expect(element.text).toBe('testString')
68
+ })
69
+
70
+ it('converts number params to { text: params }', async () => {
71
+ await element.update(123, opts)
72
+ expect(element.text).toBe(123)
73
+ })
74
+
75
+ it('returns early if preventInheritAtCurrentState matches element', async () => {
76
+ opts.preventInheritAtCurrentState = { __element: element }
77
+ await element.update({}, opts)
78
+ expect(element.__ref.__currentSnapshot).toBe(6) // No snapshot update
79
+ })
80
+
81
+ it('initializes __ref if not present', async () => {
82
+ delete element.__ref
83
+ await element.update({}, opts)
84
+ expect(element.__ref).toBeDefined()
85
+ })
86
+
87
+ it('merges options with UPDATE_DEFAULT_OPTIONS when exclude is missing', async () => {
88
+ await element.update({}, opts)
89
+ expect(opts.exclude).toBeDefined() // Ensure exclude is added
90
+ })
91
+
92
+ it('does not throw or modify opts when params is undefined', async () => {
93
+ await element.update(undefined, opts)
94
+ expect(opts).toEqual({
95
+ calleeElement: false,
96
+ cleanExec: true,
97
+ currentSnapshot: false,
98
+ exclude: [],
99
+ preventRecursive: false,
100
+ preventUpdate: [],
101
+ preventDefineUpdate: [],
102
+ stackChanges: false,
103
+ preventBeforeStateUpdateListener: false,
104
+ preventListeners: false,
105
+ preventStateUpdateListener: false
106
+ })
107
+ })
108
+
109
+ it('does not throw when opts is undefined', async () => {
110
+ await element.update({}, undefined)
111
+ expect(element.__ref).toBeDefined() // Ensure __ref is initialized
112
+ })
113
+
114
+ it('does not throw when opts is null', async () => {
115
+ await element.update({}, null)
116
+ expect(element.__ref).toBeDefined() // Ensure __ref is initialized
117
+ })
118
+
119
+ it('does not modify the params object', async () => {
120
+ params = { key: 'value' }
121
+ await element.update(params, opts)
122
+ expect(params).toEqual({ key: 'value' })
123
+ })
124
+
125
+ it('does modify opts when params is an empty object', async () => {
126
+ await element.update({}, opts)
127
+ expect(opts).toEqual({
128
+ calleeElement: false,
129
+ cleanExec: true,
130
+ currentSnapshot: false,
131
+ exclude: [],
132
+ preventRecursive: false,
133
+ stackChanges: false,
134
+ preventUpdate: [],
135
+ preventDefineUpdate: [],
136
+ preventBeforeStateUpdateListener: false,
137
+ preventListeners: false,
138
+ preventStateUpdateListener: false
139
+ })
140
+ })
141
+
142
+ it('moves regular properties to element.props', async () => {
143
+ params = { props: { title: 'Test', description: 'Content' } }
144
+ await element.update(params, opts)
145
+ expect(element.props).toEqual({
146
+ title: 'Test',
147
+ description: 'Content'
148
+ })
149
+ expect(element.title).toBeUndefined()
150
+ })
151
+
152
+ it('keeps element-rooted properties', async () => {
153
+ params = { Header: {}, Footer: {}, 0: 'index' }
154
+ await element.update(params, opts)
155
+ expect(element.Header).toBeDefined()
156
+ expect(element.Footer).toBeDefined()
157
+ expect(element['0']).toBe('index')
158
+ expect(element.props).toEqual({})
159
+ })
160
+
161
+ it('preserves built-in properties on element', async () => {
162
+ params = { props: { className: 'container', hidden: true } }
163
+ await element.update(params, opts)
164
+ expect(element.props.className).toBe('container')
165
+ expect(element.props.hidden).toBe(true)
166
+ expect(element.props).toEqual({ className: 'container', hidden: true })
167
+ })
168
+
169
+ it('moves element-like properties from props to root', async () => {
170
+ params = { props: { Header: {} } }
171
+ await element.update(params, opts)
172
+ expect(element.Header).toBeDefined()
173
+ expect(element.props.Header).toBeUndefined()
174
+ })
175
+
176
+ it('exits early when inheritStateUpdates returns false', async () => {
177
+ // Simulate inheritStateUpdates failure
178
+ element.__ref.__stateBlocked = true
179
+ await element.update({ props: { shouldChange: true } }, opts)
180
+
181
+ expect(element.props.shouldChange).toBe(true)
182
+ expect(element.__ref.__stateBlocked).toBe(true) // State remains blocked
183
+ })
184
+
185
+ it('exits early when checkIfOnUpdate fails', async () => {
186
+ // Force checkIfOnUpdate failure
187
+ element.parent.props.ifCondition = false
188
+ await element.update({ state: { newState: true } }, opts)
189
+
190
+ expect(element.state.newState).toBe(true)
191
+ })
192
+
193
+ it('updates props from parent key match', async () => {
194
+ element.parent.props.testKey = { inherited: true }
195
+ await element.update({}, opts)
196
+ expect(element.props.inherited).toBeUndefined()
197
+ })
198
+
199
+ it('updates props when functions exist in __props', async () => {
200
+ element.__ref.__props.push(() => 'dynamic')
201
+ await element.update({}, opts)
202
+ expect(element.props).toEqual(expect.any(Object)) // Props were processed
203
+ })
204
+
205
+ it('skips props update when preventPropsUpdate=true', async () => {
206
+ opts.preventPropsUpdate = true
207
+ opts.preventUpdateAfter = true
208
+ element.parent.props.testKey = { shouldExist: true }
209
+ await element.update({}, opts)
210
+ expect(element.props.shouldExist).toBeUndefined()
211
+ })
212
+
213
+ it('should not skips props update when preventPropsUpdate=false', async () => {
214
+ opts.preventPropsUpdate = false
215
+ opts.lazyLoad = true
216
+ opts.onEachUpdate = () => {
217
+ return true
218
+ }
219
+ element.parent.props.testKey = { shouldExist: true }
220
+ element.__ref.__propsStack = []
221
+ element.__ref.__if = true
222
+ element.off = { text: 'off' }
223
+ await element.update({}, opts)
224
+ expect(element.props.shouldExist).toBeUndefined()
225
+ })
226
+
227
+ it('should set preventUpdateAfterCount to 1 when is not a number', async () => {
228
+ opts.preventPropsUpdate = true
229
+ opts.preventUpdateAfter = 2
230
+ opts.preventUpdateAfterCount = undefined
231
+ element.parent.props.testKey = { shouldExist: true }
232
+ await element.update({}, opts)
233
+ expect(element.props.shouldExist).toBeUndefined()
234
+ })
235
+
236
+ it('returns element when beforeUpdate rejects', async () => {
237
+ // Simulate beforeUpdate rejection
238
+ element.props.onBeforeUpdate = () => false
239
+ const result = await element.update({}, opts)
240
+ expect(result).toBe(element)
241
+ })
242
+
243
+ it('processes parent.childProps', async () => {
244
+ element.parent.props.childProps = { global: true }
245
+ await element.update({}, opts)
246
+ expect(element.props.global).toBeUndefined()
247
+ })
248
+
249
+ it('processes function props', async () => {
250
+ await element.update({ props: { calc: () => 42 } }, opts)
251
+ expect(element.props.calc()).toBe(42)
252
+ })
253
+ })
package/children.js ADDED
@@ -0,0 +1,105 @@
1
+ 'use strict'
2
+
3
+ import {
4
+ concatAddExtends,
5
+ deepClone,
6
+ execPromise,
7
+ getChildStateInKey,
8
+ isArray,
9
+ isDefined,
10
+ isNot,
11
+ isNumber,
12
+ isObject,
13
+ isObjectLike,
14
+ isState,
15
+ isString,
16
+ matchesComponentNaming
17
+ } from '@domql/utils'
18
+
19
+ /**
20
+ * Apply data parameters on the DOM nodes
21
+ * this should only work if `showOnNode: true` is passed
22
+ */
23
+ export async function setChildren (param, element, opts) {
24
+ let { children, __ref: ref, state } = element
25
+
26
+ let { childrenAs } = element.props || {}
27
+ children =
28
+ (await execPromise(param, element, state)) ||
29
+ (await execPromise(children, element, state))
30
+
31
+ if (children) {
32
+ if (isState(children)) children = children.parse()
33
+
34
+ if (isString(children) || isNumber(children)) {
35
+ if (children === 'state') children = state.parse()
36
+ else {
37
+ const pathInState = getChildStateInKey(children, state)
38
+ if (pathInState) {
39
+ childrenAs = 'state'
40
+ children = getChildStateInKey(children, state) || { value: children }
41
+ } else {
42
+ children = { text: children }
43
+ }
44
+ }
45
+ }
46
+
47
+ if (isObject(children)) {
48
+ if (children.$$typeof) {
49
+ return element.call('renderReact', children, element)
50
+ }
51
+ children = Object.keys(children).map(v => {
52
+ const val = children[v]
53
+ if (matchesComponentNaming(v)) return concatAddExtends(v, val)
54
+ return val
55
+ })
56
+ }
57
+ }
58
+
59
+ if (!children || isNot(children)('array', 'object')) return
60
+
61
+ if (isArray(children) && children.find(v => v?.$$typeof)) {
62
+ const filterReact = children.filter(v => !v?.$$typeof)
63
+ if (filterReact.length !== children.length) {
64
+ const extractedReactComponents = children.filter(v => v?.$$typeof)
65
+ element.call('renderReact', extractedReactComponents, element)
66
+ }
67
+ children = filterReact
68
+ }
69
+
70
+ if (ref.__childrenCache) {
71
+ const equals =
72
+ JSON.stringify(children) === JSON.stringify(ref.__childrenCache) // make smarter diff
73
+ if (equals) {
74
+ ref.__noChildrenDifference = true
75
+ } else {
76
+ ref.__childrenCache = deepClone(children)
77
+ delete ref.__noChildrenDifference
78
+ }
79
+ } else {
80
+ ref.__childrenCache = deepClone(children)
81
+ }
82
+
83
+ if (isObject(children) || isArray(children)) {
84
+ children = deepClone(children)
85
+ }
86
+
87
+ const content = { tag: 'fragment' }
88
+
89
+ for (const key in children) {
90
+ const value = Object.hasOwnProperty.call(children, key) && children[key]
91
+ if (isDefined(value) && value !== null && value !== false) {
92
+ content[key] = isObjectLike(value)
93
+ ? childrenAs
94
+ ? { [childrenAs]: value }
95
+ : value
96
+ : childrenAs
97
+ ? { [childrenAs]: childrenAs === 'state' ? { value } : { text: value } }
98
+ : { text: value }
99
+ }
100
+ }
101
+
102
+ return content
103
+ }
104
+
105
+ export default setChildren