new.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. 'use strict';
  2. console.log();
  3. process.on('exit', () => {
  4. console.log();
  5. });
  6. if (!process.argv[2]) {
  7. console.error('[组件名]必填.');
  8. process.exit(1);
  9. }
  10. const path = require('path');
  11. const fileSave = require('file-save');
  12. const uppercamelcase = require('uppercamelcase');
  13. const componentname = process.argv[2];
  14. const chineseName = process.argv[3] || componentname;
  15. const ComponentName = uppercamelcase(componentname);
  16. const PackagePath = path.resolve(__dirname, '../../packages', componentname);
  17. const Files = [
  18. {
  19. filename: 'index.js',
  20. content: `import ${ComponentName} from './src/main';
  21. /* istanbul ignore next */
  22. ${ComponentName}.install = function(Vue) {
  23. Vue.component(${ComponentName}.name, ${ComponentName});
  24. };
  25. export default ${ComponentName};`
  26. },
  27. {
  28. filename: 'cooking.conf.js',
  29. content: `var cooking = require('cooking');
  30. var path = require('path');
  31. var config = require('../../build/config');
  32. cooking.set({
  33. entry: {
  34. index: path.join(__dirname, 'index.js')
  35. },
  36. dist: path.join(__dirname, 'lib'),
  37. template: false,
  38. format: 'umd',
  39. moduleName: 'El${ComponentName}',
  40. extends: ['vue2'],
  41. alias: config.alias,
  42. externals: { vue: config.vue }
  43. });
  44. module.exports = cooking.resolve();`
  45. },
  46. {
  47. filename: 'package.json',
  48. content: `{
  49. "name": "element-${componentname}",
  50. "version": "0.0.0",
  51. "description": "A ${componentname} component for Vue.js.",
  52. "keywords": [
  53. "element",
  54. "vue",
  55. "component"
  56. ],
  57. "main": "./lib/index.js",
  58. "repository": "https://github.com/ElemeFE/element/tree/master/packages/${componentname}",
  59. "author": "elemefe",
  60. "license": "MIT",
  61. "dependencies": {}
  62. }`
  63. },
  64. {
  65. filename: 'src/main.vue',
  66. content: `<template>
  67. <div class="el-${componentname}"></div>
  68. </template>
  69. <script>
  70. export default {
  71. name: 'El${ComponentName}'
  72. };
  73. </script>`
  74. },
  75. {
  76. filename: path.join('../../examples/docs/zh-CN', `${componentname}.md`),
  77. content: `## ${chineseName}`
  78. },
  79. {
  80. filename: path.join('../../examples/docs/en-us', `${componentname}.md`),
  81. content: `## ${componentname}`
  82. },
  83. {
  84. filename: path.join('../../test/unit/specs', `${componentname}.spec.js`),
  85. content: `import { createTest, destroyVM } from '../util';
  86. import ${ComponentName} from 'packages/${componentname}';
  87. describe('${ComponentName}', () => {
  88. let vm;
  89. afterEach(() => {
  90. destroyVM(vm);
  91. });
  92. it('create', () => {
  93. vm = createTest(${ComponentName}, true);
  94. expect(vm.$el).to.exist;
  95. });
  96. });
  97. `
  98. }
  99. ];
  100. // 添加到 components.json
  101. const componentsFile = require('../../components.json');
  102. if (componentsFile[componentname]) {
  103. console.error(`${componentname} 已存在.`);
  104. process.exit(1);
  105. }
  106. componentsFile[componentname] = `./packages/${componentname}/index.js`;
  107. fileSave(path.join(__dirname, '../../components.json'))
  108. .write(JSON.stringify(componentsFile, null, ' '), 'utf8')
  109. .end('\n');
  110. // 创建 package
  111. Files.forEach(file => {
  112. fileSave(path.join(PackagePath, file.filename))
  113. .write(file.content, 'utf8')
  114. .end('\n');
  115. });
  116. // 添加到 nav.config.json
  117. const navConfigFile = require('../../examples/nav.config.json');
  118. Object.keys(navConfigFile).forEach(lang => {
  119. let groups = navConfigFile[lang][2].groups;
  120. groups[groups.length - 1].list.push({
  121. path: `/${componentname}`,
  122. title: lang === 'zh-CN' && componentname !== chineseName
  123. ? `${ComponentName} ${chineseName}`
  124. : ComponentName
  125. });
  126. });
  127. fileSave(path.join(__dirname, '../../examples/nav.config.json'))
  128. .write(JSON.stringify(navConfigFile, null, ' '), 'utf8')
  129. .end('\n');
  130. console.log('DONE!');