From d685aef9d4ce31bd9184bc672978b9d2564e2a3c Mon Sep 17 00:00:00 2001 From: chilingling Date: Sat, 25 Jan 2025 01:42:32 -0800 Subject: [PATCH 1/2] fix: deDuplicated BuiltinComponentsMap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Builtin 组件映射去重 --- .../src/generator/vue/sfc/genSetupSFC.js | 13 +- .../src/plugins/parseSchemaPlugin.js | 12 +- .../generator/expected/appdemo01/package.json | 7 +- .../expected/appdemo01/src/router/index.js | 23 ++- .../appdemo01/src/views/testCanvasRowCol.vue | 51 +++++ .../test/testcases/generator/mockData.js | 176 ++++++++++++++++++ 6 files changed, 273 insertions(+), 9 deletions(-) create mode 100644 packages/vue-generator/test/testcases/generator/expected/appdemo01/src/views/testCanvasRowCol.vue diff --git a/packages/vue-generator/src/generator/vue/sfc/genSetupSFC.js b/packages/vue-generator/src/generator/vue/sfc/genSetupSFC.js index 23d2dcee3..388f847a0 100644 --- a/packages/vue-generator/src/generator/vue/sfc/genSetupSFC.js +++ b/packages/vue-generator/src/generator/vue/sfc/genSetupSFC.js @@ -270,7 +270,18 @@ export const genSFCWithDefaultPlugin = (schema, componentsMap, config = {}, next } // 兼容单独调用的场景,单独调用时,这里会默认加上 builtInComponents - const compsMapWithBuiltIn = [...componentsMap, ...BUILTIN_COMPONENTS_MAP] + const compsMapWithBuiltIn = [...componentsMap] + + for (const builtInComp of BUILTIN_COMPONENTS_MAP) { + if ( + !compsMapWithBuiltIn.find( + ({ componentName, package: packageName }) => + componentName === builtInComp.componentName && packageName === builtInComp.package + ) + ) { + compsMapWithBuiltIn.push(builtInComp) + } + } return generateSFCFile(schema, compsMapWithBuiltIn, newConfig, nextPage) } diff --git a/packages/vue-generator/src/plugins/parseSchemaPlugin.js b/packages/vue-generator/src/plugins/parseSchemaPlugin.js index c8fa7cf21..9cc7128ba 100644 --- a/packages/vue-generator/src/plugins/parseSchemaPlugin.js +++ b/packages/vue-generator/src/plugins/parseSchemaPlugin.js @@ -14,7 +14,17 @@ function parseSchema() { const { pageSchema } = schema const pagesMap = {} const resPageTree = [] - schema.componentsMap = [...schema.componentsMap, ...BUILTIN_COMPONENTS_MAP] + + for (const builtInComp of BUILTIN_COMPONENTS_MAP) { + if ( + !schema.componentsMap.find( + ({ componentName, package: packageName }) => + componentName === builtInComp.componentName && packageName === builtInComp.package + ) + ) { + schema.componentsMap.push(builtInComp) + } + } for (const componentItem of pageSchema) { pagesMap[componentItem.meta.id] = componentItem diff --git a/packages/vue-generator/test/testcases/generator/expected/appdemo01/package.json b/packages/vue-generator/test/testcases/generator/expected/appdemo01/package.json index 4e9675d38..a404389d7 100644 --- a/packages/vue-generator/test/testcases/generator/expected/appdemo01/package.json +++ b/packages/vue-generator/test/testcases/generator/expected/appdemo01/package.json @@ -11,14 +11,15 @@ "module": "dist/index.js", "dependencies": { "@opentiny/tiny-engine-i18n-host": "^1.0.0", - "@opentiny/vue": "latest", - "@opentiny/vue-icon": "latest", + "@opentiny/vue": "0.1.16", + "@opentiny/vue-icon": "0.1.16", "axios": "latest", "axios-mock-adapter": "^1.19.0", "vue": "^3.3.9", "vue-i18n": "^9.2.0-beta.3", "vue-router": "^4.2.5", - "pinia": "^2.1.7" + "pinia": "^2.1.7", + "@opentiny/tiny-engine-builtin-component": "^2.0.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.1.2", diff --git a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/router/index.js b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/router/index.js index 7cd5ff8e8..a28912f42 100644 --- a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/router/index.js +++ b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/router/index.js @@ -1,11 +1,26 @@ import { createRouter, createWebHashHistory } from 'vue-router' const routes = [ - { path: '/', redirect: '/demopage' }, - { path: '/demopage', component: () => import('@/views/DemoPage.vue') }, - { path: '/createVm', component: () => import('@/views/createVm.vue') } + { + name: '5bhD7p5FUsUOTFRN', + path: 'demopage', + component: () => import('@/views/DemoPage.vue'), + children: [] + }, + { + name: 'NTJ4MjvqoVj8OVsc', + path: 'createVm', + component: () => import('@/views/createVm.vue'), + children: [] + }, + { + name: '1737797330916', + path: 'testCanvasRowCol', + component: () => import('@/views/testCanvasRowCol.vue'), + children: [] + } ] export default createRouter({ history: createWebHashHistory(), - routes + routes: [{ path: '/', children: routes }] }) diff --git a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/views/testCanvasRowCol.vue b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/views/testCanvasRowCol.vue new file mode 100644 index 000000000..6ce6b8b7f --- /dev/null +++ b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/views/testCanvasRowCol.vue @@ -0,0 +1,51 @@ + + + + diff --git a/packages/vue-generator/test/testcases/generator/mockData.js b/packages/vue-generator/test/testcases/generator/mockData.js index 71bdd356f..046746aec 100644 --- a/packages/vue-generator/test/testcases/generator/mockData.js +++ b/packages/vue-generator/test/testcases/generator/mockData.js @@ -1875,6 +1875,182 @@ export const appSchemaDemo01 = { isHome: false, _id: 'NTJ4MjvqoVj8OVsc' } + }, + { + state: { + dataDisk: [1, 2, 3] + }, + methods: {}, + componentName: 'Page', + css: 'body {\r\n background-color:#eef0f5 ;\r\n margin-bottom: 80px;\r\n}', + props: {}, + children: [ + { + componentName: 'CanvasRowColContainer', + props: { + rowGap: '20px' + }, + children: [ + { + componentName: 'CanvasRow', + props: { + rowGap: '20px', + colGap: '20px' + }, + children: [ + { + componentName: 'CanvasCol', + props: { + rowGap: '20px', + colGap: '20px', + grow: true, + shrink: true, + widthType: 'auto' + }, + id: '4514b344' + }, + { + componentName: 'CanvasCol', + props: { + rowGap: '20px', + colGap: '20px', + grow: true, + shrink: true, + widthType: 'auto' + }, + children: [], + id: '3664a254' + } + ], + id: '63553246' + }, + { + componentName: 'CanvasRow', + props: { + rowGap: '20px', + colGap: '20px' + }, + children: [ + { + componentName: 'CanvasCol', + props: { + rowGap: '20px', + colGap: '20px', + grow: true, + shrink: true, + widthType: 'auto' + }, + id: '2c13444f', + children: [ + { + componentName: 'CanvasRow', + props: { + rowGap: '20px', + colGap: '20px' + }, + children: [ + { + componentName: 'CanvasCol', + props: { + rowGap: '20px', + colGap: '20px', + grow: true, + shrink: true, + widthType: 'auto' + }, + children: [], + id: '24256327' + } + ], + id: '56453426' + }, + { + componentName: 'CanvasRow', + props: { + rowGap: '20px', + colGap: '20px' + }, + children: [ + { + componentName: 'CanvasCol', + props: { + rowGap: '20px', + colGap: '20px', + grow: true, + shrink: true, + widthType: 'auto' + }, + id: '5451f224' + } + ], + id: '26364626' + }, + { + componentName: 'CanvasRow', + props: { + rowGap: '20px', + colGap: '20px' + }, + children: [ + { + componentName: 'CanvasCol', + props: { + rowGap: '20px', + colGap: '20px', + grow: true, + shrink: true, + widthType: 'auto' + }, + children: [], + id: '26232436' + } + ], + id: '52555445' + } + ] + }, + { + componentName: 'CanvasCol', + props: { + rowGap: '20px', + colGap: '20px', + grow: true, + shrink: true, + widthType: 'auto' + }, + children: [], + id: '53553563' + } + ], + id: '53b5fe13' + } + ], + id: '25452c43' + } + ], + fileName: 'testCanvasRowCol', + meta: { + name: 'testCanvasRowCol', + id: 1737797330916, + app: '918', + router: 'testCanvasRowCol', + tenant: 1, + isBody: false, + parentId: '0', + group: 'staticPages', + depth: 0, + isPage: true, + isDefault: false, + occupier: { + id: 86, + username: '开发者', + email: 'developer@lowcode.com', + resetPasswordToken: 'developer', + confirmationToken: 'dfb2c162-351f-4f44-ad5f-8998', + is_admin: true + }, + isHome: false + } } ], componentsMap: [ From a1e88328a5fecbc9ac62c4a0d85dc81ebc1d5e21 Mon Sep 17 00:00:00 2001 From: chilingling Date: Tue, 4 Feb 2025 22:54:01 -0800 Subject: [PATCH 2/2] fix: deduplicate destructuring import statement --- .../src/generator/vue/sfc/genSetupSFC.js | 13 +----------- .../src/plugins/parseSchemaPlugin.js | 11 +--------- .../src/utils/generateImportStatement.js | 21 ++++++++++++++++--- .../test/testcases/generator/mockData.js | 6 +----- 4 files changed, 21 insertions(+), 30 deletions(-) diff --git a/packages/vue-generator/src/generator/vue/sfc/genSetupSFC.js b/packages/vue-generator/src/generator/vue/sfc/genSetupSFC.js index 388f847a0..23d2dcee3 100644 --- a/packages/vue-generator/src/generator/vue/sfc/genSetupSFC.js +++ b/packages/vue-generator/src/generator/vue/sfc/genSetupSFC.js @@ -270,18 +270,7 @@ export const genSFCWithDefaultPlugin = (schema, componentsMap, config = {}, next } // 兼容单独调用的场景,单独调用时,这里会默认加上 builtInComponents - const compsMapWithBuiltIn = [...componentsMap] - - for (const builtInComp of BUILTIN_COMPONENTS_MAP) { - if ( - !compsMapWithBuiltIn.find( - ({ componentName, package: packageName }) => - componentName === builtInComp.componentName && packageName === builtInComp.package - ) - ) { - compsMapWithBuiltIn.push(builtInComp) - } - } + const compsMapWithBuiltIn = [...componentsMap, ...BUILTIN_COMPONENTS_MAP] return generateSFCFile(schema, compsMapWithBuiltIn, newConfig, nextPage) } diff --git a/packages/vue-generator/src/plugins/parseSchemaPlugin.js b/packages/vue-generator/src/plugins/parseSchemaPlugin.js index 9cc7128ba..0217c6a4d 100644 --- a/packages/vue-generator/src/plugins/parseSchemaPlugin.js +++ b/packages/vue-generator/src/plugins/parseSchemaPlugin.js @@ -15,16 +15,7 @@ function parseSchema() { const pagesMap = {} const resPageTree = [] - for (const builtInComp of BUILTIN_COMPONENTS_MAP) { - if ( - !schema.componentsMap.find( - ({ componentName, package: packageName }) => - componentName === builtInComp.componentName && packageName === builtInComp.package - ) - ) { - schema.componentsMap.push(builtInComp) - } - } + schema.componentsMap = [...schema.componentsMap, ...BUILTIN_COMPONENTS_MAP] for (const componentItem of pageSchema) { pagesMap[componentItem.meta.id] = componentItem diff --git a/packages/vue-generator/src/utils/generateImportStatement.js b/packages/vue-generator/src/utils/generateImportStatement.js index 2357ed2f9..eb4c2aa0a 100644 --- a/packages/vue-generator/src/utils/generateImportStatement.js +++ b/packages/vue-generator/src/utils/generateImportStatement.js @@ -17,16 +17,31 @@ export function generateImportStatement(config) { export function generateImportByPkgName(config) { const { pkgName, imports } = config - + const seen = new Set() const importStatements = imports .filter(({ destructuring }) => destructuring) .map(({ componentName, exportName }) => { if (componentName === exportName) { - return componentName + if (!seen.has(componentName)) { + seen.add(componentName) + + return componentName + } + + return '' + } + + const alias = `${exportName} as ${componentName}` + + if (!seen.has(alias)) { + seen.add(alias) + + return alias } - return `${exportName} as ${componentName}` + return '' }) + .filter((item) => Boolean(item)) // 默认导出如果存在,应该只有一个 let defaultImports = imports.find(({ destructuring }) => !destructuring) diff --git a/packages/vue-generator/test/testcases/generator/mockData.js b/packages/vue-generator/test/testcases/generator/mockData.js index 046746aec..44a2c81e9 100644 --- a/packages/vue-generator/test/testcases/generator/mockData.js +++ b/packages/vue-generator/test/testcases/generator/mockData.js @@ -2043,11 +2043,7 @@ export const appSchemaDemo01 = { isDefault: false, occupier: { id: 86, - username: '开发者', - email: 'developer@lowcode.com', - resetPasswordToken: 'developer', - confirmationToken: 'dfb2c162-351f-4f44-ad5f-8998', - is_admin: true + username: '开发者' }, isHome: false }