@domql/element 2.5.200 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/__tests__/checkIfOnUpdate.test.js +103 -0
- package/__tests__/children.test.js +213 -0
- package/__tests__/define.test.js +75 -0
- package/__tests__/inheritStateUpdates.test.js +79 -0
- package/__tests__/renderElement.test.js +131 -0
- package/__tests__/resetElement.test.js +44 -0
- package/__tests__/set.test.js +316 -0
- package/__tests__/throughExecProps.test.js +86 -0
- package/__tests__/throughInitialDefine.test.js +104 -0
- package/__tests__/throughInitialExec.test.js +92 -0
- package/__tests__/throughUpdatedDefine.test.js +92 -0
- package/__tests__/throughUpdatedExec.test.js +110 -0
- package/__tests__/tree.test.js +15 -0
- package/__tests__/update.test.js +253 -0
- package/children.js +105 -0
- package/create.js +125 -255
- package/dist/cjs/__tests__/checkIfOnUpdate.test.js +73 -0
- package/dist/cjs/__tests__/children.test.js +177 -0
- package/dist/cjs/__tests__/define.test.js +75 -0
- package/dist/cjs/__tests__/inheritStateUpdates.test.js +62 -0
- package/dist/cjs/__tests__/renderElement.test.js +138 -0
- package/dist/cjs/__tests__/resetElement.test.js +35 -0
- package/dist/cjs/__tests__/set.test.js +256 -0
- package/dist/cjs/__tests__/throughExecProps.test.js +62 -0
- package/dist/cjs/__tests__/throughInitialDefine.test.js +79 -0
- package/dist/cjs/__tests__/throughInitialExec.test.js +73 -0
- package/dist/cjs/__tests__/throughUpdatedDefine.test.js +69 -0
- package/dist/cjs/__tests__/throughUpdatedExec.test.js +84 -0
- package/dist/cjs/__tests__/tree.test.js +11 -0
- package/dist/cjs/__tests__/update.test.js +219 -0
- package/dist/cjs/children.js +87 -0
- package/dist/cjs/create.js +78 -177
- package/dist/cjs/iterate.js +29 -13
- package/dist/cjs/methods/set.js +27 -25
- package/dist/cjs/methods/v2.js +1 -5
- package/dist/cjs/mixins/attr.js +7 -6
- package/dist/cjs/mixins/index.js +0 -4
- package/dist/cjs/mixins/registry.js +7 -67
- package/dist/cjs/mixins/scope.js +1 -1
- package/dist/cjs/mixins/state.js +3 -4
- package/dist/cjs/mixins/text.js +3 -3
- package/dist/cjs/node.js +32 -22
- package/dist/cjs/set.js +112 -40
- package/dist/cjs/update.js +119 -64
- package/dist/cjs/utils/applyParam.js +2 -2
- package/dist/cjs/utils/index.js +8 -4
- package/dist/cjs/utils/onlyResolveExtends.js +4 -7
- package/dist/esm/__tests__/checkIfOnUpdate.test.js +73 -0
- package/dist/esm/__tests__/children.test.js +177 -0
- package/dist/esm/__tests__/define.test.js +53 -0
- package/dist/esm/__tests__/inheritStateUpdates.test.js +62 -0
- package/dist/esm/__tests__/renderElement.test.js +116 -0
- package/dist/esm/__tests__/resetElement.test.js +35 -0
- package/dist/esm/__tests__/set.test.js +256 -0
- package/dist/esm/__tests__/throughExecProps.test.js +62 -0
- package/dist/esm/__tests__/throughInitialDefine.test.js +79 -0
- package/dist/esm/__tests__/throughInitialExec.test.js +73 -0
- package/dist/esm/__tests__/throughUpdatedDefine.test.js +69 -0
- package/dist/esm/__tests__/throughUpdatedExec.test.js +84 -0
- package/dist/esm/__tests__/tree.test.js +11 -0
- package/dist/esm/__tests__/update.test.js +219 -0
- package/dist/esm/children.js +81 -0
- package/dist/esm/create.js +83 -188
- package/dist/esm/iterate.js +33 -16
- package/dist/esm/methods/set.js +6 -4
- package/dist/esm/methods/v2.js +1 -5
- package/dist/esm/mixins/attr.js +8 -7
- package/dist/esm/mixins/data.js +1 -1
- package/dist/esm/mixins/index.js +0 -4
- package/dist/esm/mixins/registry.js +7 -67
- package/dist/esm/mixins/scope.js +1 -1
- package/dist/esm/mixins/state.js +4 -5
- package/dist/esm/mixins/text.js +4 -7
- package/dist/esm/node.js +23 -23
- package/dist/esm/set.js +112 -40
- package/dist/esm/update.js +122 -68
- package/dist/esm/utils/applyParam.js +2 -2
- package/dist/esm/utils/index.js +4 -3
- package/dist/esm/utils/onlyResolveExtends.js +12 -8
- package/iterate.js +44 -26
- package/methods/set.js +5 -4
- package/methods/v2.js +5 -4
- package/mixins/attr.js +13 -7
- package/mixins/classList.js +7 -2
- package/mixins/data.js +1 -1
- package/mixins/index.js +1 -6
- package/mixins/registry.js +6 -53
- package/mixins/scope.js +1 -1
- package/mixins/state.js +4 -5
- package/mixins/text.js +4 -7
- package/node.js +31 -28
- package/package.json +7 -6
- package/set.js +129 -41
- package/update.js +169 -89
- package/utils/applyParam.js +7 -4
- package/utils/index.js +1 -3
- package/utils/onlyResolveExtends.js +27 -16
- package/cache/index.js +0 -3
- package/cache/options.js +0 -4
- package/dist/cjs/cache/index.js +0 -24
- package/dist/cjs/cache/options.js +0 -26
- package/dist/cjs/extend.js +0 -81
- package/dist/cjs/methods/index.js +0 -320
- package/dist/cjs/mixins/content.js +0 -67
- package/dist/cjs/props/create.js +0 -92
- package/dist/cjs/props/ignore.js +0 -24
- package/dist/cjs/props/index.js +0 -21
- package/dist/cjs/props/inherit.js +0 -51
- package/dist/cjs/props/update.js +0 -34
- package/dist/cjs/utils/component.js +0 -74
- package/dist/cjs/utils/extendUtils.js +0 -133
- package/dist/cjs/utils/object.js +0 -171
- package/dist/cjs/utils/propEvents.js +0 -39
- package/dist/esm/cache/index.js +0 -4
- package/dist/esm/cache/options.js +0 -6
- package/dist/esm/extend.js +0 -67
- package/dist/esm/methods/index.js +0 -300
- package/dist/esm/mixins/content.js +0 -47
- package/dist/esm/props/create.js +0 -72
- package/dist/esm/props/ignore.js +0 -4
- package/dist/esm/props/index.js +0 -4
- package/dist/esm/props/inherit.js +0 -31
- package/dist/esm/props/update.js +0 -14
- package/dist/esm/utils/component.js +0 -62
- package/dist/esm/utils/extendUtils.js +0 -113
- package/dist/esm/utils/object.js +0 -151
- package/dist/esm/utils/propEvents.js +0 -19
- package/extend.js +0 -90
- package/methods/index.js +0 -317
- package/mixins/content.js +0 -55
- package/props/create.js +0 -87
- package/props/ignore.js +0 -3
- package/props/index.js +0 -6
- package/props/inherit.js +0 -35
- package/props/update.js +0 -17
- package/utils/component.js +0 -68
- package/utils/extendUtils.js +0 -134
- package/utils/object.js +0 -172
- package/utils/propEvents.js +0 -19
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { update } from "../update";
|
|
2
|
+
describe("update()", () => {
|
|
3
|
+
let element, params, opts;
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
element = {
|
|
6
|
+
__ref: {
|
|
7
|
+
__execProps: {},
|
|
8
|
+
__exec: {},
|
|
9
|
+
__defineCache: {},
|
|
10
|
+
__props: [],
|
|
11
|
+
__state: "state"
|
|
12
|
+
},
|
|
13
|
+
state: "string",
|
|
14
|
+
props: {},
|
|
15
|
+
parent: {
|
|
16
|
+
props: {}
|
|
17
|
+
},
|
|
18
|
+
define: {},
|
|
19
|
+
node: document.createElement("div"),
|
|
20
|
+
key: "testElement",
|
|
21
|
+
on: {},
|
|
22
|
+
update
|
|
23
|
+
};
|
|
24
|
+
opts = {
|
|
25
|
+
preventUpdate: [],
|
|
26
|
+
preventDefineUpdate: [],
|
|
27
|
+
preventBeforeStateUpdateListener: false,
|
|
28
|
+
preventListeners: false,
|
|
29
|
+
preventStateUpdateListener: false
|
|
30
|
+
};
|
|
31
|
+
params = {};
|
|
32
|
+
});
|
|
33
|
+
it("does not modify opts when params and opts are empty", async () => {
|
|
34
|
+
await element.update({}, opts);
|
|
35
|
+
expect(opts).toEqual({
|
|
36
|
+
calleeElement: false,
|
|
37
|
+
cleanExec: true,
|
|
38
|
+
currentSnapshot: false,
|
|
39
|
+
exclude: [],
|
|
40
|
+
preventRecursive: false,
|
|
41
|
+
stackChanges: false,
|
|
42
|
+
preventUpdate: [],
|
|
43
|
+
preventDefineUpdate: [],
|
|
44
|
+
preventBeforeStateUpdateListener: false,
|
|
45
|
+
preventListeners: false,
|
|
46
|
+
preventStateUpdateListener: false
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it("initializes options with UPDATE_DEFAULT_OPTIONS when opts is empty", async () => {
|
|
50
|
+
await element.update({}, opts);
|
|
51
|
+
expect(opts.calleeElement).toBe(false);
|
|
52
|
+
expect(element.__ref).toBeDefined();
|
|
53
|
+
});
|
|
54
|
+
it("merges opts with UPDATE_DEFAULT_OPTIONS using deepMerge", async () => {
|
|
55
|
+
opts.customOption = true;
|
|
56
|
+
await element.update({}, opts);
|
|
57
|
+
expect(opts.customOption).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
it("converts string params to { text: params }", async () => {
|
|
60
|
+
await element.update("testString", opts);
|
|
61
|
+
expect(element.text).toBe("testString");
|
|
62
|
+
});
|
|
63
|
+
it("converts number params to { text: params }", async () => {
|
|
64
|
+
await element.update(123, opts);
|
|
65
|
+
expect(element.text).toBe(123);
|
|
66
|
+
});
|
|
67
|
+
it("returns early if preventInheritAtCurrentState matches element", async () => {
|
|
68
|
+
opts.preventInheritAtCurrentState = { __element: element };
|
|
69
|
+
await element.update({}, opts);
|
|
70
|
+
expect(element.__ref.__currentSnapshot).toBe(6);
|
|
71
|
+
});
|
|
72
|
+
it("initializes __ref if not present", async () => {
|
|
73
|
+
delete element.__ref;
|
|
74
|
+
await element.update({}, opts);
|
|
75
|
+
expect(element.__ref).toBeDefined();
|
|
76
|
+
});
|
|
77
|
+
it("merges options with UPDATE_DEFAULT_OPTIONS when exclude is missing", async () => {
|
|
78
|
+
await element.update({}, opts);
|
|
79
|
+
expect(opts.exclude).toBeDefined();
|
|
80
|
+
});
|
|
81
|
+
it("does not throw or modify opts when params is undefined", async () => {
|
|
82
|
+
await element.update(void 0, opts);
|
|
83
|
+
expect(opts).toEqual({
|
|
84
|
+
calleeElement: false,
|
|
85
|
+
cleanExec: true,
|
|
86
|
+
currentSnapshot: false,
|
|
87
|
+
exclude: [],
|
|
88
|
+
preventRecursive: false,
|
|
89
|
+
preventUpdate: [],
|
|
90
|
+
preventDefineUpdate: [],
|
|
91
|
+
stackChanges: false,
|
|
92
|
+
preventBeforeStateUpdateListener: false,
|
|
93
|
+
preventListeners: false,
|
|
94
|
+
preventStateUpdateListener: false
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
it("does not throw when opts is undefined", async () => {
|
|
98
|
+
await element.update({}, void 0);
|
|
99
|
+
expect(element.__ref).toBeDefined();
|
|
100
|
+
});
|
|
101
|
+
it("does not throw when opts is null", async () => {
|
|
102
|
+
await element.update({}, null);
|
|
103
|
+
expect(element.__ref).toBeDefined();
|
|
104
|
+
});
|
|
105
|
+
it("does not modify the params object", async () => {
|
|
106
|
+
params = { key: "value" };
|
|
107
|
+
await element.update(params, opts);
|
|
108
|
+
expect(params).toEqual({ key: "value" });
|
|
109
|
+
});
|
|
110
|
+
it("does modify opts when params is an empty object", async () => {
|
|
111
|
+
await element.update({}, opts);
|
|
112
|
+
expect(opts).toEqual({
|
|
113
|
+
calleeElement: false,
|
|
114
|
+
cleanExec: true,
|
|
115
|
+
currentSnapshot: false,
|
|
116
|
+
exclude: [],
|
|
117
|
+
preventRecursive: false,
|
|
118
|
+
stackChanges: false,
|
|
119
|
+
preventUpdate: [],
|
|
120
|
+
preventDefineUpdate: [],
|
|
121
|
+
preventBeforeStateUpdateListener: false,
|
|
122
|
+
preventListeners: false,
|
|
123
|
+
preventStateUpdateListener: false
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
it("moves regular properties to element.props", async () => {
|
|
127
|
+
params = { props: { title: "Test", description: "Content" } };
|
|
128
|
+
await element.update(params, opts);
|
|
129
|
+
expect(element.props).toEqual({
|
|
130
|
+
title: "Test",
|
|
131
|
+
description: "Content"
|
|
132
|
+
});
|
|
133
|
+
expect(element.title).toBeUndefined();
|
|
134
|
+
});
|
|
135
|
+
it("keeps element-rooted properties", async () => {
|
|
136
|
+
params = { Header: {}, Footer: {}, 0: "index" };
|
|
137
|
+
await element.update(params, opts);
|
|
138
|
+
expect(element.Header).toBeDefined();
|
|
139
|
+
expect(element.Footer).toBeDefined();
|
|
140
|
+
expect(element["0"]).toBe("index");
|
|
141
|
+
expect(element.props).toEqual({});
|
|
142
|
+
});
|
|
143
|
+
it("preserves built-in properties on element", async () => {
|
|
144
|
+
params = { props: { className: "container", hidden: true } };
|
|
145
|
+
await element.update(params, opts);
|
|
146
|
+
expect(element.props.className).toBe("container");
|
|
147
|
+
expect(element.props.hidden).toBe(true);
|
|
148
|
+
expect(element.props).toEqual({ className: "container", hidden: true });
|
|
149
|
+
});
|
|
150
|
+
it("moves element-like properties from props to root", async () => {
|
|
151
|
+
params = { props: { Header: {} } };
|
|
152
|
+
await element.update(params, opts);
|
|
153
|
+
expect(element.Header).toBeDefined();
|
|
154
|
+
expect(element.props.Header).toBeUndefined();
|
|
155
|
+
});
|
|
156
|
+
it("exits early when inheritStateUpdates returns false", async () => {
|
|
157
|
+
element.__ref.__stateBlocked = true;
|
|
158
|
+
await element.update({ props: { shouldChange: true } }, opts);
|
|
159
|
+
expect(element.props.shouldChange).toBe(true);
|
|
160
|
+
expect(element.__ref.__stateBlocked).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
it("exits early when checkIfOnUpdate fails", async () => {
|
|
163
|
+
element.parent.props.ifCondition = false;
|
|
164
|
+
await element.update({ state: { newState: true } }, opts);
|
|
165
|
+
expect(element.state.newState).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
it("updates props from parent key match", async () => {
|
|
168
|
+
element.parent.props.testKey = { inherited: true };
|
|
169
|
+
await element.update({}, opts);
|
|
170
|
+
expect(element.props.inherited).toBeUndefined();
|
|
171
|
+
});
|
|
172
|
+
it("updates props when functions exist in __props", async () => {
|
|
173
|
+
element.__ref.__props.push(() => "dynamic");
|
|
174
|
+
await element.update({}, opts);
|
|
175
|
+
expect(element.props).toEqual(expect.any(Object));
|
|
176
|
+
});
|
|
177
|
+
it("skips props update when preventPropsUpdate=true", async () => {
|
|
178
|
+
opts.preventPropsUpdate = true;
|
|
179
|
+
opts.preventUpdateAfter = true;
|
|
180
|
+
element.parent.props.testKey = { shouldExist: true };
|
|
181
|
+
await element.update({}, opts);
|
|
182
|
+
expect(element.props.shouldExist).toBeUndefined();
|
|
183
|
+
});
|
|
184
|
+
it("should not skips props update when preventPropsUpdate=false", async () => {
|
|
185
|
+
opts.preventPropsUpdate = false;
|
|
186
|
+
opts.lazyLoad = true;
|
|
187
|
+
opts.onEachUpdate = () => {
|
|
188
|
+
return true;
|
|
189
|
+
};
|
|
190
|
+
element.parent.props.testKey = { shouldExist: true };
|
|
191
|
+
element.__ref.__propsStack = [];
|
|
192
|
+
element.__ref.__if = true;
|
|
193
|
+
element.off = { text: "off" };
|
|
194
|
+
await element.update({}, opts);
|
|
195
|
+
expect(element.props.shouldExist).toBeUndefined();
|
|
196
|
+
});
|
|
197
|
+
it("should set preventUpdateAfterCount to 1 when is not a number", async () => {
|
|
198
|
+
opts.preventPropsUpdate = true;
|
|
199
|
+
opts.preventUpdateAfter = 2;
|
|
200
|
+
opts.preventUpdateAfterCount = void 0;
|
|
201
|
+
element.parent.props.testKey = { shouldExist: true };
|
|
202
|
+
await element.update({}, opts);
|
|
203
|
+
expect(element.props.shouldExist).toBeUndefined();
|
|
204
|
+
});
|
|
205
|
+
it("returns element when beforeUpdate rejects", async () => {
|
|
206
|
+
element.props.onBeforeUpdate = () => false;
|
|
207
|
+
const result = await element.update({}, opts);
|
|
208
|
+
expect(result).toBe(element);
|
|
209
|
+
});
|
|
210
|
+
it("processes parent.childProps", async () => {
|
|
211
|
+
element.parent.props.childProps = { global: true };
|
|
212
|
+
await element.update({}, opts);
|
|
213
|
+
expect(element.props.global).toBeUndefined();
|
|
214
|
+
});
|
|
215
|
+
it("processes function props", async () => {
|
|
216
|
+
await element.update({ props: { calc: () => 42 } }, opts);
|
|
217
|
+
expect(element.props.calc()).toBe(42);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import {
|
|
2
|
+
concatAddExtends,
|
|
3
|
+
deepClone,
|
|
4
|
+
execPromise,
|
|
5
|
+
getChildStateInKey,
|
|
6
|
+
isArray,
|
|
7
|
+
isDefined,
|
|
8
|
+
isNot,
|
|
9
|
+
isNumber,
|
|
10
|
+
isObject,
|
|
11
|
+
isObjectLike,
|
|
12
|
+
isState,
|
|
13
|
+
isString,
|
|
14
|
+
matchesComponentNaming
|
|
15
|
+
} from "@domql/utils";
|
|
16
|
+
async function setChildren(param, element, opts) {
|
|
17
|
+
let { children, __ref: ref, state } = element;
|
|
18
|
+
let { childrenAs } = element.props || {};
|
|
19
|
+
children = await execPromise(param, element, state) || await execPromise(children, element, state);
|
|
20
|
+
if (children) {
|
|
21
|
+
if (isState(children)) children = children.parse();
|
|
22
|
+
if (isString(children) || isNumber(children)) {
|
|
23
|
+
if (children === "state") children = state.parse();
|
|
24
|
+
else {
|
|
25
|
+
const pathInState = getChildStateInKey(children, state);
|
|
26
|
+
if (pathInState) {
|
|
27
|
+
childrenAs = "state";
|
|
28
|
+
children = getChildStateInKey(children, state) || { value: children };
|
|
29
|
+
} else {
|
|
30
|
+
children = { text: children };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (isObject(children)) {
|
|
35
|
+
if (children.$$typeof) {
|
|
36
|
+
return element.call("renderReact", children, element);
|
|
37
|
+
}
|
|
38
|
+
children = Object.keys(children).map((v) => {
|
|
39
|
+
const val = children[v];
|
|
40
|
+
if (matchesComponentNaming(v)) return concatAddExtends(v, val);
|
|
41
|
+
return val;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!children || isNot(children)("array", "object")) return;
|
|
46
|
+
if (isArray(children) && children.find((v) => v == null ? void 0 : v.$$typeof)) {
|
|
47
|
+
const filterReact = children.filter((v) => !(v == null ? void 0 : v.$$typeof));
|
|
48
|
+
if (filterReact.length !== children.length) {
|
|
49
|
+
const extractedReactComponents = children.filter((v) => v == null ? void 0 : v.$$typeof);
|
|
50
|
+
element.call("renderReact", extractedReactComponents, element);
|
|
51
|
+
}
|
|
52
|
+
children = filterReact;
|
|
53
|
+
}
|
|
54
|
+
if (ref.__childrenCache) {
|
|
55
|
+
const equals = JSON.stringify(children) === JSON.stringify(ref.__childrenCache);
|
|
56
|
+
if (equals) {
|
|
57
|
+
ref.__noChildrenDifference = true;
|
|
58
|
+
} else {
|
|
59
|
+
ref.__childrenCache = deepClone(children);
|
|
60
|
+
delete ref.__noChildrenDifference;
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
ref.__childrenCache = deepClone(children);
|
|
64
|
+
}
|
|
65
|
+
if (isObject(children) || isArray(children)) {
|
|
66
|
+
children = deepClone(children);
|
|
67
|
+
}
|
|
68
|
+
const content = { tag: "fragment" };
|
|
69
|
+
for (const key in children) {
|
|
70
|
+
const value = Object.hasOwnProperty.call(children, key) && children[key];
|
|
71
|
+
if (isDefined(value) && value !== null && value !== false) {
|
|
72
|
+
content[key] = isObjectLike(value) ? childrenAs ? { [childrenAs]: value } : value : childrenAs ? { [childrenAs]: childrenAs === "state" ? { value } : { text: value } } : { text: value };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return content;
|
|
76
|
+
}
|
|
77
|
+
var children_default = setChildren;
|
|
78
|
+
export {
|
|
79
|
+
children_default as default,
|
|
80
|
+
setChildren
|
|
81
|
+
};
|
package/dist/esm/create.js
CHANGED
|
@@ -1,153 +1,95 @@
|
|
|
1
1
|
import { createNode } from "./node.js";
|
|
2
2
|
import { ROOT } from "./tree.js";
|
|
3
3
|
import {
|
|
4
|
-
HTML_TAGS,
|
|
5
4
|
isObject,
|
|
6
|
-
isFunction,
|
|
7
|
-
isString,
|
|
8
5
|
exec,
|
|
9
|
-
is,
|
|
10
|
-
isNode,
|
|
11
6
|
isUndefined,
|
|
12
|
-
generateKey,
|
|
13
|
-
checkIfKeyIsComponent,
|
|
14
|
-
deepClone,
|
|
15
|
-
applyComponentFromContext,
|
|
16
|
-
applyKeyComponentAsExtend,
|
|
17
|
-
isVariant,
|
|
18
7
|
detectInfiniteLoop,
|
|
19
|
-
|
|
8
|
+
propertizeElement,
|
|
9
|
+
createElement,
|
|
10
|
+
applyExtends,
|
|
11
|
+
createScope,
|
|
12
|
+
isMethod,
|
|
13
|
+
OPTIONS,
|
|
14
|
+
initProps,
|
|
15
|
+
createIfConditionFlag,
|
|
16
|
+
deepClone
|
|
20
17
|
} from "@domql/utils";
|
|
21
18
|
import { applyAnimationFrame, triggerEventOn } from "@domql/event";
|
|
22
19
|
import { assignNode } from "@domql/render";
|
|
23
20
|
import { createState } from "@domql/state";
|
|
24
|
-
import {
|
|
25
|
-
import { createProps } from "./props/index.js";
|
|
26
|
-
import { applyExtend } from "./extend.js";
|
|
27
|
-
import { REGISTRY, registry } from "./mixins/index.js";
|
|
21
|
+
import { REGISTRY } from "./mixins/index.js";
|
|
28
22
|
import { addMethods } from "./methods/set.js";
|
|
29
23
|
import { assignKeyAsClassname } from "./mixins/classList.js";
|
|
30
24
|
import { throughInitialExec, throughInitialDefine } from "./iterate.js";
|
|
31
|
-
import { OPTIONS } from "./cache/options.js";
|
|
32
|
-
import {
|
|
33
|
-
applyVariant,
|
|
34
|
-
createValidDomqlObjectFromSugar
|
|
35
|
-
} from "./utils/component.js";
|
|
36
25
|
const ENV = "development";
|
|
37
|
-
const create = async (
|
|
38
|
-
cacheOptions(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
element.key = key;
|
|
26
|
+
const create = async (props, parentEl, passedKey, options = OPTIONS.create || {}, attachOptions) => {
|
|
27
|
+
cacheOptions(options);
|
|
28
|
+
const element = createElement(props, parentEl, passedKey, options, ROOT);
|
|
29
|
+
if (!element) return;
|
|
30
|
+
const { key, parent, __ref: ref } = element;
|
|
31
|
+
if (element.key === "BannerHgroup") {
|
|
32
|
+
console.warn(deepClone(element));
|
|
33
|
+
}
|
|
34
|
+
applyExtends(element, parent, options);
|
|
35
|
+
if (element.key === "BannerHgroup") {
|
|
36
|
+
console.warn(deepClone(element));
|
|
37
|
+
}
|
|
38
|
+
propertizeElement(element, parent);
|
|
39
|
+
await triggerEventOn("start", element, options);
|
|
53
40
|
if (options.onlyResolveExtends) {
|
|
54
41
|
return onlyResolveExtends(element, parent, key, options);
|
|
55
42
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
43
|
+
if (element.key === "BannerHgroup") {
|
|
44
|
+
console.warn(element);
|
|
45
|
+
}
|
|
46
|
+
resetOptions(element, parent, options);
|
|
59
47
|
addMethods(element, parent, options);
|
|
60
48
|
createScope(element, parent);
|
|
61
49
|
await createState(element, parent);
|
|
62
50
|
if (element.scope === "state") element.scope = element.state;
|
|
63
51
|
createIfConditionFlag(element, parent);
|
|
64
|
-
|
|
65
|
-
if (element.scope === "props" || element.scope === true)
|
|
52
|
+
initProps(element, parent, options);
|
|
53
|
+
if (element.scope === "props" || element.scope === true) {
|
|
54
|
+
element.scope = element.props;
|
|
55
|
+
}
|
|
66
56
|
createIfConditionFlag(element, parent);
|
|
67
|
-
if (element.node
|
|
68
|
-
return assignNode(element, parent, key, attachOptions);
|
|
57
|
+
if (element.node) {
|
|
58
|
+
if (ref.__if) return assignNode(element, parent, key, attachOptions);
|
|
69
59
|
}
|
|
70
|
-
applyVariant(element, parent);
|
|
71
60
|
const onInit = await triggerEventOn("init", element, options);
|
|
72
61
|
if (onInit === false) return element;
|
|
73
62
|
triggerEventOn("beforeClassAssign", element, options);
|
|
74
63
|
assignKeyAsClassname(element);
|
|
75
|
-
addChildrenIfNotInOriginal(element, parent, key);
|
|
76
64
|
await renderElement(element, parent, options, attachOptions);
|
|
77
65
|
addElementIntoParentChildren(element, parent);
|
|
78
66
|
await triggerEventOn("complete", element, options);
|
|
79
67
|
return element;
|
|
80
68
|
};
|
|
81
|
-
const
|
|
82
|
-
if (element === void 0) {
|
|
83
|
-
if (ENV === "test" || ENV === "development") {
|
|
84
|
-
console.warn(key, "element is undefined in", parent && parent.__ref && parent.__ref.path);
|
|
85
|
-
}
|
|
86
|
-
return {};
|
|
87
|
-
}
|
|
88
|
-
if (isString(key) && key.slice(0, false)) {
|
|
89
|
-
if (ENV === "test" || ENV === "development") {
|
|
90
|
-
console.warn(key, "seems like to be in __ref");
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (element === null) return;
|
|
94
|
-
if (element === true) return { text: true };
|
|
95
|
-
if (element.__hash) {
|
|
96
|
-
return { extend: element };
|
|
97
|
-
}
|
|
98
|
-
return element;
|
|
99
|
-
};
|
|
100
|
-
const redefineElement = (element, parent, key, options) => {
|
|
101
|
-
const elementWrapper = createBasedOnType(element, parent, key, options);
|
|
102
|
-
if (options.syntaxv3 || element.props && element.props.syntaxv3 || parent && parent.props && parent.props.syntaxv3) {
|
|
103
|
-
if (element.props) element.props.syntaxv3 = true;
|
|
104
|
-
else element.syntaxv3 = true;
|
|
105
|
-
return createValidDomqlObjectFromSugar(element, parent, key, options);
|
|
106
|
-
} else if (checkIfKeyIsComponent(key)) {
|
|
107
|
-
return applyKeyComponentAsExtend(elementWrapper, parent, key);
|
|
108
|
-
}
|
|
109
|
-
if (checkIfMedia(key)) {
|
|
110
|
-
return applyMediaProps(elementWrapper, parent, key);
|
|
111
|
-
}
|
|
112
|
-
return elementWrapper;
|
|
113
|
-
};
|
|
114
|
-
const redefineParent = (element, parent, key, options) => {
|
|
115
|
-
if (!parent) return ROOT;
|
|
116
|
-
if (isNode(parent)) {
|
|
117
|
-
const parentNodeWrapper = { key: ":root", node: parent };
|
|
118
|
-
ROOT[`${key}_parent`] = parentNodeWrapper;
|
|
119
|
-
return parentNodeWrapper;
|
|
120
|
-
}
|
|
121
|
-
return parent;
|
|
122
|
-
};
|
|
123
|
-
const cacheOptions = (element, options) => {
|
|
69
|
+
const cacheOptions = (options) => {
|
|
124
70
|
if (options && !OPTIONS.create) {
|
|
125
71
|
OPTIONS.create = options;
|
|
126
|
-
OPTIONS.create.context =
|
|
72
|
+
OPTIONS.create.context = options.context;
|
|
127
73
|
}
|
|
128
74
|
};
|
|
129
|
-
const
|
|
130
|
-
return (exec(key, element) || key || element.key || generateKey()).toString();
|
|
131
|
-
};
|
|
132
|
-
const addRef = (element, parent) => {
|
|
133
|
-
if (element.__ref) element.__ref.origin = element;
|
|
134
|
-
else element.__ref = { origin: element };
|
|
135
|
-
return element.__ref;
|
|
136
|
-
};
|
|
137
|
-
const switchDefaultOptions = (element, parent, options) => {
|
|
75
|
+
const resetOptions = (element, parent, options) => {
|
|
138
76
|
if (Object.keys(options).length) {
|
|
139
|
-
|
|
140
|
-
if (options.
|
|
77
|
+
OPTIONS.defaultOptions = options;
|
|
78
|
+
if (options.ignoreChildExtends) delete options.ignoreChildExtends;
|
|
141
79
|
}
|
|
142
80
|
};
|
|
143
81
|
const addElementIntoParentChildren = (element, parent) => {
|
|
144
|
-
if (parent.__ref && parent.__ref.__children)
|
|
82
|
+
if (parent.__ref && parent.__ref.__children) {
|
|
83
|
+
parent.__ref.__children.push(element.key);
|
|
84
|
+
}
|
|
145
85
|
};
|
|
146
86
|
const visitedElements = /* @__PURE__ */ new WeakMap();
|
|
147
87
|
const renderElement = async (element, parent, options, attachOptions) => {
|
|
148
88
|
var _a, _b, _c, _d;
|
|
149
89
|
if (visitedElements.has(element)) {
|
|
150
|
-
if (ENV === "test" || ENV === "development")
|
|
90
|
+
if (ENV === "test" || ENV === "development") {
|
|
91
|
+
console.warn("Cyclic rendering detected:", element.__ref.path);
|
|
92
|
+
}
|
|
151
93
|
}
|
|
152
94
|
visitedElements.set(element, true);
|
|
153
95
|
const { __ref: ref, key } = element;
|
|
@@ -164,14 +106,31 @@ const renderElement = async (element, parent, options, attachOptions) => {
|
|
|
164
106
|
await createNestedChild();
|
|
165
107
|
} catch (e) {
|
|
166
108
|
const path = ref.path;
|
|
167
|
-
if (path.includes("ComponentsGrid"))
|
|
168
|
-
|
|
109
|
+
if (path.includes("ComponentsGrid")) {
|
|
110
|
+
path.splice(0, path.indexOf("ComponentsGrid") + 2);
|
|
111
|
+
}
|
|
112
|
+
if (path.includes("demoComponent")) {
|
|
113
|
+
path.splice(0, path.indexOf("demoComponent") + 1);
|
|
114
|
+
}
|
|
169
115
|
const isDemoComponent = (_b = (_a = element.lookup((el) => el.state.key)) == null ? void 0 : _a.state) == null ? void 0 : _b.key;
|
|
170
|
-
element.warn(
|
|
116
|
+
element.warn(
|
|
117
|
+
"Error happened in:",
|
|
118
|
+
isDemoComponent ? isDemoComponent + " " : "" + path.join(".")
|
|
119
|
+
);
|
|
171
120
|
element.verbose();
|
|
172
121
|
element.error(e, options);
|
|
173
|
-
if ((_c = element.on) == null ? void 0 : _c.error)
|
|
174
|
-
|
|
122
|
+
if ((_c = element.on) == null ? void 0 : _c.error) {
|
|
123
|
+
element.on.error(e, element, element.state, element.context, options);
|
|
124
|
+
}
|
|
125
|
+
if ((_d = element.props) == null ? void 0 : _d.onError) {
|
|
126
|
+
element.props.onError(
|
|
127
|
+
e,
|
|
128
|
+
element,
|
|
129
|
+
element.state,
|
|
130
|
+
element.context,
|
|
131
|
+
options
|
|
132
|
+
);
|
|
133
|
+
}
|
|
175
134
|
}
|
|
176
135
|
}
|
|
177
136
|
if (!ref.__if) {
|
|
@@ -185,75 +144,29 @@ const renderElement = async (element, parent, options, attachOptions) => {
|
|
|
185
144
|
await triggerEventOn("done", element, options);
|
|
186
145
|
await triggerEventOn("create", element, options);
|
|
187
146
|
};
|
|
188
|
-
const checkIfPrimitive = (element) => is(element)("string", "number");
|
|
189
|
-
const applyValueAsText = (element, parent, key) => {
|
|
190
|
-
const extendTag = element.extend && element.extend.tag;
|
|
191
|
-
const childExtendTag = parent.childExtend && parent.childExtend.tag;
|
|
192
|
-
const childPropsTag = parent.props.childProps && parent.props.childProps.tag;
|
|
193
|
-
const isKeyValidHTMLTag = HTML_TAGS.body.indexOf(key) > -1 && key;
|
|
194
|
-
return {
|
|
195
|
-
text: element,
|
|
196
|
-
tag: extendTag || childExtendTag || childPropsTag || isKeyValidHTMLTag || "string"
|
|
197
|
-
};
|
|
198
|
-
};
|
|
199
|
-
const applyContext = (element, parent, options) => {
|
|
200
|
-
const forcedOptionsContext = options.context && !ROOT.context && !element.context;
|
|
201
|
-
if (forcedOptionsContext) ROOT.context = options.context;
|
|
202
|
-
if (!element.context) element.context = parent.context || options.context || ROOT.context;
|
|
203
|
-
};
|
|
204
|
-
const createScope = (element, parent) => {
|
|
205
|
-
const { __ref: ref } = element;
|
|
206
|
-
if (!element.scope) element.scope = parent.scope || ref.root.scope || {};
|
|
207
|
-
};
|
|
208
|
-
const createIfConditionFlag = (element, parent) => {
|
|
209
|
-
const { __ref: ref } = element;
|
|
210
|
-
if (isFunction(element.if) && !element.if(element, element.state, element.context)) {
|
|
211
|
-
delete ref.__if;
|
|
212
|
-
} else ref.__if = true;
|
|
213
|
-
};
|
|
214
|
-
const addCaching = (element, parent) => {
|
|
215
|
-
const { __ref: ref, key } = element;
|
|
216
|
-
let { __ref: parentRef } = parent;
|
|
217
|
-
if (!element.transform) element.transform = {};
|
|
218
|
-
if (!ref.__cached) ref.__cached = {};
|
|
219
|
-
if (!ref.__defineCache) ref.__defineCache = {};
|
|
220
|
-
if (!ref.__exec) ref.__exec = {};
|
|
221
|
-
if (!ref.__execProps) ref.__execProps = {};
|
|
222
|
-
if (!ref.__class) ref.__class = {};
|
|
223
|
-
if (!ref.__classNames) ref.__classNames = {};
|
|
224
|
-
if (!ref.__attr) ref.__attr = {};
|
|
225
|
-
if (!ref.__changes) ref.__changes = [];
|
|
226
|
-
if (!ref.__children) ref.__children = [];
|
|
227
|
-
if (checkIfKeyIsComponent(key)) ref.__componentKey = key.split("_")[0].split(".")[0].split("+")[0];
|
|
228
|
-
const hasRoot = parent && parent.key === ":root";
|
|
229
|
-
if (!ref.root) ref.root = hasRoot ? element : parentRef.root;
|
|
230
|
-
if (!parentRef) parentRef = parent.ref = {};
|
|
231
|
-
if (!parentRef.path) parentRef.path = [];
|
|
232
|
-
ref.path = parentRef.path.concat(element.key);
|
|
233
|
-
};
|
|
234
147
|
const onlyResolveExtends = (element, parent, key, options) => {
|
|
235
148
|
const { __ref: ref } = element;
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
if (element.scope === "props" || element.scope === true) element.scope = element.props;
|
|
245
|
-
if (element.node && ref.__if) {
|
|
246
|
-
parent[key || element.key] = element;
|
|
247
|
-
}
|
|
248
|
-
if (!element.props) element.props = {};
|
|
249
|
-
applyVariant(element, parent);
|
|
250
|
-
addElementIntoParentChildren(element, parent);
|
|
149
|
+
addMethods(element, parent, options);
|
|
150
|
+
createScope(element, parent);
|
|
151
|
+
createState(element, parent);
|
|
152
|
+
if (element.scope === "state") element.scope = element.state;
|
|
153
|
+
createIfConditionFlag(element, parent);
|
|
154
|
+
initProps(element, parent, options);
|
|
155
|
+
if (element.scope === "props" || element.scope === true) {
|
|
156
|
+
element.scope = element.props;
|
|
251
157
|
}
|
|
158
|
+
if (element.node && ref.__if) {
|
|
159
|
+
parent[key || element.key] = element;
|
|
160
|
+
}
|
|
161
|
+
if (!element.props) element.props = {};
|
|
162
|
+
addElementIntoParentChildren(element, parent);
|
|
252
163
|
if (element.tag !== "string" && element.tag !== "fragment") {
|
|
253
164
|
throughInitialDefine(element);
|
|
254
165
|
throughInitialExec(element);
|
|
255
166
|
for (const k in element) {
|
|
256
|
-
if (isUndefined(element[k]) || isMethod(k, element) || isObject(
|
|
167
|
+
if (isUndefined(element[k]) || isMethod(k, element) || isObject(REGISTRY[k])) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
257
170
|
const hasDefine = element.define && element.define[k];
|
|
258
171
|
const contextHasDefine = element.context && element.context.define && element.context.define[k];
|
|
259
172
|
const optionsHasDefine = options.define && options.define[k];
|
|
@@ -273,24 +186,6 @@ const onlyResolveExtends = (element, parent, key, options) => {
|
|
|
273
186
|
}
|
|
274
187
|
return element;
|
|
275
188
|
};
|
|
276
|
-
const checkIfMedia = (key) => key.slice(0, 1) === "@";
|
|
277
|
-
const applyMediaProps = (element, parent, key) => {
|
|
278
|
-
const { props } = element;
|
|
279
|
-
if (props) {
|
|
280
|
-
props.display = "none";
|
|
281
|
-
if (props[key]) props[key].display = props.display;
|
|
282
|
-
else props[key] = { display: props.display || "block" };
|
|
283
|
-
return element;
|
|
284
|
-
} else {
|
|
285
|
-
return {
|
|
286
|
-
...element,
|
|
287
|
-
props: {
|
|
288
|
-
display: "none",
|
|
289
|
-
[key]: { display: "block" }
|
|
290
|
-
}
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
};
|
|
294
189
|
var create_default = create;
|
|
295
190
|
export {
|
|
296
191
|
create,
|