@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
package/mixins/index.js CHANGED
@@ -2,20 +2,15 @@
2
2
 
3
3
  import { attr } from './attr.js'
4
4
  import { applyClasslist } from './classList.js'
5
- import { setContent } from './content.js'
6
5
  import { data } from './data.js'
7
6
  import { html } from './html.js'
8
7
  import { style } from './style.js'
9
8
  import { text } from './text.js'
10
9
  import { state } from './state.js'
11
10
  import { scope } from './scope.js'
12
- import { REGISTRY } from './registry.js'
13
-
14
- export { REGISTRY as registry }
15
- export { applyClasslist as classList }
16
- export { setContent as content }
17
11
 
18
12
  export {
13
+ applyClasslist as classList,
19
14
  attr,
20
15
  data,
21
16
  style,
@@ -2,7 +2,6 @@
2
2
 
3
3
  import attr from './attr.js'
4
4
  import { classList } from './classList.js'
5
- import content from './content.js'
6
5
  import data from './data.js'
7
6
  import html from './html.js'
8
7
  import scope from './scope.js'
@@ -15,79 +14,33 @@ export const REGISTRY = {
15
14
  style,
16
15
  text,
17
16
  html,
18
- content,
19
17
  data,
20
18
  class: classList,
21
19
  state,
22
20
  scope,
23
-
24
21
  deps: (param, el) => param || el.parent.deps,
25
22
 
26
- extend: {},
27
- childExtend: {},
28
- childExtendRecursive: {},
23
+ extends: {},
24
+ children: {},
25
+ content: {},
26
+ childExtends: {},
27
+ childExtendsRecursive: {},
29
28
  props: {},
30
- path: {},
31
29
  if: {},
32
30
  define: {},
33
- transform: {},
34
31
  __name: {},
35
32
  __ref: {},
36
33
  __hash: {},
37
34
  __text: {},
38
- nextElement: {},
39
- previousElement: {},
40
35
  key: {},
41
36
  tag: {},
42
37
  query: {},
43
38
  parent: {},
44
39
  node: {},
45
- set: {},
46
- reset: {},
47
- update: {},
48
- error: {},
49
- warn: {},
50
- call: {},
51
- setProps: {},
52
- remove: {},
53
- updateContent: {},
54
- removeContent: {},
55
40
  variables: {},
56
- lookup: {},
57
- lookdown: {},
58
- getRef: {},
59
- getPath: {},
60
- lookdownAll: {},
61
- setNodeStyles: {},
62
- spotByPath: {},
63
- keys: {},
64
- log: {},
65
- parse: {},
66
- parseDeep: {},
67
41
  on: {},
68
42
  component: {},
69
- context: {},
70
- $collection: {},
71
- $stateCollection: {},
72
- $propsCollection: {},
73
- $setCollection: {},
74
- $setStateCollection: {},
75
- $setPropsCollection: {}
43
+ context: {}
76
44
  }
77
45
 
78
46
  export default REGISTRY
79
-
80
- // List of keys for .parse() and .parseDeep() to include in the result.
81
- // Keys not in the array are excluded.
82
- export const parseFilters = {
83
- elementKeys: [
84
- 'tag', 'text', 'style', 'attr', 'class', 'state', 'props',
85
- 'data', 'content', 'html', 'on', 'key', 'extend', 'childExtend',
86
- 'childExtendRecursive', 'scope', 'query',
87
- '$collection', '$stateCollection', '$propsCollection'
88
- ],
89
- propsKeys: ['__element', 'update'],
90
- stateKeys: []
91
- }
92
-
93
- export const collectionFilters = ['$collection', '$stateCollection', '$propsCollection']
package/mixins/scope.js CHANGED
@@ -6,7 +6,7 @@ import { isFunction, isObject } from '@domql/utils'
6
6
  * Apply data parameters on the DOM nodes
7
7
  * this should only work if `showOnNode: true` is passed
8
8
  */
9
- export function scope (params, element, node) {
9
+ export async function scope (params, element, node) {
10
10
  if (!isObject(params)) return
11
11
 
12
12
  // Apply data params on node
package/mixins/state.js CHANGED
@@ -1,14 +1,13 @@
1
1
  'use strict'
2
2
 
3
- import { IGNORE_STATE_PARAMS } from '@domql/state'
4
- import { exec, isObject } from '@domql/utils'
3
+ import { execPromise, isObject, STATE_METHODS } from '@domql/utils'
5
4
 
6
- export function state (params, element, node) {
7
- const state = exec(params, element)
5
+ export async function state (params, element, node) {
6
+ const state = await execPromise(params, element)
8
7
 
9
8
  if (isObject(state)) {
10
9
  for (const param in state) {
11
- if (IGNORE_STATE_PARAMS.includes(param)) continue
10
+ if (STATE_METHODS.includes(param)) continue
12
11
  if (!Object.hasOwnProperty.call(state, param)) continue
13
12
  // element.state[param] = exec(state[param], element)
14
13
  }
package/mixins/text.js CHANGED
@@ -1,17 +1,14 @@
1
1
  'use strict'
2
2
 
3
3
  import { create } from '../create.js'
4
- import {
5
- exec,
6
- isString
7
- } from '@domql/utils'
4
+ import { exec, isString } from '@domql/utils'
8
5
 
9
6
  /**
10
7
  * Creates a text node and appends into
11
8
  * an original one as a child
12
9
  */
13
- export function text (param, element, node) {
14
- let prop = exec(param, element)
10
+ export async function text (param, element, node) {
11
+ let prop = exec(param || element.props.text, element)
15
12
  if (isString(prop) && prop.includes('{{')) {
16
13
  prop = element.call('replaceLiteralsWithObjectFields', prop)
17
14
  }
@@ -22,7 +19,7 @@ export function text (param, element, node) {
22
19
  if (element.__text.text === prop) return
23
20
  element.__text.text = prop
24
21
  if (element.__text.node) element.__text.node.nodeValue = prop
25
- } else create({ tag: 'string', text: prop }, element, '__text')
22
+ } else await create({ tag: 'string', text: prop }, element, '__text')
26
23
  }
27
24
  }
28
25
 
package/node.js CHANGED
@@ -1,9 +1,8 @@
1
1
  'use strict'
2
2
 
3
- import { exec, isFunction, isObject, isUndefined, isVariant } from '@domql/utils'
3
+ import { isFunction, isMethod, isObject, isUndefined } from '@domql/utils'
4
4
  import { applyEventsOnNode, triggerEventOn } from '@domql/event'
5
5
  import { cacheNode } from '@domql/render'
6
- import { isMethod } from './methods/index.js'
7
6
  import { create } from './create.js'
8
7
 
9
8
  import {
@@ -13,79 +12,75 @@ import {
13
12
  } from './iterate.js'
14
13
  import { REGISTRY } from './mixins/index.js'
15
14
  import { applyParam } from './utils/applyParam.js'
16
- import { propagateEventsFromProps } from './utils/propEvents.js'
15
+ import setChildren from './children.js'
16
+ import { setContent } from './set.js'
17
17
  // import { defineSetter } from './methods'
18
18
 
19
19
  const ENV = process.env.NODE_ENV
20
20
 
21
- export const createNode = async (element, options) => {
21
+ export const createNode = async (element, opts) => {
22
22
  // create and assign a node
23
23
  let { node, tag, __ref: ref } = element
24
24
 
25
+ if (!ref.__if) return element
26
+
25
27
  let isNewNode
26
28
 
27
29
  if (!node) {
28
30
  isNewNode = true
29
31
 
30
- if (!ref.__if) return element
31
-
32
32
  if (tag === 'shadow') {
33
33
  node = element.node = element.parent.node.attachShadow({ mode: 'open' })
34
34
  } else node = element.node = cacheNode(element)
35
35
 
36
36
  // trigger `on.attachNode`
37
- triggerEventOn('attachNode', element, options)
37
+ await triggerEventOn('attachNode', element, opts)
38
38
  }
39
39
  // node.dataset // .key = element.key
40
40
 
41
- if (ENV === 'test' || ENV === 'development' || options.alowRefReference) {
41
+ if (ENV === 'test' || ENV === 'development' || opts.alowRefReference) {
42
42
  node.ref = element
43
43
  if (isFunction(node.setAttribute)) node.setAttribute('key', element.key)
44
44
  }
45
45
 
46
46
  // iterate through exec props
47
- throughExecProps(element)
47
+ await throughExecProps(element)
48
48
 
49
49
  // iterate through define
50
- throughInitialDefine(element)
50
+ await throughInitialDefine(element)
51
51
 
52
52
  // iterate through exec
53
- throughInitialExec(element)
54
-
55
- if (element.tag !== 'string' && element.tag !== 'fragment') {
56
- propagateEventsFromProps(element)
53
+ await throughInitialExec(element)
57
54
 
58
- if (isNewNode && isObject(element.on)) {
59
- applyEventsOnNode(element, options)
60
- }
61
- }
55
+ await applyEventsOnNode(element, { isNewNode, ...opts })
62
56
 
63
57
  for (const param in element) {
64
58
  const value = element[param]
65
59
 
66
- if (!Object.hasOwnProperty.call(element, param)) continue
67
-
68
60
  if (
61
+ !Object.hasOwnProperty.call(element, param) ||
69
62
  isUndefined(value) ||
70
63
  isMethod(param, element) ||
71
- isVariant(param) ||
72
64
  isObject(REGISTRY[param])
73
- ) continue
65
+ ) {
66
+ continue
67
+ }
74
68
 
75
- const isElement = applyParam(param, element, options)
69
+ const isElement = await applyParam(param, element, opts)
76
70
  if (isElement) {
77
71
  const { hasDefine, hasContextDefine } = isElement
78
72
  if (element[param] && !hasDefine && !hasContextDefine) {
79
73
  const createAsync = async () => {
80
- await create(exec(value, element), element, param, options)
74
+ await create(value, element, param, opts)
81
75
  }
82
76
 
83
- if ((element.props && element.props.lazyLoad) || options.lazyLoad) {
77
+ // TODO: test this with promise
78
+ // handle lazy load
79
+ if ((element.props && element.props.lazyLoad) || opts.lazyLoad) {
84
80
  window.requestAnimationFrame(async () => {
85
81
  await createAsync()
86
- // handle lazy load
87
- if (!options.preventUpdateListener) {
88
- triggerEventOn('lazyLoad', element, options)
82
+ if (!opts.preventUpdateListener) {
83
+ await triggerEventOn('lazyLoad', element, opts)
89
84
  }
90
85
  })
91
86
  } else await createAsync()
@@ -93,6 +88,14 @@ export const createNode = async (element, options) => {
93
88
  }
94
89
  }
95
90
 
91
+ const content = element.children
92
+ ? await setChildren(element.children, element, opts)
93
+ : element.content || element.content
94
+
95
+ if (content) {
96
+ await setContent(content, element, opts)
97
+ }
98
+
96
99
  // node.dataset.key = key
97
100
  return element
98
101
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@domql/element",
3
- "version": "2.5.200",
3
+ "version": "3.0.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "module": "index.js",
@@ -27,12 +27,13 @@
27
27
  "prepublish": "rimraf -I dist && npm run build && npm run copy:package:cjs"
28
28
  },
29
29
  "dependencies": {
30
- "@domql/event": "^2.5.200",
31
- "@domql/render": "^2.5.200",
32
- "@domql/state": "^2.5.200",
33
- "@domql/utils": "^2.5.200"
30
+ "@domql/event": "^3.0.1",
31
+ "@domql/render": "^3.0.1",
32
+ "@domql/report": "^3.0.0",
33
+ "@domql/state": "^3.0.1",
34
+ "@domql/utils": "^3.0.1"
34
35
  },
35
- "gitHead": "0afb63ec375f0526f47ff300885de393138b01e8",
36
+ "gitHead": "bdadc70a00c5ddde21ca889746bf28db0c3d7c2f",
36
37
  "devDependencies": {
37
38
  "@babel/core": "^7.12.0"
38
39
  }
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