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