From 7d93af654566d773a26585ed903d1462336c4bd2 Mon Sep 17 00:00:00 2001 From: gene9831 Date: Thu, 21 Dec 2023 00:31:24 -0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20JS=E9=9D=A2=E6=9D=BF=E6=94=AF?= =?UTF-8?q?=E6=8C=81JSX=E8=AF=AD=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/common/js/ast.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/common/js/ast.js b/packages/common/js/ast.js index 1af7c339e2..18026c0ded 100644 --- a/packages/common/js/ast.js +++ b/packages/common/js/ast.js @@ -1,14 +1,14 @@ /** -* Copyright (c) 2023 - present TinyEngine Authors. -* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. -* -* Use of this source code is governed by an MIT-style license. -* -* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, -* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR -* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. -* -*/ + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ import { parse, parseExpression } from '@babel/parser' import generate from '@babel/generator' @@ -24,7 +24,7 @@ export const insertName = (name, content) => content.replace(METHOD_REGEXP, `fun export const removeName = (content) => content.replace(METHOD_REGEXP, 'function (') -export const string2Ast = (string = '') => parse(string, { sourceType: 'module', plugins: ['typescript'] }) +export const string2Ast = (string = '') => parse(string, { sourceType: 'module', plugins: ['typescript', 'jsx'] }) export const ast2String = (ast) => generate(ast, { retainLines: true }).code From a09cc9a3162041f5944f02497ed6e63cb3683cdd Mon Sep 17 00:00:00 2001 From: gene9831 Date: Fri, 22 Dec 2023 00:19:29 -0800 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=E7=94=BB=E5=B8=83=E8=A7=A3=E6=9E=90?= =?UTF-8?q?JS=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=97=B6=E6=94=AF=E6=8C=81JSX?= =?UTF-8?q?=E8=AF=AD=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../canvas/src/components/render/render.js | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/canvas/src/components/render/render.js b/packages/canvas/src/components/render/render.js index 6465e1b507..63255a22cd 100644 --- a/packages/canvas/src/components/render/render.js +++ b/packages/canvas/src/components/render/render.js @@ -34,8 +34,8 @@ const { BROADCAST_CHANNEL } = constants const { hyphenateRE } = utils const customElements = {} -const transformJSX = (code) => - transformSync(code, { +const transformJSX = (code) => { + const res = transformSync(code, { plugins: [ [ babelPluginJSX, @@ -46,6 +46,12 @@ const transformJSX = (code) => ] ] }) + return (res.code || '') + .replace(/import \{.+\} from "vue";/, '') + .replace(/h\(_?resolveComponent\((.*?)\)/g, `h(this.getComponent($1)`) + .replace(/_?resolveComponent/g, 'h') + .replace(/_?createTextVNode\((.*?)\)/g, '$1') +} export const blockSlotDataMap = reactive({}) @@ -138,7 +144,7 @@ export const newFn = (...argv) => { return new Fn(...argv) } -const parseExpression = (data, scope, ctx) => { +const parseExpression = (data, scope, ctx, jsx = false) => { try { if (data.value.indexOf('this.i18n') > -1) { ctx.i18n = i18nHost.global.t @@ -146,12 +152,17 @@ const parseExpression = (data, scope, ctx) => { ctx.t = i18nHost.global.t } - return newFn('$scope', `with($scope || {}) { return ${data.value} }`).call(ctx, { + const expression = jsx ? transformJSX(data.value) : data.value + return newFn('$scope', `with($scope || {}) { return ${expression} }`).call(ctx, { ...ctx, ...scope, slotScope: scope }) } catch (err) { + // 解析抛出异常,则再尝试解析 JSX 语法。如果解析 JSX 语法仍然出现错误,jsx 变量会确保不会再次递归执行解析 + if (!jsx) { + return parseExpression(data, scope, ctx, true) + } return undefined } } @@ -347,10 +358,6 @@ export const getComponent = (name) => { const parseJSXFunction = (data, ctx) => { try { const newValue = transformJSX(data.value) - .code.replace(/import \{.+\} from "vue";/, '') - .replace(/h\(_?resolveComponent\((.*?)\)/g, `h(this.getComponent($1)`) - .replace(/_?resolveComponent/g, 'h') - .replace(/_?createTextVNode\((.*?)\)/g, '$1') const fnInfo = parseFunctionString(newValue) if (!fnInfo) throw Error('函数解析失败,请检查格式。示例:function fnName() { }') From 0abcbd23cfe79b53d457d358b98c7504d9181308 Mon Sep 17 00:00:00 2001 From: gene9831 Date: Sun, 24 Dec 2023 17:32:14 -0800 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=BB=E5=B8=83?= =?UTF-8?q?=E8=A7=A3=E6=9E=90JSX=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=97=B6?= =?UTF-8?q?=E4=BC=9A=E8=BF=94=E5=9B=9Eundefined?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/canvas/src/components/render/render.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/canvas/src/components/render/render.js b/packages/canvas/src/components/render/render.js index 63255a22cd..2e690d49ab 100644 --- a/packages/canvas/src/components/render/render.js +++ b/packages/canvas/src/components/render/render.js @@ -51,6 +51,7 @@ const transformJSX = (code) => { .replace(/h\(_?resolveComponent\((.*?)\)/g, `h(this.getComponent($1)`) .replace(/_?resolveComponent/g, 'h') .replace(/_?createTextVNode\((.*?)\)/g, '$1') + .trim() } export const blockSlotDataMap = reactive({}) From c6492c682199dc9840f2a816a30fb53d75051fa3 Mon Sep 17 00:00:00 2001 From: gene9831 Date: Wed, 10 Jan 2024 23:36:28 -0800 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0Tree=E5=92=8CTool?= =?UTF-8?q?tip=E7=9A=84=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/common/component/MetaCodeEditor.vue | 2 +- packages/design-core/public/mock/bundle.json | 46 +++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/common/component/MetaCodeEditor.vue b/packages/common/component/MetaCodeEditor.vue index edcd9975d7..028ff00b09 100644 --- a/packages/common/component/MetaCodeEditor.vue +++ b/packages/common/component/MetaCodeEditor.vue @@ -139,7 +139,7 @@ export default { watchEffect(() => { const { modelValue, dataType } = props - const val = dataType ? modelValue?.value : modelValue + const val = dataType ? modelValue?.value || '' : modelValue value.value = typeof val === 'string' ? val : JSON.stringify(val, null, 2) }) diff --git a/packages/design-core/public/mock/bundle.json b/packages/design-core/public/mock/bundle.json index 09b0d6c2a5..0e1d0c4051 100644 --- a/packages/design-core/public/mock/bundle.json +++ b/packages/design-core/public/mock/bundle.json @@ -10910,7 +10910,7 @@ "zh_CN": "基础信息" }, "collapse": { - "number": 6, + "number": 10, "text": { "zh_CN": "显示更多" } @@ -10985,6 +10985,28 @@ }, "labelPosition": "left" }, + { + "property": "render-content", + "label": { + "text": { + "zh_CN": "渲染函数" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "disabled": true, + "placeholder": "请使用变量绑定来绑定函数" + } + }, + "description": { + "zh_CN": "树节点的内容区的渲染函数" + } + }, { "property": "icon-trigger-click-node", "label": { @@ -11532,6 +11554,28 @@ "zh_CN": "显示的内容,也可以通过 slot#content 传入 DOM" } }, + { + "property": "render-content", + "label": { + "text": { + "zh_CN": "渲染函数" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "disabled": true, + "placeholder": "请使用变量绑定来绑定函数" + } + }, + "description": { + "zh_CN": "自定义渲染函数,返回需要渲染的节点内容" + } + }, { "property": "modelValue", "label": { From 844ed18a9b07770ee864f1aa3fcbd53299cbaf5c Mon Sep 17 00:00:00 2001 From: gene9831 Date: Thu, 18 Jan 2024 23:26:45 -0800 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/canvas/src/components/render/render.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/canvas/src/components/render/render.js b/packages/canvas/src/components/render/render.js index 2e690d49ab..83e71bd1f3 100644 --- a/packages/canvas/src/components/render/render.js +++ b/packages/canvas/src/components/render/render.js @@ -145,7 +145,7 @@ export const newFn = (...argv) => { return new Fn(...argv) } -const parseExpression = (data, scope, ctx, jsx = false) => { +const parseExpression = (data, scope, ctx, isJsx = false) => { try { if (data.value.indexOf('this.i18n') > -1) { ctx.i18n = i18nHost.global.t @@ -153,15 +153,15 @@ const parseExpression = (data, scope, ctx, jsx = false) => { ctx.t = i18nHost.global.t } - const expression = jsx ? transformJSX(data.value) : data.value + const expression = isJsx ? transformJSX(data.value) : data.value return newFn('$scope', `with($scope || {}) { return ${expression} }`).call(ctx, { ...ctx, ...scope, slotScope: scope }) } catch (err) { - // 解析抛出异常,则再尝试解析 JSX 语法。如果解析 JSX 语法仍然出现错误,jsx 变量会确保不会再次递归执行解析 - if (!jsx) { + // 解析抛出异常,则再尝试解析 JSX 语法。如果解析 JSX 语法仍然出现错误,isJsx 变量会确保不会再次递归执行解析 + if (!isJsx) { return parseExpression(data, scope, ctx, true) } return undefined