createComponentMode.js 8.9 KB

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