version.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. const libnpmversion = require('libnpmversion')
  2. const { resolve } = require('path')
  3. const { promisify } = require('util')
  4. const readFile = promisify(require('fs').readFile)
  5. const BaseCommand = require('./base-command.js')
  6. class Version extends BaseCommand {
  7. static get description () {
  8. return 'Bump a package version'
  9. }
  10. /* istanbul ignore next - see test/lib/load-all-commands.js */
  11. static get name () {
  12. return 'version'
  13. }
  14. /* istanbul ignore next - see test/lib/load-all-commands.js */
  15. static get params () {
  16. return [
  17. 'allow-same-version',
  18. 'commit-hooks',
  19. 'git-tag-version',
  20. 'json',
  21. 'preid',
  22. 'sign-git-tag',
  23. 'workspace',
  24. 'workspaces',
  25. 'include-workspace-root',
  26. ]
  27. }
  28. /* istanbul ignore next - see test/lib/load-all-commands.js */
  29. static get usage () {
  30. return ['[<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]']
  31. }
  32. async completion (opts) {
  33. const { conf: { argv: { remain } } } = opts
  34. if (remain.length > 2)
  35. return []
  36. return [
  37. 'major',
  38. 'minor',
  39. 'patch',
  40. 'premajor',
  41. 'preminor',
  42. 'prepatch',
  43. 'prerelease',
  44. 'from-git',
  45. ]
  46. }
  47. exec (args, cb) {
  48. return this.version(args).then(() => cb()).catch(cb)
  49. }
  50. execWorkspaces (args, filters, cb) {
  51. this.versionWorkspaces(args, filters).then(() => cb()).catch(cb)
  52. }
  53. async version (args) {
  54. switch (args.length) {
  55. case 0:
  56. return this.list()
  57. case 1:
  58. return this.change(args)
  59. default:
  60. throw this.usage
  61. }
  62. }
  63. async versionWorkspaces (args, filters) {
  64. switch (args.length) {
  65. case 0:
  66. return this.listWorkspaces(filters)
  67. case 1:
  68. return this.changeWorkspaces(args, filters)
  69. default:
  70. throw this.usage
  71. }
  72. }
  73. async change (args) {
  74. const prefix = this.npm.config.get('tag-version-prefix')
  75. const version = await libnpmversion(args[0], {
  76. ...this.npm.flatOptions,
  77. path: this.npm.prefix,
  78. })
  79. return this.npm.output(`${prefix}${version}`)
  80. }
  81. async changeWorkspaces (args, filters) {
  82. const prefix = this.npm.config.get('tag-version-prefix')
  83. await this.setWorkspaces(filters)
  84. for (const [name, path] of this.workspaces) {
  85. this.npm.output(name)
  86. const version = await libnpmversion(args[0], {
  87. ...this.npm.flatOptions,
  88. 'git-tag-version': false,
  89. path,
  90. })
  91. this.npm.output(`${prefix}${version}`)
  92. }
  93. }
  94. async list (results = {}) {
  95. const pj = resolve(this.npm.prefix, 'package.json')
  96. const pkg = await readFile(pj, 'utf8')
  97. .then(data => JSON.parse(data))
  98. .catch(() => ({}))
  99. if (pkg.name && pkg.version)
  100. results[pkg.name] = pkg.version
  101. results.npm = this.npm.version
  102. for (const [key, version] of Object.entries(process.versions))
  103. results[key] = version
  104. if (this.npm.config.get('json'))
  105. this.npm.output(JSON.stringify(results, null, 2))
  106. else
  107. this.npm.output(results)
  108. }
  109. async listWorkspaces (filters) {
  110. const results = {}
  111. await this.setWorkspaces(filters)
  112. for (const path of this.workspacePaths) {
  113. const pj = resolve(path, 'package.json')
  114. // setWorkspaces has already parsed package.json so we know it won't error
  115. const pkg = await readFile(pj, 'utf8')
  116. .then(data => JSON.parse(data))
  117. if (pkg.name && pkg.version)
  118. results[pkg.name] = pkg.version
  119. }
  120. return this.list(results)
  121. }
  122. }
  123. module.exports = Version