@pnpm/pkg-manifest.utils 1100.1.2 → 1100.1.4

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.
@@ -19,8 +19,17 @@ export function convertEnginesRuntimeToDependencies(manifest, enginesFieldName,
19
19
  globalWarn(`Installation of ${runtimeName} versions is not supported in WebContainer`);
20
20
  }
21
21
  else {
22
- manifest[dependenciesFieldName] ??= {};
23
- manifest[dependenciesFieldName][runtimeName] = `runtime:${runtime.version}`;
22
+ const deps = (manifest[dependenciesFieldName] ??= {});
23
+ // Use Object.defineProperty so a future RUNTIME_NAMES entry that
24
+ // happens to match an inherited property name (`__proto__`,
25
+ // `constructor`, `prototype`) becomes a regular own data property
26
+ // instead of altering Object.prototype.
27
+ Object.defineProperty(deps, runtimeName, {
28
+ value: `runtime:${runtime.version}`,
29
+ enumerable: true,
30
+ writable: true,
31
+ configurable: true,
32
+ });
24
33
  }
25
34
  }
26
35
  }
@@ -32,15 +32,15 @@ export async function updateProjectManifestObject(prefix, packageManifest, packa
32
32
  const spec = packageSpec.bareSpecifier ?? findSpec(packageSpec.alias, packageManifest);
33
33
  if (spec) {
34
34
  packageManifest[packageSpec.saveType] = packageManifest[packageSpec.saveType] ?? {};
35
- packageManifest[packageSpec.saveType][packageSpec.alias] = spec;
35
+ defineDepEntry(packageManifest[packageSpec.saveType], packageSpec.alias, spec);
36
36
  for (const deptype of DEPENDENCIES_FIELDS) {
37
37
  if (deptype !== packageSpec.saveType) {
38
- delete packageManifest[deptype]?.[packageSpec.alias];
38
+ deleteDepEntry(packageManifest[deptype], packageSpec.alias);
39
39
  }
40
40
  }
41
41
  if (packageSpec.peer === true) {
42
42
  packageManifest.peerDependencies = packageManifest.peerDependencies ?? {};
43
- packageManifest.peerDependencies[packageSpec.alias] = getPeerSpecifier(spec, packageSpec.resolvedVersion, packageSpec.pinnedVersion);
43
+ defineDepEntry(packageManifest.peerDependencies, packageSpec.alias, getPeerSpecifier(spec, packageSpec.resolvedVersion, packageSpec.pinnedVersion));
44
44
  }
45
45
  }
46
46
  }
@@ -48,7 +48,7 @@ export async function updateProjectManifestObject(prefix, packageManifest, packa
48
48
  const usedDepType = guessDependencyType(packageSpec.alias, packageManifest) ?? 'dependencies';
49
49
  if (usedDepType !== 'peerDependencies') {
50
50
  packageManifest[usedDepType] = packageManifest[usedDepType] ?? {};
51
- packageManifest[usedDepType][packageSpec.alias] = packageSpec.bareSpecifier;
51
+ defineDepEntry(packageManifest[usedDepType], packageSpec.alias, packageSpec.bareSpecifier);
52
52
  }
53
53
  }
54
54
  }
@@ -60,10 +60,40 @@ export async function updateProjectManifestObject(prefix, packageManifest, packa
60
60
  }
61
61
  function findSpec(alias, manifest) {
62
62
  const foundDepType = guessDependencyType(alias, manifest);
63
- return foundDepType && manifest[foundDepType][alias];
63
+ if (foundDepType == null)
64
+ return undefined;
65
+ const deps = manifest[foundDepType];
66
+ return Object.hasOwn(deps, alias) ? deps[alias] : undefined;
64
67
  }
65
68
  export function guessDependencyType(alias, manifest) {
66
- return DEPENDENCIES_OR_PEER_FIELDS
67
- .find((depField) => manifest[depField]?.[alias] === '' || Boolean(manifest[depField]?.[alias]));
69
+ return DEPENDENCIES_OR_PEER_FIELDS.find((depField) => {
70
+ const deps = manifest[depField];
71
+ if (deps == null || !Object.hasOwn(deps, alias))
72
+ return false;
73
+ return deps[alias] === '' || Boolean(deps[alias]);
74
+ });
75
+ }
76
+ /**
77
+ * Write a dependency entry without risking prototype pollution: even when the
78
+ * alias matches a name like `__proto__`, `Object.defineProperty` creates a
79
+ * regular own data property rather than reaching through the setter.
80
+ */
81
+ function defineDepEntry(target, alias, value) {
82
+ Object.defineProperty(target, alias, {
83
+ value,
84
+ enumerable: true,
85
+ writable: true,
86
+ configurable: true,
87
+ });
88
+ }
89
+ /**
90
+ * Mirror of `defineDepEntry` for deletes. The `Object.hasOwn` guard keeps the
91
+ * `delete` from reaching into the prototype chain when the alias matches an
92
+ * inherited property like `constructor`.
93
+ */
94
+ function deleteDepEntry(target, alias) {
95
+ if (target != null && Object.hasOwn(target, alias)) {
96
+ delete target[alias];
97
+ }
68
98
  }
69
99
  //# sourceMappingURL=updateProjectManifestObject.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnpm/pkg-manifest.utils",
3
- "version": "1100.1.2",
3
+ "version": "1100.1.4",
4
4
  "description": "Utils for dealing with package manifest",
5
5
  "keywords": [
6
6
  "pnpm",
@@ -25,9 +25,9 @@
25
25
  ],
26
26
  "dependencies": {
27
27
  "semver": "^7.7.2",
28
- "@pnpm/core-loggers": "1100.0.2",
29
- "@pnpm/error": "1100.0.0",
28
+ "@pnpm/core-loggers": "1100.1.0",
30
29
  "@pnpm/deps.peer-range": "1100.0.1",
30
+ "@pnpm/error": "1100.0.0",
31
31
  "@pnpm/types": "1101.1.0"
32
32
  },
33
33
  "peerDependencies": {
@@ -36,8 +36,8 @@
36
36
  "devDependencies": {
37
37
  "@jest/globals": "30.3.0",
38
38
  "@types/semver": "7.7.1",
39
- "@pnpm/pkg-manifest.utils": "1100.1.2",
40
- "@pnpm/logger": "1100.0.0"
39
+ "@pnpm/logger": "1100.0.0",
40
+ "@pnpm/pkg-manifest.utils": "1100.1.4"
41
41
  },
42
42
  "engines": {
43
43
  "node": ">=22.13"