UNPKG

elliptical-extend

Version:
95 lines (76 loc) 3.21 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; /** @jsx createElement */ exports.default = createProcessor; var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _elliptical = require('elliptical'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var compareTypes = function compareTypes(element) { return function (extension) { // if the two refer to the same object if (_lodash2.default.includes(extension.extends, element.type)) { return true; } return _lodash2.default.find(extension.extends, function (extended) { return extended.id && element.type && element.type.id && extended.id === element.type.id; }); }; }; function createProcessor(extensions) { return function process(element) { // you can't extend builtins if (_lodash2.default.isString(element)) return element; var theseExtensions = _lodash2.default.chain(extensions).filter(compareTypes(element)).map(function (extension) { var newProps = _lodash2.default.assign({}, element.props, { id: undefined }); return _lodash2.default.assign({}, element, { type: extension }, { props: newProps }); }).map(function (extension) { var final = extension; if (element.type.mapResult) { var map = function map(option) { var result = element.type.mapResult(option.result, extension); return _lodash2.default.assign({}, option, { result: result }); }; final = (0, _elliptical.createElement)( 'map', { outbound: map, skipIncomplete: true }, final ); } if (element.type.filterResult) { var filter = function filter(option) { return element.type.filterResult(option.result, extension); }; final = (0, _elliptical.createElement)( 'filter', { outbound: filter, skipIncomplete: true }, final ); } return final; }).value(); if (theseExtensions.length) { var _ret = function () { var describe = function describe(model) { return (0, _elliptical.createElement)( 'choice', null, newElement, theseExtensions ); }; var newPhrase = _lodash2.default.assign({}, element.type, { id: undefined }); // to prevent duplicate extension var newProps = _lodash2.default.assign({}, element.props, { id: undefined }); // to prevent problems with choices/sequences var newElement = _lodash2.default.assign({}, element, { type: newPhrase }, { props: newProps }); return { v: _lodash2.default.assign({}, element, { type: { describe: describe } }) }; }(); if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } else { return element; } }; }