-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathLockfileResolver.ts
76 lines (59 loc) Β· 2.9 KB
/
LockfileResolver.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
import {Resolver, ResolveOptions, MinimalResolveOptions} from './Resolver';
import * as structUtils from './structUtils';
import {Descriptor, Locator, Package} from './types';
export class LockfileResolver implements Resolver {
private readonly resolver: Resolver;
constructor(resolver: Resolver) {
this.resolver = resolver;
}
supportsDescriptor(descriptor: Descriptor, opts: MinimalResolveOptions) {
const resolution = opts.project.storedResolutions.get(descriptor.descriptorHash);
if (resolution)
return true;
// If the descriptor matches a package that's already been used, we can just use it even if we never resolved the range before
// Ex: foo depends on bar@^1.0.0 that we resolved to [email protected], then we add a package qux that depends on [email protected] (without the caret)
if (opts.project.originalPackages.has(structUtils.convertDescriptorToLocator(descriptor).locatorHash))
return true;
return false;
}
supportsLocator(locator: Locator, opts: MinimalResolveOptions) {
if (opts.project.originalPackages.has(locator.locatorHash) && !opts.project.lockfileNeedsRefresh)
return true;
return false;
}
shouldPersistResolution(locator: Locator, opts: MinimalResolveOptions): boolean {
throw new Error(`The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes`);
}
bindDescriptor(descriptor: Descriptor, fromLocator: Locator, opts: MinimalResolveOptions) {
return descriptor;
}
getResolutionDependencies(descriptor: Descriptor, opts: MinimalResolveOptions) {
return this.resolver.getResolutionDependencies(descriptor, opts);
}
async getCandidates(descriptor: Descriptor, dependencies: unknown, opts: ResolveOptions) {
const resolution = opts.project.storedResolutions.get(descriptor.descriptorHash);
if (resolution) {
const resolvedPkg = opts.project.originalPackages.get(resolution);
if (resolvedPkg) {
return [resolvedPkg];
}
}
const originalPkg = opts.project.originalPackages.get(structUtils.convertDescriptorToLocator(descriptor).locatorHash);
if (originalPkg)
return [originalPkg];
throw new Error(`Resolution expected from the lockfile data`);
}
async getSatisfying(descriptor: Descriptor, dependencies: Record<string, Package>, locators: Array<Locator>, opts: ResolveOptions) {
const [locator] = await this.getCandidates(descriptor, dependencies, opts);
return {
locators: locators.filter(candidate => candidate.locatorHash === locator.locatorHash),
sorted: false,
};
}
async resolve(locator: Locator, opts: ResolveOptions) {
const pkg = opts.project.originalPackages.get(locator.locatorHash);
if (!pkg)
throw new Error(`The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache`);
return pkg;
}
}