UNPKG

mk-meta-engine

Version:

元数据化引擎,在mk-app-loader实现的应用隔离基础上,实现可以用json元数据描述界面模型,并提供了action、reducer的基础函数和monkeyKing组件.

229 lines (177 loc) 7.54 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _typeof2 = require('babel-runtime/helpers/typeof'); var _typeof3 = _interopRequireDefault(_typeof2); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _mkAppLoader = require('mk-app-loader'); var _componentFactory = require('./componentFactory'); var _componentFactory2 = _interopRequireDefault(_componentFactory); var _omit = require('omit.js'); var _omit2 = _interopRequireDefault(_omit); var _config = require('./config'); var _config2 = _interopRequireDefault(_config); var _mkUtils = require('mk-utils'); var _mkUtils2 = _interopRequireDefault(_mkUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function parseMetaProps(meta, props, data) { var ret = {}; (0, _keys2.default)(meta).forEach(function (key) { var v = meta[key], t = typeof v === 'undefined' ? 'undefined' : (0, _typeof3.default)(v); if (v instanceof Array) { ret[key] = []; var i, c; for (i = 0; c = v[i++];) { //v.forEach(c => { if (c instanceof Array) { ret[key] = v; } else { var mc = metaToComponent(c, props, data); if (mc instanceof Array) ret[key] = ret[key].concat(mc);else ret[key].push(mc); } } } else if (t == 'object') { if (v && v._notParse) { ret[key] = v; } else { ret[key] = metaToComponent(v, props, data); } } /*else if (t == 'function') { ret[key] = v() }*/ else { ret[key] = v; } }); return ret; } var toFunction = _mkUtils2.default._.memoize(function (v) { return new Function(v); }); function metaToComponent(meta, props, data) { if (!meta) return meta; var metaType = typeof meta === 'undefined' ? 'undefined' : (0, _typeof3.default)(meta); if (metaType == 'object' && meta['$$typeof']) { return meta; } else if (metaType == 'object' && meta['_isAMomentObject']) { return meta; } else if (metaType == 'object' && meta instanceof Date) { return meta; } else if (metaType == 'object' && meta instanceof _promise2.default) { return meta; } else if (metaType == 'object') { if (meta.component) { if (typeof meta.component == 'function') { meta.component = meta.component(); } if (meta._visible === false) return null; if (typeof meta._visible === 'function' && meta._visible() === false) return null; //for in data.list if (meta['_power'] && /for[ ]+in/.test(meta._power)) { var p = meta._power.replace(/for[ ]+in/, '').replace(' ', ''); if (p.indexOf('_rowIndex') != -1) p = p.replace('_rowIndex', meta.path.split(',').length > 1 ? meta.path.split(',')[1].replace(' ', '') : 0); var items = props.gf(p); if (!items || items.size == 0) return; items = items.toJS(); return items.map(function (o, index) { var childMeta = props.gm(meta.path + ',' + index, undefined, data); delete childMeta._power; return metaToComponent(childMeta, props, data); }); } //({rowIndex})=>rowIndex if (meta._power && meta._power.indexOf('=>') != -1) { return function () { var varsString = toFunction('return ' + meta['_power'])().apply(undefined, arguments); var childMeta = props.gm(meta.path + ',' + varsString, undefined, data); childMeta._power = undefined; return metaToComponent(childMeta, props, data); //return co ? React.cloneElement(co, { path: meta.path + ',' + varsString }) : co }; } var componentName = meta.component, component = _componentFactory2.default.getComponent(props.appName, componentName); /* var allProps = { key: meta.path, ...props, ...parseMetaProps(meta, props, data), }*/ var allProps = parseMetaProps(meta, props, data); if (!allProps.key) { allProps.key = meta.path; } /* var metaProps = parseMetaProps(meta, props, data) var metaPropsKeys = Object.keys(metaProps) for (var i = 0; i < metaPropsKeys.length; i++) { allProps[metaPropsKeys[i]] = metaProps[metaPropsKeys[i]] }*/ delete allProps.component; delete allProps.name; //使用omit性能较低 //allProps = omit(allProps, ['clearAppState', 'component', 'name', 'getDirectFuns', 'initView', 'payload']) if (componentName == 'AppLoader') { var propKeys = (0, _keys2.default)(props), i, key; for (i = 0; key = propKeys[i++];) { if (allProps[key] == undefined) { allProps[key] = props[key]; } } //删除一些组件不需要的属性 delete allProps.clearAppState; delete allProps.getDirectFuns; delete allProps.initView; delete allProps.payload; delete allProps.componentWillMount; delete allProps.componentDidMount; delete allProps.shouldComponentUpdate; delete allProps.componentWillReceiveProps; delete allProps.componentWillUpdate; delete allProps.componentDidCatch; delete allProps.componentWillUnmount; delete allProps.componentDidUpdate; delete allProps.unmount; if (!allProps.appName) return null; if (allProps._notRender === true && !(0, _mkAppLoader.getApps)()[allProps.appName]) { return null; } allProps.key = allProps.appName; allProps.name = allProps.appName; return _react2.default.createElement(component, allProps); } /* delete allProps.store delete allProps.appName delete allProps.appFullName delete allProps.appQuery delete allProps.appParams delete allProps.storeSubscription */ return _react2.default.createElement(component, allProps); } else { return parseMetaProps(meta, props, data); } } else { return meta; } } var MonkeyKing = function MonkeyKing(props) { var path = props.path, gm = props.gm, gf = props.gf; var data = gf().toJS(); return metaToComponent(gm(path, undefined, data), props, data); }; exports.default = MonkeyKing; module.exports = exports['default'];