forked from kulshekhar/ts-jest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
version-checkers.ts
95 lines (85 loc) · 2.49 KB
/
version-checkers.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { Range, satisfies } from 'semver'
import { getPackageVersion } from './get-package-version'
import { rootLogger } from './logger'
import { Errors, interpolate } from './messages'
const logger = rootLogger.child({ namespace: 'versions' })
/**
* @internal
*/
export const enum ExpectedVersions {
Jest = '>=26 <27',
TypeScript = '>=3.8 <4',
BabelJest = '>=26 <27',
BabelCore = '>=7.0.0-beta.0 <8',
}
/**
* @internal
*/
export interface VersionChecker {
raise: () => boolean | never
warn: () => boolean
forget: () => void
}
/**
* @internal
*/
export const VersionCheckers = {
jest: createVersionChecker('jest', ExpectedVersions.Jest),
typescript: createVersionChecker('typescript', ExpectedVersions.TypeScript),
babelJest: createVersionChecker('babel-jest', ExpectedVersions.BabelJest),
babelCore: createVersionChecker('@babel/core', ExpectedVersions.BabelCore),
}
type CheckVersionAction = 'warn' | 'throw'
/**
* @internal
*/
function checkVersion(name: string, expectedRange: string, action?: Exclude<CheckVersionAction, 'throw'>): boolean
function checkVersion(name: string, expectedRange: string, action: 'throw'): true | never
function checkVersion(
name: string,
expectedRange: string,
action: CheckVersionAction | undefined = 'warn',
): boolean | never {
const version = getPackageVersion(name)
const success = !!version && satisfies(version, expectedRange)
logger.debug(
{
actualVersion: version,
expectedVersion: expectedRange,
},
'checking version of %s: %s',
name,
success ? 'OK' : 'NOT OK',
)
if (!action || success) return success
const message = interpolate(version ? Errors.UntestedDependencyVersion : Errors.MissingDependency, {
module: name,
actualVersion: version || '??',
expectedVersion: rangeToHumanString(expectedRange),
})
if (action === 'warn') {
logger.warn(message)
} else if (action === 'throw') {
logger.fatal(message)
throw new RangeError(message)
}
return success
}
function rangeToHumanString(versionRange: string): string {
return new Range(versionRange).toString()
}
function createVersionChecker(moduleName: string, expectedVersion: string): VersionChecker {
let memo: boolean | undefined
const warn = () => {
if (memo !== undefined) return memo
return (memo = checkVersion(moduleName, expectedVersion, 'warn'))
}
const raise = () => checkVersion(moduleName, expectedVersion, 'throw')
return {
raise,
warn,
forget() {
memo = undefined
},
}
}