@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
@@ -1,69 +0,0 @@
1
- import { throughUpdatedDefine } from "../iterate";
2
- describe("throughUpdatedDefine", () => {
3
- let element, ref;
4
- beforeEach(() => {
5
- ref = {
6
- __exec: {},
7
- __defineCache: {}
8
- };
9
- element = {
10
- __ref: ref,
11
- define: {},
12
- state: { testState: true },
13
- context: { testContext: true }
14
- };
15
- });
16
- it("should merge local and global define objects", async () => {
17
- element.define = { localProp: () => "local" };
18
- element.context.define = { globalProp: () => "global" };
19
- await throughUpdatedDefine(element);
20
- expect(element.localProp).toBe("local");
21
- expect(element.globalProp).toBe("global");
22
- });
23
- it("should update element properties using cached exec functions", async () => {
24
- ref.__exec.testProp = () => "cached value";
25
- element.define.testProp = (cached) => `updated ${cached}`;
26
- await throughUpdatedDefine(element);
27
- expect(element.testProp).toBe("updated cached value");
28
- expect(ref.__defineCache.testProp).toBe("cached value");
29
- });
30
- it("should handle non-function cached values", async () => {
31
- ref.__defineCache.testProp = "static value";
32
- element.define.testProp = (cached) => `updated ${cached}`;
33
- await throughUpdatedDefine(element);
34
- expect(element.testProp).toBe("updated static value");
35
- });
36
- it("should skip updates for undefined or null results", async () => {
37
- ref.__exec.testProp = () => "cached value";
38
- element.define.testProp = () => null;
39
- element.testProp = "original value";
40
- await throughUpdatedDefine(element);
41
- expect(element.testProp).toBe("original value");
42
- });
43
- it("should handle empty define objects", async () => {
44
- const originalElement = { ...element };
45
- await throughUpdatedDefine(element);
46
- expect(element).toEqual(originalElement);
47
- });
48
- it("should pass correct arguments to define functions", async () => {
49
- element.define.testProp = (cached, el, state, context) => ({
50
- cachedMatch: cached === "cached value",
51
- elMatch: el === element,
52
- stateMatch: state === element.state,
53
- contextMatch: context === element.context
54
- });
55
- ref.__defineCache.testProp = "cached value";
56
- await throughUpdatedDefine(element);
57
- expect(element.testProp).toEqual({
58
- cachedMatch: true,
59
- elMatch: true,
60
- stateMatch: true,
61
- contextMatch: true
62
- });
63
- });
64
- it("should return an empty changes object", async () => {
65
- element.define.testProp = () => "updated value";
66
- const changes = await throughUpdatedDefine(element);
67
- expect(changes).toEqual({});
68
- });
69
- });
@@ -1,84 +0,0 @@
1
- import { throughUpdatedExec } from "../iterate";
2
- describe("throughUpdatedExec", () => {
3
- let element, ref;
4
- beforeEach(() => {
5
- ref = {
6
- __exec: {},
7
- __defineCache: {}
8
- };
9
- element = {
10
- __ref: ref,
11
- state: { testState: true },
12
- context: { testContext: true }
13
- };
14
- });
15
- it("should skip execution for params in __defineCache", () => {
16
- ref.__defineCache.cachedParam = true;
17
- ref.__exec.cachedParam = () => "should not execute";
18
- element.cachedParam = "original";
19
- const changes = throughUpdatedExec(element);
20
- expect(element.cachedParam).toBe("original");
21
- expect(changes).toEqual({});
22
- });
23
- it("should update element properties when newExec differs from current value", () => {
24
- ref.__exec.testParam = () => "new value";
25
- element.testParam = "old value";
26
- const changes = throughUpdatedExec(element);
27
- expect(element.testParam).toBe("new value");
28
- expect(changes).toEqual({ testParam: "old value" });
29
- });
30
- it("should overwrite text property for nodes when exec returns string or number", () => {
31
- const node = { node: true, text: "old text" };
32
- ref.__exec.testParam = () => "new text";
33
- element.testParam = node;
34
- const changes = throughUpdatedExec(element);
35
- expect(element.testParam.text).toBe("new text");
36
- expect(changes).toEqual({});
37
- });
38
- it("should handle component naming matches and overwrite with context component", () => {
39
- const contextComponent = { extends: "Component", prop: "value" };
40
- element.context.components = { TestComponent: contextComponent };
41
- ref.__exec.TestComponent = () => contextComponent;
42
- element.TestComponent = { oldProp: "oldValue" };
43
- const changes = throughUpdatedExec(element);
44
- expect(element.TestComponent).toEqual({
45
- oldProp: "oldValue",
46
- prop: "value"
47
- });
48
- expect(changes).toEqual({});
49
- });
50
- it("should not update element properties when newExec matches current value", () => {
51
- ref.__exec.testParam = () => "same value";
52
- element.testParam = "same value";
53
- const changes = throughUpdatedExec(element);
54
- expect(element.testParam).toBe("same value");
55
- expect(changes).toEqual({});
56
- });
57
- it("should handle non-string/non-number exec returns for non-node properties", () => {
58
- const newValue = { complex: "object" };
59
- ref.__exec.testParam = () => newValue;
60
- element.testParam = "old value";
61
- const changes = throughUpdatedExec(element);
62
- expect(element.testParam).toBe(newValue);
63
- expect(changes).toEqual({ testParam: "old value" });
64
- });
65
- it("should return an empty changes object when no updates occur", () => {
66
- ref.__exec.testParam = () => "same value";
67
- element.testParam = "same value";
68
- const changes = throughUpdatedExec(element);
69
- expect(changes).toEqual({});
70
- });
71
- it("should handle multiple properties and return correct changes", () => {
72
- ref.__exec.param1 = () => "new value 1";
73
- ref.__exec.param2 = () => "new value 2";
74
- element.param1 = "old value 1";
75
- element.param2 = "old value 2";
76
- const changes = throughUpdatedExec(element);
77
- expect(element.param1).toBe("new value 1");
78
- expect(element.param2).toBe("new value 2");
79
- expect(changes).toEqual({
80
- param1: "old value 1",
81
- param2: "old value 2"
82
- });
83
- });
84
- });
@@ -1,11 +0,0 @@
1
- import { ROOT, TREE } from "../tree";
2
- describe("ROOT/TREE initialization and report()", () => {
3
- it("initializes ROOT with :root key and document.body node", () => {
4
- expect(ROOT.key).toBe(":root");
5
- expect(ROOT.node).toBe(document.body);
6
- });
7
- it("assigns TREE to reference ROOT", () => {
8
- expect(TREE).toBe(ROOT);
9
- expect(TREE.node).toBe(document.body);
10
- });
11
- });
@@ -1,222 +0,0 @@
1
- import { update } from "../update";
2
- describe("update()", () => {
3
- let element, params, opts;
4
- beforeEach(() => {
5
- element = {
6
- __ref: {
7
- __if: true,
8
- __execProps: {},
9
- __exec: {},
10
- __defineCache: {},
11
- __propsStack: [],
12
- __props: [],
13
- __state: "state"
14
- },
15
- state: "string",
16
- props: {},
17
- parent: {
18
- props: {}
19
- },
20
- context: {},
21
- define: {},
22
- node: document.createElement("div"),
23
- key: "testElement",
24
- on: {},
25
- update
26
- };
27
- opts = {
28
- preventUpdate: [],
29
- preventDefineUpdate: [],
30
- preventBeforeStateUpdateListener: false,
31
- preventListeners: false,
32
- preventStateUpdateListener: false
33
- };
34
- params = {};
35
- });
36
- it("does not modify opts when params and opts are empty", async () => {
37
- await element.update({}, opts);
38
- expect(opts).toEqual({
39
- calleeElement: false,
40
- cleanExec: true,
41
- currentSnapshot: false,
42
- exclude: [],
43
- preventRecursive: false,
44
- stackChanges: false,
45
- preventUpdate: [],
46
- preventDefineUpdate: [],
47
- preventBeforeStateUpdateListener: false,
48
- preventListeners: false,
49
- preventStateUpdateListener: false
50
- });
51
- });
52
- it("initializes options with UPDATE_DEFAULT_OPTIONS when opts is empty", async () => {
53
- await element.update({}, opts);
54
- expect(opts.calleeElement).toBe(false);
55
- expect(element.__ref).toBeDefined();
56
- });
57
- it("merges opts with UPDATE_DEFAULT_OPTIONS using deepMerge", async () => {
58
- opts.customOption = true;
59
- await element.update({}, opts);
60
- expect(opts.customOption).toBe(true);
61
- });
62
- it("converts string params to { text: params }", async () => {
63
- await element.update("testString", opts);
64
- expect(element.text).toBe("testString");
65
- });
66
- it("converts number params to { text: params }", async () => {
67
- await element.update(123, opts);
68
- expect(element.text).toBe(123);
69
- });
70
- it("returns early if preventInheritAtCurrentState matches element", async () => {
71
- opts.preventInheritAtCurrentState = { __element: element };
72
- await element.update({}, opts);
73
- expect(element.__ref.__currentSnapshot).toBe(6);
74
- });
75
- it("initializes __ref if not present", async () => {
76
- delete element.__ref;
77
- await element.update({}, opts);
78
- expect(element.__ref).toBeDefined();
79
- });
80
- it("merges options with UPDATE_DEFAULT_OPTIONS when exclude is missing", async () => {
81
- await element.update({}, opts);
82
- expect(opts.exclude).toBeDefined();
83
- });
84
- it("does not throw or modify opts when params is undefined", async () => {
85
- await element.update(void 0, opts);
86
- expect(opts).toEqual({
87
- calleeElement: false,
88
- cleanExec: true,
89
- currentSnapshot: false,
90
- exclude: [],
91
- preventRecursive: false,
92
- preventUpdate: [],
93
- preventDefineUpdate: [],
94
- stackChanges: false,
95
- preventBeforeStateUpdateListener: false,
96
- preventListeners: false,
97
- preventStateUpdateListener: false
98
- });
99
- });
100
- it("does not throw when opts is undefined", async () => {
101
- await element.update({}, void 0);
102
- expect(element.__ref).toBeDefined();
103
- });
104
- it("does not throw when opts is null", async () => {
105
- await element.update({}, null);
106
- expect(element.__ref).toBeDefined();
107
- });
108
- it("does not modify the params object", async () => {
109
- params = { key: "value" };
110
- await element.update(params, opts);
111
- expect(params).toEqual({ key: "value" });
112
- });
113
- it("does modify opts when params is an empty object", async () => {
114
- await element.update({}, opts);
115
- expect(opts).toEqual({
116
- calleeElement: false,
117
- cleanExec: true,
118
- currentSnapshot: false,
119
- exclude: [],
120
- preventRecursive: false,
121
- stackChanges: false,
122
- preventUpdate: [],
123
- preventDefineUpdate: [],
124
- preventBeforeStateUpdateListener: false,
125
- preventListeners: false,
126
- preventStateUpdateListener: false
127
- });
128
- });
129
- it("moves regular properties to element.props", async () => {
130
- params = { props: { title: "Test", description: "Content" } };
131
- await element.update(params, opts);
132
- expect(element.props).toEqual({
133
- title: "Test",
134
- description: "Content"
135
- });
136
- expect(element.title).toBeUndefined();
137
- });
138
- it("keeps element-rooted properties", async () => {
139
- params = { Header: {}, Footer: {}, 0: "index" };
140
- await element.update(params, opts);
141
- expect(element.Header).toBeDefined();
142
- expect(element.Footer).toBeDefined();
143
- expect(element["0"]).toBe("index");
144
- expect(element.props).toEqual({});
145
- });
146
- it("preserves built-in properties on element", async () => {
147
- params = { props: { className: "container", hidden: true } };
148
- await element.update(params, opts);
149
- expect(element.props.className).toBe("container");
150
- expect(element.props.hidden).toBe(true);
151
- expect(element.props).toEqual({ className: "container", hidden: true });
152
- });
153
- it("moves element-like properties from props to root", async () => {
154
- params = { props: { Header: {} } };
155
- await element.update(params, opts);
156
- expect(element.Header).toBeDefined();
157
- expect(element.props.Header).toBeUndefined();
158
- });
159
- it("exits early when inheritStateUpdates returns false", async () => {
160
- element.__ref.__stateBlocked = true;
161
- await element.update({ props: { shouldChange: true } }, opts);
162
- expect(element.props.shouldChange).toBe(true);
163
- expect(element.__ref.__stateBlocked).toBe(true);
164
- });
165
- it("exits early when checkIfOnUpdate fails", async () => {
166
- element.parent.props.ifCondition = false;
167
- await element.update({ state: { newState: true } }, opts);
168
- expect(element.state.newState).toBe(true);
169
- });
170
- it("updates props from parent key match", async () => {
171
- element.parent.props.testKey = { inherited: true };
172
- await element.update({}, opts);
173
- expect(element.props.inherited).toBeUndefined();
174
- });
175
- it("updates props when functions exist in __props", async () => {
176
- element.__ref.__props.push(() => "dynamic");
177
- await element.update({}, opts);
178
- expect(element.props).toEqual(expect.any(Object));
179
- });
180
- it("skips props update when preventPropsUpdate=true", async () => {
181
- opts.preventPropsUpdate = true;
182
- opts.preventUpdateAfter = true;
183
- element.parent.props.testKey = { shouldExist: true };
184
- await element.update({}, opts);
185
- expect(element.props.shouldExist).toBeUndefined();
186
- });
187
- it("should not skips props update when preventPropsUpdate=false", async () => {
188
- opts.preventPropsUpdate = false;
189
- opts.lazyLoad = true;
190
- opts.onEachUpdate = () => {
191
- return true;
192
- };
193
- element.parent.props.testKey = { shouldExist: true };
194
- element.__ref.__propsStack = [];
195
- element.__ref.__if = true;
196
- element.off = { text: "off" };
197
- await element.update({}, opts);
198
- expect(element.props.shouldExist).toBeUndefined();
199
- });
200
- it("should set preventUpdateAfterCount to 1 when is not a number", async () => {
201
- opts.preventPropsUpdate = true;
202
- opts.preventUpdateAfter = 2;
203
- opts.preventUpdateAfterCount = void 0;
204
- element.parent.props.testKey = { shouldExist: true };
205
- await element.update({}, opts);
206
- expect(element.props.shouldExist).toBeUndefined();
207
- });
208
- it("processes parent.childProps", async () => {
209
- element.parent.props.childProps = { global: true };
210
- await element.update({}, opts);
211
- expect(element.props.global).toBe(true);
212
- });
213
- it("processes function props", async () => {
214
- await element.update({ props: { calc: () => 42 } }, opts);
215
- expect(element.props.calc()).toBe(42);
216
- });
217
- it("returns element when beforeUpdate rejects", async () => {
218
- element.on.beforeUpdate = () => false;
219
- const result = await element.update({}, opts);
220
- expect(result).toBe(element);
221
- });
222
- });
package/methods/set.js DELETED
@@ -1,63 +0,0 @@
1
- 'use strict'
2
-
3
- import { merge, overwrite } from '@domql/utils'
4
-
5
- import { set, reset, updateContent, removeContent } from '../set.js'
6
- import { update } from '../update.js'
7
-
8
- import {
9
- call,
10
- error,
11
- getPath,
12
- getRef,
13
- keys,
14
- log,
15
- lookdown,
16
- lookdownAll,
17
- lookup,
18
- nextElement,
19
- parse,
20
- parseDeep,
21
- previousElement,
22
- remove,
23
- setNodeStyles,
24
- setProps,
25
- spotByPath,
26
- variables,
27
- verbose,
28
- warn
29
- } from '@domql/utils/methods'
30
-
31
- export const addMethods = (element, parent, options = {}) => {
32
- const proto = {
33
- set,
34
- reset,
35
- update,
36
- variables,
37
- remove,
38
- updateContent,
39
- removeContent,
40
- setProps,
41
- lookup,
42
- lookdown,
43
- lookdownAll,
44
- getRef,
45
- getPath,
46
- setNodeStyles,
47
- spotByPath,
48
- parse,
49
- parseDeep,
50
- keys,
51
- nextElement,
52
- previousElement,
53
- log,
54
- verbose,
55
- warn,
56
- error,
57
- call
58
- }
59
- if (element.context.methods) {
60
- ;(options.strict ? merge : overwrite)(proto, element.context.methods)
61
- }
62
- Object.setPrototypeOf(element, proto)
63
- }
package/methods/v2.js DELETED
@@ -1,83 +0,0 @@
1
- 'use strict'
2
-
3
- import { isDefined, isFunction, isObjectLike } from '@domql/utils'
4
-
5
- export const defineSetter = (element, key, get, set) =>
6
- Object.defineProperty(element, key, { get, set })
7
-
8
- export const keys = function () {
9
- const element = this
10
- const keys = []
11
- for (const param in element) {
12
- // if (REGISTRY[param] && !parseFilters.elementKeys.includes(param)) { continue }
13
- keys.push(param)
14
- }
15
- return keys
16
- }
17
-
18
- export const parse = function (excl = []) {
19
- const element = this
20
- const obj = {}
21
- const keyList = keys.call(element)
22
- keyList.forEach(v => {
23
- if (excl.includes(v)) return
24
- let val = element[v]
25
- if (v === 'state') {
26
- if (element.__ref && element.__ref.__hasRootState) return
27
- if (isFunction(val && val.parse)) val = val.parse()
28
- } else if (v === 'props') {
29
- const { __element, update, ...props } = element[v]
30
- obj[v] = props
31
- } else if (isDefined(val)) obj[v] = val
32
- })
33
- return obj
34
- }
35
-
36
- export const parseDeep = function (excl = []) {
37
- const element = this
38
- const obj = parse.call(element, excl)
39
- for (const v in obj) {
40
- if (excl.includes(v)) return
41
- if (isObjectLike(obj[v])) {
42
- obj[v] = parseDeep.call(obj[v], excl)
43
- }
44
- }
45
- return obj
46
- }
47
-
48
- export const log = function (...args) {
49
- const element = this
50
- const { __ref } = element
51
- console.group(element.key)
52
- if (args.length) {
53
- args.forEach(v => console.log(`%c${v}:\n`, 'font-weight: bold', element[v]))
54
- } else {
55
- console.log(__ref?.path)
56
- const keys = element.keys()
57
- keys.forEach(v => console.log(`%c${v}:\n`, 'font-weight: bold', element[v]))
58
- }
59
- console.groupEnd(element.key)
60
- return element
61
- }
62
-
63
- export const nextElement = function () {
64
- const element = this
65
- const { key, parent } = element
66
- const { __children } = parent.__ref
67
-
68
- const currentIndex = __children.indexOf(key)
69
- const nextChild = __children[currentIndex + 1]
70
-
71
- return parent[nextChild]
72
- }
73
-
74
- export const previousElement = function (el) {
75
- const element = el || this
76
- const { key, parent } = element
77
- const { __children } = parent.__ref
78
-
79
- if (!__children) return
80
-
81
- const currentIndex = __children.indexOf(key)
82
- return parent[__children[currentIndex - 1]]
83
- }
package/mixins/attr.js DELETED
@@ -1,32 +0,0 @@
1
- 'use strict'
2
-
3
- import { deepMerge, exec, isNot, isNull, isUndefined } from '@domql/utils'
4
- import { report } from '@domql/report'
5
-
6
- /**
7
- * Recursively add attributes to a DOM node
8
- */
9
- export function attr (params, element, node) {
10
- const { __ref: ref, props } = element
11
- const { __attr } = ref
12
- if (isNot('object')) report('HTMLInvalidAttr', params)
13
- if (params) {
14
- const attrs = exec(params, element)
15
- if (props.attr) deepMerge(attrs, props.attr)
16
- for (const attr in attrs) {
17
- const val = exec(attrs[attr], element)
18
- // if (__attr[attr] === val) return
19
- if (
20
- val !== false &&
21
- !isUndefined(val) &&
22
- !isNull(val) &&
23
- node.setAttribute
24
- ) {
25
- node.setAttribute(attr, val)
26
- } else if (node.removeAttribute) node.removeAttribute(attr)
27
- __attr[attr] = val
28
- }
29
- }
30
- }
31
-
32
- export default attr
@@ -1,54 +0,0 @@
1
- 'use strict'
2
-
3
- import { exec, isObject, isString } from '@domql/utils'
4
-
5
- export const assignKeyAsClassname = element => {
6
- const { key } = element
7
- if (element.classlist === true) element.classlist = key
8
- else if (
9
- !element.classlist &&
10
- typeof key === 'string' &&
11
- key.charAt(0) === '_' &&
12
- key.charAt(1) !== '_'
13
- ) {
14
- element.classlist = key.slice(1)
15
- }
16
- }
17
-
18
- // stringifies class object
19
- export const classify = (obj, element) => {
20
- let className = ''
21
- for (const item in obj) {
22
- const param = obj[item]
23
- if (typeof param === 'boolean' && param) className += ` ${item}`
24
- else if (typeof param === 'string') className += ` ${param}`
25
- else if (typeof param === 'function') {
26
- className += ` ${exec(param, element)}`
27
- }
28
- }
29
- return className
30
- }
31
-
32
- export const classList = (params, element) => {
33
- if (!params) return
34
- const { key } = element
35
- if (params === true) params = element.classlist = { key }
36
- if (isString(params)) params = element.classlist = { default: params }
37
- if (isObject(params)) params = classify(params, element)
38
- // TODO: fails on string
39
- const className = params.replace(/\s+/g, ' ').trim()
40
- return className
41
- }
42
-
43
- // LEGACY (still needed in old domql)
44
- export const applyClassListOnNode = (params, element, node) => {
45
- const className = classList(params, element)
46
- node.classList = className
47
- return className
48
- }
49
-
50
- export function applyClasslist (params, element, node) {
51
- applyClassListOnNode(params, element, node)
52
- }
53
-
54
- export default applyClasslist
package/mixins/data.js DELETED
@@ -1,26 +0,0 @@
1
- 'use strict'
2
-
3
- import { isObject, deepMerge, exec } from '@domql/utils'
4
- import { report } from '@domql/report'
5
-
6
- /**
7
- * Apply data parameters on the DOM nodes
8
- * this should only work if `showOnNode: true` is passed
9
- */
10
- export function data (params, element, node) {
11
- if (params) {
12
- if (element.props.data) deepMerge(params, element.props.data)
13
- if (params.showOnNode) {
14
- if (!isObject(params)) report('HTMLInvalidData', params)
15
-
16
- // Apply data params on node
17
- for (const dataset in params) {
18
- if (dataset !== 'showOnNode') {
19
- node.dataset[dataset] = exec(params[dataset], element)
20
- }
21
- }
22
- }
23
- }
24
- }
25
-
26
- export default data
package/mixins/html.js DELETED
@@ -1,21 +0,0 @@
1
- 'use strict'
2
-
3
- import { exec } from '@domql/utils'
4
-
5
- /**
6
- * Appends raw HTML as content
7
- * an original one as a child
8
- */
9
- export function html (param, element, node) {
10
- const prop = exec(param, element) || exec(element?.props?.html, element)
11
- const { __ref } = element
12
- if (prop !== __ref.__html) {
13
- // const parser = new window.DOMParser()
14
- // param = parser.parseFromString(param, 'text/html')
15
- if (node.nodeName === 'SVG') node.textContent = prop
16
- else node.innerHTML = prop
17
- __ref.__html = prop
18
- }
19
- }
20
-
21
- export default html
package/mixins/index.js DELETED
@@ -1,23 +0,0 @@
1
- 'use strict'
2
-
3
- import { attr } from './attr.js'
4
- import { applyClasslist } from './classList.js'
5
- import { data } from './data.js'
6
- import { html } from './html.js'
7
- import { style } from './style.js'
8
- import { text } from './text.js'
9
- import { state } from './state.js'
10
- import { scope } from './scope.js'
11
-
12
- export {
13
- applyClasslist as classList,
14
- attr,
15
- data,
16
- style,
17
- text,
18
- html,
19
- state,
20
- scope
21
- }
22
-
23
- export * from './registry.js'