relion 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +84 -73
- package/src/cli.js +6 -0
- package/src/commands.js +16 -30
- package/src/defaults.js +6 -14
- package/src/index.js +48 -125
- package/src/lib/checkpoint.js +10 -10
- package/src/lib/configuration.js +21 -21
- package/src/lib/detect-package-manager.js +21 -18
- package/src/lib/format-commit-message.js +2 -2
- package/src/lib/latest-semver-tag.js +17 -17
- package/src/lib/lifecycles/bump.js +99 -91
- package/src/lib/lifecycles/changelog.js +47 -46
- package/src/lib/lifecycles/commit.js +34 -34
- package/src/lib/lifecycles/tag.js +32 -30
- package/src/lib/print-error.js +4 -4
- package/src/lib/run-exec.js +13 -12
- package/src/lib/run-execFile.js +13 -12
- package/src/lib/run-lifecycle-script.js +11 -11
- package/src/lib/stringify-package.js +9 -9
- package/src/lib/updaters/index.js +57 -54
- package/src/lib/updaters/types/csproj.js +6 -6
- package/src/lib/updaters/types/gradle.js +7 -7
- package/src/lib/updaters/types/json.js +12 -12
- package/src/lib/updaters/types/maven.js +22 -22
- package/src/lib/updaters/types/openapi.js +8 -8
- package/src/lib/updaters/types/plain-text.js +3 -3
- package/src/lib/updaters/types/python.js +19 -19
- package/src/lib/updaters/types/yaml.js +8 -8
- package/src/lib/write-file.js +4 -4
- package/src/preset/constants.js +1 -1
- package/src/preset/index.js +8 -8
- package/src/preset/parser.js +2 -2
- package/src/preset/templates/index.js +8 -8
- package/src/preset/whatBump.js +14 -13
- package/src/preset/writer.js +19 -19
- package/CHANGELOG.md +0 -47
- package/bin/cli.js +0 -9
|
@@ -4,18 +4,19 @@
|
|
|
4
4
|
* modified to support only detecting lock file and not detecting global package manager
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { promises as fs } from 'fs'
|
|
8
|
-
import { resolve } from 'path'
|
|
7
|
+
import { promises as fs } from 'fs'
|
|
8
|
+
import { resolve } from 'path'
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Check if a path exists
|
|
12
12
|
*/
|
|
13
13
|
async function pathExists(p) {
|
|
14
14
|
try {
|
|
15
|
-
await fs.access(p)
|
|
16
|
-
return true
|
|
17
|
-
}
|
|
18
|
-
|
|
15
|
+
await fs.access(p)
|
|
16
|
+
return true
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
|
|
@@ -25,25 +26,27 @@ function getTypeofLockFile(cwd = '.') {
|
|
|
25
26
|
pathExists(resolve(cwd, 'package-lock.json')),
|
|
26
27
|
pathExists(resolve(cwd, 'pnpm-lock.yaml')),
|
|
27
28
|
]).then(([isYarn, isNpm, isPnpm]) => {
|
|
28
|
-
let value = null
|
|
29
|
+
let value = null
|
|
29
30
|
|
|
30
31
|
if (isYarn) {
|
|
31
|
-
value = 'yarn'
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
value = 'yarn'
|
|
33
|
+
}
|
|
34
|
+
else if (isPnpm) {
|
|
35
|
+
value = 'pnpm'
|
|
36
|
+
}
|
|
37
|
+
else if (isNpm) {
|
|
38
|
+
value = 'npm'
|
|
36
39
|
}
|
|
37
40
|
|
|
38
|
-
return value
|
|
39
|
-
})
|
|
41
|
+
return value
|
|
42
|
+
})
|
|
40
43
|
}
|
|
41
44
|
|
|
42
45
|
export async function detectPMByLockFile(cwd) {
|
|
43
|
-
const type = await getTypeofLockFile(cwd)
|
|
46
|
+
const type = await getTypeofLockFile(cwd)
|
|
44
47
|
if (type) {
|
|
45
|
-
return type
|
|
48
|
+
return type
|
|
46
49
|
}
|
|
47
50
|
|
|
48
|
-
return 'npm'
|
|
49
|
-
}
|
|
51
|
+
return 'npm'
|
|
52
|
+
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import * as gitSemverTags from 'git-semver-tags'
|
|
2
|
-
import semver from 'semver'
|
|
1
|
+
import * as gitSemverTags from 'git-semver-tags'
|
|
2
|
+
import semver from 'semver'
|
|
3
3
|
|
|
4
4
|
export default function ({ tagPrefix, prerelease }) {
|
|
5
5
|
return new Promise((resolve, reject) => {
|
|
6
6
|
gitSemverTags({ tagPrefix }, function (err, tags) {
|
|
7
|
-
if (err) return reject(err)
|
|
8
|
-
else if (!tags.length) return resolve('1.0.0')
|
|
7
|
+
if (err) return reject(err)
|
|
8
|
+
else if (!tags.length) return resolve('1.0.0')
|
|
9
9
|
// Respect tagPrefix
|
|
10
|
-
tags = tags.map(
|
|
10
|
+
tags = tags.map(tag => tag.replace(new RegExp('^' + tagPrefix), ''))
|
|
11
11
|
if (prerelease) {
|
|
12
12
|
// ignore any other prelease tags
|
|
13
13
|
tags = tags.filter((tag) => {
|
|
14
|
-
if (!semver.valid(tag)) return false
|
|
14
|
+
if (!semver.valid(tag)) return false
|
|
15
15
|
if (!semver.prerelease(tag)) {
|
|
16
16
|
// include all non-prerelease versions
|
|
17
|
-
return true
|
|
17
|
+
return true
|
|
18
18
|
}
|
|
19
19
|
// check if the name of the prerelease matches the one we are looking for
|
|
20
20
|
if (semver.prerelease(tag)[0] === prerelease) {
|
|
21
|
-
return true
|
|
21
|
+
return true
|
|
22
22
|
}
|
|
23
|
-
return false
|
|
24
|
-
})
|
|
23
|
+
return false
|
|
24
|
+
})
|
|
25
25
|
}
|
|
26
26
|
// ensure that the largest semver tag is at the head.
|
|
27
27
|
tags = tags.map((tag) => {
|
|
28
|
-
return semver.clean(tag)
|
|
29
|
-
})
|
|
30
|
-
tags.sort(semver.rcompare)
|
|
31
|
-
return resolve(tags[0])
|
|
32
|
-
})
|
|
33
|
-
})
|
|
34
|
-
}
|
|
28
|
+
return semver.clean(tag)
|
|
29
|
+
})
|
|
30
|
+
tags.sort(semver.rcompare)
|
|
31
|
+
return resolve(tags[0])
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import checkpoint from '../checkpoint.js'
|
|
2
|
-
import { Bumper } from 'conventional-recommended-bump'
|
|
3
|
-
import fs from 'fs'
|
|
4
|
-
import DotGitignore from 'dotgitignore'
|
|
5
|
-
import path from 'path'
|
|
6
|
-
import runLifecycleScript from '../run-lifecycle-script.js'
|
|
7
|
-
import semver from 'semver'
|
|
8
|
-
import writeFile from '../write-file.js'
|
|
9
|
-
import { resolveUpdaterObjectFromArgument } from '../updaters/index.js'
|
|
10
|
-
let configsToUpdate = {}
|
|
11
|
-
const sanitizeQuotesRegex = /['"]+/g
|
|
1
|
+
import checkpoint from '../checkpoint.js'
|
|
2
|
+
import { Bumper } from 'conventional-recommended-bump'
|
|
3
|
+
import fs from 'fs'
|
|
4
|
+
import DotGitignore from 'dotgitignore'
|
|
5
|
+
import path from 'path'
|
|
6
|
+
import runLifecycleScript from '../run-lifecycle-script.js'
|
|
7
|
+
import semver from 'semver'
|
|
8
|
+
import writeFile from '../write-file.js'
|
|
9
|
+
import { resolveUpdaterObjectFromArgument } from '../updaters/index.js'
|
|
10
|
+
let configsToUpdate = {}
|
|
11
|
+
const sanitizeQuotesRegex = /['"]+/g
|
|
12
12
|
|
|
13
13
|
async function Bump(args, newVersion) {
|
|
14
14
|
// reset the cache of updated config files each
|
|
15
15
|
// time we perform the version bump step.
|
|
16
|
-
configsToUpdate = {}
|
|
16
|
+
configsToUpdate = {}
|
|
17
17
|
|
|
18
18
|
if (
|
|
19
|
-
args.releaseAs
|
|
20
|
-
!(['major', 'minor', 'patch'].includes(args.releaseAs.toLowerCase()) || semver.valid(args.releaseAs))
|
|
19
|
+
args.releaseAs
|
|
20
|
+
&& !(['major', 'minor', 'patch'].includes(args.releaseAs.toLowerCase()) || semver.valid(args.releaseAs))
|
|
21
21
|
) {
|
|
22
|
-
throw new Error(
|
|
22
|
+
throw new Error('releaseAs must be one of \'major\', \'minor\' or \'patch\', or a valid semvar version.')
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
await runLifecycleScript(args, 'prerelease')
|
|
26
|
-
const stdout = await runLifecycleScript(args, 'prebump')
|
|
25
|
+
await runLifecycleScript(args, 'prerelease')
|
|
26
|
+
const stdout = await runLifecycleScript(args, 'prebump')
|
|
27
27
|
if (stdout?.trim().length) {
|
|
28
|
-
const prebumpString = stdout.trim().replace(sanitizeQuotesRegex, '')
|
|
29
|
-
if (semver.valid(prebumpString)) args.releaseAs = prebumpString
|
|
28
|
+
const prebumpString = stdout.trim().replace(sanitizeQuotesRegex, '')
|
|
29
|
+
if (semver.valid(prebumpString)) args.releaseAs = prebumpString
|
|
30
30
|
}
|
|
31
|
-
updateConfigs(args, newVersion)
|
|
32
|
-
await runLifecycleScript(args, 'postbump')
|
|
33
|
-
return newVersion
|
|
31
|
+
updateConfigs(args, newVersion)
|
|
32
|
+
await runLifecycleScript(args, 'postbump')
|
|
33
|
+
return newVersion
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
Bump.getUpdatedConfigs = function () {
|
|
37
|
-
return configsToUpdate
|
|
38
|
-
}
|
|
37
|
+
return configsToUpdate
|
|
38
|
+
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Get the new version number
|
|
@@ -44,43 +44,47 @@ Bump.getUpdatedConfigs = function () {
|
|
|
44
44
|
* @returns Promise<string>
|
|
45
45
|
*/
|
|
46
46
|
export async function getNewVersion(args, version) {
|
|
47
|
-
let newVersion = version
|
|
47
|
+
let newVersion = version
|
|
48
48
|
if (semver.valid(args.releaseAs)) {
|
|
49
|
-
const releaseAs = new semver.SemVer(args.releaseAs)
|
|
49
|
+
const releaseAs = new semver.SemVer(args.releaseAs)
|
|
50
50
|
if (
|
|
51
|
-
isString(args.prerelease)
|
|
52
|
-
releaseAs.prerelease.length
|
|
53
|
-
releaseAs.prerelease.slice(0, -1).join('.') !== args.prerelease
|
|
51
|
+
isString(args.prerelease)
|
|
52
|
+
&& releaseAs.prerelease.length
|
|
53
|
+
&& releaseAs.prerelease.slice(0, -1).join('.') !== args.prerelease
|
|
54
54
|
) {
|
|
55
55
|
// If both releaseAs and the prerelease identifier are supplied, they must match. The behavior
|
|
56
56
|
// for a mismatch is undefined, so error out instead.
|
|
57
|
-
throw new Error('releaseAs and prerelease have conflicting prerelease identifiers')
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
newVersion = releaseAs.
|
|
57
|
+
throw new Error('releaseAs and prerelease have conflicting prerelease identifiers')
|
|
58
|
+
}
|
|
59
|
+
else if (isString(args.prerelease) && releaseAs.prerelease.length) {
|
|
60
|
+
newVersion = releaseAs.version
|
|
61
|
+
}
|
|
62
|
+
else if (isString(args.prerelease)) {
|
|
63
|
+
newVersion = `${releaseAs.major}.${releaseAs.minor}.${releaseAs.patch}-${args.prerelease}.0`
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
newVersion = releaseAs.version
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
// Check if the previous version is the same version and prerelease, and increment if so
|
|
67
70
|
if (
|
|
68
|
-
isString(args.prerelease)
|
|
69
|
-
['prerelease', null].includes(semver.diff(version, newVersion))
|
|
70
|
-
semver.lte(newVersion, version)
|
|
71
|
+
isString(args.prerelease)
|
|
72
|
+
&& ['prerelease', null].includes(semver.diff(version, newVersion))
|
|
73
|
+
&& semver.lte(newVersion, version)
|
|
71
74
|
) {
|
|
72
|
-
newVersion = semver.inc(version, 'prerelease', args.prerelease)
|
|
75
|
+
newVersion = semver.inc(version, 'prerelease', args.prerelease)
|
|
73
76
|
}
|
|
74
77
|
|
|
75
78
|
// Append any build info from releaseAs
|
|
76
|
-
newVersion = semvarToVersionStr(newVersion, releaseAs.build)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const
|
|
79
|
+
newVersion = semvarToVersionStr(newVersion, releaseAs.build)
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const release = await bumpVersion(args.releaseAs, version, args)
|
|
83
|
+
const releaseType = getReleaseType(args.prerelease, release.releaseType, version)
|
|
80
84
|
|
|
81
|
-
newVersion = semver.inc(version, releaseType, args.prerelease)
|
|
85
|
+
newVersion = semver.inc(version, releaseType, args.prerelease)
|
|
82
86
|
}
|
|
83
|
-
return newVersion
|
|
87
|
+
return newVersion
|
|
84
88
|
}
|
|
85
89
|
|
|
86
90
|
/**
|
|
@@ -90,28 +94,29 @@ export async function getNewVersion(args, version) {
|
|
|
90
94
|
* @returns {string}
|
|
91
95
|
*/
|
|
92
96
|
function semvarToVersionStr(semverVersion, semverBuild) {
|
|
93
|
-
return [semverVersion, semverBuild.join('.')].filter(Boolean).join('+')
|
|
97
|
+
return [semverVersion, semverBuild.join('.')].filter(Boolean).join('+')
|
|
94
98
|
}
|
|
95
99
|
|
|
96
100
|
function getReleaseType(prerelease, expectedReleaseType, currentVersion) {
|
|
97
101
|
if (isString(prerelease)) {
|
|
98
102
|
if (isInPrerelease(currentVersion)) {
|
|
99
103
|
if (
|
|
100
|
-
shouldContinuePrerelease(currentVersion, expectedReleaseType)
|
|
101
|
-
getTypePriority(getCurrentActiveType(currentVersion)) > getTypePriority(expectedReleaseType)
|
|
104
|
+
shouldContinuePrerelease(currentVersion, expectedReleaseType)
|
|
105
|
+
|| getTypePriority(getCurrentActiveType(currentVersion)) > getTypePriority(expectedReleaseType)
|
|
102
106
|
) {
|
|
103
|
-
return 'prerelease'
|
|
107
|
+
return 'prerelease'
|
|
104
108
|
}
|
|
105
109
|
}
|
|
106
110
|
|
|
107
|
-
return 'pre' + expectedReleaseType
|
|
108
|
-
}
|
|
109
|
-
|
|
111
|
+
return 'pre' + expectedReleaseType
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
return expectedReleaseType
|
|
110
115
|
}
|
|
111
116
|
}
|
|
112
117
|
|
|
113
118
|
function isString(val) {
|
|
114
|
-
return typeof val === 'string'
|
|
119
|
+
return typeof val === 'string'
|
|
115
120
|
}
|
|
116
121
|
|
|
117
122
|
/**
|
|
@@ -124,14 +129,14 @@ function isString(val) {
|
|
|
124
129
|
* @return {boolean}
|
|
125
130
|
*/
|
|
126
131
|
function shouldContinuePrerelease(version, expectType) {
|
|
127
|
-
return getCurrentActiveType(version) === expectType
|
|
132
|
+
return getCurrentActiveType(version) === expectType
|
|
128
133
|
}
|
|
129
134
|
|
|
130
135
|
function isInPrerelease(version) {
|
|
131
|
-
return Array.isArray(semver.prerelease(version))
|
|
136
|
+
return Array.isArray(semver.prerelease(version))
|
|
132
137
|
}
|
|
133
138
|
|
|
134
|
-
const TypeList = ['major', 'minor', 'patch'].reverse()
|
|
139
|
+
const TypeList = ['major', 'minor', 'patch'].reverse()
|
|
135
140
|
|
|
136
141
|
/**
|
|
137
142
|
* extract the in-pre-release type in target version
|
|
@@ -140,10 +145,10 @@ const TypeList = ['major', 'minor', 'patch'].reverse();
|
|
|
140
145
|
* @return {string}
|
|
141
146
|
*/
|
|
142
147
|
function getCurrentActiveType(version) {
|
|
143
|
-
const typelist = TypeList
|
|
148
|
+
const typelist = TypeList
|
|
144
149
|
for (let i = 0; i < typelist.length; i++) {
|
|
145
150
|
if (semver[typelist[i]](version)) {
|
|
146
|
-
return typelist[i]
|
|
151
|
+
return typelist[i]
|
|
147
152
|
}
|
|
148
153
|
}
|
|
149
154
|
}
|
|
@@ -156,37 +161,39 @@ function getCurrentActiveType(version) {
|
|
|
156
161
|
* @return {number}
|
|
157
162
|
*/
|
|
158
163
|
function getTypePriority(type) {
|
|
159
|
-
return TypeList.indexOf(type)
|
|
164
|
+
return TypeList.indexOf(type)
|
|
160
165
|
}
|
|
161
166
|
|
|
162
167
|
async function bumpVersion(releaseAs, currentVersion, args) {
|
|
163
168
|
if (releaseAs) {
|
|
164
169
|
return {
|
|
165
170
|
releaseType: releaseAs,
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const recommendation = await getRecommendedBump(args, currentVersion)
|
|
169
175
|
if (recommendation) {
|
|
170
|
-
return recommendation
|
|
171
|
-
}
|
|
172
|
-
|
|
176
|
+
return recommendation
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
throw new Error('No recommendation found')
|
|
173
180
|
}
|
|
174
181
|
}
|
|
175
182
|
}
|
|
176
183
|
|
|
177
184
|
async function getRecommendedBump(args, currentVersion) {
|
|
178
|
-
const bumper = new Bumper(args.path)
|
|
185
|
+
const bumper = new Bumper(args.path)
|
|
179
186
|
bumper.loadPreset({
|
|
180
187
|
preMajor: semver.lt(currentVersion, '1.0.0'),
|
|
181
188
|
...args.preset,
|
|
182
|
-
})
|
|
189
|
+
})
|
|
183
190
|
bumper.tag({
|
|
184
191
|
tagPrefix: args.tagPrefix,
|
|
185
192
|
lernaPackage: args.lernaPackage,
|
|
186
|
-
})
|
|
187
|
-
bumper.commits({}, args.parserOpts)
|
|
188
|
-
const recommendation = await bumper.bump()
|
|
189
|
-
return recommendation
|
|
193
|
+
})
|
|
194
|
+
bumper.commits({}, args.parserOpts)
|
|
195
|
+
const recommendation = await bumper.bump()
|
|
196
|
+
return recommendation
|
|
190
197
|
}
|
|
191
198
|
|
|
192
199
|
/**
|
|
@@ -196,39 +203,40 @@ async function getRecommendedBump(args, currentVersion) {
|
|
|
196
203
|
* @return void
|
|
197
204
|
*/
|
|
198
205
|
function updateConfigs(args, newVersion) {
|
|
199
|
-
const dotgit = DotGitignore()
|
|
206
|
+
const dotgit = DotGitignore()
|
|
200
207
|
args.bumpFiles.forEach(async function (bumpFile) {
|
|
201
|
-
const updater = await resolveUpdaterObjectFromArgument(bumpFile)
|
|
208
|
+
const updater = await resolveUpdaterObjectFromArgument(bumpFile)
|
|
202
209
|
if (!updater) {
|
|
203
|
-
return
|
|
210
|
+
return
|
|
204
211
|
}
|
|
205
|
-
const configPath = path.resolve(process.cwd(), updater.filename)
|
|
212
|
+
const configPath = path.resolve(process.cwd(), updater.filename)
|
|
206
213
|
try {
|
|
207
214
|
if (dotgit.ignore(updater.filename)) {
|
|
208
|
-
console.debug(`Not updating file '${updater.filename}', as it is ignored in Git`)
|
|
209
|
-
return
|
|
215
|
+
console.debug(`Not updating file '${updater.filename}', as it is ignored in Git`)
|
|
216
|
+
return
|
|
210
217
|
}
|
|
211
|
-
const stat = fs.lstatSync(configPath)
|
|
218
|
+
const stat = fs.lstatSync(configPath)
|
|
212
219
|
|
|
213
220
|
if (!stat.isFile()) {
|
|
214
|
-
console.debug(`Not updating '${updater.filename}', as it is not a file`)
|
|
215
|
-
return
|
|
221
|
+
console.debug(`Not updating '${updater.filename}', as it is not a file`)
|
|
222
|
+
return
|
|
216
223
|
}
|
|
217
|
-
const contents = fs.readFileSync(configPath, 'utf8')
|
|
218
|
-
const newContents = updater.updater.writeVersion(contents, newVersion)
|
|
219
|
-
const realNewVersion = updater.updater.readVersion(newContents)
|
|
224
|
+
const contents = fs.readFileSync(configPath, 'utf8')
|
|
225
|
+
const newContents = updater.updater.writeVersion(contents, newVersion)
|
|
226
|
+
const realNewVersion = updater.updater.readVersion(newContents)
|
|
220
227
|
checkpoint(args, 'bumping version in ' + updater.filename + ' from %s to %s', [
|
|
221
228
|
updater.updater.readVersion(contents),
|
|
222
229
|
realNewVersion,
|
|
223
|
-
])
|
|
224
|
-
writeFile(args, configPath, newContents)
|
|
230
|
+
])
|
|
231
|
+
writeFile(args, configPath, newContents)
|
|
225
232
|
// flag any config files that we modify the version # for
|
|
226
233
|
// as having been updated.
|
|
227
|
-
configsToUpdate[updater.filename] = true
|
|
228
|
-
}
|
|
229
|
-
|
|
234
|
+
configsToUpdate[updater.filename] = true
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
if (err.code !== 'ENOENT') console.warn(err.message)
|
|
230
238
|
}
|
|
231
|
-
})
|
|
239
|
+
})
|
|
232
240
|
}
|
|
233
241
|
|
|
234
|
-
export default Bump
|
|
242
|
+
export default Bump
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
import checkpoint from '../checkpoint.js'
|
|
3
|
-
import conventionalChangelog from 'conventional-changelog'
|
|
4
|
-
import fs from 'fs'
|
|
5
|
-
import runLifecycleScript from '../run-lifecycle-script.js'
|
|
6
|
-
import writeFile from '../write-file.js'
|
|
7
|
-
const START_OF_LAST_RELEASE_PATTERN = /(^#.*?[0-9]+\.[0-9]+\.[0-9]+|<a name=)/m
|
|
1
|
+
import chalk from 'chalk'
|
|
2
|
+
import checkpoint from '../checkpoint.js'
|
|
3
|
+
import conventionalChangelog from 'conventional-changelog'
|
|
4
|
+
import fs from 'fs'
|
|
5
|
+
import runLifecycleScript from '../run-lifecycle-script.js'
|
|
6
|
+
import writeFile from '../write-file.js'
|
|
7
|
+
const START_OF_LAST_RELEASE_PATTERN = /(^#.*?[0-9]+\.[0-9]+\.[0-9]+|<a name=)/m
|
|
8
8
|
|
|
9
9
|
async function Changelog(args, newVersion) {
|
|
10
|
-
await runLifecycleScript(args, 'prechangelog')
|
|
11
|
-
await outputChangelog(args, newVersion)
|
|
12
|
-
await runLifecycleScript(args, 'postchangelog')
|
|
10
|
+
await runLifecycleScript(args, 'prechangelog')
|
|
11
|
+
await outputChangelog(args, newVersion)
|
|
12
|
+
await runLifecycleScript(args, 'postchangelog')
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
Changelog.START_OF_LAST_RELEASE_PATTERN = START_OF_LAST_RELEASE_PATTERN
|
|
15
|
+
Changelog.START_OF_LAST_RELEASE_PATTERN = START_OF_LAST_RELEASE_PATTERN
|
|
16
16
|
|
|
17
|
-
export default Changelog
|
|
17
|
+
export default Changelog
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Front matter is only extracted and therefore retained in final output where Changelog "header" begins with #Changelog,
|
|
21
21
|
* e.g. meets Standard-Version (last release) or relion(current) format
|
|
22
22
|
*/
|
|
23
23
|
function extractFrontMatter(oldContent) {
|
|
24
|
-
const headerStart = oldContent.indexOf('# Changelog')
|
|
24
|
+
const headerStart = oldContent.indexOf('# Changelog')
|
|
25
25
|
return headerStart !== -1 || headerStart !== 0
|
|
26
26
|
? oldContent.substring(0, headerStart)
|
|
27
|
-
: ''
|
|
27
|
+
: ''
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* find the position of the last release and remove header
|
|
32
32
|
*/
|
|
33
33
|
function extractChangelogBody(oldContent) {
|
|
34
|
-
const oldContentStart = oldContent.search(START_OF_LAST_RELEASE_PATTERN)
|
|
34
|
+
const oldContentStart = oldContent.search(START_OF_LAST_RELEASE_PATTERN)
|
|
35
35
|
return oldContentStart !== -1
|
|
36
36
|
? oldContent.substring(oldContentStart)
|
|
37
|
-
: oldContent
|
|
37
|
+
: oldContent
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
function outputChangelog(args
|
|
40
|
+
function outputChangelog(args) {
|
|
41
41
|
return new Promise((resolve, reject) => {
|
|
42
|
-
createIfMissing(args)
|
|
43
|
-
const header = args.preset.header
|
|
42
|
+
createIfMissing(args)
|
|
43
|
+
const header = args.preset.header
|
|
44
44
|
|
|
45
|
-
const oldContent
|
|
46
|
-
args.dryRun || args.releaseCount === 0
|
|
45
|
+
const oldContent
|
|
46
|
+
= args.dryRun || args.releaseCount === 0
|
|
47
47
|
? ''
|
|
48
|
-
: fs.readFileSync(args.infile, 'utf-8')
|
|
48
|
+
: fs.readFileSync(args.infile, 'utf-8')
|
|
49
49
|
|
|
50
|
-
const oldContentBody = extractChangelogBody(oldContent)
|
|
50
|
+
const oldContentBody = extractChangelogBody(oldContent)
|
|
51
51
|
|
|
52
|
-
const changelogFrontMatter = extractFrontMatter(oldContent)
|
|
52
|
+
const changelogFrontMatter = extractFrontMatter(oldContent)
|
|
53
53
|
|
|
54
|
-
let content = ''
|
|
54
|
+
let content = ''
|
|
55
55
|
const changelogStream = conventionalChangelog(
|
|
56
56
|
{
|
|
57
57
|
preset: args.preset,
|
|
@@ -59,8 +59,8 @@ function outputChangelog(args, newVersion) {
|
|
|
59
59
|
releaseCount: args.releaseCount,
|
|
60
60
|
...(args.verbose
|
|
61
61
|
? {
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
debug: console.info.bind(console, 'conventional-recommended-bump'),
|
|
63
|
+
}
|
|
64
64
|
: {}),
|
|
65
65
|
},
|
|
66
66
|
args.context,
|
|
@@ -68,38 +68,39 @@ function outputChangelog(args, newVersion) {
|
|
|
68
68
|
args.parserOpts,
|
|
69
69
|
args.writerOpts,
|
|
70
70
|
).on('error', function (err) {
|
|
71
|
-
return reject(err)
|
|
72
|
-
})
|
|
71
|
+
return reject(err)
|
|
72
|
+
})
|
|
73
73
|
|
|
74
74
|
changelogStream.on('data', function (buffer) {
|
|
75
|
-
content += buffer.toString()
|
|
76
|
-
})
|
|
75
|
+
content += buffer.toString()
|
|
76
|
+
})
|
|
77
77
|
|
|
78
78
|
changelogStream.on('end', function () {
|
|
79
|
-
checkpoint(args, 'outputting changes to %s', [args.infile])
|
|
79
|
+
checkpoint(args, 'outputting changes to %s', [args.infile])
|
|
80
80
|
if (args.dryRun)
|
|
81
|
-
console.info(`\n---\n${chalk.gray(content.trim())}\n---\n`)
|
|
81
|
+
console.info(`\n---\n${chalk.gray(content.trim())}\n---\n`)
|
|
82
82
|
else
|
|
83
83
|
writeFile(
|
|
84
84
|
args,
|
|
85
85
|
args.infile,
|
|
86
|
-
changelogFrontMatter
|
|
87
|
-
header
|
|
88
|
-
(content + oldContentBody).replace(/\n+$/, '\n'),
|
|
89
|
-
)
|
|
90
|
-
return resolve()
|
|
91
|
-
})
|
|
92
|
-
})
|
|
86
|
+
changelogFrontMatter
|
|
87
|
+
+ header
|
|
88
|
+
+ (content + oldContentBody).replace(/\n+$/, '\n'),
|
|
89
|
+
)
|
|
90
|
+
return resolve()
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
function createIfMissing(args) {
|
|
96
96
|
try {
|
|
97
|
-
fs.accessSync(args.infile, fs.F_OK)
|
|
98
|
-
}
|
|
97
|
+
fs.accessSync(args.infile, fs.F_OK)
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
99
100
|
if (err.code === 'ENOENT') {
|
|
100
|
-
checkpoint(args, 'created %s', [args.infile])
|
|
101
|
-
args.outputUnreleased = true
|
|
102
|
-
writeFile(args, args.infile, '\n')
|
|
101
|
+
checkpoint(args, 'created %s', [args.infile])
|
|
102
|
+
args.outputUnreleased = true
|
|
103
|
+
writeFile(args, args.infile, '\n')
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
|
-
}
|
|
106
|
+
}
|