release.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. const semver = require('semver');
  2. const execa = require('execa');
  3. const { Select, Input } = require('enquirer');
  4. /*
  5. * interact publish a npm package
  6. */
  7. function interactPublish() {
  8. let flow = Promise.resolve();
  9. return flow
  10. .then(() => {
  11. let publishOpt = {
  12. version: '',
  13. tag: ''
  14. };
  15. const pkgVersion = require('../lerna.json').version;
  16. return new Select({
  17. name: 'tag',
  18. message: 'Pick a tag:',
  19. choices: ['release', 'alpha', 'beta', 'custom']
  20. })
  21. .run()
  22. .then(tag => {
  23. if (tag === 'custom') {
  24. return new Input({
  25. message: 'Input custom tag'
  26. }).run();
  27. }
  28. publishOpt.tag = tag;
  29. return tag;
  30. })
  31. .then(tag => {
  32. let choices = [];
  33. choices = ['patch', 'minor', 'major'].map(v => {
  34. if (tag !== 'release') {
  35. v = 'pre' + v;
  36. }
  37. let ver = semver.inc(pkgVersion, v, tag === 'release' ? '' : tag);
  38. return {
  39. message: `${v} (${ver})`,
  40. value: v
  41. };
  42. });
  43. if (tag !== 'release') {
  44. let prerelease = semver.inc(pkgVersion, 'prerelease', tag);
  45. choices.push({
  46. message: `prerelease (${prerelease})`,
  47. value: 'prerelease'
  48. });
  49. }
  50. return new Select({
  51. name: 'version',
  52. message: 'Chooice a publish version:',
  53. choices: choices
  54. }).run();
  55. })
  56. .then(version => {
  57. publishOpt.version = version;
  58. return publishOpt;
  59. });
  60. })
  61. .catch(e => {
  62. // eslint-disable-next-line
  63. console.log(e);
  64. });
  65. }
  66. interactPublish().then(opt => {
  67. let msg = `release: ${opt.version} release`;
  68. if (opt.tag) {
  69. msg += ` on ${opt.tag}`;
  70. }
  71. const cmds = ['git', 'commit', '-m', `"${msg}"`, '--allow-empty', '--no-verify'];
  72. execa(cmds.shift(), cmds).then(res => {
  73. // eslint-disable-next-line
  74. console.log(res.stdout);
  75. });
  76. });