From f9250944c0be78b09efb45afb56d4caaf5e55be9 Mon Sep 17 00:00:00 2001 From: chilingling Date: Wed, 27 Dec 2023 00:26:41 -0800 Subject: [PATCH 1/3] add generate global state code --- app/service/app-center/generate.ts | 90 +++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/app/service/app-center/generate.ts b/app/service/app-center/generate.ts index 8262e7d..bbf6146 100644 --- a/app/service/app-center/generate.ts +++ b/app/service/app-center/generate.ts @@ -24,7 +24,8 @@ const WORDS = { saveCode: 'save the code locally', generateCode: 'Generate app preview code', dslParse: 'dsl parsing', - generateDependencies: 'generate dependencies' + generateDependencies: 'generate dependencies', + generateGlobalState: 'generate global state' }; const COMPONENT_NAME = { @@ -77,7 +78,8 @@ class Generate extends DataServcice { this.generateBlock(), this.generateUtils(), this.generateRouter(), - this.generateDependencies() + this.generateDependencies(), + this.generateGlobalState() ]; // 执行生成代码任务,任何一个 reject 立即结束,并抛出错误,由调用方 catch @@ -603,6 +605,90 @@ export default createRouter({ throw new Error(message); } } + + private async generateGlobalState () { + const { global_state } = this.schema; + let globalState: { + actions?: { + [key:string]: { + type: string; + value: string + } + }; + getters?: { + [key:string]: { + type: string; + value: string; + } + }; + id: string; + state: { [key:string]: any } + }[] = [] + + if (Array.isArray(global_state)) { + globalState = [...global_state] + } + + const baseDir = `${this.generatePath}/src/stores` + // write global state + const res:any = [] + const ids:any[] = [] + + for (const stateItem of globalState) { + let importStatement = "import { defineStore } from 'pinia'" + const { id, state, getters, actions } = stateItem + + ids.push(id) + + const stateExpression = `() => ({ ${Object.entries(state) + .map((item) => item.join(':')) + .join(',')} })` + + const getterExpression = Object.entries(getters || {}) + .filter((item) => item[1]?.type === 'JSFunction') + .map(([key, value]) => `${key}: ${value.value}`) + .join(',') + + const actionExpressions = Object.entries(actions || {}) + .filter((item) => item[1]?.type === 'JSFunction') + .map(([key, value]) => `${key}: ${value.value}`) + .join(',') + + const storeFiles = ` + ${importStatement} + export const ${id} = defineStore({ + id: ${id}, + state: ${stateExpression}, + getters: { ${getterExpression} }, + actions: { ${actionExpressions} } + }) + ` + const fileName = `${id}.js` + + res.push({ + fileName, + fileContent: this.formatCode(storeFiles, { ...prettierCommon, parser: 'typescript' }, fileName) + }) + } + + res.push({ + fileName: 'index.js', + fileContent: ids.map((item) => `export { ${item} } from './${item}'`).join('\n') + }) + + try { + for (const { fileName, fileContent } of res) { + await this.saveCode(fileContent, path.resolve(baseDir, fileName)) + } + + } catch (error) { + const message = `failed to ${WORDS.generateGlobalState}: ${this.getMessage(error)}`; + this.logger.error(message); + + throw new Error(message); + } + + } } export default Generate; -- Gitee From 061d24091285e19001d2773ecdf2c831c163b4f0 Mon Sep 17 00:00:00 2001 From: gene9831 Date: Thu, 28 Dec 2023 01:31:13 -0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E7=9A=84=E7=94=9F=E6=88=90=E5=85=A8=E5=B1=80=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=BB=A3=E7=A0=81=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/app-center/generate.ts | 33 +++++++++++++----------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/app/service/app-center/generate.ts b/app/service/app-center/generate.ts index bbf6146..ae7332a 100644 --- a/app/service/app-center/generate.ts +++ b/app/service/app-center/generate.ts @@ -607,7 +607,7 @@ export default createRouter({ } private async generateGlobalState () { - const { global_state } = this.schema; + const { global_state } = this.schema.meta; let globalState: { actions?: { [key:string]: { @@ -634,33 +634,28 @@ export default createRouter({ const res:any = [] const ids:any[] = [] + const getStoreFnStrs = (getters: Record = {}) => + Object.values(getters) + .map(({ value }) => value?.replace(/function /, '')) + .join(',\n'); + for (const stateItem of globalState) { let importStatement = "import { defineStore } from 'pinia'" const { id, state, getters, actions } = stateItem ids.push(id) - const stateExpression = `() => ({ ${Object.entries(state) - .map((item) => item.join(':')) - .join(',')} })` - - const getterExpression = Object.entries(getters || {}) - .filter((item) => item[1]?.type === 'JSFunction') - .map(([key, value]) => `${key}: ${value.value}`) - .join(',') - - const actionExpressions = Object.entries(actions || {}) - .filter((item) => item[1]?.type === 'JSFunction') - .map(([key, value]) => `${key}: ${value.value}`) - .join(',') - const storeFiles = ` ${importStatement} export const ${id} = defineStore({ - id: ${id}, - state: ${stateExpression}, - getters: { ${getterExpression} }, - actions: { ${actionExpressions} } + id: '${id}', + state: () => (${JSON.stringify(state)}), + getters: { + ${getStoreFnStrs(getters)} + }, + actions: { + ${getStoreFnStrs(actions)} + } }) ` const fileName = `${id}.js` -- Gitee From 69a80b4b23f930ab90439c2c09ac3d08db2ca7ab Mon Sep 17 00:00:00 2001 From: gene9831 Date: Thu, 28 Dec 2023 17:56:10 -0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=9A=84=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/app-center/generate.ts | 4 ++-- app/validate/app-center/app.ts | 2 +- config/config.default.ts | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/service/app-center/generate.ts b/app/service/app-center/generate.ts index ae7332a..43a9bd7 100644 --- a/app/service/app-center/generate.ts +++ b/app/service/app-center/generate.ts @@ -118,7 +118,7 @@ class Generate extends DataServcice { dataSource: { dataHandler, list: originList } } = this.schema; const fileName = 'dataSource.json'; - const filepath = path.resolve(this.generatePath, 'src', fileName); + const filepath = path.resolve(this.generatePath, 'src/lowcode', fileName); const list = originList.map(({ id, name, data }) => ({ id, name, ...data })); const code = { dataHandler, list }; @@ -133,7 +133,7 @@ class Generate extends DataServcice { if (utils?.length) { const utilStr = this.generateExport(utils); const fileName = 'utils.js'; - const filepath = path.resolve(this.generatePath, 'src', fileName); + const filepath = path.resolve(this.generatePath, 'src/lowcode', fileName); const content = this.formatCode(utilStr, { ...prettierCommon, parser: 'typescript' }, fileName); return this.saveCode(content, filepath, fileName); diff --git a/app/validate/app-center/app.ts b/app/validate/app-center/app.ts index 92dac61..5828ee3 100644 --- a/app/validate/app-center/app.ts +++ b/app/validate/app-center/app.ts @@ -55,7 +55,7 @@ export const updateAppRule = { export const publishAppRule = { id: 'id', - commitMsg: 'commit', + commitMsg: 'string', branch: 'string', canCreateNewBranch: 'boolean', allGenerate: 'boolean' diff --git a/config/config.default.ts b/config/config.default.ts index b18bb29..c115bc0 100644 --- a/config/config.default.ts +++ b/config/config.default.ts @@ -85,22 +85,22 @@ export default (appInfo) => { config.previewTemplate = { default: { - vue: '@opentiny/tiny-engine-generate-preview' + vue: '@opentiny/tiny-engine-preview-vue' }, common: { - vue: '@opentiny/tiny-engine-generate-preview' + vue: '@opentiny/tiny-engine-preview-vue' }, bigScreen: { - vue: '@opentiny/tiny-engine-generate-preview' + vue: '@opentiny/tiny-engine-preview-vue' }, priceCalculator: { - vue: '@opentiny/tiny-engine-generate-preview' + vue: '@opentiny/tiny-engine-preview-vue' }, mobile: { - vue: '@opentiny/tiny-engine-generate-preview' + vue: '@opentiny/tiny-engine-preview-vue' }, taihu: { - vue: '@opentiny/tiny-engine-generate-preview' + vue: '@opentiny/tiny-engine-preview-vue' } }; -- Gitee