UNPKG

@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
'use strict';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); }