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.
Files changed (90) hide show
  1. package/dist/cjs/element/applyParam.js +41 -0
  2. package/dist/cjs/element/assign.js +35 -0
  3. package/dist/cjs/element/cache.js +74 -0
  4. package/dist/cjs/element/create.js +264 -0
  5. package/dist/cjs/element/define.js +34 -0
  6. package/dist/cjs/element/extend.js +75 -0
  7. package/dist/cjs/element/index.js +55 -0
  8. package/dist/cjs/element/iterate.js +105 -0
  9. package/dist/cjs/element/methods.js +166 -0
  10. package/dist/cjs/element/node.js +80 -0
  11. package/dist/cjs/element/nodes.js +158 -0
  12. package/dist/cjs/element/options.js +24 -0
  13. package/dist/cjs/element/parse.js +42 -0
  14. package/dist/cjs/element/props.js +114 -0
  15. package/dist/cjs/element/remove.js +44 -0
  16. package/dist/cjs/element/root.js +30 -0
  17. package/dist/cjs/element/set.js +55 -0
  18. package/dist/cjs/element/state.js +208 -0
  19. package/dist/cjs/element/tree.js +31 -0
  20. package/dist/cjs/element/update.js +158 -0
  21. package/dist/cjs/event/can.js +30 -0
  22. package/dist/cjs/event/index.js +34 -0
  23. package/dist/cjs/event/is.js +28 -0
  24. package/dist/cjs/event/on.js +34 -0
  25. package/dist/cjs/event/store.js +27 -0
  26. package/dist/cjs/event/wrappers.js +36 -0
  27. package/dist/cjs/index.js +35 -0
  28. package/dist/cjs/package.json +4 -0
  29. package/dist/cjs/utils/component.js +77 -0
  30. package/dist/cjs/utils/extendUtils.js +142 -0
  31. package/dist/cjs/utils/index.js +20 -0
  32. package/dist/cjs/utils/object.js +146 -0
  33. package/dist/esm/element/applyParam.js +2614 -0
  34. package/dist/esm/element/assign.js +16 -0
  35. package/dist/esm/element/cache.js +1134 -0
  36. package/dist/esm/element/create.js +2616 -0
  37. package/dist/esm/element/define.js +2623 -0
  38. package/dist/esm/element/extend.js +984 -0
  39. package/dist/esm/element/index.js +2667 -0
  40. package/dist/esm/element/iterate.js +1114 -0
  41. package/dist/esm/element/methods.js +2635 -0
  42. package/dist/esm/element/node.js +2617 -0
  43. package/dist/esm/element/nodes.js +139 -0
  44. package/dist/esm/element/options.js +5 -0
  45. package/dist/esm/element/parse.js +2629 -0
  46. package/dist/esm/element/props.js +958 -0
  47. package/dist/esm/element/remove.js +842 -0
  48. package/dist/esm/element/root.js +162 -0
  49. package/dist/esm/element/set.js +2616 -0
  50. package/dist/esm/element/state.js +1209 -0
  51. package/dist/esm/element/tree.js +165 -0
  52. package/dist/esm/element/update.js +2616 -0
  53. package/dist/esm/event/can.js +1058 -0
  54. package/dist/esm/event/index.js +1098 -0
  55. package/dist/esm/event/is.js +67 -0
  56. package/dist/esm/event/on.js +15 -0
  57. package/dist/esm/event/store.js +8 -0
  58. package/dist/esm/event/wrappers.js +75 -0
  59. package/dist/esm/index.js +2658 -0
  60. package/dist/esm/utils/component.js +875 -0
  61. package/dist/esm/utils/extendUtils.js +940 -0
  62. package/dist/esm/utils/index.js +1260 -0
  63. package/dist/esm/utils/object.js +1081 -0
  64. package/dist/iife/index.js +2658 -0
  65. package/package.json +9 -4
  66. package/src/element/create.js +16 -13
  67. package/src/element/index.js +4 -10
  68. package/src/element/iterate.js +7 -28
  69. package/src/element/methods.js +18 -81
  70. package/src/element/mixins/content.js +6 -4
  71. package/src/element/mixins/registry.js +3 -4
  72. package/src/element/node.js +5 -6
  73. package/src/element/parse.js +1 -1
  74. package/src/element/props.js +3 -1
  75. package/src/element/state.js +168 -81
  76. package/src/element/update.js +100 -77
  77. package/src/index.js +6 -5
  78. package/src/utils/component.js +0 -1
  79. package/src/utils/object.js +31 -25
  80. package/src/element/assign.js +0 -22
  81. package/src/element/cache.js +0 -56
  82. package/src/element/nodes.js +0 -141
  83. package/src/element/root.js +0 -11
  84. package/src/element/tree.js +0 -5
  85. package/src/event/can.js +0 -10
  86. package/src/event/index.js +0 -11
  87. package/src/event/is.js +0 -15
  88. package/src/event/on.js +0 -13
  89. package/src/event/store.js +0 -6
  90. package/src/event/wrappers.js +0 -16
@@ -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', 'parent', '__element', '__depends', '__ref', '__root', 'rootUpdate'
9
+ 'update', 'parse', 'clean', 'create', 'destroy', 'remove', 'apply', 'rootUpdate',
10
+ 'parent', '__element', '__depends', '__ref', '__children', '__root'
10
11
  ]
11
12
 
12
- export const parseState = function () {
13
+ export const parse = function () {
13
14
  const state = this
14
- const parseState = {}
15
- for (const param in state) {
16
- if (!IGNORE_STATE_PARAMS.includes(param)) {
17
- parseState[param] = state[param]
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 cleanState = function () {
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
- state.parent = element.parent.state
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
- if (!state.__element) createState(element, element.parent)
76
+ for (const param in state) {
77
+ if (isUndefined(state[param])) {
78
+ delete state[param]
79
+ }
80
+ }
49
81
 
50
- // run `on.stateUpdated`
51
- if (element.on && isFunction(element.on.initStateUpdated)) {
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 stateKey = __elementRef.__state
57
- if (stateKey) {
58
- // TODO: check for double parent
59
- if (state.parent && state.parent[stateKey]) {
60
- const keyInParentState = state.parent[stateKey]
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
- // TODO: try debounce
77
- if (!options.preventUpdate) { element.update({}, options) } else if (options.preventUpdate === 'recursive') { element.update({}, { ...options, preventUpdate: true }) }
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 && element.on && isFunction(element.on.stateUpdated)) {
87
- on.stateUpdated(element.on.stateUpdated, element, state, obj)
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.clean = cleanState
170
- state.parse = parseState
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
- // trigger `on.stateCreated`
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
@@ -1,14 +1,14 @@
1
1
  'use strict'
2
2
 
3
3
  import { window } from '@domql/globals'
4
- import { diff, isFunction, isNumber, isObject, isString, createSnapshotId } from '@domql/utils'
4
+ import { isFunction, isNumber, isObject, isString } from '@domql/utils'
5
5
  import { applyEvent, triggerEventOn } from '@domql/event'
6
- import { merge, overwrite } from '../utils'
6
+ import { isMethod } from '@domql/methods'
7
+ import { createSnapshotId } from '@domql/key'
7
8
 
8
- import { on } from '../event'
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 { currentSnapshot, calleeElement } = options
37
- if (!calleeElement) {
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
- if (isFunction(element.if)) {
52
- // TODO: move as fragment
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
- if (ifPassed) __ref.__if = true
57
- if (itWasFalse && ifPassed) {
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
- // if (hasParentProps) console.log(hasParentProps.value)
100
- updateProps(params.props || (hasParentProps && {}), element, parent)
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 (element.on && isFunction(element.on.initUpdate) && !options.ignoreInitUpdate) {
104
- const whatinitreturns = on.initUpdate(element.on.initUpdate, element, element.state)
105
- if (whatinitreturns === false) return
56
+ if (!options.preventInitUpdateListener) {
57
+ const initUpdateReturns = triggerEventOn('initUpdate', element, params)
58
+ if (initUpdateReturns === false) return element
106
59
  }
107
60
 
108
- const overwriteChanges = overwrite(element, params, UPDATE_DEFAULT_OPTIONS)
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
- if (prop && isObject(prop) && !hasDefine && !hasContextDefine) {
140
- if (!options.preventRecursive) {
141
- const childUpdateCall = () => update.call(prop, params[prop], {
142
- ...options,
143
- currentSnapshot: snapshotOnCallee,
144
- calleeElement: element
145
- })
146
- if (element.props.lazyLoad || options.lazyLoad) {
147
- window.requestAnimationFrame(() => childUpdateCall())
148
- } else childUpdateCall()
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 (!options.preventUpdate) {
155
- triggerEventOn('update', element)
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 { create, parse, set, define, tree } from './element'
4
+ import { TREE } from '@domql/tree'
5
+ import { create, parse, set, define } from './element'
6
+ import { isDevelopment, isTest } from '@domql/env'
5
7
 
6
- const ENV = process.env.NODE_ENV
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
  }
@@ -26,7 +26,6 @@ export const extendizeByKey = (element, parent, key) => {
26
26
  extend: componentKey || key
27
27
  }
28
28
  } else if (isFunction(element)) {
29
- console.log(element)
30
29
  return {
31
30
  extend: componentKey || key,
32
31
  props: { ...element }