domql 1.5.136 → 1.6.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/dist/cjs/element/applyParam.js +41 -0
- package/dist/cjs/element/assign.js +35 -0
- package/dist/cjs/element/cache.js +74 -0
- package/dist/cjs/element/create.js +264 -0
- package/dist/cjs/element/define.js +34 -0
- package/dist/cjs/element/extend.js +75 -0
- package/dist/cjs/element/index.js +55 -0
- package/dist/cjs/element/iterate.js +105 -0
- package/dist/cjs/element/methods.js +166 -0
- package/dist/cjs/element/node.js +80 -0
- package/dist/cjs/element/nodes.js +158 -0
- package/dist/cjs/element/options.js +24 -0
- package/dist/cjs/element/parse.js +42 -0
- package/dist/cjs/element/props.js +114 -0
- package/dist/cjs/element/remove.js +44 -0
- package/dist/cjs/element/root.js +30 -0
- package/dist/cjs/element/set.js +55 -0
- package/dist/cjs/element/state.js +208 -0
- package/dist/cjs/element/tree.js +31 -0
- package/dist/cjs/element/update.js +158 -0
- package/dist/cjs/event/can.js +30 -0
- package/dist/cjs/event/index.js +34 -0
- package/dist/cjs/event/is.js +28 -0
- package/dist/cjs/event/on.js +34 -0
- package/dist/cjs/event/store.js +27 -0
- package/dist/cjs/event/wrappers.js +36 -0
- package/dist/cjs/index.js +35 -0
- package/dist/cjs/package.json +4 -0
- package/dist/cjs/utils/component.js +77 -0
- package/dist/cjs/utils/extendUtils.js +142 -0
- package/dist/cjs/utils/index.js +20 -0
- package/dist/cjs/utils/object.js +146 -0
- package/dist/esm/element/applyParam.js +2614 -0
- package/dist/esm/element/assign.js +16 -0
- package/dist/esm/element/cache.js +1134 -0
- package/dist/esm/element/create.js +2616 -0
- package/dist/esm/element/define.js +2623 -0
- package/dist/esm/element/extend.js +984 -0
- package/dist/esm/element/index.js +2667 -0
- package/dist/esm/element/iterate.js +1114 -0
- package/dist/esm/element/methods.js +2635 -0
- package/dist/esm/element/node.js +2617 -0
- package/dist/esm/element/nodes.js +139 -0
- package/dist/esm/element/options.js +5 -0
- package/dist/esm/element/parse.js +2629 -0
- package/dist/esm/element/props.js +958 -0
- package/dist/esm/element/remove.js +842 -0
- package/dist/esm/element/root.js +162 -0
- package/dist/esm/element/set.js +2616 -0
- package/dist/esm/element/state.js +1209 -0
- package/dist/esm/element/tree.js +165 -0
- package/dist/esm/element/update.js +2616 -0
- package/dist/esm/event/can.js +1058 -0
- package/dist/esm/event/index.js +1098 -0
- package/dist/esm/event/is.js +67 -0
- package/dist/esm/event/on.js +15 -0
- package/dist/esm/event/store.js +8 -0
- package/dist/esm/event/wrappers.js +75 -0
- package/dist/esm/index.js +2658 -0
- package/dist/esm/utils/component.js +875 -0
- package/dist/esm/utils/extendUtils.js +940 -0
- package/dist/esm/utils/index.js +1260 -0
- package/dist/esm/utils/object.js +1081 -0
- package/dist/iife/index.js +2658 -0
- package/package.json +9 -4
- package/src/element/create.js +16 -13
- package/src/element/index.js +4 -10
- package/src/element/iterate.js +7 -28
- package/src/element/methods.js +18 -81
- package/src/element/mixins/content.js +6 -4
- package/src/element/mixins/registry.js +3 -4
- package/src/element/node.js +5 -6
- package/src/element/parse.js +1 -1
- package/src/element/props.js +3 -1
- package/src/element/state.js +168 -81
- package/src/element/update.js +100 -77
- package/src/index.js +6 -5
- package/src/utils/component.js +0 -1
- package/src/utils/object.js +31 -25
- package/src/element/assign.js +0 -22
- package/src/element/cache.js +0 -56
- package/src/element/nodes.js +0 -141
- package/src/element/root.js +0 -11
- package/src/element/tree.js +0 -5
- package/src/event/can.js +0 -10
- package/src/event/index.js +0 -11
- package/src/event/is.js +0 -15
- package/src/event/on.js +0 -13
- package/src/event/store.js +0 -6
- package/src/event/wrappers.js +0 -16
package/src/element/state.js
CHANGED
|
@@ -1,35 +1,64 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
import { on } from '../event'
|
|
4
3
|
import { triggerEventOn } from '@domql/event'
|
|
5
|
-
import { is, isObject, exec, isFunction, isUndefined } from '@domql/utils'
|
|
4
|
+
import { is, isObject, exec, isFunction, isUndefined, arrayContainsOtherArray, isObjectLike, isArray, removeFromArray, removeFromObject } from '@domql/utils'
|
|
6
5
|
import { deepClone, overwriteShallow, overwriteDeep } from '../utils'
|
|
6
|
+
import { create } from '.'
|
|
7
7
|
|
|
8
8
|
export const IGNORE_STATE_PARAMS = [
|
|
9
|
-
'update', 'parse', 'clean', 'create', '
|
|
9
|
+
'update', 'parse', 'clean', 'create', 'destroy', 'remove', 'apply', 'rootUpdate',
|
|
10
|
+
'parent', '__element', '__depends', '__ref', '__children', '__root'
|
|
10
11
|
]
|
|
11
12
|
|
|
12
|
-
export const
|
|
13
|
+
export const parse = function () {
|
|
13
14
|
const state = this
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
if (isObject(state)) {
|
|
16
|
+
const obj = {}
|
|
17
|
+
for (const param in state) {
|
|
18
|
+
if (!IGNORE_STATE_PARAMS.includes(param)) {
|
|
19
|
+
obj[param] = state[param]
|
|
20
|
+
}
|
|
18
21
|
}
|
|
22
|
+
return obj
|
|
23
|
+
} else if (isArray(state)) {
|
|
24
|
+
return state.filter(item => !IGNORE_STATE_PARAMS.includes(item))
|
|
19
25
|
}
|
|
20
|
-
return parseState
|
|
21
26
|
}
|
|
22
27
|
|
|
23
|
-
export const
|
|
28
|
+
export const clean = function (options = {}) {
|
|
24
29
|
const state = this
|
|
25
30
|
for (const param in state) {
|
|
26
31
|
if (!IGNORE_STATE_PARAMS.includes(param)) {
|
|
27
32
|
delete state[param]
|
|
28
33
|
}
|
|
29
34
|
}
|
|
35
|
+
state.update(state, { skipOverwrite: true, options })
|
|
30
36
|
return state
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
export const destroy = function () {
|
|
40
|
+
const state = this
|
|
41
|
+
const element = state.__element
|
|
42
|
+
delete element.state
|
|
43
|
+
element.state = state.parent
|
|
44
|
+
|
|
45
|
+
if (state.parent) {
|
|
46
|
+
delete state.parent.__children[element.key]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (state.__children) {
|
|
50
|
+
for (const key in state.__children) {
|
|
51
|
+
const child = state.__children[key]
|
|
52
|
+
if (child.state) {
|
|
53
|
+
child.parent = state.parent
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
element.state.update()
|
|
59
|
+
return element.state
|
|
60
|
+
}
|
|
61
|
+
|
|
33
62
|
export const rootUpdate = function (obj, options = {}) {
|
|
34
63
|
const state = this
|
|
35
64
|
if (!state) return
|
|
@@ -41,40 +70,45 @@ export const updateState = function (obj, options = {}) {
|
|
|
41
70
|
const state = this
|
|
42
71
|
const element = state.__element
|
|
43
72
|
const __elementRef = element.__ref
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
for (const param in state) if (isUndefined(state[param])) delete state[param]
|
|
73
|
+
const parentState = element.parent.state
|
|
74
|
+
state.parent = parentState
|
|
47
75
|
|
|
48
|
-
|
|
76
|
+
for (const param in state) {
|
|
77
|
+
if (isUndefined(state[param])) {
|
|
78
|
+
delete state[param]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
49
81
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const initReturns = on.initStateUpdated(element.on.initStateUpdated, element, state, obj)
|
|
53
|
-
if (initReturns === false) return
|
|
82
|
+
if (!state.__element) {
|
|
83
|
+
create(element, element.parent)
|
|
54
84
|
}
|
|
55
85
|
|
|
56
|
-
const
|
|
57
|
-
if (
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if (keyInParentState && !options.stopStatePropogation) {
|
|
62
|
-
if (__elementRef.__stateType === 'string') {
|
|
63
|
-
return state.parent.update({ [stateKey]: obj.value }, options)
|
|
64
|
-
}
|
|
65
|
-
return state.parent.update({ [stateKey]: obj }, options)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
} else {
|
|
69
|
-
if (options && options.shallow) {
|
|
86
|
+
const initStateUpdateReturns = triggerEventOn('initStateUpdated', element, obj)
|
|
87
|
+
if (initStateUpdateReturns === false) return element
|
|
88
|
+
|
|
89
|
+
if (!options.skipOverwrite) {
|
|
90
|
+
if (options.shallow) {
|
|
70
91
|
overwriteShallow(state, obj, IGNORE_STATE_PARAMS)
|
|
71
92
|
} else {
|
|
72
93
|
overwriteDeep(state, obj, IGNORE_STATE_PARAMS)
|
|
73
94
|
}
|
|
74
95
|
}
|
|
75
96
|
|
|
76
|
-
|
|
77
|
-
|
|
97
|
+
const stateKey = __elementRef.__state
|
|
98
|
+
const shouldPropagateState = stateKey && parentState && parentState[stateKey] && !options.stopStatePropagation
|
|
99
|
+
if (shouldPropagateState) {
|
|
100
|
+
const isStringState = (__elementRef.__stateType === 'string')
|
|
101
|
+
const value = isStringState ? state.value : state.parse()
|
|
102
|
+
parentState[stateKey] = value
|
|
103
|
+
parentState.update(value, { skipOverwrite: true, ...options })
|
|
104
|
+
return state
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!options.preventUpdate) {
|
|
108
|
+
element.update({}, options)
|
|
109
|
+
} else if (options.preventUpdate === 'recursive') {
|
|
110
|
+
element.update({}, { ...options, preventUpdate: true })
|
|
111
|
+
}
|
|
78
112
|
|
|
79
113
|
if (state.__depends) {
|
|
80
114
|
for (const el in state.__depends) {
|
|
@@ -83,29 +117,99 @@ export const updateState = function (obj, options = {}) {
|
|
|
83
117
|
}
|
|
84
118
|
}
|
|
85
119
|
|
|
86
|
-
if (!options.preventUpdateListener
|
|
87
|
-
|
|
120
|
+
if (!options.preventUpdateListener) {
|
|
121
|
+
triggerEventOn('stateUpdated', element, obj)
|
|
88
122
|
}
|
|
89
123
|
|
|
90
124
|
return state
|
|
91
125
|
}
|
|
92
126
|
|
|
127
|
+
export const remove = function (key, options) {
|
|
128
|
+
const state = this
|
|
129
|
+
if (isArray(state)) removeFromArray(state, key)
|
|
130
|
+
if (isObject(state)) removeFromObject(state, key)
|
|
131
|
+
return state.update(state, { skipOverwrite: true, options })
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export const apply = function (func, options) {
|
|
135
|
+
const state = this
|
|
136
|
+
if (isFunction(func)) {
|
|
137
|
+
func(state)
|
|
138
|
+
return state.update(state, { skipOverwrite: true, options })
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const getParentStateInKey = (stateKey, parentState) => {
|
|
143
|
+
const arr = stateKey.split('../')
|
|
144
|
+
const arrLength = arr.length - 1
|
|
145
|
+
for (let i = 0; i < arrLength; i++) {
|
|
146
|
+
if (!parentState.parent) return null
|
|
147
|
+
parentState = parentState.parent
|
|
148
|
+
}
|
|
149
|
+
return parentState
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const getChildStateInKey = (stateKey, parentState) => {
|
|
153
|
+
const arr = stateKey.split('/')
|
|
154
|
+
const arrLength = arr.length - 1
|
|
155
|
+
for (let i = 0; i < arrLength; i++) {
|
|
156
|
+
const childKey = arr[i]
|
|
157
|
+
const grandChildKey = arr[i + 1]
|
|
158
|
+
const childInParent = parentState[childKey]
|
|
159
|
+
if (childInParent && childInParent[grandChildKey]) {
|
|
160
|
+
stateKey = grandChildKey
|
|
161
|
+
parentState = childInParent
|
|
162
|
+
} else return
|
|
163
|
+
}
|
|
164
|
+
return parentState[stateKey]
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const createInheritedState = function (element, parent) {
|
|
168
|
+
const __elementRef = element.__ref
|
|
169
|
+
let stateKey = __elementRef.__state
|
|
170
|
+
if (!stateKey) return element.state
|
|
171
|
+
|
|
172
|
+
let parentState = parent.state
|
|
173
|
+
if (stateKey.includes('../')) {
|
|
174
|
+
parentState = getParentStateInKey(stateKey, parent.state)
|
|
175
|
+
stateKey = stateKey.replaceAll('../', '')
|
|
176
|
+
}
|
|
177
|
+
if (!parentState) return {}
|
|
178
|
+
|
|
179
|
+
const keyInParentState = getChildStateInKey(stateKey, parentState)
|
|
180
|
+
if (!keyInParentState) return {}
|
|
181
|
+
|
|
182
|
+
if (is(keyInParentState)('object', 'array')) {
|
|
183
|
+
return deepClone(keyInParentState)
|
|
184
|
+
} else if (is(keyInParentState)('string', 'number')) {
|
|
185
|
+
__elementRef.__stateType = 'string'
|
|
186
|
+
return { value: keyInParentState }
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
console.warn(stateKey, 'is not present. Replacing with', {})
|
|
190
|
+
return {}
|
|
191
|
+
}
|
|
192
|
+
|
|
93
193
|
export const createState = function (element, parent, opts) {
|
|
94
194
|
const skip = (opts && opts.skip) ? opts.skip : false
|
|
95
|
-
|
|
96
195
|
let { state, __ref: __elementRef } = element
|
|
97
196
|
|
|
98
|
-
if (isFunction(state)) state = exec(state, element)
|
|
197
|
+
if (isFunction(state)) element.state = exec(state, element)
|
|
99
198
|
|
|
100
199
|
if (is(state)('string', 'number')) {
|
|
101
200
|
__elementRef.__state = state
|
|
102
|
-
state = {}
|
|
201
|
+
element.state = {}
|
|
103
202
|
}
|
|
104
203
|
if (state === true) {
|
|
105
204
|
__elementRef.__state = element.key
|
|
106
|
-
state = {}
|
|
205
|
+
element.state = {}
|
|
107
206
|
}
|
|
108
207
|
|
|
208
|
+
// trigger `on.stateInit`
|
|
209
|
+
triggerEventOn('stateInit', element)
|
|
210
|
+
|
|
211
|
+
state = element.state = createInheritedState(element, parent)
|
|
212
|
+
|
|
109
213
|
if (!state) {
|
|
110
214
|
if (parent && parent.state) return parent.state
|
|
111
215
|
return {}
|
|
@@ -113,41 +217,6 @@ export const createState = function (element, parent, opts) {
|
|
|
113
217
|
__elementRef.__hasRootState = true
|
|
114
218
|
}
|
|
115
219
|
|
|
116
|
-
// trigger `on.stateInit`
|
|
117
|
-
triggerEventOn('stateInit', element)
|
|
118
|
-
|
|
119
|
-
let stateKey = __elementRef.__state
|
|
120
|
-
if (stateKey) {
|
|
121
|
-
let parentState = parent.state
|
|
122
|
-
const parentKeysArr = stateKey.split('../')
|
|
123
|
-
for (let i = 1; i < parentKeysArr.length; i++) {
|
|
124
|
-
stateKey = parentKeysArr[i]
|
|
125
|
-
parentState = parentState.parent
|
|
126
|
-
}
|
|
127
|
-
const childrenKeysArr = stateKey.split('.')
|
|
128
|
-
for (let i = 0; i < childrenKeysArr.length; i++) {
|
|
129
|
-
const childKey = childrenKeysArr[i]
|
|
130
|
-
const grandChildKey = childrenKeysArr[i + 1]
|
|
131
|
-
const childInParent = parentState[childKey]
|
|
132
|
-
if (childInParent && childInParent[grandChildKey]) {
|
|
133
|
-
stateKey = grandChildKey
|
|
134
|
-
parentState = childInParent
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
if (parentState && parentState[stateKey]) {
|
|
138
|
-
const keyInParentState = parentState[stateKey]
|
|
139
|
-
if (is(keyInParentState)('object', 'array')) {
|
|
140
|
-
state = deepClone(keyInParentState)
|
|
141
|
-
} else if (is(keyInParentState)('string', 'number')) {
|
|
142
|
-
state = { value: keyInParentState }
|
|
143
|
-
__elementRef.__stateType = 'string'
|
|
144
|
-
} else if (isUndefined(keyInParentState)) {
|
|
145
|
-
console.warn(stateKey, 'is not in present', 'replacing with ', {})
|
|
146
|
-
state = {}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
220
|
// reference other state
|
|
152
221
|
// TODO: check why __ref is assigned with element
|
|
153
222
|
// /docs/intro
|
|
@@ -166,19 +235,37 @@ export const createState = function (element, parent, opts) {
|
|
|
166
235
|
// NOTE: Only true when 'onlyResolveExtends' option is set to true
|
|
167
236
|
if (skip) return state
|
|
168
237
|
|
|
169
|
-
state
|
|
170
|
-
|
|
238
|
+
applyMethods(element, state)
|
|
239
|
+
|
|
240
|
+
// trigger `on.stateCreated`
|
|
241
|
+
triggerEventOn('stateCreated', element)
|
|
242
|
+
|
|
243
|
+
return state
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export const isState = function (state) {
|
|
247
|
+
if (!isObjectLike(state)) return false
|
|
248
|
+
const keys = Object.keys(state)
|
|
249
|
+
return arrayContainsOtherArray(keys, ['update', 'parse', 'clean', 'create', 'parent', 'rootUpdate'])
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const applyMethods = (element, state) => {
|
|
253
|
+
const __elementRef = element.__ref
|
|
254
|
+
|
|
255
|
+
state.clean = clean
|
|
256
|
+
state.parse = parse
|
|
257
|
+
state.destroy = destroy
|
|
171
258
|
state.update = updateState
|
|
172
259
|
state.rootUpdate = rootUpdate
|
|
173
260
|
state.create = createState
|
|
261
|
+
state.remove = remove
|
|
262
|
+
state.apply = apply
|
|
174
263
|
state.parent = element.parent.state
|
|
175
264
|
state.__element = element
|
|
265
|
+
state.__children = {}
|
|
176
266
|
state.__root = __elementRef.__root ? __elementRef.__root.state : state
|
|
177
267
|
|
|
178
|
-
|
|
179
|
-
triggerEventOn('stateCreated', element)
|
|
180
|
-
|
|
181
|
-
return state
|
|
268
|
+
if (state.parent) state.parent.__children[element.key] = state
|
|
182
269
|
}
|
|
183
270
|
|
|
184
271
|
export default createState
|
package/src/element/update.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
import { window } from '@domql/globals'
|
|
4
|
-
import {
|
|
4
|
+
import { isFunction, isNumber, isObject, isString } from '@domql/utils'
|
|
5
5
|
import { applyEvent, triggerEventOn } from '@domql/event'
|
|
6
|
-
import {
|
|
6
|
+
import { isMethod } from '@domql/methods'
|
|
7
|
+
import { createSnapshotId } from '@domql/key'
|
|
7
8
|
|
|
8
|
-
import {
|
|
9
|
+
import { merge, overwriteDeep } from '../utils'
|
|
9
10
|
import create from './create'
|
|
10
11
|
import { throughUpdatedDefine, throughUpdatedExec } from './iterate'
|
|
11
|
-
import { isMethod } from './methods'
|
|
12
12
|
import { registry } from './mixins'
|
|
13
13
|
import { updateProps } from './props'
|
|
14
14
|
import createState from './state'
|
|
@@ -33,79 +33,32 @@ const update = function (params = {}, options = UPDATE_DEFAULT_OPTIONS) {
|
|
|
33
33
|
let __ref = element.__ref
|
|
34
34
|
if (!__ref) __ref = element.__ref = {}
|
|
35
35
|
|
|
36
|
-
const
|
|
37
|
-
if (
|
|
38
|
-
__ref.__currentSnapshot = snapshot.snapshotId()
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const snapshotOnCallee = __ref.__currentSnapshot ||
|
|
42
|
-
(calleeElement && calleeElement.__ref && calleeElement.__currentSnapshot)
|
|
43
|
-
if (snapshotOnCallee && currentSnapshot < snapshotOnCallee) {
|
|
44
|
-
// TODO: stop previous update
|
|
45
|
-
}
|
|
36
|
+
const [snapshotOnCallee, calleeElement, snapshotHasUpdated] = captureSnapshot(element, options)
|
|
37
|
+
if (snapshotHasUpdated) return
|
|
46
38
|
|
|
47
39
|
if (isString(params) || isNumber(params)) {
|
|
48
40
|
params = { text: params }
|
|
49
41
|
}
|
|
50
42
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const ifPassed = element.if(element, element.state)
|
|
54
|
-
const itWasFalse = __ref.__if !== true
|
|
43
|
+
const ifFails = checkIfOnUpdate(element, options)
|
|
44
|
+
if (ifFails) return
|
|
55
45
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
delete element.__hash
|
|
59
|
-
delete element.extend
|
|
60
|
-
if (!__ref.__hasRootState) delete element.state
|
|
61
|
-
if (__ref.__state) element.state = __ref.__state
|
|
62
|
-
const created = create(element, element.parent, element.key)
|
|
63
|
-
if (!options.preventUpdate) {
|
|
64
|
-
if (element.on && isFunction(element.on.update)) {
|
|
65
|
-
applyEvent(element.on.update, created, created.state)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return created
|
|
69
|
-
} else if (element.node && !ifPassed) {
|
|
70
|
-
element.node.remove()
|
|
71
|
-
delete __ref.__if
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (__ref.__state) {
|
|
76
|
-
const keyInParentState = parent.state[__ref.__state]
|
|
77
|
-
if (keyInParentState) {
|
|
78
|
-
const newState = __ref.__stateType === 'string'
|
|
79
|
-
? createState(element, parent)
|
|
80
|
-
: createState(element, parent)
|
|
81
|
-
const changes = diff(newState.parse(), element.state.parse())
|
|
82
|
-
|
|
83
|
-
// run `on.stateUpdated`
|
|
84
|
-
if (element.on && isFunction(element.on.initStateUpdated)) {
|
|
85
|
-
const initReturns = on.initStateUpdated(element.on.initStateUpdated, element, element.state, changes)
|
|
86
|
-
if (initReturns === false) return
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
element.state = newState
|
|
90
|
-
|
|
91
|
-
if (!options.preventUpdateListener && element.on && isFunction(element.on.stateUpdated)) {
|
|
92
|
-
on.stateUpdated(element.on.stateUpdated, element, element.state, changes)
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
} else if (!__ref.__hasRootState) element.state = (parent && parent.state) || {}
|
|
46
|
+
const inheritState = inheritStateUpdates(element, options)
|
|
47
|
+
if (inheritState === false) return
|
|
96
48
|
|
|
97
49
|
if (__ref.__if && !options.preventPropsUpdate) {
|
|
98
50
|
const hasParentProps = parent.props && (parent.props[key] || parent.props.childProps)
|
|
99
|
-
|
|
100
|
-
|
|
51
|
+
const hasFunctionInProps = element.__ref.__props.filter(v => isFunction(v))
|
|
52
|
+
const props = params.props || hasParentProps || hasFunctionInProps.length
|
|
53
|
+
if (props) updateProps(props, element, parent)
|
|
101
54
|
}
|
|
102
55
|
|
|
103
|
-
if (
|
|
104
|
-
const
|
|
105
|
-
if (
|
|
56
|
+
if (!options.preventInitUpdateListener) {
|
|
57
|
+
const initUpdateReturns = triggerEventOn('initUpdate', element, params)
|
|
58
|
+
if (initUpdateReturns === false) return element
|
|
106
59
|
}
|
|
107
60
|
|
|
108
|
-
const overwriteChanges =
|
|
61
|
+
const overwriteChanges = overwriteDeep(params, element)
|
|
109
62
|
const execChanges = throughUpdatedExec(element, UPDATE_DEFAULT_OPTIONS)
|
|
110
63
|
const definedChanges = throughUpdatedDefine(element)
|
|
111
64
|
|
|
@@ -135,25 +88,95 @@ const update = function (params = {}, options = UPDATE_DEFAULT_OPTIONS) {
|
|
|
135
88
|
const isElement = applyParam(param, element, options)
|
|
136
89
|
if (isElement) {
|
|
137
90
|
const { hasDefine, hasContextDefine } = isElement
|
|
91
|
+
const canUpdate = isObject(prop) && !hasDefine && !hasContextDefine && !options.preventRecursive
|
|
92
|
+
if (!canUpdate) continue
|
|
93
|
+
|
|
94
|
+
const childUpdateCall = () => update.call(prop, params[prop], {
|
|
95
|
+
...options,
|
|
96
|
+
currentSnapshot: snapshotOnCallee,
|
|
97
|
+
calleeElement: calleeElement
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
if ((element.props && element.props.lazyLoad) || options.lazyLoad) {
|
|
101
|
+
window.requestAnimationFrame(() => childUpdateCall())
|
|
102
|
+
} else childUpdateCall()
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (!options.preventUpdateListener) triggerEventOn('update', element)
|
|
107
|
+
}
|
|
138
108
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
109
|
+
const captureSnapshot = (element, options) => {
|
|
110
|
+
const __ref = element.__ref
|
|
111
|
+
|
|
112
|
+
const { currentSnapshot, calleeElement } = options
|
|
113
|
+
const isCallee = calleeElement === element
|
|
114
|
+
if (!calleeElement || isCallee) {
|
|
115
|
+
const createdStanpshot = snapshot.snapshotId()
|
|
116
|
+
__ref.__currentSnapshot = createdStanpshot
|
|
117
|
+
return [createdStanpshot, element]
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const snapshotOnCallee = calleeElement.__ref.__currentSnapshot
|
|
121
|
+
if (currentSnapshot < snapshotOnCallee) {
|
|
122
|
+
return [snapshotOnCallee, calleeElement, true]
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return [snapshotOnCallee, calleeElement]
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const checkIfOnUpdate = (element, options) => {
|
|
129
|
+
if (!isFunction(element.if)) return
|
|
130
|
+
|
|
131
|
+
const __ref = element.__ref
|
|
132
|
+
const ifPassed = element.if(element, element.state)
|
|
133
|
+
const itWasFalse = __ref.__if !== true
|
|
134
|
+
|
|
135
|
+
if (ifPassed) {
|
|
136
|
+
__ref.__if = true
|
|
137
|
+
if (itWasFalse) {
|
|
138
|
+
delete element.__hash
|
|
139
|
+
delete element.extend
|
|
140
|
+
if (!__ref.__hasRootState) {
|
|
141
|
+
delete element.state
|
|
142
|
+
}
|
|
143
|
+
if (__ref.__state) {
|
|
144
|
+
element.state = __ref.__state
|
|
150
145
|
}
|
|
146
|
+
const created = create(element, element.parent, element.key)
|
|
147
|
+
if (!options.preventUpdate && element.on && isFunction(element.on.update)) {
|
|
148
|
+
applyEvent(element.on.update, created, created.state)
|
|
149
|
+
}
|
|
150
|
+
return created
|
|
151
151
|
}
|
|
152
|
+
} else if (element.node && !ifPassed) {
|
|
153
|
+
element.node.remove()
|
|
154
|
+
delete __ref.__if
|
|
152
155
|
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const inheritStateUpdates = (element, options) => {
|
|
159
|
+
const { __ref } = element
|
|
160
|
+
const stateKey = __ref.__state
|
|
161
|
+
const { parent } = element
|
|
153
162
|
|
|
154
|
-
if (!
|
|
155
|
-
|
|
163
|
+
if (!stateKey && !__ref.__hasRootState) {
|
|
164
|
+
element.state = parent?.state || {}
|
|
165
|
+
return
|
|
156
166
|
}
|
|
167
|
+
|
|
168
|
+
const parentState = parent?.state || {}
|
|
169
|
+
const keyInParentState = parentState[stateKey]
|
|
170
|
+
|
|
171
|
+
if (!keyInParentState) return
|
|
172
|
+
|
|
173
|
+
const initStateReturns = triggerEventOn('initStateUpdated', element, keyInParentState)
|
|
174
|
+
if (initStateReturns === false) return element
|
|
175
|
+
|
|
176
|
+
const newState = createState(element, parent)
|
|
177
|
+
element.state = newState
|
|
178
|
+
|
|
179
|
+
triggerEventOn('stateUpdated', element, newState.parse())
|
|
157
180
|
}
|
|
158
181
|
|
|
159
182
|
export default update
|
package/src/index.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
import { window } from '@domql/globals'
|
|
4
|
-
import {
|
|
4
|
+
import { TREE } from '@domql/tree'
|
|
5
|
+
import { create, parse, set, define } from './element'
|
|
6
|
+
import { isDevelopment, isTest } from '@domql/env'
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
if (ENV === 'test' || ENV === 'development') window.tree = tree
|
|
8
|
+
if (isTest() || isDevelopment()) window.tree = TREE
|
|
8
9
|
|
|
9
10
|
export default {
|
|
11
|
+
TREE,
|
|
10
12
|
create,
|
|
11
13
|
parse,
|
|
12
14
|
set,
|
|
13
|
-
define
|
|
14
|
-
tree
|
|
15
|
+
define
|
|
15
16
|
}
|
package/src/utils/component.js
CHANGED