release.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. let { runFromPackage, writeToPackageDotJson, ask, run, getFromPackageDotJson } = require('./utils')
  2. let chalk = require('chalk');
  3. let log = message => console.log(chalk.green(message))
  4. let version = process.argv[2]
  5. let prevVersion = getFromPackageDotJson('alpinejs', 'version')
  6. let fs = require('fs')
  7. let axios = require('axios').create({
  8. headers: { Authorization: `Bearer ${require('./.env.json').GITHUB_TOKEN}` }
  9. })
  10. if (! version) {
  11. return console.log('Whoops, you must pass in a version number to this command as the argument')
  12. }
  13. if (! /[0-9]+\.[0-9]+\.[0-9]+/.test(version)) {
  14. return console.log('Whoops, the supplies version is invalid: '+version)
  15. }
  16. writeNewAlpineVersion()
  17. writeNewDocsVersion()
  18. buildAssets()
  19. run(`open https://github.com/alpinejs/alpine/compare/v${prevVersion}...main`)
  20. setTimeout(() => {
  21. ask('Have you reviewed, committed, and pushed all the files for this release?', () => {
  22. draftRelease(version, () => {
  23. ask('Are you sure you want to publish this release: '+version+'?', () => publish())
  24. })
  25. })
  26. }, 1000)
  27. function writeNewAlpineVersion() {
  28. let file = __dirname+'/../packages/docs/src/en/essentials/installation.md'
  29. let docs = fs.readFileSync(file, 'utf8')
  30. docs = docs.replace(prevVersion, version)
  31. fs.writeFileSync(file, docs)
  32. console.log('Writing new Alpine version to installation docs: '+version)
  33. writeToPackageDotJson('alpinejs', 'version', version)
  34. console.log('Bumping alpinejs package.json: '+version)
  35. writeToPackageDotJson('csp', 'version', version)
  36. console.log('Bumping @alpinejs/csp package.json: '+version)
  37. writeToPackageDotJson('intersect', 'version', version)
  38. console.log('Bumping @alpinejs/intersect package.json: '+version)
  39. writeToPackageDotJson('persist', 'version', version)
  40. console.log('Bumping @alpinejs/persist package.json: '+version)
  41. writeToPackageDotJson('focus', 'version', version)
  42. console.log('Bumping @alpinejs/focus package.json: '+version)
  43. writeToPackageDotJson('collapse', 'version', version)
  44. console.log('Bumping @alpinejs/collapse package.json: '+version)
  45. writeToPackageDotJson('anchor', 'version', version)
  46. console.log('Bumping @alpinejs/anchor package.json: '+version)
  47. writeToPackageDotJson('morph', 'version', version)
  48. console.log('Bumping @alpinejs/morph package.json: '+version)
  49. writeToPackageDotJson('mask', 'version', version)
  50. console.log('Bumping @alpinejs/mask package.json: '+version)
  51. }
  52. function writeNewDocsVersion() {
  53. let versionWithRevisionSuffix = `${version}-revision.1`
  54. writeToPackageDotJson('docs', 'version', versionWithRevisionSuffix)
  55. console.log('Bumping @alpinejs/docs package.json: '+version);
  56. }
  57. function buildAssets() {
  58. console.log('Building assets...')
  59. require('./build')
  60. }
  61. function publish() {
  62. console.log('Publishing alpinejs on NPM...');
  63. runFromPackage('alpinejs', 'npm publish')
  64. console.log('Publishing @alpinejs/csp on NPM...');
  65. runFromPackage('csp', 'npm publish --access public')
  66. console.log('Publishing @alpinejs/docs on NPM...');
  67. runFromPackage('docs', 'npm publish --access public')
  68. console.log('Publishing @alpinejs/intersect on NPM...');
  69. runFromPackage('intersect', 'npm publish --access public')
  70. console.log('Publishing @alpinejs/persist on NPM...');
  71. runFromPackage('persist', 'npm publish --access public')
  72. console.log('Publishing @alpinejs/focus on NPM...');
  73. runFromPackage('focus', 'npm publish --access public')
  74. console.log('Publishing @alpinejs/collapse on NPM...');
  75. runFromPackage('collapse', 'npm publish --access public')
  76. console.log('Publishing @alpinejs/anchor on NPM...');
  77. runFromPackage('anchor', 'npm publish --access public')
  78. console.log('Publishing @alpinejs/morph on NPM...');
  79. runFromPackage('morph', 'npm publish --access public')
  80. console.log('Publishing @alpinejs/mask on NPM...');
  81. runFromPackage('mask', 'npm publish --access public')
  82. log('\n\nFinished!')
  83. }
  84. async function draftRelease(name, after = () => {}) {
  85. let lastRelease = await getLastRelease()
  86. let since = lastRelease.published_at
  87. let pulls = await getPullRequestsSince(since)
  88. let output = ''
  89. output += "## Added\n\n## Fixed\n\n"
  90. output += pulls.map(pull => `* ${pull.title} [#${pull.number}](${pull.html_url})`).join('\n')
  91. fs.writeFileSync('./changelog.tmp', output)
  92. run('code ./changelog.tmp')
  93. ask('Are you finished editing the changelog?', () => {
  94. let content = fs.readFileSync('./changelog.tmp', 'utf8')
  95. fs.unlinkSync('./changelog.tmp')
  96. tagNewRelease(name, content, after)
  97. })
  98. }
  99. async function getLastRelease() {
  100. let { data: releases } = await axios.get('https://api.github.com/repos/alpinejs/alpine/releases')
  101. let lastRelease = releases.find(release => {
  102. return release.target_commitish === 'main'
  103. && release.draft === false
  104. })
  105. return lastRelease
  106. }
  107. async function getPullRequestsSince(since) {
  108. let { data: pulls } = await axios.get('https://api.github.com/repos/alpinejs/alpine/pulls?state=closed&sort=updated&direction=desc&base=main')
  109. let pullsSince = pulls.filter(pull => {
  110. if (! pull.merged_at) return false
  111. return pull.merged_at > since
  112. })
  113. return pullsSince
  114. }
  115. function tagNewRelease(name, content, after = () => {}) {
  116. return axios.post('https://api.github.com/repos/alpinejs/alpine/releases', {
  117. name: 'v'+name,
  118. tag_name: 'v'+name,
  119. target_commitish: 'main',
  120. body: content,
  121. draft: false,
  122. }).then(() => {
  123. after()
  124. })
  125. }