@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/create.js
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
isUndefined,
|
|
7
7
|
detectInfiniteLoop,
|
|
8
8
|
propertizeElement,
|
|
9
|
+
pickupElementFromProps,
|
|
9
10
|
createElement,
|
|
10
11
|
applyExtends,
|
|
11
12
|
createScope,
|
|
@@ -15,33 +16,57 @@ import {
|
|
|
15
16
|
createIfConditionFlag,
|
|
16
17
|
createRoot
|
|
17
18
|
} from "@domql/utils";
|
|
18
|
-
import { applyAnimationFrame, triggerEventOn } from "
|
|
19
|
-
import { assignNode } from "
|
|
19
|
+
import { applyAnimationFrame, triggerEventOn } from "./event/index.js";
|
|
20
|
+
import { assignNode } from "./render/index.js";
|
|
20
21
|
import { createState } from "@domql/state";
|
|
21
22
|
import { REGISTRY } from "./mixins/index.js";
|
|
22
23
|
import { addMethods } from "./methods/set.js";
|
|
23
24
|
import { assignKeyAsClassname } from "./mixins/classList.js";
|
|
24
25
|
import { throughInitialExec, throughInitialDefine } from "./iterate.js";
|
|
25
|
-
|
|
26
|
-
const
|
|
26
|
+
import { filterAttributesByTagName } from "attrs-in-props";
|
|
27
|
+
const EXCLUDED_ATTRS = /* @__PURE__ */ new Set(["class", "style"]);
|
|
28
|
+
const applyPropsAsAttrs = (element) => {
|
|
29
|
+
const { tag, props, context } = element;
|
|
30
|
+
if (!tag || !props) return;
|
|
31
|
+
const autoAttrs = filterAttributesByTagName(tag, props, context?.cssPropsRegistry);
|
|
32
|
+
const filtered = {};
|
|
33
|
+
for (const key in autoAttrs) {
|
|
34
|
+
if (!EXCLUDED_ATTRS.has(key)) filtered[key] = autoAttrs[key];
|
|
35
|
+
}
|
|
36
|
+
let hasFiltered = false;
|
|
37
|
+
for (const _k in filtered) {
|
|
38
|
+
hasFiltered = true;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
if (!hasFiltered) return;
|
|
42
|
+
if (!element.attr) {
|
|
43
|
+
element.attr = filtered;
|
|
44
|
+
} else if (typeof element.attr === "object") {
|
|
45
|
+
element.attr = { ...filtered, ...element.attr };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const ENV = process.env.NODE_ENV;
|
|
49
|
+
const create = (props, parentEl, passedKey, options = OPTIONS.create || {}, attachOptions) => {
|
|
27
50
|
cacheOptions(options);
|
|
28
51
|
const element = createElement(props, parentEl, passedKey, options, ROOT);
|
|
29
52
|
if (!element) return;
|
|
30
53
|
const { key, parent, __ref: ref } = element;
|
|
31
54
|
createRoot(element, parent);
|
|
32
55
|
applyExtends(element, parent, options);
|
|
33
|
-
propertizeElement.call(element, element);
|
|
34
|
-
await triggerEventOn("start", element, options);
|
|
35
56
|
if (options.onlyResolveExtends) {
|
|
36
57
|
return onlyResolveExtends(element, parent, key, options);
|
|
37
58
|
}
|
|
59
|
+
propertizeElement.call(element, element);
|
|
60
|
+
triggerEventOn("start", element, options);
|
|
38
61
|
resetOptions(element, parent, options);
|
|
39
62
|
addMethods(element, parent, options);
|
|
40
63
|
createScope(element, parent);
|
|
41
|
-
|
|
64
|
+
createState(element, parent);
|
|
42
65
|
if (element.scope === "state") element.scope = element.state;
|
|
43
66
|
createIfConditionFlag(element, parent);
|
|
44
67
|
initProps(element, parent, options);
|
|
68
|
+
pickupElementFromProps.call(element, element, { cachedKeys: [] });
|
|
69
|
+
applyPropsAsAttrs(element);
|
|
45
70
|
if (element.scope === "props" || element.scope === true) {
|
|
46
71
|
element.scope = element.props;
|
|
47
72
|
}
|
|
@@ -49,13 +74,13 @@ const create = async (props, parentEl, passedKey, options = OPTIONS.create || {}
|
|
|
49
74
|
if (element.node) {
|
|
50
75
|
if (ref.__if) return assignNode(element, parent, key, attachOptions);
|
|
51
76
|
}
|
|
52
|
-
const onInit =
|
|
77
|
+
const onInit = triggerEventOn("init", element, options);
|
|
53
78
|
if (onInit === false) return element;
|
|
54
79
|
triggerEventOn("beforeClassAssign", element, options);
|
|
55
80
|
assignKeyAsClassname(element);
|
|
56
|
-
|
|
81
|
+
renderElement(element, parent, options, attachOptions);
|
|
57
82
|
addElementIntoParentChildren(element, parent);
|
|
58
|
-
|
|
83
|
+
triggerEventOn("complete", element, options);
|
|
59
84
|
return element;
|
|
60
85
|
};
|
|
61
86
|
const cacheOptions = (options) => {
|
|
@@ -65,7 +90,12 @@ const cacheOptions = (options) => {
|
|
|
65
90
|
}
|
|
66
91
|
};
|
|
67
92
|
const resetOptions = (element, parent, options) => {
|
|
68
|
-
|
|
93
|
+
let hasKeys = false;
|
|
94
|
+
for (const _k in options) {
|
|
95
|
+
hasKeys = true;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
if (hasKeys) {
|
|
69
99
|
OPTIONS.defaultOptions = options;
|
|
70
100
|
if (options.ignoreChildExtends) delete options.ignoreChildExtends;
|
|
71
101
|
}
|
|
@@ -75,9 +105,9 @@ const addElementIntoParentChildren = (element, parent) => {
|
|
|
75
105
|
parent.__ref.__children.push(element.key);
|
|
76
106
|
}
|
|
77
107
|
};
|
|
108
|
+
let _uniqIdCounter = 1;
|
|
78
109
|
const visitedElements = /* @__PURE__ */ new WeakMap();
|
|
79
|
-
const renderElement =
|
|
80
|
-
var _a, _b, _c;
|
|
110
|
+
const renderElement = (element, parent, options, attachOptions) => {
|
|
81
111
|
if (visitedElements.has(element)) {
|
|
82
112
|
if (ENV === "test" || ENV === "development") {
|
|
83
113
|
console.warn("Cyclic rendering detected:", element.__ref.path);
|
|
@@ -85,17 +115,17 @@ const renderElement = async (element, parent, options, attachOptions) => {
|
|
|
85
115
|
}
|
|
86
116
|
visitedElements.set(element, true);
|
|
87
117
|
const { __ref: ref, key } = element;
|
|
88
|
-
const createNestedChild =
|
|
118
|
+
const createNestedChild = () => {
|
|
89
119
|
const isInfiniteLoopDetected = detectInfiniteLoop(ref.path);
|
|
90
120
|
if (ref.__uniqId || isInfiniteLoopDetected) return;
|
|
91
|
-
|
|
92
|
-
ref.__uniqId =
|
|
121
|
+
createNode(element, options);
|
|
122
|
+
ref.__uniqId = _uniqIdCounter++;
|
|
93
123
|
};
|
|
94
124
|
if (ENV === "test" || ENV === "development") {
|
|
95
|
-
|
|
125
|
+
createNestedChild();
|
|
96
126
|
} else {
|
|
97
127
|
try {
|
|
98
|
-
|
|
128
|
+
createNestedChild();
|
|
99
129
|
} catch (e) {
|
|
100
130
|
const path = ref.path;
|
|
101
131
|
if (path.includes("ComponentsGrid")) {
|
|
@@ -104,14 +134,14 @@ const renderElement = async (element, parent, options, attachOptions) => {
|
|
|
104
134
|
if (path.includes("demoComponent")) {
|
|
105
135
|
path.splice(0, path.indexOf("demoComponent") + 1);
|
|
106
136
|
}
|
|
107
|
-
const isDemoComponent =
|
|
137
|
+
const isDemoComponent = element.lookup((el) => el.state.key)?.state?.key;
|
|
108
138
|
element.warn(
|
|
109
139
|
"Error happened in:",
|
|
110
140
|
isDemoComponent ? isDemoComponent + " " : "" + path.join(".")
|
|
111
141
|
);
|
|
112
142
|
element.verbose();
|
|
113
143
|
element.error(e, options);
|
|
114
|
-
if (
|
|
144
|
+
if (element.on?.error) {
|
|
115
145
|
element.on.error(e, element, element.state, element.context, options);
|
|
116
146
|
}
|
|
117
147
|
}
|
|
@@ -122,10 +152,10 @@ const renderElement = async (element, parent, options, attachOptions) => {
|
|
|
122
152
|
}
|
|
123
153
|
assignNode(element, parent, key, attachOptions);
|
|
124
154
|
applyAnimationFrame(element, options);
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
155
|
+
triggerEventOn("render", element, options);
|
|
156
|
+
triggerEventOn("renderRouter", element, options);
|
|
157
|
+
triggerEventOn("done", element, options);
|
|
158
|
+
triggerEventOn("create", element, options);
|
|
129
159
|
};
|
|
130
160
|
const onlyResolveExtends = (element, parent, key, options) => {
|
|
131
161
|
const { __ref: ref } = element;
|
|
@@ -135,6 +165,7 @@ const onlyResolveExtends = (element, parent, key, options) => {
|
|
|
135
165
|
if (element.scope === "state") element.scope = element.state;
|
|
136
166
|
createIfConditionFlag(element, parent);
|
|
137
167
|
initProps(element, parent, options);
|
|
168
|
+
pickupElementFromProps.call(element, element, { cachedKeys: [] });
|
|
138
169
|
if (element.scope === "props" || element.scope === true) {
|
|
139
170
|
element.scope = element.props;
|
|
140
171
|
}
|
|
@@ -150,9 +181,9 @@ const onlyResolveExtends = (element, parent, key, options) => {
|
|
|
150
181
|
if (isUndefined(element[k]) || isMethod(k, element) || isObject(REGISTRY[k])) {
|
|
151
182
|
continue;
|
|
152
183
|
}
|
|
153
|
-
const hasDefine = element.define
|
|
154
|
-
const contextHasDefine = element.context
|
|
155
|
-
const optionsHasDefine = options.define
|
|
184
|
+
const hasDefine = element.define?.[k];
|
|
185
|
+
const contextHasDefine = element.context?.define?.[k];
|
|
186
|
+
const optionsHasDefine = options.define?.[k];
|
|
156
187
|
if (!ref.__skipCreate && REGISTRY[k] && !optionsHasDefine) {
|
|
157
188
|
continue;
|
|
158
189
|
} else if (element[k] && !hasDefine && !optionsHasDefine && !contextHasDefine) {
|
package/dist/esm/define.js
CHANGED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
const registerFrameListener = (el) => {
|
|
2
|
+
if (!el || !el.__ref) {
|
|
3
|
+
throw new Error("Element reference is invalid");
|
|
4
|
+
}
|
|
5
|
+
const { __ref: ref } = el;
|
|
6
|
+
if (!ref.root) {
|
|
7
|
+
throw new Error("Root reference is invalid");
|
|
8
|
+
}
|
|
9
|
+
if (!ref.root.data) {
|
|
10
|
+
throw new Error("Data are undefined");
|
|
11
|
+
}
|
|
12
|
+
const { frameListeners } = ref.root.data;
|
|
13
|
+
if (frameListeners && !frameListeners.has(el)) {
|
|
14
|
+
frameListeners.add(el);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const processFrameListeners = (frameListeners) => {
|
|
18
|
+
for (const element of frameListeners) {
|
|
19
|
+
if (!element.__ref.__frameHandler) {
|
|
20
|
+
const handler = element.on?.frame || element.onFrame || element.props?.onFrame;
|
|
21
|
+
if (handler) element.__ref.__frameHandler = handler;
|
|
22
|
+
else {
|
|
23
|
+
frameListeners.delete(element);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (!element.node?.parentNode) {
|
|
28
|
+
frameListeners.delete(element);
|
|
29
|
+
delete element.__ref.__frameHandler;
|
|
30
|
+
} else {
|
|
31
|
+
try {
|
|
32
|
+
element.__ref.__frameHandler(element, element.state, element.context);
|
|
33
|
+
} catch (e) {
|
|
34
|
+
console.warn(e);
|
|
35
|
+
frameListeners.delete(element);
|
|
36
|
+
delete element.__ref.__frameHandler;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const startFrameLoop = (frameListeners) => {
|
|
42
|
+
if (_frameRunning) return;
|
|
43
|
+
_frameRunning = true;
|
|
44
|
+
function requestFrame() {
|
|
45
|
+
if (frameListeners.size === 0) {
|
|
46
|
+
_frameRunning = false;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
processFrameListeners(frameListeners);
|
|
50
|
+
window.requestAnimationFrame(requestFrame);
|
|
51
|
+
}
|
|
52
|
+
window.requestAnimationFrame(requestFrame);
|
|
53
|
+
};
|
|
54
|
+
const applyAnimationFrame = (element) => {
|
|
55
|
+
if (!element) {
|
|
56
|
+
throw new Error("Element is invalid");
|
|
57
|
+
}
|
|
58
|
+
const { on, props, __ref: ref } = element;
|
|
59
|
+
if (!ref.root || !ref.root.data) return;
|
|
60
|
+
const { frameListeners } = ref.root.data;
|
|
61
|
+
if (frameListeners && (on?.frame || element.onFrame || props?.onFrame)) {
|
|
62
|
+
registerFrameListener(element);
|
|
63
|
+
startFrameLoop(frameListeners);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
let _frameRunning = false;
|
|
67
|
+
const initAnimationFrame = () => {
|
|
68
|
+
const frameListeners = /* @__PURE__ */ new Set();
|
|
69
|
+
startFrameLoop(frameListeners);
|
|
70
|
+
return frameListeners;
|
|
71
|
+
};
|
|
72
|
+
export {
|
|
73
|
+
applyAnimationFrame,
|
|
74
|
+
initAnimationFrame,
|
|
75
|
+
registerFrameListener
|
|
76
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { DOMQL_EVENTS, isFunction } from "@domql/utils";
|
|
2
|
+
import { applyEvent, triggerEventOn, applyEventUpdate, triggerEventOnUpdate } from "@domql/utils";
|
|
3
|
+
const getOnOrPropsEvent = (param, element) => {
|
|
4
|
+
const onEvent = element.on?.[param];
|
|
5
|
+
if (onEvent) return onEvent;
|
|
6
|
+
const props = element.props;
|
|
7
|
+
if (!props) return;
|
|
8
|
+
const propKey = "on" + param.charAt(0).toUpperCase() + param.slice(1);
|
|
9
|
+
return props[propKey];
|
|
10
|
+
};
|
|
11
|
+
const registerNodeEvent = (param, element, node, options) => {
|
|
12
|
+
const appliedFunction = getOnOrPropsEvent(param, element);
|
|
13
|
+
if (isFunction(appliedFunction)) {
|
|
14
|
+
const { __ref: ref } = element;
|
|
15
|
+
if (!ref.__eventListeners) ref.__eventListeners = {};
|
|
16
|
+
if (ref.__eventListeners[param]) {
|
|
17
|
+
node.removeEventListener(param, ref.__eventListeners[param]);
|
|
18
|
+
}
|
|
19
|
+
const handler = (event) => {
|
|
20
|
+
const { state, context } = element;
|
|
21
|
+
const result = appliedFunction.call(
|
|
22
|
+
element,
|
|
23
|
+
event,
|
|
24
|
+
element,
|
|
25
|
+
state,
|
|
26
|
+
context,
|
|
27
|
+
options
|
|
28
|
+
);
|
|
29
|
+
if (result && typeof result.then === "function") {
|
|
30
|
+
result.catch(() => {
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
ref.__eventListeners[param] = handler;
|
|
35
|
+
node.addEventListener(param, handler);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const applyEventsOnNode = (element, options) => {
|
|
39
|
+
const { node, on, props } = element;
|
|
40
|
+
const handled = /* @__PURE__ */ new Set();
|
|
41
|
+
for (const param in on) {
|
|
42
|
+
if (DOMQL_EVENTS.has(param)) continue;
|
|
43
|
+
handled.add(param);
|
|
44
|
+
registerNodeEvent(param, element, node, options);
|
|
45
|
+
}
|
|
46
|
+
if (props) {
|
|
47
|
+
for (const key in props) {
|
|
48
|
+
if (key.length > 2 && key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && isFunction(props[key])) {
|
|
49
|
+
const thirdChar = key[2];
|
|
50
|
+
if (thirdChar !== thirdChar.toUpperCase()) continue;
|
|
51
|
+
const eventName = thirdChar.toLowerCase() + key.slice(3);
|
|
52
|
+
if (handled.has(eventName) || DOMQL_EVENTS.has(eventName)) continue;
|
|
53
|
+
registerNodeEvent(eventName, element, node, options);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
export {
|
|
59
|
+
applyEvent,
|
|
60
|
+
applyEventUpdate,
|
|
61
|
+
applyEventsOnNode,
|
|
62
|
+
triggerEventOn,
|
|
63
|
+
triggerEventOnUpdate
|
|
64
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { isFunction, exec } from "@domql/utils";
|
|
2
|
+
import {
|
|
3
|
+
getExtendStack,
|
|
4
|
+
jointStacks,
|
|
5
|
+
cloneAndMergeArrayExtend,
|
|
6
|
+
deepMergeExtend,
|
|
7
|
+
fallbackStringExtend
|
|
8
|
+
} from "./utils/index.js";
|
|
9
|
+
let mainExtend;
|
|
10
|
+
const applyExtend = (element, parent, options = {}) => {
|
|
11
|
+
if (isFunction(element)) element = exec(element, parent);
|
|
12
|
+
const { props, __ref } = element;
|
|
13
|
+
let extend = props?.extends || element.extends || element.extend;
|
|
14
|
+
const variant = props?.variant;
|
|
15
|
+
const context = element.context || parent.context;
|
|
16
|
+
extend = fallbackStringExtend(extend, context, options, variant);
|
|
17
|
+
const extendStack = getExtendStack(extend, context);
|
|
18
|
+
delete element.extend;
|
|
19
|
+
let childExtendStack = [];
|
|
20
|
+
if (parent) {
|
|
21
|
+
element.parent = parent;
|
|
22
|
+
if (!options.ignoreChildExtend && !props?.ignoreChildExtend) {
|
|
23
|
+
childExtendStack = getExtendStack(parent.childExtend, context);
|
|
24
|
+
const ignoreChildExtendRecursive = props?.ignoreChildExtendRecursive;
|
|
25
|
+
if (parent.childExtendRecursive && !ignoreChildExtendRecursive) {
|
|
26
|
+
const canExtendRecursive = element.key !== "__text";
|
|
27
|
+
if (canExtendRecursive) {
|
|
28
|
+
const childExtendRecursiveStack = getExtendStack(
|
|
29
|
+
parent.childExtendRecursive,
|
|
30
|
+
context
|
|
31
|
+
);
|
|
32
|
+
childExtendStack = childExtendStack.concat(childExtendRecursiveStack);
|
|
33
|
+
element.childExtendRecursive = parent.childExtendRecursive;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const extendLength = extendStack.length;
|
|
39
|
+
const childExtendLength = childExtendStack.length;
|
|
40
|
+
let stack = [];
|
|
41
|
+
if (extendLength && childExtendLength) {
|
|
42
|
+
stack = jointStacks(extendStack, childExtendStack);
|
|
43
|
+
} else if (extendLength) {
|
|
44
|
+
stack = extendStack;
|
|
45
|
+
} else if (childExtendLength) {
|
|
46
|
+
stack = childExtendStack;
|
|
47
|
+
} else if (!context.defaultExtends) return element;
|
|
48
|
+
if (context.defaultExtends) {
|
|
49
|
+
if (!mainExtend) {
|
|
50
|
+
const defaultOptionsExtend = getExtendStack(
|
|
51
|
+
context.defaultExtends,
|
|
52
|
+
context
|
|
53
|
+
);
|
|
54
|
+
mainExtend = cloneAndMergeArrayExtend(defaultOptionsExtend);
|
|
55
|
+
delete mainExtend.extend;
|
|
56
|
+
}
|
|
57
|
+
stack = [].concat(stack, mainExtend);
|
|
58
|
+
}
|
|
59
|
+
if (__ref) __ref.__extend = stack;
|
|
60
|
+
let mergedExtend = cloneAndMergeArrayExtend(stack);
|
|
61
|
+
const COMPONENTS = context?.components || options.components;
|
|
62
|
+
const component = exec(element.component || mergedExtend.component, element);
|
|
63
|
+
if (component && COMPONENTS?.[component]) {
|
|
64
|
+
const componentExtend = cloneAndMergeArrayExtend(
|
|
65
|
+
getExtendStack(COMPONENTS[component])
|
|
66
|
+
);
|
|
67
|
+
mergedExtend = deepMergeExtend(componentExtend, mergedExtend);
|
|
68
|
+
}
|
|
69
|
+
const merged = deepMergeExtend(element, mergedExtend);
|
|
70
|
+
return merged;
|
|
71
|
+
};
|
|
72
|
+
export {
|
|
73
|
+
applyExtend
|
|
74
|
+
};
|
package/dist/esm/index.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { TREE } from "./tree";
|
|
2
|
-
import create from "./create";
|
|
3
|
-
import createNode from "./node";
|
|
4
|
-
import define from "./define";
|
|
5
|
-
import update from "./update";
|
|
6
|
-
import set from "./set";
|
|
1
|
+
import { TREE } from "./tree.js";
|
|
2
|
+
import create from "./create.js";
|
|
3
|
+
import createNode from "./node.js";
|
|
4
|
+
import define from "./define.js";
|
|
5
|
+
import update from "./update.js";
|
|
6
|
+
import set from "./set.js";
|
|
7
|
+
export * from "./event/index.js";
|
|
8
|
+
export * from "./render/index.js";
|
|
7
9
|
export {
|
|
8
10
|
TREE,
|
|
9
11
|
create,
|
package/dist/esm/iterate.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isObject,
|
|
3
|
-
exec,
|
|
4
3
|
isFunction,
|
|
5
4
|
isNumber,
|
|
6
5
|
isString,
|
|
@@ -8,16 +7,23 @@ import {
|
|
|
8
7
|
isContextComponent,
|
|
9
8
|
isMethod,
|
|
10
9
|
overwrite,
|
|
11
|
-
|
|
10
|
+
exec
|
|
12
11
|
} from "@domql/utils";
|
|
13
|
-
const throughInitialExec =
|
|
12
|
+
const throughInitialExec = (element, exclude = {}) => {
|
|
14
13
|
const { __ref: ref } = element;
|
|
15
14
|
for (const param in element) {
|
|
16
15
|
if (exclude[param]) continue;
|
|
17
16
|
const prop = element[param];
|
|
18
17
|
if (isFunction(prop) && !isMethod(param, element)) {
|
|
19
18
|
ref.__exec[param] = prop;
|
|
20
|
-
|
|
19
|
+
const result = prop(element, element.state, element.context);
|
|
20
|
+
if (result && typeof result.then === "function") {
|
|
21
|
+
result.then((resolved) => {
|
|
22
|
+
element[param] = resolved;
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
element[param] = result;
|
|
26
|
+
}
|
|
21
27
|
}
|
|
22
28
|
}
|
|
23
29
|
};
|
|
@@ -29,8 +35,14 @@ const throughUpdatedExec = (element, options = {}) => {
|
|
|
29
35
|
const isDefinedParam = ref.__defineCache[param];
|
|
30
36
|
if (isDefinedParam) continue;
|
|
31
37
|
const newExec = ref.__exec[param](element, element.state, element.context);
|
|
38
|
+
if (newExec && typeof newExec.then === "function") {
|
|
39
|
+
newExec.then((resolved) => {
|
|
40
|
+
element[param] = resolved;
|
|
41
|
+
});
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
32
44
|
const execReturnsString = isString(newExec) || isNumber(newExec);
|
|
33
|
-
if (prop
|
|
45
|
+
if (prop?.node && execReturnsString) {
|
|
34
46
|
overwrite(prop, { text: newExec });
|
|
35
47
|
} else if (newExec !== prop) {
|
|
36
48
|
if (matchesComponentNaming(param)) {
|
|
@@ -48,71 +60,114 @@ const throughUpdatedExec = (element, options = {}) => {
|
|
|
48
60
|
}
|
|
49
61
|
return changes;
|
|
50
62
|
};
|
|
51
|
-
const throughExecProps =
|
|
63
|
+
const throughExecProps = (element) => {
|
|
52
64
|
const { __ref: ref } = element;
|
|
53
65
|
const { props } = element;
|
|
54
66
|
for (const k in props) {
|
|
55
|
-
const
|
|
67
|
+
const c0 = k.charCodeAt(0);
|
|
68
|
+
const c1 = k.charCodeAt(1);
|
|
69
|
+
const isDefine = c0 === 105 && c1 === 115 || // 'is'
|
|
70
|
+
c0 === 104 && c1 === 97 && k.charCodeAt(2) === 115 || // 'has'
|
|
71
|
+
c0 === 117 && c1 === 115 && k.charCodeAt(2) === 101;
|
|
56
72
|
const cachedExecProp = ref.__execProps[k];
|
|
57
73
|
if (isFunction(cachedExecProp)) {
|
|
58
|
-
|
|
74
|
+
const result = exec(cachedExecProp, element);
|
|
75
|
+
if (result && typeof result.then === "function") {
|
|
76
|
+
result.then((resolved) => {
|
|
77
|
+
props[k] = resolved;
|
|
78
|
+
});
|
|
79
|
+
} else {
|
|
80
|
+
props[k] = result;
|
|
81
|
+
}
|
|
59
82
|
} else if (isDefine && isFunction(props[k])) {
|
|
60
83
|
ref.__execProps[k] = props[k];
|
|
61
|
-
|
|
84
|
+
const result = exec(props[k], element);
|
|
85
|
+
if (result && typeof result.then === "function") {
|
|
86
|
+
result.then((resolved) => {
|
|
87
|
+
props[k] = resolved;
|
|
88
|
+
});
|
|
89
|
+
} else {
|
|
90
|
+
props[k] = result;
|
|
91
|
+
}
|
|
62
92
|
}
|
|
63
93
|
}
|
|
64
94
|
};
|
|
65
|
-
const
|
|
66
|
-
};
|
|
67
|
-
const throughInitialDefine = async (element) => {
|
|
95
|
+
const throughInitialDefine = (element) => {
|
|
68
96
|
const { define, context, __ref: ref } = element;
|
|
69
|
-
|
|
97
|
+
const hasLocalDefine = isObject(define);
|
|
70
98
|
const hasGlobalDefine = context && isObject(context.define);
|
|
71
|
-
if (
|
|
72
|
-
|
|
99
|
+
if (!hasLocalDefine && !hasGlobalDefine) return element;
|
|
100
|
+
const defineObj = hasLocalDefine && hasGlobalDefine ? { ...define, ...context.define } : hasLocalDefine ? define : context.define;
|
|
73
101
|
for (const param in defineObj) {
|
|
74
102
|
let elementProp = element[param];
|
|
75
103
|
if (isFunction(elementProp) && !isMethod(param, element)) {
|
|
76
104
|
ref.__exec[param] = elementProp;
|
|
77
|
-
|
|
78
|
-
if (execParam2) {
|
|
79
|
-
|
|
80
|
-
|
|
105
|
+
let execParam2 = exec(elementProp, element);
|
|
106
|
+
if (execParam2 && typeof execParam2.then === "function") {
|
|
107
|
+
execParam2.then((resolved) => {
|
|
108
|
+
elementProp = element[param] = resolved && resolved.parse ? resolved.parse() : resolved;
|
|
109
|
+
if (resolved) {
|
|
110
|
+
ref.__defineCache[param] = elementProp;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
} else {
|
|
114
|
+
elementProp = element[param] = execParam2 && execParam2.parse ? execParam2.parse() : execParam2;
|
|
115
|
+
if (execParam2) {
|
|
116
|
+
ref.__defineCache[param] = elementProp;
|
|
117
|
+
}
|
|
81
118
|
}
|
|
82
119
|
}
|
|
83
|
-
const execParam =
|
|
120
|
+
const execParam = defineObj[param](
|
|
84
121
|
elementProp,
|
|
85
122
|
element,
|
|
86
123
|
element.state,
|
|
87
124
|
element.context
|
|
88
125
|
);
|
|
89
|
-
if (execParam
|
|
126
|
+
if (execParam && typeof execParam.then === "function") {
|
|
127
|
+
execParam.then((resolved) => {
|
|
128
|
+
if (resolved) element[param] = resolved;
|
|
129
|
+
});
|
|
130
|
+
} else if (execParam) {
|
|
131
|
+
element[param] = execParam;
|
|
132
|
+
}
|
|
90
133
|
}
|
|
91
134
|
return element;
|
|
92
135
|
};
|
|
93
|
-
const throughUpdatedDefine =
|
|
136
|
+
const throughUpdatedDefine = (element) => {
|
|
94
137
|
const { context, define, __ref: ref } = element;
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
if (
|
|
98
|
-
|
|
138
|
+
const hasLocalDefine = isObject(define);
|
|
139
|
+
const hasGlobalDefine = isObject(context?.define);
|
|
140
|
+
if (!hasLocalDefine && !hasGlobalDefine) return;
|
|
141
|
+
const obj = hasLocalDefine && hasGlobalDefine ? { ...define, ...context.define } : hasLocalDefine ? define : context.define;
|
|
99
142
|
for (const param in obj) {
|
|
100
143
|
const execParam = ref.__exec[param];
|
|
101
144
|
if (execParam) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
145
|
+
const result = execParam(element, element.state, element.context);
|
|
146
|
+
if (result && typeof result.then === "function") {
|
|
147
|
+
result.then((resolved) => {
|
|
148
|
+
ref.__defineCache[param] = resolved;
|
|
149
|
+
});
|
|
150
|
+
} else {
|
|
151
|
+
ref.__defineCache[param] = result;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const cached = exec(ref.__defineCache[param], element);
|
|
155
|
+
if (cached && typeof cached.then === "function") {
|
|
156
|
+
cached.then((resolved) => {
|
|
157
|
+
});
|
|
158
|
+
continue;
|
|
107
159
|
}
|
|
108
|
-
const cached = await execPromise(ref.__defineCache[param], element);
|
|
109
160
|
const newExecParam = typeof obj[param] === "function" ? obj[param](cached, element, element.state, element.context) : void 0;
|
|
110
|
-
if (newExecParam
|
|
161
|
+
if (newExecParam && typeof newExecParam.then === "function") {
|
|
162
|
+
newExecParam.then((resolved) => {
|
|
163
|
+
element[param] = resolved;
|
|
164
|
+
});
|
|
165
|
+
} else if (newExecParam) {
|
|
166
|
+
element[param] = newExecParam;
|
|
167
|
+
}
|
|
111
168
|
}
|
|
112
|
-
return changes;
|
|
113
169
|
};
|
|
114
170
|
export {
|
|
115
|
-
isPropertyInDefines,
|
|
116
171
|
throughExecProps,
|
|
117
172
|
throughInitialDefine,
|
|
118
173
|
throughInitialExec,
|
package/dist/esm/methods/set.js
CHANGED
|
@@ -4,8 +4,13 @@ import { update } from "../update.js";
|
|
|
4
4
|
import {
|
|
5
5
|
call,
|
|
6
6
|
error,
|
|
7
|
+
getContext,
|
|
7
8
|
getPath,
|
|
8
9
|
getRef,
|
|
10
|
+
getRoot,
|
|
11
|
+
getRootContext,
|
|
12
|
+
getRootData,
|
|
13
|
+
getRootState,
|
|
9
14
|
keys,
|
|
10
15
|
log,
|
|
11
16
|
lookdown,
|
|
@@ -38,6 +43,11 @@ const addMethods = (element, parent, options = {}) => {
|
|
|
38
43
|
lookdownAll,
|
|
39
44
|
getRef,
|
|
40
45
|
getPath,
|
|
46
|
+
getRootState,
|
|
47
|
+
getRoot,
|
|
48
|
+
getRootData,
|
|
49
|
+
getRootContext,
|
|
50
|
+
getContext,
|
|
41
51
|
setNodeStyles,
|
|
42
52
|
spotByPath,
|
|
43
53
|
parse,
|