bulk-release 2.3.3 → 2.4.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/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [2.4.0](https://github.com/semrel-extra/zx-bulk-release/compare/v2.3.3...v2.4.0) (2023-04-09)
2
+
3
+ ### Features
4
+ * feat: support npm preversions (snapshots) publishing ([3ad7df7](https://github.com/semrel-extra/zx-bulk-release/commit/3ad7df752f6085ca010bcb6e0b4ac31260ce512b))
5
+
1
6
  ## [2.3.3](https://github.com/semrel-extra/zx-bulk-release/compare/v2.3.2...v2.3.3) (2023-04-07)
2
7
 
3
8
  ### Fixes & improvements
package/README.md CHANGED
@@ -6,8 +6,6 @@
6
6
  [![Test Coverage](https://api.codeclimate.com/v1/badges/bb94e929b1b6430781b5/test_coverage)](https://codeclimate.com/github/semrel-extra/zx-bulk-release/test_coverage)
7
7
  [![npm (tag)](https://img.shields.io/npm/v/zx-bulk-release)](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 | Default |
41
- |------------------------------|----------------------------------------------------------------|------------------|
42
- | `--ignore` | Packages to ignore: `a, b` | |
43
- | `--include-private` | Include `private` packages | `false` |
44
- | `--concurrency` | `build/publish` threads limit | `os.cpus.length` |
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
- | `--debug` | Enable [zx](https://github.com/google/zx#verbose) verbose mode | |
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.3.3",
4
+ "version": "2.4.0",
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.9.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.1"
33
+ "verdaccio": "^5.23.2"
34
34
  },
35
35
  "publishConfig": {
36
36
  "access": "public"
@@ -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, pkg.context.packages)
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
- if (!prevVersion) return defaultVersion
68
+ export const getNextVersion = (releaseType, prevVersion, defaultVersion = '1.0.0', pre = '') =>
69
+ (prevVersion
70
+ ? semver.inc(prevVersion, releaseType)
71
+ : defaultVersion) + pre
67
72
 
68
- return semver.inc(prevVersion, releaseType)
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
@@ -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, packages) => {
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
@@ -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
- const {npmRegistry, npmToken, npmConfig} = config
42
- const npmrc = npmConfig ? npmConfig : tempy.temporaryFile({name: '.npmrc'})
40
+ if (manifest.private || npmPublish === false) return
43
41
 
44
- log({pkg})(`publish npm package ${name} ${version} to ${npmRegistry}`)
42
+ log({pkg})(`publishing npm package ${name} ${version} to ${npmRegistry}`)
45
43
 
46
- if (!npmConfig) {
47
- await fs.writeFile(npmrc, `${npmRegistry.replace(/^https?:\/\//, '//')}/:_authToken=${npmToken}`, {encoding: 'utf8'})
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
+ await fs.writeFile(manifestPath, manifestRaw, {encoding: 'utf8'})
51
+ }
52
+
53
+ export const getNpmrc = async ({npmConfig, npmToken, npmRegistry}) => {
54
+ if (npmConfig) {
55
+ return npmConfig
48
56
  }
49
- await $.o({cwd})`npm publish --no-git-tag-version --registry=${npmRegistry} --userconfig ${npmrc} --no-workspaces`
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`
@@ -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
- fs.writeJsonSync(pkg.manifestPath, pkg.manifest, {spaces: 2})
145
- await pushReleaseTag(pkg)
146
-
147
- await Promise.all([
148
- pushMeta(pkg),
149
- pushChangelog(pkg),
150
- npmPublish(pkg),
151
- ghRelease(pkg),
152
- ghPages(pkg),
153
- run(pkg, 'publishCmd')
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
  }))