/
packageExtensions.ts
131 lines (117 loc) · 3.8 KB
/
packageExtensions.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import PnpmError from '@pnpm/error'
import { prepareEmpty } from '@pnpm/prepare'
import { addDependenciesToPackage, mutateModules } from '@pnpm/core'
import { createObjectChecksum } from '../../lib/install/index'
import {
testDefaults,
} from '../utils'
test('manifests are extended with fields specified by packageExtensions', async () => {
const project = prepareEmpty()
const packageExtensions = {
'is-positive': {
dependencies: {
bar: '100.1.0',
},
},
}
const manifest = await addDependenciesToPackage(
{},
['is-positive@1.0.0'],
await testDefaults({ packageExtensions })
)
{
const lockfile = await project.readLockfile()
expect(lockfile.packages['/is-positive/1.0.0'].dependencies?.['bar']).toBe('100.1.0')
expect(lockfile.packageExtensionsChecksum).toStrictEqual(createObjectChecksum({
'is-positive': {
dependencies: {
bar: '100.1.0',
},
},
}))
const currentLockfile = await project.readCurrentLockfile()
expect(lockfile.packageExtensionsChecksum).toStrictEqual(currentLockfile.packageExtensionsChecksum)
}
// The lockfile is updated if the overrides are changed
packageExtensions['is-positive'].dependencies!['foobar'] = '100.0.0'
await mutateModules([
{
buildIndex: 0,
manifest,
mutation: 'install',
rootDir: process.cwd(),
},
], await testDefaults({ packageExtensions }))
{
const lockfile = await project.readLockfile()
expect(lockfile.packages['/is-positive/1.0.0'].dependencies?.['foobar']).toBe('100.0.0')
expect(lockfile.packageExtensionsChecksum).toStrictEqual(createObjectChecksum({
'is-positive': {
dependencies: {
bar: '100.1.0',
foobar: '100.0.0',
},
},
}))
const currentLockfile = await project.readCurrentLockfile()
expect(lockfile.packageExtensionsChecksum).toStrictEqual(currentLockfile.packageExtensionsChecksum)
}
await mutateModules([
{
buildIndex: 0,
manifest,
mutation: 'install',
rootDir: process.cwd(),
},
], await testDefaults({ frozenLockfile: true, packageExtensions }))
{
const lockfile = await project.readLockfile()
expect(lockfile.packageExtensionsChecksum).toStrictEqual(createObjectChecksum({
'is-positive': {
dependencies: {
bar: '100.1.0',
foobar: '100.0.0',
},
},
}))
const currentLockfile = await project.readCurrentLockfile()
expect(lockfile.packageExtensionsChecksum).toStrictEqual(currentLockfile.packageExtensionsChecksum)
}
packageExtensions['is-positive'].dependencies!['bar'] = '100.0.1'
await expect(
mutateModules([
{
buildIndex: 0,
manifest,
mutation: 'install',
rootDir: process.cwd(),
},
], await testDefaults({ frozenLockfile: true, packageExtensions }))
).rejects.toThrow(
new PnpmError('FROZEN_LOCKFILE_WITH_OUTDATED_LOCKFILE',
'Cannot perform a frozen installation because the lockfile needs updates'
)
)
})
test('manifests are patched by extensions from the compatibility database', async () => {
const project = prepareEmpty()
await addDependenciesToPackage(
{},
['debug@4.0.0'],
await testDefaults()
)
const lockfile = await project.readLockfile()
expect(lockfile.packages['/debug/4.0.0'].peerDependenciesMeta?.['supports-color']?.optional).toBe(true)
})
test('manifests are not patched by extensions from the compatibility database when ignoreCompatibilityDb is true', async () => {
const project = prepareEmpty()
await addDependenciesToPackage(
{},
['debug@4.0.0'],
await testDefaults({
ignoreCompatibilityDb: true,
})
)
const lockfile = await project.readLockfile()
expect(lockfile.packages['/debug/4.0.0'].peerDependenciesMeta).toBeUndefined()
})