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