import { mergeOptions } from '../utils/mergeOptions'
const defaultOption = {
fileName: '',
path: './src/stores'
}
const parseSchema = (schema) => {
let globalState = schema?.globalState
if (!Array.isArray(globalState)) {
globalState = []
}
return globalState
}
function genDependenciesPlugin(options = {}) {
const realOptions = mergeOptions(defaultOption, options)
const { path } = realOptions
return {
name: 'tinyEngine-generateCode-plugin-globalState',
description: 'transform schema to globalState',
* 转换 globalState
* @param {import('@opentiny/tiny-engine-dsl-vue').IAppSchema} schema
* @returns
*/
run(schema) {
const globalState = parseSchema(schema)
const res = []
const ids = []
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) => {
let [key, value] = item
if (typeof value === 'string') {
value = `'${value}'`
}
if (value && typeof value === 'object') {
value = JSON.stringify(value)
}
return [key, value].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} }
})
`
res.push({
fileType: 'js',
fileName: `${id}.js`,
path,
fileContent: storeFiles
})
}
res.push({
fileType: 'js',
fileName: 'index.js',
path,
fileContent: ids.map((item) => `export { ${item} } from './${item}'`).join('\n')
})
return res
}
}
}
export default genDependenciesPlugin