Skip to content

Commit

Permalink
feat: more sensible counter and version color (#86)
Browse files Browse the repository at this point in the history
Co-authored-by: Anthony Fu <[email protected]>
  • Loading branch information
a1mersnow and antfu committed Nov 23, 2023
1 parent bd79f3f commit 483ac6f
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 20 deletions.
4 changes: 3 additions & 1 deletion src/commands/check/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import c from 'picocolors'
import semver from 'semver'
import type {
CheckOptions,
DiffType,
InteractiveContext,
PackageMeta,
ResolvedDepChange,
Expand All @@ -10,6 +11,7 @@ import { DependenciesTypeShortMap } from '../../types'
import { sortDepChanges } from '../../utils/sort'
import { timeDifference } from '../../utils/time'
import { FIG_CHECK, FIG_NO_POINTER, FIG_POINTER, FIG_UNCHECK, colorizeVersionDiff, formatTable } from '../../render'
import { DiffColorMap } from '../../utils/diff'

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

Expand Down
28 changes: 26 additions & 2 deletions src/io/resolves.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import pacote from 'pacote'
import semver from 'semver'
import _debug from 'debug'
import { getNpmConfig } from '../utils/npm'
import type { CheckOptions, DependencyFilter, DependencyResolvedCallback, PackageData, PackageMeta, RangeMode, RawDep, ResolvedDepChange } from '../types'
import type { CheckOptions, DependencyFilter, DependencyResolvedCallback, DiffType, PackageData, PackageMeta, RangeMode, RawDep, ResolvedDepChange } from '../types'
import { diffSorter } from '../filters/diff-sorter'
import { getMaxSatisfying, getPrefixedVersion } from '../utils/versions'
import { getPackageMode } from '../utils/config'
Expand Down Expand Up @@ -136,7 +136,7 @@ export function updateTargetVersion(
const target = semver.minVersion(dep.targetVersion)!

dep.currentVersionTime = dep.pkgData.time?.[current.toString()]
dep.diff = semver.diff(current, target)
dep.diff = getDiff(current, target)
dep.update = dep.diff !== null && semver.lt(current, target)
}
catch (e) {
Expand All @@ -148,6 +148,30 @@ export function updateTargetVersion(
}
}

export function getDiff(current: semver.SemVer, target: semver.SemVer): DiffType {
if (semver.eq(current, target))
return null

const tilde = semver.satisfies(target, `~${current}`, { includePrerelease: true })
const caret = semver.satisfies(target, `^${current}`, { includePrerelease: true })
const gte = semver.satisfies(target, `>=${current}`, { includePrerelease: true })

if (tilde) {
if (caret)
return 'patch'
else
return 'major'
}
else if (caret) {
return 'minor'
}
else if (gte) {
return 'major'
}

return 'error'
}

export async function resolveDependency(
raw: RawDep,
options: CheckOptions,
Expand Down
13 changes: 5 additions & 8 deletions src/render.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import c from 'picocolors'
import { SemVer } from 'semver'
import { getDiff } from './io/resolves'
import { DiffColorMap } from './utils/diff'

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

// major = red (or any change before 1.0.0)
// minor = cyan
// patch = green
const color = (i === 0 || partsToColor[0] === '0')
? 'red'
: i === 1
? 'cyan'
: 'green'
const diffType = getDiff(new SemVer(from), new SemVer(to))
const color = DiffColorMap[diffType || 'patch']

// if we are colorizing only part of the word, add a dot in the middle
const middot = (i > 0 && i < partsToColor.length) ? '.' : ''
Expand Down
3 changes: 1 addition & 2 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import type { Packument } from 'pacote'
import type semver from 'semver'
import type { SortOption } from './utils/sort'

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

export type DiffType = ReturnType<typeof semver['diff']> | 'error'
export type DiffType = 'major' | 'minor' | 'patch' | 'error' | null

export interface PackageData {
tags: Record<string, string>
Expand Down
17 changes: 10 additions & 7 deletions src/utils/diff.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
export const DiffMap = {
'error': -1,
'major': 0,
'premajor': 1,
'minor': 2,
'preminor': 3,
'patch': 4,
'prepatch': 5,
'prerelease': 6,
'': 7,
'minor': 1,
'patch': 2,
'': 3,
}

export const DiffColorMap = {
major: 'red',
minor: 'cyan',
patch: 'green',
error: 'red',
} as const
25 changes: 25 additions & 0 deletions test/resolves.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import process from 'node:process'
import { expect, it } from 'vitest'
import { SemVer } from 'semver'
import type { CheckOptions, DependencyFilter, RawDep } from '../src'
import { resolveDependency } from '../src'
import { getDiff } from '../src/io/resolves'

const filter: DependencyFilter = () => true

Expand Down Expand Up @@ -103,3 +105,26 @@ it('resolveDependency', async () => {
const target = await resolveDependency(makeLocalPkg('1.0.0'), options, filter)
expect(target.resolveError).not.toBeNull()
}, 10000)

it('getDiff', () => {
// normal
expect(getDiff(new SemVer('1.2.3'), new SemVer('1.2.3'))).toBe(null)
expect(getDiff(new SemVer('1.2.3'), new SemVer('1.2.4'))).toBe('patch')
expect(getDiff(new SemVer('1.2.3'), new SemVer('1.3.3'))).toBe('minor')
expect(getDiff(new SemVer('1.2.3'), new SemVer('2.2.3'))).toBe('major')

// 0.x
expect(getDiff(new SemVer('0.1.2'), new SemVer('0.1.3'))).toBe('patch')
expect(getDiff(new SemVer('0.1.2'), new SemVer('0.2.2'))).toBe('major')
expect(getDiff(new SemVer('0.0.3'), new SemVer('0.0.4'))).toBe('major')

// pre
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.2.3'))).toBe('patch')
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.2.4'))).toBe('patch')
expect(getDiff(new SemVer('1.2.2'), new SemVer('1.2.3-a'))).toBe('patch')
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.2.3-b'))).toBe('patch')
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.2.4-b'))).toBe('patch')
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('1.3.3-a'))).toBe('minor')
expect(getDiff(new SemVer('1.2.3-a'), new SemVer('2.2.3-a'))).toBe('major')
expect(getDiff(new SemVer('2.0.0-a'), new SemVer('2.0.0'))).toBe('patch')
})

0 comments on commit 483ac6f

Please sign in to comment.