@girders-elements/core
Version:
Girders Elements is an architectural framework that assists with building data-driven apps with React or React Native.
95 lines (10 loc) • 2.3 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:true});exports.default=
elementZipper;var _zippa=require('../vendor/zippa');var _immutable=require('immutable');var _ramda=require('ramda');var _data=require('../data');var childPositions=(0,_ramda.curry)(function(defaultChildPositions,el){var fromEl=(0,_data.childPositions)(el);return!fromEl.isEmpty()?fromEl:(0,_data.asList)(defaultChildPositions);});var isBranch=(0,_ramda.curry)(function(defaultChildPositions,element){if((0,_data.isOfKind)('@@girders-elements/child-collection',element)){var children=element.get('children');return children&&children.count()>0;}var positions=childPositions(defaultChildPositions,element);return positions.some(function(pos){return element.get(pos);});});var getChildren=(0,_ramda.curry)(function(defaultChildPositions,element){if((0,_data.isOfKind)('@@girders-elements/child-collection',element)){return element.get('children').toArray();}var positions=childPositions(defaultChildPositions,element);return positions.reduce(function(children,p){return element.get(p)?children.push(makeChildCollection(p,element.get(p))):children;},(0,_immutable.List)()).toArray();});var makeChildCollection=function makeChildCollection(p,children){return(0,_immutable.Map)({kind:'@@girders-elements/child-collection',propertyName:p,isSingle:!_immutable.Iterable.isIndexed(children),children:(0,_data.asList)(children)});};var makeNode=(0,_ramda.curry)(function(defaultChildPositions,element,children){if((0,_data.isOfKind)('@@girders-elements/child-collection',element)){return element.set('children',(0,_immutable.List)(children));}return children.reduce(function(el,childColl){return el.set(childColl.get('propertyName'),singleChild(childColl)?childColl.getIn(['children',0]):childColl.get('children'));},element);});var singleChild=function singleChild(childColl){return childColl.get('isSingle')&&childColl.get('children').count()===1;};function elementZipper(config){var
defaultChildPositions=config.defaultChildPositions;
var dcp=(0,_data.asList)(defaultChildPositions);
var ElementZipperType=(0,_zippa.makeZipper)(
isBranch(dcp),
getChildren(dcp),
makeNode(dcp));
return ElementZipperType.from.bind(ElementZipperType);
}