new.js 3.1 KB

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