choose-semverness.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /* eslint-disable no-continue */
  2. import { createWriteStream, mkdirSync, readFileSync } from 'node:fs'
  3. import { spawnSync } from 'node:child_process'
  4. import prompts from 'prompts'
  5. const ROOT = new URL('../../', import.meta.url)
  6. const PACKAGES_FOLDER = new URL('./packages/', ROOT)
  7. function getRobodogDependencies () {
  8. const { dependencies } = JSON.parse(readFileSync(new URL('./@uppy/robodog/package.json', PACKAGES_FOLDER)))
  9. return Object.keys(dependencies)
  10. }
  11. function maxSemverness (a, b) {
  12. if (a === 'major' || b === 'major') return 'major'
  13. if (a === 'premajor' || b === 'premajor') return 'premajor'
  14. if (a === 'minor' || b === 'minor') return 'minor'
  15. if (a === 'preminor' || b === 'preminor') return 'preminor'
  16. if (a === 'prepatch' || b === 'prepatch') return 'prepatch'
  17. if (a === 'prepatch' || b === 'prerelease') return 'prerelease'
  18. return 'patch'
  19. }
  20. export default async function pickSemverness (
  21. spawnOptions,
  22. LAST_RELEASE_COMMIT,
  23. releaseFileUrl,
  24. packagesList,
  25. ) {
  26. mkdirSync(new URL('.', releaseFileUrl), { recursive: true })
  27. const releaseFile = createWriteStream(releaseFileUrl)
  28. releaseFile.write('releases:\n')
  29. let uppySemverness
  30. let robodogSemverness
  31. const robodogDeps = getRobodogDependencies()
  32. for await (const workspaceInfo of packagesList) {
  33. const { location, name } = JSON.parse(workspaceInfo)
  34. if (!name.startsWith('@uppy/')) continue
  35. if (name === '@uppy/robodog') continue
  36. const { stdout } = spawnSync(
  37. 'git',
  38. [
  39. '--no-pager',
  40. 'log',
  41. '--format=- %s',
  42. `${LAST_RELEASE_COMMIT}..`,
  43. '--',
  44. location,
  45. ],
  46. spawnOptions,
  47. )
  48. if (stdout.length === 0) {
  49. console.log(`No commits since last release for ${name}, skipping.`)
  50. continue
  51. }
  52. console.log(
  53. `Here are the commits that landed on ${name} since previous release:\n\n${stdout}\n`,
  54. )
  55. console.log(
  56. `Check the web UI at https://github.com/transloadit/uppy/tree/main/${encodeURI(
  57. location,
  58. )}.`,
  59. )
  60. const response = await prompts({
  61. type: 'select',
  62. name: 'value',
  63. message: `What should be the semverness of next ${name} release?`,
  64. choices: [
  65. { title: 'Pre-release', value: 'prerelease' },
  66. { title: 'Skip this package', value: '' },
  67. { title: 'Patch', value: 'patch' },
  68. { title: 'Minor', value: 'minor' },
  69. { title: 'Major', value: 'major' },
  70. ],
  71. initial: 2,
  72. })
  73. if (!response.value) {
  74. console.log('Skipping.')
  75. continue
  76. }
  77. releaseFile.write(` ${JSON.stringify(name)}: ${response.value}\n`)
  78. uppySemverness = maxSemverness(uppySemverness, response.value)
  79. if (robodogDeps.includes(name)) {
  80. robodogSemverness = maxSemverness(robodogSemverness, response.value)
  81. }
  82. }
  83. if (uppySemverness == null) throw new Error('No package to release, aborting.')
  84. {
  85. // Robodog
  86. const location = 'packages/@uppy/robodog'
  87. const { stdout } = spawnSync(
  88. 'git',
  89. [
  90. '--no-pager',
  91. 'log',
  92. '--format=- %s',
  93. `${LAST_RELEASE_COMMIT}..`,
  94. '--',
  95. location,
  96. ],
  97. spawnOptions,
  98. )
  99. if (stdout.length === 0) {
  100. if (robodogSemverness == null) {
  101. console.log(`No commits since last release for @uppy/robodog, skipping.`)
  102. } else {
  103. console.log(`No commits since last release for @uppy/robodog, releasing as ${robodogSemverness}.`)
  104. releaseFile.write(` "@uppy/robodog": ${robodogSemverness}\n`)
  105. }
  106. } else {
  107. console.log(
  108. `Here are the commits that landed on @uppy/robodog since previous release:\n\n${stdout}\n`,
  109. )
  110. console.log(
  111. `Check the web UI at https://github.com/transloadit/uppy/tree/main/${encodeURI(
  112. location,
  113. )}.`,
  114. )
  115. const response = await prompts({
  116. type: 'select',
  117. name: 'value',
  118. message: `What should be the semverness of next @uppy/robodog release?`,
  119. choices: [
  120. { title: 'Pre-release', value: 'prerelease' },
  121. { title: 'Skip this package', value: '', disabled: robodogSemverness != null },
  122. { title: 'Patch', value: 'patch', disabled: robodogSemverness === 'minor' || robodogSemverness === 'major' },
  123. { title: 'Minor', value: 'minor', disabled: robodogSemverness === 'major' },
  124. { title: 'Major', value: 'major' },
  125. ],
  126. initial: 2,
  127. })
  128. releaseFile.write(` "@uppy/robodog": ${response.value}\n`)
  129. }
  130. }
  131. releaseFile.write(` "uppy": ${uppySemverness}\n`)
  132. releaseFile.close()
  133. }