forked from CodinGame/monaco-vscode-api
-
Notifications
You must be signed in to change notification settings - Fork 0
/
release.ts
115 lines (101 loc) · 4.3 KB
/
release.ts
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
/**
* This script was inspired by https://dev.to/antongolub/you-don-t-need-semantic-release-sometimes-3k6k
*/
import semanticRelease, { Options as SemanticReleaseOptions } from 'semantic-release'
import { $ } from 'zx'
import yargs, { Options } from 'yargs'
import semanticReleaseConfig from '@codingame/semantic-release-config-github'
import path from 'path'
import fs from 'fs/promises'
import syncFs from 'fs'
import { fileURLToPath } from 'url'
import util from 'node:util'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const { NPM_TOKEN } = process.env
if (NPM_TOKEN == null) {
throw new Error('env.NPM_TOKEN must be set')
}
async function publishNpm (version: string, tag: string) {
const distDir = path.resolve(__dirname, 'dist')
for (const dirName of await fs.readdir(distDir)) {
const libDir = path.resolve(distDir, dirName)
const packageJsonFile = path.resolve(libDir, 'package.json')
if (syncFs.existsSync(packageJsonFile)) {
const packageJson = JSON.parse((await fs.readFile(packageJsonFile)).toString())
packageJson.version = version
if (packageJson.dependencies?.vscode != null) {
packageJson.dependencies.vscode = `npm:@codingame/monaco-vscode-api@${version}`
}
for (const dependency in packageJson.dependencies) {
if (dependency.startsWith('@codingame/monaco-vscode-')) {
packageJson.dependencies[dependency] = version
}
}
await fs.writeFile(path.resolve(libDir, '.npmrc'), `//registry.npmjs.org/:_authToken=${NPM_TOKEN}\n`)
await fs.writeFile(packageJsonFile, JSON.stringify(packageJson, null, 2))
$.cwd = libDir
await $`npm publish --tag "${tag}" --access public`
}
}
}
async function run (options: SemanticReleaseOptions) {
const result = await semanticRelease(
{
...options,
...semanticReleaseConfig,
plugins: semanticReleaseConfig.plugins?.filter(plugin => plugin !== '@semantic-release/npm')
}
)
if (result === false) {
return
}
if (options.dryRun ?? false) {
return
}
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
await publishNpm(result.nextRelease.version, result.nextRelease.channel ?? 'latest')
}
async function cli () {
const stringList: Options = {
type: 'string',
array: true,
coerce: (values: string[]) =>
values.length === 1 && values[0]!.trim() === 'false'
? []
: values.reduce((values, value) => values.concat(value.split(',').map((value) => value.trim())), <string[]>[])
}
const argv = process.argv.slice(2)
const cli = yargs(argv)
.command('$0', 'Run automated package publishing', (yargs) => {
yargs.demandCommand(0, 0).usage(`Run automated package publishing
Usage:
release [options] [plugins]`)
})
.option('b', { alias: 'branches', describe: 'Git branches to release from', ...stringList, group: 'Options' })
.option('r', { alias: 'repository-url', describe: 'Git repository URL', type: 'string', group: 'Options' })
.option('t', { alias: 'tag-format', describe: 'Git tag format', type: 'string', group: 'Options' })
.option('p', { alias: 'plugins', describe: 'Plugins', ...stringList, group: 'Options' })
.option('e', { alias: 'extends', describe: 'Shareable configurations', ...stringList, group: 'Options' })
.option('ci', { describe: 'Toggle CI verifications', type: 'boolean', group: 'Options' })
.option('verify-conditions', { ...stringList, group: 'Plugins' })
.option('analyze-commits', { type: 'string', group: 'Plugins' })
.option('verify-release', { ...stringList, group: 'Plugins' })
.option('generate-notes', { ...stringList, group: 'Plugins' })
.option('prepare', { ...stringList, group: 'Plugins' })
.option('publish', { ...stringList, group: 'Plugins' })
.option('success', { ...stringList, group: 'Plugins' })
.option('fail', { ...stringList, group: 'Plugins' })
.option('d', { alias: 'dry-run', describe: 'Skip publishing', type: 'boolean', group: 'Options' })
.option('h', { alias: 'help', group: 'Options' })
.strict(false)
.exitProcess(false)
const { help, version, ...options } = await cli.parse(argv)
if (Boolean(help) || Boolean(version)) {
return
}
await run(options)
}
cli().catch(error => {
console.error(util.inspect(error, { colors: true }))
process.exit(1)
})