@pnpm/lockfile.verification 1.0.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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-2016 Rico Sta. Cruz and other contributors
4
+ Copyright (c) 2016-2024 Zoltan Kochan and other contributors
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @pnpm/lockfile.verification
2
+
3
+ > Checks a lockfile
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@pnpm/lockfile.verification.svg)](https://www.npmjs.com/package/@pnpm/lockfile.verification)
6
+
7
+ ## Installation
8
+
9
+ ```sh
10
+ pnpm add @pnpm/lockfile.verification
11
+ ```
12
+
13
+ ## License
14
+
15
+ MIT
@@ -0,0 +1,3 @@
1
+ import { type CatalogSnapshots } from '@pnpm/lockfile.types';
2
+ import { type Catalogs } from '@pnpm/catalogs.types';
3
+ export declare function allCatalogsAreUpToDate(catalogsConfig: Catalogs, snapshot: CatalogSnapshots | undefined): boolean;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.allCatalogsAreUpToDate = void 0;
4
+ function allCatalogsAreUpToDate(catalogsConfig, snapshot) {
5
+ return Object.entries(snapshot ?? {})
6
+ .every(([catalogName, catalog]) => Object.entries(catalog ?? {})
7
+ .every(([alias, entry]) => entry.specifier === catalogsConfig[catalogName]?.[alias]));
8
+ }
9
+ exports.allCatalogsAreUpToDate = allCatalogsAreUpToDate;
10
+ //# sourceMappingURL=allCatalogsAreUpToDate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allCatalogsAreUpToDate.js","sourceRoot":"","sources":["../src/allCatalogsAreUpToDate.ts"],"names":[],"mappings":";;;AAGA,SAAgB,sBAAsB,CACpC,cAAwB,EACxB,QAAsC;IAEtC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;SAClC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC7D,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC3F,CAAC;AAPD,wDAOC"}
@@ -0,0 +1,16 @@
1
+ import { type Catalogs } from '@pnpm/catalogs.types';
2
+ import { type ProjectOptions } from '@pnpm/get-context';
3
+ import { type Lockfile } from '@pnpm/lockfile.types';
4
+ import { type WorkspacePackages } from '@pnpm/resolver-base';
5
+ import { type ProjectId } from '@pnpm/types';
6
+ export declare function allProjectsAreUpToDate(projects: Array<Pick<ProjectOptions, 'manifest' | 'rootDir'> & {
7
+ id: ProjectId;
8
+ }>, opts: {
9
+ catalogs: Catalogs;
10
+ autoInstallPeers: boolean;
11
+ excludeLinksFromLockfile: boolean;
12
+ linkWorkspacePackages: boolean;
13
+ wantedLockfile: Lockfile;
14
+ workspacePackages: WorkspacePackages;
15
+ lockfileDir: string;
16
+ }): Promise<boolean>;
@@ -0,0 +1,162 @@
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.allProjectsAreUpToDate = void 0;
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 any_1 = __importDefault(require("ramda/src/any"));
14
+ const semver_1 = __importDefault(require("semver"));
15
+ const version_selector_type_1 = __importDefault(require("version-selector-type"));
16
+ const allCatalogsAreUpToDate_1 = require("./allCatalogsAreUpToDate");
17
+ const satisfiesPackageManifest_1 = require("./satisfiesPackageManifest");
18
+ async function allProjectsAreUpToDate(projects, opts) {
19
+ // Projects may declare dependencies using catalog protocol specifiers. If the
20
+ // catalog config definitions are edited by users, projects using them are out
21
+ // of date.
22
+ if (!(0, allCatalogsAreUpToDate_1.allCatalogsAreUpToDate)(opts.catalogs, opts.wantedLockfile.catalogs)) {
23
+ return false;
24
+ }
25
+ const manifestsByDir = opts.workspacePackages ? getWorkspacePackagesByDirectory(opts.workspacePackages) : {};
26
+ const _satisfiesPackageManifest = satisfiesPackageManifest_1.satisfiesPackageManifest.bind(null, {
27
+ autoInstallPeers: opts.autoInstallPeers,
28
+ excludeLinksFromLockfile: opts.excludeLinksFromLockfile,
29
+ });
30
+ const _linkedPackagesAreUpToDate = linkedPackagesAreUpToDate.bind(null, {
31
+ linkWorkspacePackages: opts.linkWorkspacePackages,
32
+ manifestsByDir,
33
+ workspacePackages: opts.workspacePackages,
34
+ lockfilePackages: opts.wantedLockfile.packages,
35
+ lockfileDir: opts.lockfileDir,
36
+ });
37
+ return (0, p_every_1.default)(projects, (project) => {
38
+ const importer = opts.wantedLockfile.importers[project.id];
39
+ return !hasLocalTarballDepsInRoot(importer) &&
40
+ _satisfiesPackageManifest(importer, project.manifest).satisfies &&
41
+ _linkedPackagesAreUpToDate({
42
+ dir: project.rootDir,
43
+ manifest: project.manifest,
44
+ snapshot: importer,
45
+ });
46
+ });
47
+ }
48
+ exports.allProjectsAreUpToDate = allProjectsAreUpToDate;
49
+ function getWorkspacePackagesByDirectory(workspacePackages) {
50
+ const workspacePackagesByDirectory = {};
51
+ if (workspacePackages) {
52
+ for (const pkgVersions of workspacePackages.values()) {
53
+ for (const { rootDir, manifest } of pkgVersions.values()) {
54
+ workspacePackagesByDirectory[rootDir] = manifest;
55
+ }
56
+ }
57
+ }
58
+ return workspacePackagesByDirectory;
59
+ }
60
+ async function linkedPackagesAreUpToDate({ linkWorkspacePackages, manifestsByDir, workspacePackages, lockfilePackages, lockfileDir, }, project) {
61
+ return (0, p_every_1.default)(types_1.DEPENDENCIES_FIELDS, (depField) => {
62
+ const lockfileDeps = project.snapshot[depField];
63
+ const manifestDeps = project.manifest[depField];
64
+ if ((lockfileDeps == null) || (manifestDeps == null))
65
+ return true;
66
+ const depNames = Object.keys(lockfileDeps);
67
+ return (0, p_every_1.default)(depNames, async (depName) => {
68
+ const currentSpec = manifestDeps[depName];
69
+ if (!currentSpec)
70
+ return true;
71
+ const lockfileRef = lockfileDeps[depName];
72
+ if ((0, lockfile_utils_1.refIsLocalDirectory)(project.snapshot.specifiers[depName])) {
73
+ const depPath = (0, dependency_path_1.refToRelative)(lockfileRef, depName);
74
+ return depPath != null && isLocalFileDepUpdated(lockfileDir, lockfilePackages?.[depPath]);
75
+ }
76
+ const isLinked = lockfileRef.startsWith('link:');
77
+ if (isLinked &&
78
+ (currentSpec.startsWith('link:') ||
79
+ currentSpec.startsWith('file:') ||
80
+ currentSpec.startsWith('workspace:.'))) {
81
+ return true;
82
+ }
83
+ // https://github.com/pnpm/pnpm/issues/6592
84
+ // if the dependency is linked and the specified version type is tag, we consider it to be up-to-date to skip full resolution.
85
+ if (isLinked && (0, version_selector_type_1.default)(currentSpec)?.type === 'tag') {
86
+ return true;
87
+ }
88
+ const linkedDir = isLinked
89
+ ? path_1.default.join(project.dir, lockfileRef.slice(5))
90
+ : workspacePackages?.get(depName)?.get(lockfileRef)?.rootDir;
91
+ if (!linkedDir)
92
+ return true;
93
+ if (!linkWorkspacePackages && !currentSpec.startsWith('workspace:')) {
94
+ // we found a linked dir, but we don't want to use it, because it's not specified as a
95
+ // workspace:x.x.x dependency
96
+ return true;
97
+ }
98
+ const linkedPkg = manifestsByDir[linkedDir] ?? await (0, read_package_json_1.safeReadPackageJsonFromDir)(linkedDir);
99
+ const availableRange = getVersionRange(currentSpec);
100
+ // This should pass the same options to semver as @pnpm/npm-resolver
101
+ const localPackageSatisfiesRange = availableRange === '*' || availableRange === '^' || availableRange === '~' ||
102
+ linkedPkg && semver_1.default.satisfies(linkedPkg.version, availableRange, { loose: true });
103
+ if (isLinked !== localPackageSatisfiesRange)
104
+ return false;
105
+ return true;
106
+ });
107
+ });
108
+ }
109
+ async function isLocalFileDepUpdated(lockfileDir, pkgSnapshot) {
110
+ if (!pkgSnapshot)
111
+ return false;
112
+ const localDepDir = path_1.default.join(lockfileDir, pkgSnapshot.resolution.directory);
113
+ const manifest = await (0, read_package_json_1.safeReadPackageJsonFromDir)(localDepDir);
114
+ if (!manifest)
115
+ return false;
116
+ for (const depField of types_1.DEPENDENCIES_OR_PEER_FIELDS) {
117
+ if (depField === 'devDependencies')
118
+ continue;
119
+ const manifestDeps = manifest[depField] ?? {};
120
+ const lockfileDeps = pkgSnapshot[depField] ?? {};
121
+ // Lock file has more dependencies than the current manifest, e.g. some dependencies are removed.
122
+ if (Object.keys(lockfileDeps).some(depName => !manifestDeps[depName])) {
123
+ return false;
124
+ }
125
+ for (const depName of Object.keys(manifestDeps)) {
126
+ // If a dependency does not exist in the lock file, e.g. a new dependency is added to the current manifest.
127
+ // We need to do full resolution again.
128
+ if (!lockfileDeps[depName]) {
129
+ return false;
130
+ }
131
+ const currentSpec = manifestDeps[depName];
132
+ // We do not care about the link dependencies of local dependency.
133
+ if (currentSpec.startsWith('file:') || currentSpec.startsWith('link:') || currentSpec.startsWith('workspace:'))
134
+ continue;
135
+ if (semver_1.default.satisfies(lockfileDeps[depName], getVersionRange(currentSpec), { loose: true })) {
136
+ continue;
137
+ }
138
+ else {
139
+ return false;
140
+ }
141
+ }
142
+ }
143
+ return true;
144
+ }
145
+ function getVersionRange(spec) {
146
+ if (spec.startsWith('workspace:'))
147
+ return spec.slice(10);
148
+ if (spec.startsWith('npm:')) {
149
+ spec = spec.slice(4);
150
+ const index = spec.indexOf('@', 1);
151
+ if (index === -1)
152
+ return '*';
153
+ return spec.slice(index + 1) || '*';
154
+ }
155
+ return spec;
156
+ }
157
+ function hasLocalTarballDepsInRoot(importer) {
158
+ return (0, any_1.default)(lockfile_utils_1.refIsLocalTarball, Object.values(importer.dependencies ?? {})) ||
159
+ (0, any_1.default)(lockfile_utils_1.refIsLocalTarball, Object.values(importer.devDependencies ?? {})) ||
160
+ (0, any_1.default)(lockfile_utils_1.refIsLocalTarball, Object.values(importer.optionalDependencies ?? {}));
161
+ }
162
+ //# sourceMappingURL=allProjectsAreUpToDate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allProjectsAreUpToDate.js","sourceRoot":"","sources":["../src/allProjectsAreUpToDate.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { allProjectsAreUpToDate } from './allProjectsAreUpToDate';
2
+ export { satisfiesPackageManifest } from './satisfiesPackageManifest';
package/lib/index.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.satisfiesPackageManifest = exports.allProjectsAreUpToDate = void 0;
4
+ var allProjectsAreUpToDate_1 = require("./allProjectsAreUpToDate");
5
+ Object.defineProperty(exports, "allProjectsAreUpToDate", { enumerable: true, get: function () { return allProjectsAreUpToDate_1.allProjectsAreUpToDate; } });
6
+ var satisfiesPackageManifest_1 = require("./satisfiesPackageManifest");
7
+ Object.defineProperty(exports, "satisfiesPackageManifest", { enumerable: true, get: function () { return satisfiesPackageManifest_1.satisfiesPackageManifest; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,9 @@
1
+ import { type ProjectSnapshot } from '@pnpm/lockfile.types';
2
+ import { type ProjectManifest } from '@pnpm/types';
3
+ export declare function satisfiesPackageManifest(opts: {
4
+ autoInstallPeers?: boolean;
5
+ excludeLinksFromLockfile?: boolean;
6
+ }, importer: ProjectSnapshot | undefined, pkg: ProjectManifest): {
7
+ satisfies: boolean;
8
+ detailedReason?: string;
9
+ };
@@ -0,0 +1,96 @@
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.satisfiesPackageManifest = void 0;
7
+ const types_1 = require("@pnpm/types");
8
+ const equals_1 = __importDefault(require("ramda/src/equals"));
9
+ const pickBy_1 = __importDefault(require("ramda/src/pickBy"));
10
+ const omit_1 = __importDefault(require("ramda/src/omit"));
11
+ function satisfiesPackageManifest(opts, importer, pkg) {
12
+ if (!importer)
13
+ return { satisfies: false, detailedReason: 'no importer' };
14
+ let existingDeps = { ...pkg.devDependencies, ...pkg.dependencies, ...pkg.optionalDependencies };
15
+ if (opts?.autoInstallPeers) {
16
+ pkg = {
17
+ ...pkg,
18
+ dependencies: {
19
+ ...pkg.peerDependencies && (0, omit_1.default)(Object.keys(existingDeps), pkg.peerDependencies),
20
+ ...pkg.dependencies,
21
+ },
22
+ };
23
+ existingDeps = {
24
+ ...pkg.peerDependencies,
25
+ ...existingDeps,
26
+ };
27
+ }
28
+ const pickNonLinkedDeps = (0, pickBy_1.default)((spec) => !spec.startsWith('link:'));
29
+ let specs = importer.specifiers;
30
+ if (opts?.excludeLinksFromLockfile) {
31
+ existingDeps = pickNonLinkedDeps(existingDeps);
32
+ specs = pickNonLinkedDeps(specs);
33
+ }
34
+ if (!(0, equals_1.default)(existingDeps, specs)) {
35
+ return {
36
+ satisfies: false,
37
+ detailedReason: `specifiers in the lockfile (${JSON.stringify(specs)}) don't match specs in package.json (${JSON.stringify(existingDeps)})`,
38
+ };
39
+ }
40
+ if (importer.publishDirectory !== pkg.publishConfig?.directory) {
41
+ return {
42
+ satisfies: false,
43
+ detailedReason: `"publishDirectory" in the lockfile (${importer.publishDirectory ?? 'undefined'}) doesn't match "publishConfig.directory" in package.json (${pkg.publishConfig?.directory ?? 'undefined'})`,
44
+ };
45
+ }
46
+ if (!(0, equals_1.default)(pkg.dependenciesMeta ?? {}, importer.dependenciesMeta ?? {})) {
47
+ return {
48
+ satisfies: false,
49
+ detailedReason: `importer dependencies meta (${JSON.stringify(importer.dependenciesMeta)}) doesn't match package manifest dependencies meta (${JSON.stringify(pkg.dependenciesMeta)})`,
50
+ };
51
+ }
52
+ for (const depField of types_1.DEPENDENCIES_FIELDS) {
53
+ const importerDeps = importer[depField] ?? {};
54
+ let pkgDeps = pkg[depField] ?? {};
55
+ if (opts?.excludeLinksFromLockfile) {
56
+ pkgDeps = pickNonLinkedDeps(pkgDeps);
57
+ }
58
+ let pkgDepNames;
59
+ switch (depField) {
60
+ case 'optionalDependencies':
61
+ pkgDepNames = Object.keys(pkgDeps);
62
+ break;
63
+ case 'devDependencies':
64
+ pkgDepNames = Object.keys(pkgDeps)
65
+ .filter((depName) => !pkg.optionalDependencies?.[depName] && !pkg.dependencies?.[depName]);
66
+ break;
67
+ case 'dependencies':
68
+ pkgDepNames = Object.keys(pkgDeps)
69
+ .filter((depName) => !pkg.optionalDependencies?.[depName]);
70
+ break;
71
+ default:
72
+ throw new Error(`Unknown dependency type "${depField}"`);
73
+ }
74
+ if (pkgDepNames.length !== Object.keys(importerDeps).length &&
75
+ pkgDepNames.length !== countOfNonLinkedDeps(importerDeps)) {
76
+ return {
77
+ satisfies: false,
78
+ detailedReason: `"${depField}" in the lockfile (${JSON.stringify(importerDeps)}) doesn't match the same field in package.json (${JSON.stringify(pkgDeps)})`,
79
+ };
80
+ }
81
+ for (const depName of pkgDepNames) {
82
+ if (!importerDeps[depName] || importer.specifiers?.[depName] !== pkgDeps[depName]) {
83
+ return {
84
+ satisfies: false,
85
+ detailedReason: `importer ${depField}.${depName} specifier ${importer.specifiers[depName]} don't match package manifest specifier (${pkgDeps[depName]})`,
86
+ };
87
+ }
88
+ }
89
+ }
90
+ return { satisfies: true };
91
+ }
92
+ exports.satisfiesPackageManifest = satisfiesPackageManifest;
93
+ function countOfNonLinkedDeps(lockfileDeps) {
94
+ return Object.values(lockfileDeps).filter((ref) => !ref.includes('link:') && !ref.includes('file:')).length;
95
+ }
96
+ //# sourceMappingURL=satisfiesPackageManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"satisfiesPackageManifest.js","sourceRoot":"","sources":["../src/satisfiesPackageManifest.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@pnpm/lockfile.verification",
3
+ "version": "1.0.0",
4
+ "description": "Checks a lockfile",
5
+ "main": "lib/index.js",
6
+ "types": "lib/index.d.ts",
7
+ "files": [
8
+ "lib",
9
+ "!*.map"
10
+ ],
11
+ "engines": {
12
+ "node": ">=18.12"
13
+ },
14
+ "repository": "https://github.com/pnpm/pnpm/blob/main/lockfile/verification",
15
+ "keywords": [
16
+ "pnpm9",
17
+ "pnpm",
18
+ "lockfile"
19
+ ],
20
+ "license": "MIT",
21
+ "bugs": {
22
+ "url": "https://github.com/pnpm/pnpm/issues"
23
+ },
24
+ "homepage": "https://github.com/pnpm/pnpm/blob/main/lockfile/verification#readme",
25
+ "peerDependencies": {
26
+ "@pnpm/logger": "^5.0.0"
27
+ },
28
+ "dependencies": {
29
+ "p-every": "^2.0.0",
30
+ "ramda": "npm:@pnpm/ramda@0.28.1",
31
+ "semver": "^7.6.2",
32
+ "version-selector-type": "^3.0.0",
33
+ "@pnpm/catalogs.types": "0.1.0",
34
+ "@pnpm/dependency-path": "5.1.3",
35
+ "@pnpm/get-context": "12.0.2",
36
+ "@pnpm/lockfile.utils": "1.0.0",
37
+ "@pnpm/lockfile.types": "1.0.0",
38
+ "@pnpm/read-package-json": "9.0.5",
39
+ "@pnpm/resolver-base": "13.0.1",
40
+ "@pnpm/types": "11.1.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/ramda": "0.29.12",
44
+ "@types/semver": "7.5.3",
45
+ "@pnpm/constants": "8.0.0",
46
+ "@pnpm/lockfile.verification": "1.0.0",
47
+ "@pnpm/prepare": "0.0.99"
48
+ },
49
+ "funding": "https://opencollective.com/pnpm",
50
+ "exports": {
51
+ ".": "./lib/index.js"
52
+ },
53
+ "scripts": {
54
+ "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
55
+ "_test": "jest",
56
+ "test": "pnpm run compile && pnpm run _test",
57
+ "compile": "tsc --build && pnpm run lint --fix"
58
+ }
59
+ }