const { DEVUI_NAMESPACE, CSS_CLASS_PREFIX } = require('../shared/constant');
const { camelCase } = require('lodash');
const { bigCamelCase } = require('../shared/utils');
exports.createComponentTemplate = ({ styleName, componentName, typesName }) => `\
import { defineComponent, toRefs } from 'vue';
import type { SetupContext } from 'vue';
import { ${camelCase(componentName)}Props, ${bigCamelCase(
componentName
)}Props } from './${typesName}';
import './${styleName}.scss';
export default defineComponent({
name: '${bigCamelCase(DEVUI_NAMESPACE)}${bigCamelCase(componentName)}',
props: ${camelCase(componentName)}Props,
emits: [],
setup(props: ${bigCamelCase(componentName)}Props, ctx: SetupContext) {
// 直接解构 props 会导致响应式失效,需要使用 toRefs 进行包裹
// const { data } = toRefs(props);
// console.log(data.value);
return () => {
return (
<div class="${CSS_CLASS_PREFIX}-${componentName}"></div>
);
};
}
});
`;
exports.createTypesTemplate = ({ componentName }) => `\
import type { PropType, ExtractPropTypes } from 'vue';
export const ${camelCase(componentName)}Props = {
// data: {
// type: type,
// default: defaultValue
// },
} as const;
export type ${bigCamelCase(componentName)}Props = ExtractPropTypes<typeof ${camelCase(
componentName
)}Props>;
`;
exports.createDirectiveTemplate = () => `\
// can export function.
export default {
created() { },
beforeMount() { },
mounted() { },
beforeUpdate() { },
updated() { },
beforeUnmount() { },
unmounted() { }
};
`;
exports.createServiceTemplate = ({ componentName, typesName, serviceName }) => `\
import { ${bigCamelCase(componentName)}Props } from './${typesName}';
const ${bigCamelCase(serviceName)} = {
// open(props: ${bigCamelCase(componentName)}Props) { }
};
export default ${bigCamelCase(serviceName)};
`;
exports.createStyleTemplate = ({ componentName }) => `\
// 引入主题变量
@import '../../styles-var/devui-var.scss';
.#{$devui-prefix}-${componentName} {
//
}
`;
exports.createIndexTemplate = ({
title,
category,
hasComponent,
hasDirective,
hasService,
componentName,
directiveName,
serviceName
}) => {
const importComponentStr = `\nimport ${bigCamelCase(componentName)} from './src/${componentName}';`;
const importDirectiveStr = `\nimport ${bigCamelCase(directiveName)} from './src/${directiveName}';`;
const importServiceStr = `\nimport ${bigCamelCase(serviceName)} from './src/${serviceName}';`;
const installComponentStr = `app.component(${bigCamelCase(componentName)}.name, ${bigCamelCase(componentName)});`;
const installDirectiveStr = `\n app.directive('${bigCamelCase(componentName)}', ${bigCamelCase(
directiveName
)})`;
const installServiceStr = `\n app.config.globalProperties.$${camelCase(
serviceName
)} = ${bigCamelCase(serviceName)}`;
const getPartStr = (state, str) => (state ? str : '');
const importStr =
getPartStr(hasComponent, importComponentStr) +
getPartStr(hasDirective, importDirectiveStr) +
getPartStr(hasService, importServiceStr);
const installStr =
getPartStr(hasComponent, installComponentStr) +
getPartStr(hasDirective, installDirectiveStr) +
getPartStr(hasService, installServiceStr);
return `\
import type { App } from 'vue';\
${importStr}
export * from './src/${componentName}-types';
export { ${[
hasComponent ? bigCamelCase(componentName) : null,
hasDirective ? bigCamelCase(directiveName) : null,
hasService ? bigCamelCase(serviceName) : null
]
.filter((p) => p !== null)
.join(', ')} };
export default {
title: '${bigCamelCase(componentName)} ${title}',
category: '${category}',
status: '1%', // TODO 组件完成状态,开发完组件新特性请及时更新该状态值;若组件开发完成则填入'100%',并删除该注释
install(app: App): void {
${installStr}
}
};
`;
};
exports.createTestsTemplate = ({
componentName,
directiveName,
serviceName,
hasComponent,
hasDirective,
hasService
}) => `\
import { ComponentPublicInstance } from 'vue';
import { DOMWrapper, mount, VueWrapper } from '@vue/test-utils';
import { ${[
hasComponent ? bigCamelCase(componentName) : null,
hasDirective ? bigCamelCase(directiveName) : null,
hasService ? bigCamelCase(serviceName) : null
]
.filter((p) => p !== null)
.join(', ')} } from '..';
describe('${componentName}', () => {
let wrapper: VueWrapper<ComponentPublicInstance>;
it('${componentName} init render', async () => {
wrapper = mount({
setup() {
return () => {
return <${bigCamelCase(componentName)} />;
};
},
});
// todo
})
})
`;
exports.createDocumentTemplate = ({ componentName, title }) => `\
# ${bigCamelCase(componentName)} ${title}
// todo 组件描述
#### 何时使用
// todo 使用场景描述
### 基本用法
:::demo // todo 基本用法描述
\`\`\`vue
<template>
<d-${componentName}>{{ data }}</d-${componentName}>
</template>
<script>
import { defineComponent, ref } from 'vue';
export default defineComponent({
setup() {
const data = ref('${title}');
return {
data
}
}
})
</script>
<style lang="scss">
// demo中的样式不支持 scoped,需要使用约定的class名称包裹,格式:demo-componentname-demoname
.demo-${componentName}-basic {
// css
}
</style>
\`\`\`
:::
### ${bigCamelCase(componentName)} 参数
| 参数名 | 类型 | 默认值 | 说明 | 跳转 Demo |
| :---- | :---- | :---- | :---- | :--------- |
| | \`string\` | | | [基本用法](#基本用法) |
| | [IXxx](#ixxx) | | | |
| | | | | |
### ${bigCamelCase(componentName)} 事件
| 事件名 | 回调参数 | 说明 | 跳转 Demo |
| :---- | :---- | :---- | :--------- |
| | | | |
| | | | |
| | | | |
### ${bigCamelCase(componentName)} 插槽
| 插槽名 | 说明 | 跳转 Demo |
| :---- | :---- | :--------- |
| default | | |
| | | |
| | | |
### ${bigCamelCase(componentName)} 类型定义
#### IXxx
\`\`\`ts
interface IXxx {
xxx: string;
}
\`\`\`
`;