new.js 3.1 KB

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