@domql/element 2.5.184 → 2.5.186
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/create.js +11 -11
- package/dist/cjs/create.js +11 -11
- package/dist/cjs/extend.js +1 -1
- package/dist/cjs/iterate.js +2 -2
- package/dist/cjs/methods/index.js +2 -2
- package/dist/cjs/methods/set.js +24 -24
- package/dist/cjs/methods/v2.js +1 -1
- package/dist/cjs/mixins/attr.js +1 -1
- package/dist/cjs/mixins/content.js +1 -1
- package/dist/cjs/mixins/index.js +11 -11
- package/dist/cjs/mixins/registry.js +28 -10
- package/dist/cjs/mixins/text.js +1 -1
- package/dist/cjs/node.js +6 -6
- package/dist/cjs/props/create.js +2 -2
- package/dist/cjs/props/index.js +4 -4
- package/dist/cjs/props/update.js +2 -2
- package/dist/cjs/set.js +4 -4
- package/dist/cjs/update.js +8 -8
- package/dist/cjs/utils/applyParam.js +1 -1
- package/dist/cjs/utils/component.js +2 -2
- package/dist/cjs/utils/index.js +3 -3
- package/dist/cjs/utils/object.js +1 -1
- package/dist/cjs/utils/onlyResolveExtends.js +1 -1
- package/dist/esm/cache/index.js +4 -0
- package/dist/esm/cache/options.js +6 -0
- package/dist/esm/create.js +334 -0
- package/dist/esm/define.js +14 -0
- package/dist/esm/extend.js +71 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/iterate.js +112 -0
- package/dist/esm/methods/index.js +333 -0
- package/dist/esm/methods/set.js +61 -0
- package/dist/esm/methods/v2.js +89 -0
- package/dist/esm/mixins/attr.js +26 -0
- package/dist/esm/mixins/classList.js +55 -0
- package/dist/esm/mixins/content.js +54 -0
- package/dist/esm/mixins/data.js +22 -0
- package/dist/esm/mixins/html.js +18 -0
- package/dist/esm/mixins/index.js +23 -0
- package/dist/esm/mixins/registry.js +105 -0
- package/dist/esm/mixins/scope.js +18 -0
- package/dist/esm/mixins/state.js +19 -0
- package/dist/esm/mixins/style.js +15 -0
- package/dist/esm/mixins/text.js +28 -0
- package/dist/esm/node.js +69 -0
- package/dist/esm/props/create.js +78 -0
- package/dist/esm/props/ignore.js +4 -0
- package/dist/esm/props/index.js +4 -0
- package/dist/esm/props/inherit.js +33 -0
- package/dist/esm/props/update.js +17 -0
- package/dist/esm/set.js +73 -0
- package/dist/esm/tree.js +11 -0
- package/dist/esm/update.js +255 -0
- package/dist/esm/utils/applyParam.js +25 -0
- package/dist/esm/utils/component.js +65 -0
- package/dist/esm/utils/extendUtils.js +122 -0
- package/dist/esm/utils/index.js +3 -0
- package/dist/esm/utils/object.js +159 -0
- package/dist/esm/utils/onlyResolveExtends.js +81 -0
- package/dist/esm/utils/propEvents.js +21 -0
- package/extend.js +1 -1
- package/iterate.js +2 -2
- package/methods/index.js +2 -2
- package/methods/set.js +18 -19
- package/methods/v2.js +1 -1
- package/mixins/attr.js +1 -1
- package/mixins/content.js +1 -1
- package/mixins/index.js +11 -11
- package/mixins/registry.js +10 -6
- package/mixins/text.js +1 -1
- package/node.js +6 -6
- package/package.json +7 -7
- package/props/create.js +2 -2
- package/props/index.js +4 -4
- package/props/update.js +2 -2
- package/set.js +4 -4
- package/update.js +8 -8
- package/utils/applyParam.js +1 -1
- package/utils/component.js +2 -2
- package/utils/index.js +3 -3
- package/utils/object.js +1 -1
- package/utils/onlyResolveExtends.js +1 -1
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import {
|
|
2
|
+
window,
|
|
3
|
+
exec,
|
|
4
|
+
isArray,
|
|
5
|
+
isFunction,
|
|
6
|
+
isNumber,
|
|
7
|
+
isObject,
|
|
8
|
+
isString,
|
|
9
|
+
isUndefined,
|
|
10
|
+
merge,
|
|
11
|
+
isVariant,
|
|
12
|
+
overwriteDeep,
|
|
13
|
+
createSnapshotId,
|
|
14
|
+
deepClone
|
|
15
|
+
} from "@domql/utils";
|
|
16
|
+
import { applyEvent, triggerEventOn, triggerEventOnUpdate } from "@domql/event";
|
|
17
|
+
import { isMethod } from "./methods/index.js";
|
|
18
|
+
import { updateProps } from "./props/index.js";
|
|
19
|
+
import { createState, findInheritedState } from "@domql/state";
|
|
20
|
+
import { create } from "./create.js";
|
|
21
|
+
import { throughExecProps, throughUpdatedDefine, throughUpdatedExec } from "./iterate.js";
|
|
22
|
+
import { REGISTRY } from "./mixins/index.js";
|
|
23
|
+
import { applyParam } from "./utils/applyParam.js";
|
|
24
|
+
import { OPTIONS } from "./cache/options.js";
|
|
25
|
+
import { METHODS_EXL, deepMerge } from "./utils/index.js";
|
|
26
|
+
const snapshot = {
|
|
27
|
+
snapshotId: createSnapshotId
|
|
28
|
+
};
|
|
29
|
+
const UPDATE_DEFAULT_OPTIONS = {
|
|
30
|
+
stackChanges: false,
|
|
31
|
+
cleanExec: true,
|
|
32
|
+
preventRecursive: false,
|
|
33
|
+
currentSnapshot: false,
|
|
34
|
+
calleeElement: false,
|
|
35
|
+
excludes: METHODS_EXL
|
|
36
|
+
};
|
|
37
|
+
const update = function(params = {}, opts) {
|
|
38
|
+
const calleeElementCache = opts == null ? void 0 : opts.calleeElement;
|
|
39
|
+
const options = deepClone(isObject(opts) ? deepMerge(opts, UPDATE_DEFAULT_OPTIONS) : UPDATE_DEFAULT_OPTIONS, { exclude: ["calleeElement"] });
|
|
40
|
+
options.calleeElement = calleeElementCache;
|
|
41
|
+
const element = this;
|
|
42
|
+
const { parent, node, key } = element;
|
|
43
|
+
const { excludes, preventInheritAtCurrentState } = options;
|
|
44
|
+
let ref = element.__ref;
|
|
45
|
+
if (!ref)
|
|
46
|
+
ref = element.__ref = {};
|
|
47
|
+
const [snapshotOnCallee, calleeElement, snapshotHasUpdated] = captureSnapshot(element, options);
|
|
48
|
+
if (snapshotHasUpdated)
|
|
49
|
+
return;
|
|
50
|
+
if (!options.preventListeners)
|
|
51
|
+
triggerEventOnUpdate("startUpdate", params, element, options);
|
|
52
|
+
if (preventInheritAtCurrentState && preventInheritAtCurrentState.__element === element)
|
|
53
|
+
return;
|
|
54
|
+
if (!excludes)
|
|
55
|
+
merge(options, UPDATE_DEFAULT_OPTIONS);
|
|
56
|
+
if (isString(params) || isNumber(params)) {
|
|
57
|
+
params = { text: params };
|
|
58
|
+
}
|
|
59
|
+
const inheritState = inheritStateUpdates(element, options);
|
|
60
|
+
if (inheritState === false)
|
|
61
|
+
return;
|
|
62
|
+
const ifFails = checkIfOnUpdate(element, parent, options);
|
|
63
|
+
if (ifFails)
|
|
64
|
+
return;
|
|
65
|
+
if (ref.__if && !options.preventPropsUpdate) {
|
|
66
|
+
const hasParentProps = parent.props && (parent.props[key] || parent.props.childProps);
|
|
67
|
+
const hasFunctionInProps = ref.__props.filter((v) => isFunction(v));
|
|
68
|
+
const props = params.props || hasParentProps || hasFunctionInProps.length;
|
|
69
|
+
if (props)
|
|
70
|
+
updateProps(props, element, parent);
|
|
71
|
+
}
|
|
72
|
+
if (!options.preventBeforeUpdateListener && !options.preventListeners) {
|
|
73
|
+
const beforeUpdateReturns = triggerEventOnUpdate("beforeUpdate", params, element, options);
|
|
74
|
+
if (beforeUpdateReturns === false)
|
|
75
|
+
return element;
|
|
76
|
+
}
|
|
77
|
+
overwriteDeep(element, params, { exclude: METHODS_EXL });
|
|
78
|
+
throughExecProps(element);
|
|
79
|
+
throughUpdatedExec(element, { ignore: UPDATE_DEFAULT_OPTIONS });
|
|
80
|
+
throughUpdatedDefine(element);
|
|
81
|
+
if (!options.isForced && !options.preventListeners) {
|
|
82
|
+
triggerEventOn("beforeClassAssign", element, options);
|
|
83
|
+
}
|
|
84
|
+
if (!ref.__if)
|
|
85
|
+
return false;
|
|
86
|
+
if (!node) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const {
|
|
90
|
+
preventUpdate,
|
|
91
|
+
preventDefineUpdate,
|
|
92
|
+
preventContentUpdate,
|
|
93
|
+
preventStateUpdate,
|
|
94
|
+
preventRecursive,
|
|
95
|
+
preventUpdateListener,
|
|
96
|
+
preventUpdateAfter,
|
|
97
|
+
preventUpdateAfterCount
|
|
98
|
+
} = options;
|
|
99
|
+
if (preventUpdateAfter) {
|
|
100
|
+
if (isNumber(preventUpdateAfterCount) && preventUpdateAfter <= preventUpdateAfterCount)
|
|
101
|
+
return;
|
|
102
|
+
else if (options.preventUpdateAfterCount === void 0)
|
|
103
|
+
options.preventUpdateAfterCount = 1;
|
|
104
|
+
else
|
|
105
|
+
options.preventUpdateAfterCount++;
|
|
106
|
+
}
|
|
107
|
+
for (const param in element) {
|
|
108
|
+
const prop = element[param];
|
|
109
|
+
if (element.Iframe && element.Overlay && element.ComponentFrameCanvas && param === "Iframe") {
|
|
110
|
+
console.log("isframe");
|
|
111
|
+
}
|
|
112
|
+
if (!Object.hasOwnProperty.call(element, param))
|
|
113
|
+
continue;
|
|
114
|
+
const isInPreventUpdate = isArray(preventUpdate) && preventUpdate.includes(param);
|
|
115
|
+
const isInPreventDefineUpdate = isArray(preventDefineUpdate) && preventDefineUpdate.includes(param);
|
|
116
|
+
const hasCollection = element.$collection || element.$stateCollection || element.$propsCollection;
|
|
117
|
+
if (isUndefined(prop) || isInPreventUpdate || isInPreventDefineUpdate || preventDefineUpdate === true || preventDefineUpdate === param || preventContentUpdate && param === "content" && !hasCollection || (preventStateUpdate && param) === "state" || isMethod(param, element) || isObject(REGISTRY[param]) || isVariant(param))
|
|
118
|
+
continue;
|
|
119
|
+
if (preventStateUpdate === "once")
|
|
120
|
+
options.preventStateUpdate = false;
|
|
121
|
+
const isElement = applyParam(param, element, options);
|
|
122
|
+
if (isElement) {
|
|
123
|
+
const { hasDefine, hasContextDefine } = isElement;
|
|
124
|
+
const canUpdate = isObject(prop) && !hasDefine && !hasContextDefine && !preventRecursive;
|
|
125
|
+
if (!canUpdate)
|
|
126
|
+
continue;
|
|
127
|
+
const lazyLoad = element.props.lazyLoad || options.lazyLoad;
|
|
128
|
+
if (options.onEachUpdate) {
|
|
129
|
+
options.onEachUpdate(param, element, element.state, element.context);
|
|
130
|
+
}
|
|
131
|
+
const childUpdateCall = () => update.call(prop, params[prop], {
|
|
132
|
+
...options,
|
|
133
|
+
currentSnapshot: snapshotOnCallee,
|
|
134
|
+
calleeElement
|
|
135
|
+
});
|
|
136
|
+
lazyLoad ? window.requestAnimationFrame(() => childUpdateCall()) : childUpdateCall();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (!preventUpdateListener)
|
|
140
|
+
triggerEventOn("update", element, options);
|
|
141
|
+
};
|
|
142
|
+
const captureSnapshot = (element, options) => {
|
|
143
|
+
const ref = element.__ref;
|
|
144
|
+
const { currentSnapshot, calleeElement } = options;
|
|
145
|
+
const isCallee = calleeElement === element;
|
|
146
|
+
if (!calleeElement || isCallee) {
|
|
147
|
+
const createdStanpshot = snapshot.snapshotId();
|
|
148
|
+
ref.__currentSnapshot = createdStanpshot;
|
|
149
|
+
return [createdStanpshot, element];
|
|
150
|
+
}
|
|
151
|
+
const snapshotOnCallee = calleeElement.__ref.__currentSnapshot;
|
|
152
|
+
if (currentSnapshot < snapshotOnCallee) {
|
|
153
|
+
return [snapshotOnCallee, calleeElement, true];
|
|
154
|
+
}
|
|
155
|
+
return [snapshotOnCallee, calleeElement];
|
|
156
|
+
};
|
|
157
|
+
const checkIfOnUpdate = (element, parent, options) => {
|
|
158
|
+
var _a, _b, _c;
|
|
159
|
+
if (!isFunction(element.if) && !isFunction((_a = element.props) == null ? void 0 : _a.if) || !parent)
|
|
160
|
+
return;
|
|
161
|
+
const ref = element.__ref;
|
|
162
|
+
const ifPassed = (element.if || ((_b = element.props) == null ? void 0 : _b.if))(element, element.state, element.context, options);
|
|
163
|
+
const itWasFalse = ref.__if !== true;
|
|
164
|
+
if (ifPassed) {
|
|
165
|
+
ref.__if = true;
|
|
166
|
+
if (itWasFalse) {
|
|
167
|
+
delete element.__hash;
|
|
168
|
+
delete element.__text;
|
|
169
|
+
delete element.extend;
|
|
170
|
+
if (!ref.__hasRootState) {
|
|
171
|
+
delete element.state;
|
|
172
|
+
}
|
|
173
|
+
if (ref.__state) {
|
|
174
|
+
element.state = ref.__state;
|
|
175
|
+
} else if (!ref.__hasRootState) {
|
|
176
|
+
delete element.state;
|
|
177
|
+
}
|
|
178
|
+
if (element.node) {
|
|
179
|
+
element.node.remove();
|
|
180
|
+
delete element.node;
|
|
181
|
+
}
|
|
182
|
+
const contentKey = ref.contentElementKey;
|
|
183
|
+
if (element.$collection || element.$stateCollection || element.$propsCollection) {
|
|
184
|
+
element.removeContent();
|
|
185
|
+
} else if ((_c = element[contentKey]) == null ? void 0 : _c.parseDeep)
|
|
186
|
+
element[contentKey] = element[contentKey].parseDeep();
|
|
187
|
+
const previousElement = element.previousElement();
|
|
188
|
+
const previousNode = previousElement == null ? void 0 : previousElement.node;
|
|
189
|
+
const hasPrevious = previousNode == null ? void 0 : previousNode.parentNode;
|
|
190
|
+
const nextElement = element.nextElement();
|
|
191
|
+
const nextNode = nextElement == null ? void 0 : nextElement.node;
|
|
192
|
+
const hasNext = nextNode == null ? void 0 : nextNode.parentNode;
|
|
193
|
+
const attachOptions = (hasPrevious || hasNext) && {
|
|
194
|
+
position: hasPrevious ? "after" : hasNext ? "before" : null,
|
|
195
|
+
node: hasPrevious && previousNode || hasNext && nextNode
|
|
196
|
+
};
|
|
197
|
+
delete element.__ref;
|
|
198
|
+
delete element.parent;
|
|
199
|
+
const createdElement = create(element, parent, element.key, OPTIONS.create, attachOptions);
|
|
200
|
+
if (options.preventUpdate !== true && element.on && isFunction(element.on.update)) {
|
|
201
|
+
applyEvent(element.on.update, createdElement, createdElement.state);
|
|
202
|
+
}
|
|
203
|
+
return createdElement;
|
|
204
|
+
}
|
|
205
|
+
} else if (element.node && !ifPassed) {
|
|
206
|
+
element.node.remove();
|
|
207
|
+
delete ref.__if;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
const inheritStateUpdates = (element, options) => {
|
|
211
|
+
const { __ref: ref } = element;
|
|
212
|
+
const stateKey = ref.__state;
|
|
213
|
+
const { parent, state } = element;
|
|
214
|
+
const { preventUpdateTriggerStateUpdate, isHoisted, execStateFunction } = options;
|
|
215
|
+
if (preventUpdateTriggerStateUpdate)
|
|
216
|
+
return;
|
|
217
|
+
if (!stateKey && !ref.__hasRootState) {
|
|
218
|
+
element.state = parent && parent.state || {};
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const shouldForceFunctionState = isFunction(stateKey) && !isHoisted && execStateFunction;
|
|
222
|
+
if (shouldForceFunctionState) {
|
|
223
|
+
const execState = exec(stateKey, element);
|
|
224
|
+
state.set(execState, { ...options, preventUpdate: true, preventStateUpdateListener: false, updatedByStateFunction: true });
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const keyInParentState = findInheritedState(element, element.parent);
|
|
228
|
+
if (!keyInParentState || options.preventInheritedStateUpdate)
|
|
229
|
+
return;
|
|
230
|
+
if (!options.preventBeforeStateUpdateListener && !options.preventListeners) {
|
|
231
|
+
const initStateReturns = triggerEventOnUpdate("beforeStateUpdate", keyInParentState, element, options);
|
|
232
|
+
if (initStateReturns === false)
|
|
233
|
+
return element;
|
|
234
|
+
}
|
|
235
|
+
const newState = createStateUpdate(element, parent, options);
|
|
236
|
+
if (!options.preventStateUpdateListener && !options.preventListeners) {
|
|
237
|
+
triggerEventOnUpdate("stateUpdate", newState.parse(), element, options);
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
const createStateUpdate = (element, parent, options) => {
|
|
241
|
+
const __stateChildren = element.state.__children;
|
|
242
|
+
const newState = createState(element, parent);
|
|
243
|
+
element.state = newState;
|
|
244
|
+
for (const child in __stateChildren) {
|
|
245
|
+
if (newState[child])
|
|
246
|
+
newState.__children[child] = __stateChildren[child];
|
|
247
|
+
Object.getPrototypeOf(__stateChildren[child]).parent = newState;
|
|
248
|
+
}
|
|
249
|
+
return newState;
|
|
250
|
+
};
|
|
251
|
+
var update_default = update;
|
|
252
|
+
export {
|
|
253
|
+
update_default as default,
|
|
254
|
+
update
|
|
255
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { isFunction } from "@domql/utils";
|
|
2
|
+
import { REGISTRY } from "../mixins/index.js";
|
|
3
|
+
const applyParam = (param, element, options) => {
|
|
4
|
+
const { node, context, __ref: ref } = element;
|
|
5
|
+
const prop = element[param];
|
|
6
|
+
const { onlyUpdate } = options;
|
|
7
|
+
const DOMQLProperty = REGISTRY[param];
|
|
8
|
+
const DOMQLPropertyFromContext = context && context.registry && context.registry[param];
|
|
9
|
+
const isGlobalTransformer = DOMQLPropertyFromContext || DOMQLProperty;
|
|
10
|
+
const hasDefine = element.define && element.define[param];
|
|
11
|
+
const hasContextDefine = context && context.define && context.define[param];
|
|
12
|
+
if (!ref.__if)
|
|
13
|
+
return;
|
|
14
|
+
const hasOnlyUpdate = onlyUpdate ? onlyUpdate === param || element.lookup(onlyUpdate) : true;
|
|
15
|
+
if (isGlobalTransformer && !hasContextDefine && hasOnlyUpdate) {
|
|
16
|
+
if (isFunction(isGlobalTransformer)) {
|
|
17
|
+
isGlobalTransformer(prop, element, node, options);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return { hasDefine, hasContextDefine };
|
|
22
|
+
};
|
|
23
|
+
export {
|
|
24
|
+
applyParam
|
|
25
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isObject,
|
|
3
|
+
isString,
|
|
4
|
+
overwriteDeep,
|
|
5
|
+
checkIfKeyIsComponent,
|
|
6
|
+
addAdditionalExtend,
|
|
7
|
+
hasVariantProp,
|
|
8
|
+
isVariant
|
|
9
|
+
} from "@domql/utils";
|
|
10
|
+
import { applyExtend } from "../extend.js";
|
|
11
|
+
import { REGISTRY } from "../mixins/index.js";
|
|
12
|
+
const createValidDomqlObjectFromSugar = (el, parent, key, options) => {
|
|
13
|
+
const newElem = {
|
|
14
|
+
props: {},
|
|
15
|
+
define: {}
|
|
16
|
+
};
|
|
17
|
+
for (const k in el) {
|
|
18
|
+
const value = el[k];
|
|
19
|
+
const isComponent = checkIfKeyIsComponent(k);
|
|
20
|
+
const isRegistry = REGISTRY[k];
|
|
21
|
+
const allowedKeys = ["data", "state", "attr", "if"];
|
|
22
|
+
if (isComponent || isRegistry || allowedKeys.includes(k)) {
|
|
23
|
+
newElem[k] = value;
|
|
24
|
+
} else {
|
|
25
|
+
newElem.props[k] = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return newElem;
|
|
29
|
+
};
|
|
30
|
+
const overwriteVariant = (element, variant, variantProps) => {
|
|
31
|
+
let variantElement = element[variant];
|
|
32
|
+
if (!variantElement)
|
|
33
|
+
return;
|
|
34
|
+
const props = isObject(variantProps) ? variantProps : {};
|
|
35
|
+
if (isString(variantElement)) {
|
|
36
|
+
variantElement = {
|
|
37
|
+
extend: [{ props }, variantElement]
|
|
38
|
+
};
|
|
39
|
+
} else if (variantElement.extend) {
|
|
40
|
+
variantElement = addAdditionalExtend({ props }, variantElement);
|
|
41
|
+
}
|
|
42
|
+
const extendedVariant = applyExtend(variantElement, element.parent);
|
|
43
|
+
const { parent, ...rest } = extendedVariant;
|
|
44
|
+
return overwriteDeep(element, rest);
|
|
45
|
+
};
|
|
46
|
+
const applyVariant = (element) => {
|
|
47
|
+
const { props } = element;
|
|
48
|
+
if (!hasVariantProp(element))
|
|
49
|
+
return element;
|
|
50
|
+
const { variant } = props;
|
|
51
|
+
overwriteVariant(element, `.${variant}`);
|
|
52
|
+
const elKeys = Object.keys(element).filter((key) => isVariant(key));
|
|
53
|
+
elKeys.forEach((variant2) => {
|
|
54
|
+
const slicedVariantElementKey = variant2.slice(1);
|
|
55
|
+
const variantElementProps = props[slicedVariantElementKey];
|
|
56
|
+
if (variantElementProps)
|
|
57
|
+
overwriteVariant(element, variant2, variantElementProps);
|
|
58
|
+
});
|
|
59
|
+
return element;
|
|
60
|
+
};
|
|
61
|
+
export {
|
|
62
|
+
applyVariant,
|
|
63
|
+
createValidDomqlObjectFromSugar,
|
|
64
|
+
overwriteVariant
|
|
65
|
+
};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { isArray, isFunction, isObject, isString, deepClone } from "@domql/utils";
|
|
2
|
+
const ENV = "development";
|
|
3
|
+
const generateHash = () => Math.random().toString(36).substring(2);
|
|
4
|
+
const extendStackRegistry = {};
|
|
5
|
+
const extendCachedRegistry = {};
|
|
6
|
+
const getHashedExtend = (extend) => {
|
|
7
|
+
return extendStackRegistry[extend.__hash];
|
|
8
|
+
};
|
|
9
|
+
const setHashedExtend = (extend, stack) => {
|
|
10
|
+
const hash = generateHash();
|
|
11
|
+
if (!isString(extend)) {
|
|
12
|
+
extend.__hash = hash;
|
|
13
|
+
}
|
|
14
|
+
extendStackRegistry[hash] = stack;
|
|
15
|
+
return stack;
|
|
16
|
+
};
|
|
17
|
+
const getExtendStackRegistry = (extend, stack) => {
|
|
18
|
+
if (extend.__hash) {
|
|
19
|
+
return stack.concat(getHashedExtend(extend));
|
|
20
|
+
}
|
|
21
|
+
return setHashedExtend(extend, stack);
|
|
22
|
+
};
|
|
23
|
+
const extractArrayExtend = (extend, stack, context) => {
|
|
24
|
+
extend.forEach((each) => flattenExtend(each, stack, context));
|
|
25
|
+
return stack;
|
|
26
|
+
};
|
|
27
|
+
const deepExtend = (extend, stack, context) => {
|
|
28
|
+
const extendOflattenExtend = extend.extend;
|
|
29
|
+
if (extendOflattenExtend) {
|
|
30
|
+
flattenExtend(extendOflattenExtend, stack, context);
|
|
31
|
+
}
|
|
32
|
+
return stack;
|
|
33
|
+
};
|
|
34
|
+
const flattenExtend = (extend, stack, context) => {
|
|
35
|
+
if (!extend)
|
|
36
|
+
return stack;
|
|
37
|
+
if (isArray(extend))
|
|
38
|
+
return extractArrayExtend(extend, stack, context);
|
|
39
|
+
if (isString(extend))
|
|
40
|
+
extend = fallbackStringExtend(extend, context);
|
|
41
|
+
stack.push(extend);
|
|
42
|
+
if (extend.extend)
|
|
43
|
+
deepExtend(extend, stack, context);
|
|
44
|
+
return stack;
|
|
45
|
+
};
|
|
46
|
+
const deepMergeExtend = (element, extend) => {
|
|
47
|
+
for (const e in extend) {
|
|
48
|
+
if (["parent", "node", "__element"].indexOf(e) > -1)
|
|
49
|
+
continue;
|
|
50
|
+
const elementProp = element[e];
|
|
51
|
+
const extendProp = extend[e];
|
|
52
|
+
if (elementProp === void 0) {
|
|
53
|
+
element[e] = extendProp;
|
|
54
|
+
} else if (isObject(elementProp) && isObject(extendProp)) {
|
|
55
|
+
deepMergeExtend(elementProp, extendProp);
|
|
56
|
+
} else if (isArray(elementProp) && isArray(extendProp)) {
|
|
57
|
+
element[e] = elementProp.concat(extendProp);
|
|
58
|
+
} else if (isArray(elementProp) && isObject(extendProp)) {
|
|
59
|
+
const obj = deepMergeExtend({}, elementProp);
|
|
60
|
+
element[e] = deepMergeExtend(obj, extendProp);
|
|
61
|
+
} else if (elementProp === void 0 && isFunction(extendProp)) {
|
|
62
|
+
element[e] = extendProp;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return element;
|
|
66
|
+
};
|
|
67
|
+
const cloneAndMergeArrayExtend = (stack) => {
|
|
68
|
+
return stack.reduce((a, c) => {
|
|
69
|
+
return deepMergeExtend(a, deepClone(c));
|
|
70
|
+
}, {});
|
|
71
|
+
};
|
|
72
|
+
const fallbackStringExtend = (extend, context, options = {}, variant) => {
|
|
73
|
+
const COMPONENTS = context && context.components || options.components;
|
|
74
|
+
const PAGES = context && context.pages || options.pages;
|
|
75
|
+
if (isString(extend)) {
|
|
76
|
+
const componentExists = COMPONENTS && (COMPONENTS[extend + "." + variant] || COMPONENTS[extend] || COMPONENTS["smbls." + extend]);
|
|
77
|
+
const pageExists = PAGES && extend.startsWith("/") && PAGES[extend];
|
|
78
|
+
if (componentExists)
|
|
79
|
+
return componentExists;
|
|
80
|
+
else if (pageExists)
|
|
81
|
+
return pageExists;
|
|
82
|
+
else {
|
|
83
|
+
if (options.verbose && (ENV === "test" || ENV === "development")) {
|
|
84
|
+
console.warn("Extend is string but component was not found:", extend);
|
|
85
|
+
}
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return extend;
|
|
90
|
+
};
|
|
91
|
+
const jointStacks = (extendStack, childExtendStack) => {
|
|
92
|
+
return [].concat(extendStack.slice(0, 1)).concat(childExtendStack.slice(0, 1)).concat(extendStack.slice(1)).concat(childExtendStack.slice(1));
|
|
93
|
+
};
|
|
94
|
+
const getExtendStack = (extend, context) => {
|
|
95
|
+
if (!extend)
|
|
96
|
+
return [];
|
|
97
|
+
if (extend.__hash)
|
|
98
|
+
return getHashedExtend(extend) || [];
|
|
99
|
+
const stack = flattenExtend(extend, [], context);
|
|
100
|
+
return getExtendStackRegistry(extend, stack);
|
|
101
|
+
};
|
|
102
|
+
const getExtendMerged = (extend) => {
|
|
103
|
+
const stack = getExtendStack(extend);
|
|
104
|
+
return cloneAndMergeArrayExtend(stack);
|
|
105
|
+
};
|
|
106
|
+
export {
|
|
107
|
+
cloneAndMergeArrayExtend,
|
|
108
|
+
deepExtend,
|
|
109
|
+
deepMergeExtend,
|
|
110
|
+
extendCachedRegistry,
|
|
111
|
+
extendStackRegistry,
|
|
112
|
+
extractArrayExtend,
|
|
113
|
+
fallbackStringExtend,
|
|
114
|
+
flattenExtend,
|
|
115
|
+
generateHash,
|
|
116
|
+
getExtendMerged,
|
|
117
|
+
getExtendStack,
|
|
118
|
+
getExtendStackRegistry,
|
|
119
|
+
getHashedExtend,
|
|
120
|
+
jointStacks,
|
|
121
|
+
setHashedExtend
|
|
122
|
+
};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { isArray, isObject, isObjectLike, joinArrays, deepClone } from "@domql/utils";
|
|
2
|
+
import { IGNORE_PROPS_PARAMS } from "../props/index.js";
|
|
3
|
+
const IGNORE_STATE_PARAMS = [
|
|
4
|
+
"update",
|
|
5
|
+
"parse",
|
|
6
|
+
"clean",
|
|
7
|
+
"create",
|
|
8
|
+
"destroy",
|
|
9
|
+
"add",
|
|
10
|
+
"toggle",
|
|
11
|
+
"remove",
|
|
12
|
+
"apply",
|
|
13
|
+
"set",
|
|
14
|
+
"reset",
|
|
15
|
+
"replace",
|
|
16
|
+
"quietReplace",
|
|
17
|
+
"quietUpdate",
|
|
18
|
+
"applyReplace",
|
|
19
|
+
"applyFunction",
|
|
20
|
+
"rootUpdate",
|
|
21
|
+
"parentUpdate",
|
|
22
|
+
"parent",
|
|
23
|
+
"__element",
|
|
24
|
+
"__depends",
|
|
25
|
+
"__ref",
|
|
26
|
+
"__children",
|
|
27
|
+
"root",
|
|
28
|
+
"setByPath",
|
|
29
|
+
"setPathCollection",
|
|
30
|
+
"removeByPath",
|
|
31
|
+
"removePathCollection",
|
|
32
|
+
"getByPath"
|
|
33
|
+
];
|
|
34
|
+
const METHODS = [
|
|
35
|
+
"set",
|
|
36
|
+
"reset",
|
|
37
|
+
"update",
|
|
38
|
+
"remove",
|
|
39
|
+
"updateContent",
|
|
40
|
+
"removeContent",
|
|
41
|
+
"lookup",
|
|
42
|
+
"lookdown",
|
|
43
|
+
"lookdownAll",
|
|
44
|
+
"getRef",
|
|
45
|
+
"getPath",
|
|
46
|
+
"setNodeStyles",
|
|
47
|
+
"spotByPath",
|
|
48
|
+
"keys",
|
|
49
|
+
"parse",
|
|
50
|
+
"setProps",
|
|
51
|
+
"parseDeep",
|
|
52
|
+
"variables",
|
|
53
|
+
"if",
|
|
54
|
+
"log",
|
|
55
|
+
"nextElement",
|
|
56
|
+
"previousElement"
|
|
57
|
+
];
|
|
58
|
+
const METHODS_EXL = joinArrays(
|
|
59
|
+
["node", "state", "context", "extend", "__element"],
|
|
60
|
+
METHODS,
|
|
61
|
+
IGNORE_STATE_PARAMS,
|
|
62
|
+
IGNORE_PROPS_PARAMS
|
|
63
|
+
);
|
|
64
|
+
const deepMerge = (element, extend, exclude = METHODS_EXL) => {
|
|
65
|
+
for (const e in extend) {
|
|
66
|
+
if (exclude.includes(e))
|
|
67
|
+
continue;
|
|
68
|
+
const elementProp = element[e];
|
|
69
|
+
const extendProp = extend[e];
|
|
70
|
+
if (elementProp === void 0) {
|
|
71
|
+
element[e] = extendProp;
|
|
72
|
+
} else if (isObjectLike(elementProp) && isObject(extendProp)) {
|
|
73
|
+
deepMerge(elementProp, extendProp);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return element;
|
|
77
|
+
};
|
|
78
|
+
const clone = (obj, exclude = METHODS_EXL) => {
|
|
79
|
+
const o = {};
|
|
80
|
+
for (const e in obj) {
|
|
81
|
+
if (exclude.includes(e))
|
|
82
|
+
continue;
|
|
83
|
+
o[e] = obj[e];
|
|
84
|
+
}
|
|
85
|
+
return o;
|
|
86
|
+
};
|
|
87
|
+
const overwrite = (element, params, options) => {
|
|
88
|
+
const changes = {};
|
|
89
|
+
const { __ref } = element;
|
|
90
|
+
const { __exec, __cached } = __ref;
|
|
91
|
+
for (const e in params) {
|
|
92
|
+
if (e === "props" || e === "state" || e === "__ref")
|
|
93
|
+
continue;
|
|
94
|
+
const elementProp = element[e];
|
|
95
|
+
const paramsProp = params[e];
|
|
96
|
+
if (paramsProp !== void 0) {
|
|
97
|
+
__cached[e] = changes[e] = elementProp;
|
|
98
|
+
element[e] = paramsProp;
|
|
99
|
+
}
|
|
100
|
+
if (options.cleanExec)
|
|
101
|
+
delete __exec[e];
|
|
102
|
+
}
|
|
103
|
+
return changes;
|
|
104
|
+
};
|
|
105
|
+
const overwriteShallow = (obj, params, exclude = METHODS_EXL) => {
|
|
106
|
+
for (const e in params) {
|
|
107
|
+
if (exclude.includes(e))
|
|
108
|
+
continue;
|
|
109
|
+
obj[e] = params[e];
|
|
110
|
+
}
|
|
111
|
+
return obj;
|
|
112
|
+
};
|
|
113
|
+
const overwriteDeep = (obj, params, exclude = METHODS_EXL) => {
|
|
114
|
+
for (const e in params) {
|
|
115
|
+
if (exclude.includes(e))
|
|
116
|
+
continue;
|
|
117
|
+
const objProp = obj[e];
|
|
118
|
+
const paramsProp = params[e];
|
|
119
|
+
if (isObjectLike(objProp) && isObjectLike(paramsProp)) {
|
|
120
|
+
overwriteDeep(objProp, paramsProp);
|
|
121
|
+
} else if (paramsProp !== void 0) {
|
|
122
|
+
obj[e] = paramsProp;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return obj;
|
|
126
|
+
};
|
|
127
|
+
const mergeIfExisted = (a, b) => {
|
|
128
|
+
if (isObjectLike(a) && isObjectLike(b))
|
|
129
|
+
return deepMerge(a, b);
|
|
130
|
+
return a || b;
|
|
131
|
+
};
|
|
132
|
+
const mergeArray = (arr, exclude = ["parent", "node", "__element", "state", "context", "__ref"]) => {
|
|
133
|
+
return arr.reduce((a, c) => deepMerge(a, deepClone(c, { exclude })), {});
|
|
134
|
+
};
|
|
135
|
+
const mergeAndCloneIfArray = (obj) => {
|
|
136
|
+
return isArray(obj) ? mergeArray(obj) : deepClone(obj);
|
|
137
|
+
};
|
|
138
|
+
const flattenRecursive = (param, prop, stack = []) => {
|
|
139
|
+
const objectized = mergeAndCloneIfArray(param);
|
|
140
|
+
stack.push(objectized);
|
|
141
|
+
const extendOfExtend = objectized[prop];
|
|
142
|
+
if (extendOfExtend)
|
|
143
|
+
flattenRecursive(extendOfExtend, prop, stack);
|
|
144
|
+
delete objectized[prop];
|
|
145
|
+
return stack;
|
|
146
|
+
};
|
|
147
|
+
export {
|
|
148
|
+
METHODS,
|
|
149
|
+
METHODS_EXL,
|
|
150
|
+
clone,
|
|
151
|
+
deepMerge,
|
|
152
|
+
flattenRecursive,
|
|
153
|
+
mergeAndCloneIfArray,
|
|
154
|
+
mergeArray,
|
|
155
|
+
mergeIfExisted,
|
|
156
|
+
overwrite,
|
|
157
|
+
overwriteDeep,
|
|
158
|
+
overwriteShallow
|
|
159
|
+
};
|