fix: jscode, refactor (#1379)
Reviewed-on: daoyoucloud/tachybase#1379 Reviewed-by: sealday <zhanglin@daoyoucloud.com> Co-authored-by: bai.zixv <bai.zixv@foxmail.com> Co-committed-by: bai.zixv <bai.zixv@foxmail.com>
This commit is contained in:
		
							parent
							
								
									ac65c94730
								
							
						
					
					
						commit
						ce1e07a56f
					
				| @ -3,6 +3,7 @@ import { Input } from '@tachybase/client'; | |||||||
| import { useField, useFieldSchema, useForm } from '@tachybase/schema'; | import { useField, useFieldSchema, useForm } from '@tachybase/schema'; | ||||||
| 
 | 
 | ||||||
| import { Descriptions } from 'antd'; | import { Descriptions } from 'antd'; | ||||||
|  | import dayjs from 'dayjs'; | ||||||
| import _ from 'lodash'; | import _ from 'lodash'; | ||||||
| 
 | 
 | ||||||
| import { CodeFieldProps } from './Code.interface'; | import { CodeFieldProps } from './Code.interface'; | ||||||
| @ -47,7 +48,7 @@ function useAction(props: CodeFieldProps): string | React.ReactNode { | |||||||
|     dynamicCode({ jsCode, form, path, recordData, result }, { setResult, formatFunc }); |     dynamicCode({ jsCode, form, path, recordData, result }, { setResult, formatFunc }); | ||||||
|   }, []); |   }, []); | ||||||
| 
 | 
 | ||||||
|   const showItems = result.items.map((item) => { |   const showItems = result?.items?.map((item) => { | ||||||
|     return { |     return { | ||||||
|       label: item.label, |       label: item.label, | ||||||
|       children: <p>{item.children}</p>, |       children: <p>{item.children}</p>, | ||||||
| @ -83,20 +84,21 @@ async function dynamicCode({ jsCode, form, path, recordData, result }, { setResu | |||||||
|     //     ],
 |     //     ],
 | ||||||
|     //   });
 |     //   });
 | ||||||
|     // }`;
 |     // }`;
 | ||||||
|     /** 动态导入开始, 与 jsCode 配置相关的包 */ |  | ||||||
|     const dayjs = (await import('dayjs')).default; |  | ||||||
|     const localeSetting = { invalidDate: '-' }; |  | ||||||
|     dayjs.updateLocale('en', localeSetting); |  | ||||||
|     /** 动态导入结束 */ |  | ||||||
| 
 | 
 | ||||||
|     evalSimulate(jsCode, { |     const ctx = { | ||||||
|       scopes: { form, path, recordData, result }, |       data: { form, path, recordData, result, setResult, formatFunc }, | ||||||
|       handlers: { |       body: {}, | ||||||
|         setResult, |     }; | ||||||
|         formatFunc, | 
 | ||||||
|  |     await evalSimulate(jsCode, { | ||||||
|  |       ctx, | ||||||
|  |       lib: { | ||||||
|  |         log: console.log, | ||||||
|  |         JSON, | ||||||
|  |         dayjs, | ||||||
|       }, |       }, | ||||||
|       modules: { dayjs }, |  | ||||||
|     }); |     }); | ||||||
|  |     setResult(ctx.body); | ||||||
|   } catch (error) { |   } catch (error) { | ||||||
|     setResult({ |     setResult({ | ||||||
|       childrenType: '', |       childrenType: '', | ||||||
| @ -112,9 +114,10 @@ async function dynamicCode({ jsCode, form, path, recordData, result }, { setResu | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // 模拟 eval 实现, 相对更安全的实现和更好的性能, 以及限制作用域范围,
 | // 模拟 eval 实现, 相对更安全的实现和更好的性能, 以及限制作用域范围,
 | ||||||
| function evalSimulate(jsCode, { scopes, handlers, modules }) { | async function evalSimulate(jsCode, { ctx, lib }) { | ||||||
|  |   const AsyncFunction: any = async function () {}.constructor; | ||||||
|   try { |   try { | ||||||
|     return new Function('$root', `with($root) { ${jsCode}; }`)({ scopes, handlers, modules }); |     return await new AsyncFunction('$root', `with($root) { ${jsCode}; }`)({ ctx, lib }); | ||||||
|   } catch (err) { |   } catch (err) { | ||||||
|     console.log('err', err); |     console.log('err', err); | ||||||
|   } |   } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user