treeloom 0.0.0-stage → 2.1.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 +91 -2
- package/browser/treeloom.js +11232 -0
- package/browser/treeloom.min.js +1 -0
- package/browser/treeloomRenderOnly.js +11115 -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/appliedSnapshot.d.ts +34 -0
- package/dist/diff/appliedSnapshot.js +134 -0
- package/dist/diff/appliedSnapshot.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 +167 -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 +9 -0
- package/dist/render/index.js +27 -0
- package/dist/render/index.min.js +1 -0
- package/dist/render/reconcile.d.ts +16 -0
- package/dist/render/reconcile.js +169 -0
- package/dist/render/reconcile.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 +53 -0
- package/dist/render/updateChildNodes.min.js +1 -0
- package/dist/render/updateElement.d.ts +14 -0
- package/dist/render/updateElement.js +113 -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 +53 -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,57 @@
|
|
|
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 documentItem_1 = __importDefault(require("../domItem/objects/documentItem"));
|
|
15
|
+
const insertChild_1 = __importDefault(require("../domItem/tree/insertChild"));
|
|
16
|
+
const itemIdIndex_1 = require("../domItem/tree/itemIdIndex");
|
|
17
|
+
const setParentItemReferences_1 = __importDefault(require("../domItem/tree/setParentItemReferences"));
|
|
18
|
+
const updateChildNodes_1 = __importDefault(require("./updateChildNodes"));
|
|
19
|
+
const updateElements_1 = __importDefault(require("./updateElements"));
|
|
20
|
+
/**
|
|
21
|
+
* This is a shortcut for syncing a Virtual DOM (DomItem tree) item onto the real HTML DOM: builds the real elements
|
|
22
|
+
* for it and its descendants, inserts them into parent's children (the document body by default), and binds their
|
|
23
|
+
* associated listeners.
|
|
24
|
+
* @param item - The DomItem that we want to render the element for
|
|
25
|
+
* @param parent - Where to insert item, when it does not already have a parent - defaults to the
|
|
26
|
+
* document body, so passing nothing keeps working exactly as before
|
|
27
|
+
* @param index - Where in parent's children to put item - defaults to the end (a plain append), so passing nothing
|
|
28
|
+
* keeps working exactly as before. To insert item among parent's already-rendered content (existing real HTML),
|
|
29
|
+
* parent's children must already reflect that content first - see {@link updateDomItems}, which captures the real
|
|
30
|
+
* DOM into items. Skipping that step and inserting anyway will make the next render remove the untracked content,
|
|
31
|
+
* since it is invisible to parent.children.
|
|
32
|
+
*/
|
|
33
|
+
const renderHtml = (item = null, parent = (0, documentItem_1.default)().body, index = parent.children.length) => {
|
|
34
|
+
const itemToRender = item === null ? (0, documentItem_1.default)() : item;
|
|
35
|
+
// Every descendant needs its parentItem chain in place before anything below tries to walk up it (a listener
|
|
36
|
+
// being bound looks up its root via getTopParentItem) - set it first, rather than after rendering the subtree.
|
|
37
|
+
(0, setParentItemReferences_1.default)(itemToRender);
|
|
38
|
+
if (itemToRender.parentItem === null) {
|
|
39
|
+
// excluding when documentItem was passed in, insert the item into parent, and place its real element among
|
|
40
|
+
// parent's real children - scoped to just this positioning, not a resync of parent's whole existing subtree
|
|
41
|
+
// (updateElements(parent) would walk every sibling's attributes too, reverting anything about them - like a
|
|
42
|
+
// style change some other, unrelated script made directly on the real DOM - that parent's items don't track)
|
|
43
|
+
(0, insertChild_1.default)(parent, item, index);
|
|
44
|
+
(0, updateChildNodes_1.default)(parent);
|
|
45
|
+
}
|
|
46
|
+
// Register this subtree (root item included) in its own root's id index - unconditionally, since this is
|
|
47
|
+
// correct and idempotent whichever branch above ran: a freshly-attached subtree needs it for the first time,
|
|
48
|
+
// an already-attached one being re-rendered just gets its own (unchanged) entries re-set, and the document
|
|
49
|
+
// root's own very first render (parentItem is {}, not null, so the branch above never runs for it) registers
|
|
50
|
+
// the root's own already-built initial content. Does nothing at all when itemToRender is rendered into some
|
|
51
|
+
// arbitrary, never-rooted container rather than a real DomItemRoot - see registerItemIds.
|
|
52
|
+
(0, itemIdIndex_1.registerItemIds)(itemToRender);
|
|
53
|
+
// Render the elements and return either to original reference, or updated documentItem (whichever is available)
|
|
54
|
+
const updatedItem = (0, updateElements_1.default)(itemToRender);
|
|
55
|
+
return item ?? updatedItem;
|
|
56
|
+
};
|
|
57
|
+
exports.default = renderHtml;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const documentItem_1=__importDefault(require("../domItem/objects/documentItem")),insertChild_1=__importDefault(require("../domItem/tree/insertChild")),itemIdIndex_1=require("../domItem/tree/itemIdIndex"),setParentItemReferences_1=__importDefault(require("../domItem/tree/setParentItemReferences")),updateChildNodes_1=__importDefault(require("./updateChildNodes")),updateElements_1=__importDefault(require("./updateElements")),renderHtml=(e=null,t=(0,documentItem_1.default)().body,r=t.children.length)=>{const d=null===e?(0,documentItem_1.default)():e;(0,setParentItemReferences_1.default)(d),null===d.parentItem&&((0,insertChild_1.default)(t,e,r),(0,updateChildNodes_1.default)(t)),(0,itemIdIndex_1.registerItemIds)(d);const u=(0,updateElements_1.default)(d);return e??u};exports.default=renderHtml;
|
|
@@ -0,0 +1,53 @@
|
|
|
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 updateElement_1 = __importDefault(require("./updateElement"));
|
|
15
|
+
/**
|
|
16
|
+
* Update all the childNodes for this domItem element to mach domItem children.
|
|
17
|
+
* @param domItem
|
|
18
|
+
*/
|
|
19
|
+
const updateChildNodes = domItem => {
|
|
20
|
+
if (!domItem.element) {
|
|
21
|
+
domItem = (0, updateElement_1.default)(domItem);
|
|
22
|
+
}
|
|
23
|
+
if (!domItem.children || !domItem.children.length) {
|
|
24
|
+
domItem.children = [];
|
|
25
|
+
return domItem;
|
|
26
|
+
}
|
|
27
|
+
const element = domItem.element;
|
|
28
|
+
const childNodes = domItem.children.map(child => {
|
|
29
|
+
const childNode = child.element ?? (0, updateElement_1.default)(child).element;
|
|
30
|
+
child.element = childNode;
|
|
31
|
+
return childNode;
|
|
32
|
+
});
|
|
33
|
+
// Anything in the element that isn't one of the children's nodes goes (as before, when it ended up past the last child)
|
|
34
|
+
const wanted = new Set(childNodes);
|
|
35
|
+
Array.from(element.childNodes).forEach(node => {
|
|
36
|
+
if (!wanted.has(node)) {
|
|
37
|
+
element.removeChild(node);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
// Put the nodes in order from the last one back: a node is moved only when it isn't already right before the one that
|
|
41
|
+
// follows it. So [1, 2, 3, 4] -> [2, 3, 4, 1] moves only 1, not 2, 3 and 4: a node that moves loses focus (and restarts
|
|
42
|
+
// transitions), so as few as possible move. insertBefore, not replaceChild, so nothing in the way is detached.
|
|
43
|
+
let following = null;
|
|
44
|
+
for (let index = childNodes.length - 1; index >= 0; index--) {
|
|
45
|
+
const childNode = childNodes[index];
|
|
46
|
+
if (childNode.parentNode !== element || childNode.nextSibling !== following) {
|
|
47
|
+
element.insertBefore(childNode, following);
|
|
48
|
+
}
|
|
49
|
+
following = childNode;
|
|
50
|
+
}
|
|
51
|
+
return domItem;
|
|
52
|
+
};
|
|
53
|
+
exports.default = updateChildNodes;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const updateElement_1=__importDefault(require("./updateElement")),updateChildNodes=e=>{if(e.element||(e=(0,updateElement_1.default)(e)),!e.children||!e.children.length)return e.children=[],e;const t=e.element,l=e.children.map(e=>{const t=e.element??(0,updateElement_1.default)(e).element;return e.element=t,t}),n=new Set(l);Array.from(t.childNodes).forEach(e=>{n.has(e)||t.removeChild(e)});let r=null;for(let e=l.length-1;e>=0;e--){const n=l[e];n.parentNode===t&&n.nextSibling===r||t.insertBefore(n,r),r=n}return e};exports.default=updateChildNodes;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DomItem } from '../domItem/types';
|
|
2
|
+
/**
|
|
3
|
+
* Update a single objects.DomItem element with the provided attributes / style / elementProperties.
|
|
4
|
+
*
|
|
5
|
+
* Safe to call standalone (not just through {@link updateElements}/{@link renderHtml}): whenever this ends up
|
|
6
|
+
* (re)generating domItem.element - because it had none yet, or because nodeName changed - it also re-attaches
|
|
7
|
+
* domItem's direct children onto that element via {@link updateChildNodes}, so a bare call never orphans an
|
|
8
|
+
* existing child subtree. The plain attribute/style patch path below doesn't touch domItem.element itself, so it
|
|
9
|
+
* doesn't need to.
|
|
10
|
+
* @param domItem - The DomItem having domItem changes to be applied to its
|
|
11
|
+
* element
|
|
12
|
+
*/
|
|
13
|
+
declare const updateElement: (domItem: DomItem) => DomItem;
|
|
14
|
+
export default updateElement;
|
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
require("core-js/modules/es.array.includes.js");
|
|
7
|
+
var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
|
|
8
|
+
return mod && mod.__esModule ? mod : {
|
|
9
|
+
"default": mod
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", {
|
|
13
|
+
value: true
|
|
14
|
+
});
|
|
15
|
+
const bindListeners_1 = __importDefault(require("../events/functions/bindListeners"));
|
|
16
|
+
const deactivateListeners_1 = __importDefault(require("../events/functions/deactivateListeners"));
|
|
17
|
+
const domItemChanges_1 = __importDefault(require("../diff/domItemChanges"));
|
|
18
|
+
const appliedSnapshot_1 = require("../diff/appliedSnapshot");
|
|
19
|
+
const si_funciona_1 = __importDefault(require("si-funciona"));
|
|
20
|
+
const generateElement_1 = __importDefault(require("./generateElement"));
|
|
21
|
+
const updateChildNodes_1 = __importDefault(require("./updateChildNodes"));
|
|
22
|
+
/**
|
|
23
|
+
* Update a single objects.DomItem element with the provided attributes / style / elementProperties.
|
|
24
|
+
*
|
|
25
|
+
* Safe to call standalone (not just through {@link updateElements}/{@link renderHtml}): whenever this ends up
|
|
26
|
+
* (re)generating domItem.element - because it had none yet, or because nodeName changed - it also re-attaches
|
|
27
|
+
* domItem's direct children onto that element via {@link updateChildNodes}, so a bare call never orphans an
|
|
28
|
+
* existing child subtree. The plain attribute/style patch path below doesn't touch domItem.element itself, so it
|
|
29
|
+
* doesn't need to.
|
|
30
|
+
* @param domItem - The DomItem having domItem changes to be applied to its
|
|
31
|
+
* element
|
|
32
|
+
*/
|
|
33
|
+
const updateElement = domItem => {
|
|
34
|
+
if (!domItem.element) {
|
|
35
|
+
return (0, updateChildNodes_1.default)((0, generateElement_1.default)((0, deactivateListeners_1.default)(domItem)));
|
|
36
|
+
}
|
|
37
|
+
const changes = (0, domItemChanges_1.default)(domItem);
|
|
38
|
+
// From here on the item has an element (an element which is missing was generated above)
|
|
39
|
+
const element = domItem.element;
|
|
40
|
+
const properties = element;
|
|
41
|
+
if (changes.removed.nodeName || changes.added.nodeName) {
|
|
42
|
+
// if the nodeName has changed then remove the element and create a new one
|
|
43
|
+
element.remove();
|
|
44
|
+
return (0, updateChildNodes_1.default)((0, generateElement_1.default)((0, deactivateListeners_1.default)(domItem)));
|
|
45
|
+
}
|
|
46
|
+
for (const dotKey in changes.removed) {
|
|
47
|
+
const value = changes.removed[dotKey];
|
|
48
|
+
if (!dotKey.includes('.')) {
|
|
49
|
+
if (dotKey in element) {
|
|
50
|
+
delete properties[dotKey];
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
element.removeAttribute(dotKey);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const baseKey = si_funciona_1.default.strBefore(dotKey, '.');
|
|
57
|
+
if (baseKey !== 'class' && baseKey !== 'style') {
|
|
58
|
+
throw new Error('Unhandled dotKey: ' + dotKey);
|
|
59
|
+
}
|
|
60
|
+
if (baseKey === 'class') {
|
|
61
|
+
element.classList.remove(value);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// The key is usually already kebab-case here (domItemChanges normalizes it), but not always - see the fix
|
|
65
|
+
// notes on the matching line below. kabobCase on an already-kebab string is a harmless no-op.
|
|
66
|
+
element.style.removeProperty(si_funciona_1.default.kabobCase(si_funciona_1.default.strAfter(dotKey, '.')));
|
|
67
|
+
}
|
|
68
|
+
for (const dotKey in changes.added) {
|
|
69
|
+
const value = changes.added[dotKey];
|
|
70
|
+
if (dotKey === 'className') {
|
|
71
|
+
element.className = value;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (dotKey === 'style') {
|
|
75
|
+
// Update all styles based on incoming style object
|
|
76
|
+
// setProperty wants CSS names (background-color), but the style object is written in camelCase (backgroundColor)
|
|
77
|
+
for (const style in value) {
|
|
78
|
+
element.style.setProperty(si_funciona_1.default.kabobCase(style), value[style]);
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (!dotKey.includes('.')) {
|
|
83
|
+
if (dotKey in element && dotKey !== 'form') {
|
|
84
|
+
// Some things can be assigned directly, but 'form' attribute cannot
|
|
85
|
+
properties[dotKey] = value;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
element.setAttribute(dotKey, value);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const baseKey = si_funciona_1.default.strBefore(dotKey, '.');
|
|
92
|
+
if (baseKey !== 'class' && baseKey !== 'style') {
|
|
93
|
+
throw new Error('Unhandled dotKey: ' + dotKey);
|
|
94
|
+
}
|
|
95
|
+
if (baseKey === 'class' && (/\s/.test(value) || !value)) {
|
|
96
|
+
// Skip this empty class name
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (baseKey === 'class') {
|
|
100
|
+
element.classList.add(value);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// domItemChanges is expected to hand this key through already kebab-cased, but a style property which was
|
|
104
|
+
// already assigned on the element (changed, not newly added) can come back through as its original camelCase
|
|
105
|
+
// form; CSSOM silently ignores setProperty with an invalid (camelCase) name, so the style is dropped with no
|
|
106
|
+
// error. kabobCase here is a harmless no-op when the key is already kebab, and a real fix when it is not.
|
|
107
|
+
element.style.setProperty(si_funciona_1.default.kabobCase(si_funciona_1.default.strAfter(dotKey, '.')), value);
|
|
108
|
+
}
|
|
109
|
+
// The element now matches the item: the next update compares against this rather than reading the element back
|
|
110
|
+
(0, appliedSnapshot_1.recordApplied)(domItem);
|
|
111
|
+
return (0, bindListeners_1.default)(domItem);
|
|
112
|
+
};
|
|
113
|
+
exports.default = updateElement;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";require("core-js/modules/es.array.includes.js");var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const bindListeners_1=__importDefault(require("../events/functions/bindListeners")),deactivateListeners_1=__importDefault(require("../events/functions/deactivateListeners")),domItemChanges_1=__importDefault(require("../diff/domItemChanges")),appliedSnapshot_1=require("../diff/appliedSnapshot"),si_funciona_1=__importDefault(require("si-funciona")),generateElement_1=__importDefault(require("./generateElement")),updateChildNodes_1=__importDefault(require("./updateChildNodes")),updateElement=e=>{if(!e.element)return(0,updateChildNodes_1.default)((0,generateElement_1.default)((0,deactivateListeners_1.default)(e)));const t=(0,domItemChanges_1.default)(e),s=e.element,n=s;if(t.removed.nodeName||t.added.nodeName)return s.remove(),(0,updateChildNodes_1.default)((0,generateElement_1.default)((0,deactivateListeners_1.default)(e)));for(const e in t.removed){const i=t.removed[e];if(!e.includes(".")){if(e in s){delete n[e];continue}s.removeAttribute(e);continue}const a=si_funciona_1.default.strBefore(e,".");if("class"!==a&&"style"!==a)throw new Error("Unhandled dotKey: "+e);"class"!==a?s.style.removeProperty(si_funciona_1.default.kabobCase(si_funciona_1.default.strAfter(e,"."))):s.classList.remove(i)}for(const e in t.added){const i=t.added[e];if("className"===e){s.className=i;continue}if("style"===e){for(const e in i)s.style.setProperty(si_funciona_1.default.kabobCase(e),i[e]);continue}if(!e.includes(".")){if(e in s&&"form"!==e){n[e]=i;continue}s.setAttribute(e,i);continue}const a=si_funciona_1.default.strBefore(e,".");if("class"!==a&&"style"!==a)throw new Error("Unhandled dotKey: "+e);("class"!==a||!/\s/.test(i)&&i)&&("class"!==a?s.style.setProperty(si_funciona_1.default.kabobCase(si_funciona_1.default.strAfter(e,".")),i):s.classList.add(i))}return(0,appliedSnapshot_1.recordApplied)(e),(0,bindListeners_1.default)(e)};exports.default=updateElement;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DomItem } from '../domItem/types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate HTML element data for each object in the matrix
|
|
4
|
+
* WARNING: This is a recursive function.
|
|
5
|
+
* @param config - The DomItem having child DomItems with config changes to be
|
|
6
|
+
* applied
|
|
7
|
+
*/
|
|
8
|
+
declare const updateElements: (config: DomItem) => DomItem;
|
|
9
|
+
export default updateElements;
|
|
@@ -0,0 +1,33 @@
|
|
|
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 updateChildNodes_1 = __importDefault(require("./updateChildNodes"));
|
|
15
|
+
const updateElement_1 = __importDefault(require("./updateElement"));
|
|
16
|
+
/**
|
|
17
|
+
* Generate HTML element data for each object in the matrix
|
|
18
|
+
* WARNING: This is a recursive function.
|
|
19
|
+
* @param config - The DomItem having child DomItems with config changes to be
|
|
20
|
+
* applied
|
|
21
|
+
*/
|
|
22
|
+
const updateElements = config => {
|
|
23
|
+
if (config.nodeName === '#document') {
|
|
24
|
+
for (const child of config.children) {
|
|
25
|
+
updateElements(child);
|
|
26
|
+
}
|
|
27
|
+
return config;
|
|
28
|
+
}
|
|
29
|
+
const domItem = (0, updateChildNodes_1.default)((0, updateElement_1.default)(config));
|
|
30
|
+
domItem.children.forEach(updateElements);
|
|
31
|
+
return domItem;
|
|
32
|
+
};
|
|
33
|
+
exports.default = updateElements;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const updateChildNodes_1=__importDefault(require("./updateChildNodes")),updateElement_1=__importDefault(require("./updateElement")),updateElements=e=>{if("#document"===e.nodeName){for(const t of e.children)updateElements(t);return e}const t=(0,updateChildNodes_1.default)((0,updateElement_1.default)(e));return t.children.forEach(updateElements),t};exports.default=updateElements;
|
|
@@ -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
|
+
/**
|
|
12
|
+
* The render-only subset of treeloom: build and sync a Virtual DOM (DomItem tree) to the real
|
|
13
|
+
* HTML DOM, and forward fired events elsewhere (see events/objects/setForwardEvents) instead of
|
|
14
|
+
* running local business logic - a consumer that never needs to run that logic locally never
|
|
15
|
+
* needs to go the other way (DOM back to JSON) either, so this excludes deflate, the one part of
|
|
16
|
+
* the full build with no other internal code path depending on it.
|
|
17
|
+
*/
|
|
18
|
+
const index_1 = __importDefault(require("./events/index"));
|
|
19
|
+
const index_2 = __importDefault(require("./domItem/index"));
|
|
20
|
+
const documentItem_1 = require("./domItem/objects/documentItem");
|
|
21
|
+
const index_3 = __importDefault(require("./inflate/index"));
|
|
22
|
+
const index_4 = __importDefault(require("./render/index"));
|
|
23
|
+
const index_5 = __importDefault(require("./sync/index"));
|
|
24
|
+
const index_6 = __importDefault(require("./diff/index"));
|
|
25
|
+
// documentItem is a getter (see withDocumentItem), so loading treeloom never touches a real document
|
|
26
|
+
const treeloomRenderOnly = (0, documentItem_1.withDocumentItem)(Object.assign({}, index_1.default, index_2.default, index_3.default, index_4.default, index_5.default, index_6.default));
|
|
27
|
+
module.exports = treeloomRenderOnly;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};const index_1=__importDefault(require("./events/index")),index_2=__importDefault(require("./domItem/index")),documentItem_1=require("./domItem/objects/documentItem"),index_3=__importDefault(require("./inflate/index")),index_4=__importDefault(require("./render/index")),index_5=__importDefault(require("./sync/index")),index_6=__importDefault(require("./diff/index")),treeloomRenderOnly=(0,documentItem_1.withDocumentItem)(Object.assign({},index_1.default,index_2.default,index_3.default,index_4.default,index_5.default,index_6.default));module.exports=treeloomRenderOnly;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
updateChildren: (domItem: import("../domItem/types").DomItem) => import("../domItem/types").DomItem;
|
|
3
|
+
updateDomItem: (config: import("../domItem/types").DomItem) => import("../domItem/types").DomItem;
|
|
4
|
+
updateDomItems: (config: import("../domItem/types").DomItem) => import("../domItem/types").DomItem;
|
|
5
|
+
};
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
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 updateChildren_1 = __importDefault(require("./updateChildren"));
|
|
15
|
+
const updateDomItem_1 = __importDefault(require("./updateDomItem"));
|
|
16
|
+
const updateDomItems_1 = __importDefault(require("./updateDomItems"));
|
|
17
|
+
exports.default = {
|
|
18
|
+
updateChildren: updateChildren_1.default,
|
|
19
|
+
updateDomItem: updateDomItem_1.default,
|
|
20
|
+
updateDomItems: updateDomItems_1.default
|
|
21
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const updateChildren_1=__importDefault(require("./updateChildren")),updateDomItem_1=__importDefault(require("./updateDomItem")),updateDomItems_1=__importDefault(require("./updateDomItems"));exports.default={updateChildren:updateChildren_1.default,updateDomItem:updateDomItem_1.default,updateDomItems:updateDomItems_1.default};
|
|
@@ -0,0 +1,38 @@
|
|
|
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 createDomItem_1 = __importDefault(require("../domItem/objects/createDomItem"));
|
|
15
|
+
/**
|
|
16
|
+
* Update all the children for this domItem to match the domItem element childNodes.
|
|
17
|
+
* @param domItem
|
|
18
|
+
*/
|
|
19
|
+
const updateChildren = domItem => {
|
|
20
|
+
if (!domItem.element) {
|
|
21
|
+
domItem.children = [];
|
|
22
|
+
return domItem;
|
|
23
|
+
}
|
|
24
|
+
const previousChildren = domItem.children;
|
|
25
|
+
domItem.children = [];
|
|
26
|
+
domItem.element.childNodes.forEach((childNode, index) => {
|
|
27
|
+
const existing = previousChildren.find(child => child.element === childNode);
|
|
28
|
+
const child = existing ?? (0, createDomItem_1.default)({
|
|
29
|
+
nodeName: childNode.nodeName.toLowerCase(),
|
|
30
|
+
nodeValue: childNode.nodeValue,
|
|
31
|
+
element: childNode
|
|
32
|
+
});
|
|
33
|
+
domItem.children[index] = child;
|
|
34
|
+
child.parentItem = domItem;
|
|
35
|
+
});
|
|
36
|
+
return domItem;
|
|
37
|
+
};
|
|
38
|
+
exports.default = updateChildren;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const createDomItem_1=__importDefault(require("../domItem/objects/createDomItem")),updateChildren=e=>{if(!e.element)return e.children=[],e;const t=e.children;return e.children=[],e.element.childNodes.forEach((r,n)=>{const o=t.find(e=>e.element===r),d=o??(0,createDomItem_1.default)({nodeName:r.nodeName.toLowerCase(),nodeValue:r.nodeValue,element:r});e.children[n]=d,d.parentItem=e}),e};exports.default=updateChildren;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DomItem } from '../domItem/types';
|
|
2
|
+
/**
|
|
3
|
+
* Update a single objects.DomItem element with the provided attributes / style / elementProperties
|
|
4
|
+
* @param config - The DomItem having config changes to be applied to its
|
|
5
|
+
* element
|
|
6
|
+
*/
|
|
7
|
+
declare const updateDomItem: (config: DomItem) => DomItem;
|
|
8
|
+
export default updateDomItem;
|
|
@@ -0,0 +1,53 @@
|
|
|
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 elementChanges_1 = __importDefault(require("../diff/elementChanges"));
|
|
16
|
+
const appliedSnapshot_1 = require("../diff/appliedSnapshot");
|
|
17
|
+
/**
|
|
18
|
+
* Update a single objects.DomItem element with the provided attributes / style / elementProperties
|
|
19
|
+
* @param config - The DomItem having config changes to be applied to its
|
|
20
|
+
* element
|
|
21
|
+
*/
|
|
22
|
+
const updateDomItem = config => {
|
|
23
|
+
if (!config.element) {
|
|
24
|
+
// if element is not a valid element then return the config without changes
|
|
25
|
+
return config;
|
|
26
|
+
}
|
|
27
|
+
const changes = (0, elementChanges_1.default)(config);
|
|
28
|
+
for (const dotKey in changes.removed) {
|
|
29
|
+
const attributeKey = si_funciona_1.default.strAfter(dotKey, '.');
|
|
30
|
+
if (si_funciona_1.default.strBefore(attributeKey, '.') === 'className') {
|
|
31
|
+
const classList = config.attributes.className.split(' ');
|
|
32
|
+
classList.splice(si_funciona_1.default.strAfterLast(attributeKey, '.'), 1);
|
|
33
|
+
config.attributes.className = classList.join(' ');
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
si_funciona_1.default.dotUnset(config, dotKey);
|
|
37
|
+
}
|
|
38
|
+
for (const dotKey in changes.added) {
|
|
39
|
+
const attributeKey = si_funciona_1.default.strAfter(dotKey, '.');
|
|
40
|
+
if (si_funciona_1.default.strBefore(attributeKey, '.') === 'className') {
|
|
41
|
+
const classList = config.attributes.className.split(' ');
|
|
42
|
+
classList.push(changes.added[dotKey]);
|
|
43
|
+
config.attributes.className = classList.join(' ');
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
si_funciona_1.default.dotSet(config, dotKey, changes.added[dotKey]);
|
|
47
|
+
}
|
|
48
|
+
// The item now holds what the element has, which may not be what treeloom last wrote: compare the next update with
|
|
49
|
+
// the element itself again, or setting the item back to the old value would look like no change at all
|
|
50
|
+
(0, appliedSnapshot_1.forgetApplied)(config.element);
|
|
51
|
+
return config;
|
|
52
|
+
};
|
|
53
|
+
exports.default = updateDomItem;
|
|
@@ -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")),elementChanges_1=__importDefault(require("../diff/elementChanges")),appliedSnapshot_1=require("../diff/appliedSnapshot"),updateDomItem=e=>{if(!e.element)return e;const t=(0,elementChanges_1.default)(e);for(const s in t.removed){const t=si_funciona_1.default.strAfter(s,".");if("className"===si_funciona_1.default.strBefore(t,".")){const s=e.attributes.className.split(" ");s.splice(si_funciona_1.default.strAfterLast(t,"."),1),e.attributes.className=s.join(" ");continue}si_funciona_1.default.dotUnset(e,s)}for(const s in t.added){const a=si_funciona_1.default.strAfter(s,".");if("className"===si_funciona_1.default.strBefore(a,".")){const a=e.attributes.className.split(" ");a.push(t.added[s]),e.attributes.className=a.join(" ");continue}si_funciona_1.default.dotSet(e,s,t.added[s])}return(0,appliedSnapshot_1.forgetApplied)(e.element),e};exports.default=updateDomItem;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DomItem } from '../domItem/types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate HTML element data for each object in the matrix
|
|
4
|
+
* WARNING: This is a recursive function.
|
|
5
|
+
* @param config - The DomItem having child DomItems with config changes to be
|
|
6
|
+
* applied
|
|
7
|
+
*/
|
|
8
|
+
declare const updateDomItems: (config: DomItem) => DomItem;
|
|
9
|
+
export default updateDomItems;
|
|
@@ -0,0 +1,33 @@
|
|
|
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 updateChildren_1 = __importDefault(require("./updateChildren"));
|
|
15
|
+
const updateDomItem_1 = __importDefault(require("./updateDomItem"));
|
|
16
|
+
/**
|
|
17
|
+
* Generate HTML element data for each object in the matrix
|
|
18
|
+
* WARNING: This is a recursive function.
|
|
19
|
+
* @param config - The DomItem having child DomItems with config changes to be
|
|
20
|
+
* applied
|
|
21
|
+
*/
|
|
22
|
+
const updateDomItems = config => {
|
|
23
|
+
if (config.nodeName === '#document') {
|
|
24
|
+
for (const child of config.children) {
|
|
25
|
+
updateDomItems(child);
|
|
26
|
+
}
|
|
27
|
+
return config;
|
|
28
|
+
}
|
|
29
|
+
const domItem = (0, updateChildren_1.default)((0, updateDomItem_1.default)(config));
|
|
30
|
+
domItem.children.forEach(updateDomItems);
|
|
31
|
+
return domItem;
|
|
32
|
+
};
|
|
33
|
+
exports.default = updateDomItems;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const updateChildren_1=__importDefault(require("./updateChildren")),updateDomItem_1=__importDefault(require("./updateDomItem")),updateDomItems=e=>{if("#document"===e.nodeName){for(const t of e.children)updateDomItems(t);return e}const t=(0,updateChildren_1.default)((0,updateDomItem_1.default)(e));return t.children.forEach(updateDomItems),t};exports.default=updateDomItems;
|
package/package.json
CHANGED
|
@@ -1,6 +1,76 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "treeloom",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"author": "Joshua Heagle <joshuaheagle@gmail.com> (https://joshuaheagle.com)",
|
|
4
|
+
"license": "MPL-2.0",
|
|
5
|
+
"description": "State management with JSON.",
|
|
6
|
+
"homepage": "https://github.com/jheagle/treeloom#readme",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"json",
|
|
9
|
+
"tree",
|
|
10
|
+
"virtual dom",
|
|
11
|
+
"dom",
|
|
12
|
+
"state management",
|
|
13
|
+
"serialization",
|
|
14
|
+
"typescript"
|
|
15
|
+
],
|
|
16
|
+
"version": "2.1.0",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/jheagle/treeloom/issues"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "gulp build",
|
|
22
|
+
"dev": "gulp",
|
|
23
|
+
"docs": "gulp docs",
|
|
24
|
+
"lint": "gulp lint",
|
|
25
|
+
"prepublishOnly": "npm run build",
|
|
26
|
+
"publish:bundle": "gulp copyFiles",
|
|
27
|
+
"release": "release-it",
|
|
28
|
+
"release:dry-run": "release-it --dry-run",
|
|
29
|
+
"resolutions": "npx npm-force-resolutions",
|
|
30
|
+
"test": "gulp testFull",
|
|
31
|
+
"test:quick": "gulp testQuick",
|
|
32
|
+
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.type-tests.json",
|
|
33
|
+
"watch": "gulp watchFull",
|
|
34
|
+
"watch:test": "gulp watchTest"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"collect-your-stuff": "^2.2.1",
|
|
38
|
+
"core-js": "^3.51.0",
|
|
39
|
+
"si-funciona": "^2.10.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@babel/core": "^8.1.0",
|
|
43
|
+
"@babel/plugin-transform-modules-commonjs": "^8.0.1",
|
|
44
|
+
"@babel/preset-env": "^8.0.7",
|
|
45
|
+
"gulp": "^5.0.1",
|
|
46
|
+
"js-build-tools": "^8.2.0",
|
|
47
|
+
"release-it": "^21.1.2",
|
|
48
|
+
"standard": "^17.1.2",
|
|
49
|
+
"test-filesystem": "^2.0.0",
|
|
50
|
+
"typedoc": "^0.28.20"
|
|
51
|
+
},
|
|
52
|
+
"resolutions": {},
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "git+https://github.com/jheagle/treeloom.git"
|
|
56
|
+
},
|
|
57
|
+
"main": "dist/main.js",
|
|
58
|
+
"types": "dist/main.d.ts",
|
|
59
|
+
"files": [
|
|
60
|
+
"dist",
|
|
61
|
+
"browser"
|
|
62
|
+
],
|
|
63
|
+
"standard": {
|
|
64
|
+
"env": [
|
|
65
|
+
"jest",
|
|
66
|
+
"browser"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"allowScripts": {
|
|
70
|
+
"core-js": false,
|
|
71
|
+
"core-js-pure": false,
|
|
72
|
+
"@parcel/watcher": false,
|
|
73
|
+
"unrs-resolver": false,
|
|
74
|
+
"esbuild": false
|
|
75
|
+
}
|
|
76
|
+
}
|