60 lines
1.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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