choose-semverness.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* eslint-disable no-continue */
  2. import { createWriteStream, mkdirSync } from 'node:fs'
  3. import { spawnSync } from 'node:child_process'
  4. import prompts from 'prompts'
  5. import { TARGET_BRANCH } from './config.js'
  6. function maxSemverness (a, b) {
  7. if (a === 'major' || b === 'major') return 'major'
  8. if (a === 'premajor' || b === 'premajor') return 'premajor'
  9. if (a === 'minor' || b === 'minor') return 'minor'
  10. if (a === 'preminor' || b === 'preminor') return 'preminor'
  11. if (a === 'prepatch' || b === 'prepatch') return 'prepatch'
  12. if (a === 'prepatch' || b === 'prerelease') return 'prerelease'
  13. return 'patch'
  14. }
  15. export default async function pickSemverness (
  16. spawnOptions,
  17. LAST_RELEASE_COMMIT,
  18. releaseFileUrl,
  19. packagesList,
  20. ) {
  21. mkdirSync(new URL('.', releaseFileUrl), { recursive: true })
  22. const releaseFile = createWriteStream(releaseFileUrl)
  23. releaseFile.write('releases:\n')
  24. let uppySemverness
  25. for await (const workspaceInfo of packagesList) {
  26. const { location, name } = JSON.parse(workspaceInfo)
  27. if (!name.startsWith('@uppy/')) continue
  28. const { stdout } = spawnSync(
  29. 'git',
  30. [
  31. '--no-pager',
  32. 'log',
  33. '--format=- %s',
  34. `${LAST_RELEASE_COMMIT}..`,
  35. '--',
  36. location,
  37. ],
  38. spawnOptions,
  39. )
  40. if (stdout.length === 0) {
  41. console.log(`No commits since last release for ${name}, skipping.`)
  42. continue
  43. }
  44. console.log('\n')
  45. console.log('-'.repeat(20))
  46. console.log(name)
  47. console.log(
  48. `\nHere are the commits that landed on ${name} since previous release:\n${stdout}\n`,
  49. )
  50. console.log(
  51. `Check the web UI at https://github.com/transloadit/uppy/tree/${TARGET_BRANCH}/${encodeURI(
  52. location,
  53. )}.`,
  54. )
  55. const response = await prompts({
  56. type: 'select',
  57. name: 'value',
  58. message: `What should be the semverness of next ${name} release?`,
  59. choices: [
  60. { title: 'Pre-release', value: 'prerelease' },
  61. { title: 'Skip this package', value: '' },
  62. { title: 'Patch', value: 'patch' },
  63. { title: 'Minor', value: 'minor' },
  64. { title: 'Major', value: 'major' },
  65. ],
  66. initial: 2,
  67. })
  68. if (!response.value) {
  69. console.log('Skipping.')
  70. continue
  71. }
  72. releaseFile.write(` ${JSON.stringify(name)}: ${response.value}\n`)
  73. uppySemverness = maxSemverness(uppySemverness, response.value)
  74. }
  75. if (uppySemverness == null) throw new Error('No package to release, aborting.')
  76. releaseFile.write(` "uppy": ${uppySemverness}\n`)
  77. releaseFile.close()
  78. }