Skip to content

Commit 8335c82

Browse files
committed
feat: more sensible counter and version color
close antfu-collective#54
1 parent bd79f3f commit 8335c82

File tree

6 files changed

+70
-20
lines changed

6 files changed

+70
-20
lines changed

src/commands/check/render.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { DependenciesTypeShortMap } from '../../types'
1010
import { sortDepChanges } from '../../utils/sort'
1111
import { timeDifference } from '../../utils/time'
1212
import { FIG_CHECK, FIG_NO_POINTER, FIG_POINTER, FIG_UNCHECK, colorizeVersionDiff, formatTable } from '../../render'
13+
import { DiffColorMap } from '../../utils/diff'
14+
import type { DiffType } from '../../../dist'
1315

1416
export function renderChange(change: ResolvedDepChange, interactive?: InteractiveContext) {
1517
const update = change.update && (!interactive || change.interactiveChecked)
@@ -73,7 +75,7 @@ export function renderChanges(
7375
})
7476
const diffEntries = Object.keys(diffCounts).length
7577
? Object.entries(diffCounts)
76-
.map(([key, value]) => `${c.yellow(value)} ${key}`)
78+
.map(([key, value]) => `${c[DiffColorMap[key as DiffType || 'patch']](value)} ${key}`)
7779
.join(', ')
7880
: c.dim('no change')
7981

src/io/resolves.ts

+26-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import pacote from 'pacote'
55
import semver from 'semver'
66
import _debug from 'debug'
77
import { getNpmConfig } from '../utils/npm'
8-
import type { CheckOptions, DependencyFilter, DependencyResolvedCallback, PackageData, PackageMeta, RangeMode, RawDep, ResolvedDepChange } from '../types'
8+
import type { CheckOptions, DependencyFilter, DependencyResolvedCallback, DiffType, PackageData, PackageMeta, RangeMode, RawDep, ResolvedDepChange } from '../types'
99
import { diffSorter } from '../filters/diff-sorter'
1010
import { getMaxSatisfying, getPrefixedVersion } from '../utils/versions'
1111
import { getPackageMode } from '../utils/config'
@@ -136,7 +136,7 @@ export function updateTargetVersion(
136136
const target = semver.minVersion(dep.targetVersion)!
137137

138138
dep.currentVersionTime = dep.pkgData.time?.[current.toString()]
139-
dep.diff = semver.diff(current, target)
139+
dep.diff = getDiff(current, target)
140140
dep.update = dep.diff !== null && semver.lt(current, target)
141141
}
142142
catch (e) {
@@ -148,6 +148,30 @@ export function updateTargetVersion(
148148
}
149149
}
150150

151+
export function getDiff(current: semver.SemVer, target: semver.SemVer): DiffType {
152+
if (semver.eq(current, target))
153+
return null
154+
155+
const tilde = semver.satisfies(target, `~${current}`, { includePrerelease: true })
156+
const caret = semver.satisfies(target, `^${current}`, { includePrerelease: true })
157+
const gte = semver.satisfies(target, `>=${current}`, { includePrerelease: true })
158+
159+
if (tilde) {
160+
if (caret)
161+
return 'patch'
162+
else
163+
return 'major'
164+
}
165+
else if (caret) {
166+
return 'minor'
167+
}
168+
else if (gte) {
169+
return 'major'
170+
}
171+
172+
return 'error'
173+
}
174+
151175
export async function resolveDependency(
152176
raw: RawDep,
153177
options: CheckOptions,

src/render.ts

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import c from 'picocolors'
2+
import { SemVer } from 'semver'
3+
import { getDiff } from './io/resolves'
4+
import { DiffColorMap } from './utils/diff'
25

36
export const FIG_CHECK = c.green('◉')
47
export const FIG_UNCHECK = c.gray('◌')
@@ -92,14 +95,8 @@ export function colorizeVersionDiff(from: string, to: string, hightlightRange =
9295
let i = partsToColor.findIndex((part, i) => part !== partsToCompare[i])
9396
i = i >= 0 ? i : partsToColor.length
9497

95-
// major = red (or any change before 1.0.0)
96-
// minor = cyan
97-
// patch = green
98-
const color = (i === 0 || partsToColor[0] === '0')
99-
? 'red'
100-
: i === 1
101-
? 'cyan'
102-
: 'green'
98+
const diffType = getDiff(new SemVer(from), new SemVer(to))
99+
const color = DiffColorMap[diffType || 'patch']
103100

104101
// if we are colorizing only part of the word, add a dot in the middle
105102
const middot = (i > 0 && i < partsToColor.length) ? '.' : ''

src/types.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { Packument } from 'pacote'
2-
import type semver from 'semver'
32
import type { SortOption } from './utils/sort'
43

54
export type RangeMode = 'default' | 'major' | 'minor' | 'patch' | 'latest' | 'newest'
@@ -20,7 +19,7 @@ export interface RawDep {
2019
update: boolean
2120
}
2221

23-
export type DiffType = ReturnType<typeof semver['diff']> | 'error'
22+
export type DiffType = 'major' | 'minor' | 'patch' | 'error' | null
2423

2524
export interface PackageData {
2625
tags: Record<string, string>

src/utils/diff.ts

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
export const DiffMap = {
22
'error': -1,
33
'major': 0,
4-
'premajor': 1,
5-
'minor': 2,
6-
'preminor': 3,
7-
'patch': 4,
8-
'prepatch': 5,
9-
'prerelease': 6,
10-
'': 7,
4+
'minor': 1,
5+
'patch': 2,
6+
'': 3,
117
}
8+
9+
export const DiffColorMap = {
10+
major: 'red',
11+
minor: 'cyan',
12+
patch: 'green',
13+
error: 'red',
14+
} as const

test/resolves.test.ts

+25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import process from 'node:process'
22
import { expect, it } from 'vitest'
3+
import { SemVer } from 'semver'
34
import type { CheckOptions, DependencyFilter, RawDep } from '../src'
45
import { resolveDependency } from '../src'
6+
import { getDiff } from '../src/io/resolves'
57

68
const filter: DependencyFilter = () => true
79

@@ -103,3 +105,26 @@ it('resolveDependency', async () => {
103105
const target = await resolveDependency(makeLocalPkg('1.0.0'), options, filter)
104106
expect(target.resolveError).not.toBeNull()
105107
}, 10000)
108+
109+
it('getDiff', () => {
110+
// normal
111+
expect(getDiff(new SemVer('1.2.3'), new SemVer('1.2.3'))).toBe(null)
112+
expect(getDiff(new SemVer('1.2.3'), new SemVer('1.2.4'))).toBe('patch')
113+
expect(getDiff(new SemVer('1.2.3'), new SemVer('1.3.3'))).toBe('minor')
114+
expect(getDiff(new SemVer('1.2.3'), new SemVer('2.2.3'))).toBe('major')
115+
116+
// 0.x
117+
expect(getDiff(new SemVer('0.1.2'), new SemVer('0.1.3'))).toBe('patch')
118+
expect(getDiff(new SemVer('0.1.2'), new SemVer('0.2.2'))).toBe('major')
119+
expect(getDiff(new SemVer('0.0.3'), new SemVer('0.0.4'))).toBe('major')
120+
121+
// pre
122+
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.2.3'))).toBe('patch')
123+
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.2.4'))).toBe('patch')
124+
expect(getDiff(new SemVer('1.2.2'), new SemVer('1.2.3-a'))).toBe('patch')
125+
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.2.3-b'))).toBe('patch')
126+
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.2.4-b'))).toBe('patch')
127+
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.3.3-a'))).toBe('minor')
128+
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('2.2.3-a'))).toBe('major')
129+
expect(getDiff(new SemVer('2.0.0-a'), new SemVer('2.0.0'))).toBe('patch')
130+
})

0 commit comments

Comments
 (0)