@pnpm/pkg-manifest.utils 1100.3.0 → 1100.4.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/CHANGELOG.md +20 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/inferRangeSpecStyle.d.ts +2 -0
- package/lib/inferRangeSpecStyle.js +39 -0
- package/lib/rangeSpecStyle.d.ts +15 -0
- package/lib/rangeSpecStyle.js +21 -0
- package/lib/updateProjectManifestObject.d.ts +6 -0
- package/lib/updateProjectManifestObject.js +13 -4
- package/package.json +8 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @pnpm/manifest-utils
|
|
2
2
|
|
|
3
|
+
## 1100.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- `pnpm add` no longer re-resolves the dependency graph when `pnpm-lock.yaml` already holds a version satisfying the request — promoting a transitive dependency to a direct one, or adding to a second workspace package what a first one already depends on, now only saves the dependency in `package.json` and records its importer entry. A satisfying locked version is necessary but not sufficient: the install still falls back to a full resolution for a dist tag, an alias, a `workspace:`/`catalog:`/git/tarball specifier, `--save-peer`, an overridden package, a `catalogMode` other than `manual`, and — under `resolutionMode: time-based` or `lowest-direct`, which resolve a direct dependency to the low end of its range — a range several locked versions satisfy.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies:
|
|
12
|
+
- @pnpm/error@1100.1.2
|
|
13
|
+
|
|
14
|
+
## 1100.3.1
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- Updated dependencies:
|
|
19
|
+
- @pnpm/core-loggers@1100.3.2
|
|
20
|
+
- @pnpm/error@1100.1.1
|
|
21
|
+
- @pnpm/types@1101.9.0
|
|
22
|
+
|
|
3
23
|
## 1100.3.0
|
|
4
24
|
|
|
5
25
|
### Minor Changes
|
package/lib/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { getSpecFromPackageManifest } from './getSpecFromPackageManifest.js';
|
|
|
4
4
|
export * from './convertEnginesRuntimeToDependencies.js';
|
|
5
5
|
export * from './getAllDependenciesFromManifest.js';
|
|
6
6
|
export * from './getDependencyTypeFromManifest.js';
|
|
7
|
+
export * from './inferRangeSpecStyle.js';
|
|
7
8
|
export * from './rangeSpecStyle.js';
|
|
8
9
|
export * from './updateProjectManifestObject.js';
|
|
9
10
|
export { getAllUniqueSpecs, getSpecFromPackageManifest };
|
package/lib/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getSpecFromPackageManifest } from './getSpecFromPackageManifest.js';
|
|
|
3
3
|
export * from './convertEnginesRuntimeToDependencies.js';
|
|
4
4
|
export * from './getAllDependenciesFromManifest.js';
|
|
5
5
|
export * from './getDependencyTypeFromManifest.js';
|
|
6
|
+
export * from './inferRangeSpecStyle.js';
|
|
6
7
|
export * from './rangeSpecStyle.js';
|
|
7
8
|
export * from './updateProjectManifestObject.js';
|
|
8
9
|
export { getAllUniqueSpecs, getSpecFromPackageManifest };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { parseRange } from 'semver-utils';
|
|
2
|
+
export function inferRangeSpecStyle(spec) {
|
|
3
|
+
// A catalog reference carries no version pinning of its own; the pinning is
|
|
4
|
+
// defined by the catalog entry it points to. Bail out so a catalog name that
|
|
5
|
+
// happens to look like a version (e.g. "catalog:express4-21") isn't misread
|
|
6
|
+
// as a pinned version.
|
|
7
|
+
if (spec.startsWith('catalog:'))
|
|
8
|
+
return undefined;
|
|
9
|
+
const colonIndex = spec.indexOf(':');
|
|
10
|
+
if (colonIndex !== -1) {
|
|
11
|
+
spec = spec.substring(colonIndex + 1);
|
|
12
|
+
}
|
|
13
|
+
const index = spec.lastIndexOf('@');
|
|
14
|
+
if (index !== -1) {
|
|
15
|
+
spec = spec.slice(index + 1);
|
|
16
|
+
}
|
|
17
|
+
if (spec === '*')
|
|
18
|
+
return 'none';
|
|
19
|
+
const parsedRange = parseRange(spec);
|
|
20
|
+
if (parsedRange.length !== 1)
|
|
21
|
+
return undefined;
|
|
22
|
+
const versionObject = parsedRange[0];
|
|
23
|
+
switch (versionObject.operator) {
|
|
24
|
+
case '~': return 'minor';
|
|
25
|
+
case '^': return 'major';
|
|
26
|
+
// A bare '=' before a full version is an explicit exact pin; a partial
|
|
27
|
+
// '=' pins the same way the plain version it prefixes does.
|
|
28
|
+
case '=':
|
|
29
|
+
case undefined:
|
|
30
|
+
if (versionObject.patch)
|
|
31
|
+
return versionObject.operator === '=' ? 'exact' : 'patch';
|
|
32
|
+
if (versionObject.minor)
|
|
33
|
+
return 'minor';
|
|
34
|
+
if (versionObject.major)
|
|
35
|
+
return 'major';
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=inferRangeSpecStyle.js.map
|
package/lib/rangeSpecStyle.d.ts
CHANGED
|
@@ -10,4 +10,19 @@ export declare function getRangeSpecStyle(opts: {
|
|
|
10
10
|
saveExact?: boolean;
|
|
11
11
|
savePrefix?: string;
|
|
12
12
|
}): RangeSpecStyle;
|
|
13
|
+
/**
|
|
14
|
+
* The manifest range that pins `version` for a dependency the user asked for
|
|
15
|
+
* as `bareSpecifier` and whose manifest entry, if it already had one, read
|
|
16
|
+
* `prevSpecifier`.
|
|
17
|
+
*
|
|
18
|
+
* The existing entry's range style wins over the requested specifier's, which
|
|
19
|
+
* wins over the configured default, so a re-add keeps the pinning style the
|
|
20
|
+
* manifest already used. A prerelease is pinned exactly: no range operator
|
|
21
|
+
* expresses "this prerelease and later ones".
|
|
22
|
+
*/
|
|
23
|
+
export declare function calcVersionRange(version: string, opts: {
|
|
24
|
+
prevSpecifier?: string;
|
|
25
|
+
bareSpecifier?: string;
|
|
26
|
+
defaultRangeSpecStyle?: RangeSpecStyle;
|
|
27
|
+
}): string;
|
|
13
28
|
export declare function versionWithRangeSpecStyle(version: string, rangeSpecStyle: RangeSpecStyle): string;
|
package/lib/rangeSpecStyle.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
import { inferRangeSpecStyle } from './inferRangeSpecStyle.js';
|
|
1
3
|
export function rangeSpecGranularity(style) {
|
|
2
4
|
return style === 'exact' ? 'patch' : style;
|
|
3
5
|
}
|
|
@@ -16,6 +18,25 @@ export function getRangeSpecStyle(opts) {
|
|
|
16
18
|
default: return 'major';
|
|
17
19
|
}
|
|
18
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* The manifest range that pins `version` for a dependency the user asked for
|
|
23
|
+
* as `bareSpecifier` and whose manifest entry, if it already had one, read
|
|
24
|
+
* `prevSpecifier`.
|
|
25
|
+
*
|
|
26
|
+
* The existing entry's range style wins over the requested specifier's, which
|
|
27
|
+
* wins over the configured default, so a re-add keeps the pinning style the
|
|
28
|
+
* manifest already used. A prerelease is pinned exactly: no range operator
|
|
29
|
+
* expresses "this prerelease and later ones".
|
|
30
|
+
*/
|
|
31
|
+
export function calcVersionRange(version, opts) {
|
|
32
|
+
if (semver.parse(version)?.prerelease.length) {
|
|
33
|
+
return version;
|
|
34
|
+
}
|
|
35
|
+
const rangeSpecStyle = (opts.prevSpecifier ? inferRangeSpecStyle(opts.prevSpecifier) : undefined) ??
|
|
36
|
+
(opts.bareSpecifier ? inferRangeSpecStyle(opts.bareSpecifier) : undefined) ??
|
|
37
|
+
opts.defaultRangeSpecStyle;
|
|
38
|
+
return versionWithRangeSpecStyle(version, rangeSpecStyle ?? 'major');
|
|
39
|
+
}
|
|
19
40
|
export function versionWithRangeSpecStyle(version, rangeSpecStyle) {
|
|
20
41
|
switch (rangeSpecStyle) {
|
|
21
42
|
case 'none':
|
|
@@ -9,4 +9,10 @@ export interface PackageSpecObject {
|
|
|
9
9
|
}
|
|
10
10
|
export declare function createVersionSpecFromResolvedVersion(resolvedVersion: string, rangeSpecStyle?: RangeSpecStyle): string | null;
|
|
11
11
|
export declare function updateProjectManifestObject(prefix: string, packageManifest: ProjectManifest, packageSpecs: PackageSpecObject[]): Promise<ProjectManifest>;
|
|
12
|
+
/**
|
|
13
|
+
* The manifest edit {@link updateProjectManifestObject} applies, without
|
|
14
|
+
* announcing it. Separate so a caller that may still discard the edited
|
|
15
|
+
* manifest reports the update only once it commits to it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function applyPackageSpecs(packageManifest: ProjectManifest, packageSpecs: PackageSpecObject[]): ProjectManifest;
|
|
12
18
|
export declare function guessDependencyType(alias: string, manifest: ProjectManifest): DependenciesOrPeersField | undefined;
|
|
@@ -18,6 +18,19 @@ export function createVersionSpecFromResolvedVersion(resolvedVersion, rangeSpecS
|
|
|
18
18
|
return versionWithRangeSpecStyle(resolvedVersion, rangeSpecStyle ?? 'major');
|
|
19
19
|
}
|
|
20
20
|
export async function updateProjectManifestObject(prefix, packageManifest, packageSpecs) {
|
|
21
|
+
applyPackageSpecs(packageManifest, packageSpecs);
|
|
22
|
+
packageManifestLogger.debug({
|
|
23
|
+
prefix,
|
|
24
|
+
updated: packageManifest,
|
|
25
|
+
});
|
|
26
|
+
return packageManifest;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The manifest edit {@link updateProjectManifestObject} applies, without
|
|
30
|
+
* announcing it. Separate so a caller that may still discard the edited
|
|
31
|
+
* manifest reports the update only once it commits to it.
|
|
32
|
+
*/
|
|
33
|
+
export function applyPackageSpecs(packageManifest, packageSpecs) {
|
|
21
34
|
for (const packageSpec of packageSpecs) {
|
|
22
35
|
if (packageSpec.saveType) {
|
|
23
36
|
const spec = packageSpec.bareSpecifier ?? findSpec(packageSpec.alias, packageManifest);
|
|
@@ -43,10 +56,6 @@ export async function updateProjectManifestObject(prefix, packageManifest, packa
|
|
|
43
56
|
}
|
|
44
57
|
}
|
|
45
58
|
}
|
|
46
|
-
packageManifestLogger.debug({
|
|
47
|
-
prefix,
|
|
48
|
-
updated: packageManifest,
|
|
49
|
-
});
|
|
50
59
|
return packageManifest;
|
|
51
60
|
}
|
|
52
61
|
function findSpec(alias, manifest) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pnpm/pkg-manifest.utils",
|
|
3
|
-
"version": "1100.
|
|
3
|
+
"version": "1100.4.0",
|
|
4
4
|
"description": "Utils for dealing with package manifest",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pnpm",
|
|
@@ -27,11 +27,12 @@
|
|
|
27
27
|
"!*.map"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@pnpm/core-loggers": "1100.3.
|
|
30
|
+
"@pnpm/core-loggers": "1100.3.2",
|
|
31
31
|
"@pnpm/deps.peer-range": "1100.1.1",
|
|
32
|
-
"@pnpm/error": "1100.1.
|
|
33
|
-
"@pnpm/types": "1101.
|
|
34
|
-
"semver": "^7.8.5"
|
|
32
|
+
"@pnpm/error": "1100.1.2",
|
|
33
|
+
"@pnpm/types": "1101.9.0",
|
|
34
|
+
"semver": "^7.8.5",
|
|
35
|
+
"semver-utils": "^1.1.4"
|
|
35
36
|
},
|
|
36
37
|
"peerDependencies": {
|
|
37
38
|
"@pnpm/logger": "^1100.0.0"
|
|
@@ -39,8 +40,8 @@
|
|
|
39
40
|
"devDependencies": {
|
|
40
41
|
"@jest/globals": "30.4.1",
|
|
41
42
|
"@pnpm/logger": "1100.0.0",
|
|
42
|
-
"@pnpm/pkg-manifest.utils": "1100.
|
|
43
|
-
"@types/semver": "7.
|
|
43
|
+
"@pnpm/pkg-manifest.utils": "1100.4.0",
|
|
44
|
+
"@types/semver": "7.8.0"
|
|
44
45
|
},
|
|
45
46
|
"engines": {
|
|
46
47
|
"node": ">=22.13"
|