kdesign-ui
Version:
kd is from company of klx, it provide quickly genarator company inner business front structure
136 lines (132 loc) • 3.21 kB
text/typescript
import {
GenerateStyle,
GenerateTpl,
GenerateJs
} from './index'
const babel = require('../babel')
class GenerateComTpl extends GenerateTpl {
CODE: string = ``
COMPOSE: Record<
string | number | symbol,
any
> = {}
TPL: string = `
<Modal
ref="Modal"
v-model="value"
:title="title"
:size="size">
<Layout>
<FormLayout>
<Form>
<Row>
<Col
:md="8"
:sm="8"
:lg="8"
:key="$index"
v-for="(item, $index) in formConfig">
<FormItem
:label="item.label"
:prop="item.key">
<Input
v-if="item.type === 'Input'"
v-model="item[item.key]" />
<DatePicker
v-else-if="item.type === 'DatePicker'"
v-model="item[item.key]"></DatePicker>
<Select
v-else-if="item.type === 'Select'"
v-model="item[item.key]">
<Option
:key="idx"
v-for="(opt, idx) in item.optionList"
:value="opt.value">{{opt.label}}</Option>
</Select>
</FormItem>
</Col>
</Row>
</Form>
</FormLayout>
</Layout>
</Modal>
`
constructor(name: string, props: any) {
super()
//生成组件
this.CODE = this.composeCode(this.generate(name, props))
}
generate(name: string, props: any) {
return this.TPL
}
generateModal () {
}
generateLayout () {
}
generateForm () {
}
}
class GenerateComJs extends GenerateJs {
CODE: string = ''
TPL: string = `
/* eslint-disable */
import Modal from '@/components/modal'
import FormLayout from '@/components/layout/form-layout/form-layout'
import Layout from '@/components/modal/layout'
export default {
data () {
return {}
},
components: {
Modal,
Layout,
FormLayout
},
methods: {
open (type, title) {
this.value = true
this.title = title
this.$methods('Modal', 'open')
},
close () {
this.$methods('Modal', 'close')
}
}
}`
constructor(options: VueConfig) {
super()
this.CODE = this.composeCode(this.generate(options))
}
generate(options: VueConfig) {
return babel(this.TPL, {
visitor(t: any, babylon: any) {
return {
ReturnStatement(path: any) {
if (path.node.leadingComments) return
const newBlockStatement = t.returnStatement(
babylon.parseExpression(JSON.stringify(options.data))
)
path.replaceWith(newBlockStatement)
}
}
},
lintCode(code: string) {
return code.replace(/data\(\) \{/, 'data () {').replace(/\"/g, '\'')
}
})
}
}
class GenerateComStyle extends GenerateStyle {
constructor(name: string) {
super()
}
}
module.exports = (props: any = {}) => {
const name = 'modal'
const tpl = new GenerateComTpl(name, props)
const js = new GenerateComJs({
data: props
})
const style = new GenerateComStyle(name)
return tpl.CODE + js.CODE + style.CODE
}