@domql/element 2.5.198 → 3.0.0

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 (150) 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 -255
  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 +74 -215
  34. package/dist/cjs/define.js +1 -2
  35. package/dist/cjs/index.js +3 -3
  36. package/dist/cjs/iterate.js +37 -30
  37. package/dist/cjs/methods/set.js +26 -25
  38. package/dist/cjs/methods/v2.js +7 -17
  39. package/dist/cjs/mixins/attr.js +7 -10
  40. package/dist/cjs/mixins/classList.js +8 -16
  41. package/dist/cjs/mixins/data.js +2 -4
  42. package/dist/cjs/mixins/html.js +2 -4
  43. package/dist/cjs/mixins/index.js +0 -4
  44. package/dist/cjs/mixins/registry.js +7 -67
  45. package/dist/cjs/mixins/scope.js +2 -3
  46. package/dist/cjs/mixins/state.js +4 -7
  47. package/dist/cjs/mixins/style.js +2 -4
  48. package/dist/cjs/mixins/text.js +5 -8
  49. package/dist/cjs/node.js +34 -30
  50. package/dist/cjs/set.js +112 -47
  51. package/dist/cjs/update.js +123 -92
  52. package/dist/cjs/utils/applyParam.js +3 -4
  53. package/dist/cjs/utils/index.js +8 -4
  54. package/dist/cjs/utils/onlyResolveExtends.js +14 -30
  55. package/dist/esm/__tests__/checkIfOnUpdate.test.js +73 -0
  56. package/dist/esm/__tests__/children.test.js +177 -0
  57. package/dist/esm/__tests__/define.test.js +53 -0
  58. package/dist/esm/__tests__/inheritStateUpdates.test.js +62 -0
  59. package/dist/esm/__tests__/renderElement.test.js +116 -0
  60. package/dist/esm/__tests__/resetElement.test.js +35 -0
  61. package/dist/esm/__tests__/set.test.js +256 -0
  62. package/dist/esm/__tests__/throughExecProps.test.js +62 -0
  63. package/dist/esm/__tests__/throughInitialDefine.test.js +79 -0
  64. package/dist/esm/__tests__/throughInitialExec.test.js +73 -0
  65. package/dist/esm/__tests__/throughUpdatedDefine.test.js +69 -0
  66. package/dist/esm/__tests__/throughUpdatedExec.test.js +84 -0
  67. package/dist/esm/__tests__/tree.test.js +11 -0
  68. package/dist/esm/__tests__/update.test.js +219 -0
  69. package/dist/esm/children.js +81 -0
  70. package/dist/esm/create.js +79 -226
  71. package/dist/esm/define.js +1 -2
  72. package/dist/esm/iterate.js +41 -33
  73. package/dist/esm/methods/set.js +5 -4
  74. package/dist/esm/methods/v2.js +7 -17
  75. package/dist/esm/mixins/attr.js +8 -11
  76. package/dist/esm/mixins/classList.js +8 -16
  77. package/dist/esm/mixins/data.js +3 -5
  78. package/dist/esm/mixins/html.js +2 -4
  79. package/dist/esm/mixins/index.js +0 -4
  80. package/dist/esm/mixins/registry.js +7 -67
  81. package/dist/esm/mixins/scope.js +2 -3
  82. package/dist/esm/mixins/state.js +5 -8
  83. package/dist/esm/mixins/style.js +2 -4
  84. package/dist/esm/mixins/text.js +6 -12
  85. package/dist/esm/node.js +25 -31
  86. package/dist/esm/set.js +112 -47
  87. package/dist/esm/update.js +127 -97
  88. package/dist/esm/utils/applyParam.js +3 -4
  89. package/dist/esm/utils/index.js +4 -3
  90. package/dist/esm/utils/onlyResolveExtends.js +22 -31
  91. package/iterate.js +44 -26
  92. package/methods/set.js +5 -4
  93. package/methods/v2.js +5 -4
  94. package/mixins/attr.js +13 -7
  95. package/mixins/classList.js +7 -2
  96. package/mixins/data.js +1 -1
  97. package/mixins/index.js +1 -6
  98. package/mixins/registry.js +6 -53
  99. package/mixins/scope.js +1 -1
  100. package/mixins/state.js +4 -5
  101. package/mixins/text.js +4 -7
  102. package/node.js +31 -28
  103. package/package.json +7 -6
  104. package/set.js +129 -41
  105. package/update.js +169 -89
  106. package/utils/applyParam.js +7 -4
  107. package/utils/index.js +1 -3
  108. package/utils/onlyResolveExtends.js +27 -16
  109. package/cache/index.js +0 -3
  110. package/cache/options.js +0 -4
  111. package/dist/cjs/cache/index.js +0 -24
  112. package/dist/cjs/cache/options.js +0 -26
  113. package/dist/cjs/extend.js +0 -85
  114. package/dist/cjs/methods/index.js +0 -353
  115. package/dist/cjs/mixins/content.js +0 -74
  116. package/dist/cjs/props/create.js +0 -98
  117. package/dist/cjs/props/ignore.js +0 -24
  118. package/dist/cjs/props/index.js +0 -21
  119. package/dist/cjs/props/inherit.js +0 -53
  120. package/dist/cjs/props/update.js +0 -37
  121. package/dist/cjs/utils/component.js +0 -77
  122. package/dist/cjs/utils/extendUtils.js +0 -142
  123. package/dist/cjs/utils/object.js +0 -179
  124. package/dist/cjs/utils/propEvents.js +0 -41
  125. package/dist/esm/cache/index.js +0 -4
  126. package/dist/esm/cache/options.js +0 -6
  127. package/dist/esm/extend.js +0 -71
  128. package/dist/esm/methods/index.js +0 -333
  129. package/dist/esm/mixins/content.js +0 -54
  130. package/dist/esm/props/create.js +0 -78
  131. package/dist/esm/props/ignore.js +0 -4
  132. package/dist/esm/props/index.js +0 -4
  133. package/dist/esm/props/inherit.js +0 -33
  134. package/dist/esm/props/update.js +0 -17
  135. package/dist/esm/utils/component.js +0 -65
  136. package/dist/esm/utils/extendUtils.js +0 -122
  137. package/dist/esm/utils/object.js +0 -159
  138. package/dist/esm/utils/propEvents.js +0 -21
  139. package/extend.js +0 -90
  140. package/methods/index.js +0 -317
  141. package/mixins/content.js +0 -55
  142. package/props/create.js +0 -87
  143. package/props/ignore.js +0 -3
  144. package/props/index.js +0 -6
  145. package/props/inherit.js +0 -35
  146. package/props/update.js +0 -17
  147. package/utils/component.js +0 -68
  148. package/utils/extendUtils.js +0 -134
  149. package/utils/object.js +0 -172
  150. package/utils/propEvents.js +0 -19
package/set.js CHANGED
@@ -1,79 +1,167 @@
1
1
  'use strict'
2
2
 
3
- import { deepContains, setContentKey } from '@domql/utils'
4
-
5
- import { OPTIONS } from './cache/options.js'
3
+ import { deepContains, execPromise, isFunction, OPTIONS } from '@domql/utils'
6
4
  import { create } from './create.js'
7
- import { registry } from './mixins/index.js'
8
- import { removeContent } from './mixins/content.js'
9
5
  import { triggerEventOn, triggerEventOnUpdate } from '@domql/event'
10
6
 
11
- export const resetElement = async (params, element, options) => {
12
- if (!options.preventRemove) removeContent(element, options)
7
+ export const setContentKey = (element, opts = {}) => {
13
8
  const { __ref: ref } = element
14
- await create(params, element, ref.contentElementKey || 'content', {
15
- ignoreChildExtend: true,
16
- ...registry.defaultOptions,
17
- ...OPTIONS.create,
18
- ...options
19
- })
9
+ const contentElementKey = opts.contentElementKey
10
+ if (!ref.contentElementKey || contentElementKey !== ref.contentElementKey) {
11
+ ref.contentElementKey = contentElementKey || 'content'
12
+ }
13
+ return ref.contentElementKey
20
14
  }
21
15
 
22
- export const reset = (options) => {
16
+ export const reset = async options => {
23
17
  const element = this
24
- create(element, element.parent, undefined, {
25
- ignoreChildExtend: true,
26
- ...registry.defaultOptions,
18
+ await create(element, element.parent, undefined, {
19
+ ignoreChildExtends: true,
20
+ ...OPTIONS.defaultOptions,
27
21
  ...OPTIONS.create,
28
22
  ...options
29
23
  })
30
24
  }
31
25
 
26
+ export const resetContent = async (params, element, opts) => {
27
+ const contentElementKey = setContentKey(element, opts)
28
+ if (element[contentElementKey]?.node) removeContent(element, opts)
29
+ const contentElem = await create(
30
+ params,
31
+ element,
32
+ contentElementKey || 'content',
33
+ {
34
+ ignoreChildExtends: true,
35
+ ...OPTIONS.defaultOptions,
36
+ ...OPTIONS.create,
37
+ ...opts
38
+ }
39
+ )
40
+ if (contentElementKey !== 'content') opts.contentElementKey = 'content' // reset to default
41
+ return contentElem
42
+ }
43
+
44
+ export const updateContent = async function (params, opts) {
45
+ const element = this
46
+ const contentElementKey = setContentKey(element, opts)
47
+ if (!element[contentElementKey]) return
48
+ if (element[contentElementKey].update) {
49
+ await element[contentElementKey].update(params, opts)
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Appends anything as content
55
+ * an original one as a child
56
+ */
57
+ export async function setContent (param, element, opts) {
58
+ const content = await execPromise(param, element)
59
+
60
+ if (content && element) {
61
+ set.call(element, content, opts)
62
+ }
63
+ }
64
+
65
+ export const removeContent = function (el, opts = {}) {
66
+ const element = el || this
67
+
68
+ const contentElementKey = setContentKey(element, opts)
69
+ if (opts.contentElementKey !== 'content') {
70
+ opts.contentElementKey = 'content'
71
+ }
72
+
73
+ const content = element[contentElementKey]
74
+ if (!content) return
75
+
76
+ // Handle fragment removal
77
+ if (content.tag === 'fragment' && content.__ref?.__children) {
78
+ // Remove all child nodes
79
+ content.__ref.__children.forEach(key => {
80
+ const child = content[key]
81
+ if (child.node && child.node.parentNode) {
82
+ child.node.parentNode.removeChild(child.node)
83
+ }
84
+ if (isFunction(child.remove)) {
85
+ child.remove()
86
+ }
87
+ })
88
+ } else {
89
+ // Handle regular element removal
90
+ if (content.node && content.node.parentNode) {
91
+ content.node.parentNode.removeChild(content.node)
92
+ }
93
+ if (isFunction(content.remove)) {
94
+ content.remove()
95
+ }
96
+ }
97
+
98
+ delete element[contentElementKey]
99
+ }
100
+
32
101
  export const set = async function (params, options = {}, el) {
33
102
  const element = el || this
34
103
  const { __ref: ref } = element
35
104
 
36
- const content = setContentKey(element, options)
105
+ const contentElementKey = setContentKey(element, options)
106
+ const content = element[contentElementKey]
37
107
  const __contentRef = content && content.__ref
38
108
  const lazyLoad = element.props && element.props.lazyLoad
39
109
 
40
- const hasCollection = element.$collection || element.$stateCollection || element.$propsCollection
41
- if (options.preventContentUpdate === true && !hasCollection) return
110
+ const hasChildren = element.children
111
+ if (options.preventContentUpdate === true && !hasChildren) return
112
+
113
+ const childHasChanged = !ref.__noChildrenDifference
114
+ const childrenIsDifferentFromCache =
115
+ childHasChanged &&
116
+ __contentRef &&
117
+ Object.keys(params).length === Object.keys(content).length &&
118
+ deepContains(params, content)
42
119
 
43
- if (ref.__noCollectionDifference || (__contentRef && __contentRef.__cached && deepContains(params, content))) {
120
+ if (content?.update && !childHasChanged && !childrenIsDifferentFromCache) {
44
121
  if (!options.preventBeforeUpdateListener && !options.preventListeners) {
45
- const beforeUpdateReturns = await triggerEventOnUpdate('beforeUpdate', params, element, options)
122
+ const beforeUpdateReturns = await triggerEventOnUpdate(
123
+ 'beforeUpdate',
124
+ params,
125
+ element,
126
+ options
127
+ )
46
128
  if (beforeUpdateReturns === false) return element
47
129
  }
48
- if (content?.update) content.update()
49
- if (!options.preventUpdateListener) await triggerEventOn('update', element, options)
130
+ await content.update(params)
131
+ if (!options.preventUpdateListener && !options.preventListeners) {
132
+ await triggerEventOn('update', element, options)
133
+ }
50
134
  return
51
135
  }
52
136
 
53
- if (params) {
54
- let { childExtend, props } = params
55
- if (!props) props = params.props = {}
56
- if (!childExtend && element.childExtend) {
57
- params.childExtend = element.childExtend
58
- props.ignoreChildExtend = true
137
+ if (!params) return element
138
+
139
+ let { childExtends, props, tag } = params
140
+ if (!props) props = params.props = {}
141
+
142
+ if (tag === 'fragment') {
143
+ if (!childExtends && element.childExtends) {
144
+ params.childExtends = element.childExtends
145
+ props.ignoreChildExtends = true
59
146
  }
147
+
60
148
  if (!props?.childProps && element.props?.childProps) {
61
149
  props.childProps = element.props.childProps
62
150
  props.ignoreChildProps = true
63
151
  }
64
-
65
- if (lazyLoad) {
66
- window.requestAnimationFrame(async () => {
67
- await resetElement(params, element, options)
68
- // handle lazy load
69
- if (!options.preventUpdateListener) {
70
- triggerEventOn('lazyLoad', element, options)
71
- }
72
- })
73
- } else await resetElement(params, element, options)
74
152
  }
75
153
 
76
- return element
154
+ if (lazyLoad) {
155
+ window.requestAnimationFrame(async () => {
156
+ await resetContent(params, element, options)
157
+ // handle lazy load
158
+ if (!options.preventUpdateListener) {
159
+ await triggerEventOn('lazyLoad', element, options)
160
+ }
161
+ })
162
+ } else {
163
+ await resetContent(params, element, options)
164
+ }
77
165
  }
78
166
 
79
167
  export default set
package/update.js CHANGED
@@ -10,27 +10,31 @@ import {
10
10
  isString,
11
11
  isUndefined,
12
12
  merge,
13
- isVariant,
14
13
  overwriteDeep,
15
- createSnapshotId,
16
- deepClone
14
+ deepClone,
15
+ propertizeElement,
16
+ isMethod,
17
+ findInheritedState,
18
+ deepMerge,
19
+ OPTIONS,
20
+ updateProps,
21
+ captureSnapshot
17
22
  } from '@domql/utils'
18
23
 
19
24
  import { applyEvent, triggerEventOn, triggerEventOnUpdate } from '@domql/event'
20
- import { isMethod } from './methods/index.js'
21
- import { updateProps } from './props/index.js'
22
- import { createState, findInheritedState } from '@domql/state'
25
+ import { createState } from '@domql/state'
23
26
 
24
27
  import { create } from './create.js'
25
- import { throughExecProps, throughUpdatedDefine, throughUpdatedExec } from './iterate.js'
28
+ import {
29
+ throughExecProps,
30
+ throughUpdatedDefine,
31
+ throughUpdatedExec
32
+ } from './iterate.js'
26
33
  import { REGISTRY } from './mixins/index.js'
27
34
  import { applyParam } from './utils/applyParam.js'
28
- import { OPTIONS } from './cache/options.js'
29
- import { METHODS_EXL, deepMerge } from './utils/index.js' // old utils (current)
30
-
31
- const snapshot = {
32
- snapshotId: createSnapshotId
33
- }
35
+ import { METHODS_EXL } from './utils/index.js' // old utils (current)
36
+ import { setContent } from './set.js'
37
+ import setChildren from './children.js'
34
38
 
35
39
  const UPDATE_DEFAULT_OPTIONS = {
36
40
  stackChanges: false,
@@ -38,51 +42,76 @@ const UPDATE_DEFAULT_OPTIONS = {
38
42
  preventRecursive: false,
39
43
  currentSnapshot: false,
40
44
  calleeElement: false,
41
- excludes: METHODS_EXL
45
+ exclude: METHODS_EXL
42
46
  }
43
47
 
44
48
  export const update = async function (params = {}, opts) {
45
49
  const calleeElementCache = opts?.calleeElement
46
- const options = deepClone(isObject(opts) ? deepMerge(opts, UPDATE_DEFAULT_OPTIONS) : UPDATE_DEFAULT_OPTIONS, { exclude: ['calleeElement'] })
50
+ const options = deepClone(
51
+ isObject(opts)
52
+ ? deepMerge(opts, UPDATE_DEFAULT_OPTIONS)
53
+ : UPDATE_DEFAULT_OPTIONS,
54
+ { exclude: ['calleeElement'] }
55
+ )
47
56
  options.calleeElement = calleeElementCache
48
57
  const element = this
49
- const { parent, node, key } = element
50
- const { excludes, preventInheritAtCurrentState } = options
51
58
 
52
59
  let ref = element.__ref
53
60
  if (!ref) ref = element.__ref = {}
54
- const [snapshotOnCallee, calleeElement, snapshotHasUpdated] = captureSnapshot(element, options)
61
+ const [snapshotOnCallee, calleeElement, snapshotHasUpdated] = captureSnapshot(
62
+ element,
63
+ options
64
+ )
65
+
55
66
  if (snapshotHasUpdated) return
56
67
 
57
- if (!options.preventListeners) await triggerEventOnUpdate('startUpdate', params, element, options)
68
+ if (!options.preventListeners) {
69
+ await triggerEventOnUpdate('startUpdate', params, element, options)
70
+ }
71
+
72
+ const { parent, node, key } = element
73
+ const { exclude, preventInheritAtCurrentState } = options
58
74
 
59
- if (preventInheritAtCurrentState && preventInheritAtCurrentState.__element === element) return
60
- if (!excludes) merge(options, UPDATE_DEFAULT_OPTIONS)
75
+ if (
76
+ preventInheritAtCurrentState &&
77
+ preventInheritAtCurrentState.__element === element
78
+ ) {
79
+ return
80
+ }
81
+ if (!exclude) merge(options, UPDATE_DEFAULT_OPTIONS)
61
82
 
62
83
  if (isString(params) || isNumber(params)) {
63
84
  params = { text: params }
64
85
  }
65
86
 
87
+ params = propertizeElement(params)
88
+
66
89
  const inheritState = await inheritStateUpdates(element, options)
67
90
  if (inheritState === false) return
68
91
 
69
- const ifFails = checkIfOnUpdate(element, parent, options)
92
+ const ifFails = await checkIfOnUpdate(element, parent, options)
70
93
  if (ifFails) return
71
94
 
72
95
  if (ref.__if && !options.preventPropsUpdate) {
73
- const hasParentProps = parent.props && (parent.props[key] || parent.props.childProps)
74
- const hasFunctionInProps = ref.__props.filter(v => isFunction(v))
96
+ const hasParentProps =
97
+ parent.props && (parent.props[key] || parent.props.childProps)
98
+ const hasFunctionInProps = ref.__propsStack.filter(v => isFunction(v))
75
99
  const props = params.props || hasParentProps || hasFunctionInProps.length
76
100
  if (props) updateProps(props, element, parent)
77
101
  }
78
102
 
79
103
  if (!options.preventBeforeUpdateListener && !options.preventListeners) {
80
- const beforeUpdateReturns = await triggerEventOnUpdate('beforeUpdate', params, element, options)
104
+ const beforeUpdateReturns = await triggerEventOnUpdate(
105
+ 'beforeUpdate',
106
+ params,
107
+ element,
108
+ options
109
+ )
81
110
  if (beforeUpdateReturns === false) return element
82
111
  }
83
112
 
84
113
  // apply new updates
85
- overwriteDeep(element, params, { exclude: METHODS_EXL })
114
+ overwriteDeep(element, params)
86
115
 
87
116
  // exec updates
88
117
  throughExecProps(element)
@@ -90,7 +119,7 @@ export const update = async function (params = {}, opts) {
90
119
  throughUpdatedDefine(element)
91
120
 
92
121
  if (!options.isForced && !options.preventListeners) {
93
- triggerEventOn('beforeClassAssign', element, options)
122
+ await triggerEventOn('beforeClassAssign', element, options)
94
123
  }
95
124
 
96
125
  if (!ref.__if) return false
@@ -100,14 +129,25 @@ export const update = async function (params = {}, opts) {
100
129
  }
101
130
 
102
131
  const {
103
- preventUpdate, preventDefineUpdate, preventContentUpdate, preventStateUpdate,
104
- preventRecursive, preventUpdateListener, preventUpdateAfter, preventUpdateAfterCount
132
+ preventUpdate,
133
+ preventDefineUpdate,
134
+ preventContentUpdate,
135
+ preventStateUpdate,
136
+ preventRecursive,
137
+ preventUpdateListener,
138
+ preventUpdateAfter,
139
+ preventUpdateAfterCount
105
140
  } = options
106
141
 
107
142
  if (preventUpdateAfter) {
108
- if (isNumber(preventUpdateAfterCount) && preventUpdateAfter <= preventUpdateAfterCount) return
109
- else if (options.preventUpdateAfterCount === undefined) options.preventUpdateAfterCount = 1
110
- else options.preventUpdateAfterCount++
143
+ if (
144
+ isNumber(preventUpdateAfterCount) &&
145
+ preventUpdateAfter <= preventUpdateAfterCount
146
+ ) {
147
+ return
148
+ } else if (options.preventUpdateAfterCount === undefined) {
149
+ options.preventUpdateAfterCount = 1
150
+ } else options.preventUpdateAfterCount++
111
151
  }
112
152
 
113
153
  for (const param in element) {
@@ -115,10 +155,10 @@ export const update = async function (params = {}, opts) {
115
155
 
116
156
  if (!Object.hasOwnProperty.call(element, param)) continue
117
157
 
118
- const isInPreventUpdate = isArray(preventUpdate) && preventUpdate.includes(param)
119
- const isInPreventDefineUpdate = isArray(preventDefineUpdate) && preventDefineUpdate.includes(param)
120
-
121
- const hasCollection = element.$collection || element.$stateCollection || element.$propsCollection
158
+ const isInPreventUpdate =
159
+ isArray(preventUpdate) && preventUpdate.includes(param)
160
+ const isInPreventDefineUpdate =
161
+ isArray(preventDefineUpdate) && preventDefineUpdate.includes(param)
122
162
 
123
163
  if (
124
164
  isUndefined(prop) ||
@@ -126,17 +166,20 @@ export const update = async function (params = {}, opts) {
126
166
  isInPreventDefineUpdate ||
127
167
  preventDefineUpdate === true ||
128
168
  preventDefineUpdate === param ||
129
- (preventContentUpdate && param === 'content' && !hasCollection) ||
130
169
  (preventStateUpdate && param) === 'state' ||
131
- isMethod(param, element) || isObject(REGISTRY[param]) || isVariant(param)
132
- ) continue
170
+ isMethod(param, element) ||
171
+ isObject(REGISTRY[param])
172
+ ) {
173
+ continue
174
+ }
133
175
 
134
176
  if (preventStateUpdate === 'once') options.preventStateUpdate = false
135
177
 
136
- const isElement = applyParam(param, element, options)
178
+ const isElement = await applyParam(param, element, options)
137
179
  if (isElement) {
138
180
  const { hasDefine, hasContextDefine } = isElement
139
- const canUpdate = isObject(prop) && !hasDefine && !hasContextDefine && !preventRecursive
181
+ const canUpdate =
182
+ isObject(prop) && !hasDefine && !hasContextDefine && !preventRecursive
140
183
  if (!canUpdate) continue
141
184
 
142
185
  const lazyLoad = element.props.lazyLoad || options.lazyLoad
@@ -145,50 +188,54 @@ export const update = async function (params = {}, opts) {
145
188
  options.onEachUpdate(param, element, element.state, element.context)
146
189
  }
147
190
 
148
- const childUpdateCall = () => update.call(prop, params[prop], {
149
- ...options,
150
- currentSnapshot: snapshotOnCallee,
151
- calleeElement
152
- })
153
-
154
- lazyLoad ? window.requestAnimationFrame(() => { // eslint-disable-line
155
- childUpdateCall()
156
- // handle lazy load
157
- if (!options.preventUpdateListener) {
158
- triggerEventOn('lazyLoad', element, options)
159
- }
160
- }) : childUpdateCall()
191
+ const childUpdateCall = async () =>
192
+ await update.call(prop, params[prop], {
193
+ ...options,
194
+ currentSnapshot: snapshotOnCallee,
195
+ calleeElement
196
+ })
197
+
198
+ if (lazyLoad) {
199
+ window.requestAnimationFrame(async () => {
200
+ // eslint-disable-line
201
+ await childUpdateCall()
202
+ // handle lazy load
203
+ if (!options.preventUpdateListener) {
204
+ await triggerEventOn('lazyLoad', element, options)
205
+ }
206
+ })
207
+ } else await childUpdateCall()
161
208
  }
162
209
  }
163
210
 
164
- if (!preventUpdateListener) triggerEventOn('update', element, options)
165
- }
166
-
167
- const captureSnapshot = (element, options) => {
168
- const ref = element.__ref
211
+ if (!preventContentUpdate) {
212
+ const children = params.children || element.children
213
+ const content = children
214
+ ? await setChildren(children, element, opts)
215
+ : element.children || params.content
169
216
 
170
- const { currentSnapshot, calleeElement } = options
171
- const isCallee = calleeElement === element
172
- if (!calleeElement || isCallee) {
173
- const createdStanpshot = snapshot.snapshotId()
174
- ref.__currentSnapshot = createdStanpshot
175
- return [createdStanpshot, element]
217
+ if (content) {
218
+ await setContent(content, element, options)
219
+ }
176
220
  }
177
221
 
178
- const snapshotOnCallee = calleeElement.__ref.__currentSnapshot
179
-
180
- if (currentSnapshot < snapshotOnCallee) {
181
- return [snapshotOnCallee, calleeElement, true]
222
+ if (!preventUpdateListener) {
223
+ await triggerEventOn('update', element, options)
182
224
  }
183
-
184
- return [snapshotOnCallee, calleeElement]
185
225
  }
186
226
 
187
- const checkIfOnUpdate = (element, parent, options) => {
188
- if ((!isFunction(element.if) && !isFunction(element.props?.if)) || !parent) return
227
+ const checkIfOnUpdate = async (element, parent, options) => {
228
+ if ((!isFunction(element.if) && !isFunction(element.props?.if)) || !parent) {
229
+ return
230
+ }
189
231
 
190
232
  const ref = element.__ref
191
- const ifPassed = (element.if || element.props?.if)(element, element.state, element.context, options)
233
+ const ifPassed = (element.if || element.props?.if)(
234
+ element,
235
+ element.state,
236
+ element.context,
237
+ options
238
+ )
192
239
  const itWasFalse = ref.__if !== true
193
240
 
194
241
  if (ifPassed) {
@@ -196,7 +243,7 @@ const checkIfOnUpdate = (element, parent, options) => {
196
243
  if (itWasFalse) {
197
244
  delete element.__hash
198
245
  delete element.__text
199
- delete element.extend
246
+ delete element.extends
200
247
  if (!ref.__hasRootState) {
201
248
  delete element.state
202
249
  }
@@ -214,9 +261,11 @@ const checkIfOnUpdate = (element, parent, options) => {
214
261
 
215
262
  const contentKey = ref.contentElementKey
216
263
 
217
- if (element.$collection || element.$stateCollection || element.$propsCollection) {
264
+ if (element.children) {
218
265
  element.removeContent()
219
- } else if (element[contentKey]?.parseDeep) element[contentKey] = element[contentKey].parseDeep()
266
+ } else if (element[contentKey]?.parseDeep) {
267
+ element[contentKey] = element[contentKey].parseDeep()
268
+ }
220
269
 
221
270
  const previousElement = element.previousElement()
222
271
  const previousNode = previousElement?.node // document.body.contains(previousElement.node)
@@ -234,10 +283,24 @@ const checkIfOnUpdate = (element, parent, options) => {
234
283
 
235
284
  delete element.__ref
236
285
  delete element.parent
237
- const createdElement = create(element, parent, element.key, OPTIONS.create, attachOptions)
286
+ const createdElement = await create(
287
+ element,
288
+ parent,
289
+ element.key,
290
+ OPTIONS.create,
291
+ attachOptions
292
+ )
238
293
  // check preventUpdate for an array (Line: 87)
239
- if (options.preventUpdate !== true && element.on && isFunction(element.on.update)) {
240
- applyEvent(element.on.update, createdElement, createdElement.state)
294
+ if (
295
+ options.preventUpdate !== true &&
296
+ element.on &&
297
+ isFunction(element.on.update)
298
+ ) {
299
+ await applyEvent(
300
+ element.on.update,
301
+ createdElement,
302
+ createdElement.state
303
+ )
241
304
  }
242
305
  return createdElement
243
306
  }
@@ -248,7 +311,7 @@ const checkIfOnUpdate = (element, parent, options) => {
248
311
  }
249
312
 
250
313
  /**
251
- * Inherit state updates for a given element based on the specified options.
314
+ * Inherit state updates for a given element when state is inherited.
252
315
  *
253
316
  * @param {Object} element - The element to inherit state updates for.
254
317
  * @param {Object} options - Configuration options for state update inheritance.
@@ -265,7 +328,8 @@ const inheritStateUpdates = async (element, options) => {
265
328
  const { __ref: ref } = element
266
329
  const stateKey = ref.__state
267
330
  const { parent, state } = element
268
- const { preventUpdateTriggerStateUpdate, isHoisted, execStateFunction } = options
331
+ const { preventUpdateTriggerStateUpdate, isHoisted, execStateFunction } =
332
+ options
269
333
 
270
334
  if (preventUpdateTriggerStateUpdate) return
271
335
 
@@ -276,10 +340,16 @@ const inheritStateUpdates = async (element, options) => {
276
340
  }
277
341
 
278
342
  // If state is function, decide execution and apply setting a current state
279
- const shouldForceFunctionState = isFunction(stateKey) && !isHoisted && execStateFunction
343
+ const shouldForceFunctionState =
344
+ isFunction(stateKey) && !isHoisted && execStateFunction
280
345
  if (shouldForceFunctionState) {
281
346
  const execState = exec(stateKey, element)
282
- state.set(execState, { ...options, preventUpdate: true, preventStateUpdateListener: false, updatedByStateFunction: true })
347
+ state.set(execState, {
348
+ ...options,
349
+ preventUpdate: true,
350
+ preventStateUpdateListener: false,
351
+ updatedByStateFunction: true
352
+ })
283
353
  return
284
354
  }
285
355
 
@@ -289,22 +359,32 @@ const inheritStateUpdates = async (element, options) => {
289
359
 
290
360
  // Trigger on.beforeStateUpdate event
291
361
  if (!options.preventBeforeStateUpdateListener && !options.preventListeners) {
292
- const initStateReturns = await triggerEventOnUpdate('beforeStateUpdate', keyInParentState, element, options)
362
+ const initStateReturns = await triggerEventOnUpdate(
363
+ 'beforeStateUpdate',
364
+ keyInParentState,
365
+ element,
366
+ options
367
+ )
293
368
  if (initStateReturns === false) return element
294
369
  }
295
370
 
296
371
  // Recreate the state again
297
- const newState = createStateUpdate(element, parent, options)
372
+ const newState = await createStateUpdate(element, parent, options)
298
373
 
299
374
  // Trigger on.stateUpdate event
300
375
  if (!options.preventStateUpdateListener && !options.preventListeners) {
301
- await triggerEventOnUpdate('stateUpdate', newState.parse(), element, options)
376
+ await triggerEventOnUpdate(
377
+ 'stateUpdate',
378
+ newState.parse(),
379
+ element,
380
+ options
381
+ )
302
382
  }
303
383
  }
304
384
 
305
- const createStateUpdate = (element, parent, options) => {
385
+ const createStateUpdate = async (element, parent, options) => {
306
386
  const __stateChildren = element.state.__children
307
- const newState = createState(element, parent)
387
+ const newState = await createState(element, parent)
308
388
  element.state = newState
309
389
  for (const child in __stateChildren) {
310
390
  // check this for inherited states
@@ -3,14 +3,15 @@
3
3
  import { isFunction } from '@domql/utils'
4
4
  import { REGISTRY } from '../mixins/index.js'
5
5
 
6
- export const applyParam = (param, element, options) => {
6
+ export const applyParam = async (param, element, options) => {
7
7
  const { node, context, __ref: ref } = element
8
8
  const prop = element[param]
9
9
 
10
10
  const { onlyUpdate } = options
11
11
 
12
12
  const DOMQLProperty = REGISTRY[param]
13
- const DOMQLPropertyFromContext = context && context.registry && context.registry[param]
13
+ const DOMQLPropertyFromContext =
14
+ context && context.registry && context.registry[param]
14
15
  const isGlobalTransformer = DOMQLPropertyFromContext || DOMQLProperty
15
16
 
16
17
  const hasDefine = element.define && element.define[param]
@@ -18,11 +19,13 @@ export const applyParam = (param, element, options) => {
18
19
 
19
20
  if (!ref.__if) return
20
21
 
21
- const hasOnlyUpdate = onlyUpdate ? (onlyUpdate === param || element.lookup(onlyUpdate)) : true
22
+ const hasOnlyUpdate = onlyUpdate
23
+ ? onlyUpdate === param || element.lookup(onlyUpdate)
24
+ : true
22
25
 
23
26
  if (isGlobalTransformer && !hasContextDefine && hasOnlyUpdate) {
24
27
  if (isFunction(isGlobalTransformer)) {
25
- isGlobalTransformer(prop, element, node, options)
28
+ await isGlobalTransformer(prop, element, node, options)
26
29
  return
27
30
  }
28
31
  }
package/utils/index.js CHANGED
@@ -1,5 +1,3 @@
1
1
  'use strict'
2
2
 
3
- export * from './object.js'
4
- export * from './extendUtils.js'
5
- export * from './component.js'
3
+ export const METHODS_EXL = [] // this is needed because of unit tests