@pnpm/lockfile.verification 1.0.7 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/allProjectsAreUpToDate.js +4 -115
- package/lib/allProjectsAreUpToDate.js.map +1 -1
- package/lib/getWorkspacePackagesByDirectory.d.ts +3 -0
- package/lib/getWorkspacePackagesByDirectory.js +15 -0
- package/lib/getWorkspacePackagesByDirectory.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/linkedPackagesAreUpToDate.d.ts +14 -0
- package/lib/linkedPackagesAreUpToDate.js +112 -0
- package/lib/linkedPackagesAreUpToDate.js.map +1 -0
- package/package.json +11 -11
|
@@ -4,17 +4,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.allProjectsAreUpToDate = allProjectsAreUpToDate;
|
|
7
|
-
const path_1 = __importDefault(require("path"));
|
|
8
7
|
const lockfile_utils_1 = require("@pnpm/lockfile.utils");
|
|
9
|
-
const read_package_json_1 = require("@pnpm/read-package-json");
|
|
10
|
-
const dependency_path_1 = require("@pnpm/dependency-path");
|
|
11
8
|
const types_1 = require("@pnpm/types");
|
|
12
9
|
const p_every_1 = __importDefault(require("p-every"));
|
|
13
10
|
const any_1 = __importDefault(require("ramda/src/any"));
|
|
14
11
|
const isEmpty_1 = __importDefault(require("ramda/src/isEmpty"));
|
|
15
|
-
const semver_1 = __importDefault(require("semver"));
|
|
16
|
-
const version_selector_type_1 = __importDefault(require("version-selector-type"));
|
|
17
12
|
const allCatalogsAreUpToDate_1 = require("./allCatalogsAreUpToDate");
|
|
13
|
+
const getWorkspacePackagesByDirectory_1 = require("./getWorkspacePackagesByDirectory");
|
|
14
|
+
const linkedPackagesAreUpToDate_1 = require("./linkedPackagesAreUpToDate");
|
|
18
15
|
const satisfiesPackageManifest_1 = require("./satisfiesPackageManifest");
|
|
19
16
|
async function allProjectsAreUpToDate(projects, opts) {
|
|
20
17
|
// Projects may declare dependencies using catalog protocol specifiers. If the
|
|
@@ -23,12 +20,12 @@ async function allProjectsAreUpToDate(projects, opts) {
|
|
|
23
20
|
if (!(0, allCatalogsAreUpToDate_1.allCatalogsAreUpToDate)(opts.catalogs, opts.wantedLockfile.catalogs)) {
|
|
24
21
|
return false;
|
|
25
22
|
}
|
|
26
|
-
const manifestsByDir = opts.workspacePackages ? getWorkspacePackagesByDirectory(opts.workspacePackages) : {};
|
|
23
|
+
const manifestsByDir = opts.workspacePackages ? (0, getWorkspacePackagesByDirectory_1.getWorkspacePackagesByDirectory)(opts.workspacePackages) : {};
|
|
27
24
|
const _satisfiesPackageManifest = satisfiesPackageManifest_1.satisfiesPackageManifest.bind(null, {
|
|
28
25
|
autoInstallPeers: opts.autoInstallPeers,
|
|
29
26
|
excludeLinksFromLockfile: opts.excludeLinksFromLockfile,
|
|
30
27
|
});
|
|
31
|
-
const _linkedPackagesAreUpToDate = linkedPackagesAreUpToDate.bind(null, {
|
|
28
|
+
const _linkedPackagesAreUpToDate = linkedPackagesAreUpToDate_1.linkedPackagesAreUpToDate.bind(null, {
|
|
32
29
|
linkWorkspacePackages: opts.linkWorkspacePackages,
|
|
33
30
|
manifestsByDir,
|
|
34
31
|
workspacePackages: opts.workspacePackages,
|
|
@@ -50,114 +47,6 @@ async function allProjectsAreUpToDate(projects, opts) {
|
|
|
50
47
|
});
|
|
51
48
|
});
|
|
52
49
|
}
|
|
53
|
-
function getWorkspacePackagesByDirectory(workspacePackages) {
|
|
54
|
-
const workspacePackagesByDirectory = {};
|
|
55
|
-
if (workspacePackages) {
|
|
56
|
-
for (const pkgVersions of workspacePackages.values()) {
|
|
57
|
-
for (const { rootDir, manifest } of pkgVersions.values()) {
|
|
58
|
-
workspacePackagesByDirectory[rootDir] = manifest;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return workspacePackagesByDirectory;
|
|
63
|
-
}
|
|
64
|
-
async function linkedPackagesAreUpToDate({ linkWorkspacePackages, manifestsByDir, workspacePackages, lockfilePackages, lockfileDir, }, project) {
|
|
65
|
-
return (0, p_every_1.default)(types_1.DEPENDENCIES_FIELDS, (depField) => {
|
|
66
|
-
const lockfileDeps = project.snapshot[depField];
|
|
67
|
-
const manifestDeps = project.manifest[depField];
|
|
68
|
-
if ((lockfileDeps == null) || (manifestDeps == null))
|
|
69
|
-
return true;
|
|
70
|
-
const depNames = Object.keys(lockfileDeps);
|
|
71
|
-
return (0, p_every_1.default)(depNames, async (depName) => {
|
|
72
|
-
const currentSpec = manifestDeps[depName];
|
|
73
|
-
if (!currentSpec)
|
|
74
|
-
return true;
|
|
75
|
-
const lockfileRef = lockfileDeps[depName];
|
|
76
|
-
if ((0, lockfile_utils_1.refIsLocalDirectory)(project.snapshot.specifiers[depName])) {
|
|
77
|
-
const depPath = (0, dependency_path_1.refToRelative)(lockfileRef, depName);
|
|
78
|
-
return depPath != null && isLocalFileDepUpdated(lockfileDir, lockfilePackages?.[depPath]);
|
|
79
|
-
}
|
|
80
|
-
const isLinked = lockfileRef.startsWith('link:');
|
|
81
|
-
if (isLinked &&
|
|
82
|
-
(currentSpec.startsWith('link:') ||
|
|
83
|
-
currentSpec.startsWith('file:') ||
|
|
84
|
-
currentSpec.startsWith('workspace:.'))) {
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
// https://github.com/pnpm/pnpm/issues/6592
|
|
88
|
-
// if the dependency is linked and the specified version type is tag, we consider it to be up-to-date to skip full resolution.
|
|
89
|
-
if (isLinked && (0, version_selector_type_1.default)(currentSpec)?.type === 'tag') {
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
const linkedDir = isLinked
|
|
93
|
-
? path_1.default.join(project.dir, lockfileRef.slice(5))
|
|
94
|
-
: workspacePackages?.get(depName)?.get(lockfileRef)?.rootDir;
|
|
95
|
-
if (!linkedDir)
|
|
96
|
-
return true;
|
|
97
|
-
if (!linkWorkspacePackages && !currentSpec.startsWith('workspace:')) {
|
|
98
|
-
// we found a linked dir, but we don't want to use it, because it's not specified as a
|
|
99
|
-
// workspace:x.x.x dependency
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
const linkedPkg = manifestsByDir[linkedDir] ?? await (0, read_package_json_1.safeReadPackageJsonFromDir)(linkedDir);
|
|
103
|
-
const availableRange = getVersionRange(currentSpec);
|
|
104
|
-
// This should pass the same options to semver as @pnpm/npm-resolver
|
|
105
|
-
const localPackageSatisfiesRange = availableRange === '*' || availableRange === '^' || availableRange === '~' ||
|
|
106
|
-
linkedPkg && semver_1.default.satisfies(linkedPkg.version, availableRange, { loose: true });
|
|
107
|
-
if (isLinked !== localPackageSatisfiesRange)
|
|
108
|
-
return false;
|
|
109
|
-
return true;
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
async function isLocalFileDepUpdated(lockfileDir, pkgSnapshot) {
|
|
114
|
-
if (!pkgSnapshot)
|
|
115
|
-
return false;
|
|
116
|
-
const localDepDir = path_1.default.join(lockfileDir, pkgSnapshot.resolution.directory);
|
|
117
|
-
const manifest = await (0, read_package_json_1.safeReadPackageJsonFromDir)(localDepDir);
|
|
118
|
-
if (!manifest)
|
|
119
|
-
return false;
|
|
120
|
-
for (const depField of types_1.DEPENDENCIES_OR_PEER_FIELDS) {
|
|
121
|
-
if (depField === 'devDependencies')
|
|
122
|
-
continue;
|
|
123
|
-
const manifestDeps = manifest[depField] ?? {};
|
|
124
|
-
const lockfileDeps = pkgSnapshot[depField] ?? {};
|
|
125
|
-
// Lock file has more dependencies than the current manifest, e.g. some dependencies are removed.
|
|
126
|
-
if (Object.keys(lockfileDeps).some(depName => !manifestDeps[depName])) {
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
for (const depName of Object.keys(manifestDeps)) {
|
|
130
|
-
// If a dependency does not exist in the lock file, e.g. a new dependency is added to the current manifest.
|
|
131
|
-
// We need to do full resolution again.
|
|
132
|
-
if (!lockfileDeps[depName]) {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
const currentSpec = manifestDeps[depName];
|
|
136
|
-
// We do not care about the link dependencies of local dependency.
|
|
137
|
-
if (currentSpec.startsWith('file:') || currentSpec.startsWith('link:') || currentSpec.startsWith('workspace:'))
|
|
138
|
-
continue;
|
|
139
|
-
if (semver_1.default.satisfies(lockfileDeps[depName], getVersionRange(currentSpec), { loose: true })) {
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
function getVersionRange(spec) {
|
|
150
|
-
if (spec.startsWith('workspace:'))
|
|
151
|
-
return spec.slice(10);
|
|
152
|
-
if (spec.startsWith('npm:')) {
|
|
153
|
-
spec = spec.slice(4);
|
|
154
|
-
const index = spec.indexOf('@', 1);
|
|
155
|
-
if (index === -1)
|
|
156
|
-
return '*';
|
|
157
|
-
return spec.slice(index + 1) || '*';
|
|
158
|
-
}
|
|
159
|
-
return spec;
|
|
160
|
-
}
|
|
161
50
|
function hasLocalTarballDepsInRoot(importer) {
|
|
162
51
|
return (0, any_1.default)(lockfile_utils_1.refIsLocalTarball, Object.values(importer.dependencies ?? {})) ||
|
|
163
52
|
(0, any_1.default)(lockfile_utils_1.refIsLocalTarball, Object.values(importer.devDependencies ?? {})) ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"allProjectsAreUpToDate.js","sourceRoot":"","sources":["../src/allProjectsAreUpToDate.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"allProjectsAreUpToDate.js","sourceRoot":"","sources":["../src/allProjectsAreUpToDate.ts"],"names":[],"mappings":";;;;;AAiBA,wDA6CC;AAxDD,yDAAwD;AAExD,uCAAiE;AACjE,sDAA4B;AAC5B,wDAA+B;AAC/B,gEAAuC;AACvC,qEAAiE;AACjE,uFAAmF;AACnF,2EAAuE;AACvE,yEAAqE;AAE9D,KAAK,UAAU,sBAAsB,CAC1C,QAAiF,EACjF,IAQC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,WAAW;IACX,IAAI,CAAC,IAAA,+CAAsB,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAA,iEAA+B,EAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5G,MAAM,yBAAyB,GAAG,mDAAwB,CAAC,IAAI,CAAC,IAAI,EAAE;QACpE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;KACxD,CAAC,CAAA;IACF,MAAM,0BAA0B,GAAG,qDAAyB,CAAC,IAAI,CAAC,IAAI,EAAE;QACtE,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,cAAc;QACd,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ;QAC9C,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAA;IACF,OAAO,IAAA,iBAAM,EAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC1D,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,2BAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,IAAA,iBAAO,EAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACxH,CAAC;QACD,OAAO,QAAQ,IAAI,IAAI;YACrB,CAAC,yBAAyB,CAAC,QAAQ,CAAC;YACpC,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,SAAS;YAC/D,0BAA0B,CAAC;gBACzB,GAAG,EAAE,OAAO,CAAC,OAAO;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAE,QAAyB;IAC3D,OAAO,IAAA,aAAG,EAAC,kCAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QACvE,IAAA,aAAG,EAAC,kCAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QACrE,IAAA,aAAG,EAAC,kCAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAA;AAC9E,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getWorkspacePackagesByDirectory = getWorkspacePackagesByDirectory;
|
|
4
|
+
function getWorkspacePackagesByDirectory(workspacePackages) {
|
|
5
|
+
const workspacePackagesByDirectory = {};
|
|
6
|
+
if (workspacePackages) {
|
|
7
|
+
for (const pkgVersions of workspacePackages.values()) {
|
|
8
|
+
for (const { rootDir, manifest } of pkgVersions.values()) {
|
|
9
|
+
workspacePackagesByDirectory[rootDir] = manifest;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return workspacePackagesByDirectory;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=getWorkspacePackagesByDirectory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getWorkspacePackagesByDirectory.js","sourceRoot":"","sources":["../src/getWorkspacePackagesByDirectory.ts"],"names":[],"mappings":";;AAGA,0EAUC;AAVD,SAAgB,+BAA+B,CAAE,iBAAoC;IACnF,MAAM,4BAA4B,GAAuC,EAAE,CAAA;IAC3E,IAAI,iBAAiB,EAAE,CAAC;QACtB,KAAK,MAAM,WAAW,IAAI,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC;YACrD,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzD,4BAA4B,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAA;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,4BAA4B,CAAA;AACrC,CAAC"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { allProjectsAreUpToDate } from './allProjectsAreUpToDate';
|
|
2
|
+
export { getWorkspacePackagesByDirectory } from './getWorkspacePackagesByDirectory';
|
|
3
|
+
export { linkedPackagesAreUpToDate } from './linkedPackagesAreUpToDate';
|
|
2
4
|
export { satisfiesPackageManifest } from './satisfiesPackageManifest';
|
package/lib/index.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.satisfiesPackageManifest = exports.allProjectsAreUpToDate = void 0;
|
|
3
|
+
exports.satisfiesPackageManifest = exports.linkedPackagesAreUpToDate = exports.getWorkspacePackagesByDirectory = exports.allProjectsAreUpToDate = void 0;
|
|
4
4
|
var allProjectsAreUpToDate_1 = require("./allProjectsAreUpToDate");
|
|
5
5
|
Object.defineProperty(exports, "allProjectsAreUpToDate", { enumerable: true, get: function () { return allProjectsAreUpToDate_1.allProjectsAreUpToDate; } });
|
|
6
|
+
var getWorkspacePackagesByDirectory_1 = require("./getWorkspacePackagesByDirectory");
|
|
7
|
+
Object.defineProperty(exports, "getWorkspacePackagesByDirectory", { enumerable: true, get: function () { return getWorkspacePackagesByDirectory_1.getWorkspacePackagesByDirectory; } });
|
|
8
|
+
var linkedPackagesAreUpToDate_1 = require("./linkedPackagesAreUpToDate");
|
|
9
|
+
Object.defineProperty(exports, "linkedPackagesAreUpToDate", { enumerable: true, get: function () { return linkedPackagesAreUpToDate_1.linkedPackagesAreUpToDate; } });
|
|
6
10
|
var satisfiesPackageManifest_1 = require("./satisfiesPackageManifest");
|
|
7
11
|
Object.defineProperty(exports, "satisfiesPackageManifest", { enumerable: true, get: function () { return satisfiesPackageManifest_1.satisfiesPackageManifest; } });
|
|
8
12
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mEAAiE;AAAxD,gIAAA,sBAAsB,OAAA;AAC/B,uEAAqE;AAA5D,oIAAA,wBAAwB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mEAAiE;AAAxD,gIAAA,sBAAsB,OAAA;AAC/B,qFAAmF;AAA1E,kJAAA,+BAA+B,OAAA;AACxC,yEAAuE;AAA9D,sIAAA,yBAAyB,OAAA;AAClC,uEAAqE;AAA5D,oIAAA,wBAAwB,OAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ProjectSnapshot, type PackageSnapshots } from '@pnpm/lockfile.types';
|
|
2
|
+
import { type WorkspacePackages } from '@pnpm/resolver-base';
|
|
3
|
+
import { type DependencyManifest, type ProjectManifest } from '@pnpm/types';
|
|
4
|
+
export declare function linkedPackagesAreUpToDate({ linkWorkspacePackages, manifestsByDir, workspacePackages, lockfilePackages, lockfileDir, }: {
|
|
5
|
+
linkWorkspacePackages: boolean;
|
|
6
|
+
manifestsByDir: Record<string, DependencyManifest>;
|
|
7
|
+
workspacePackages?: WorkspacePackages;
|
|
8
|
+
lockfilePackages?: PackageSnapshots;
|
|
9
|
+
lockfileDir: string;
|
|
10
|
+
}, project: {
|
|
11
|
+
dir: string;
|
|
12
|
+
manifest: ProjectManifest;
|
|
13
|
+
snapshot: ProjectSnapshot;
|
|
14
|
+
}): Promise<boolean>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.linkedPackagesAreUpToDate = linkedPackagesAreUpToDate;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const lockfile_utils_1 = require("@pnpm/lockfile.utils");
|
|
9
|
+
const read_package_json_1 = require("@pnpm/read-package-json");
|
|
10
|
+
const dependency_path_1 = require("@pnpm/dependency-path");
|
|
11
|
+
const types_1 = require("@pnpm/types");
|
|
12
|
+
const p_every_1 = __importDefault(require("p-every"));
|
|
13
|
+
const semver_1 = __importDefault(require("semver"));
|
|
14
|
+
const version_selector_type_1 = __importDefault(require("version-selector-type"));
|
|
15
|
+
async function linkedPackagesAreUpToDate({ linkWorkspacePackages, manifestsByDir, workspacePackages, lockfilePackages, lockfileDir, }, project) {
|
|
16
|
+
return (0, p_every_1.default)(types_1.DEPENDENCIES_FIELDS, (depField) => {
|
|
17
|
+
const lockfileDeps = project.snapshot[depField];
|
|
18
|
+
const manifestDeps = project.manifest[depField];
|
|
19
|
+
if ((lockfileDeps == null) || (manifestDeps == null))
|
|
20
|
+
return true;
|
|
21
|
+
const depNames = Object.keys(lockfileDeps);
|
|
22
|
+
return (0, p_every_1.default)(depNames, async (depName) => {
|
|
23
|
+
const currentSpec = manifestDeps[depName];
|
|
24
|
+
if (!currentSpec)
|
|
25
|
+
return true;
|
|
26
|
+
const lockfileRef = lockfileDeps[depName];
|
|
27
|
+
if ((0, lockfile_utils_1.refIsLocalDirectory)(project.snapshot.specifiers[depName])) {
|
|
28
|
+
const depPath = (0, dependency_path_1.refToRelative)(lockfileRef, depName);
|
|
29
|
+
return depPath != null && isLocalFileDepUpdated(lockfileDir, lockfilePackages?.[depPath]);
|
|
30
|
+
}
|
|
31
|
+
const isLinked = lockfileRef.startsWith('link:');
|
|
32
|
+
if (isLinked &&
|
|
33
|
+
(currentSpec.startsWith('link:') ||
|
|
34
|
+
currentSpec.startsWith('file:') ||
|
|
35
|
+
currentSpec.startsWith('workspace:.'))) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
// https://github.com/pnpm/pnpm/issues/6592
|
|
39
|
+
// if the dependency is linked and the specified version type is tag, we consider it to be up-to-date to skip full resolution.
|
|
40
|
+
if (isLinked && (0, version_selector_type_1.default)(currentSpec)?.type === 'tag') {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
const linkedDir = isLinked
|
|
44
|
+
? path_1.default.join(project.dir, lockfileRef.slice(5))
|
|
45
|
+
: workspacePackages?.get(depName)?.get(lockfileRef)?.rootDir;
|
|
46
|
+
if (!linkedDir)
|
|
47
|
+
return true;
|
|
48
|
+
if (!linkWorkspacePackages && !currentSpec.startsWith('workspace:')) {
|
|
49
|
+
// we found a linked dir, but we don't want to use it, because it's not specified as a
|
|
50
|
+
// workspace:x.x.x dependency
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
const linkedPkg = manifestsByDir[linkedDir] ?? await (0, read_package_json_1.safeReadPackageJsonFromDir)(linkedDir);
|
|
54
|
+
const availableRange = getVersionRange(currentSpec);
|
|
55
|
+
// This should pass the same options to semver as @pnpm/npm-resolver
|
|
56
|
+
const localPackageSatisfiesRange = availableRange === '*' || availableRange === '^' || availableRange === '~' ||
|
|
57
|
+
linkedPkg && semver_1.default.satisfies(linkedPkg.version, availableRange, { loose: true });
|
|
58
|
+
if (isLinked !== localPackageSatisfiesRange)
|
|
59
|
+
return false;
|
|
60
|
+
return true;
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async function isLocalFileDepUpdated(lockfileDir, pkgSnapshot) {
|
|
65
|
+
if (!pkgSnapshot)
|
|
66
|
+
return false;
|
|
67
|
+
const localDepDir = path_1.default.join(lockfileDir, pkgSnapshot.resolution.directory);
|
|
68
|
+
const manifest = await (0, read_package_json_1.safeReadPackageJsonFromDir)(localDepDir);
|
|
69
|
+
if (!manifest)
|
|
70
|
+
return false;
|
|
71
|
+
for (const depField of types_1.DEPENDENCIES_OR_PEER_FIELDS) {
|
|
72
|
+
if (depField === 'devDependencies')
|
|
73
|
+
continue;
|
|
74
|
+
const manifestDeps = manifest[depField] ?? {};
|
|
75
|
+
const lockfileDeps = pkgSnapshot[depField] ?? {};
|
|
76
|
+
// Lock file has more dependencies than the current manifest, e.g. some dependencies are removed.
|
|
77
|
+
if (Object.keys(lockfileDeps).some(depName => !manifestDeps[depName])) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
for (const depName of Object.keys(manifestDeps)) {
|
|
81
|
+
// If a dependency does not exist in the lock file, e.g. a new dependency is added to the current manifest.
|
|
82
|
+
// We need to do full resolution again.
|
|
83
|
+
if (!lockfileDeps[depName]) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const currentSpec = manifestDeps[depName];
|
|
87
|
+
// We do not care about the link dependencies of local dependency.
|
|
88
|
+
if (currentSpec.startsWith('file:') || currentSpec.startsWith('link:') || currentSpec.startsWith('workspace:'))
|
|
89
|
+
continue;
|
|
90
|
+
if (semver_1.default.satisfies(lockfileDeps[depName], getVersionRange(currentSpec), { loose: true })) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
function getVersionRange(spec) {
|
|
101
|
+
if (spec.startsWith('workspace:'))
|
|
102
|
+
return spec.slice(10);
|
|
103
|
+
if (spec.startsWith('npm:')) {
|
|
104
|
+
spec = spec.slice(4);
|
|
105
|
+
const index = spec.indexOf('@', 1);
|
|
106
|
+
if (index === -1)
|
|
107
|
+
return '*';
|
|
108
|
+
return spec.slice(index + 1) || '*';
|
|
109
|
+
}
|
|
110
|
+
return spec;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=linkedPackagesAreUpToDate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linkedPackagesAreUpToDate.js","sourceRoot":"","sources":["../src/linkedPackagesAreUpToDate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pnpm/lockfile.verification",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Checks a lockfile",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
"repository": "https://github.com/pnpm/pnpm/blob/main/lockfile/verification",
|
|
15
15
|
"keywords": [
|
|
16
|
-
"
|
|
16
|
+
"pnpm10",
|
|
17
17
|
"pnpm",
|
|
18
18
|
"lockfile"
|
|
19
19
|
],
|
|
@@ -30,22 +30,22 @@
|
|
|
30
30
|
"ramda": "npm:@pnpm/ramda@0.28.1",
|
|
31
31
|
"semver": "^7.6.2",
|
|
32
32
|
"version-selector-type": "^3.0.0",
|
|
33
|
+
"@pnpm/lockfile.types": "1.0.3",
|
|
34
|
+
"@pnpm/lockfile.utils": "1.0.5",
|
|
33
35
|
"@pnpm/catalogs.types": "0.1.0",
|
|
34
|
-
"@pnpm/dependency-path": "
|
|
35
|
-
"@pnpm/
|
|
36
|
-
"@pnpm/get-context": "12.0.8",
|
|
37
|
-
"@pnpm/read-package-json": "9.0.9",
|
|
36
|
+
"@pnpm/dependency-path": "6.0.0",
|
|
37
|
+
"@pnpm/read-package-json": "9.0.10",
|
|
38
38
|
"@pnpm/resolver-base": "13.0.4",
|
|
39
39
|
"@pnpm/types": "12.2.0",
|
|
40
|
-
"@pnpm/
|
|
40
|
+
"@pnpm/get-context": "13.0.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/ramda": "0.29.12",
|
|
44
44
|
"@types/semver": "7.5.3",
|
|
45
|
-
"@pnpm/constants": "
|
|
46
|
-
"@pnpm/
|
|
47
|
-
"@pnpm/
|
|
48
|
-
"@pnpm/
|
|
45
|
+
"@pnpm/constants": "10.0.0",
|
|
46
|
+
"@pnpm/logger": "5.2.0",
|
|
47
|
+
"@pnpm/lockfile.verification": "1.1.0",
|
|
48
|
+
"@pnpm/prepare": "0.0.106"
|
|
49
49
|
},
|
|
50
50
|
"funding": "https://opencollective.com/pnpm",
|
|
51
51
|
"exports": {
|