grafanaui.release.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import execa from 'execa';
  2. import { Task } from '..';
  3. import { execTask } from '../utils/execTask';
  4. import { changeCwdToGrafanaUiDist, changeCwdToGrafanaUi } from '../utils/cwd';
  5. import semver from 'semver';
  6. import inquirer from 'inquirer';
  7. import chalk from 'chalk';
  8. import { startSpinner } from '../utils/startSpinner';
  9. import { savePackage } from './grafanaui.build';
  10. type VersionBumpType = 'patch' | 'minor' | 'major';
  11. const promptBumpType = async () => {
  12. return inquirer.prompt<{ type: VersionBumpType }>([
  13. {
  14. type: 'list',
  15. message: 'Select version bump',
  16. name: 'type',
  17. choices: ['patch', 'minor', 'major'],
  18. validate: answer => {
  19. if (answer.length < 1) {
  20. return 'You must choose something';
  21. }
  22. return true;
  23. },
  24. },
  25. ]);
  26. };
  27. const promptPrereleaseId = async () => {
  28. return inquirer.prompt<{ id: string }>([
  29. {
  30. type: 'list',
  31. message: 'Is this a prerelease?',
  32. name: 'id',
  33. choices: ['no', 'alpha', 'beta'],
  34. validate: answer => {
  35. if (answer.length < 1) {
  36. return 'You must choose something';
  37. }
  38. return true;
  39. },
  40. },
  41. ]);
  42. };
  43. const promptConfirm = async (message?: string) => {
  44. return inquirer.prompt<{ confirmed: boolean }>([
  45. {
  46. type: 'confirm',
  47. message: message || 'Is that correct?',
  48. name: 'confirmed',
  49. default: false,
  50. },
  51. ]);
  52. };
  53. const bumpVersion = async (version: string) => {
  54. const spinner = startSpinner(`Saving version ${version} to package.json`);
  55. changeCwdToGrafanaUi();
  56. try {
  57. await execa('npm', ['version', version]);
  58. spinner.succeed();
  59. } catch (e) {
  60. console.log(e);
  61. spinner.fail();
  62. }
  63. changeCwdToGrafanaUiDist();
  64. const pkg = require(`${process.cwd()}/package.json`);
  65. pkg.version = version;
  66. await savePackage(`${process.cwd()}/package.json`, pkg);
  67. };
  68. const publishPackage = async (name: string, version: string) => {
  69. changeCwdToGrafanaUiDist();
  70. console.log(chalk.yellowBright.bold(`\nReview dist package.json before proceeding!\n`));
  71. const { confirmed } = await promptConfirm('Are you ready to publish to npm?');
  72. if (!confirmed) {
  73. process.exit();
  74. }
  75. const spinner = startSpinner(`Publishing ${name} @ ${version} to npm registry...`);
  76. try {
  77. await execa('npm', ['publish']);
  78. spinner.succeed();
  79. } catch (e) {
  80. console.log(e);
  81. spinner.fail();
  82. process.exit(1);
  83. }
  84. };
  85. const releaseTask: Task<void> = async () => {
  86. await execTask('grafanaui.build');
  87. let releaseConfirmed = false;
  88. let nextVersion;
  89. changeCwdToGrafanaUiDist();
  90. const pkg = require(`${process.cwd()}/package.json`);
  91. console.log(`Current version: ${pkg.version}`);
  92. do {
  93. const { type } = await promptBumpType();
  94. const { id } = await promptPrereleaseId();
  95. if (id !== 'no') {
  96. nextVersion = semver.inc(pkg.version, `pre${type}`, id);
  97. } else {
  98. nextVersion = semver.inc(pkg.version, type);
  99. }
  100. console.log(chalk.yellowBright.bold(`You are going to release a new version of ${pkg.name}`));
  101. console.log(chalk.green(`Version bump: ${pkg.version} ->`), chalk.bold.yellowBright(`${nextVersion}`));
  102. const { confirmed } = await promptConfirm();
  103. releaseConfirmed = confirmed;
  104. } while (!releaseConfirmed);
  105. await bumpVersion(nextVersion);
  106. await publishPackage(pkg.name, nextVersion);
  107. console.log(chalk.green(`\nVersion ${nextVersion} of ${pkg.name} succesfully released!`));
  108. console.log(chalk.yellow(`\nUpdated @grafana/ui/package.json with version bump created - COMMIT THIS FILE!`));
  109. };
  110. export default releaseTask;