From 257ac3866ab3d821538f14238a80fe08124618e6 Mon Sep 17 00:00:00 2001 From: chilingling Date: Mon, 7 Apr 2025 20:09:07 +0800 Subject: [PATCH 1/2] fix: genCodeUnitTest failed --- .../src/generator/vue/sfc/generateAttribute.js | 8 +++++++- .../element-plus-case/element-plus-case.test.js | 2 +- .../expected/appdemo01/src/http/axios.js | 10 +++++++--- .../appdemo01/src/lowcodeConfig/dataSource.js | 4 +++- .../expected/appdemo01/vite.config.js | 3 ++- .../generator/expected/appdemo01/src/http/axios.js | 10 +++++++--- .../appdemo01/src/lowcodeConfig/dataSource.js | 4 +++- .../expected/appdemo01/src/views/createVm.vue | 7 +++++-- .../generator/expected/appdemo01/vite.config.js | 3 ++- .../test/testcases/generator/generateApp.test.js | 2 +- .../test/testcases/sfc/accessor/accessor.test.js | 12 +++++++----- .../testcases/sfc/accessor/expected/Accessor.vue | 1 + .../test/testcases/sfc/accessor/schema.json | 1 + .../test/testcases/sfc/case01/expected/FormTable.vue | 9 ++++++--- 14 files changed, 53 insertions(+), 23 deletions(-) diff --git a/packages/vue-generator/src/generator/vue/sfc/generateAttribute.js b/packages/vue-generator/src/generator/vue/sfc/generateAttribute.js index 9244f978f7..6ec0eb1454 100644 --- a/packages/vue-generator/src/generator/vue/sfc/generateAttribute.js +++ b/packages/vue-generator/src/generator/vue/sfc/generateAttribute.js @@ -469,6 +469,7 @@ const transformObjValue = (renderKey, value, globalHooks, config, transformObjTy return result } +const normalKeyRegexp = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/ export const transformObjType = (obj, globalHooks, config) => { if (!obj || typeof obj !== 'object') { return { @@ -481,7 +482,12 @@ export const transformObjType = (obj, globalHooks, config) => { let shouldRenderKey = !Array.isArray(obj) for (const [key, value] of Object.entries(obj)) { - let renderKey = shouldRenderKey ? `${key}: ` : '' + let renderKey = shouldRenderKey + ? // 如果 key 是合法的变量名,则直接使用 key: 的形式,否则需要添加引号,防止不合法的 key 导致语法错误 + normalKeyRegexp.test(key) + ? `${key}: ` + : `'${key}': ` + : '' const { res, shouldBindToState: tmpShouldBindToState } = transformObjValue( renderKey, diff --git a/packages/vue-generator/test/testcases/element-plus-case/element-plus-case.test.js b/packages/vue-generator/test/testcases/element-plus-case/element-plus-case.test.js index edd6ddf1ec..ff69a40dcd 100644 --- a/packages/vue-generator/test/testcases/element-plus-case/element-plus-case.test.js +++ b/packages/vue-generator/test/testcases/element-plus-case/element-plus-case.test.js @@ -32,7 +32,7 @@ describe('generate element-plus material project correctly', () => { fs.writeFileSync( path.resolve(__dirname, `./result/appdemo01/${filePath}/${fileName}`), // 这里需要将换行符替换成 CRLF 格式的 - fileContent.replace(/\r?\n/g, '\r\n') + fileContent.replace(/\r?\n/g, '\n') ) } else if (fileContent instanceof Blob) { const arrayBuffer = await fileContent.arrayBuffer() diff --git a/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/src/http/axios.js b/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/src/http/axios.js index 4b2d6e4208..3654c619b4 100644 --- a/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/src/http/axios.js +++ b/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/src/http/axios.js @@ -20,6 +20,7 @@ export default (config) => { if (typeof MockAdapter.prototype.proxy === 'undefined') { MockAdapter.prototype.proxy = function ({ url, config = {}, proxy, response, handleData } = {}) { + // eslint-disable-next-line @typescript-eslint/no-this-alias let stream = this const request = (proxy, any) => { return (setting) => { @@ -28,8 +29,9 @@ export default (config) => { axios .get(any ? proxy + setting.url + '.json' : proxy, config) .then(({ data }) => { - /* eslint-disable no-useless-call */ - typeof handleData === 'function' && (data = handleData.call(null, data, setting)) + if (typeof handleData === 'function') { + data = handleData.call(null, data, setting) + } resolve([200, data]) }) .catch((error) => { @@ -127,7 +129,9 @@ export default (config) => { return mock }, disableMock() { - mock && mock.restore() + if (mock) { + mock.restore() + } mock = undefined }, isMock() { diff --git a/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/src/lowcodeConfig/dataSource.js b/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/src/lowcodeConfig/dataSource.js index 80e1e88e7b..f82f146bfc 100644 --- a/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/src/lowcodeConfig/dataSource.js +++ b/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/src/lowcodeConfig/dataSource.js @@ -72,7 +72,9 @@ dataSources.list.forEach((config) => { } const errorHandler = (error) => { - config.errorHandler?.value && createFn(config.errorHandler.value)(error) + if (config.errorHandler?.value) { + createFn(config.errorHandler.value)(error) + } dataSource.status = 'error' dataSource.error = error } diff --git a/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/vite.config.js b/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/vite.config.js index e1e57978b1..b611ebc4a3 100644 --- a/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/vite.config.js +++ b/packages/vue-generator/test/testcases/element-plus-case/expected/appdemo01/vite.config.js @@ -19,5 +19,6 @@ export default defineConfig({ transformMixedEsModules: true }, cssCodeSplit: false - } + }, + base: './' }) diff --git a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/http/axios.js b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/http/axios.js index 4b2d6e4208..3654c619b4 100644 --- a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/http/axios.js +++ b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/http/axios.js @@ -20,6 +20,7 @@ export default (config) => { if (typeof MockAdapter.prototype.proxy === 'undefined') { MockAdapter.prototype.proxy = function ({ url, config = {}, proxy, response, handleData } = {}) { + // eslint-disable-next-line @typescript-eslint/no-this-alias let stream = this const request = (proxy, any) => { return (setting) => { @@ -28,8 +29,9 @@ export default (config) => { axios .get(any ? proxy + setting.url + '.json' : proxy, config) .then(({ data }) => { - /* eslint-disable no-useless-call */ - typeof handleData === 'function' && (data = handleData.call(null, data, setting)) + if (typeof handleData === 'function') { + data = handleData.call(null, data, setting) + } resolve([200, data]) }) .catch((error) => { @@ -127,7 +129,9 @@ export default (config) => { return mock }, disableMock() { - mock && mock.restore() + if (mock) { + mock.restore() + } mock = undefined }, isMock() { diff --git a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/lowcodeConfig/dataSource.js b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/lowcodeConfig/dataSource.js index 80e1e88e7b..f82f146bfc 100644 --- a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/lowcodeConfig/dataSource.js +++ b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/lowcodeConfig/dataSource.js @@ -72,7 +72,9 @@ dataSources.list.forEach((config) => { } const errorHandler = (error) => { - config.errorHandler?.value && createFn(config.errorHandler.value)(error) + if (config.errorHandler?.value) { + createFn(config.errorHandler.value)(error) + } dataSource.status = 'error' dataSource.error = error } diff --git a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/views/createVm.vue b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/views/createVm.vue index c3dfa7f81e..57881bbb7a 100644 --- a/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/views/createVm.vue +++ b/packages/vue-generator/test/testcases/generator/expected/appdemo01/src/views/createVm.vue @@ -285,7 +285,10 @@ >
- +
- + 增加一块数据盘 您还可以挂载 21 块磁盘(云硬盘)
{ fs.writeFileSync( path.resolve(__dirname, `./result/appdemo01/${filePath}/${fileName}`), // 这里需要将换行符替换成 CRLF 格式的 - fileContent.replace(/\r?\n/g, '\r\n') + fileContent.replace(/\r?\n/g, '\n') ) } else if (fileContent instanceof Blob) { const arrayBuffer = await fileContent.arrayBuffer() diff --git a/packages/vue-generator/test/testcases/sfc/accessor/accessor.test.js b/packages/vue-generator/test/testcases/sfc/accessor/accessor.test.js index 33f63288b1..e1b5b21791 100644 --- a/packages/vue-generator/test/testcases/sfc/accessor/accessor.test.js +++ b/packages/vue-generator/test/testcases/sfc/accessor/accessor.test.js @@ -1,11 +1,13 @@ -import { expect, test } from 'vitest' +import { expect, test, describe } from 'vitest' import { genSFCWithDefaultPlugin } from '@/generator/vue/sfc' import schema from './schema.json' import { formatCode } from '@/utils/formatCode' -test('should validate tagName', async () => { - const res = genSFCWithDefaultPlugin(schema, []) - const formattedCode = formatCode(res, 'vue') +describe('should generate state correctly', () => { + test('should generate state accessor correctly', async () => { + const res = genSFCWithDefaultPlugin(schema, []) + const formattedCode = formatCode(res, 'vue') - await expect(formattedCode).toMatchFileSnapshot('./expected/Accessor.vue') + await expect(formattedCode).toMatchFileSnapshot('./expected/Accessor.vue') + }) }) diff --git a/packages/vue-generator/test/testcases/sfc/accessor/expected/Accessor.vue b/packages/vue-generator/test/testcases/sfc/accessor/expected/Accessor.vue index fa5fc1b75e..c515a9711d 100644 --- a/packages/vue-generator/test/testcases/sfc/accessor/expected/Accessor.vue +++ b/packages/vue-generator/test/testcases/sfc/accessor/expected/Accessor.vue @@ -20,6 +20,7 @@ const { utils } = wrap(function () { return this })() const state = vue.reactive({ + 'a.b': 'test', firstName: 'Opentiny', lastName: 'TinyEngine', nullValue: null, diff --git a/packages/vue-generator/test/testcases/sfc/accessor/schema.json b/packages/vue-generator/test/testcases/sfc/accessor/schema.json index a72472ba0f..204121eec1 100644 --- a/packages/vue-generator/test/testcases/sfc/accessor/schema.json +++ b/packages/vue-generator/test/testcases/sfc/accessor/schema.json @@ -13,6 +13,7 @@ } ], "state": { + "a.b": "test", "firstName": "Opentiny", "lastName": "TinyEngine", "nullValue": { diff --git a/packages/vue-generator/test/testcases/sfc/case01/expected/FormTable.vue b/packages/vue-generator/test/testcases/sfc/case01/expected/FormTable.vue index ade1506a08..8328bbfe36 100644 --- a/packages/vue-generator/test/testcases/sfc/case01/expected/FormTable.vue +++ b/packages/vue-generator/test/testcases/sfc/case01/expected/FormTable.vue @@ -60,7 +60,7 @@ >
循环渲染:
- + (
- + {props.isEdit && ( )} @@ -207,7 +207,10 @@ const state = vue.reactive({ > {state.cityOptions.length && {t('operation.hello')}} - +
) } From 23fa50f4678d7bd294a7d02c091b694c137c3930 Mon Sep 17 00:00:00 2001 From: chilingling Date: Mon, 7 Apr 2025 20:55:29 +0800 Subject: [PATCH 2/2] fix: ignore lineEnding compare --- .../element-plus-case/element-plus-case.test.js | 10 ++++------ .../test/testcases/generator/generateApp.test.js | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/vue-generator/test/testcases/element-plus-case/element-plus-case.test.js b/packages/vue-generator/test/testcases/element-plus-case/element-plus-case.test.js index ff69a40dcd..19d0bd4364 100644 --- a/packages/vue-generator/test/testcases/element-plus-case/element-plus-case.test.js +++ b/packages/vue-generator/test/testcases/element-plus-case/element-plus-case.test.js @@ -29,11 +29,7 @@ describe('generate element-plus material project correctly', () => { fs.mkdirSync(path.resolve(__dirname, `./result/appdemo01/${filePath}`), { recursive: true }) if (typeof fileContent === 'string') { - fs.writeFileSync( - path.resolve(__dirname, `./result/appdemo01/${filePath}/${fileName}`), - // 这里需要将换行符替换成 CRLF 格式的 - fileContent.replace(/\r?\n/g, '\n') - ) + fs.writeFileSync(path.resolve(__dirname, `./result/appdemo01/${filePath}/${fileName}`), fileContent) } else if (fileContent instanceof Blob) { const arrayBuffer = await fileContent.arrayBuffer() const buffer = Buffer.from(arrayBuffer) @@ -46,7 +42,9 @@ describe('generate element-plus material project correctly', () => { compareContent: true, ignoreLineEnding: true, ignoreAllWhiteSpaces: true, - ignoreEmptyLines: true + ignoreEmptyLines: true, + compareFileSync: dirCompare.fileCompareHandlers.lineBasedFileCompare.compareSync, + compareFileAsync: dirCompare.fileCompareHandlers.lineBasedFileCompare.compareAsync } const path1 = path.resolve(__dirname, './expected/appdemo01') diff --git a/packages/vue-generator/test/testcases/generator/generateApp.test.js b/packages/vue-generator/test/testcases/generator/generateApp.test.js index b422e78990..55b5af8bc3 100644 --- a/packages/vue-generator/test/testcases/generator/generateApp.test.js +++ b/packages/vue-generator/test/testcases/generator/generateApp.test.js @@ -29,11 +29,7 @@ describe('generate whole application', () => { fs.mkdirSync(path.resolve(__dirname, `./result/appdemo01/${filePath}`), { recursive: true }) if (typeof fileContent === 'string') { - fs.writeFileSync( - path.resolve(__dirname, `./result/appdemo01/${filePath}/${fileName}`), - // 这里需要将换行符替换成 CRLF 格式的 - fileContent.replace(/\r?\n/g, '\n') - ) + fs.writeFileSync(path.resolve(__dirname, `./result/appdemo01/${filePath}/${fileName}`), fileContent) } else if (fileContent instanceof Blob) { const arrayBuffer = await fileContent.arrayBuffer() const buffer = Buffer.from(arrayBuffer) @@ -46,7 +42,9 @@ describe('generate whole application', () => { compareContent: true, ignoreLineEnding: true, ignoreAllWhiteSpaces: true, - ignoreEmptyLines: true + ignoreEmptyLines: true, + compareFileSync: dirCompare.fileCompareHandlers.lineBasedFileCompare.compareSync, + compareFileAsync: dirCompare.fileCompareHandlers.lineBasedFileCompare.compareAsync } const path1 = path.resolve(__dirname, './expected/appdemo01')