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.
- package/LICENSE +373 -0
- package/README.md +72 -2
- package/browser/treeloom.js +11006 -0
- package/browser/treeloom.min.js +1 -0
- package/browser/treeloomRenderOnly.js +10530 -0
- package/browser/treeloomRenderOnly.min.js +1 -0
- package/dist/deflate/domItemToJson.d.ts +14 -0
- package/dist/deflate/domItemToJson.js +43 -0
- package/dist/deflate/domItemToJson.min.js +1 -0
- package/dist/deflate/index.d.ts +7 -0
- package/dist/deflate/index.js +19 -0
- package/dist/deflate/index.min.js +1 -0
- package/dist/deflate/removeEmptyProperties.d.ts +8 -0
- package/dist/deflate/removeEmptyProperties.js +43 -0
- package/dist/deflate/removeEmptyProperties.min.js +1 -0
- package/dist/diff/createChangeList.d.ts +9 -0
- package/dist/diff/createChangeList.js +44 -0
- package/dist/diff/createChangeList.min.js +1 -0
- package/dist/diff/domItemChanges.d.ts +9 -0
- package/dist/diff/domItemChanges.js +154 -0
- package/dist/diff/domItemChanges.min.js +1 -0
- package/dist/diff/domItemHasAttribute.d.ts +11 -0
- package/dist/diff/domItemHasAttribute.js +63 -0
- package/dist/diff/domItemHasAttribute.min.js +1 -0
- package/dist/diff/elementChanges.d.ts +10 -0
- package/dist/diff/elementChanges.js +151 -0
- package/dist/diff/elementChanges.min.js +1 -0
- package/dist/diff/elementHasAttribute.d.ts +10 -0
- package/dist/diff/elementHasAttribute.js +70 -0
- package/dist/diff/elementHasAttribute.min.js +1 -0
- package/dist/diff/getAssignedStyles.d.ts +9 -0
- package/dist/diff/getAssignedStyles.js +22 -0
- package/dist/diff/getAssignedStyles.min.js +1 -0
- package/dist/diff/index.d.ts +9 -0
- package/dist/diff/index.js +27 -0
- package/dist/diff/index.min.js +1 -0
- package/dist/diff/types.d.ts +17 -0
- package/dist/diff/types.js +8 -0
- package/dist/diff/types.min.js +1 -0
- package/dist/domItem/index.d.ts +34 -0
- package/dist/domItem/index.js +81 -0
- package/dist/domItem/index.min.js +1 -0
- package/dist/domItem/objects/addDomItemProperties.d.ts +7 -0
- package/dist/domItem/objects/addDomItemProperties.js +27 -0
- package/dist/domItem/objects/addDomItemProperties.min.js +1 -0
- package/dist/domItem/objects/createCoreItem.d.ts +9 -0
- package/dist/domItem/objects/createCoreItem.js +53 -0
- package/dist/domItem/objects/createCoreItem.min.js +1 -0
- package/dist/domItem/objects/createDomItem.d.ts +10 -0
- package/dist/domItem/objects/createDomItem.js +40 -0
- package/dist/domItem/objects/createDomItem.min.js +1 -0
- package/dist/domItem/objects/documentDomItem.d.ts +12 -0
- package/dist/domItem/objects/documentDomItem.js +36 -0
- package/dist/domItem/objects/documentDomItem.min.js +1 -0
- package/dist/domItem/objects/documentItem.d.ts +18 -0
- package/dist/domItem/objects/documentItem.js +40 -0
- package/dist/domItem/objects/documentItem.min.js +1 -0
- package/dist/domItem/objects/initChildren.d.ts +6 -0
- package/dist/domItem/objects/initChildren.js +44 -0
- package/dist/domItem/objects/initChildren.min.js +1 -0
- package/dist/domItem/objects/initRoot.d.ts +9 -0
- package/dist/domItem/objects/initRoot.js +32 -0
- package/dist/domItem/objects/initRoot.min.js +1 -0
- package/dist/domItem/query/gatherChildItems.d.ts +12 -0
- package/dist/domItem/query/gatherChildItems.js +19 -0
- package/dist/domItem/query/gatherChildItems.min.js +1 -0
- package/dist/domItem/query/getChildTest.d.ts +8 -0
- package/dist/domItem/query/getChildTest.js +15 -0
- package/dist/domItem/query/getChildTest.min.js +1 -0
- package/dist/domItem/query/getChildrenByClass.d.ts +11 -0
- package/dist/domItem/query/getChildrenByClass.js +26 -0
- package/dist/domItem/query/getChildrenByClass.min.js +1 -0
- package/dist/domItem/query/getChildrenByName.d.ts +9 -0
- package/dist/domItem/query/getChildrenByName.js +23 -0
- package/dist/domItem/query/getChildrenByName.min.js +1 -0
- package/dist/domItem/query/getChildrenFromAttribute.d.ts +13 -0
- package/dist/domItem/query/getChildrenFromAttribute.js +28 -0
- package/dist/domItem/query/getChildrenFromAttribute.min.js +1 -0
- package/dist/domItem/query/getItemByElement.d.ts +11 -0
- package/dist/domItem/query/getItemByElement.js +29 -0
- package/dist/domItem/query/getItemByElement.min.js +1 -0
- package/dist/domItem/query/getParentsByClass.d.ts +12 -0
- package/dist/domItem/query/getParentsByClass.js +40 -0
- package/dist/domItem/query/getParentsByClass.min.js +1 -0
- package/dist/domItem/query/getParentsByName.d.ts +9 -0
- package/dist/domItem/query/getParentsByName.js +23 -0
- package/dist/domItem/query/getParentsByName.min.js +1 -0
- package/dist/domItem/query/getParentsByTagName.d.ts +9 -0
- package/dist/domItem/query/getParentsByTagName.js +23 -0
- package/dist/domItem/query/getParentsByTagName.min.js +1 -0
- package/dist/domItem/query/getParentsFromAttribute.d.ts +13 -0
- package/dist/domItem/query/getParentsFromAttribute.js +39 -0
- package/dist/domItem/query/getParentsFromAttribute.min.js +1 -0
- package/dist/domItem/traits/defineTrait.d.ts +10 -0
- package/dist/domItem/traits/defineTrait.js +26 -0
- package/dist/domItem/traits/defineTrait.min.js +1 -0
- package/dist/domItem/traits/definitions.d.ts +7 -0
- package/dist/domItem/traits/definitions.js +20 -0
- package/dist/domItem/traits/definitions.min.js +1 -0
- package/dist/domItem/traits/getNonSerializableKeys.d.ts +9 -0
- package/dist/domItem/traits/getNonSerializableKeys.js +25 -0
- package/dist/domItem/traits/getNonSerializableKeys.min.js +1 -0
- package/dist/domItem/traits/getTraitDefinition.d.ts +7 -0
- package/dist/domItem/traits/getTraitDefinition.js +20 -0
- package/dist/domItem/traits/getTraitDefinition.min.js +1 -0
- package/dist/domItem/traits/hasTrait.d.ts +8 -0
- package/dist/domItem/traits/hasTrait.js +15 -0
- package/dist/domItem/traits/hasTrait.min.js +1 -0
- package/dist/domItem/traits/hasTraits.d.ts +9 -0
- package/dist/domItem/traits/hasTraits.js +16 -0
- package/dist/domItem/traits/hasTraits.min.js +1 -0
- package/dist/domItem/traits/isDomItem.d.ts +8 -0
- package/dist/domItem/traits/isDomItem.js +21 -0
- package/dist/domItem/traits/isDomItem.min.js +1 -0
- package/dist/domItem/traits/withTrait.d.ts +11 -0
- package/dist/domItem/traits/withTrait.js +30 -0
- package/dist/domItem/traits/withTrait.min.js +1 -0
- package/dist/domItem/tree/appendChild.d.ts +8 -0
- package/dist/domItem/tree/appendChild.js +19 -0
- package/dist/domItem/tree/appendChild.min.js +1 -0
- package/dist/domItem/tree/getItemByPath.d.ts +10 -0
- package/dist/domItem/tree/getItemByPath.js +23 -0
- package/dist/domItem/tree/getItemByPath.min.js +1 -0
- package/dist/domItem/tree/getItemPath.d.ts +9 -0
- package/dist/domItem/tree/getItemPath.js +31 -0
- package/dist/domItem/tree/getItemPath.min.js +1 -0
- package/dist/domItem/tree/getTopParentItem.d.ts +8 -0
- package/dist/domItem/tree/getTopParentItem.js +29 -0
- package/dist/domItem/tree/getTopParentItem.min.js +1 -0
- package/dist/domItem/tree/insertChild.d.ts +11 -0
- package/dist/domItem/tree/insertChild.js +22 -0
- package/dist/domItem/tree/insertChild.min.js +1 -0
- package/dist/domItem/tree/itemIdIndex.d.ts +43 -0
- package/dist/domItem/tree/itemIdIndex.js +118 -0
- package/dist/domItem/tree/itemIdIndex.min.js +1 -0
- package/dist/domItem/tree/removeChild.d.ts +8 -0
- package/dist/domItem/tree/removeChild.js +21 -0
- package/dist/domItem/tree/removeChild.min.js +1 -0
- package/dist/domItem/tree/setParentItemReferences.d.ts +7 -0
- package/dist/domItem/tree/setParentItemReferences.js +24 -0
- package/dist/domItem/tree/setParentItemReferences.min.js +1 -0
- package/dist/domItem/types.d.ts +131 -0
- package/dist/domItem/types.js +8 -0
- package/dist/domItem/types.min.js +1 -0
- package/dist/events/functions/activateListener.d.ts +10 -0
- package/dist/events/functions/activateListener.js +45 -0
- package/dist/events/functions/activateListener.min.js +1 -0
- package/dist/events/functions/addEventListener.d.ts +23 -0
- package/dist/events/functions/addEventListener.js +54 -0
- package/dist/events/functions/addEventListener.min.js +1 -0
- package/dist/events/functions/applyActiveListeners.d.ts +9 -0
- package/dist/events/functions/applyActiveListeners.js +52 -0
- package/dist/events/functions/applyActiveListeners.min.js +1 -0
- package/dist/events/functions/assignListener.d.ts +12 -0
- package/dist/events/functions/assignListener.js +39 -0
- package/dist/events/functions/assignListener.min.js +1 -0
- package/dist/events/functions/bindAllListeners.d.ts +10 -0
- package/dist/events/functions/bindAllListeners.js +28 -0
- package/dist/events/functions/bindAllListeners.min.js +1 -0
- package/dist/events/functions/bindElementListeners.d.ts +7 -0
- package/dist/events/functions/bindElementListeners.js +34 -0
- package/dist/events/functions/bindElementListeners.min.js +1 -0
- package/dist/events/functions/bindListeners.d.ts +9 -0
- package/dist/events/functions/bindListeners.js +23 -0
- package/dist/events/functions/bindListeners.min.js +1 -0
- package/dist/events/functions/deactivateListener.d.ts +13 -0
- package/dist/events/functions/deactivateListener.js +58 -0
- package/dist/events/functions/deactivateListener.min.js +1 -0
- package/dist/events/functions/deactivateListeners.d.ts +7 -0
- package/dist/events/functions/deactivateListeners.js +22 -0
- package/dist/events/functions/deactivateListeners.min.js +1 -0
- package/dist/events/functions/findEventListener.d.ts +22 -0
- package/dist/events/functions/findEventListener.js +61 -0
- package/dist/events/functions/findEventListener.min.js +1 -0
- package/dist/events/functions/fullAddEventListener.d.ts +20 -0
- package/dist/events/functions/fullAddEventListener.js +45 -0
- package/dist/events/functions/fullAddEventListener.min.js +1 -0
- package/dist/events/functions/fullRemoveEventListener.d.ts +22 -0
- package/dist/events/functions/fullRemoveEventListener.js +37 -0
- package/dist/events/functions/fullRemoveEventListener.min.js +1 -0
- package/dist/events/functions/listenerOptions.d.ts +12 -0
- package/dist/events/functions/listenerOptions.js +31 -0
- package/dist/events/functions/listenerOptions.min.js +1 -0
- package/dist/events/functions/makeEventHandler.d.ts +10 -0
- package/dist/events/functions/makeEventHandler.js +23 -0
- package/dist/events/functions/makeEventHandler.min.js +1 -0
- package/dist/events/functions/makeForwardingListener.d.ts +11 -0
- package/dist/events/functions/makeForwardingListener.js +46 -0
- package/dist/events/functions/makeForwardingListener.min.js +1 -0
- package/dist/events/functions/receiveForwardedEvent.d.ts +23 -0
- package/dist/events/functions/receiveForwardedEvent.js +40 -0
- package/dist/events/functions/receiveForwardedEvent.min.js +1 -0
- package/dist/events/functions/registerListener.d.ts +11 -0
- package/dist/events/functions/registerListener.js +25 -0
- package/dist/events/functions/registerListener.min.js +1 -0
- package/dist/events/functions/registerListeners.d.ts +10 -0
- package/dist/events/functions/registerListeners.js +26 -0
- package/dist/events/functions/registerListeners.min.js +1 -0
- package/dist/events/functions/removeEventListener.d.ts +18 -0
- package/dist/events/functions/removeEventListener.js +42 -0
- package/dist/events/functions/removeEventListener.min.js +1 -0
- package/dist/events/functions/retrieveListener.d.ts +14 -0
- package/dist/events/functions/retrieveListener.js +39 -0
- package/dist/events/functions/retrieveListener.min.js +1 -0
- package/dist/events/functions/revokeActiveListeners.d.ts +12 -0
- package/dist/events/functions/revokeActiveListeners.js +54 -0
- package/dist/events/functions/revokeActiveListeners.min.js +1 -0
- package/dist/events/functions/setForwardEvents.d.ts +11 -0
- package/dist/events/functions/setForwardEvents.js +26 -0
- package/dist/events/functions/setForwardEvents.min.js +1 -0
- package/dist/events/functions/unassignListener.d.ts +12 -0
- package/dist/events/functions/unassignListener.js +32 -0
- package/dist/events/functions/unassignListener.min.js +1 -0
- package/dist/events/index.d.ts +37 -0
- package/dist/events/index.js +72 -0
- package/dist/events/index.min.js +1 -0
- package/dist/events/objects/createEventListener.d.ts +13 -0
- package/dist/events/objects/createEventListener.js +30 -0
- package/dist/events/objects/createEventListener.min.js +1 -0
- package/dist/events/objects/createEventProxy.d.ts +10 -0
- package/dist/events/objects/createEventProxy.js +48 -0
- package/dist/events/objects/createEventProxy.min.js +1 -0
- package/dist/events/objects/createEventResponder.d.ts +8 -0
- package/dist/events/objects/createEventResponder.js +27 -0
- package/dist/events/objects/createEventResponder.min.js +1 -0
- package/dist/events/objects/options/getListenerOptions.d.ts +6 -0
- package/dist/events/objects/options/getListenerOptions.js +22 -0
- package/dist/events/objects/options/getListenerOptions.min.js +1 -0
- package/dist/events/objects/options/numberToOptions.d.ts +8 -0
- package/dist/events/objects/options/numberToOptions.js +21 -0
- package/dist/events/objects/options/numberToOptions.min.js +1 -0
- package/dist/events/objects/options/optionsToNumber.d.ts +9 -0
- package/dist/events/objects/options/optionsToNumber.js +27 -0
- package/dist/events/objects/options/optionsToNumber.min.js +1 -0
- package/dist/events/objects/options.d.ts +6 -0
- package/dist/events/objects/options.js +24 -0
- package/dist/events/objects/options.min.js +1 -0
- package/dist/events/types.d.ts +87 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.min.js +1 -0
- package/dist/inflate/index.d.ts +4 -0
- package/dist/inflate/index.js +17 -0
- package/dist/inflate/index.min.js +1 -0
- package/dist/inflate/jsonToDomItem.d.ts +7 -0
- package/dist/inflate/jsonToDomItem.js +30 -0
- package/dist/inflate/jsonToDomItem.min.js +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +24 -0
- package/dist/main.min.js +1 -0
- package/dist/render/generateElement.d.ts +7 -0
- package/dist/render/generateElement.js +41 -0
- package/dist/render/generateElement.min.js +1 -0
- package/dist/render/index.d.ts +8 -0
- package/dist/render/index.js +25 -0
- package/dist/render/index.min.js +1 -0
- package/dist/render/renderHtml.d.ts +16 -0
- package/dist/render/renderHtml.js +57 -0
- package/dist/render/renderHtml.min.js +1 -0
- package/dist/render/updateChildNodes.d.ts +7 -0
- package/dist/render/updateChildNodes.js +56 -0
- package/dist/render/updateChildNodes.min.js +1 -0
- package/dist/render/updateElement.d.ts +14 -0
- package/dist/render/updateElement.js +110 -0
- package/dist/render/updateElement.min.js +1 -0
- package/dist/render/updateElements.d.ts +9 -0
- package/dist/render/updateElements.js +33 -0
- package/dist/render/updateElements.min.js +1 -0
- package/dist/renderOnly.d.ts +2 -0
- package/dist/renderOnly.js +27 -0
- package/dist/renderOnly.min.js +1 -0
- package/dist/sync/index.d.ts +6 -0
- package/dist/sync/index.js +21 -0
- package/dist/sync/index.min.js +1 -0
- package/dist/sync/updateChildren.d.ts +7 -0
- package/dist/sync/updateChildren.js +38 -0
- package/dist/sync/updateChildren.min.js +1 -0
- package/dist/sync/updateDomItem.d.ts +8 -0
- package/dist/sync/updateDomItem.js +49 -0
- package/dist/sync/updateDomItem.min.js +1 -0
- package/dist/sync/updateDomItems.d.ts +9 -0
- package/dist/sync/updateDomItems.js +33 -0
- package/dist/sync/updateDomItems.min.js +1 -0
- 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;
|