@domql/element 3.1.2 → 3.2.7
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 +4 -6
- package/children.js +45 -18
- package/create.js +58 -46
- package/define.js +1 -1
- package/dist/cjs/children.js +43 -13
- package/dist/cjs/create.js +57 -27
- package/dist/cjs/define.js +1 -1
- package/dist/cjs/event/animationFrame.js +96 -0
- package/dist/cjs/event/can.js +28 -0
- package/dist/cjs/event/index.js +20 -0
- package/dist/cjs/event/on.js +84 -0
- package/dist/cjs/event/store.js +27 -0
- package/dist/cjs/extend.js +88 -0
- package/dist/cjs/index.js +9 -6
- package/dist/cjs/iterate.js +89 -33
- package/dist/cjs/methods/set.js +5 -0
- package/dist/cjs/methods/v2.js +1 -1
- package/dist/cjs/mixins/attr.js +3 -2
- package/dist/cjs/mixins/classList.js +11 -1
- package/dist/cjs/mixins/content.js +72 -0
- package/dist/cjs/mixins/html.js +1 -2
- package/dist/cjs/mixins/registry.js +2 -2
- package/dist/cjs/mixins/scope.js +1 -1
- package/dist/cjs/mixins/state.js +4 -4
- package/dist/cjs/mixins/style.js +11 -2
- package/dist/cjs/mixins/text.js +9 -5
- package/dist/cjs/node.js +22 -19
- package/dist/cjs/render/append.js +72 -0
- package/dist/cjs/render/cache.js +80 -0
- package/dist/cjs/render/create.js +25 -0
- package/dist/cjs/render/index.js +20 -0
- package/dist/cjs/set.js +33 -40
- package/dist/cjs/update.js +100 -69
- package/dist/cjs/utils/applyParam.js +7 -7
- package/dist/cjs/utils/extendUtils.js +132 -0
- package/dist/cjs/utils/index.js +2 -0
- package/dist/cjs/utils/propEvents.js +56 -0
- package/dist/esm/children.js +44 -14
- package/dist/esm/create.js +58 -27
- package/dist/esm/define.js +1 -1
- package/dist/esm/event/animationFrame.js +76 -0
- package/dist/esm/event/can.js +8 -0
- package/dist/esm/event/index.js +3 -0
- package/dist/esm/event/on.js +64 -0
- package/dist/esm/event/store.js +7 -0
- package/dist/esm/extend.js +74 -0
- package/dist/esm/index.js +8 -6
- package/dist/esm/iterate.js +90 -35
- package/dist/esm/methods/set.js +10 -0
- package/dist/esm/methods/v2.js +1 -1
- package/dist/esm/mixins/attr.js +4 -3
- package/dist/esm/mixins/classList.js +11 -1
- package/dist/esm/mixins/content.js +52 -0
- package/dist/esm/mixins/html.js +1 -2
- package/dist/esm/mixins/registry.js +1 -1
- package/dist/esm/mixins/scope.js +1 -1
- package/dist/esm/mixins/state.js +5 -5
- package/dist/esm/mixins/style.js +12 -3
- package/dist/esm/mixins/text.js +10 -6
- package/dist/esm/node.js +22 -19
- package/dist/esm/render/append.js +52 -0
- package/dist/esm/render/cache.js +60 -0
- package/dist/esm/render/create.js +5 -0
- package/dist/esm/render/index.js +3 -0
- package/dist/esm/set.js +34 -41
- package/dist/esm/update.js +100 -71
- package/dist/esm/utils/applyParam.js +8 -8
- package/dist/esm/utils/extendUtils.js +119 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/propEvents.js +36 -0
- package/dist/iife/index.js +4718 -0
- package/extend.js +95 -0
- package/index.js +9 -6
- package/iterate.js +100 -38
- package/node.js +25 -23
- package/package.json +44 -20
- package/set.js +28 -32
- package/update.js +111 -82
- package/__tests__/checkIfOnUpdate.test.js +0 -103
- package/__tests__/children.test.js +0 -213
- package/__tests__/define.test.js +0 -75
- package/__tests__/inheritStateUpdates.test.js +0 -79
- package/__tests__/renderElement.test.js +0 -131
- package/__tests__/resetElement.test.js +0 -44
- package/__tests__/set.test.js +0 -316
- package/__tests__/throughExecProps.test.js +0 -86
- package/__tests__/throughInitialDefine.test.js +0 -104
- package/__tests__/throughInitialExec.test.js +0 -92
- package/__tests__/throughUpdatedDefine.test.js +0 -92
- package/__tests__/throughUpdatedExec.test.js +0 -110
- package/__tests__/tree.test.js +0 -15
- package/__tests__/update.test.js +0 -256
- package/dist/cjs/__tests__/checkIfOnUpdate.test.js +0 -73
- package/dist/cjs/__tests__/children.test.js +0 -177
- package/dist/cjs/__tests__/define.test.js +0 -75
- package/dist/cjs/__tests__/inheritStateUpdates.test.js +0 -62
- package/dist/cjs/__tests__/renderElement.test.js +0 -138
- package/dist/cjs/__tests__/resetElement.test.js +0 -35
- package/dist/cjs/__tests__/set.test.js +0 -256
- package/dist/cjs/__tests__/throughExecProps.test.js +0 -62
- package/dist/cjs/__tests__/throughInitialDefine.test.js +0 -79
- package/dist/cjs/__tests__/throughInitialExec.test.js +0 -73
- package/dist/cjs/__tests__/throughUpdatedDefine.test.js +0 -69
- package/dist/cjs/__tests__/throughUpdatedExec.test.js +0 -84
- package/dist/cjs/__tests__/tree.test.js +0 -11
- package/dist/cjs/__tests__/update.test.js +0 -222
- package/dist/cjs/package.json +0 -4
- package/dist/esm/__tests__/checkIfOnUpdate.test.js +0 -73
- package/dist/esm/__tests__/children.test.js +0 -177
- package/dist/esm/__tests__/define.test.js +0 -53
- package/dist/esm/__tests__/inheritStateUpdates.test.js +0 -62
- package/dist/esm/__tests__/renderElement.test.js +0 -116
- package/dist/esm/__tests__/resetElement.test.js +0 -35
- package/dist/esm/__tests__/set.test.js +0 -256
- package/dist/esm/__tests__/throughExecProps.test.js +0 -62
- package/dist/esm/__tests__/throughInitialDefine.test.js +0 -79
- package/dist/esm/__tests__/throughInitialExec.test.js +0 -73
- package/dist/esm/__tests__/throughUpdatedDefine.test.js +0 -69
- package/dist/esm/__tests__/throughUpdatedExec.test.js +0 -84
- package/dist/esm/__tests__/tree.test.js +0 -11
- package/dist/esm/__tests__/update.test.js +0 -222
- package/methods/set.js +0 -63
- package/methods/v2.js +0 -83
- package/mixins/attr.js +0 -32
- package/mixins/classList.js +0 -54
- package/mixins/data.js +0 -26
- package/mixins/html.js +0 -21
- package/mixins/index.js +0 -23
- package/mixins/registry.js +0 -46
- package/mixins/scope.js +0 -23
- package/mixins/state.js +0 -19
- package/mixins/style.js +0 -16
- package/mixins/text.js +0 -26
- package/utils/applyParam.js +0 -34
- package/utils/index.js +0 -3
package/dist/esm/update.js
CHANGED
|
@@ -9,16 +9,14 @@ import {
|
|
|
9
9
|
isUndefined,
|
|
10
10
|
merge,
|
|
11
11
|
overwriteDeep,
|
|
12
|
-
deepClone,
|
|
13
12
|
isMethod,
|
|
14
13
|
findInheritedState,
|
|
15
|
-
deepMerge,
|
|
16
14
|
OPTIONS,
|
|
17
15
|
updateProps,
|
|
18
16
|
captureSnapshot,
|
|
19
17
|
propertizeUpdate
|
|
20
18
|
} from "@domql/utils";
|
|
21
|
-
import { applyEvent, triggerEventOn, triggerEventOnUpdate } from "
|
|
19
|
+
import { applyEvent, triggerEventOn, triggerEventOnUpdate } from "./event/index.js";
|
|
22
20
|
import { createState } from "@domql/state";
|
|
23
21
|
import { create } from "./create.js";
|
|
24
22
|
import {
|
|
@@ -39,13 +37,8 @@ const UPDATE_DEFAULT_OPTIONS = {
|
|
|
39
37
|
calleeElement: false,
|
|
40
38
|
exclude: METHODS_EXL
|
|
41
39
|
};
|
|
42
|
-
const update =
|
|
43
|
-
const
|
|
44
|
-
const options = deepClone(
|
|
45
|
-
isObject(opts) ? deepMerge(opts, UPDATE_DEFAULT_OPTIONS) : UPDATE_DEFAULT_OPTIONS,
|
|
46
|
-
{ exclude: ["calleeElement"] }
|
|
47
|
-
);
|
|
48
|
-
options.calleeElement = calleeElementCache;
|
|
40
|
+
const update = function(params = {}, opts) {
|
|
41
|
+
const options = isObject(opts) ? { ...UPDATE_DEFAULT_OPTIONS, ...opts } : { ...UPDATE_DEFAULT_OPTIONS };
|
|
49
42
|
const element = this;
|
|
50
43
|
let ref = element.__ref;
|
|
51
44
|
if (!ref) ref = element.__ref = {};
|
|
@@ -55,7 +48,7 @@ const update = async function(params = {}, opts) {
|
|
|
55
48
|
);
|
|
56
49
|
if (snapshotHasUpdated) return;
|
|
57
50
|
if (!options.preventListeners) {
|
|
58
|
-
|
|
51
|
+
triggerEventOnUpdate("startUpdate", params, element, options);
|
|
59
52
|
}
|
|
60
53
|
const { parent, node, key } = element;
|
|
61
54
|
const { exclude, preventInheritAtCurrentState } = options;
|
|
@@ -67,37 +60,38 @@ const update = async function(params = {}, opts) {
|
|
|
67
60
|
params = { text: params };
|
|
68
61
|
}
|
|
69
62
|
params = propertizeUpdate.call(element, params);
|
|
70
|
-
const inheritState =
|
|
63
|
+
const inheritState = inheritStateUpdates(element, options);
|
|
71
64
|
if (inheritState === false) return;
|
|
72
|
-
const ifFails =
|
|
65
|
+
const ifFails = checkIfOnUpdate(element, parent, options);
|
|
73
66
|
if (ifFails) return;
|
|
74
67
|
if (ref.__if && !options.preventPropsUpdate) {
|
|
75
68
|
const hasParentProps = parent.props && (parent.props[key] || parent.props.childProps);
|
|
76
|
-
const hasFunctionInProps = ref.__propsStack.
|
|
77
|
-
const props = params.props || hasParentProps || hasFunctionInProps
|
|
69
|
+
const hasFunctionInProps = ref.__propsStack.some(isFunction);
|
|
70
|
+
const props = params.props || hasParentProps || hasFunctionInProps;
|
|
78
71
|
if (props) updateProps(props, element, parent);
|
|
79
72
|
}
|
|
80
73
|
if (!options.preventBeforeUpdateListener && !options.preventListeners) {
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
74
|
+
const hasBeforeUpdate = element.on?.beforeUpdate || element.props?.onBeforeUpdate;
|
|
75
|
+
if (hasBeforeUpdate) {
|
|
76
|
+
const simulate = { ...params, ...element };
|
|
77
|
+
const beforeUpdateReturns = triggerEventOnUpdate(
|
|
78
|
+
"beforeUpdate",
|
|
79
|
+
params,
|
|
80
|
+
simulate,
|
|
81
|
+
options
|
|
82
|
+
);
|
|
83
|
+
if (beforeUpdateReturns === false) return element;
|
|
84
|
+
}
|
|
89
85
|
}
|
|
90
86
|
overwriteDeep(element, params);
|
|
91
87
|
throughExecProps(element);
|
|
92
88
|
throughUpdatedExec(element, { ignore: UPDATE_DEFAULT_OPTIONS });
|
|
93
89
|
throughUpdatedDefine(element);
|
|
94
90
|
if (!options.isForced && !options.preventListeners) {
|
|
95
|
-
|
|
91
|
+
triggerEventOn("beforeClassAssign", element, options);
|
|
96
92
|
}
|
|
97
93
|
if (!ref.__if) return false;
|
|
98
|
-
if (!node)
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
94
|
+
if (!node) return;
|
|
101
95
|
const {
|
|
102
96
|
preventUpdate,
|
|
103
97
|
preventDefineUpdate,
|
|
@@ -115,16 +109,20 @@ const update = async function(params = {}, opts) {
|
|
|
115
109
|
options.preventUpdateAfterCount = 1;
|
|
116
110
|
} else options.preventUpdateAfterCount++;
|
|
117
111
|
}
|
|
112
|
+
const preventUpdateSet = isArray(preventUpdate) ? new Set(preventUpdate) : null;
|
|
113
|
+
const preventDefineUpdateSet = isArray(preventDefineUpdate) ? new Set(preventDefineUpdate) : null;
|
|
118
114
|
for (const param in element) {
|
|
119
115
|
const prop = element[param];
|
|
120
|
-
if (!Object.hasOwnProperty.call(element, param)) continue;
|
|
121
|
-
const isInPreventUpdate =
|
|
122
|
-
const isInPreventDefineUpdate =
|
|
123
|
-
|
|
116
|
+
if (!Object.prototype.hasOwnProperty.call(element, param)) continue;
|
|
117
|
+
const isInPreventUpdate = preventUpdateSet && preventUpdateSet.has(param);
|
|
118
|
+
const isInPreventDefineUpdate = preventDefineUpdateSet && preventDefineUpdateSet.has(param);
|
|
119
|
+
const isRootEventHandler = isFunction(prop) && param.length > 2 && param.charCodeAt(0) === 111 && param.charCodeAt(1) === 110 && // 'on'
|
|
120
|
+
param.charCodeAt(2) >= 65 && param.charCodeAt(2) <= 90;
|
|
121
|
+
if (isUndefined(prop) || isInPreventUpdate || isInPreventDefineUpdate || preventDefineUpdate === true || preventDefineUpdate === param || preventStateUpdate && param === "state" || isMethod(param, element) || isRootEventHandler || isObject(REGISTRY[param])) {
|
|
124
122
|
continue;
|
|
125
123
|
}
|
|
126
124
|
if (preventStateUpdate === "once") options.preventStateUpdate = false;
|
|
127
|
-
const isElement =
|
|
125
|
+
const isElement = applyParam(param, element, options);
|
|
128
126
|
if (isElement) {
|
|
129
127
|
const { hasDefine, hasContextDefine } = isElement;
|
|
130
128
|
const canUpdate = isObject(prop) && !hasDefine && !hasContextDefine && !preventRecursive;
|
|
@@ -133,39 +131,79 @@ const update = async function(params = {}, opts) {
|
|
|
133
131
|
if (options.onEachUpdate) {
|
|
134
132
|
options.onEachUpdate(param, element, element.state, element.context);
|
|
135
133
|
}
|
|
136
|
-
const
|
|
134
|
+
const childParams = params[param];
|
|
135
|
+
if (childParams === void 0 && !options.isForced) continue;
|
|
136
|
+
const childUpdateCall = () => update.call(prop, childParams, {
|
|
137
137
|
...options,
|
|
138
138
|
currentSnapshot: snapshotOnCallee,
|
|
139
139
|
calleeElement
|
|
140
140
|
});
|
|
141
141
|
if (lazyLoad) {
|
|
142
|
-
window.requestAnimationFrame(
|
|
143
|
-
|
|
144
|
-
if (!options.preventUpdateListener) {
|
|
145
|
-
|
|
142
|
+
window.requestAnimationFrame(() => {
|
|
143
|
+
childUpdateCall();
|
|
144
|
+
if (!options.preventUpdateListener && !options.preventListeners) {
|
|
145
|
+
triggerEventOn("lazyLoad", element, options);
|
|
146
146
|
}
|
|
147
147
|
});
|
|
148
|
-
} else
|
|
148
|
+
} else childUpdateCall();
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
if (!preventContentUpdate) {
|
|
152
|
-
const
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
const contentKey = ref.contentElementKey || "content";
|
|
153
|
+
const existingContent = element[contentKey];
|
|
154
|
+
const childrenProp = params.children || element.children;
|
|
155
|
+
if (childrenProp) {
|
|
156
|
+
const content = setChildren(childrenProp, element, opts);
|
|
157
|
+
if (content && !ref.__noChildrenDifference) {
|
|
158
|
+
setContent(content, element, options);
|
|
159
|
+
} else if (existingContent?.__ref && isFunction(existingContent.update)) {
|
|
160
|
+
const lazyLoad = element.props?.lazyLoad || options.lazyLoad;
|
|
161
|
+
const contentUpdateCall = () => update.call(existingContent, params[contentKey], {
|
|
162
|
+
...options,
|
|
163
|
+
currentSnapshot: snapshotOnCallee,
|
|
164
|
+
calleeElement
|
|
165
|
+
});
|
|
166
|
+
if (lazyLoad) {
|
|
167
|
+
window.requestAnimationFrame(() => {
|
|
168
|
+
contentUpdateCall();
|
|
169
|
+
if (!options.preventUpdateListener && !options.preventListeners) {
|
|
170
|
+
triggerEventOn("lazyLoad", element, options);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
} else contentUpdateCall();
|
|
174
|
+
}
|
|
175
|
+
} else if (existingContent?.__ref && isFunction(existingContent.update)) {
|
|
176
|
+
const lazyLoad = element.props?.lazyLoad || options.lazyLoad;
|
|
177
|
+
const contentUpdateCall = () => update.call(existingContent, params[contentKey], {
|
|
178
|
+
...options,
|
|
179
|
+
currentSnapshot: snapshotOnCallee,
|
|
180
|
+
calleeElement
|
|
181
|
+
});
|
|
182
|
+
if (lazyLoad) {
|
|
183
|
+
window.requestAnimationFrame(() => {
|
|
184
|
+
contentUpdateCall();
|
|
185
|
+
if (!options.preventUpdateListener && !options.preventListeners) {
|
|
186
|
+
triggerEventOn("lazyLoad", element, options);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
} else contentUpdateCall();
|
|
190
|
+
} else {
|
|
191
|
+
const content = element.children || params.content;
|
|
192
|
+
if (content) {
|
|
193
|
+
setContent(content, element, options);
|
|
194
|
+
}
|
|
156
195
|
}
|
|
157
196
|
}
|
|
158
|
-
if (!preventUpdateListener) {
|
|
159
|
-
|
|
197
|
+
if (!preventUpdateListener && !options.preventListeners) {
|
|
198
|
+
triggerEventOn("update", element, options);
|
|
160
199
|
}
|
|
161
200
|
};
|
|
162
|
-
const checkIfOnUpdate =
|
|
163
|
-
|
|
164
|
-
if (!isFunction(element.if) && !isFunction((_a = element.props) == null ? void 0 : _a.if) || !parent) {
|
|
201
|
+
const checkIfOnUpdate = (element, parent, options) => {
|
|
202
|
+
if (!isFunction(element.if) && !isFunction(element.props?.if) || !parent) {
|
|
165
203
|
return;
|
|
166
204
|
}
|
|
167
205
|
const ref = element.__ref;
|
|
168
|
-
const ifPassed = (element.if ||
|
|
206
|
+
const ifPassed = (element.if || element.props?.if)(
|
|
169
207
|
element,
|
|
170
208
|
element.state,
|
|
171
209
|
element.context,
|
|
@@ -193,22 +231,22 @@ const checkIfOnUpdate = async (element, parent, options) => {
|
|
|
193
231
|
const contentKey = ref.contentElementKey;
|
|
194
232
|
if (element.children) {
|
|
195
233
|
element.removeContent();
|
|
196
|
-
} else if (
|
|
234
|
+
} else if (element[contentKey]?.parseDeep) {
|
|
197
235
|
element[contentKey] = element[contentKey].parseDeep();
|
|
198
236
|
}
|
|
199
237
|
const previousElement = element.previousElement();
|
|
200
|
-
const previousNode = previousElement
|
|
201
|
-
const hasPrevious = previousNode
|
|
238
|
+
const previousNode = previousElement?.node;
|
|
239
|
+
const hasPrevious = previousNode?.parentNode;
|
|
202
240
|
const nextElement = element.nextElement();
|
|
203
|
-
const nextNode = nextElement
|
|
204
|
-
const hasNext = nextNode
|
|
241
|
+
const nextNode = nextElement?.node;
|
|
242
|
+
const hasNext = nextNode?.parentNode;
|
|
205
243
|
const attachOptions = (hasPrevious || hasNext) && {
|
|
206
244
|
position: hasPrevious ? "after" : hasNext ? "before" : null,
|
|
207
245
|
node: hasPrevious && previousNode || hasNext && nextNode
|
|
208
246
|
};
|
|
209
247
|
delete element.__ref;
|
|
210
248
|
delete element.parent;
|
|
211
|
-
const createdElement =
|
|
249
|
+
const createdElement = create(
|
|
212
250
|
element,
|
|
213
251
|
parent,
|
|
214
252
|
element.key,
|
|
@@ -216,11 +254,7 @@ const checkIfOnUpdate = async (element, parent, options) => {
|
|
|
216
254
|
attachOptions
|
|
217
255
|
);
|
|
218
256
|
if (options.preventUpdate !== true && element.on && isFunction(element.on.update)) {
|
|
219
|
-
|
|
220
|
-
element.on.update,
|
|
221
|
-
createdElement,
|
|
222
|
-
createdElement.state
|
|
223
|
-
);
|
|
257
|
+
applyEvent(element.on.update, createdElement, createdElement.state);
|
|
224
258
|
}
|
|
225
259
|
return createdElement;
|
|
226
260
|
}
|
|
@@ -229,14 +263,14 @@ const checkIfOnUpdate = async (element, parent, options) => {
|
|
|
229
263
|
delete ref.__if;
|
|
230
264
|
}
|
|
231
265
|
};
|
|
232
|
-
const inheritStateUpdates =
|
|
266
|
+
const inheritStateUpdates = (element, options) => {
|
|
233
267
|
const { __ref: ref } = element;
|
|
234
268
|
const stateKey = ref.__state;
|
|
235
269
|
const { parent, state } = element;
|
|
236
270
|
const { preventUpdateTriggerStateUpdate, isHoisted, execStateFunction } = options;
|
|
237
271
|
if (preventUpdateTriggerStateUpdate) return;
|
|
238
272
|
if (!stateKey && !ref.__hasRootState) {
|
|
239
|
-
element.state = parent
|
|
273
|
+
element.state = parent?.state || {};
|
|
240
274
|
return;
|
|
241
275
|
}
|
|
242
276
|
const shouldForceFunctionState = isFunction(stateKey) && !isHoisted && execStateFunction;
|
|
@@ -253,7 +287,7 @@ const inheritStateUpdates = async (element, options) => {
|
|
|
253
287
|
const keyInParentState = findInheritedState(element, element.parent);
|
|
254
288
|
if (!keyInParentState || options.preventInheritedStateUpdate) return;
|
|
255
289
|
if (!options.preventBeforeStateUpdateListener && !options.preventListeners) {
|
|
256
|
-
const initStateReturns =
|
|
290
|
+
const initStateReturns = triggerEventOnUpdate(
|
|
257
291
|
"beforeStateUpdate",
|
|
258
292
|
keyInParentState,
|
|
259
293
|
element,
|
|
@@ -261,19 +295,14 @@ const inheritStateUpdates = async (element, options) => {
|
|
|
261
295
|
);
|
|
262
296
|
if (initStateReturns === false) return element;
|
|
263
297
|
}
|
|
264
|
-
const newState =
|
|
298
|
+
const newState = createStateUpdate(element, parent, options);
|
|
265
299
|
if (!options.preventStateUpdateListener && !options.preventListeners) {
|
|
266
|
-
|
|
267
|
-
"stateUpdate",
|
|
268
|
-
newState.parse(),
|
|
269
|
-
element,
|
|
270
|
-
options
|
|
271
|
-
);
|
|
300
|
+
triggerEventOnUpdate("stateUpdate", newState.parse(), element, options);
|
|
272
301
|
}
|
|
273
302
|
};
|
|
274
|
-
const createStateUpdate =
|
|
303
|
+
const createStateUpdate = (element, parent, options) => {
|
|
275
304
|
const __stateChildren = element.state.__children;
|
|
276
|
-
const newState =
|
|
305
|
+
const newState = createState(element, parent);
|
|
277
306
|
element.state = newState;
|
|
278
307
|
for (const child in __stateChildren) {
|
|
279
308
|
if (newState[child]) newState.__children[child] = __stateChildren[child];
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { isFunction } from "@domql/utils";
|
|
1
|
+
import { exec, isFunction } from "@domql/utils";
|
|
2
2
|
import { REGISTRY } from "../mixins/index.js";
|
|
3
|
-
const applyParam =
|
|
3
|
+
const applyParam = (param, element, options) => {
|
|
4
4
|
const { node, context, __ref: ref } = element;
|
|
5
|
-
const prop = element[param];
|
|
5
|
+
const prop = exec(element[param], element);
|
|
6
6
|
const { onlyUpdate } = options;
|
|
7
7
|
const DOMQLProperty = REGISTRY[param];
|
|
8
|
-
const DOMQLPropertyFromContext = context
|
|
8
|
+
const DOMQLPropertyFromContext = context?.registry?.[param];
|
|
9
9
|
const isGlobalTransformer = DOMQLPropertyFromContext || DOMQLProperty;
|
|
10
|
-
const hasDefine = element.define
|
|
11
|
-
const hasContextDefine = context
|
|
10
|
+
const hasDefine = element.define?.[param];
|
|
11
|
+
const hasContextDefine = context?.define?.[param];
|
|
12
12
|
if (!ref.__if) return;
|
|
13
13
|
const hasOnlyUpdate = onlyUpdate ? onlyUpdate === param || element.lookup(onlyUpdate) : true;
|
|
14
14
|
if (isGlobalTransformer && !hasContextDefine && hasOnlyUpdate) {
|
|
15
15
|
if (isFunction(isGlobalTransformer)) {
|
|
16
|
-
|
|
17
|
-
return;
|
|
16
|
+
isGlobalTransformer(prop, element, node, options);
|
|
18
17
|
}
|
|
18
|
+
return;
|
|
19
19
|
}
|
|
20
20
|
return { hasDefine, hasContextDefine };
|
|
21
21
|
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isArray,
|
|
3
|
+
isFunction,
|
|
4
|
+
isObject,
|
|
5
|
+
isString,
|
|
6
|
+
deepClone,
|
|
7
|
+
isNotProduction
|
|
8
|
+
} from "@domql/utils";
|
|
9
|
+
const generateHash = () => Math.random().toString(36).substring(2);
|
|
10
|
+
const extendStackRegistry = {};
|
|
11
|
+
const extendCachedRegistry = {};
|
|
12
|
+
const getHashedExtend = (extend) => {
|
|
13
|
+
return extendStackRegistry[extend.__hash];
|
|
14
|
+
};
|
|
15
|
+
const setHashedExtend = (extend, stack) => {
|
|
16
|
+
const hash = generateHash();
|
|
17
|
+
if (!isString(extend)) {
|
|
18
|
+
extend.__hash = hash;
|
|
19
|
+
}
|
|
20
|
+
extendStackRegistry[hash] = stack;
|
|
21
|
+
return stack;
|
|
22
|
+
};
|
|
23
|
+
const getExtendStackRegistry = (extend, stack) => {
|
|
24
|
+
if (extend.__hash) {
|
|
25
|
+
return stack.concat(getHashedExtend(extend));
|
|
26
|
+
}
|
|
27
|
+
return setHashedExtend(extend, stack);
|
|
28
|
+
};
|
|
29
|
+
const extractArrayExtend = (extend, stack, context) => {
|
|
30
|
+
for (let i = 0; i < extend.length; i++) flattenExtend(extend[i], stack, context);
|
|
31
|
+
return stack;
|
|
32
|
+
};
|
|
33
|
+
const deepExtend = (extend, stack, context) => {
|
|
34
|
+
const extendOflattenExtend = extend.extend;
|
|
35
|
+
if (extendOflattenExtend) {
|
|
36
|
+
flattenExtend(extendOflattenExtend, stack, context);
|
|
37
|
+
}
|
|
38
|
+
return stack;
|
|
39
|
+
};
|
|
40
|
+
const flattenExtend = (extend, stack, context) => {
|
|
41
|
+
if (!extend) return stack;
|
|
42
|
+
if (isArray(extend)) return extractArrayExtend(extend, stack, context);
|
|
43
|
+
if (isString(extend)) extend = fallbackStringExtend(extend, context);
|
|
44
|
+
stack.push(extend);
|
|
45
|
+
if (extend.extend) deepExtend(extend, stack, context);
|
|
46
|
+
return stack;
|
|
47
|
+
};
|
|
48
|
+
const deepMergeExtend = (element, extend) => {
|
|
49
|
+
for (const e in extend) {
|
|
50
|
+
if (e === "parent" || e === "node" || e === "__element") continue;
|
|
51
|
+
const elementProp = element[e];
|
|
52
|
+
const extendProp = extend[e];
|
|
53
|
+
if (elementProp === void 0) {
|
|
54
|
+
element[e] = extendProp;
|
|
55
|
+
} else if (isObject(elementProp) && isObject(extendProp)) {
|
|
56
|
+
deepMergeExtend(elementProp, extendProp);
|
|
57
|
+
} else if (isArray(elementProp) && isArray(extendProp)) {
|
|
58
|
+
element[e] = elementProp.concat(extendProp);
|
|
59
|
+
} else if (isArray(elementProp) && isObject(extendProp)) {
|
|
60
|
+
const obj = deepMergeExtend({}, elementProp);
|
|
61
|
+
element[e] = deepMergeExtend(obj, extendProp);
|
|
62
|
+
} else if (elementProp === void 0 && isFunction(extendProp)) {
|
|
63
|
+
element[e] = extendProp;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return element;
|
|
67
|
+
};
|
|
68
|
+
const cloneAndMergeArrayExtend = (stack) => {
|
|
69
|
+
return stack.reduce((a, c) => {
|
|
70
|
+
return deepMergeExtend(a, deepClone(c));
|
|
71
|
+
}, {});
|
|
72
|
+
};
|
|
73
|
+
const fallbackStringExtend = (extend, context, options = {}, variant) => {
|
|
74
|
+
const COMPONENTS = context?.components || options.components;
|
|
75
|
+
const PAGES = context?.pages || options.pages;
|
|
76
|
+
if (isString(extend)) {
|
|
77
|
+
const componentExists = COMPONENTS && (COMPONENTS[extend + "." + variant] || COMPONENTS[extend] || COMPONENTS["smbls." + extend]);
|
|
78
|
+
const pageExists = PAGES && extend.charCodeAt(0) === 47 && PAGES[extend];
|
|
79
|
+
if (componentExists) return componentExists;
|
|
80
|
+
else if (pageExists) return pageExists;
|
|
81
|
+
else {
|
|
82
|
+
if (options.verbose && isNotProduction()) {
|
|
83
|
+
console.warn("Extend is string but component was not found:", extend);
|
|
84
|
+
}
|
|
85
|
+
return {};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return extend;
|
|
89
|
+
};
|
|
90
|
+
const jointStacks = (extendStack, childExtendStack) => {
|
|
91
|
+
return [].concat(extendStack.slice(0, 1)).concat(childExtendStack.slice(0, 1)).concat(extendStack.slice(1)).concat(childExtendStack.slice(1));
|
|
92
|
+
};
|
|
93
|
+
const getExtendStack = (extend, context) => {
|
|
94
|
+
if (!extend) return [];
|
|
95
|
+
if (extend.__hash) return getHashedExtend(extend) || [];
|
|
96
|
+
const stack = flattenExtend(extend, [], context);
|
|
97
|
+
return getExtendStackRegistry(extend, stack);
|
|
98
|
+
};
|
|
99
|
+
const getExtendMerged = (extend) => {
|
|
100
|
+
const stack = getExtendStack(extend);
|
|
101
|
+
return cloneAndMergeArrayExtend(stack);
|
|
102
|
+
};
|
|
103
|
+
export {
|
|
104
|
+
cloneAndMergeArrayExtend,
|
|
105
|
+
deepExtend,
|
|
106
|
+
deepMergeExtend,
|
|
107
|
+
extendCachedRegistry,
|
|
108
|
+
extendStackRegistry,
|
|
109
|
+
extractArrayExtend,
|
|
110
|
+
fallbackStringExtend,
|
|
111
|
+
flattenExtend,
|
|
112
|
+
generateHash,
|
|
113
|
+
getExtendMerged,
|
|
114
|
+
getExtendStack,
|
|
115
|
+
getExtendStackRegistry,
|
|
116
|
+
getHashedExtend,
|
|
117
|
+
jointStacks,
|
|
118
|
+
setHashedExtend
|
|
119
|
+
};
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isFunction, lowercaseFirstLetter } from "@domql/utils";
|
|
2
|
+
const propagateEventsFromProps = (element) => {
|
|
3
|
+
const { props, on } = element;
|
|
4
|
+
for (const v in props) {
|
|
5
|
+
if (v.charCodeAt(0) !== 111 || v.charCodeAt(1) !== 110) continue;
|
|
6
|
+
const eventName = lowercaseFirstLetter(v.slice(2));
|
|
7
|
+
const origEvent = on[eventName];
|
|
8
|
+
const funcFromProps = props[v];
|
|
9
|
+
if (isFunction(origEvent)) {
|
|
10
|
+
on[eventName] = (...args) => {
|
|
11
|
+
const originalEventRetunrs = origEvent(...args);
|
|
12
|
+
if (originalEventRetunrs !== false) return funcFromProps(...args);
|
|
13
|
+
};
|
|
14
|
+
} else on[eventName] = funcFromProps;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const propagateEventsFromElement = (element) => {
|
|
18
|
+
const { on } = element;
|
|
19
|
+
for (const param in element) {
|
|
20
|
+
if (param.charCodeAt(0) !== 111 || param.charCodeAt(1) !== 110 || !Object.prototype.hasOwnProperty.call(element, param)) continue;
|
|
21
|
+
const fn = element[param];
|
|
22
|
+
if (!isFunction(fn)) continue;
|
|
23
|
+
const eventName = lowercaseFirstLetter(param.slice(2));
|
|
24
|
+
const origEvent = on[eventName];
|
|
25
|
+
if (isFunction(origEvent)) {
|
|
26
|
+
on[eventName] = (...args) => {
|
|
27
|
+
const ret = origEvent(...args);
|
|
28
|
+
if (ret !== false) return fn(...args);
|
|
29
|
+
};
|
|
30
|
+
} else on[eventName] = fn;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export {
|
|
34
|
+
propagateEventsFromElement,
|
|
35
|
+
propagateEventsFromProps
|
|
36
|
+
};
|