@pnpm/hooks.read-package-hook 1100.1.0 → 1100.1.2

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 CHANGED
@@ -1,5 +1,19 @@
1
1
  # @pnpm/hooks.read-package-hook
2
2
 
3
+ ## 1100.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies:
8
+ - @pnpm/types@1101.5.0
9
+
10
+ ## 1100.1.1
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies:
15
+ - @pnpm/deps.peer-range@1100.1.0
16
+
3
17
  ## 1100.1.0
4
18
 
5
19
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnpm/hooks.read-package-hook",
3
- "version": "1100.1.0",
3
+ "version": "1100.1.2",
4
4
  "description": "Creates the default package reader hook used by pnpm",
5
5
  "keywords": [
6
6
  "pnpm",
@@ -29,10 +29,10 @@
29
29
  "dependencies": {
30
30
  "@pnpm/config.matcher": "1100.0.1",
31
31
  "@pnpm/config.parse-overrides": "1100.1.0",
32
- "@pnpm/deps.peer-range": "1100.0.2",
32
+ "@pnpm/deps.peer-range": "1100.1.0",
33
33
  "@pnpm/error": "1100.0.1",
34
34
  "@pnpm/resolving.parse-wanted-dependency": "1100.0.1",
35
- "@pnpm/types": "1101.4.0",
35
+ "@pnpm/types": "1101.5.0",
36
36
  "@yarnpkg/extensions": "2.0.6",
37
37
  "normalize-path": "^3.0.0",
38
38
  "ramda": "npm:@pnpm/ramda@0.28.1",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "devDependencies": {
42
42
  "@jest/globals": "30.4.1",
43
- "@pnpm/hooks.read-package-hook": "1100.1.0",
43
+ "@pnpm/hooks.read-package-hook": "1100.1.2",
44
44
  "@types/normalize-path": "^3.0.2",
45
45
  "@types/ramda": "0.31.1",
46
46
  "@types/semver": "7.7.1",
@@ -1,2 +0,0 @@
1
- import type { ReadPackageHook } from '@pnpm/types';
2
- export declare function createOptionalDependenciesRemover(toBeRemoved: string[]): ReadPackageHook;
@@ -1,17 +0,0 @@
1
- import { createMatcher } from '@pnpm/config.matcher';
2
- export function createOptionalDependenciesRemover(toBeRemoved) {
3
- if (!toBeRemoved.length)
4
- return (manifest) => manifest;
5
- const shouldBeRemoved = createMatcher(toBeRemoved);
6
- return (manifest) => removeOptionalDependencies(manifest, shouldBeRemoved);
7
- }
8
- function removeOptionalDependencies(manifest, shouldBeRemoved) {
9
- for (const optionalDependency in manifest.optionalDependencies) {
10
- if (shouldBeRemoved(optionalDependency)) {
11
- delete manifest.optionalDependencies[optionalDependency];
12
- delete manifest.dependencies?.[optionalDependency];
13
- }
14
- }
15
- return manifest;
16
- }
17
- //# sourceMappingURL=createOptionalDependenciesRemover.js.map
@@ -1,2 +0,0 @@
1
- import type { PackageExtension, ReadPackageHook } from '@pnpm/types';
2
- export declare function createPackageExtender(packageExtensions: Record<string, PackageExtension>): ReadPackageHook;
@@ -1,36 +0,0 @@
1
- import { parseWantedDependency } from '@pnpm/resolving.parse-wanted-dependency';
2
- import semver from 'semver';
3
- export function createPackageExtender(packageExtensions) {
4
- const extensionsByPkgName = new Map();
5
- for (const selector in packageExtensions) {
6
- const packageExtension = packageExtensions[selector];
7
- const { alias, bareSpecifier } = parseWantedDependency(selector);
8
- if (!extensionsByPkgName.has(alias)) {
9
- extensionsByPkgName.set(alias, []);
10
- }
11
- extensionsByPkgName.get(alias).push({ packageExtension, range: bareSpecifier });
12
- }
13
- return extendPkgHook.bind(null, extensionsByPkgName);
14
- }
15
- function extendPkgHook(extensionsByPkgName, manifest) {
16
- const extensions = extensionsByPkgName.get(manifest.name);
17
- if (extensions == null)
18
- return manifest;
19
- extendPkg(manifest, extensions);
20
- return manifest;
21
- }
22
- function extendPkg(manifest, extensions) {
23
- for (const { range, packageExtension } of extensions) {
24
- if (range != null && !semver.satisfies(manifest.version, range))
25
- continue;
26
- for (const field of ['dependencies', 'optionalDependencies', 'peerDependencies', 'peerDependenciesMeta']) {
27
- if (!packageExtension[field])
28
- continue;
29
- manifest[field] = {
30
- ...packageExtension[field],
31
- ...manifest[field],
32
- }; // eslint-disable-line @typescript-eslint/no-explicit-any
33
- }
34
- }
35
- }
36
- //# sourceMappingURL=createPackageExtender.js.map
@@ -1,15 +0,0 @@
1
- import type { PackageExtension, ReadPackageHook } from '@pnpm/types';
2
- import { type CreateVersionsOverriderOptions, type VersionOverrideWithoutRawSelector } from './createVersionsOverrider.js';
3
- export declare function getEffectivePackageExtensions({ ignoreCompatibilityDb, packageExtensions, }: {
4
- ignoreCompatibilityDb?: boolean;
5
- packageExtensions?: Record<string, PackageExtension>;
6
- }): Record<string, PackageExtension> | undefined;
7
- export declare function createReadPackageHook({ ignoreCompatibilityDb, lockfileDir, overrides, convergeDeclaredRanges, ignoredOptionalDependencies, packageExtensions, readPackageHook, }: {
8
- ignoreCompatibilityDb?: boolean;
9
- lockfileDir: string;
10
- overrides?: VersionOverrideWithoutRawSelector[];
11
- convergeDeclaredRanges?: CreateVersionsOverriderOptions['convergeDeclaredRanges'];
12
- ignoredOptionalDependencies?: string[];
13
- packageExtensions?: Record<string, PackageExtension>;
14
- readPackageHook?: ReadPackageHook[] | ReadPackageHook;
15
- }): ReadPackageHook | undefined;
@@ -1,79 +0,0 @@
1
- import { packageExtensions as compatPackageExtensions } from '@yarnpkg/extensions';
2
- import { isEmpty, pipeWith } from 'ramda';
3
- import { createOptionalDependenciesRemover } from './createOptionalDependenciesRemover.js';
4
- import { createPackageExtender } from './createPackageExtender.js';
5
- import { createVersionsOverrider } from './createVersionsOverrider.js';
6
- const PACKAGE_EXTENSION_FIELDS = [
7
- 'dependencies',
8
- 'optionalDependencies',
9
- 'peerDependencies',
10
- 'peerDependenciesMeta',
11
- ];
12
- export function getEffectivePackageExtensions({ ignoreCompatibilityDb, packageExtensions, }) {
13
- const effectivePackageExtensions = {};
14
- if (!ignoreCompatibilityDb) {
15
- mergePackageExtensions(effectivePackageExtensions, compatPackageExtensions);
16
- }
17
- if (!isEmpty(packageExtensions ?? {})) {
18
- mergePackageExtensions(effectivePackageExtensions, Object.entries(packageExtensions));
19
- }
20
- return isEmpty(effectivePackageExtensions) ? undefined : effectivePackageExtensions;
21
- }
22
- export function createReadPackageHook({ ignoreCompatibilityDb, lockfileDir, overrides, convergeDeclaredRanges, ignoredOptionalDependencies, packageExtensions, readPackageHook, }) {
23
- const hooks = [];
24
- const effectivePackageExtensions = getEffectivePackageExtensions({
25
- ignoreCompatibilityDb,
26
- packageExtensions,
27
- });
28
- if (effectivePackageExtensions != null) {
29
- hooks.push(createPackageExtender(effectivePackageExtensions));
30
- }
31
- if (Array.isArray(readPackageHook)) {
32
- hooks.push(...readPackageHook);
33
- }
34
- else if (readPackageHook) {
35
- hooks.push(readPackageHook);
36
- }
37
- if (!isEmpty(overrides ?? {})) {
38
- hooks.push(createVersionsOverrider(overrides, lockfileDir, { convergeDeclaredRanges }));
39
- }
40
- if (ignoredOptionalDependencies && !isEmpty(ignoredOptionalDependencies)) {
41
- hooks.push(createOptionalDependenciesRemover(ignoredOptionalDependencies));
42
- }
43
- if (hooks.length === 0) {
44
- return undefined;
45
- }
46
- const readPackageAndExtend = hooks.length === 1
47
- ? hooks[0]
48
- : ((pkg, dir) => pipeWith(async (f, res) => f(await res, dir), hooks)(pkg, dir)); // eslint-disable-line @typescript-eslint/no-explicit-any
49
- return readPackageAndExtend;
50
- }
51
- function mergePackageExtensions(target, entries) {
52
- for (const [selector, packageExtension] of entries) {
53
- target[selector] = mergePackageExtension(target[selector], packageExtension);
54
- }
55
- }
56
- function mergePackageExtension(previous, next) {
57
- if (previous == null)
58
- return clonePackageExtension(next);
59
- const merged = clonePackageExtension(previous);
60
- for (const field of PACKAGE_EXTENSION_FIELDS) {
61
- if (next[field] == null)
62
- continue;
63
- merged[field] = {
64
- ...next[field],
65
- ...merged[field],
66
- };
67
- }
68
- return merged;
69
- }
70
- function clonePackageExtension(packageExtension) {
71
- const cloned = {};
72
- for (const field of PACKAGE_EXTENSION_FIELDS) {
73
- if (packageExtension[field] == null)
74
- continue;
75
- cloned[field] = { ...packageExtension[field] };
76
- }
77
- return cloned;
78
- }
79
- //# sourceMappingURL=createReadPackageHook.js.map
@@ -1,14 +0,0 @@
1
- import type { VersionOverride as VersionOverrideBase } from '@pnpm/config.parse-overrides';
2
- import type { ReadPackageHook } from '@pnpm/types';
3
- export type VersionOverrideWithoutRawSelector = Omit<VersionOverrideBase, 'selector'>;
4
- export interface CreateVersionsOverriderOptions {
5
- /**
6
- * Populated with every declared semver range seen for packages that have a
7
- * convergence override, whether or not the override's version satisfied it.
8
- * Feeds the staleness check for convergence overrides after a full
9
- * resolution. Edges claimed by an explicit override are not recorded — the
10
- * convergence override never governs them.
11
- */
12
- convergeDeclaredRanges?: Map<string, Set<string>>;
13
- }
14
- export declare function createVersionsOverrider(overrides: VersionOverrideWithoutRawSelector[], rootDir: string, opts?: CreateVersionsOverriderOptions): ReadPackageHook;
@@ -1,120 +0,0 @@
1
- import path from 'node:path';
2
- import { isValidPeerRange } from '@pnpm/deps.peer-range';
3
- import normalizePath from 'normalize-path';
4
- import { partition } from 'ramda';
5
- import semver from 'semver';
6
- import { isIntersectingRange } from './isIntersectingRange.js';
7
- export function createVersionsOverrider(overrides, rootDir, opts) {
8
- const [convergeOverrides, explicitOverrides] = partition(({ converge }) => converge === true, overrides);
9
- const [versionOverrides, genericVersionOverrides] = partition(({ parentPkg }) => parentPkg != null, explicitOverrides.map((override) => ({
10
- ...override,
11
- localTarget: createLocalTarget(override, rootDir),
12
- })));
13
- const convergeVersions = new Map(convergeOverrides.map((override) => [override.targetPkg.name, override.newBareSpecifier]));
14
- return ((manifest, dir) => {
15
- const versionOverridesWithParent = versionOverrides.filter(({ parentPkg }) => {
16
- return (parentPkg.name === manifest.name &&
17
- (!parentPkg.bareSpecifier || semver.satisfies(manifest.version, parentPkg.bareSpecifier)));
18
- });
19
- overrideDepsOfPkg({ manifest, dir }, versionOverridesWithParent, genericVersionOverrides, {
20
- convergeVersions,
21
- convergeDeclaredRanges: opts?.convergeDeclaredRanges,
22
- });
23
- return manifest;
24
- });
25
- }
26
- function createLocalTarget(override, rootDir) {
27
- let protocol;
28
- if (override.newBareSpecifier.startsWith('file:')) {
29
- protocol = 'file:';
30
- }
31
- else if (override.newBareSpecifier.startsWith('link:')) {
32
- protocol = 'link:';
33
- }
34
- else {
35
- return undefined;
36
- }
37
- const pkgPath = override.newBareSpecifier.substring(protocol.length);
38
- const specifiedViaRelativePath = !path.isAbsolute(pkgPath);
39
- const absolutePath = specifiedViaRelativePath ? path.join(rootDir, pkgPath) : pkgPath;
40
- return { absolutePath, specifiedViaRelativePath, protocol };
41
- }
42
- function overrideDepsOfPkg({ manifest, dir }, versionOverrides, genericVersionOverrides, convergeOpts) {
43
- const { dependencies, optionalDependencies, devDependencies, peerDependencies } = manifest;
44
- const _overrideDeps = overrideDeps.bind(null, { versionOverrides, genericVersionOverrides, dir, convergeOpts });
45
- for (const deps of [dependencies, optionalDependencies, devDependencies]) {
46
- if (deps) {
47
- _overrideDeps(deps, undefined);
48
- }
49
- }
50
- if (peerDependencies) {
51
- if (!manifest.dependencies)
52
- manifest.dependencies = {};
53
- _overrideDeps(manifest.dependencies, peerDependencies);
54
- }
55
- }
56
- function overrideDeps({ versionOverrides, genericVersionOverrides, dir, convergeOpts }, deps, peerDeps) {
57
- for (const [name, bareSpecifier] of Object.entries(peerDeps ?? deps)) {
58
- const versionOverride = pickMostSpecificVersionOverride(versionOverrides.filter(({ targetPkg }) => targetPkg.name === name && isIntersectingRange(targetPkg.bareSpecifier, bareSpecifier))) ??
59
- pickMostSpecificVersionOverride(genericVersionOverrides.filter(({ targetPkg }) => targetPkg.name === name && isIntersectingRange(targetPkg.bareSpecifier, bareSpecifier)));
60
- if (!versionOverride) {
61
- convergeDep(convergeOpts, { deps, peerDeps }, name, bareSpecifier);
62
- continue;
63
- }
64
- if (versionOverride.newBareSpecifier === '-') {
65
- if (peerDeps) {
66
- delete peerDeps[versionOverride.targetPkg.name];
67
- }
68
- else {
69
- delete deps[versionOverride.targetPkg.name];
70
- }
71
- continue;
72
- }
73
- const newBareSpecifier = versionOverride.localTarget
74
- ? `${versionOverride.localTarget.protocol}${resolveLocalOverride(versionOverride.localTarget, dir)}`
75
- : versionOverride.newBareSpecifier;
76
- if (peerDeps == null || !isValidPeerRange(newBareSpecifier)) {
77
- deps[versionOverride.targetPkg.name] = newBareSpecifier;
78
- }
79
- else if (isValidPeerRange(newBareSpecifier)) {
80
- peerDeps[versionOverride.targetPkg.name] = newBareSpecifier;
81
- }
82
- }
83
- }
84
- /**
85
- * A convergence override (`"pkg@": "<version>"`) rewrites a dependency edge
86
- * only when its version satisfies the edge's declared range, so incompatible
87
- * consumers keep their own resolution. Only plain semver ranges participate:
88
- * `workspace:`, `catalog:`, `npm:`, git/URL, and dist-tag specifiers have no
89
- * defined "satisfies" relation and are left untouched.
90
- */
91
- function convergeDep({ convergeVersions, convergeDeclaredRanges }, { deps, peerDeps }, name, bareSpecifier) {
92
- const convergeVersion = convergeVersions.get(name);
93
- if (convergeVersion == null || semver.validRange(bareSpecifier, true) == null)
94
- return;
95
- if (convergeDeclaredRanges != null) {
96
- let ranges = convergeDeclaredRanges.get(name);
97
- if (ranges == null) {
98
- ranges = new Set();
99
- convergeDeclaredRanges.set(name, ranges);
100
- }
101
- ranges.add(bareSpecifier);
102
- }
103
- if (!semver.satisfies(convergeVersion, bareSpecifier, true))
104
- return;
105
- if (peerDeps == null) {
106
- deps[name] = convergeVersion;
107
- }
108
- else {
109
- peerDeps[name] = convergeVersion;
110
- }
111
- }
112
- function resolveLocalOverride({ specifiedViaRelativePath, absolutePath }, pkgDir) {
113
- return specifiedViaRelativePath && pkgDir
114
- ? normalizePath(path.relative(pkgDir, absolutePath))
115
- : absolutePath;
116
- }
117
- function pickMostSpecificVersionOverride(versionOverrides) {
118
- return versionOverrides.sort((a, b) => isIntersectingRange(b.targetPkg.bareSpecifier ?? '', a.targetPkg.bareSpecifier ?? '') ? -1 : 1)[0];
119
- }
120
- //# sourceMappingURL=createVersionsOverrider.js.map
package/lib/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export { createReadPackageHook, getEffectivePackageExtensions } from './createReadPackageHook.js';
@@ -1 +0,0 @@
1
- export declare function isIntersectingRange(range1: string | undefined, range2: string): boolean;
@@ -1,9 +0,0 @@
1
- import semver from 'semver';
2
- export function isIntersectingRange(range1, range2) {
3
- return !range1 ||
4
- range2 === range1 ||
5
- semver.validRange(range2) != null &&
6
- semver.validRange(range1) != null &&
7
- semver.intersects(range2, range1);
8
- }
9
- //# sourceMappingURL=isIntersectingRange.js.map
@@ -1 +0,0 @@
1
- export declare function isSubRange(superRange: string | undefined, subRange: string): boolean;
package/lib/isSubRange.js DELETED
@@ -1,9 +0,0 @@
1
- import semver from 'semver';
2
- export function isSubRange(superRange, subRange) {
3
- return !superRange ||
4
- subRange === superRange ||
5
- semver.validRange(subRange) != null &&
6
- semver.validRange(superRange) != null &&
7
- semver.subset(subRange, superRange);
8
- }
9
- //# sourceMappingURL=isSubRange.js.map