prompt.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. const path = require('path')
  2. const fs = require('fs')
  3. function getFolder(path) {
  4. const components = [path]
  5. const files = fs.readdirSync(path)
  6. files.forEach((item) => {
  7. const stat = fs.lstatSync(`${path}/${item}`)
  8. if (stat.isDirectory() === true && item !== 'components') {
  9. components.push(...getFolder(`${path}/${item}`))
  10. }
  11. })
  12. return components
  13. }
  14. module.exports = {
  15. description: '创建标准模块(包含列表页&详情页)',
  16. prompts: [
  17. {
  18. type: 'list',
  19. name: 'path',
  20. message: '请选择模块创建目录',
  21. choices: getFolder('src/views'),
  22. },
  23. {
  24. type: 'input',
  25. name: 'name',
  26. message: '请输入模块名',
  27. validate: (v) => {
  28. if (!v || v.trim === '') {
  29. return '模块名不能为空'
  30. }
  31. else {
  32. return true
  33. }
  34. },
  35. },
  36. {
  37. type: 'input',
  38. name: 'cname',
  39. message: '请输入模块中文名称',
  40. default: '默认模块',
  41. },
  42. {
  43. type: 'confirm',
  44. name: 'isMock',
  45. message: '是否生成 Mock',
  46. },
  47. ],
  48. actions: (data) => {
  49. const relativePath = path.relative('src/views', data.path)
  50. const actions = [
  51. {
  52. type: 'add',
  53. path: `${data.path}/{{snakeCase name}}/list.vue`,
  54. templateFile: 'plop-templates/module/list.hbs',
  55. data: {
  56. relativePath,
  57. componentName: `${relativePath} ${data.name} list`,
  58. moduleName: data.name,
  59. },
  60. },
  61. {
  62. type: 'add',
  63. path: `${data.path}/{{snakeCase name}}/detail.vue`,
  64. templateFile: 'plop-templates/module/detail.hbs',
  65. data: {
  66. componentName: `${relativePath} ${data.name} detail`,
  67. },
  68. },
  69. {
  70. type: 'add',
  71. path: `${data.path}/{{snakeCase name}}/components/DetailForm/index.vue`,
  72. templateFile: 'plop-templates/module/form.hbs',
  73. data: {
  74. relativePath,
  75. moduleName: data.name,
  76. },
  77. },
  78. {
  79. type: 'add',
  80. path: `${data.path}/{{snakeCase name}}/components/FormMode/index.vue`,
  81. templateFile: 'plop-templates/module/mode.hbs',
  82. },
  83. ]
  84. if (data.isMock) {
  85. const pathArr = path.relative('src/views', data.path).split('\\')
  86. actions.push({
  87. type: 'add',
  88. path: pathArr.join('/') === '' ? 'src/mock/{{snakeCase name}}.ts' : `src/mock/${pathArr.join('.')}.{{snakeCase name}}.ts`,
  89. templateFile: 'plop-templates/module/mock.hbs',
  90. data: {
  91. relativePath,
  92. moduleName: data.name,
  93. },
  94. })
  95. }
  96. return actions
  97. },
  98. }