feat(version): add workspace support · npm/cli@8c9e247 (original) (raw)
1
``
`-
const libversion = require('libnpmversion')
`
``
1
`+
const libnpmversion = require('libnpmversion')
`
``
2
`+
const { resolve } = require('path')
`
``
3
`+
const { promisify } = require('util')
`
``
4
`+
const readFile = promisify(require('fs').readFile)
`
2
5
``
``
6
`+
const getWorkspaces = require('./workspaces/get-workspaces.js')
`
3
7
`const BaseCommand = require('./base-command.js')
`
``
8
+
4
9
`class Version extends BaseCommand {
`
5
10
`static get description () {
`
6
11
`return 'Bump a package version'
`
`@@ -11,9 +16,23 @@ class Version extends BaseCommand {
`
11
16
`return 'version'
`
12
17
`}
`
13
18
``
``
19
`+
/* istanbul ignore next - see test/lib/load-all-commands.js */
`
``
20
`+
static get params () {
`
``
21
`+
return [
`
``
22
`+
'allow-same-version',
`
``
23
`+
'commit-hooks',
`
``
24
`+
'git-tag-version',
`
``
25
`+
'json',
`
``
26
`+
'preid',
`
``
27
`+
'sign-git-tag',
`
``
28
`+
'workspace',
`
``
29
`+
'workspaces',
`
``
30
`+
]
`
``
31
`+
}
`
``
32
+
14
33
`/* istanbul ignore next - see test/lib/load-all-commands.js */
`
15
34
`static get usage () {
`
16
``
`-
return ['[ | major | minor | patch | premajor | preminor | prepatch | prerelease [--preid=] | from-git]']
`
``
35
`+
return ['[ | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]']
`
17
36
`}
`
18
37
``
19
38
`async completion (opts) {
`
`@@ -37,6 +56,10 @@ class Version extends BaseCommand {
`
37
56
`return this.version(args).then(() => cb()).catch(cb)
`
38
57
`}
`
39
58
``
``
59
`+
execWorkspaces (args, filters, cb) {
`
``
60
`+
this.versionWorkspaces(args, filters).then(() => cb()).catch(cb)
`
``
61
`+
}
`
``
62
+
40
63
`async version (args) {
`
41
64
`switch (args.length) {
`
42
65
`case 0:
`
`@@ -48,20 +71,42 @@ class Version extends BaseCommand {
`
48
71
`}
`
49
72
`}
`
50
73
``
``
74
`+
async versionWorkspaces (args, filters) {
`
``
75
`+
switch (args.length) {
`
``
76
`+
case 0:
`
``
77
`+
return this.listWorkspaces(filters)
`
``
78
`+
case 1:
`
``
79
`+
return this.changeWorkspaces(args, filters)
`
``
80
`+
default:
`
``
81
`+
throw this.usage
`
``
82
`+
}
`
``
83
`+
}
`
``
84
+
51
85
`async change (args) {
`
52
86
`const prefix = this.npm.config.get('tag-version-prefix')
`
53
``
`-
const version = await libversion(args[0], {
`
``
87
`+
const version = await libnpmversion(args[0], {
`
54
88
` ...this.npm.flatOptions,
`
55
89
`path: this.npm.prefix,
`
56
90
`})
`
57
91
`` return this.npm.output(${prefix}${version})
``
58
92
`}
`
59
93
``
60
``
`-
async list () {
`
61
``
`-
const results = {}
`
62
``
`-
const { promisify } = require('util')
`
63
``
`-
const { resolve } = require('path')
`
64
``
`-
const readFile = promisify(require('fs').readFile)
`
``
94
`+
async changeWorkspaces (args, filters) {
`
``
95
`+
const prefix = this.npm.config.get('tag-version-prefix')
`
``
96
`+
const workspaces =
`
``
97
`+
await getWorkspaces(filters, { path: this.npm.localPrefix })
`
``
98
`+
for (const [name, path] of workspaces) {
`
``
99
`+
this.npm.output(name)
`
``
100
`+
const version = await libnpmversion(args[0], {
`
``
101
`+
...this.npm.flatOptions,
`
``
102
`+
'git-tag-version': false,
`
``
103
`+
path,
`
``
104
`+
})
`
``
105
`` +
this.npm.output(${prefix}${version})
``
``
106
`+
}
`
``
107
`+
}
`
``
108
+
``
109
`+
async list (results = {}) {
`
65
110
`const pj = resolve(this.npm.prefix, 'package.json')
`
66
111
``
67
112
`const pkg = await readFile(pj, 'utf8')
`
`@@ -80,5 +125,22 @@ class Version extends BaseCommand {
`
80
125
`else
`
81
126
`this.npm.output(results)
`
82
127
`}
`
``
128
+
``
129
`+
async listWorkspaces (filters) {
`
``
130
`+
const results = {}
`
``
131
`+
const workspaces =
`
``
132
`+
await getWorkspaces(filters, { path: this.npm.localPrefix })
`
``
133
`+
for (const [, path] of workspaces) {
`
``
134
`+
const pj = resolve(path, 'package.json')
`
``
135
`+
// getWorkspaces has already parsed this so we know it won't error
`
``
136
`+
const pkg = await readFile(pj, 'utf8')
`
``
137
`+
.then(data => JSON.parse(data))
`
``
138
+
``
139
`+
if (pkg.name && pkg.version)
`
``
140
`+
results[pkg.name] = pkg.version
`
``
141
`+
}
`
``
142
`+
return this.list(results)
`
``
143
`+
}
`
83
144
`}
`
``
145
+
84
146
`module.exports = Version
`