@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.
- package/README.md +1 -1
- package/__tests__/checkIfOnUpdate.test.js +103 -0
- package/__tests__/children.test.js +213 -0
- package/__tests__/define.test.js +75 -0
- package/__tests__/inheritStateUpdates.test.js +79 -0
- package/__tests__/renderElement.test.js +131 -0
- package/__tests__/resetElement.test.js +44 -0
- package/__tests__/set.test.js +316 -0
- package/__tests__/throughExecProps.test.js +86 -0
- package/__tests__/throughInitialDefine.test.js +104 -0
- package/__tests__/throughInitialExec.test.js +92 -0
- package/__tests__/throughUpdatedDefine.test.js +92 -0
- package/__tests__/throughUpdatedExec.test.js +110 -0
- package/__tests__/tree.test.js +15 -0
- package/__tests__/update.test.js +253 -0
- package/children.js +105 -0
- package/create.js +125 -255
- package/dist/cjs/__tests__/checkIfOnUpdate.test.js +73 -0
- package/dist/cjs/__tests__/children.test.js +177 -0
- package/dist/cjs/__tests__/define.test.js +75 -0
- package/dist/cjs/__tests__/inheritStateUpdates.test.js +62 -0
- package/dist/cjs/__tests__/renderElement.test.js +138 -0
- package/dist/cjs/__tests__/resetElement.test.js +35 -0
- package/dist/cjs/__tests__/set.test.js +256 -0
- package/dist/cjs/__tests__/throughExecProps.test.js +62 -0
- package/dist/cjs/__tests__/throughInitialDefine.test.js +79 -0
- package/dist/cjs/__tests__/throughInitialExec.test.js +73 -0
- package/dist/cjs/__tests__/throughUpdatedDefine.test.js +69 -0
- package/dist/cjs/__tests__/throughUpdatedExec.test.js +84 -0
- package/dist/cjs/__tests__/tree.test.js +11 -0
- package/dist/cjs/__tests__/update.test.js +219 -0
- package/dist/cjs/children.js +87 -0
- package/dist/cjs/create.js +74 -215
- package/dist/cjs/define.js +1 -2
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/iterate.js +37 -30
- package/dist/cjs/methods/set.js +26 -25
- package/dist/cjs/methods/v2.js +7 -17
- package/dist/cjs/mixins/attr.js +7 -10
- package/dist/cjs/mixins/classList.js +8 -16
- package/dist/cjs/mixins/data.js +2 -4
- package/dist/cjs/mixins/html.js +2 -4
- package/dist/cjs/mixins/index.js +0 -4
- package/dist/cjs/mixins/registry.js +7 -67
- package/dist/cjs/mixins/scope.js +2 -3
- package/dist/cjs/mixins/state.js +4 -7
- package/dist/cjs/mixins/style.js +2 -4
- package/dist/cjs/mixins/text.js +5 -8
- package/dist/cjs/node.js +34 -30
- package/dist/cjs/set.js +112 -47
- package/dist/cjs/update.js +123 -92
- package/dist/cjs/utils/applyParam.js +3 -4
- package/dist/cjs/utils/index.js +8 -4
- package/dist/cjs/utils/onlyResolveExtends.js +14 -30
- package/dist/esm/__tests__/checkIfOnUpdate.test.js +73 -0
- package/dist/esm/__tests__/children.test.js +177 -0
- package/dist/esm/__tests__/define.test.js +53 -0
- package/dist/esm/__tests__/inheritStateUpdates.test.js +62 -0
- package/dist/esm/__tests__/renderElement.test.js +116 -0
- package/dist/esm/__tests__/resetElement.test.js +35 -0
- package/dist/esm/__tests__/set.test.js +256 -0
- package/dist/esm/__tests__/throughExecProps.test.js +62 -0
- package/dist/esm/__tests__/throughInitialDefine.test.js +79 -0
- package/dist/esm/__tests__/throughInitialExec.test.js +73 -0
- package/dist/esm/__tests__/throughUpdatedDefine.test.js +69 -0
- package/dist/esm/__tests__/throughUpdatedExec.test.js +84 -0
- package/dist/esm/__tests__/tree.test.js +11 -0
- package/dist/esm/__tests__/update.test.js +219 -0
- package/dist/esm/children.js +81 -0
- package/dist/esm/create.js +79 -226
- package/dist/esm/define.js +1 -2
- package/dist/esm/iterate.js +41 -33
- package/dist/esm/methods/set.js +5 -4
- package/dist/esm/methods/v2.js +7 -17
- package/dist/esm/mixins/attr.js +8 -11
- package/dist/esm/mixins/classList.js +8 -16
- package/dist/esm/mixins/data.js +3 -5
- package/dist/esm/mixins/html.js +2 -4
- package/dist/esm/mixins/index.js +0 -4
- package/dist/esm/mixins/registry.js +7 -67
- package/dist/esm/mixins/scope.js +2 -3
- package/dist/esm/mixins/state.js +5 -8
- package/dist/esm/mixins/style.js +2 -4
- package/dist/esm/mixins/text.js +6 -12
- package/dist/esm/node.js +25 -31
- package/dist/esm/set.js +112 -47
- package/dist/esm/update.js +127 -97
- package/dist/esm/utils/applyParam.js +3 -4
- package/dist/esm/utils/index.js +4 -3
- package/dist/esm/utils/onlyResolveExtends.js +22 -31
- package/iterate.js +44 -26
- package/methods/set.js +5 -4
- package/methods/v2.js +5 -4
- package/mixins/attr.js +13 -7
- package/mixins/classList.js +7 -2
- package/mixins/data.js +1 -1
- package/mixins/index.js +1 -6
- package/mixins/registry.js +6 -53
- package/mixins/scope.js +1 -1
- package/mixins/state.js +4 -5
- package/mixins/text.js +4 -7
- package/node.js +31 -28
- package/package.json +7 -6
- package/set.js +129 -41
- package/update.js +169 -89
- package/utils/applyParam.js +7 -4
- package/utils/index.js +1 -3
- package/utils/onlyResolveExtends.js +27 -16
- package/cache/index.js +0 -3
- package/cache/options.js +0 -4
- package/dist/cjs/cache/index.js +0 -24
- package/dist/cjs/cache/options.js +0 -26
- package/dist/cjs/extend.js +0 -85
- package/dist/cjs/methods/index.js +0 -353
- package/dist/cjs/mixins/content.js +0 -74
- package/dist/cjs/props/create.js +0 -98
- package/dist/cjs/props/ignore.js +0 -24
- package/dist/cjs/props/index.js +0 -21
- package/dist/cjs/props/inherit.js +0 -53
- package/dist/cjs/props/update.js +0 -37
- package/dist/cjs/utils/component.js +0 -77
- package/dist/cjs/utils/extendUtils.js +0 -142
- package/dist/cjs/utils/object.js +0 -179
- package/dist/cjs/utils/propEvents.js +0 -41
- package/dist/esm/cache/index.js +0 -4
- package/dist/esm/cache/options.js +0 -6
- package/dist/esm/extend.js +0 -71
- package/dist/esm/methods/index.js +0 -333
- package/dist/esm/mixins/content.js +0 -54
- package/dist/esm/props/create.js +0 -78
- package/dist/esm/props/ignore.js +0 -4
- package/dist/esm/props/index.js +0 -4
- package/dist/esm/props/inherit.js +0 -33
- package/dist/esm/props/update.js +0 -17
- package/dist/esm/utils/component.js +0 -65
- package/dist/esm/utils/extendUtils.js +0 -122
- package/dist/esm/utils/object.js +0 -159
- package/dist/esm/utils/propEvents.js +0 -21
- package/extend.js +0 -90
- package/methods/index.js +0 -317
- package/mixins/content.js +0 -55
- package/props/create.js +0 -87
- package/props/ignore.js +0 -3
- package/props/index.js +0 -6
- package/props/inherit.js +0 -35
- package/props/update.js +0 -17
- package/utils/component.js +0 -68
- package/utils/extendUtils.js +0 -134
- package/utils/object.js +0 -172
- package/utils/propEvents.js +0 -19
package/set.js
CHANGED
|
@@ -1,79 +1,167 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
import { deepContains,
|
|
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
|
|
12
|
-
if (!options.preventRemove) removeContent(element, options)
|
|
7
|
+
export const setContentKey = (element, opts = {}) => {
|
|
13
8
|
const { __ref: ref } = element
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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 =
|
|
16
|
+
export const reset = async options => {
|
|
23
17
|
const element = this
|
|
24
|
-
create(element, element.parent, undefined, {
|
|
25
|
-
|
|
26
|
-
...
|
|
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
|
|
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
|
|
41
|
-
if (options.preventContentUpdate === true && !
|
|
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 (
|
|
120
|
+
if (content?.update && !childHasChanged && !childrenIsDifferentFromCache) {
|
|
44
121
|
if (!options.preventBeforeUpdateListener && !options.preventListeners) {
|
|
45
|
-
const beforeUpdateReturns = await triggerEventOnUpdate(
|
|
122
|
+
const beforeUpdateReturns = await triggerEventOnUpdate(
|
|
123
|
+
'beforeUpdate',
|
|
124
|
+
params,
|
|
125
|
+
element,
|
|
126
|
+
options
|
|
127
|
+
)
|
|
46
128
|
if (beforeUpdateReturns === false) return element
|
|
47
129
|
}
|
|
48
|
-
|
|
49
|
-
if (!options.preventUpdateListener
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
29
|
-
import {
|
|
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
|
-
|
|
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(
|
|
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(
|
|
61
|
+
const [snapshotOnCallee, calleeElement, snapshotHasUpdated] = captureSnapshot(
|
|
62
|
+
element,
|
|
63
|
+
options
|
|
64
|
+
)
|
|
65
|
+
|
|
55
66
|
if (snapshotHasUpdated) return
|
|
56
67
|
|
|
57
|
-
if (!options.preventListeners)
|
|
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 (
|
|
60
|
-
|
|
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 =
|
|
74
|
-
|
|
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(
|
|
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
|
|
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,
|
|
104
|
-
|
|
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 (
|
|
109
|
-
|
|
110
|
-
|
|
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 =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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) ||
|
|
132
|
-
|
|
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 =
|
|
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 = () =>
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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 (!
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
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)
|
|
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)(
|
|
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.
|
|
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
|
|
264
|
+
if (element.children) {
|
|
218
265
|
element.removeContent()
|
|
219
|
-
} else if (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(
|
|
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 (
|
|
240
|
-
|
|
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
|
|
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 } =
|
|
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 =
|
|
343
|
+
const shouldForceFunctionState =
|
|
344
|
+
isFunction(stateKey) && !isHoisted && execStateFunction
|
|
280
345
|
if (shouldForceFunctionState) {
|
|
281
346
|
const execState = exec(stateKey, element)
|
|
282
|
-
state.set(execState, {
|
|
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(
|
|
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(
|
|
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
|
package/utils/applyParam.js
CHANGED
|
@@ -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 =
|
|
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
|
|
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