@pnpm/hooks.read-package-hook 1100.2.5 → 1100.3.1

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,24 @@
1
1
  # @pnpm/hooks.read-package-hook
2
2
 
3
+ ## 1100.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies:
8
+ - @pnpm/config.parse-overrides@1100.1.5
9
+ - @pnpm/error@1100.1.4
10
+
11
+ ## 1100.3.0
12
+
13
+ ### Minor Changes
14
+
15
+ - `pnpm update` no longer moves the range a project declares for a dependency that `overrides` also lists, even when the override repeats that range verbatim. Previously the updated `package.json` disagreed with the lockfile, so the next `pnpm install --frozen-lockfile` failed with a specifier mismatch [#14224](https://github.com/pnpm/pnpm/issues/14224).
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies:
20
+ - @pnpm/types@1102.1.0
21
+
3
22
  ## 1100.2.5
4
23
 
5
24
  ### Patch Changes
@@ -1,5 +1,5 @@
1
1
  import type { VersionOverride as VersionOverrideBase } from '@pnpm/config.parse-overrides';
2
- import { type ReadPackageHook } from '@pnpm/types';
2
+ import { type DependenciesOrPeersField, type ProjectManifest, type ReadPackageHook } from '@pnpm/types';
3
3
  export type VersionOverrideWithoutRawSelector = Omit<VersionOverrideBase, 'selector'>;
4
4
  export interface CreateVersionsOverriderOptions {
5
5
  /**
@@ -26,4 +26,29 @@ export type DependencyOverrider = (name: string, bareSpecifier: string, dir?: st
26
26
  * project with no overrides — or with parent-scoped ones only.
27
27
  */
28
28
  export declare function createDependencyOverrider(overrides: VersionOverrideWithoutRawSelector[], rootDir: string): DependencyOverrider | undefined;
29
+ /**
30
+ * What an override needs to read to decide whether it claims a dependency: the
31
+ * parent half of a `parent>child` key is matched against the manifest's own
32
+ * name and version. Workspace projects may declare neither, so this is wider
33
+ * than {@link PackageManifest}.
34
+ */
35
+ export type OverridableManifest = Pick<ProjectManifest, 'name' | 'version' | DependenciesOrPeersField>;
36
+ /**
37
+ * Whether an override claims a dependency declared as `bareSpecifier` —
38
+ * whether or not it rewrites the text. The specifier is part of the question:
39
+ * a range-scoped override (`foo@^2`) claims one declaration of `foo` and not
40
+ * another, so an alias alone cannot answer it.
41
+ */
42
+ export type OverriddenDependencyMatcher = (alias: string, bareSpecifier: string) => boolean;
43
+ /**
44
+ * Builds an {@link OverriddenDependencyMatcher} for one manifest: a
45
+ * `parent>child` override key is matched against that manifest's own name and
46
+ * version, so a project asks only about the overrides that govern its own
47
+ * declarations. Binding to the manifest also selects those once, rather than
48
+ * once per dependency asked about.
49
+ *
50
+ * `undefined` when no override in the set could claim anything, so a caller
51
+ * with none configured skips the work entirely.
52
+ */
53
+ export declare function createOverriddenDependencyMatcher(overrides: VersionOverrideWithoutRawSelector[], rootDir: string): ((manifest: OverridableManifest) => OverriddenDependencyMatcher) | undefined;
29
54
  export declare function createVersionsOverrider(overrides: VersionOverrideWithoutRawSelector[], rootDir: string, opts?: CreateVersionsOverriderOptions): ReadPackageHook;
@@ -24,13 +24,34 @@ export function createDependencyOverrider(overrides, rootDir) {
24
24
  return convergeBareSpecifier(convergeVersions, name, bareSpecifier);
25
25
  };
26
26
  }
27
+ /**
28
+ * Builds an {@link OverriddenDependencyMatcher} for one manifest: a
29
+ * `parent>child` override key is matched against that manifest's own name and
30
+ * version, so a project asks only about the overrides that govern its own
31
+ * declarations. Binding to the manifest also selects those once, rather than
32
+ * once per dependency asked about.
33
+ *
34
+ * `undefined` when no override in the set could claim anything, so a caller
35
+ * with none configured skips the work entirely.
36
+ */
37
+ export function createOverriddenDependencyMatcher(overrides, rootDir) {
38
+ const { versionOverrides, genericVersionOverrides, convergeVersions } = splitOverrides(overrides, rootDir);
39
+ if (versionOverrides.length === 0 && genericVersionOverrides.length === 0 && convergeVersions.size === 0) {
40
+ return undefined;
41
+ }
42
+ return (manifest) => {
43
+ const overridesForManifest = {
44
+ versionOverrides: pickOverridesOfParent(versionOverrides, manifest),
45
+ genericVersionOverrides,
46
+ };
47
+ return (alias, bareSpecifier) => pickVersionOverride(overridesForManifest, alias, bareSpecifier) != null ||
48
+ convergeBareSpecifier(convergeVersions, alias, bareSpecifier) != null;
49
+ };
50
+ }
27
51
  export function createVersionsOverrider(overrides, rootDir, opts) {
28
52
  const { versionOverrides, genericVersionOverrides, convergeVersions } = splitOverrides(overrides, rootDir);
29
53
  return ((manifest, dir) => {
30
- const versionOverridesWithParent = versionOverrides.filter(({ parentPkg }) => {
31
- return (parentPkg.name === manifest.name &&
32
- (!parentPkg.bareSpecifier || semver.satisfies(manifest.version, parentPkg.bareSpecifier)));
33
- });
54
+ const versionOverridesWithParent = pickOverridesOfParent(versionOverrides, manifest);
34
55
  // The manifest may come from a shared cache, so the fields the overrides
35
56
  // rewrite are cloned instead of mutated in place.
36
57
  const clonedManifest = { ...manifest };
@@ -46,6 +67,14 @@ export function createVersionsOverrider(overrides, rootDir, opts) {
46
67
  return clonedManifest;
47
68
  });
48
69
  }
70
+ /**
71
+ * The parent-scoped overrides (`parent>child`) whose parent half this manifest
72
+ * answers to. The rest never govern its dependencies.
73
+ */
74
+ function pickOverridesOfParent(versionOverrides, manifest) {
75
+ return versionOverrides.filter(({ parentPkg }) => (parentPkg.name === manifest.name &&
76
+ (!parentPkg.bareSpecifier || (manifest.version != null && semver.satisfies(manifest.version, parentPkg.bareSpecifier)))));
77
+ }
49
78
  function splitOverrides(overrides, rootDir) {
50
79
  const [convergeOverrides, explicitOverrides] = partition(({ converge }) => converge === true, overrides);
51
80
  const [versionOverrides, genericVersionOverrides] = partition(({ parentPkg }) => parentPkg != null, explicitOverrides.map((override) => ({
package/lib/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { createReadPackageHook, getEffectivePackageExtensions } from './createReadPackageHook.js';
2
- export { createDependencyOverrider, type DependencyOverrider } from './createVersionsOverrider.js';
2
+ export { createDependencyOverrider, createOverriddenDependencyMatcher, type DependencyOverrider, type OverriddenDependencyMatcher } from './createVersionsOverrider.js';
package/lib/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { createReadPackageHook, getEffectivePackageExtensions } from './createReadPackageHook.js';
2
- export { createDependencyOverrider } from './createVersionsOverrider.js';
2
+ export { createDependencyOverrider, createOverriddenDependencyMatcher } from './createVersionsOverrider.js';
3
3
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnpm/hooks.read-package-hook",
3
- "version": "1100.2.5",
3
+ "version": "1100.3.1",
4
4
  "description": "Creates the default package reader hook used by pnpm",
5
5
  "keywords": [
6
6
  "pnpm",
@@ -28,11 +28,11 @@
28
28
  ],
29
29
  "dependencies": {
30
30
  "@pnpm/config.matcher": "1100.0.2",
31
- "@pnpm/config.parse-overrides": "1100.1.4",
31
+ "@pnpm/config.parse-overrides": "1100.1.5",
32
32
  "@pnpm/deps.peer-range": "1100.1.1",
33
- "@pnpm/error": "1100.1.3",
33
+ "@pnpm/error": "1100.1.4",
34
34
  "@pnpm/resolving.parse-wanted-dependency": "1100.0.2",
35
- "@pnpm/types": "1102.0.0",
35
+ "@pnpm/types": "1102.1.0",
36
36
  "@yarnpkg/extensions": "2.0.7",
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.2.5",
43
+ "@pnpm/hooks.read-package-hook": "1100.3.1",
44
44
  "@types/normalize-path": "^3.0.2",
45
45
  "@types/ramda": "0.32.0",
46
46
  "@types/semver": "7.8.0",