treeloom 0.0.0-stage → 2.0.0

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 (283) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +72 -2
  3. package/browser/treeloom.js +11006 -0
  4. package/browser/treeloom.min.js +1 -0
  5. package/browser/treeloomRenderOnly.js +10530 -0
  6. package/browser/treeloomRenderOnly.min.js +1 -0
  7. package/dist/deflate/domItemToJson.d.ts +14 -0
  8. package/dist/deflate/domItemToJson.js +43 -0
  9. package/dist/deflate/domItemToJson.min.js +1 -0
  10. package/dist/deflate/index.d.ts +7 -0
  11. package/dist/deflate/index.js +19 -0
  12. package/dist/deflate/index.min.js +1 -0
  13. package/dist/deflate/removeEmptyProperties.d.ts +8 -0
  14. package/dist/deflate/removeEmptyProperties.js +43 -0
  15. package/dist/deflate/removeEmptyProperties.min.js +1 -0
  16. package/dist/diff/createChangeList.d.ts +9 -0
  17. package/dist/diff/createChangeList.js +44 -0
  18. package/dist/diff/createChangeList.min.js +1 -0
  19. package/dist/diff/domItemChanges.d.ts +9 -0
  20. package/dist/diff/domItemChanges.js +154 -0
  21. package/dist/diff/domItemChanges.min.js +1 -0
  22. package/dist/diff/domItemHasAttribute.d.ts +11 -0
  23. package/dist/diff/domItemHasAttribute.js +63 -0
  24. package/dist/diff/domItemHasAttribute.min.js +1 -0
  25. package/dist/diff/elementChanges.d.ts +10 -0
  26. package/dist/diff/elementChanges.js +151 -0
  27. package/dist/diff/elementChanges.min.js +1 -0
  28. package/dist/diff/elementHasAttribute.d.ts +10 -0
  29. package/dist/diff/elementHasAttribute.js +70 -0
  30. package/dist/diff/elementHasAttribute.min.js +1 -0
  31. package/dist/diff/getAssignedStyles.d.ts +9 -0
  32. package/dist/diff/getAssignedStyles.js +22 -0
  33. package/dist/diff/getAssignedStyles.min.js +1 -0
  34. package/dist/diff/index.d.ts +9 -0
  35. package/dist/diff/index.js +27 -0
  36. package/dist/diff/index.min.js +1 -0
  37. package/dist/diff/types.d.ts +17 -0
  38. package/dist/diff/types.js +8 -0
  39. package/dist/diff/types.min.js +1 -0
  40. package/dist/domItem/index.d.ts +34 -0
  41. package/dist/domItem/index.js +81 -0
  42. package/dist/domItem/index.min.js +1 -0
  43. package/dist/domItem/objects/addDomItemProperties.d.ts +7 -0
  44. package/dist/domItem/objects/addDomItemProperties.js +27 -0
  45. package/dist/domItem/objects/addDomItemProperties.min.js +1 -0
  46. package/dist/domItem/objects/createCoreItem.d.ts +9 -0
  47. package/dist/domItem/objects/createCoreItem.js +53 -0
  48. package/dist/domItem/objects/createCoreItem.min.js +1 -0
  49. package/dist/domItem/objects/createDomItem.d.ts +10 -0
  50. package/dist/domItem/objects/createDomItem.js +40 -0
  51. package/dist/domItem/objects/createDomItem.min.js +1 -0
  52. package/dist/domItem/objects/documentDomItem.d.ts +12 -0
  53. package/dist/domItem/objects/documentDomItem.js +36 -0
  54. package/dist/domItem/objects/documentDomItem.min.js +1 -0
  55. package/dist/domItem/objects/documentItem.d.ts +18 -0
  56. package/dist/domItem/objects/documentItem.js +40 -0
  57. package/dist/domItem/objects/documentItem.min.js +1 -0
  58. package/dist/domItem/objects/initChildren.d.ts +6 -0
  59. package/dist/domItem/objects/initChildren.js +44 -0
  60. package/dist/domItem/objects/initChildren.min.js +1 -0
  61. package/dist/domItem/objects/initRoot.d.ts +9 -0
  62. package/dist/domItem/objects/initRoot.js +32 -0
  63. package/dist/domItem/objects/initRoot.min.js +1 -0
  64. package/dist/domItem/query/gatherChildItems.d.ts +12 -0
  65. package/dist/domItem/query/gatherChildItems.js +19 -0
  66. package/dist/domItem/query/gatherChildItems.min.js +1 -0
  67. package/dist/domItem/query/getChildTest.d.ts +8 -0
  68. package/dist/domItem/query/getChildTest.js +15 -0
  69. package/dist/domItem/query/getChildTest.min.js +1 -0
  70. package/dist/domItem/query/getChildrenByClass.d.ts +11 -0
  71. package/dist/domItem/query/getChildrenByClass.js +26 -0
  72. package/dist/domItem/query/getChildrenByClass.min.js +1 -0
  73. package/dist/domItem/query/getChildrenByName.d.ts +9 -0
  74. package/dist/domItem/query/getChildrenByName.js +23 -0
  75. package/dist/domItem/query/getChildrenByName.min.js +1 -0
  76. package/dist/domItem/query/getChildrenFromAttribute.d.ts +13 -0
  77. package/dist/domItem/query/getChildrenFromAttribute.js +28 -0
  78. package/dist/domItem/query/getChildrenFromAttribute.min.js +1 -0
  79. package/dist/domItem/query/getItemByElement.d.ts +11 -0
  80. package/dist/domItem/query/getItemByElement.js +29 -0
  81. package/dist/domItem/query/getItemByElement.min.js +1 -0
  82. package/dist/domItem/query/getParentsByClass.d.ts +12 -0
  83. package/dist/domItem/query/getParentsByClass.js +40 -0
  84. package/dist/domItem/query/getParentsByClass.min.js +1 -0
  85. package/dist/domItem/query/getParentsByName.d.ts +9 -0
  86. package/dist/domItem/query/getParentsByName.js +23 -0
  87. package/dist/domItem/query/getParentsByName.min.js +1 -0
  88. package/dist/domItem/query/getParentsByTagName.d.ts +9 -0
  89. package/dist/domItem/query/getParentsByTagName.js +23 -0
  90. package/dist/domItem/query/getParentsByTagName.min.js +1 -0
  91. package/dist/domItem/query/getParentsFromAttribute.d.ts +13 -0
  92. package/dist/domItem/query/getParentsFromAttribute.js +39 -0
  93. package/dist/domItem/query/getParentsFromAttribute.min.js +1 -0
  94. package/dist/domItem/traits/defineTrait.d.ts +10 -0
  95. package/dist/domItem/traits/defineTrait.js +26 -0
  96. package/dist/domItem/traits/defineTrait.min.js +1 -0
  97. package/dist/domItem/traits/definitions.d.ts +7 -0
  98. package/dist/domItem/traits/definitions.js +20 -0
  99. package/dist/domItem/traits/definitions.min.js +1 -0
  100. package/dist/domItem/traits/getNonSerializableKeys.d.ts +9 -0
  101. package/dist/domItem/traits/getNonSerializableKeys.js +25 -0
  102. package/dist/domItem/traits/getNonSerializableKeys.min.js +1 -0
  103. package/dist/domItem/traits/getTraitDefinition.d.ts +7 -0
  104. package/dist/domItem/traits/getTraitDefinition.js +20 -0
  105. package/dist/domItem/traits/getTraitDefinition.min.js +1 -0
  106. package/dist/domItem/traits/hasTrait.d.ts +8 -0
  107. package/dist/domItem/traits/hasTrait.js +15 -0
  108. package/dist/domItem/traits/hasTrait.min.js +1 -0
  109. package/dist/domItem/traits/hasTraits.d.ts +9 -0
  110. package/dist/domItem/traits/hasTraits.js +16 -0
  111. package/dist/domItem/traits/hasTraits.min.js +1 -0
  112. package/dist/domItem/traits/isDomItem.d.ts +8 -0
  113. package/dist/domItem/traits/isDomItem.js +21 -0
  114. package/dist/domItem/traits/isDomItem.min.js +1 -0
  115. package/dist/domItem/traits/withTrait.d.ts +11 -0
  116. package/dist/domItem/traits/withTrait.js +30 -0
  117. package/dist/domItem/traits/withTrait.min.js +1 -0
  118. package/dist/domItem/tree/appendChild.d.ts +8 -0
  119. package/dist/domItem/tree/appendChild.js +19 -0
  120. package/dist/domItem/tree/appendChild.min.js +1 -0
  121. package/dist/domItem/tree/getItemByPath.d.ts +10 -0
  122. package/dist/domItem/tree/getItemByPath.js +23 -0
  123. package/dist/domItem/tree/getItemByPath.min.js +1 -0
  124. package/dist/domItem/tree/getItemPath.d.ts +9 -0
  125. package/dist/domItem/tree/getItemPath.js +31 -0
  126. package/dist/domItem/tree/getItemPath.min.js +1 -0
  127. package/dist/domItem/tree/getTopParentItem.d.ts +8 -0
  128. package/dist/domItem/tree/getTopParentItem.js +29 -0
  129. package/dist/domItem/tree/getTopParentItem.min.js +1 -0
  130. package/dist/domItem/tree/insertChild.d.ts +11 -0
  131. package/dist/domItem/tree/insertChild.js +22 -0
  132. package/dist/domItem/tree/insertChild.min.js +1 -0
  133. package/dist/domItem/tree/itemIdIndex.d.ts +43 -0
  134. package/dist/domItem/tree/itemIdIndex.js +118 -0
  135. package/dist/domItem/tree/itemIdIndex.min.js +1 -0
  136. package/dist/domItem/tree/removeChild.d.ts +8 -0
  137. package/dist/domItem/tree/removeChild.js +21 -0
  138. package/dist/domItem/tree/removeChild.min.js +1 -0
  139. package/dist/domItem/tree/setParentItemReferences.d.ts +7 -0
  140. package/dist/domItem/tree/setParentItemReferences.js +24 -0
  141. package/dist/domItem/tree/setParentItemReferences.min.js +1 -0
  142. package/dist/domItem/types.d.ts +131 -0
  143. package/dist/domItem/types.js +8 -0
  144. package/dist/domItem/types.min.js +1 -0
  145. package/dist/events/functions/activateListener.d.ts +10 -0
  146. package/dist/events/functions/activateListener.js +45 -0
  147. package/dist/events/functions/activateListener.min.js +1 -0
  148. package/dist/events/functions/addEventListener.d.ts +23 -0
  149. package/dist/events/functions/addEventListener.js +54 -0
  150. package/dist/events/functions/addEventListener.min.js +1 -0
  151. package/dist/events/functions/applyActiveListeners.d.ts +9 -0
  152. package/dist/events/functions/applyActiveListeners.js +52 -0
  153. package/dist/events/functions/applyActiveListeners.min.js +1 -0
  154. package/dist/events/functions/assignListener.d.ts +12 -0
  155. package/dist/events/functions/assignListener.js +39 -0
  156. package/dist/events/functions/assignListener.min.js +1 -0
  157. package/dist/events/functions/bindAllListeners.d.ts +10 -0
  158. package/dist/events/functions/bindAllListeners.js +28 -0
  159. package/dist/events/functions/bindAllListeners.min.js +1 -0
  160. package/dist/events/functions/bindElementListeners.d.ts +7 -0
  161. package/dist/events/functions/bindElementListeners.js +34 -0
  162. package/dist/events/functions/bindElementListeners.min.js +1 -0
  163. package/dist/events/functions/bindListeners.d.ts +9 -0
  164. package/dist/events/functions/bindListeners.js +23 -0
  165. package/dist/events/functions/bindListeners.min.js +1 -0
  166. package/dist/events/functions/deactivateListener.d.ts +13 -0
  167. package/dist/events/functions/deactivateListener.js +58 -0
  168. package/dist/events/functions/deactivateListener.min.js +1 -0
  169. package/dist/events/functions/deactivateListeners.d.ts +7 -0
  170. package/dist/events/functions/deactivateListeners.js +22 -0
  171. package/dist/events/functions/deactivateListeners.min.js +1 -0
  172. package/dist/events/functions/findEventListener.d.ts +22 -0
  173. package/dist/events/functions/findEventListener.js +61 -0
  174. package/dist/events/functions/findEventListener.min.js +1 -0
  175. package/dist/events/functions/fullAddEventListener.d.ts +20 -0
  176. package/dist/events/functions/fullAddEventListener.js +45 -0
  177. package/dist/events/functions/fullAddEventListener.min.js +1 -0
  178. package/dist/events/functions/fullRemoveEventListener.d.ts +22 -0
  179. package/dist/events/functions/fullRemoveEventListener.js +37 -0
  180. package/dist/events/functions/fullRemoveEventListener.min.js +1 -0
  181. package/dist/events/functions/listenerOptions.d.ts +12 -0
  182. package/dist/events/functions/listenerOptions.js +31 -0
  183. package/dist/events/functions/listenerOptions.min.js +1 -0
  184. package/dist/events/functions/makeEventHandler.d.ts +10 -0
  185. package/dist/events/functions/makeEventHandler.js +23 -0
  186. package/dist/events/functions/makeEventHandler.min.js +1 -0
  187. package/dist/events/functions/makeForwardingListener.d.ts +11 -0
  188. package/dist/events/functions/makeForwardingListener.js +46 -0
  189. package/dist/events/functions/makeForwardingListener.min.js +1 -0
  190. package/dist/events/functions/receiveForwardedEvent.d.ts +23 -0
  191. package/dist/events/functions/receiveForwardedEvent.js +40 -0
  192. package/dist/events/functions/receiveForwardedEvent.min.js +1 -0
  193. package/dist/events/functions/registerListener.d.ts +11 -0
  194. package/dist/events/functions/registerListener.js +25 -0
  195. package/dist/events/functions/registerListener.min.js +1 -0
  196. package/dist/events/functions/registerListeners.d.ts +10 -0
  197. package/dist/events/functions/registerListeners.js +26 -0
  198. package/dist/events/functions/registerListeners.min.js +1 -0
  199. package/dist/events/functions/removeEventListener.d.ts +18 -0
  200. package/dist/events/functions/removeEventListener.js +42 -0
  201. package/dist/events/functions/removeEventListener.min.js +1 -0
  202. package/dist/events/functions/retrieveListener.d.ts +14 -0
  203. package/dist/events/functions/retrieveListener.js +39 -0
  204. package/dist/events/functions/retrieveListener.min.js +1 -0
  205. package/dist/events/functions/revokeActiveListeners.d.ts +12 -0
  206. package/dist/events/functions/revokeActiveListeners.js +54 -0
  207. package/dist/events/functions/revokeActiveListeners.min.js +1 -0
  208. package/dist/events/functions/setForwardEvents.d.ts +11 -0
  209. package/dist/events/functions/setForwardEvents.js +26 -0
  210. package/dist/events/functions/setForwardEvents.min.js +1 -0
  211. package/dist/events/functions/unassignListener.d.ts +12 -0
  212. package/dist/events/functions/unassignListener.js +32 -0
  213. package/dist/events/functions/unassignListener.min.js +1 -0
  214. package/dist/events/index.d.ts +37 -0
  215. package/dist/events/index.js +72 -0
  216. package/dist/events/index.min.js +1 -0
  217. package/dist/events/objects/createEventListener.d.ts +13 -0
  218. package/dist/events/objects/createEventListener.js +30 -0
  219. package/dist/events/objects/createEventListener.min.js +1 -0
  220. package/dist/events/objects/createEventProxy.d.ts +10 -0
  221. package/dist/events/objects/createEventProxy.js +48 -0
  222. package/dist/events/objects/createEventProxy.min.js +1 -0
  223. package/dist/events/objects/createEventResponder.d.ts +8 -0
  224. package/dist/events/objects/createEventResponder.js +27 -0
  225. package/dist/events/objects/createEventResponder.min.js +1 -0
  226. package/dist/events/objects/options/getListenerOptions.d.ts +6 -0
  227. package/dist/events/objects/options/getListenerOptions.js +22 -0
  228. package/dist/events/objects/options/getListenerOptions.min.js +1 -0
  229. package/dist/events/objects/options/numberToOptions.d.ts +8 -0
  230. package/dist/events/objects/options/numberToOptions.js +21 -0
  231. package/dist/events/objects/options/numberToOptions.min.js +1 -0
  232. package/dist/events/objects/options/optionsToNumber.d.ts +9 -0
  233. package/dist/events/objects/options/optionsToNumber.js +27 -0
  234. package/dist/events/objects/options/optionsToNumber.min.js +1 -0
  235. package/dist/events/objects/options.d.ts +6 -0
  236. package/dist/events/objects/options.js +24 -0
  237. package/dist/events/objects/options.min.js +1 -0
  238. package/dist/events/types.d.ts +87 -0
  239. package/dist/events/types.js +8 -0
  240. package/dist/events/types.min.js +1 -0
  241. package/dist/inflate/index.d.ts +4 -0
  242. package/dist/inflate/index.js +17 -0
  243. package/dist/inflate/index.min.js +1 -0
  244. package/dist/inflate/jsonToDomItem.d.ts +7 -0
  245. package/dist/inflate/jsonToDomItem.js +30 -0
  246. package/dist/inflate/jsonToDomItem.min.js +1 -0
  247. package/dist/main.d.ts +2 -0
  248. package/dist/main.js +24 -0
  249. package/dist/main.min.js +1 -0
  250. package/dist/render/generateElement.d.ts +7 -0
  251. package/dist/render/generateElement.js +41 -0
  252. package/dist/render/generateElement.min.js +1 -0
  253. package/dist/render/index.d.ts +8 -0
  254. package/dist/render/index.js +25 -0
  255. package/dist/render/index.min.js +1 -0
  256. package/dist/render/renderHtml.d.ts +16 -0
  257. package/dist/render/renderHtml.js +57 -0
  258. package/dist/render/renderHtml.min.js +1 -0
  259. package/dist/render/updateChildNodes.d.ts +7 -0
  260. package/dist/render/updateChildNodes.js +56 -0
  261. package/dist/render/updateChildNodes.min.js +1 -0
  262. package/dist/render/updateElement.d.ts +14 -0
  263. package/dist/render/updateElement.js +110 -0
  264. package/dist/render/updateElement.min.js +1 -0
  265. package/dist/render/updateElements.d.ts +9 -0
  266. package/dist/render/updateElements.js +33 -0
  267. package/dist/render/updateElements.min.js +1 -0
  268. package/dist/renderOnly.d.ts +2 -0
  269. package/dist/renderOnly.js +27 -0
  270. package/dist/renderOnly.min.js +1 -0
  271. package/dist/sync/index.d.ts +6 -0
  272. package/dist/sync/index.js +21 -0
  273. package/dist/sync/index.min.js +1 -0
  274. package/dist/sync/updateChildren.d.ts +7 -0
  275. package/dist/sync/updateChildren.js +38 -0
  276. package/dist/sync/updateChildren.min.js +1 -0
  277. package/dist/sync/updateDomItem.d.ts +8 -0
  278. package/dist/sync/updateDomItem.js +49 -0
  279. package/dist/sync/updateDomItem.min.js +1 -0
  280. package/dist/sync/updateDomItems.d.ts +9 -0
  281. package/dist/sync/updateDomItems.js +33 -0
  282. package/dist/sync/updateDomItems.min.js +1 -0
  283. package/package.json +74 -4
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+
3
+ /* This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
6
+ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
7
+ return mod && mod.__esModule ? mod : {
8
+ "default": mod
9
+ };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ const si_funciona_1 = __importDefault(require("si-funciona"));
15
+ const elementHasAttribute_1 = __importDefault(require("./elementHasAttribute"));
16
+ const createChangeList_1 = __importDefault(require("./createChangeList"));
17
+ /**
18
+ * Given some config, provide a function to testing attribute and key existence in that config.
19
+ * @param element
20
+ */
21
+ const checkAttribute = element => (attr, key) => {
22
+ if (typeof attr === 'object') {
23
+ const styles = attr;
24
+ const elementStyle = () => element.style;
25
+ const styleDiff = (0, elementHasAttribute_1.default)(element, key, attr);
26
+ if (Array.isArray(styleDiff) && styleDiff.length === 1 && styleDiff[0].result[0] === 0 && elementStyle()[styleDiff[0].value] === styles[styleDiff[0].value]) {
27
+ return 0;
28
+ }
29
+ // Check new, removed, or changed styles
30
+ return si_funciona_1.default.filterObject(styleDiff, arrayDiff => arrayDiff.result[0] !== 0 || elementStyle()[arrayDiff.value] !== styles[arrayDiff.value]);
31
+ }
32
+ if (key === 'class') {
33
+ const classDiff = (0, elementHasAttribute_1.default)(element, key, attr);
34
+ if (Array.isArray(classDiff) && classDiff.length === 1 && classDiff[0].result[0] === 0) {
35
+ return 0;
36
+ }
37
+ return si_funciona_1.default.filterObject(classDiff, arrayDiff => arrayDiff.result[0] !== 0);
38
+ }
39
+ return (0, elementHasAttribute_1.default)(element, key, attr);
40
+ };
41
+ /**
42
+ * Updates all the keys to be kabob-case
43
+ * @param attributesToSet
44
+ */
45
+ const kabobCaseAttributes = attributesToSet => si_funciona_1.default.reduceObject(attributesToSet, (attributes, value, name) => {
46
+ let attrValue = attributesToSet[name] ?? value;
47
+ if (si_funciona_1.default.isObject(attrValue)) {
48
+ attrValue = kabobCaseAttributes(attrValue);
49
+ }
50
+ const kabobKey = name === 'className' ? 'class' : si_funciona_1.default.kabobCase(name);
51
+ attributes[kabobKey] = attrValue;
52
+ return attributes;
53
+ }, {});
54
+ /**
55
+ * Find the name an attribute was given on the item from its kabob-case name: innerHTML is compared as inner-html, and
56
+ * camelCase cannot turn that back into innerHTML.
57
+ * @private
58
+ */
59
+ const attributeName = (attributes, kabobKey) => Object.keys(attributes).find(name => (name === 'className' ? 'class' : si_funciona_1.default.kabobCase(name)) === kabobKey) ?? si_funciona_1.default.camelCase(kabobKey);
60
+ /**
61
+ * Given a domGeneral.DomItem as domItem, this function will return the changes to be applied
62
+ * to the stored element property.
63
+ * @param domItem - The DomItem having changes to be applied to its element
64
+ */
65
+ const domItemChanges = domItem => {
66
+ const changeList = (0, createChangeList_1.default)();
67
+ if (!domItem.element) {
68
+ changeList.added.nodeName = domItem.nodeName.toLowerCase();
69
+ }
70
+ if (domItem.element && domItem.element.nodeName.toLowerCase() !== domItem.nodeName.toLowerCase()) {
71
+ // This should trigger new element creation
72
+ changeList.removed.nodeName = domItem.element.nodeName.toLowerCase();
73
+ changeList.added.nodeName = domItem.nodeName.toLowerCase();
74
+ }
75
+ if (domItem.nodeValue !== null) {
76
+ if (!si_funciona_1.default.emptyObject(domItem.attributes)) {
77
+ changeList.added = changeList.appendChanges('added', si_funciona_1.default.dotNotate(domItem.attributes));
78
+ }
79
+ if (!domItem.element) {
80
+ changeList.added.nodeValue = domItem.nodeValue;
81
+ return changeList;
82
+ }
83
+ changeList.removed.nodeValue = domItem.element.nodeValue;
84
+ if (domItem.element.nodeValue !== domItem.nodeValue) {
85
+ changeList.added.nodeValue = domItem.nodeValue;
86
+ }
87
+ return changeList;
88
+ }
89
+ const domItemAttributes = kabobCaseAttributes(domItem.attributes);
90
+ const diffMap = si_funciona_1.default.mapObject(domItemAttributes, (attr, key) => checkAttribute(domItem.element)(attr, key));
91
+ return si_funciona_1.default.reduceObject(diffMap, (changed, result, key) => {
92
+ const isArray = Array.isArray(result);
93
+ if (!isArray && !result) {
94
+ // Skip if the attribute is not changed (false and not an array)
95
+ return changed;
96
+ }
97
+ if (!isArray && key === 'class') {
98
+ // Full class name string set
99
+ changed.added.className = domItem.attributes.className;
100
+ return changed;
101
+ }
102
+ if (!isArray) {
103
+ // Not an array, simply set the attribute as added
104
+ const name = attributeName(domItem.attributes, key);
105
+ // A property of the element (innerHTML) is set by its own name, anything else as an attribute (aria-label)
106
+ const element = domItem.element;
107
+ changed.added[element && name in element && name !== 'form' ? name : key] = domItem.attributes[name];
108
+ return changed;
109
+ }
110
+ if (key !== 'class' && key !== 'style') {
111
+ // Is an array, but not class or style; we don't know what this is, so we skip it.
112
+ return changed;
113
+ }
114
+ if (key === 'class') {
115
+ changed.removed = result.reduce((removed, results) => {
116
+ if (results.result[0] === -1) {
117
+ removed[`class.${results.keys[1]}`] = results.value;
118
+ }
119
+ return removed;
120
+ }, changed.removed);
121
+ changed.added = result.reduce((added, results) => {
122
+ if (results.result[0] === 1) {
123
+ added[`class.${results.keys[0]}`] = results.value;
124
+ }
125
+ return added;
126
+ }, changed.added);
127
+ return changed;
128
+ }
129
+ const elementStyle = () => domItem.element.style;
130
+ changed.removed = result.reduce((removed, results) => {
131
+ if (!domItem.element) {
132
+ return removed;
133
+ }
134
+ if (results.result[0] === -1) {
135
+ removed[`style.${results.value}`] = elementStyle()[results.value];
136
+ }
137
+ if (results.result[0] === 0 && elementStyle()[results.value] !== domItemAttributes.style[results.value]) {
138
+ removed[`style.${results.value}`] = elementStyle()[results.value];
139
+ }
140
+ return removed;
141
+ }, changed.removed);
142
+ changed.added = result.reduce((added, results) => {
143
+ if (results.result[0] === 1) {
144
+ added[`style.${results.value}`] = domItemAttributes.style[results.value];
145
+ }
146
+ if (results.result[0] === 0 && elementStyle()[results.value] !== domItemAttributes.style[results.value]) {
147
+ added[`style.${results.value}`] = domItemAttributes.style[results.value];
148
+ }
149
+ return added;
150
+ }, changed.added);
151
+ return changed;
152
+ }, changeList);
153
+ };
154
+ exports.default = domItemChanges;
@@ -0,0 +1 @@
1
+ "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const si_funciona_1=__importDefault(require("si-funciona")),elementHasAttribute_1=__importDefault(require("./elementHasAttribute")),createChangeList_1=__importDefault(require("./createChangeList")),checkAttribute=e=>(t,a)=>{if("object"==typeof t){const u=t,s=()=>e.style,l=(0,elementHasAttribute_1.default)(e,a,t);return Array.isArray(l)&&1===l.length&&0===l[0].result[0]&&s()[l[0].value]===u[l[0].value]?0:si_funciona_1.default.filterObject(l,e=>0!==e.result[0]||s()[e.value]!==u[e.value])}if("class"===a){const u=(0,elementHasAttribute_1.default)(e,a,t);return Array.isArray(u)&&1===u.length&&0===u[0].result[0]?0:si_funciona_1.default.filterObject(u,e=>0!==e.result[0])}return(0,elementHasAttribute_1.default)(e,a,t)},kabobCaseAttributes=e=>si_funciona_1.default.reduceObject(e,(t,a,u)=>{let s=e[u]??a;si_funciona_1.default.isObject(s)&&(s=kabobCaseAttributes(s));return t["className"===u?"class":si_funciona_1.default.kabobCase(u)]=s,t},{}),attributeName=(e,t)=>Object.keys(e).find(e=>("className"===e?"class":si_funciona_1.default.kabobCase(e))===t)??si_funciona_1.default.camelCase(t),domItemChanges=e=>{const t=(0,createChangeList_1.default)();if(e.element||(t.added.nodeName=e.nodeName.toLowerCase()),e.element&&e.element.nodeName.toLowerCase()!==e.nodeName.toLowerCase()&&(t.removed.nodeName=e.element.nodeName.toLowerCase(),t.added.nodeName=e.nodeName.toLowerCase()),null!==e.nodeValue)return si_funciona_1.default.emptyObject(e.attributes)||(t.added=t.appendChanges("added",si_funciona_1.default.dotNotate(e.attributes))),e.element?(t.removed.nodeValue=e.element.nodeValue,e.element.nodeValue!==e.nodeValue&&(t.added.nodeValue=e.nodeValue),t):(t.added.nodeValue=e.nodeValue,t);const a=kabobCaseAttributes(e.attributes),u=si_funciona_1.default.mapObject(a,(t,a)=>checkAttribute(e.element)(t,a));return si_funciona_1.default.reduceObject(u,(t,u,s)=>{const l=Array.isArray(u);if(!l&&!u)return t;if(!l&&"class"===s)return t.added.className=e.attributes.className,t;if(!l){const a=attributeName(e.attributes,s),u=e.element;return t.added[u&&a in u&&"form"!==a?a:s]=e.attributes[a],t}if("class"!==s&&"style"!==s)return t;if("class"===s)return t.removed=u.reduce((e,t)=>(-1===t.result[0]&&(e[`class.${t.keys[1]}`]=t.value),e),t.removed),t.added=u.reduce((e,t)=>(1===t.result[0]&&(e[`class.${t.keys[0]}`]=t.value),e),t.added),t;const r=()=>e.element.style;return t.removed=u.reduce((t,u)=>e.element?(-1===u.result[0]&&(t[`style.${u.value}`]=r()[u.value]),0===u.result[0]&&r()[u.value]!==a.style[u.value]&&(t[`style.${u.value}`]=r()[u.value]),t):t,t.removed),t.added=u.reduce((e,t)=>(1===t.result[0]&&(e[`style.${t.value}`]=a.style[t.value]),0===t.result[0]&&r()[t.value]!==a.style[t.value]&&(e[`style.${t.value}`]=a.style[t.value]),e),t.added),t},t)};exports.default=domItemChanges;
@@ -0,0 +1,11 @@
1
+ import type { DomItem } from '../domItem/types';
2
+ import type { AttributeComparison } from './types';
3
+ /**
4
+ * Check if the provided DomItem has the provided attributes.
5
+ * Returns a boolean, or an array of 1 / 0 / -1 based on the comparison status.
6
+ * @param domItem - Receive the DomItem to be assessed
7
+ * @param key - The attribute name to search for
8
+ * @param attr - The expected value of the attribute to compare against
9
+ */
10
+ declare const domItemHasAttribute: (domItem: DomItem, key: string, attr: unknown) => AttributeComparison;
11
+ export default domItemHasAttribute;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ /* This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
6
+ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
7
+ return mod && mod.__esModule ? mod : {
8
+ "default": mod
9
+ };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ const si_funciona_1 = __importDefault(require("si-funciona"));
15
+ const getAssignedStyles_1 = __importDefault(require("./getAssignedStyles"));
16
+ /**
17
+ * For attributes which are objects or multi-part strings -1 = remove attribute, 0 = no change, 1 = add attribute
18
+ * @param domItem
19
+ * @param attr
20
+ */
21
+ const checkStyles = (domItem, attr = {}) => {
22
+ const assignedStyles = domItem.attributes.style ?? {};
23
+ if (si_funciona_1.default.emptyObject(assignedStyles)) {
24
+ return 1;
25
+ }
26
+ return si_funciona_1.default.compareArrays(Object.keys((0, getAssignedStyles_1.default)(attr)).map(si_funciona_1.default.camelCase), Object.keys(assignedStyles));
27
+ };
28
+ /**
29
+ * For attributes which are objects or multipart strings -1 = remove attribute, 0 = no change, 1 = add attribute
30
+ * @param domItem
31
+ * @param attr
32
+ */
33
+ const checkClasses = (domItem, attr = '') => {
34
+ const assignedClasses = domItem.attributes.className ?? '';
35
+ if (!assignedClasses.length) {
36
+ return 1;
37
+ }
38
+ return si_funciona_1.default.compareArrays(attr.split(' '), assignedClasses.split(' '));
39
+ };
40
+ /**
41
+ * Check if the provided DomItem has the provided attributes.
42
+ * Returns a boolean, or an array of 1 / 0 / -1 based on the comparison status.
43
+ * @param domItem - Receive the DomItem to be assessed
44
+ * @param key - The attribute name to search for
45
+ * @param attr - The expected value of the attribute to compare against
46
+ */
47
+ const domItemHasAttribute = (domItem, key, attr) => {
48
+ if (key === 'style') {
49
+ return checkStyles(domItem, attr);
50
+ }
51
+ if (key === 'className') {
52
+ return checkClasses(domItem, attr);
53
+ }
54
+ const camelKey = si_funciona_1.default.camelCase(key);
55
+ if (typeof domItem.attributes[camelKey] === 'undefined') {
56
+ return 1;
57
+ }
58
+ if (domItem.attributes[camelKey] === attr) {
59
+ return 0;
60
+ }
61
+ return 1;
62
+ };
63
+ exports.default = domItemHasAttribute;
@@ -0,0 +1 @@
1
+ "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const si_funciona_1=__importDefault(require("si-funciona")),getAssignedStyles_1=__importDefault(require("./getAssignedStyles")),checkStyles=(e,t={})=>{const s=e.attributes.style??{};return si_funciona_1.default.emptyObject(s)?1:si_funciona_1.default.compareArrays(Object.keys((0,getAssignedStyles_1.default)(t)).map(si_funciona_1.default.camelCase),Object.keys(s))},checkClasses=(e,t="")=>{const s=e.attributes.className??"";return s.length?si_funciona_1.default.compareArrays(t.split(" "),s.split(" ")):1},domItemHasAttribute=(e,t,s)=>{if("style"===t)return checkStyles(e,s);if("className"===t)return checkClasses(e,s);const a=si_funciona_1.default.camelCase(t);return void 0===e.attributes[a]?1:e.attributes[a]===s?0:1};exports.default=domItemHasAttribute;
@@ -0,0 +1,10 @@
1
+ import type { DomItem } from '../domItem/types';
2
+ import type { ChangeList } from './types';
3
+ /**
4
+ * Given a domGeneral.DomItem as config, this function will return the changes from the element
5
+ * to be applied to the domItem.
6
+ * @param domItem - The DomItem having the element which changes to be applied to the config
7
+ * element
8
+ */
9
+ declare const elementChanges: (domItem: DomItem) => ChangeList;
10
+ export default elementChanges;
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ /* This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
6
+ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
7
+ return mod && mod.__esModule ? mod : {
8
+ "default": mod
9
+ };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ const si_funciona_1 = __importDefault(require("si-funciona"));
15
+ const domItemHasAttribute_1 = __importDefault(require("./domItemHasAttribute"));
16
+ const createChangeList_1 = __importDefault(require("./createChangeList"));
17
+ /**
18
+ * Given some config, provide a function to testing attribute and key existence in that config.
19
+ * @param domItem
20
+ */
21
+ const checkAttribute = domItem => (attr, key) => {
22
+ if (key === 'className') {
23
+ const diff = (0, domItemHasAttribute_1.default)(domItem, key, attr);
24
+ if (Array.isArray(diff) && diff.length === 1 && diff[0].result[0] === 0) {
25
+ return 0;
26
+ }
27
+ return si_funciona_1.default.filterObject(diff, arrayDiff => arrayDiff.result[0] !== 0);
28
+ }
29
+ if (key === 'style') {
30
+ const diff = (0, domItemHasAttribute_1.default)(domItem, key, attr);
31
+ const styles = attr;
32
+ const itemStyle = () => domItem.attributes.style;
33
+ if (Array.isArray(diff) && diff.length === 1 && diff[0].result[0] === 0 && itemStyle()[diff[0].value] === styles[diff[0].value]) {
34
+ return 0;
35
+ }
36
+ return si_funciona_1.default.filterObject(diff, arrayDiff => arrayDiff.result[0] !== 0 || itemStyle()[arrayDiff.value] !== styles[arrayDiff.value]);
37
+ }
38
+ return (0, domItemHasAttribute_1.default)(domItem, key, attr);
39
+ };
40
+ /**
41
+ * Updates all the keys to be camelCase
42
+ * @param domItem
43
+ */
44
+ const camelCaseAttributes = domItem => domItem.element ? si_funciona_1.default.reduceObject(domItem.element.attributes, (attributes, attr) => {
45
+ if (!attr.name) {
46
+ return attributes;
47
+ }
48
+ const camelKey = attr.name === 'class' ? 'className' : si_funciona_1.default.camelCase(attr.name);
49
+ const attributeValue = domItem.element[attr.name] ?? attr.value;
50
+ if (typeof attributeValue === 'undefined') {
51
+ return attributes;
52
+ }
53
+ attributes[camelKey] = attributeValue;
54
+ return attributes;
55
+ }, {}) : {};
56
+ /**
57
+ * Given a domGeneral.DomItem as config, this function will return the changes from the element
58
+ * to be applied to the domItem.
59
+ * @param domItem - The DomItem having the element which changes to be applied to the config
60
+ * element
61
+ */
62
+ const elementChanges = domItem => {
63
+ const changeList = (0, createChangeList_1.default)();
64
+ if (!domItem.element) {
65
+ changeList.removed.nodeName = domItem.nodeName.toLowerCase();
66
+ }
67
+ if (domItem.element && domItem.element.nodeName.toLowerCase() !== domItem.nodeName.toLowerCase()) {
68
+ changeList.removed.nodeName = domItem.nodeName.toLowerCase();
69
+ changeList.added.nodeName = domItem.element.nodeName.toLowerCase();
70
+ }
71
+ if (!domItem.element && domItem.nodeValue !== null) {
72
+ changeList.removed.nodeValue = domItem.nodeValue;
73
+ if (!si_funciona_1.default.emptyObject(domItem.attributes)) {
74
+ changeList.removed = changeList.appendChanges('removed', si_funciona_1.default.dotNotate({
75
+ attributes: domItem.attributes
76
+ }));
77
+ }
78
+ return changeList;
79
+ }
80
+ if (domItem.element && !(domItem.element instanceof Element)) {
81
+ if (domItem.element.nodeValue !== domItem.nodeValue) {
82
+ changeList.added.nodeValue = domItem.element.nodeValue;
83
+ }
84
+ if (!si_funciona_1.default.emptyObject(domItem.attributes)) {
85
+ changeList.removed = changeList.appendChanges('removed', si_funciona_1.default.dotNotate({
86
+ attributes: domItem.attributes
87
+ }));
88
+ }
89
+ return changeList;
90
+ }
91
+ if (!(domItem.element && domItem.element.hasAttributes()) && !si_funciona_1.default.emptyObject(domItem.attributes)) {
92
+ changeList.removed = changeList.appendChanges('removed', si_funciona_1.default.dotNotate({
93
+ attributes: domItem.attributes
94
+ }));
95
+ return changeList;
96
+ }
97
+ const elementAttributes = camelCaseAttributes(domItem);
98
+ const diffMap = si_funciona_1.default.mapObject(elementAttributes, (attr, key) => checkAttribute(domItem)(attr, key));
99
+ return si_funciona_1.default.reduceObject(diffMap, (changed, result, key) => {
100
+ const isArray = Array.isArray(result);
101
+ if (!isArray && !result) {
102
+ // Skip if the attribute is not changed (false and not an array)
103
+ return changed;
104
+ }
105
+ if (!isArray) {
106
+ // Not an array, simply set the attribute as added
107
+ changed.added[`attributes.${key}`] = domItem.element[key] ?? domItem.element.getAttribute(si_funciona_1.default.kabobCase(key));
108
+ return changed;
109
+ }
110
+ if (key !== 'className' && key !== 'style') {
111
+ // Is an array, but not class or style; we don't know what this is, so we skip it.
112
+ return changed;
113
+ }
114
+ if (key === 'className') {
115
+ changed.removed = result.reduce((removed, results) => {
116
+ if (results.result[0] === -1) {
117
+ removed[`attributes.className.${results.keys[1]}`] = results.value;
118
+ }
119
+ return removed;
120
+ }, changed.removed);
121
+ changed.added = result.reduce((added, results) => {
122
+ if (results.result[0] === 1) {
123
+ added[`attributes.className.${results.keys[0]}`] = results.value;
124
+ }
125
+ return added;
126
+ }, changed.added);
127
+ return changed;
128
+ }
129
+ const itemStyle = () => domItem.attributes.style;
130
+ changed.removed = result.reduce((removed, results) => {
131
+ if (results.result[0] === -1) {
132
+ removed[`attributes.style.${results.value}`] = itemStyle()[results.value];
133
+ }
134
+ if (results.result[0] === 0 && itemStyle()[results.value] !== elementAttributes.style[results.value]) {
135
+ removed[`attributes.style.${results.value}`] = itemStyle()[results.value];
136
+ }
137
+ return removed;
138
+ }, changed.removed);
139
+ changed.added = result.reduce((added, results) => {
140
+ if (results.result[0] === 1) {
141
+ added[`attributes.style.${results.value}`] = elementAttributes.style[results.value];
142
+ }
143
+ if (results.result[0] === 0 && itemStyle()[results.value] !== elementAttributes.style[results.value]) {
144
+ added[`attributes.style.${results.value}`] = elementAttributes.style[results.value];
145
+ }
146
+ return added;
147
+ }, changed.added);
148
+ return changed;
149
+ }, changeList);
150
+ };
151
+ exports.default = elementChanges;
@@ -0,0 +1 @@
1
+ "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const si_funciona_1=__importDefault(require("si-funciona")),domItemHasAttribute_1=__importDefault(require("./domItemHasAttribute")),createChangeList_1=__importDefault(require("./createChangeList")),checkAttribute=e=>(t,a)=>{if("className"===a){const u=(0,domItemHasAttribute_1.default)(e,a,t);return Array.isArray(u)&&1===u.length&&0===u[0].result[0]?0:si_funciona_1.default.filterObject(u,e=>0!==e.result[0])}if("style"===a){const u=(0,domItemHasAttribute_1.default)(e,a,t),r=t,s=()=>e.attributes.style;return Array.isArray(u)&&1===u.length&&0===u[0].result[0]&&s()[u[0].value]===r[u[0].value]?0:si_funciona_1.default.filterObject(u,e=>0!==e.result[0]||s()[e.value]!==r[e.value])}return(0,domItemHasAttribute_1.default)(e,a,t)},camelCaseAttributes=e=>e.element?si_funciona_1.default.reduceObject(e.element.attributes,(t,a)=>{if(!a.name)return t;const u="class"===a.name?"className":si_funciona_1.default.camelCase(a.name),r=e.element[a.name]??a.value;return void 0===r||(t[u]=r),t},{}):{},elementChanges=e=>{const t=(0,createChangeList_1.default)();if(e.element||(t.removed.nodeName=e.nodeName.toLowerCase()),e.element&&e.element.nodeName.toLowerCase()!==e.nodeName.toLowerCase()&&(t.removed.nodeName=e.nodeName.toLowerCase(),t.added.nodeName=e.element.nodeName.toLowerCase()),!e.element&&null!==e.nodeValue)return t.removed.nodeValue=e.nodeValue,si_funciona_1.default.emptyObject(e.attributes)||(t.removed=t.appendChanges("removed",si_funciona_1.default.dotNotate({attributes:e.attributes}))),t;if(e.element&&!(e.element instanceof Element))return e.element.nodeValue!==e.nodeValue&&(t.added.nodeValue=e.element.nodeValue),si_funciona_1.default.emptyObject(e.attributes)||(t.removed=t.appendChanges("removed",si_funciona_1.default.dotNotate({attributes:e.attributes}))),t;if(!(e.element&&e.element.hasAttributes()||si_funciona_1.default.emptyObject(e.attributes)))return t.removed=t.appendChanges("removed",si_funciona_1.default.dotNotate({attributes:e.attributes})),t;const a=camelCaseAttributes(e),u=si_funciona_1.default.mapObject(a,(t,a)=>checkAttribute(e)(t,a));return si_funciona_1.default.reduceObject(u,(t,u,r)=>{const s=Array.isArray(u);if(!s&&!u)return t;if(!s)return t.added[`attributes.${r}`]=e.element[r]??e.element.getAttribute(si_funciona_1.default.kabobCase(r)),t;if("className"!==r&&"style"!==r)return t;if("className"===r)return t.removed=u.reduce((e,t)=>(-1===t.result[0]&&(e[`attributes.className.${t.keys[1]}`]=t.value),e),t.removed),t.added=u.reduce((e,t)=>(1===t.result[0]&&(e[`attributes.className.${t.keys[0]}`]=t.value),e),t.added),t;const n=()=>e.attributes.style;return t.removed=u.reduce((e,t)=>(-1===t.result[0]&&(e[`attributes.style.${t.value}`]=n()[t.value]),0===t.result[0]&&n()[t.value]!==a.style[t.value]&&(e[`attributes.style.${t.value}`]=n()[t.value]),e),t.removed),t.added=u.reduce((e,t)=>(1===t.result[0]&&(e[`attributes.style.${t.value}`]=a.style[t.value]),0===t.result[0]&&n()[t.value]!==a.style[t.value]&&(e[`attributes.style.${t.value}`]=a.style[t.value]),e),t.added),t},t)};exports.default=elementChanges;
@@ -0,0 +1,10 @@
1
+ import type { AttributeComparison } from './types';
2
+ /**
3
+ * Check if the provided Element has the provided attributes.
4
+ * Returns a boolean, or an array of 1 / 0 / -1 based on the comparison status.
5
+ * @param element - Receive the element to be assessed
6
+ * @param key - The attribute name to search for
7
+ * @param attr - The expected value of the attribute to compare against
8
+ */
9
+ declare const elementHasAttribute: (element: HTMLElement | null | undefined, key: string, attr: unknown) => AttributeComparison;
10
+ export default elementHasAttribute;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ /* This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
6
+ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
7
+ return mod && mod.__esModule ? mod : {
8
+ "default": mod
9
+ };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ const getAssignedStyles_1 = __importDefault(require("./getAssignedStyles"));
15
+ const si_funciona_1 = __importDefault(require("si-funciona"));
16
+ /**
17
+ * For attributes which are objects or multi-part strings -1 = remove attribute, 0 = no change, 1 = add attribute
18
+ * @param element
19
+ * @param attr
20
+ */
21
+ const checkStyles = (element, attr = {}) => {
22
+ const assignedStyles = (0, getAssignedStyles_1.default)(element.style) ?? {};
23
+ if (si_funciona_1.default.emptyObject(assignedStyles)) {
24
+ return 1;
25
+ }
26
+ return si_funciona_1.default.compareArrays(Object.keys(attr).map(si_funciona_1.default.kabobCase), Object.keys(assignedStyles));
27
+ };
28
+ /**
29
+ * For attributes which are objects or multi-part strings -1 = remove attribute, 0 = no change, 1 = add attribute
30
+ * @param element
31
+ * @param attr
32
+ */
33
+ const checkClasses = (element, attr = '') => {
34
+ if (typeof attr !== 'string') {
35
+ // Somehow an empty object got in here one time
36
+ attr = '';
37
+ }
38
+ const assignedClasses = Array.from(element.classList);
39
+ if (!assignedClasses.length) {
40
+ return 1;
41
+ }
42
+ return si_funciona_1.default.compareArrays(attr.split(' '), assignedClasses);
43
+ };
44
+ /**
45
+ * Check if the provided Element has the provided attributes.
46
+ * Returns a boolean, or an array of 1 / 0 / -1 based on the comparison status.
47
+ * @param element - Receive the element to be assessed
48
+ * @param key - The attribute name to search for
49
+ * @param attr - The expected value of the attribute to compare against
50
+ */
51
+ const elementHasAttribute = (element, key, attr) => {
52
+ if (!element) {
53
+ return 1;
54
+ }
55
+ if (key === 'style') {
56
+ return checkStyles(element, attr);
57
+ }
58
+ if (key === 'class') {
59
+ return checkClasses(element, attr);
60
+ }
61
+ const kabobKey = si_funciona_1.default.kabobCase(key);
62
+ if (!element.hasAttribute(kabobKey)) {
63
+ return 1;
64
+ }
65
+ if (element.getAttribute(kabobKey) === attr) {
66
+ return 0;
67
+ }
68
+ return 1;
69
+ };
70
+ exports.default = elementHasAttribute;
@@ -0,0 +1 @@
1
+ "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const getAssignedStyles_1=__importDefault(require("./getAssignedStyles")),si_funciona_1=__importDefault(require("si-funciona")),checkStyles=(e,t={})=>{const s=(0,getAssignedStyles_1.default)(e.style)??{};return si_funciona_1.default.emptyObject(s)?1:si_funciona_1.default.compareArrays(Object.keys(t).map(si_funciona_1.default.kabobCase),Object.keys(s))},checkClasses=(e,t="")=>{"string"!=typeof t&&(t="");const s=Array.from(e.classList);return s.length?si_funciona_1.default.compareArrays(t.split(" "),s):1},elementHasAttribute=(e,t,s)=>{if(!e)return 1;if("style"===t)return checkStyles(e,s);if("class"===t)return checkClasses(e,s);const r=si_funciona_1.default.kabobCase(t);return e.hasAttribute(r)&&e.getAttribute(r)===s?0:1};exports.default=elementHasAttribute;
@@ -0,0 +1,9 @@
1
+ import type { StyleValues } from '../domItem/types';
2
+ /**
3
+ * Get all the styles which have been assigned to this element. Assigned styles are indicated as numeric-key
4
+ * properties with a value indicating the string-key property which has been assigned. The string-key properties
5
+ * have the assigned values.
6
+ * @param elementStyles
7
+ */
8
+ declare const getAssignedStyles: (elementStyles: CSSStyleDeclaration | StyleValues) => StyleValues;
9
+ export default getAssignedStyles;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ /* This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
6
+ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
7
+ return mod && mod.__esModule ? mod : {
8
+ "default": mod
9
+ };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ const si_funciona_1 = __importDefault(require("si-funciona"));
15
+ /**
16
+ * Get all the styles which have been assigned to this element. Assigned styles are indicated as numeric-key
17
+ * properties with a value indicating the string-key property which has been assigned. The string-key properties
18
+ * have the assigned values.
19
+ * @param elementStyles
20
+ */
21
+ const getAssignedStyles = elementStyles => si_funciona_1.default.reduceObject(elementStyles, (styles, attr, key) => Number.isNaN(Number(key)) ? styles : si_funciona_1.default.setValue(attr, elementStyles[attr], styles), {});
22
+ exports.default = getAssignedStyles;
@@ -0,0 +1 @@
1
+ "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const si_funciona_1=__importDefault(require("si-funciona")),getAssignedStyles=e=>si_funciona_1.default.reduceObject(e,(t,u,s)=>Number.isNaN(Number(s))?t:si_funciona_1.default.setValue(u,e[u],t),{});exports.default=getAssignedStyles;
@@ -0,0 +1,9 @@
1
+ declare const _default: {
2
+ createChangeList: ({ removed, added }?: Partial<Pick<import("./types").ChangeList, "removed" | "added">>) => import("./types").ChangeList;
3
+ domItemChanges: (domItem: import("../domItem/types").DomItem) => import("./types").ChangeList;
4
+ domItemHasAttribute: (domItem: import("../domItem/types").DomItem, key: string, attr: unknown) => import("./types").AttributeComparison;
5
+ elementChanges: (domItem: import("../domItem/types").DomItem) => import("./types").ChangeList;
6
+ elementHasAttribute: (element: HTMLElement | null | undefined, key: string, attr: unknown) => import("./types").AttributeComparison;
7
+ getAssignedStyles: (elementStyles: CSSStyleDeclaration | import("../domItem/types").StyleValues) => import("../domItem/types").StyleValues;
8
+ };
9
+ export default _default;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ /* This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
6
+ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
7
+ return mod && mod.__esModule ? mod : {
8
+ "default": mod
9
+ };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ const createChangeList_1 = __importDefault(require("./createChangeList"));
15
+ const domItemChanges_1 = __importDefault(require("./domItemChanges"));
16
+ const domItemHasAttribute_1 = __importDefault(require("./domItemHasAttribute"));
17
+ const elementChanges_1 = __importDefault(require("./elementChanges"));
18
+ const elementHasAttribute_1 = __importDefault(require("./elementHasAttribute"));
19
+ const getAssignedStyles_1 = __importDefault(require("./getAssignedStyles"));
20
+ exports.default = {
21
+ createChangeList: createChangeList_1.default,
22
+ domItemChanges: domItemChanges_1.default,
23
+ domItemHasAttribute: domItemHasAttribute_1.default,
24
+ elementChanges: elementChanges_1.default,
25
+ elementHasAttribute: elementHasAttribute_1.default,
26
+ getAssignedStyles: getAssignedStyles_1.default
27
+ };
@@ -0,0 +1 @@
1
+ "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const createChangeList_1=__importDefault(require("./createChangeList")),domItemChanges_1=__importDefault(require("./domItemChanges")),domItemHasAttribute_1=__importDefault(require("./domItemHasAttribute")),elementChanges_1=__importDefault(require("./elementChanges")),elementHasAttribute_1=__importDefault(require("./elementHasAttribute")),getAssignedStyles_1=__importDefault(require("./getAssignedStyles"));exports.default={createChangeList:createChangeList_1.default,domItemChanges:domItemChanges_1.default,domItemHasAttribute:domItemHasAttribute_1.default,elementChanges:elementChanges_1.default,elementHasAttribute:elementHasAttribute_1.default,getAssignedStyles:getAssignedStyles_1.default};
@@ -0,0 +1,17 @@
1
+ import type { compareArrayResultMap } from 'si-funciona/dist/helpers/arrays/compareArrays';
2
+ /** An object whose keys are dot notated paths (attributes.style.color) and whose values are what is at that path. */
3
+ export type DotNotated = Record<string, any>;
4
+ /** Which of the two lists a change is appended to. */
5
+ export type ChangeType = 'added' | 'removed';
6
+ /** What has to be added and removed to make one side match the other. */
7
+ export type ChangeList = {
8
+ removed: DotNotated;
9
+ added: DotNotated;
10
+ /** Merge more changes into the removed or added list, and return the merged list. */
11
+ appendChanges: (changeType: ChangeType, changes: DotNotated) => DotNotated;
12
+ };
13
+ /**
14
+ * The outcome of comparing one attribute: 0 when it is the same, 1 when it is missing or different, or - for the
15
+ * multi-part attributes (style, class) - the list of what each part of it looks like (see compareArrays).
16
+ */
17
+ export type AttributeComparison = 0 | 1 | compareArrayResultMap;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ /* This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});
@@ -0,0 +1,34 @@
1
+ declare const _default: {
2
+ addDomItemProperties: (item: import("./types").DomItemConfig) => import("./types").DomItem;
3
+ appendChild: (parent: import("./types").DomItem, child: import("./types").DomItem) => import("./types").DomItem;
4
+ createCoreItem: (item?: import("./types").DomItemConfig) => import("./types").CoreItem;
5
+ createDomItem: (item?: import("./types").DomItemConfig) => import("./types").DomItem;
6
+ defineTrait: (name: string, definition: import("./types").TraitDefinition) => import("./types").TraitDefinition;
7
+ documentDomItem: (listeners?: Record<string, import("../events/types").ListenerFunction>, rootItem?: import("./types").DomItemRoot) => import("./types").DomItemRoot;
8
+ getDocumentItem: () => import("./types").DomItemRoot;
9
+ gatherChildItems: (item: import("./types").DomItem, test: import("./types").ChildTest) => import("./types").DomItem[];
10
+ getChildrenByClass: (className: string, item?: import("./types").DomItem) => import("./types").DomItem[];
11
+ getChildrenByName: (name: string, item?: import("./types").DomItem) => import("./types").DomItem[];
12
+ getChildrenFromAttribute: (attr: string, value: unknown, item?: import("./types").DomItem) => import("./types").DomItem[];
13
+ getChildTest: (attr: string, value: unknown) => import("./types").ChildTest;
14
+ getItemByElement: (item: import("./types").DomItem, element: EventTarget | null) => import("./types").DomItem | null;
15
+ getItemById: (root: import("./types").DomItemRoot, id: number) => import("./types").DomItem;
16
+ getItemByPath: (root: import("./types").DomItem, path: import("./types").ItemPath) => import("./types").DomItem;
17
+ getItemPath: (item: import("./types").DomItem) => import("./types").ItemPath;
18
+ getParentsByClass: (className: string, item?: import("./types").DomItem) => import("./types").DomItem[];
19
+ getParentsByName: (name: string, item?: import("./types").DomItem) => import("./types").DomItem[];
20
+ getParentsByTagName: (nodeName: string, item?: import("./types").DomItem) => import("./types").DomItem[];
21
+ getParentsFromAttribute: (attr: string, value: unknown, item?: import("./types").DomItem) => import("./types").DomItem[];
22
+ getTopParentItem: (item: import("./types").DomItem) => import("./types").DomItemRoot;
23
+ getTraitDefinition: (name: string) => import("./types").TraitDefinition | undefined;
24
+ hasTrait: <Trait extends import("./types").TraitName>(item: import("./types").CoreItem, trait: Trait) => item is import("./types").CoreItem & import("./types").WithTraits<Trait>;
25
+ hasTraits: <Trait extends import("./types").TraitName>(item: import("./types").CoreItem, ...traits: Trait[]) => item is import("./types").CoreItem & import("./types").WithTraits<Trait>;
26
+ initChildren: () => import("./types").DomItem[];
27
+ initRoot: (children?: import("./types").DomItem[], listeners?: Record<string, import("../events/types").ListenerFunction>) => import("./types").DomItemRoot;
28
+ insertChild: (parent: import("./types").DomItem, child: import("./types").DomItem, index: number) => import("./types").DomItem;
29
+ isDomItem: (item: import("./types").CoreItem) => item is import("./types").DomItem;
30
+ removeChild: (parent: import("./types").DomItem, child: import("./types").DomItem) => import("./types").DomItem[];
31
+ setParentItemReferences: (item: import("./types").DomItem) => import("./types").DomItem;
32
+ withTrait: <Item extends import("./types").CoreItem, Trait extends import("./types").TraitName>(item: Item, trait: Trait, data: import("./types").TraitRegistry[Trait]) => Item & import("./types").WithTraits<Trait>;
33
+ };
34
+ export default _default;