mk-meta-engine
Version:
元数据化引擎,在mk-app-loader实现的应用隔离基础上,实现可以用json元数据描述界面模型,并提供了action、reducer的基础函数和monkeyKing组件.
229 lines (177 loc) • 7.54 kB
JavaScript
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'];
;