@domql/element 3.2.3 → 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/children.js +40 -12
- package/create.js +40 -26
- package/define.js +1 -1
- package/dist/cjs/children.js +39 -11
- package/dist/cjs/create.js +41 -11
- 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 +6 -6
- package/dist/cjs/index.js +9 -6
- package/dist/cjs/iterate.js +13 -13
- 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 +1 -2
- package/dist/cjs/mixins/html.js +1 -2
- package/dist/cjs/mixins/state.js +2 -2
- package/dist/cjs/mixins/style.js +11 -2
- package/dist/cjs/mixins/text.js +5 -1
- package/dist/cjs/node.js +8 -5
- 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 +12 -14
- package/dist/cjs/update.js +80 -40
- package/dist/cjs/utils/applyParam.js +3 -3
- package/dist/cjs/utils/extendUtils.js +5 -5
- package/dist/cjs/utils/index.js +2 -0
- package/dist/cjs/utils/propEvents.js +21 -4
- package/dist/esm/children.js +39 -11
- package/dist/esm/create.js +42 -11
- 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 +7 -7
- package/dist/esm/index.js +8 -6
- package/dist/esm/iterate.js +13 -13
- 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 +1 -2
- package/dist/esm/mixins/html.js +1 -2
- package/dist/esm/mixins/state.js +2 -2
- package/dist/esm/mixins/style.js +12 -3
- package/dist/esm/mixins/text.js +6 -2
- package/dist/esm/node.js +8 -5
- 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 +12 -14
- package/dist/esm/update.js +80 -42
- package/dist/esm/utils/applyParam.js +3 -3
- package/dist/esm/utils/extendUtils.js +5 -5
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/propEvents.js +21 -4
- package/dist/iife/index.js +4718 -0
- package/extend.js +7 -10
- package/index.js +9 -6
- package/iterate.js +20 -13
- package/node.js +10 -8
- package/package.json +42 -18
- package/set.js +6 -5
- package/update.js +90 -52
- package/__tests__/checkIfOnUpdate.test.js +0 -103
- package/__tests__/children.test.js +0 -209
- 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 -312
- 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 -111
- package/__tests__/tree.test.js +0 -15
- package/__tests__/update.test.js +0 -256
- package/dist/cjs/package.json +0 -4
- 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/content.js +0 -65
- 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/extendUtils.js +0 -149
- package/utils/index.js +0 -3
- package/utils/propEvents.js +0 -19
|
@@ -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
|
+
};
|
package/dist/esm/extend.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isFunction, exec
|
|
1
|
+
import { isFunction, exec } from "@domql/utils";
|
|
2
2
|
import {
|
|
3
3
|
getExtendStack,
|
|
4
4
|
jointStacks,
|
|
@@ -10,8 +10,8 @@ let mainExtend;
|
|
|
10
10
|
const applyExtend = (element, parent, options = {}) => {
|
|
11
11
|
if (isFunction(element)) element = exec(element, parent);
|
|
12
12
|
const { props, __ref } = element;
|
|
13
|
-
let extend =
|
|
14
|
-
const variant = props
|
|
13
|
+
let extend = props?.extends || element.extends || element.extend;
|
|
14
|
+
const variant = props?.variant;
|
|
15
15
|
const context = element.context || parent.context;
|
|
16
16
|
extend = fallbackStringExtend(extend, context, options, variant);
|
|
17
17
|
const extendStack = getExtendStack(extend, context);
|
|
@@ -19,9 +19,9 @@ const applyExtend = (element, parent, options = {}) => {
|
|
|
19
19
|
let childExtendStack = [];
|
|
20
20
|
if (parent) {
|
|
21
21
|
element.parent = parent;
|
|
22
|
-
if (!options.ignoreChildExtend && !
|
|
22
|
+
if (!options.ignoreChildExtend && !props?.ignoreChildExtend) {
|
|
23
23
|
childExtendStack = getExtendStack(parent.childExtend, context);
|
|
24
|
-
const ignoreChildExtendRecursive = props
|
|
24
|
+
const ignoreChildExtendRecursive = props?.ignoreChildExtendRecursive;
|
|
25
25
|
if (parent.childExtendRecursive && !ignoreChildExtendRecursive) {
|
|
26
26
|
const canExtendRecursive = element.key !== "__text";
|
|
27
27
|
if (canExtendRecursive) {
|
|
@@ -58,9 +58,9 @@ const applyExtend = (element, parent, options = {}) => {
|
|
|
58
58
|
}
|
|
59
59
|
if (__ref) __ref.__extend = stack;
|
|
60
60
|
let mergedExtend = cloneAndMergeArrayExtend(stack);
|
|
61
|
-
const COMPONENTS = context
|
|
61
|
+
const COMPONENTS = context?.components || options.components;
|
|
62
62
|
const component = exec(element.component || mergedExtend.component, element);
|
|
63
|
-
if (component && COMPONENTS
|
|
63
|
+
if (component && COMPONENTS?.[component]) {
|
|
64
64
|
const componentExtend = cloneAndMergeArrayExtend(
|
|
65
65
|
getExtendStack(COMPONENTS[component])
|
|
66
66
|
);
|
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
|
@@ -42,7 +42,7 @@ const throughUpdatedExec = (element, options = {}) => {
|
|
|
42
42
|
continue;
|
|
43
43
|
}
|
|
44
44
|
const execReturnsString = isString(newExec) || isNumber(newExec);
|
|
45
|
-
if (prop
|
|
45
|
+
if (prop?.node && execReturnsString) {
|
|
46
46
|
overwrite(prop, { text: newExec });
|
|
47
47
|
} else if (newExec !== prop) {
|
|
48
48
|
if (matchesComponentNaming(param)) {
|
|
@@ -64,7 +64,11 @@ const throughExecProps = (element) => {
|
|
|
64
64
|
const { __ref: ref } = element;
|
|
65
65
|
const { props } = element;
|
|
66
66
|
for (const k in props) {
|
|
67
|
-
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;
|
|
68
72
|
const cachedExecProp = ref.__execProps[k];
|
|
69
73
|
if (isFunction(cachedExecProp)) {
|
|
70
74
|
const result = exec(cachedExecProp, element);
|
|
@@ -88,14 +92,12 @@ const throughExecProps = (element) => {
|
|
|
88
92
|
}
|
|
89
93
|
}
|
|
90
94
|
};
|
|
91
|
-
const isPropertyInDefines = (key, element) => {
|
|
92
|
-
};
|
|
93
95
|
const throughInitialDefine = (element) => {
|
|
94
96
|
const { define, context, __ref: ref } = element;
|
|
95
|
-
|
|
97
|
+
const hasLocalDefine = isObject(define);
|
|
96
98
|
const hasGlobalDefine = context && isObject(context.define);
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
+
if (!hasLocalDefine && !hasGlobalDefine) return element;
|
|
100
|
+
const defineObj = hasLocalDefine && hasGlobalDefine ? { ...define, ...context.define } : hasLocalDefine ? define : context.define;
|
|
99
101
|
for (const param in defineObj) {
|
|
100
102
|
let elementProp = element[param];
|
|
101
103
|
if (isFunction(elementProp) && !isMethod(param, element)) {
|
|
@@ -133,10 +135,10 @@ const throughInitialDefine = (element) => {
|
|
|
133
135
|
};
|
|
134
136
|
const throughUpdatedDefine = (element) => {
|
|
135
137
|
const { context, define, __ref: ref } = element;
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
if (
|
|
139
|
-
|
|
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;
|
|
140
142
|
for (const param in obj) {
|
|
141
143
|
const execParam = ref.__exec[param];
|
|
142
144
|
if (execParam) {
|
|
@@ -164,10 +166,8 @@ const throughUpdatedDefine = (element) => {
|
|
|
164
166
|
element[param] = newExecParam;
|
|
165
167
|
}
|
|
166
168
|
}
|
|
167
|
-
return changes;
|
|
168
169
|
};
|
|
169
170
|
export {
|
|
170
|
-
isPropertyInDefines,
|
|
171
171
|
throughExecProps,
|
|
172
172
|
throughInitialDefine,
|
|
173
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,
|
package/dist/esm/methods/v2.js
CHANGED
|
@@ -44,7 +44,7 @@ const log = function(...args) {
|
|
|
44
44
|
args.forEach((v) => console.log(`%c${v}:
|
|
45
45
|
`, "font-weight: bold", element[v]));
|
|
46
46
|
} else {
|
|
47
|
-
console.log(__ref
|
|
47
|
+
console.log(__ref?.path);
|
|
48
48
|
const keys2 = element.keys();
|
|
49
49
|
keys2.forEach((v) => console.log(`%c${v}:
|
|
50
50
|
`, "font-weight: bold", element[v]));
|
package/dist/esm/mixins/attr.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { deepMerge, exec, isNot
|
|
1
|
+
import { deepMerge, exec, isNot } from "@domql/utils";
|
|
2
2
|
import { report } from "@domql/report";
|
|
3
3
|
function attr(params, element, node) {
|
|
4
4
|
const { __ref: ref, props } = element;
|
|
5
5
|
const { __attr } = ref;
|
|
6
|
-
if (isNot("object")) report("HTMLInvalidAttr", params);
|
|
6
|
+
if (isNot(params)("object")) report("HTMLInvalidAttr", params);
|
|
7
7
|
if (params) {
|
|
8
8
|
const attrs = exec(params, element);
|
|
9
9
|
if (props.attr) deepMerge(attrs, props.attr);
|
|
10
10
|
for (const attr2 in attrs) {
|
|
11
11
|
const val = exec(attrs[attr2], element);
|
|
12
|
-
if (val
|
|
12
|
+
if (val === __attr[attr2]) continue;
|
|
13
|
+
if (val !== false && val !== void 0 && val !== null && node.setAttribute) {
|
|
13
14
|
node.setAttribute(attr2, val);
|
|
14
15
|
} else if (node.removeAttribute) node.removeAttribute(attr2);
|
|
15
16
|
__attr[attr2] = val;
|
|
@@ -29,7 +29,17 @@ const classList = (params, element) => {
|
|
|
29
29
|
};
|
|
30
30
|
const applyClassListOnNode = (params, element, node) => {
|
|
31
31
|
const className = classList(params, element);
|
|
32
|
-
|
|
32
|
+
const { __ref } = element;
|
|
33
|
+
if (className === __ref.__className) return className;
|
|
34
|
+
__ref.__className = className;
|
|
35
|
+
if (node && typeof node.setAttribute === "function") {
|
|
36
|
+
node.setAttribute("class", className);
|
|
37
|
+
} else if (node) {
|
|
38
|
+
try {
|
|
39
|
+
node.className = className;
|
|
40
|
+
} catch (e) {
|
|
41
|
+
}
|
|
42
|
+
}
|
|
33
43
|
return className;
|
|
34
44
|
};
|
|
35
45
|
function applyClasslist(params, element, node) {
|
|
@@ -34,10 +34,9 @@ const removeContent = function(el, opts = {}) {
|
|
|
34
34
|
}
|
|
35
35
|
};
|
|
36
36
|
function setContent(param, element, node, opts) {
|
|
37
|
-
var _a;
|
|
38
37
|
const contentElementKey = setContentKey(element, opts);
|
|
39
38
|
if (param && element) {
|
|
40
|
-
if (
|
|
39
|
+
if (element[contentElementKey]?.update) {
|
|
41
40
|
element[contentElementKey].update({}, opts);
|
|
42
41
|
} else {
|
|
43
42
|
set.call(element, param, opts);
|
package/dist/esm/mixins/html.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { exec } from "@domql/utils";
|
|
2
2
|
function html(param, element, node) {
|
|
3
|
-
|
|
4
|
-
const prop = exec(((_a = element == null ? void 0 : element.props) == null ? void 0 : _a.html) || param, element);
|
|
3
|
+
const prop = exec(element?.props?.html || param, element);
|
|
5
4
|
const { __ref } = element;
|
|
6
5
|
if (prop !== __ref.__html) {
|
|
7
6
|
if (node.nodeName === "SVG") node.textContent = prop;
|
package/dist/esm/mixins/state.js
CHANGED
|
@@ -3,8 +3,8 @@ function state(params, element, node) {
|
|
|
3
3
|
const state2 = exec(params, element);
|
|
4
4
|
if (isObject(state2)) {
|
|
5
5
|
for (const param in state2) {
|
|
6
|
-
if (STATE_METHODS.
|
|
7
|
-
if (!Object.hasOwnProperty.call(state2, param)) continue;
|
|
6
|
+
if (STATE_METHODS.has(param)) continue;
|
|
7
|
+
if (!Object.prototype.hasOwnProperty.call(state2, param)) continue;
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
return element;
|
package/dist/esm/mixins/style.js
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { exec, isObject } from "@domql/utils";
|
|
2
2
|
import { report } from "@domql/report";
|
|
3
3
|
function style(params, element, node) {
|
|
4
4
|
if (params) {
|
|
5
|
-
if (isObject(params))
|
|
6
|
-
|
|
5
|
+
if (isObject(params)) {
|
|
6
|
+
const { __ref } = element;
|
|
7
|
+
if (!__ref.__style) __ref.__style = {};
|
|
8
|
+
const cache = __ref.__style;
|
|
9
|
+
for (const prop in params) {
|
|
10
|
+
const val = exec(params[prop], element);
|
|
11
|
+
if (val === cache[prop]) continue;
|
|
12
|
+
cache[prop] = val;
|
|
13
|
+
node.style[prop] = val;
|
|
14
|
+
}
|
|
15
|
+
} else report("HTMLInvalidStyles", params);
|
|
7
16
|
}
|
|
8
17
|
}
|
|
9
18
|
var style_default = style;
|
package/dist/esm/mixins/text.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { create } from "../create.js";
|
|
2
|
-
import { exec, isString } from "@domql/utils";
|
|
2
|
+
import { exec, isString, SVG_TAGS } from "@domql/utils";
|
|
3
3
|
function text(param, element, node) {
|
|
4
4
|
let prop = exec(element.props.text || param, element);
|
|
5
5
|
if (isString(prop) && prop.includes("{{")) {
|
|
@@ -7,7 +7,11 @@ function text(param, element, node) {
|
|
|
7
7
|
}
|
|
8
8
|
if (element.tag === "string") {
|
|
9
9
|
node.nodeValue = prop;
|
|
10
|
-
} else if (param !== void 0
|
|
10
|
+
} else if (param !== void 0 && param !== null) {
|
|
11
|
+
if (SVG_TAGS.has(element.tag)) {
|
|
12
|
+
if (node) node.textContent = prop;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
11
15
|
if (element.__text) {
|
|
12
16
|
if (element.__text.text === prop) return;
|
|
13
17
|
element.__text.text = prop;
|
package/dist/esm/node.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isFunction, isMethod, isObject, isUndefined } from "@domql/utils";
|
|
2
|
-
import { applyEventsOnNode, triggerEventOn } from "
|
|
3
|
-
import {
|
|
2
|
+
import { applyEventsOnNode, triggerEventOn } from "./event/index.js";
|
|
3
|
+
import { propagateEventsFromProps, propagateEventsFromElement } from "./utils/propEvents.js";
|
|
4
|
+
import { cacheNode } from "./render/index.js";
|
|
4
5
|
import { create } from "./create.js";
|
|
5
6
|
import {
|
|
6
7
|
throughExecProps,
|
|
@@ -11,7 +12,7 @@ import { REGISTRY } from "./mixins/index.js";
|
|
|
11
12
|
import { applyParam } from "./utils/applyParam.js";
|
|
12
13
|
import setChildren from "./children.js";
|
|
13
14
|
import { setContent } from "./set.js";
|
|
14
|
-
const ENV =
|
|
15
|
+
const ENV = process.env.NODE_ENV;
|
|
15
16
|
const createNode = (element, opts) => {
|
|
16
17
|
let { node, tag, __ref: ref } = element;
|
|
17
18
|
if (!ref.__if) return element;
|
|
@@ -30,10 +31,12 @@ const createNode = (element, opts) => {
|
|
|
30
31
|
throughExecProps(element);
|
|
31
32
|
throughInitialDefine(element);
|
|
32
33
|
throughInitialExec(element);
|
|
34
|
+
propagateEventsFromProps(element);
|
|
35
|
+
propagateEventsFromElement(element);
|
|
33
36
|
applyEventsOnNode(element, { isNewNode, ...opts });
|
|
34
37
|
for (const param in element) {
|
|
35
38
|
const value = element[param];
|
|
36
|
-
if (!Object.hasOwnProperty.call(element, param) ||
|
|
39
|
+
if (!Object.prototype.hasOwnProperty.call(element, param) || value === void 0 || isMethod(param, element) || isObject(REGISTRY[param]) || param.length > 2 && param.charCodeAt(0) === 111 && param.charCodeAt(1) === 110 && param.charCodeAt(2) >= 65 && param.charCodeAt(2) <= 90) {
|
|
37
40
|
continue;
|
|
38
41
|
}
|
|
39
42
|
const isElement = applyParam(param, element, opts);
|
|
@@ -54,7 +57,7 @@ const createNode = (element, opts) => {
|
|
|
54
57
|
}
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
|
-
const content = element.children ? setChildren(element.children, element, opts) : element.
|
|
60
|
+
const content = element.children ? setChildren(element.children, element, opts) : element.children || element.content;
|
|
58
61
|
if (content) {
|
|
59
62
|
setContent(content, element, opts);
|
|
60
63
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const appendNode = (node, parentNode) => {
|
|
2
|
+
try {
|
|
3
|
+
parentNode.appendChild(node);
|
|
4
|
+
return node;
|
|
5
|
+
} catch (e) {
|
|
6
|
+
console.error("Does not support to append", parentNode, node);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
const insertNodeAfter = (node, siblingNode, parentNode) => {
|
|
10
|
+
if (!node) {
|
|
11
|
+
throw new Error("Node is required");
|
|
12
|
+
}
|
|
13
|
+
const parent = parentNode || siblingNode?.parentNode;
|
|
14
|
+
if (siblingNode?.nextSibling) {
|
|
15
|
+
parent?.insertBefore(node, siblingNode.nextSibling);
|
|
16
|
+
} else if (siblingNode?.insertAdjacentElement) {
|
|
17
|
+
siblingNode.insertAdjacentElement("afterend", node);
|
|
18
|
+
} else {
|
|
19
|
+
parent?.insertBefore(node, siblingNode);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const insertNodeBefore = (node, siblingNode, parentNode) => {
|
|
23
|
+
if (!node) {
|
|
24
|
+
throw new Error("Node is required");
|
|
25
|
+
}
|
|
26
|
+
const parent = parentNode || siblingNode.parentNode;
|
|
27
|
+
parent?.insertBefore(node, siblingNode);
|
|
28
|
+
};
|
|
29
|
+
const assignNode = (element, parent, key, attachOptions) => {
|
|
30
|
+
if (!element) {
|
|
31
|
+
throw new Error("Element is required");
|
|
32
|
+
}
|
|
33
|
+
if (!parent) {
|
|
34
|
+
throw new Error("Parent is required");
|
|
35
|
+
}
|
|
36
|
+
parent[key || element.key] = element;
|
|
37
|
+
if (element.tag !== "shadow") {
|
|
38
|
+
if (attachOptions && attachOptions.position) {
|
|
39
|
+
;
|
|
40
|
+
(attachOptions.position === "before" ? insertNodeBefore : insertNodeAfter)(element.node, attachOptions.node || parent.node);
|
|
41
|
+
} else {
|
|
42
|
+
appendNode(element.node, parent.node, element);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return element;
|
|
46
|
+
};
|
|
47
|
+
export {
|
|
48
|
+
appendNode,
|
|
49
|
+
assignNode,
|
|
50
|
+
insertNodeAfter,
|
|
51
|
+
insertNodeBefore
|
|
52
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { report } from "@domql/report";
|
|
2
|
+
import { canRenderTag } from "../event/index.js";
|
|
3
|
+
import { exec, isObject, isString, isValidHtmlTag, SVG_TAGS, document } from "@domql/utils";
|
|
4
|
+
const SVG_NS = "http://www.w3.org/2000/svg";
|
|
5
|
+
const createHTMLNode = (element) => {
|
|
6
|
+
const { tag, context } = element;
|
|
7
|
+
const doc = context.document || document;
|
|
8
|
+
if (tag) {
|
|
9
|
+
if (tag === "string") return doc.createTextNode(element.text);
|
|
10
|
+
else if (tag === "fragment") {
|
|
11
|
+
return doc.createDocumentFragment();
|
|
12
|
+
} else if (SVG_TAGS.has(tag)) {
|
|
13
|
+
if (tag === "svg" || element.parent?.node?.namespaceURI === SVG_NS) {
|
|
14
|
+
return doc.createElementNS(SVG_NS, tag);
|
|
15
|
+
}
|
|
16
|
+
return doc.createElement(tag);
|
|
17
|
+
} else return doc.createElement(tag);
|
|
18
|
+
} else {
|
|
19
|
+
return doc.createElement("div");
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const detectTag = (element) => {
|
|
23
|
+
let { tag, key, props } = element;
|
|
24
|
+
tag = exec(tag, element);
|
|
25
|
+
if (tag === true) tag = key;
|
|
26
|
+
if (isObject(props) && isString(props.tag)) {
|
|
27
|
+
const tagExists = isValidHtmlTag(props.tag);
|
|
28
|
+
if (tagExists) return props.tag;
|
|
29
|
+
}
|
|
30
|
+
if (isString(tag)) {
|
|
31
|
+
if (isValidHtmlTag(tag)) return tag;
|
|
32
|
+
} else {
|
|
33
|
+
let keyAsTag = key.toLowerCase();
|
|
34
|
+
if (keyAsTag.includes(".")) keyAsTag = keyAsTag.split(".")[0];
|
|
35
|
+
if (keyAsTag.includes("_")) keyAsTag = keyAsTag.split("_")[0];
|
|
36
|
+
if (isValidHtmlTag(keyAsTag)) return keyAsTag;
|
|
37
|
+
}
|
|
38
|
+
return "div";
|
|
39
|
+
};
|
|
40
|
+
const cacheNode = (element) => {
|
|
41
|
+
const { context } = element;
|
|
42
|
+
const win = context.window || window;
|
|
43
|
+
const tag = element.tag = detectTag(element);
|
|
44
|
+
if (!canRenderTag(tag)) {
|
|
45
|
+
return report("HTMLInvalidTag", element.tag, element);
|
|
46
|
+
}
|
|
47
|
+
if (!win.nodeCaches) win.nodeCaches = {};
|
|
48
|
+
const isSvgContext = SVG_TAGS.has(tag) && (tag === "svg" || element.parent?.node?.namespaceURI === SVG_NS);
|
|
49
|
+
const cacheKey = isSvgContext ? "svg:" + tag : tag;
|
|
50
|
+
let cachedTag = win.nodeCaches[cacheKey];
|
|
51
|
+
if (!cachedTag) cachedTag = win.nodeCaches[cacheKey] = createHTMLNode(element);
|
|
52
|
+
const clonedNode = cachedTag.cloneNode(true);
|
|
53
|
+
if (tag === "string") clonedNode.nodeValue = element.text;
|
|
54
|
+
return clonedNode;
|
|
55
|
+
};
|
|
56
|
+
export {
|
|
57
|
+
cacheNode,
|
|
58
|
+
createHTMLNode,
|
|
59
|
+
detectTag
|
|
60
|
+
};
|
package/dist/esm/set.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { deepContains, exec, isFunction, OPTIONS } from "@domql/utils";
|
|
2
2
|
import { create } from "./create.js";
|
|
3
|
-
import { triggerEventOn, triggerEventOnUpdate } from "
|
|
3
|
+
import { triggerEventOn, triggerEventOnUpdate } from "./event/index.js";
|
|
4
4
|
const setContentKey = (element, opts = {}) => {
|
|
5
5
|
const { __ref: ref } = element;
|
|
6
6
|
const contentElementKey = opts.contentElementKey;
|
|
@@ -9,19 +9,18 @@ const setContentKey = (element, opts = {}) => {
|
|
|
9
9
|
}
|
|
10
10
|
return ref.contentElementKey;
|
|
11
11
|
};
|
|
12
|
-
|
|
13
|
-
const element =
|
|
12
|
+
function reset(options) {
|
|
13
|
+
const element = this;
|
|
14
14
|
create(element, element.parent, void 0, {
|
|
15
15
|
ignoreChildExtends: true,
|
|
16
16
|
...OPTIONS.defaultOptions,
|
|
17
17
|
...OPTIONS.create,
|
|
18
18
|
...options
|
|
19
19
|
});
|
|
20
|
-
}
|
|
20
|
+
}
|
|
21
21
|
const resetContent = (params, element, opts) => {
|
|
22
|
-
var _a;
|
|
23
22
|
const contentElementKey = setContentKey(element, opts);
|
|
24
|
-
if (
|
|
23
|
+
if (element[contentElementKey]?.node) removeContent(element, opts);
|
|
25
24
|
const contentElem = create(params, element, contentElementKey || "content", {
|
|
26
25
|
ignoreChildExtends: true,
|
|
27
26
|
...OPTIONS.defaultOptions,
|
|
@@ -46,7 +45,6 @@ function setContent(param, element, opts) {
|
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
const removeContent = function(el, opts = {}) {
|
|
49
|
-
var _a;
|
|
50
48
|
const element = el || this;
|
|
51
49
|
const contentElementKey = setContentKey(element, opts);
|
|
52
50
|
if (opts.contentElementKey !== "content") {
|
|
@@ -54,16 +52,17 @@ const removeContent = function(el, opts = {}) {
|
|
|
54
52
|
}
|
|
55
53
|
const content = element[contentElementKey];
|
|
56
54
|
if (!content) return;
|
|
57
|
-
if (content.tag === "fragment" &&
|
|
58
|
-
content.__ref.__children
|
|
59
|
-
|
|
55
|
+
if (content.tag === "fragment" && content.__ref?.__children) {
|
|
56
|
+
const __children = content.__ref.__children;
|
|
57
|
+
for (let i = 0; i < __children.length; i++) {
|
|
58
|
+
const child = content[__children[i]];
|
|
60
59
|
if (child.node && child.node.parentNode) {
|
|
61
60
|
child.node.parentNode.removeChild(child.node);
|
|
62
61
|
}
|
|
63
62
|
if (isFunction(child.remove)) {
|
|
64
63
|
child.remove();
|
|
65
64
|
}
|
|
66
|
-
}
|
|
65
|
+
}
|
|
67
66
|
} else {
|
|
68
67
|
if (content.node && content.node.parentNode) {
|
|
69
68
|
content.node.parentNode.removeChild(content.node);
|
|
@@ -75,7 +74,6 @@ const removeContent = function(el, opts = {}) {
|
|
|
75
74
|
delete element[contentElementKey];
|
|
76
75
|
};
|
|
77
76
|
const set = function(params, options = {}, el) {
|
|
78
|
-
var _a;
|
|
79
77
|
const element = el || this;
|
|
80
78
|
const { __ref: ref } = element;
|
|
81
79
|
const contentElementKey = setContentKey(element, options);
|
|
@@ -86,7 +84,7 @@ const set = function(params, options = {}, el) {
|
|
|
86
84
|
if (options.preventContentUpdate === true && !hasChildren) return;
|
|
87
85
|
const childHasChanged = !ref.__noChildrenDifference;
|
|
88
86
|
const childrenIsDifferentFromCache = childHasChanged && __contentRef && Object.keys(params).length === Object.keys(content).length && deepContains(params, content);
|
|
89
|
-
if (
|
|
87
|
+
if (content?.update && !childHasChanged && !childrenIsDifferentFromCache) {
|
|
90
88
|
if (!options.preventBeforeUpdateListener && !options.preventListeners) {
|
|
91
89
|
const beforeUpdateReturns = triggerEventOnUpdate(
|
|
92
90
|
"beforeUpdate",
|
|
@@ -110,7 +108,7 @@ const set = function(params, options = {}, el) {
|
|
|
110
108
|
params.childExtends = element.childExtends;
|
|
111
109
|
props.ignoreChildExtends = true;
|
|
112
110
|
}
|
|
113
|
-
if (!
|
|
111
|
+
if (!props?.childProps && element.props?.childProps) {
|
|
114
112
|
props.childProps = element.props.childProps;
|
|
115
113
|
props.ignoreChildProps = true;
|
|
116
114
|
}
|