bulk-release 2.3.3 → 2.4.1
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/CHANGELOG.md +10 -0
- package/README.md +13 -13
- package/package.json +3 -3
- package/src/main/js/analyze.js +11 -9
- package/src/main/js/deps.js +3 -2
- package/src/main/js/npm.js +20 -8
- package/src/main/js/processor.js +15 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
## [2.4.1](https://github.com/semrel-extra/zx-bulk-release/compare/v2.4.0...v2.4.1) (2023-04-09)
|
|
2
|
+
|
|
3
|
+
### Fixes & improvements
|
|
4
|
+
* fix: revert pkg.json state after publishing asap ([7e28b3e](https://github.com/semrel-extra/zx-bulk-release/commit/7e28b3eb3f0685bbe2133a6a0a1103ff19edca18))
|
|
5
|
+
|
|
6
|
+
## [2.4.0](https://github.com/semrel-extra/zx-bulk-release/compare/v2.3.3...v2.4.0) (2023-04-09)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
* feat: support npm preversions (snapshots) publishing ([3ad7df7](https://github.com/semrel-extra/zx-bulk-release/commit/3ad7df752f6085ca010bcb6e0b4ac31260ce512b))
|
|
10
|
+
|
|
1
11
|
## [2.3.3](https://github.com/semrel-extra/zx-bulk-release/compare/v2.3.2...v2.3.3) (2023-04-07)
|
|
2
12
|
|
|
3
13
|
### Fixes & improvements
|
package/README.md
CHANGED
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
[](https://codeclimate.com/github/semrel-extra/zx-bulk-release/test_coverage)
|
|
7
7
|
[](https://www.npmjs.com/package/zx-bulk-release)
|
|
8
8
|
|
|
9
|
-
🚧 Work in progress. Early access preview
|
|
10
|
-
|
|
11
9
|
## Key features
|
|
12
10
|
* [Conventional commits](https://www.conventionalcommits.org/en/v1.0.0/#specification) trigger semantic releases.
|
|
13
11
|
* Automated cross-pkg version bumping.
|
|
@@ -37,17 +35,18 @@ yarn add zx-bulk-release
|
|
|
37
35
|
```shell
|
|
38
36
|
GH_TOKEN=ghtoken GH_USER=username NPM_TOKEN=npmtoken npx zx-bulk-release [opts]
|
|
39
37
|
```
|
|
40
|
-
| Flag | Description
|
|
41
|
-
|
|
42
|
-
| `--ignore` | Packages to ignore: `a, b`
|
|
43
|
-
| `--include-private` | Include `private` packages
|
|
44
|
-
| `--concurrency` | `build/publish` threads limit
|
|
45
|
-
| `--no-build` | Skip `buildCmd` invoke
|
|
46
|
-
| `--no-npm-fetch` | Disable npm artifacts fetching
|
|
47
|
-
| `--only-workspace-deps` | Recognize only `workspace:` deps as graph edges
|
|
48
|
-
| `--dry-run` / `--no-publish` | Disable any publish logic
|
|
49
|
-
| `--report` | Persist release state to file
|
|
50
|
-
| `--
|
|
38
|
+
| Flag | Description | Default |
|
|
39
|
+
|------------------------------|----------------------------------------------------------------------------------------|------------------|
|
|
40
|
+
| `--ignore` | Packages to ignore: `a, b` | |
|
|
41
|
+
| `--include-private` | Include `private` packages | `false` |
|
|
42
|
+
| `--concurrency` | `build/publish` threads limit | `os.cpus.length` |
|
|
43
|
+
| `--no-build` | Skip `buildCmd` invoke | |
|
|
44
|
+
| `--no-npm-fetch` | Disable npm artifacts fetching | |
|
|
45
|
+
| `--only-workspace-deps` | Recognize only `workspace:` deps as graph edges | |
|
|
46
|
+
| `--dry-run` / `--no-publish` | Disable any publish logic | |
|
|
47
|
+
| `--report` | Persist release state to file | |
|
|
48
|
+
| `--snapshot` | Disable any publishing steps except of npm and push packages to the `snapshot` channel | |
|
|
49
|
+
| `--debug` | Enable [zx](https://github.com/google/zx#verbose) verbose mode | |
|
|
51
50
|
|
|
52
51
|
### JS API
|
|
53
52
|
```js
|
|
@@ -308,6 +307,7 @@ Release process state is reported to the console and to a file if `--report` fla
|
|
|
308
307
|
* [nrwl/nx](https://github.com/nrwl/nx)
|
|
309
308
|
* [moonrepo/moon](https://github.com/moonrepo/moon)
|
|
310
309
|
* [ojkelly/yarn.build](https://github.com/ojkelly/yarn.build)
|
|
310
|
+
* [antfu/bumpp](https://github.com/antfu/bumpp)
|
|
311
311
|
|
|
312
312
|
## License
|
|
313
313
|
[MIT](./LICENSE)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bulk-release",
|
|
3
3
|
"alias": "bulk-release",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.4.1",
|
|
5
5
|
"description": "zx-based alternative for multi-semantic-release",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"docs": "mkdir -p docs && cp ./README.md ./docs/README.md"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@semrel-extra/topo": "^1.
|
|
25
|
+
"@semrel-extra/topo": "^1.10.0",
|
|
26
26
|
"cosmiconfig": "^8.1.3",
|
|
27
27
|
"queuefy": "^1.2.1",
|
|
28
28
|
"zx-extra": "^2.5.4"
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"c8": "^7.13.0",
|
|
32
32
|
"uvu": "^0.5.6",
|
|
33
|
-
"verdaccio": "^5.23.
|
|
33
|
+
"verdaccio": "^5.23.2"
|
|
34
34
|
},
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public"
|
package/src/main/js/analyze.js
CHANGED
|
@@ -6,17 +6,20 @@ import {getCommits} from './git.js'
|
|
|
6
6
|
|
|
7
7
|
export const analyze = async (pkg) => {
|
|
8
8
|
const semanticChanges = await getSemanticChanges(pkg.absPath, pkg.latest.tag?.ref)
|
|
9
|
-
const depsChanges = await updateDeps(pkg
|
|
9
|
+
const depsChanges = await updateDeps(pkg)
|
|
10
10
|
const changes = [...semanticChanges, ...depsChanges]
|
|
11
11
|
const releaseType = getNextReleaseType(changes)
|
|
12
|
+
const pre = pkg.context.flags.snapshot ? `-snap.${pkg.context.git.sha.slice(0, 7)}` : undefined
|
|
12
13
|
|
|
13
14
|
pkg.changes = changes
|
|
14
15
|
pkg.releaseType = releaseType
|
|
15
16
|
pkg.version = resolvePkgVersion(
|
|
16
17
|
releaseType,
|
|
17
18
|
pkg.latest.tag?.version || pkg.latest.meta?.version,
|
|
18
|
-
pkg.manifest.version
|
|
19
|
+
pkg.manifest.version,
|
|
20
|
+
pre
|
|
19
21
|
)
|
|
22
|
+
pkg.preversion = pre && pkg.version
|
|
20
23
|
pkg.manifest.version = pkg.version
|
|
21
24
|
pkg.tag = releaseType ? formatTag({name: pkg.name, version: pkg.version}) : null
|
|
22
25
|
|
|
@@ -62,13 +65,12 @@ export const getNextReleaseType = (changes) => changes.length
|
|
|
62
65
|
? releaseSeverityOrder.find(type => changes.find(({releaseType}) => type === releaseType))
|
|
63
66
|
: null
|
|
64
67
|
|
|
65
|
-
export const getNextVersion = (releaseType, prevVersion, defaultVersion = '1.0.0') =>
|
|
66
|
-
|
|
68
|
+
export const getNextVersion = (releaseType, prevVersion, defaultVersion = '1.0.0', pre = '') =>
|
|
69
|
+
(prevVersion
|
|
70
|
+
? semver.inc(prevVersion, releaseType)
|
|
71
|
+
: defaultVersion) + pre
|
|
67
72
|
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export const resolvePkgVersion = (releaseType, prevVersion, defaultVersion) =>
|
|
73
|
+
export const resolvePkgVersion = (releaseType, prevVersion, defaultVersion, pre) =>
|
|
72
74
|
releaseType
|
|
73
|
-
? getNextVersion(releaseType, prevVersion, defaultVersion)
|
|
75
|
+
? getNextVersion(releaseType, prevVersion, defaultVersion, pre)
|
|
74
76
|
: prevVersion || null
|
package/src/main/js/deps.js
CHANGED
|
@@ -3,14 +3,15 @@ import {topo as _topo, traverseDeps} from '@semrel-extra/topo'
|
|
|
3
3
|
|
|
4
4
|
export {traverseQueue, traverseDeps} from '@semrel-extra/topo'
|
|
5
5
|
|
|
6
|
-
export const updateDeps = async (pkg
|
|
6
|
+
export const updateDeps = async (pkg) => {
|
|
7
7
|
const changes = []
|
|
8
|
+
const {context: {packages}} = pkg
|
|
8
9
|
|
|
9
10
|
await traverseDeps({pkg, packages, cb: async ({name, version, deps, scope, pkg: dep}) => {
|
|
10
11
|
const prev = pkg.latest.meta?.[scope]?.[name]
|
|
11
12
|
const actual = dep?.version
|
|
12
13
|
const next = resolveNextVersion(version, actual, prev)
|
|
13
|
-
const _version = next || subsWorkspace(version, actual)
|
|
14
|
+
const _version = dep?.preversion || next || subsWorkspace(version, actual) // NOTE preversion should always be pinned
|
|
14
15
|
|
|
15
16
|
pkg[scope] = {...pkg[scope], [name]: _version} // Update pkg context
|
|
16
17
|
deps[name] = _version // Update manifest
|
package/src/main/js/npm.js
CHANGED
|
@@ -35,18 +35,30 @@ export const fetchManifest = async (pkg, {nothrow} = {}) => {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export const npmPublish = async (pkg) => {
|
|
38
|
-
const {absPath: cwd, name, version, manifest, config} = pkg
|
|
39
|
-
if (manifest.private || config?.npmPublish === false) return
|
|
38
|
+
const {absPath: cwd, name, version, manifest, manifestPath, manifestRaw, config: {npmPublish, npmRegistry, npmToken, npmConfig} } = pkg
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
const npmrc = npmConfig ? npmConfig : tempy.temporaryFile({name: '.npmrc'})
|
|
40
|
+
if (manifest.private || npmPublish === false) return
|
|
43
41
|
|
|
44
|
-
log({pkg})(`
|
|
42
|
+
log({pkg})(`publishing npm package ${name} ${version} to ${npmRegistry}`)
|
|
45
43
|
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
await fs.writeJson(manifestPath, manifest, {spaces: 2})
|
|
45
|
+
|
|
46
|
+
const npmTag = pkg.preversion ? 'snapshot' : 'latest'
|
|
47
|
+
const npmrc = await getNpmrc({npmConfig, npmToken, npmRegistry})
|
|
48
|
+
|
|
49
|
+
await $.o({cwd})`npm publish --no-git-tag-version --registry=${npmRegistry} --userconfig ${npmrc} --tag ${npmTag} --no-workspaces`
|
|
50
|
+
fs.writeFileSync(manifestPath, manifestRaw, {encoding: 'utf8'})
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const getNpmrc = async ({npmConfig, npmToken, npmRegistry}) => {
|
|
54
|
+
if (npmConfig) {
|
|
55
|
+
return npmConfig
|
|
48
56
|
}
|
|
49
|
-
|
|
57
|
+
|
|
58
|
+
const npmrc = tempy.temporaryFile({name: '.npmrc'})
|
|
59
|
+
await fs.writeFile(npmrc, `${npmRegistry.replace(/^https?:\/\//, '//')}/:_authToken=${npmToken}`, {encoding: 'utf8'})
|
|
60
|
+
|
|
61
|
+
return npmrc
|
|
50
62
|
}
|
|
51
63
|
|
|
52
64
|
// $`npm view ${name}@${version} dist.tarball`
|
package/src/main/js/processor.js
CHANGED
|
@@ -99,7 +99,7 @@ const createContext = async ({flags, env, cwd}) => {
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
// Inspired by https://docs.github.com/en/actions/learn-github-actions/contexts
|
|
102
|
-
const contextify = async (pkg, {packages, root}) => {
|
|
102
|
+
const contextify = async (pkg, {packages, root, flags}) => {
|
|
103
103
|
pkg.config = await getPkgConfig(pkg.absPath, root.absPath)
|
|
104
104
|
pkg.latest = await getLatest(pkg)
|
|
105
105
|
pkg.context = {
|
|
@@ -108,6 +108,7 @@ const contextify = async (pkg, {packages, root}) => {
|
|
|
108
108
|
root: await getRoot(pkg.absPath)
|
|
109
109
|
},
|
|
110
110
|
env: $.env,
|
|
111
|
+
flags,
|
|
111
112
|
packages
|
|
112
113
|
}
|
|
113
114
|
}
|
|
@@ -141,17 +142,19 @@ const publish = memoizeBy(async (pkg, run = runCmd) => within(async () => {
|
|
|
141
142
|
throw new Error('package.json version not synced')
|
|
142
143
|
}
|
|
143
144
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
145
|
+
if (pkg.context.flags.snapshot) {
|
|
146
|
+
await npmPublish(pkg)
|
|
147
|
+
} else {
|
|
148
|
+
await pushReleaseTag(pkg)
|
|
149
|
+
await Promise.all([
|
|
150
|
+
pushMeta(pkg),
|
|
151
|
+
pushChangelog(pkg),
|
|
152
|
+
npmPublish(pkg),
|
|
153
|
+
ghRelease(pkg),
|
|
154
|
+
ghPages(pkg),
|
|
155
|
+
run(pkg, 'publishCmd')
|
|
156
|
+
])
|
|
157
|
+
}
|
|
155
158
|
|
|
156
159
|
pkg.published = true
|
|
157
160
|
}))
|