@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
@@ -9,16 +9,14 @@ import {
9
9
  isUndefined,
10
10
  merge,
11
11
  overwriteDeep,
12
- deepClone,
13
12
  isMethod,
14
13
  findInheritedState,
15
- deepMerge,
16
14
  OPTIONS,
17
15
  updateProps,
18
16
  captureSnapshot,
19
17
  propertizeUpdate
20
18
  } from "@domql/utils";
21
- import { applyEvent, triggerEventOn, triggerEventOnUpdate } from "@domql/event";
19
+ import { applyEvent, triggerEventOn, triggerEventOnUpdate } from "./event/index.js";
22
20
  import { createState } from "@domql/state";
23
21
  import { create } from "./create.js";
24
22
  import {
@@ -39,13 +37,8 @@ const UPDATE_DEFAULT_OPTIONS = {
39
37
  calleeElement: false,
40
38
  exclude: METHODS_EXL
41
39
  };
42
- const update = async function(params = {}, opts) {
43
- const calleeElementCache = opts == null ? void 0 : opts.calleeElement;
44
- const options = deepClone(
45
- isObject(opts) ? deepMerge(opts, UPDATE_DEFAULT_OPTIONS) : UPDATE_DEFAULT_OPTIONS,
46
- { exclude: ["calleeElement"] }
47
- );
48
- options.calleeElement = calleeElementCache;
40
+ const update = function(params = {}, opts) {
41
+ const options = isObject(opts) ? { ...UPDATE_DEFAULT_OPTIONS, ...opts } : { ...UPDATE_DEFAULT_OPTIONS };
49
42
  const element = this;
50
43
  let ref = element.__ref;
51
44
  if (!ref) ref = element.__ref = {};
@@ -55,7 +48,7 @@ const update = async function(params = {}, opts) {
55
48
  );
56
49
  if (snapshotHasUpdated) return;
57
50
  if (!options.preventListeners) {
58
- await triggerEventOnUpdate("startUpdate", params, element, options);
51
+ triggerEventOnUpdate("startUpdate", params, element, options);
59
52
  }
60
53
  const { parent, node, key } = element;
61
54
  const { exclude, preventInheritAtCurrentState } = options;
@@ -67,37 +60,38 @@ const update = async function(params = {}, opts) {
67
60
  params = { text: params };
68
61
  }
69
62
  params = propertizeUpdate.call(element, params);
70
- const inheritState = await inheritStateUpdates(element, options);
63
+ const inheritState = inheritStateUpdates(element, options);
71
64
  if (inheritState === false) return;
72
- const ifFails = await checkIfOnUpdate(element, parent, options);
65
+ const ifFails = checkIfOnUpdate(element, parent, options);
73
66
  if (ifFails) return;
74
67
  if (ref.__if && !options.preventPropsUpdate) {
75
68
  const hasParentProps = parent.props && (parent.props[key] || parent.props.childProps);
76
- const hasFunctionInProps = ref.__propsStack.filter((v) => isFunction(v));
77
- const props = params.props || hasParentProps || hasFunctionInProps.length;
69
+ const hasFunctionInProps = ref.__propsStack.some(isFunction);
70
+ const props = params.props || hasParentProps || hasFunctionInProps;
78
71
  if (props) updateProps(props, element, parent);
79
72
  }
80
73
  if (!options.preventBeforeUpdateListener && !options.preventListeners) {
81
- const simulate = { ...params, ...element };
82
- const beforeUpdateReturns = await triggerEventOnUpdate(
83
- "beforeUpdate",
84
- params,
85
- simulate,
86
- options
87
- );
88
- if (beforeUpdateReturns === false) return element;
74
+ const hasBeforeUpdate = element.on?.beforeUpdate || element.props?.onBeforeUpdate;
75
+ if (hasBeforeUpdate) {
76
+ const simulate = { ...params, ...element };
77
+ const beforeUpdateReturns = triggerEventOnUpdate(
78
+ "beforeUpdate",
79
+ params,
80
+ simulate,
81
+ options
82
+ );
83
+ if (beforeUpdateReturns === false) return element;
84
+ }
89
85
  }
90
86
  overwriteDeep(element, params);
91
87
  throughExecProps(element);
92
88
  throughUpdatedExec(element, { ignore: UPDATE_DEFAULT_OPTIONS });
93
89
  throughUpdatedDefine(element);
94
90
  if (!options.isForced && !options.preventListeners) {
95
- await triggerEventOn("beforeClassAssign", element, options);
91
+ triggerEventOn("beforeClassAssign", element, options);
96
92
  }
97
93
  if (!ref.__if) return false;
98
- if (!node) {
99
- return;
100
- }
94
+ if (!node) return;
101
95
  const {
102
96
  preventUpdate,
103
97
  preventDefineUpdate,
@@ -115,16 +109,20 @@ const update = async function(params = {}, opts) {
115
109
  options.preventUpdateAfterCount = 1;
116
110
  } else options.preventUpdateAfterCount++;
117
111
  }
112
+ const preventUpdateSet = isArray(preventUpdate) ? new Set(preventUpdate) : null;
113
+ const preventDefineUpdateSet = isArray(preventDefineUpdate) ? new Set(preventDefineUpdate) : null;
118
114
  for (const param in element) {
119
115
  const prop = element[param];
120
- if (!Object.hasOwnProperty.call(element, param)) continue;
121
- const isInPreventUpdate = isArray(preventUpdate) && preventUpdate.includes(param);
122
- const isInPreventDefineUpdate = isArray(preventDefineUpdate) && preventDefineUpdate.includes(param);
123
- if (isUndefined(prop) || isInPreventUpdate || isInPreventDefineUpdate || preventDefineUpdate === true || preventDefineUpdate === param || (preventStateUpdate && param) === "state" || isMethod(param, element) || isObject(REGISTRY[param])) {
116
+ if (!Object.prototype.hasOwnProperty.call(element, param)) continue;
117
+ const isInPreventUpdate = preventUpdateSet && preventUpdateSet.has(param);
118
+ const isInPreventDefineUpdate = preventDefineUpdateSet && preventDefineUpdateSet.has(param);
119
+ const isRootEventHandler = isFunction(prop) && param.length > 2 && param.charCodeAt(0) === 111 && param.charCodeAt(1) === 110 && // 'on'
120
+ param.charCodeAt(2) >= 65 && param.charCodeAt(2) <= 90;
121
+ if (isUndefined(prop) || isInPreventUpdate || isInPreventDefineUpdate || preventDefineUpdate === true || preventDefineUpdate === param || preventStateUpdate && param === "state" || isMethod(param, element) || isRootEventHandler || isObject(REGISTRY[param])) {
124
122
  continue;
125
123
  }
126
124
  if (preventStateUpdate === "once") options.preventStateUpdate = false;
127
- const isElement = await applyParam(param, element, options);
125
+ const isElement = applyParam(param, element, options);
128
126
  if (isElement) {
129
127
  const { hasDefine, hasContextDefine } = isElement;
130
128
  const canUpdate = isObject(prop) && !hasDefine && !hasContextDefine && !preventRecursive;
@@ -133,39 +131,79 @@ const update = async function(params = {}, opts) {
133
131
  if (options.onEachUpdate) {
134
132
  options.onEachUpdate(param, element, element.state, element.context);
135
133
  }
136
- const childUpdateCall = async () => await update.call(prop, params[prop], {
134
+ const childParams = params[param];
135
+ if (childParams === void 0 && !options.isForced) continue;
136
+ const childUpdateCall = () => update.call(prop, childParams, {
137
137
  ...options,
138
138
  currentSnapshot: snapshotOnCallee,
139
139
  calleeElement
140
140
  });
141
141
  if (lazyLoad) {
142
- window.requestAnimationFrame(async () => {
143
- await childUpdateCall();
144
- if (!options.preventUpdateListener) {
145
- await triggerEventOn("lazyLoad", element, options);
142
+ window.requestAnimationFrame(() => {
143
+ childUpdateCall();
144
+ if (!options.preventUpdateListener && !options.preventListeners) {
145
+ triggerEventOn("lazyLoad", element, options);
146
146
  }
147
147
  });
148
- } else await childUpdateCall();
148
+ } else childUpdateCall();
149
149
  }
150
150
  }
151
151
  if (!preventContentUpdate) {
152
- const children = params.children || element.children;
153
- const content = children ? await setChildren(children, element, opts) : element.children || params.content;
154
- if (content) {
155
- await setContent(content, element, options);
152
+ const contentKey = ref.contentElementKey || "content";
153
+ const existingContent = element[contentKey];
154
+ const childrenProp = params.children || element.children;
155
+ if (childrenProp) {
156
+ const content = setChildren(childrenProp, element, opts);
157
+ if (content && !ref.__noChildrenDifference) {
158
+ setContent(content, element, options);
159
+ } else if (existingContent?.__ref && isFunction(existingContent.update)) {
160
+ const lazyLoad = element.props?.lazyLoad || options.lazyLoad;
161
+ const contentUpdateCall = () => update.call(existingContent, params[contentKey], {
162
+ ...options,
163
+ currentSnapshot: snapshotOnCallee,
164
+ calleeElement
165
+ });
166
+ if (lazyLoad) {
167
+ window.requestAnimationFrame(() => {
168
+ contentUpdateCall();
169
+ if (!options.preventUpdateListener && !options.preventListeners) {
170
+ triggerEventOn("lazyLoad", element, options);
171
+ }
172
+ });
173
+ } else contentUpdateCall();
174
+ }
175
+ } else if (existingContent?.__ref && isFunction(existingContent.update)) {
176
+ const lazyLoad = element.props?.lazyLoad || options.lazyLoad;
177
+ const contentUpdateCall = () => update.call(existingContent, params[contentKey], {
178
+ ...options,
179
+ currentSnapshot: snapshotOnCallee,
180
+ calleeElement
181
+ });
182
+ if (lazyLoad) {
183
+ window.requestAnimationFrame(() => {
184
+ contentUpdateCall();
185
+ if (!options.preventUpdateListener && !options.preventListeners) {
186
+ triggerEventOn("lazyLoad", element, options);
187
+ }
188
+ });
189
+ } else contentUpdateCall();
190
+ } else {
191
+ const content = element.children || params.content;
192
+ if (content) {
193
+ setContent(content, element, options);
194
+ }
156
195
  }
157
196
  }
158
- if (!preventUpdateListener) {
159
- await triggerEventOn("update", element, options);
197
+ if (!preventUpdateListener && !options.preventListeners) {
198
+ triggerEventOn("update", element, options);
160
199
  }
161
200
  };
162
- const checkIfOnUpdate = async (element, parent, options) => {
163
- var _a, _b, _c;
164
- if (!isFunction(element.if) && !isFunction((_a = element.props) == null ? void 0 : _a.if) || !parent) {
201
+ const checkIfOnUpdate = (element, parent, options) => {
202
+ if (!isFunction(element.if) && !isFunction(element.props?.if) || !parent) {
165
203
  return;
166
204
  }
167
205
  const ref = element.__ref;
168
- const ifPassed = (element.if || ((_b = element.props) == null ? void 0 : _b.if))(
206
+ const ifPassed = (element.if || element.props?.if)(
169
207
  element,
170
208
  element.state,
171
209
  element.context,
@@ -193,22 +231,22 @@ const checkIfOnUpdate = async (element, parent, options) => {
193
231
  const contentKey = ref.contentElementKey;
194
232
  if (element.children) {
195
233
  element.removeContent();
196
- } else if ((_c = element[contentKey]) == null ? void 0 : _c.parseDeep) {
234
+ } else if (element[contentKey]?.parseDeep) {
197
235
  element[contentKey] = element[contentKey].parseDeep();
198
236
  }
199
237
  const previousElement = element.previousElement();
200
- const previousNode = previousElement == null ? void 0 : previousElement.node;
201
- const hasPrevious = previousNode == null ? void 0 : previousNode.parentNode;
238
+ const previousNode = previousElement?.node;
239
+ const hasPrevious = previousNode?.parentNode;
202
240
  const nextElement = element.nextElement();
203
- const nextNode = nextElement == null ? void 0 : nextElement.node;
204
- const hasNext = nextNode == null ? void 0 : nextNode.parentNode;
241
+ const nextNode = nextElement?.node;
242
+ const hasNext = nextNode?.parentNode;
205
243
  const attachOptions = (hasPrevious || hasNext) && {
206
244
  position: hasPrevious ? "after" : hasNext ? "before" : null,
207
245
  node: hasPrevious && previousNode || hasNext && nextNode
208
246
  };
209
247
  delete element.__ref;
210
248
  delete element.parent;
211
- const createdElement = await create(
249
+ const createdElement = create(
212
250
  element,
213
251
  parent,
214
252
  element.key,
@@ -216,11 +254,7 @@ const checkIfOnUpdate = async (element, parent, options) => {
216
254
  attachOptions
217
255
  );
218
256
  if (options.preventUpdate !== true && element.on && isFunction(element.on.update)) {
219
- await applyEvent(
220
- element.on.update,
221
- createdElement,
222
- createdElement.state
223
- );
257
+ applyEvent(element.on.update, createdElement, createdElement.state);
224
258
  }
225
259
  return createdElement;
226
260
  }
@@ -229,14 +263,14 @@ const checkIfOnUpdate = async (element, parent, options) => {
229
263
  delete ref.__if;
230
264
  }
231
265
  };
232
- const inheritStateUpdates = async (element, options) => {
266
+ const inheritStateUpdates = (element, options) => {
233
267
  const { __ref: ref } = element;
234
268
  const stateKey = ref.__state;
235
269
  const { parent, state } = element;
236
270
  const { preventUpdateTriggerStateUpdate, isHoisted, execStateFunction } = options;
237
271
  if (preventUpdateTriggerStateUpdate) return;
238
272
  if (!stateKey && !ref.__hasRootState) {
239
- element.state = parent && parent.state || {};
273
+ element.state = parent?.state || {};
240
274
  return;
241
275
  }
242
276
  const shouldForceFunctionState = isFunction(stateKey) && !isHoisted && execStateFunction;
@@ -253,7 +287,7 @@ const inheritStateUpdates = async (element, options) => {
253
287
  const keyInParentState = findInheritedState(element, element.parent);
254
288
  if (!keyInParentState || options.preventInheritedStateUpdate) return;
255
289
  if (!options.preventBeforeStateUpdateListener && !options.preventListeners) {
256
- const initStateReturns = await triggerEventOnUpdate(
290
+ const initStateReturns = triggerEventOnUpdate(
257
291
  "beforeStateUpdate",
258
292
  keyInParentState,
259
293
  element,
@@ -261,19 +295,14 @@ const inheritStateUpdates = async (element, options) => {
261
295
  );
262
296
  if (initStateReturns === false) return element;
263
297
  }
264
- const newState = await createStateUpdate(element, parent, options);
298
+ const newState = createStateUpdate(element, parent, options);
265
299
  if (!options.preventStateUpdateListener && !options.preventListeners) {
266
- await triggerEventOnUpdate(
267
- "stateUpdate",
268
- newState.parse(),
269
- element,
270
- options
271
- );
300
+ triggerEventOnUpdate("stateUpdate", newState.parse(), element, options);
272
301
  }
273
302
  };
274
- const createStateUpdate = async (element, parent, options) => {
303
+ const createStateUpdate = (element, parent, options) => {
275
304
  const __stateChildren = element.state.__children;
276
- const newState = await createState(element, parent);
305
+ const newState = createState(element, parent);
277
306
  element.state = newState;
278
307
  for (const child in __stateChildren) {
279
308
  if (newState[child]) newState.__children[child] = __stateChildren[child];
@@ -1,21 +1,21 @@
1
- import { isFunction } from "@domql/utils";
1
+ import { exec, isFunction } from "@domql/utils";
2
2
  import { REGISTRY } from "../mixins/index.js";
3
- const applyParam = async (param, element, options) => {
3
+ const applyParam = (param, element, options) => {
4
4
  const { node, context, __ref: ref } = element;
5
- const prop = element[param];
5
+ const prop = exec(element[param], element);
6
6
  const { onlyUpdate } = options;
7
7
  const DOMQLProperty = REGISTRY[param];
8
- const DOMQLPropertyFromContext = context && context.registry && context.registry[param];
8
+ const DOMQLPropertyFromContext = context?.registry?.[param];
9
9
  const isGlobalTransformer = DOMQLPropertyFromContext || DOMQLProperty;
10
- const hasDefine = element.define && element.define[param];
11
- const hasContextDefine = context && context.define && context.define[param];
10
+ const hasDefine = element.define?.[param];
11
+ const hasContextDefine = context?.define?.[param];
12
12
  if (!ref.__if) return;
13
13
  const hasOnlyUpdate = onlyUpdate ? onlyUpdate === param || element.lookup(onlyUpdate) : true;
14
14
  if (isGlobalTransformer && !hasContextDefine && hasOnlyUpdate) {
15
15
  if (isFunction(isGlobalTransformer)) {
16
- await isGlobalTransformer(prop, element, node, options);
17
- return;
16
+ isGlobalTransformer(prop, element, node, options);
18
17
  }
18
+ return;
19
19
  }
20
20
  return { hasDefine, hasContextDefine };
21
21
  };
@@ -0,0 +1,119 @@
1
+ import {
2
+ isArray,
3
+ isFunction,
4
+ isObject,
5
+ isString,
6
+ deepClone,
7
+ isNotProduction
8
+ } from "@domql/utils";
9
+ const generateHash = () => Math.random().toString(36).substring(2);
10
+ const extendStackRegistry = {};
11
+ const extendCachedRegistry = {};
12
+ const getHashedExtend = (extend) => {
13
+ return extendStackRegistry[extend.__hash];
14
+ };
15
+ const setHashedExtend = (extend, stack) => {
16
+ const hash = generateHash();
17
+ if (!isString(extend)) {
18
+ extend.__hash = hash;
19
+ }
20
+ extendStackRegistry[hash] = stack;
21
+ return stack;
22
+ };
23
+ const getExtendStackRegistry = (extend, stack) => {
24
+ if (extend.__hash) {
25
+ return stack.concat(getHashedExtend(extend));
26
+ }
27
+ return setHashedExtend(extend, stack);
28
+ };
29
+ const extractArrayExtend = (extend, stack, context) => {
30
+ for (let i = 0; i < extend.length; i++) flattenExtend(extend[i], stack, context);
31
+ return stack;
32
+ };
33
+ const deepExtend = (extend, stack, context) => {
34
+ const extendOflattenExtend = extend.extend;
35
+ if (extendOflattenExtend) {
36
+ flattenExtend(extendOflattenExtend, stack, context);
37
+ }
38
+ return stack;
39
+ };
40
+ const flattenExtend = (extend, stack, context) => {
41
+ if (!extend) return stack;
42
+ if (isArray(extend)) return extractArrayExtend(extend, stack, context);
43
+ if (isString(extend)) extend = fallbackStringExtend(extend, context);
44
+ stack.push(extend);
45
+ if (extend.extend) deepExtend(extend, stack, context);
46
+ return stack;
47
+ };
48
+ const deepMergeExtend = (element, extend) => {
49
+ for (const e in extend) {
50
+ if (e === "parent" || e === "node" || e === "__element") continue;
51
+ const elementProp = element[e];
52
+ const extendProp = extend[e];
53
+ if (elementProp === void 0) {
54
+ element[e] = extendProp;
55
+ } else if (isObject(elementProp) && isObject(extendProp)) {
56
+ deepMergeExtend(elementProp, extendProp);
57
+ } else if (isArray(elementProp) && isArray(extendProp)) {
58
+ element[e] = elementProp.concat(extendProp);
59
+ } else if (isArray(elementProp) && isObject(extendProp)) {
60
+ const obj = deepMergeExtend({}, elementProp);
61
+ element[e] = deepMergeExtend(obj, extendProp);
62
+ } else if (elementProp === void 0 && isFunction(extendProp)) {
63
+ element[e] = extendProp;
64
+ }
65
+ }
66
+ return element;
67
+ };
68
+ const cloneAndMergeArrayExtend = (stack) => {
69
+ return stack.reduce((a, c) => {
70
+ return deepMergeExtend(a, deepClone(c));
71
+ }, {});
72
+ };
73
+ const fallbackStringExtend = (extend, context, options = {}, variant) => {
74
+ const COMPONENTS = context?.components || options.components;
75
+ const PAGES = context?.pages || options.pages;
76
+ if (isString(extend)) {
77
+ const componentExists = COMPONENTS && (COMPONENTS[extend + "." + variant] || COMPONENTS[extend] || COMPONENTS["smbls." + extend]);
78
+ const pageExists = PAGES && extend.charCodeAt(0) === 47 && PAGES[extend];
79
+ if (componentExists) return componentExists;
80
+ else if (pageExists) return pageExists;
81
+ else {
82
+ if (options.verbose && isNotProduction()) {
83
+ console.warn("Extend is string but component was not found:", extend);
84
+ }
85
+ return {};
86
+ }
87
+ }
88
+ return extend;
89
+ };
90
+ const jointStacks = (extendStack, childExtendStack) => {
91
+ return [].concat(extendStack.slice(0, 1)).concat(childExtendStack.slice(0, 1)).concat(extendStack.slice(1)).concat(childExtendStack.slice(1));
92
+ };
93
+ const getExtendStack = (extend, context) => {
94
+ if (!extend) return [];
95
+ if (extend.__hash) return getHashedExtend(extend) || [];
96
+ const stack = flattenExtend(extend, [], context);
97
+ return getExtendStackRegistry(extend, stack);
98
+ };
99
+ const getExtendMerged = (extend) => {
100
+ const stack = getExtendStack(extend);
101
+ return cloneAndMergeArrayExtend(stack);
102
+ };
103
+ export {
104
+ cloneAndMergeArrayExtend,
105
+ deepExtend,
106
+ deepMergeExtend,
107
+ extendCachedRegistry,
108
+ extendStackRegistry,
109
+ extractArrayExtend,
110
+ fallbackStringExtend,
111
+ flattenExtend,
112
+ generateHash,
113
+ getExtendMerged,
114
+ getExtendStack,
115
+ getExtendStackRegistry,
116
+ getHashedExtend,
117
+ jointStacks,
118
+ setHashedExtend
119
+ };
@@ -1,3 +1,4 @@
1
+ export * from "./extendUtils.js";
1
2
  const METHODS_EXL = [];
2
3
  export {
3
4
  METHODS_EXL
@@ -0,0 +1,36 @@
1
+ import { isFunction, lowercaseFirstLetter } from "@domql/utils";
2
+ const propagateEventsFromProps = (element) => {
3
+ const { props, on } = element;
4
+ for (const v in props) {
5
+ if (v.charCodeAt(0) !== 111 || v.charCodeAt(1) !== 110) continue;
6
+ const eventName = lowercaseFirstLetter(v.slice(2));
7
+ const origEvent = on[eventName];
8
+ const funcFromProps = props[v];
9
+ if (isFunction(origEvent)) {
10
+ on[eventName] = (...args) => {
11
+ const originalEventRetunrs = origEvent(...args);
12
+ if (originalEventRetunrs !== false) return funcFromProps(...args);
13
+ };
14
+ } else on[eventName] = funcFromProps;
15
+ }
16
+ };
17
+ const propagateEventsFromElement = (element) => {
18
+ const { on } = element;
19
+ for (const param in element) {
20
+ if (param.charCodeAt(0) !== 111 || param.charCodeAt(1) !== 110 || !Object.prototype.hasOwnProperty.call(element, param)) continue;
21
+ const fn = element[param];
22
+ if (!isFunction(fn)) continue;
23
+ const eventName = lowercaseFirstLetter(param.slice(2));
24
+ const origEvent = on[eventName];
25
+ if (isFunction(origEvent)) {
26
+ on[eventName] = (...args) => {
27
+ const ret = origEvent(...args);
28
+ if (ret !== false) return fn(...args);
29
+ };
30
+ } else on[eventName] = fn;
31
+ }
32
+ };
33
+ export {
34
+ propagateEventsFromElement,
35
+ propagateEventsFromProps
36
+ };