addComponent.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. const conf = require('../package.json');
  2. const readline = require('readline');
  3. const fs = require('fs');
  4. const path = require('path');
  5. let newCpt = {};
  6. let rl = readline.createInterface({
  7. input: process.stdin,
  8. output: process.stdout
  9. });
  10. let getCptName = () => {
  11. return new Promise((resolve, reject) => {
  12. rl.question('组件英文名(每个单词的首字母都大写,如TextBox):', (answer) => {
  13. newCpt.name = answer;
  14. resolve();
  15. });
  16. });
  17. };
  18. let getChnName = () => {
  19. return new Promise((resolve, reject) => {
  20. rl.question('组件中文名(十个字以内):', (answer) => {
  21. newCpt.chnName = answer;
  22. resolve();
  23. });
  24. });
  25. };
  26. let getType = () => {
  27. return new Promise((resolve, reject) => {
  28. rl.question('组件类型(component/filter/directive/method):', (answer) => {
  29. newCpt.type = answer || 'component';
  30. resolve();
  31. });
  32. });
  33. };
  34. function init() {
  35. getCptName().then(() => {
  36. return getChnName();
  37. }).then(() => {
  38. return getType();
  39. }).then(() => {
  40. createNew();
  41. });
  42. }
  43. function createIndexJs() {
  44. if (newCpt.type == 'method') return;
  45. return new Promise((resolve, reject) => {
  46. const nameLc = newCpt.name.toLowerCase();
  47. let content = `import ${newCpt.name} from './src/${nameLc}.vue';
  48. ${newCpt.name}.install = function(Vue) {
  49. Vue.${newCpt.type}(${newCpt.name}.name, ${newCpt.name});
  50. };
  51. export default ${newCpt.name}`;
  52. let content2 = `${newCpt.name}.install = function(Vue) {
  53. Vue.${newCpt.type}(${newCpt.name}.name, ${newCpt.name});
  54. };
  55. export default ${newCpt.name}`;
  56. const dirPath = path.join(__dirname, `../src/package/${nameLc}/`);
  57. const filePath = path.join(dirPath, `index.js`);
  58. if (!fs.existsSync(dirPath)) {
  59. fs.mkdirSync(dirPath);
  60. }
  61. if (newCpt.type == 'filter' || newCpt.type == 'directive'){
  62. content = content2;
  63. }
  64. fs.writeFile(filePath, content, (err) => {
  65. if (err) throw err;
  66. resolve(`生成index.js文件成功`);
  67. });
  68. });
  69. }
  70. function createVue() {
  71. return new Promise((resolve, reject) => {
  72. const nameLc = newCpt.name.toLowerCase();
  73. let content = `<template>
  74. <div class="nut-${nameLc}"></div>
  75. </template>
  76. <script>
  77. export default {
  78. name:'nut-${nameLc}',
  79. props: {
  80. },
  81. data() {
  82. return {};
  83. },
  84. methods: {
  85. }
  86. }
  87. </script>
  88. <style lang="scss">
  89. </style>`;
  90. const dirPath = path.join(__dirname, `../src/package/${nameLc}/src/`);
  91. const filePath = path.join(dirPath, `${nameLc}.vue`);
  92. if (!fs.existsSync(dirPath)) {
  93. fs.mkdirSync(dirPath);
  94. }
  95. fs.writeFile(filePath, content, (err) => {
  96. if (err) throw err;
  97. resolve(`生成${newCpt.name}.vue文件成功`);
  98. });
  99. });
  100. }
  101. function createView() {
  102. return new Promise((resolve, reject) => {
  103. const nameLc = newCpt.name.toLowerCase();
  104. const fileName = 'viewTpl.vue';
  105. const sourceFile = path.join(__dirname, './' + fileName);
  106. const destPath = path.join(__dirname, '../src/demo/', nameLc + '.vue');
  107. const readStream = fs.createReadStream(sourceFile);
  108. const writeStream = fs.createWriteStream(destPath);
  109. readStream.pipe(writeStream);
  110. resolve('生成文档模板文件成功');
  111. });
  112. }
  113. function createDemo() {
  114. return new Promise((resolve, reject) => {
  115. const nameLc = newCpt.name.toLowerCase();
  116. const fileName = 'demoTpl.vue';
  117. const sourceFile = path.join(__dirname, './' + fileName);
  118. const destPath = path.join(__dirname, '../src/view/', nameLc + '.vue');
  119. const readStream = fs.createReadStream(sourceFile);
  120. const writeStream = fs.createWriteStream(destPath);
  121. readStream.pipe(writeStream);
  122. resolve('生成示例模板文件成功');
  123. });
  124. }
  125. function addToPackageJson() {
  126. return new Promise((resolve, reject) => {
  127. conf.packages.push(newCpt);
  128. const dirPath = path.join(__dirname, `../`);
  129. const filePath = path.join(dirPath, `package.json`);
  130. fs.writeFile(filePath, JSON.stringify(conf, null, 2), (err) => {
  131. if (err) throw err;
  132. resolve(`修改package.json文件成功`);
  133. });
  134. });
  135. }
  136. function createNew() {
  137. createIndexJs().then(() => {
  138. if (newCpt.type == 'component' || newCpt.type == 'method') {
  139. return createVue();
  140. } else {
  141. return;
  142. }
  143. }).then(() => {
  144. return createView();
  145. }).then(() => {
  146. return createDemo();
  147. }).then(() => {
  148. return addToPackageJson();
  149. }).then(() => {
  150. process.exit();
  151. });
  152. }
  153. init();