createComponentMode.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. // 创建模板
  2. const inquirer = require('inquirer');
  3. // import { ROOT_PACKAGE_PATH } from '../util/dic';
  4. //const conf = require(ROOT_PACKAGE_PATH('src/config.json'));
  5. //import {a} from "./a.js"
  6. // import {nav} from '../src/config.js';
  7. // import { from } from 'core-js/fn/array';
  8. const path = require('path');
  9. const fs = require('fs');
  10. // const copy = require('copy');
  11. //const createPkgDeclare = require('./createPkgDeclare');
  12. // const t = require('@babel/types');
  13. // const { parse } = require('@babel/parser');
  14. // const { default: traverse } = require('@babel/traverse');
  15. // const { default: generate } = require('@babel/generator');
  16. var newCpt = {
  17. version: '1.0.0',
  18. name: '',
  19. type: '',
  20. chnName: '',
  21. desc: '',
  22. sort: '',
  23. showDemo: true,
  24. author: '',
  25. star: undefined
  26. };
  27. function init() {
  28. inquirer
  29. .prompt([
  30. {
  31. type: 'input',
  32. name: 'name',
  33. message: '组件英文名(每个单词的首字母都大写,如TextBox):',
  34. validate(value) {
  35. // let repeat = false;
  36. // for (var i = 0; i < nav.length; i++) {
  37. // for (var j = 0; j < nav[i].packages.length; j++) {
  38. // if (nav[i].packages[j].name === value) {
  39. // repeat = true;
  40. // }
  41. // }
  42. // }
  43. // if (repeat) {
  44. // return '该组件名已存在!';
  45. // }
  46. const pass = value && value.match(/^[A-Z]/);
  47. if (pass) {
  48. return true;
  49. }
  50. return '不能为空,且每个单词的首字母都要大写,如TextBox';
  51. }
  52. },
  53. {
  54. type: 'input',
  55. name: 'chnName',
  56. message: '组件中文名(十个字以内):',
  57. validate(value) {
  58. const pass = value && value.length <= 10;
  59. if (pass) {
  60. return true;
  61. }
  62. return '不能为空,且不能超过十个字符';
  63. }
  64. },
  65. {
  66. type: 'input',
  67. name: 'desc',
  68. message: '组件描述(五十个字以内):'
  69. },
  70. {
  71. type: 'rawlist',
  72. name: 'type',
  73. message: '请选择组件类型(输入编号):目前只支持组建模板',
  74. choices: ['component', 'filter', 'directive', 'method'],
  75. validate(value) {
  76. const pass = value && /^[1-4]$/.test(value);
  77. if (pass) {
  78. return true;
  79. }
  80. return '输入有误!请输入选项前编号';
  81. }
  82. },
  83. // {
  84. // type: 'rawlist',
  85. // name: 'sort',
  86. // message: '请选择组件分类(输入编号):',
  87. // // choices: sorts,
  88. // validate(value) {
  89. // const pass = /^[1-7]$/.test(value);
  90. // if (pass) {
  91. // return true;
  92. // }
  93. // return '输入有误!请输入选项前编号';
  94. // }
  95. // },
  96. // {
  97. // type: 'confirm',
  98. // name: 'showDemo',
  99. // message: '是否需要DEMO页面?',
  100. // default: true
  101. // },
  102. // {
  103. // type: 'confirm',
  104. // name: 'showTest',
  105. // message: '是否需要单元测试页面?',
  106. // default: true
  107. // },
  108. {
  109. type: 'input',
  110. name: 'author',
  111. message: '组件作者(可署化名):'
  112. }
  113. ])
  114. .then(function(answers) {
  115. // answers.sort = String(sorts.indexOf(answers.sort));
  116. newCpt = Object.assign(newCpt, answers);
  117. createNew();
  118. });
  119. }
  120. function createIndexJs() {
  121. const nameLc = newCpt.name.toLowerCase();
  122. const destPath = path.join('src/packages/' + nameLc);
  123. if (!fs.existsSync(destPath)) {
  124. fs.mkdirSync(destPath);
  125. }
  126. // copy(path.join(__dirname, './__template__/**.*'), destPath, function (err: any, file: any) {
  127. // if (err) {
  128. // console.log('拷贝__template__目录失败!');
  129. // }
  130. // createNew();
  131. // });
  132. if (newCpt.type == 'method') return;
  133. return new Promise((resolve, reject) => {
  134. // let content = `import ${newCpt.name} from './src/${nameLc}.vue';
  135. // ${newCpt.name}.install = function(Vue) {
  136. // Vue.${newCpt.type}(${newCpt.name}.name, ${newCpt.name});
  137. // };
  138. // export default ${newCpt.name}`;
  139. // let content2 = `${newCpt.name}.install = function(Vue) {
  140. // Vue.${newCpt.type}(${newCpt.name}.name, ${newCpt.name});
  141. // };
  142. // export default ${newCpt.name}`;
  143. // const dirPath = path.join(__dirname, `../src/packages/${nameLc}/`);
  144. // const filePath = path.join(dirPath, `index.js`);
  145. // if (!fs.existsSync(dirPath)) {
  146. // fs.mkdirSync(filePath);
  147. // }
  148. // if (newCpt.type == 'filter' || newCpt.type == 'directive'){
  149. // content = content2;
  150. // }
  151. // fs.writeFile(filePath, content, (err) => {
  152. // if (err) throw err;
  153. resolve(`生成index.js文件成功`);
  154. // });
  155. });
  156. }
  157. function createVue() {
  158. return new Promise((resolve, reject) => {
  159. const nameLc = newCpt.name.toLowerCase();
  160. let content = `<template>
  161. <view :class="classes" @click="handleClick">
  162. <view>{{ name }}</view>
  163. <view>{{ txt }}</view>
  164. </view>
  165. </template>
  166. <script lang="ts">
  167. import { toRefs } from 'vue';
  168. import { createComponent } from '@/utils/create';
  169. const { componentName, create } = createComponent('temp');
  170. export default create({
  171. props: {
  172. name: {
  173. type: String,
  174. default: ''
  175. },
  176. txt: {
  177. type: String,
  178. default: ''
  179. }
  180. },
  181. components: {},
  182. emits: ['click'],
  183. setup(props, { emit }) {
  184. console.log('componentName', componentName);
  185. const { name, txt } = toRefs(props);
  186. const handleClick = (event: Event) => {
  187. emit('click', event);
  188. };
  189. return { name, txt, handleClick };
  190. }
  191. });
  192. </script>
  193. <style lang="scss">
  194. @import 'index.scss';
  195. </style>
  196. `;
  197. const dirPath = path.join(__dirname, `../src/packages/${nameLc}/`);
  198. const filePath = path.join(dirPath, `index.vue`);
  199. if (!fs.existsSync(dirPath)) {
  200. fs.mkdirSync(filePath);
  201. }
  202. fs.writeFile(filePath, content, err => {
  203. if (err) throw err;
  204. resolve(`生成${newCpt.name}.vue文件成功`);
  205. });
  206. });
  207. }
  208. function createDemo() {
  209. return new Promise((resolve, reject) => {
  210. const nameLc = newCpt.name.toLowerCase();
  211. let content = `<template>
  212. <div class="demo-list"></div>
  213. </template>
  214. <script>
  215. export default {
  216. data() {
  217. return {};
  218. },
  219. methods: {
  220. }
  221. }
  222. </script>`;
  223. const dirPath = path.join(__dirname, '../src/packages/' + nameLc);
  224. const filePath = path.join(dirPath, `demo.vue`);
  225. if (!fs.existsSync(dirPath)) {
  226. fs.mkdirSync(filePath);
  227. }
  228. fs.writeFile(filePath, content, err => {
  229. if (err) throw err;
  230. resolve(`生成demo.vue文件成功`);
  231. });
  232. });
  233. }
  234. function addToPackageJson() {
  235. // return new Promise((resolve, reject) => {
  236. // conf.packages.push(newCpt);
  237. // const dirPath = path.join(__dirname, `../`);
  238. // const filePath = path.join(dirPath, `config.json`);
  239. // fs.writeFile(filePath, JSON.stringify(conf, null, 2), (err) => {
  240. // if (err) throw err;
  241. // resolve(`修改config.json文件成功`);
  242. // });
  243. // });
  244. }
  245. function createScss() {
  246. return new Promise((resolve, reject) => {
  247. const nameLc = newCpt.name.toLowerCase();
  248. let content = `.nut-temp {}`;
  249. const dirPath = path.join(__dirname, '../src/packages/' + nameLc);
  250. const filePath = path.join(dirPath, `index.scss`);
  251. if (!fs.existsSync(dirPath)) {
  252. fs.mkdirSync(filePath);
  253. }
  254. fs.writeFile(filePath, content, err => {
  255. if (err) throw err;
  256. resolve(`index.scss文件成功`);
  257. });
  258. });
  259. }
  260. function createDoc() {
  261. return new Promise((resolve, reject) => {
  262. const nameLc = newCpt.name.toLowerCase();
  263. let content = `组建使用说明文件`;
  264. const dirPath = path.join(__dirname, '../src/packages/' + nameLc);
  265. const filePath = path.join(dirPath, `doc.md`);
  266. if (!fs.existsSync(dirPath)) {
  267. fs.mkdirSync(filePath);
  268. }
  269. fs.writeFile(filePath, content, err => {
  270. if (err) throw err;
  271. resolve(`doc.md文件成功`);
  272. });
  273. });
  274. }
  275. function createNew() {
  276. createIndexJs()
  277. .then(() => {
  278. if (newCpt.type == 'component' || newCpt.type == 'method') {
  279. return createVue();
  280. } else {
  281. return;
  282. }
  283. })
  284. .then(() => {
  285. return createScss();
  286. })
  287. .then(() => {
  288. return createDemo();
  289. })
  290. .then(() => {
  291. return createDoc();
  292. })
  293. .then(() => {
  294. // return addToPackageJson();
  295. })
  296. .then(() => {
  297. console.log('组件模板生成完毕,请开始你的表演~');
  298. process.exit();
  299. });
  300. }
  301. function createComponent() {
  302. init();
  303. }
  304. createComponent();