@domql/element 3.2.3 → 3.2.8

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 (105) hide show
  1. package/children.js +40 -12
  2. package/create.js +40 -26
  3. package/define.js +1 -1
  4. package/dist/cjs/children.js +39 -11
  5. package/dist/cjs/create.js +41 -11
  6. package/dist/cjs/define.js +1 -1
  7. package/dist/cjs/event/animationFrame.js +96 -0
  8. package/dist/cjs/event/can.js +28 -0
  9. package/dist/cjs/event/index.js +20 -0
  10. package/dist/cjs/event/on.js +84 -0
  11. package/dist/cjs/event/store.js +27 -0
  12. package/dist/cjs/extend.js +6 -6
  13. package/dist/cjs/index.js +9 -6
  14. package/dist/cjs/iterate.js +13 -13
  15. package/dist/cjs/methods/set.js +5 -0
  16. package/dist/cjs/methods/v2.js +1 -1
  17. package/dist/cjs/mixins/attr.js +3 -2
  18. package/dist/cjs/mixins/classList.js +11 -1
  19. package/dist/cjs/mixins/content.js +1 -2
  20. package/dist/cjs/mixins/html.js +1 -2
  21. package/dist/cjs/mixins/state.js +2 -2
  22. package/dist/cjs/mixins/style.js +11 -2
  23. package/dist/cjs/mixins/text.js +5 -1
  24. package/dist/cjs/node.js +8 -5
  25. package/dist/cjs/render/append.js +72 -0
  26. package/dist/cjs/render/cache.js +80 -0
  27. package/dist/cjs/render/create.js +25 -0
  28. package/dist/cjs/render/index.js +20 -0
  29. package/dist/cjs/set.js +12 -14
  30. package/dist/cjs/update.js +80 -40
  31. package/dist/cjs/utils/applyParam.js +3 -3
  32. package/dist/cjs/utils/extendUtils.js +5 -5
  33. package/dist/cjs/utils/index.js +2 -0
  34. package/dist/cjs/utils/propEvents.js +21 -4
  35. package/dist/esm/children.js +39 -11
  36. package/dist/esm/create.js +42 -11
  37. package/dist/esm/define.js +1 -1
  38. package/dist/esm/event/animationFrame.js +76 -0
  39. package/dist/esm/event/can.js +8 -0
  40. package/dist/esm/event/index.js +3 -0
  41. package/dist/esm/event/on.js +64 -0
  42. package/dist/esm/event/store.js +7 -0
  43. package/dist/esm/extend.js +7 -7
  44. package/dist/esm/index.js +8 -6
  45. package/dist/esm/iterate.js +13 -13
  46. package/dist/esm/methods/set.js +10 -0
  47. package/dist/esm/methods/v2.js +1 -1
  48. package/dist/esm/mixins/attr.js +4 -3
  49. package/dist/esm/mixins/classList.js +11 -1
  50. package/dist/esm/mixins/content.js +1 -2
  51. package/dist/esm/mixins/html.js +1 -2
  52. package/dist/esm/mixins/state.js +2 -2
  53. package/dist/esm/mixins/style.js +12 -3
  54. package/dist/esm/mixins/text.js +6 -2
  55. package/dist/esm/node.js +8 -5
  56. package/dist/esm/render/append.js +52 -0
  57. package/dist/esm/render/cache.js +60 -0
  58. package/dist/esm/render/create.js +5 -0
  59. package/dist/esm/render/index.js +3 -0
  60. package/dist/esm/set.js +12 -14
  61. package/dist/esm/update.js +80 -42
  62. package/dist/esm/utils/applyParam.js +3 -3
  63. package/dist/esm/utils/extendUtils.js +5 -5
  64. package/dist/esm/utils/index.js +1 -0
  65. package/dist/esm/utils/propEvents.js +21 -4
  66. package/dist/iife/index.js +4718 -0
  67. package/extend.js +7 -10
  68. package/index.js +9 -6
  69. package/iterate.js +20 -13
  70. package/node.js +10 -8
  71. package/package.json +42 -18
  72. package/set.js +6 -5
  73. package/update.js +90 -52
  74. package/__tests__/checkIfOnUpdate.test.js +0 -103
  75. package/__tests__/children.test.js +0 -209
  76. package/__tests__/define.test.js +0 -75
  77. package/__tests__/inheritStateUpdates.test.js +0 -79
  78. package/__tests__/renderElement.test.js +0 -131
  79. package/__tests__/resetElement.test.js +0 -44
  80. package/__tests__/set.test.js +0 -312
  81. package/__tests__/throughExecProps.test.js +0 -86
  82. package/__tests__/throughInitialDefine.test.js +0 -104
  83. package/__tests__/throughInitialExec.test.js +0 -92
  84. package/__tests__/throughUpdatedDefine.test.js +0 -92
  85. package/__tests__/throughUpdatedExec.test.js +0 -111
  86. package/__tests__/tree.test.js +0 -15
  87. package/__tests__/update.test.js +0 -256
  88. package/dist/cjs/package.json +0 -4
  89. package/methods/set.js +0 -63
  90. package/methods/v2.js +0 -83
  91. package/mixins/attr.js +0 -32
  92. package/mixins/classList.js +0 -54
  93. package/mixins/content.js +0 -65
  94. package/mixins/data.js +0 -26
  95. package/mixins/html.js +0 -21
  96. package/mixins/index.js +0 -23
  97. package/mixins/registry.js +0 -46
  98. package/mixins/scope.js +0 -23
  99. package/mixins/state.js +0 -19
  100. package/mixins/style.js +0 -16
  101. package/mixins/text.js +0 -26
  102. package/utils/applyParam.js +0 -34
  103. package/utils/extendUtils.js +0 -149
  104. package/utils/index.js +0 -3
  105. package/utils/propEvents.js +0 -19
@@ -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 {
@@ -40,12 +38,7 @@ const UPDATE_DEFAULT_OPTIONS = {
40
38
  exclude: METHODS_EXL
41
39
  };
42
40
  const update = 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;
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 = {};
@@ -73,19 +66,22 @@ const update = function(params = {}, opts) {
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 = 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);
@@ -95,9 +91,7 @@ const update = function(params = {}, opts) {
95
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,12 +109,16 @@ const update = 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;
@@ -133,7 +131,9 @@ const update = function(params = {}, opts) {
133
131
  if (options.onEachUpdate) {
134
132
  options.onEachUpdate(param, element, element.state, element.context);
135
133
  }
136
- const childUpdateCall = () => 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
@@ -141,7 +141,7 @@ const update = function(params = {}, opts) {
141
141
  if (lazyLoad) {
142
142
  window.requestAnimationFrame(() => {
143
143
  childUpdateCall();
144
- if (!options.preventUpdateListener) {
144
+ if (!options.preventUpdateListener && !options.preventListeners) {
145
145
  triggerEventOn("lazyLoad", element, options);
146
146
  }
147
147
  });
@@ -149,23 +149,61 @@ const update = function(params = {}, opts) {
149
149
  }
150
150
  }
151
151
  if (!preventContentUpdate) {
152
- const children = params.children || element.children;
153
- const content = children ? setChildren(children, element, opts) : element.children || params.content;
154
- if (content) {
155
- 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) {
197
+ if (!preventUpdateListener && !options.preventListeners) {
159
198
  triggerEventOn("update", element, options);
160
199
  }
161
200
  };
162
201
  const checkIfOnUpdate = (element, parent, options) => {
163
- var _a, _b, _c;
164
- if (!isFunction(element.if) && !isFunction((_a = element.props) == null ? void 0 : _a.if) || !parent) {
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,15 +231,15 @@ const checkIfOnUpdate = (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
@@ -232,7 +270,7 @@ const inheritStateUpdates = (element, options) => {
232
270
  const { preventUpdateTriggerStateUpdate, isHoisted, execStateFunction } = options;
233
271
  if (preventUpdateTriggerStateUpdate) return;
234
272
  if (!stateKey && !ref.__hasRootState) {
235
- element.state = parent && parent.state || {};
273
+ element.state = parent?.state || {};
236
274
  return;
237
275
  }
238
276
  const shouldForceFunctionState = isFunction(stateKey) && !isHoisted && execStateFunction;
@@ -5,10 +5,10 @@ const applyParam = (param, element, options) => {
5
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) {
@@ -27,7 +27,7 @@ const getExtendStackRegistry = (extend, stack) => {
27
27
  return setHashedExtend(extend, stack);
28
28
  };
29
29
  const extractArrayExtend = (extend, stack, context) => {
30
- extend.forEach((each) => flattenExtend(each, stack, context));
30
+ for (let i = 0; i < extend.length; i++) flattenExtend(extend[i], stack, context);
31
31
  return stack;
32
32
  };
33
33
  const deepExtend = (extend, stack, context) => {
@@ -47,7 +47,7 @@ const flattenExtend = (extend, stack, context) => {
47
47
  };
48
48
  const deepMergeExtend = (element, extend) => {
49
49
  for (const e in extend) {
50
- if (["parent", "node", "__element"].indexOf(e) > -1) continue;
50
+ if (e === "parent" || e === "node" || e === "__element") continue;
51
51
  const elementProp = element[e];
52
52
  const extendProp = extend[e];
53
53
  if (elementProp === void 0) {
@@ -71,11 +71,11 @@ const cloneAndMergeArrayExtend = (stack) => {
71
71
  }, {});
72
72
  };
73
73
  const fallbackStringExtend = (extend, context, options = {}, variant) => {
74
- const COMPONENTS = context && context.components || options.components;
75
- const PAGES = context && context.pages || options.pages;
74
+ const COMPONENTS = context?.components || options.components;
75
+ const PAGES = context?.pages || options.pages;
76
76
  if (isString(extend)) {
77
77
  const componentExists = COMPONENTS && (COMPONENTS[extend + "." + variant] || COMPONENTS[extend] || COMPONENTS["smbls." + extend]);
78
- const pageExists = PAGES && extend.startsWith("/") && PAGES[extend];
78
+ const pageExists = PAGES && extend.charCodeAt(0) === 47 && PAGES[extend];
79
79
  if (componentExists) return componentExists;
80
80
  else if (pageExists) return pageExists;
81
81
  else {
@@ -1,3 +1,4 @@
1
+ export * from "./extendUtils.js";
1
2
  const METHODS_EXL = [];
2
3
  export {
3
4
  METHODS_EXL
@@ -1,9 +1,9 @@
1
1
  import { isFunction, lowercaseFirstLetter } from "@domql/utils";
2
2
  const propagateEventsFromProps = (element) => {
3
3
  const { props, on } = element;
4
- const eventKeysFromProps = Object.keys(props).filter((key) => key.startsWith("on"));
5
- eventKeysFromProps.forEach((v) => {
6
- const eventName = lowercaseFirstLetter(v.split("on")[1]);
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
7
  const origEvent = on[eventName];
8
8
  const funcFromProps = props[v];
9
9
  if (isFunction(origEvent)) {
@@ -12,8 +12,25 @@ const propagateEventsFromProps = (element) => {
12
12
  if (originalEventRetunrs !== false) return funcFromProps(...args);
13
13
  };
14
14
  } else on[eventName] = funcFromProps;
15
- });
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
+ }
16
32
  };
17
33
  export {
34
+ propagateEventsFromElement,
18
35
  propagateEventsFromProps
19
36
  };