• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

uscreen / versionize / 22843706994

09 Mar 2026 07:56AM UTC coverage: 99.725% (+0.008%) from 99.717%
22843706994

push

github

mrtusc
v0.9.0

76 of 76 branches covered (100.0%)

Branch coverage included in aggregate %.

287 of 288 relevant lines covered (99.65%)

112.09 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.55
/src/utils.js
1
import { execSync } from 'node:child_process'
111✔
2
import fs from 'node:fs'
111✔
3
import path from 'node:path'
111✔
4
import process from 'node:process'
111✔
5
import chalk from 'chalk'
111✔
6
import { packageDirectorySync } from 'package-directory'
111✔
7
import semver from 'semver'
111✔
8

111✔
9
export const releaseTypes = ['major', 'minor', 'stable', 'patch', 'hotfix', 'latest']
111✔
10

111✔
11
export const info = (message) => {
111✔
12
  console.log(`${chalk.blue('info')} ${message}`)
123✔
13
}
123✔
14

111✔
15
export const warn = (message) => {
111✔
16
  console.error(`${chalk.yellow('warning')} ${message}`)
6✔
17
}
6✔
18

111✔
19
export const error = (e) => {
111✔
20
  console.error(`${chalk.red('error')} ${e.message}`)
9✔
21
  process.exit(e.code || 1)
9✔
22
}
9✔
23

111✔
24
export const readFromPackageFile = (src) => {
111✔
25
  if (!fs.existsSync(src)) {
372✔
26
    return null
6✔
27
  }
6✔
28

366✔
29
  const content = fs.readFileSync(src, { encoding: 'utf-8' })
366✔
30
  return JSON.parse(content)
366✔
31
}
372✔
32

111✔
33
export const writeToPackageFile = (src, data) => {
111✔
34
  const content = `${JSON.stringify(data, null, 2)}\n`
297✔
35

297✔
36
  fs.writeFileSync(src, content, { encoding: 'utf-8' })
297✔
37
}
297✔
38

111✔
39
export const sanitizeVersions = (versions) => {
111✔
40
  if (!versions.pkg) {
399✔
41
    throw new Error('Could not read version from package.json')
24✔
42
  }
24✔
43

375✔
44
  if (!semver.valid(versions.pkg)) {
399✔
45
    throw new Error('Version in package.json invalid')
9✔
46
  }
9✔
47

366✔
48
  if (!versions.mft) {
399✔
49
    versions.mft = versions.pkg
30✔
50
  }
30✔
51

366✔
52
  if (!semver.valid(versions.mft)) {
399✔
53
    throw new Error('Version in manifest.json invalid')
9✔
54
  }
9✔
55

357✔
56
  if (versions.mft === versions.pkg) {
399✔
57
    return
84✔
58
  }
84✔
59

273✔
60
  if (
273✔
61
    semver.lt(versions.pkg, versions.mft)
273✔
62
    && semver.lt(versions.mft, semver.inc(versions.pkg, 'minor'))
381✔
63
  ) {
399✔
64
    return
240✔
65
  }
240✔
66

33✔
67
  throw new Error('Versions in package.json and manifest.json are inconsistent')
33✔
68
}
399✔
69

111✔
70
export const incrementVersions = (versions, releaseType) => {
111✔
71
  if (releaseType === 'major') {
309✔
72
    const result = semver.inc(versions.pkg, 'major')
48✔
73
    return { pkg: result, mft: result }
48✔
74
  }
48✔
75
  if (releaseType === 'stable' || releaseType === 'minor') {
309✔
76
    const result = semver.inc(versions.pkg, 'minor')
105✔
77
    return { pkg: result, mft: result }
105✔
78
  }
105✔
79
  if (releaseType === 'hotfix' || releaseType === 'patch') {
309✔
80
    const result = semver.inc(versions.pkg, 'patch')
96✔
81
    return { pkg: result, mft: result }
96✔
82
  }
96✔
83
  if (releaseType === 'latest') {
60✔
84
    const release = semver.prerelease(versions.mft) ? 'prerelease' : 'preminor'
60✔
85

60✔
86
    const result = semver.inc(versions.mft, release)
60✔
87
    return { pkg: versions.pkg, mft: result }
60✔
88
  }
60✔
89
  /* c8 ignore next */
3✔
90
  throw new Error('Invalid release type') // this should never happen
3✔
91
}
309✔
92

111✔
93
const readPackagesAndVersions = ({ cwd } = {}) => {
111✔
94
  const dir = packageDirectorySync({ cwd })
192✔
95
  if (!dir) {
192✔
96
    throw new Error('Not in package directory')
6✔
97
  }
6✔
98

186✔
99
  const paths = {
186✔
100
    pkg: path.join(dir, 'package.json'),
186✔
101
    mft: path.join(dir, 'manifest.json')
186✔
102
  }
186✔
103

186✔
104
  const data = {
186✔
105
    pkg: readFromPackageFile(paths.pkg),
186✔
106
    mft: readFromPackageFile(paths.mft) || {}
192✔
107
  }
192✔
108
  /* c8 ignore next */
3✔
109
  if (!data.pkg) {
3✔
110
    throw new Error('package.json not found')
×
111
  } // this should never happen
192✔
112

186✔
113
  const versions = {
186✔
114
    pkg: data.pkg.version,
186✔
115
    mft: data.mft.version
186✔
116
  }
186✔
117

186✔
118
  sanitizeVersions(versions)
186✔
119

186✔
120
  return { versions, paths, data }
186✔
121
}
192✔
122

111✔
123
const writePackagesAndVersions = ({ versions, paths, data }) => {
111✔
124
  data.pkg.version = versions.pkg
147✔
125
  data.mft.version = versions.mft
147✔
126

147✔
127
  writeToPackageFile(paths.pkg, data.pkg)
147✔
128
  writeToPackageFile(paths.mft, data.mft)
147✔
129
}
147✔
130

111✔
131
const execGit = (args = [], { cwd }) => {
111✔
132
  try {
192✔
133
    execSync(`git ${args.join(' ')}`, { stdio: 'ignore', cwd })
192✔
134
  }
192✔
135
  catch {
192✔
136
    throw new Error('Git execution failed')
12✔
137
  }
12✔
138
}
192✔
139

111✔
140
export const execCommit = (version, files, { cwd } = {}) => {
111✔
141
  const tag = `v${version}`
42✔
142
  execGit(['add', ...files], { cwd })
42✔
143
  execGit(['commit', '-m', tag], { cwd })
42✔
144
}
42✔
145

111✔
146
export const execCommitAndTag = (version, files, { cwd } = {}) => {
111✔
147
  const tag = `v${version}`
42✔
148
  execGit(['add', ...files], { cwd })
42✔
149
  execGit(['commit', '-m', tag], { cwd })
42✔
150
  execGit(['tag', tag, 'HEAD'], { cwd })
42✔
151
}
42✔
152

111✔
153
export const bumpVersion = (releaseType, { cwd } = {}) => {
111✔
154
  const { versions, paths, data } = readPackagesAndVersions({ cwd })
171✔
155

171✔
156
  const newVersions = incrementVersions(versions, releaseType)
171✔
157
  writePackagesAndVersions({ versions: newVersions, paths, data })
171✔
158

171✔
159
  return {
171✔
160
    currentVersion: versions.mft,
171✔
161
    newVersion: newVersions.mft,
171✔
162
    files: Object.values(paths)
171✔
163
  }
171✔
164
}
171✔
165

111✔
166
export const getCurrentVersion = ({ cwd } = {}) => {
111✔
167
  const { versions } = readPackagesAndVersions({ cwd })
21✔
168

21✔
169
  return versions.mft
21✔
170
}
21✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc