UNPKG

@alilc/lowcode-editor-skeleton

Version:

alibaba lowcode editor skeleton

54 lines (53 loc) 1.69 kB
import { isPlainObject, isJSFunction, getLogger } from '@alilc/lowcode-utils'; var leadingFnRe = /^function/; var leadingFnNameRe = /^\w+\s*\(/; var logger = getLogger({ level: 'warn', bizName: 'skeleton:transducers' }); /** * 将函数字符串转成函数,支持几种类型 * 类型一:() => {} / val => {} * 类型二:setValue() {} * 类型三:function() {} / function setValue() {} * @param str * @returns */ function transformStringToFunction(str) { if (typeof str !== 'string') return str; var fn; if (leadingFnNameRe.test(str) && !leadingFnRe.test(str)) { str = "function " + str; } var fnBody = "\n return function() {\n const self = this;\n try {\n return (" + str + ").apply(self, arguments);\n } catch(e) {\n console.warn('call function which parsed by lowcode failed: ', e);\n return e.message;\n }\n };\n "; try { // eslint-disable-next-line no-new-func fn = new Function(fnBody)(); } catch (e) { logger.error(str); logger.error(e.message); } return fn; } function parseJSFunc(obj, enableAllowedKeys) { if (enableAllowedKeys === void 0) { enableAllowedKeys = true; } if (!obj) return; Object.keys(obj).forEach(function (key) { var item = obj[key]; if (isJSFunction(item)) { obj[key] = transformStringToFunction(item.value); } else if (Array.isArray(item)) { item.forEach(function (o) { return parseJSFunc(o, enableAllowedKeys); }); } else if (isPlainObject(item)) { parseJSFunc(item, enableAllowedKeys); } }); } export default function (metadata) { parseJSFunc(metadata, false); return metadata; }