new.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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: `const ${ComponentName} = require('./src/main');
  21. /* istanbul ignore next */
  22. ${ComponentName}.install = function(Vue) {
  23. Vue.component(${ComponentName}.name, ${ComponentName});
  24. };
  25. module.exports = ${ComponentName};`
  26. },
  27. {
  28. filename: 'cooking.conf.js',
  29. content: `var cooking = require('cooking');
  30. var path = require('path');
  31. cooking.set({
  32. entry: {
  33. index: path.join(__dirname, 'index.js')
  34. },
  35. dist: path.join(__dirname, 'lib'),
  36. template: false,
  37. format: 'umd',
  38. moduleName: 'El${ComponentName}',
  39. extends: ['vue2'],
  40. alias: config.alias,
  41. externals: { vue: config.vue }
  42. });
  43. module.exports = cooking.resolve();`
  44. },
  45. {
  46. filename: 'package.json',
  47. content: `{
  48. "name": "el-${componentname}",
  49. "version": "0.0.0",
  50. "description": "A ${componentname} component for Vue.js.",
  51. "keywords": [
  52. "element",
  53. "vue",
  54. "component"
  55. ],
  56. "main": "./lib/index.js",
  57. "repository": "https://github.com/ElemeFE/element/tree/master/packages/${componentname}",
  58. "author": "elemefe",
  59. "license": "MIT",
  60. "dependencies": {}
  61. }`
  62. },
  63. {
  64. filename: 'src/main.vue',
  65. content: `<template>
  66. <div class="el-${componentname}"></div>
  67. </template>
  68. <script>
  69. export default {
  70. name: 'el-${componentname}'
  71. };
  72. </script>`
  73. },
  74. {
  75. filename: path.join('../../examples/docs/zh-CN', `${componentname}.md`),
  76. content: `## ${chineseName}`
  77. }
  78. ];
  79. // 添加到 components.json
  80. const componentsFile = require('../../components.json');
  81. if (componentsFile[componentname]) {
  82. console.error(`${componentname} 已存在.`);
  83. process.exit(1);
  84. }
  85. componentsFile[componentname] = `./packages/${componentname}/index.js`;
  86. fileSave(path.join(__dirname, '../../components.json'))
  87. .write(JSON.stringify(componentsFile, null, ' '), 'utf8')
  88. .end('\n');
  89. // 创建 package
  90. Files.forEach(file => {
  91. fileSave(path.join(PackagePath, file.filename))
  92. .write(file.content, 'utf8')
  93. .end('\n');
  94. });
  95. // 添加到 nav.config.json
  96. const navConfigFile = require('../../examples/nav.config.json');
  97. navConfigFile[2].groups[navConfigFile[2].groups.length - 1].list.push({
  98. path: `/${componentname}`,
  99. name: `${chineseName} (${componentname})`,
  100. title: componentname === chineseName
  101. ? componentname
  102. : `${componentname} ${chineseName}`
  103. });
  104. fileSave(path.join(__dirname, '../../examples/nav.config.json'))
  105. .write(JSON.stringify(navConfigFile, null, ' '), 'utf8')
  106. .end('\n');
  107. console.log('DONE!');