/
getPeerDependencyIssues.ts
85 lines (81 loc) · 2.97 KB
/
getPeerDependencyIssues.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
import resolveDependencies from '@pnpm/v6.resolve-dependencies'
import getWantedDependencies from '@pnpm/v6.resolve-dependencies/lib/getWantedDependencies'
import { PeerDependencyIssuesByProjects } from '@pnpm/types'
import getContext, { GetContextOptions, ProjectOptions } from '@pnpm/get-context'
import { createReadPackageHook } from './install'
import { getPreferredVersionsFromLockfile } from './install/getPreferredVersions'
import { InstallOptions } from './install/extendInstallOptions'
import { DEFAULT_REGISTRIES } from '@pnpm/normalize-registries'
export type ListMissingPeersOptions = Partial<GetContextOptions>
& Pick<InstallOptions, 'hooks'
| 'ignoreCompatibilityDb'
| 'linkWorkspacePackagesDepth'
| 'nodeVersion'
| 'overrides'
| 'packageExtensions'
| 'preferWorkspacePackages'
| 'saveWorkspaceProtocol'
| 'storeController'
| 'workspacePackages'
>
& Pick<GetContextOptions, 'storeDir'>
export async function getPeerDependencyIssues (
projects: ProjectOptions[],
opts: ListMissingPeersOptions
): Promise<PeerDependencyIssuesByProjects> {
const lockfileDir = opts.lockfileDir ?? process.cwd()
const ctx = await getContext(projects, {
force: false,
forceSharedLockfile: false,
extraBinPaths: [],
lockfileDir,
registries: DEFAULT_REGISTRIES,
useLockfile: true,
...opts,
})
const projectsToResolve = ctx.projects.map((project) => ({
...project,
updatePackageManifest: false,
wantedDependencies: getWantedDependencies(project.manifest),
}))
const preferredVersions = ctx.wantedLockfile.packages ? getPreferredVersionsFromLockfile(ctx.wantedLockfile.packages) : undefined
const {
peerDependencyIssuesByProjects,
waitTillAllFetchingsFinish,
} = await resolveDependencies(
projectsToResolve,
{
currentLockfile: ctx.currentLockfile,
defaultUpdateDepth: -1,
dryRun: true,
engineStrict: false,
force: false,
forceFullResolution: true,
hooks: {
readPackage: createReadPackageHook({
ignoreCompatibilityDb: opts.ignoreCompatibilityDb,
lockfileDir,
overrides: opts.overrides,
packageExtensions: opts.packageExtensions,
readPackageHook: opts.hooks?.readPackage,
}),
},
linkWorkspacePackagesDepth: opts.linkWorkspacePackagesDepth ?? (opts.saveWorkspaceProtocol ? 0 : -1),
lockfileDir,
nodeVersion: opts.nodeVersion ?? process.version,
pnpmVersion: '',
preferWorkspacePackages: opts.preferWorkspacePackages,
preferredVersions,
preserveWorkspaceProtocol: false,
registries: ctx.registries,
saveWorkspaceProtocol: false, // this doesn't matter in our case. We won't write changes to package.json files
storeController: opts.storeController,
tag: 'latest',
virtualStoreDir: ctx.virtualStoreDir,
wantedLockfile: ctx.wantedLockfile,
workspacePackages: opts.workspacePackages ?? {},
}
)
await waitTillAllFetchingsFinish()
return peerDependencyIssuesByProjects
}