@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.
Files changed (135) hide show
  1. package/README.md +4 -6
  2. package/children.js +45 -18
  3. package/create.js +58 -46
  4. package/define.js +1 -1
  5. package/dist/cjs/children.js +43 -13
  6. package/dist/cjs/create.js +57 -27
  7. package/dist/cjs/define.js +1 -1
  8. package/dist/cjs/event/animationFrame.js +96 -0
  9. package/dist/cjs/event/can.js +28 -0
  10. package/dist/cjs/event/index.js +20 -0
  11. package/dist/cjs/event/on.js +84 -0
  12. package/dist/cjs/event/store.js +27 -0
  13. package/dist/cjs/extend.js +88 -0
  14. package/dist/cjs/index.js +9 -6
  15. package/dist/cjs/iterate.js +89 -33
  16. package/dist/cjs/methods/set.js +5 -0
  17. package/dist/cjs/methods/v2.js +1 -1
  18. package/dist/cjs/mixins/attr.js +3 -2
  19. package/dist/cjs/mixins/classList.js +11 -1
  20. package/dist/cjs/mixins/content.js +72 -0
  21. package/dist/cjs/mixins/html.js +1 -2
  22. package/dist/cjs/mixins/registry.js +2 -2
  23. package/dist/cjs/mixins/scope.js +1 -1
  24. package/dist/cjs/mixins/state.js +4 -4
  25. package/dist/cjs/mixins/style.js +11 -2
  26. package/dist/cjs/mixins/text.js +9 -5
  27. package/dist/cjs/node.js +22 -19
  28. package/dist/cjs/render/append.js +72 -0
  29. package/dist/cjs/render/cache.js +80 -0
  30. package/dist/cjs/render/create.js +25 -0
  31. package/dist/cjs/render/index.js +20 -0
  32. package/dist/cjs/set.js +33 -40
  33. package/dist/cjs/update.js +100 -69
  34. package/dist/cjs/utils/applyParam.js +7 -7
  35. package/dist/cjs/utils/extendUtils.js +132 -0
  36. package/dist/cjs/utils/index.js +2 -0
  37. package/dist/cjs/utils/propEvents.js +56 -0
  38. package/dist/esm/children.js +44 -14
  39. package/dist/esm/create.js +58 -27
  40. package/dist/esm/define.js +1 -1
  41. package/dist/esm/event/animationFrame.js +76 -0
  42. package/dist/esm/event/can.js +8 -0
  43. package/dist/esm/event/index.js +3 -0
  44. package/dist/esm/event/on.js +64 -0
  45. package/dist/esm/event/store.js +7 -0
  46. package/dist/esm/extend.js +74 -0
  47. package/dist/esm/index.js +8 -6
  48. package/dist/esm/iterate.js +90 -35
  49. package/dist/esm/methods/set.js +10 -0
  50. package/dist/esm/methods/v2.js +1 -1
  51. package/dist/esm/mixins/attr.js +4 -3
  52. package/dist/esm/mixins/classList.js +11 -1
  53. package/dist/esm/mixins/content.js +52 -0
  54. package/dist/esm/mixins/html.js +1 -2
  55. package/dist/esm/mixins/registry.js +1 -1
  56. package/dist/esm/mixins/scope.js +1 -1
  57. package/dist/esm/mixins/state.js +5 -5
  58. package/dist/esm/mixins/style.js +12 -3
  59. package/dist/esm/mixins/text.js +10 -6
  60. package/dist/esm/node.js +22 -19
  61. package/dist/esm/render/append.js +52 -0
  62. package/dist/esm/render/cache.js +60 -0
  63. package/dist/esm/render/create.js +5 -0
  64. package/dist/esm/render/index.js +3 -0
  65. package/dist/esm/set.js +34 -41
  66. package/dist/esm/update.js +100 -71
  67. package/dist/esm/utils/applyParam.js +8 -8
  68. package/dist/esm/utils/extendUtils.js +119 -0
  69. package/dist/esm/utils/index.js +1 -0
  70. package/dist/esm/utils/propEvents.js +36 -0
  71. package/dist/iife/index.js +4718 -0
  72. package/extend.js +95 -0
  73. package/index.js +9 -6
  74. package/iterate.js +100 -38
  75. package/node.js +25 -23
  76. package/package.json +44 -20
  77. package/set.js +28 -32
  78. package/update.js +111 -82
  79. package/__tests__/checkIfOnUpdate.test.js +0 -103
  80. package/__tests__/children.test.js +0 -213
  81. package/__tests__/define.test.js +0 -75
  82. package/__tests__/inheritStateUpdates.test.js +0 -79
  83. package/__tests__/renderElement.test.js +0 -131
  84. package/__tests__/resetElement.test.js +0 -44
  85. package/__tests__/set.test.js +0 -316
  86. package/__tests__/throughExecProps.test.js +0 -86
  87. package/__tests__/throughInitialDefine.test.js +0 -104
  88. package/__tests__/throughInitialExec.test.js +0 -92
  89. package/__tests__/throughUpdatedDefine.test.js +0 -92
  90. package/__tests__/throughUpdatedExec.test.js +0 -110
  91. package/__tests__/tree.test.js +0 -15
  92. package/__tests__/update.test.js +0 -256
  93. package/dist/cjs/__tests__/checkIfOnUpdate.test.js +0 -73
  94. package/dist/cjs/__tests__/children.test.js +0 -177
  95. package/dist/cjs/__tests__/define.test.js +0 -75
  96. package/dist/cjs/__tests__/inheritStateUpdates.test.js +0 -62
  97. package/dist/cjs/__tests__/renderElement.test.js +0 -138
  98. package/dist/cjs/__tests__/resetElement.test.js +0 -35
  99. package/dist/cjs/__tests__/set.test.js +0 -256
  100. package/dist/cjs/__tests__/throughExecProps.test.js +0 -62
  101. package/dist/cjs/__tests__/throughInitialDefine.test.js +0 -79
  102. package/dist/cjs/__tests__/throughInitialExec.test.js +0 -73
  103. package/dist/cjs/__tests__/throughUpdatedDefine.test.js +0 -69
  104. package/dist/cjs/__tests__/throughUpdatedExec.test.js +0 -84
  105. package/dist/cjs/__tests__/tree.test.js +0 -11
  106. package/dist/cjs/__tests__/update.test.js +0 -222
  107. package/dist/cjs/package.json +0 -4
  108. package/dist/esm/__tests__/checkIfOnUpdate.test.js +0 -73
  109. package/dist/esm/__tests__/children.test.js +0 -177
  110. package/dist/esm/__tests__/define.test.js +0 -53
  111. package/dist/esm/__tests__/inheritStateUpdates.test.js +0 -62
  112. package/dist/esm/__tests__/renderElement.test.js +0 -116
  113. package/dist/esm/__tests__/resetElement.test.js +0 -35
  114. package/dist/esm/__tests__/set.test.js +0 -256
  115. package/dist/esm/__tests__/throughExecProps.test.js +0 -62
  116. package/dist/esm/__tests__/throughInitialDefine.test.js +0 -79
  117. package/dist/esm/__tests__/throughInitialExec.test.js +0 -73
  118. package/dist/esm/__tests__/throughUpdatedDefine.test.js +0 -69
  119. package/dist/esm/__tests__/throughUpdatedExec.test.js +0 -84
  120. package/dist/esm/__tests__/tree.test.js +0 -11
  121. package/dist/esm/__tests__/update.test.js +0 -222
  122. package/methods/set.js +0 -63
  123. package/methods/v2.js +0 -83
  124. package/mixins/attr.js +0 -32
  125. package/mixins/classList.js +0 -54
  126. package/mixins/data.js +0 -26
  127. package/mixins/html.js +0 -21
  128. package/mixins/index.js +0 -23
  129. package/mixins/registry.js +0 -46
  130. package/mixins/scope.js +0 -23
  131. package/mixins/state.js +0 -19
  132. package/mixins/style.js +0 -16
  133. package/mixins/text.js +0 -26
  134. package/utils/applyParam.js +0 -34
  135. package/utils/index.js +0 -3
@@ -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 "@domql/event";
19
- import { assignNode } from "@domql/render";
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
- const ENV = "development";
26
- const create = async (props, parentEl, passedKey, options = OPTIONS.create || {}, attachOptions) => {
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
- await createState(element, parent);
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 = await triggerEventOn("init", element, options);
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
- await renderElement(element, parent, options, attachOptions);
81
+ renderElement(element, parent, options, attachOptions);
57
82
  addElementIntoParentChildren(element, parent);
58
- await triggerEventOn("complete", element, options);
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
- if (Object.keys(options).length) {
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 = async (element, parent, options, attachOptions) => {
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 = async () => {
118
+ const createNestedChild = () => {
89
119
  const isInfiniteLoopDetected = detectInfiniteLoop(ref.path);
90
120
  if (ref.__uniqId || isInfiniteLoopDetected) return;
91
- await createNode(element, options);
92
- ref.__uniqId = Math.random();
121
+ createNode(element, options);
122
+ ref.__uniqId = _uniqIdCounter++;
93
123
  };
94
124
  if (ENV === "test" || ENV === "development") {
95
- await createNestedChild();
125
+ createNestedChild();
96
126
  } else {
97
127
  try {
98
- await createNestedChild();
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 = (_b = (_a = element.lookup((el) => el.state.key)) == null ? void 0 : _a.state) == null ? void 0 : _b.key;
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 ((_c = element.on) == null ? void 0 : _c.error) {
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
- await triggerEventOn("render", element, options);
126
- await triggerEventOn("renderRouter", element, options);
127
- await triggerEventOn("done", element, options);
128
- await triggerEventOn("create", element, options);
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 && element.define[k];
154
- const contextHasDefine = element.context && element.context.define && element.context.define[k];
155
- const optionsHasDefine = options.define && options.define[k];
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) {
@@ -1,5 +1,5 @@
1
1
  import { report } from "@domql/report";
2
- import { REGISTRY } from "./mixins";
2
+ import { REGISTRY } from "./mixins/index.js";
3
3
  var define_default = (params, options = {}) => {
4
4
  const { overwrite } = options;
5
5
  for (const param in params) {
@@ -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,8 @@
1
+ import { report } from "@domql/report";
2
+ import { isValidHtmlTag } from "@domql/utils";
3
+ const canRenderTag = (tag) => {
4
+ return isValidHtmlTag(tag || "div") || report("HTMLInvalidTag");
5
+ };
6
+ export {
7
+ canRenderTag
8
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./on.js";
2
+ export * from "./can.js";
3
+ export * from "./animationFrame.js";
@@ -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,7 @@
1
+ var store_default = {
2
+ click: [],
3
+ render: []
4
+ };
5
+ export {
6
+ store_default as default
7
+ };
@@ -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,
@@ -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
- execPromise
10
+ exec
12
11
  } from "@domql/utils";
13
- const throughInitialExec = async (element, exclude = {}) => {
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
- element[param] = await prop(element, element.state, element.context);
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 && prop.node && execReturnsString) {
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 = async (element) => {
63
+ const throughExecProps = (element) => {
52
64
  const { __ref: ref } = element;
53
65
  const { props } = element;
54
66
  for (const k in props) {
55
- const isDefine = k.startsWith("is") || k.startsWith("has") || k.startsWith("use");
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
- props[k] = await execPromise(cachedExecProp, element);
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
- props[k] = await execPromise(props[k], element);
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 isPropertyInDefines = (key, element) => {
66
- };
67
- const throughInitialDefine = async (element) => {
95
+ const throughInitialDefine = (element) => {
68
96
  const { define, context, __ref: ref } = element;
69
- let defineObj = {};
97
+ const hasLocalDefine = isObject(define);
70
98
  const hasGlobalDefine = context && isObject(context.define);
71
- if (isObject(define)) defineObj = { ...define };
72
- if (hasGlobalDefine) defineObj = { ...defineObj, ...context.define };
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
- const execParam2 = elementProp = await execPromise(elementProp, element);
78
- if (execParam2) {
79
- elementProp = element[param] = execParam2.parse ? execParam2.parse() : execParam2;
80
- ref.__defineCache[param] = elementProp;
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 = await defineObj[param](
120
+ const execParam = defineObj[param](
84
121
  elementProp,
85
122
  element,
86
123
  element.state,
87
124
  element.context
88
125
  );
89
- if (execParam) element[param] = 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 = async (element) => {
136
+ const throughUpdatedDefine = (element) => {
94
137
  const { context, define, __ref: ref } = element;
95
- const changes = {};
96
- let obj = {};
97
- if (isObject(define)) obj = { ...define };
98
- if (isObject(context && context.define)) obj = { ...obj, ...context.define };
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
- ref.__defineCache[param] = await execParam(
103
- element,
104
- element.state,
105
- element.context
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) element[param] = 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,
@@ -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,