Skip to content

Update pnpm to v10.29.3#2866

Draft
renovate[bot] wants to merge 9 commits intodevelopfrom
renovate/pnpm
Draft

Update pnpm to v10.29.3#2866
renovate[bot] wants to merge 9 commits intodevelopfrom
renovate/pnpm

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Feb 18, 2026

This PR contains the following updates:

Package Change Age Confidence
pnpm (source) 10.28.2+sha512.41872f037ad22f7348e3b1debbaf7e867cfd448f2726d9cf74c08f19507c31d2c8e7a11525b983febc2df640b5438dee6023ebb1f84ed43cc2d654d2bc32626410.29.3 age confidence

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Release Notes

pnpm/pnpm (pnpm)

v10.29.3

Compare Source

v10.29.2

Compare Source

v10.29.1: pnpm 10.29.1

Compare Source

Minor Changes

  • The pnpm dlx / pnpx command now supports the catalog: protocol. Example: pnpm dlx shx@catalog:.
  • Support configuring auditLevel in the pnpm-workspace.yaml file #​10540.
  • Support bare workspace: protocol without version specifier. It is now treated as workspace:* and resolves to the concrete version during publish #​10436.

Patch Changes

  • Fixed pnpm list --json returning incorrect paths when using global virtual store #​10187.

  • Fix pnpm store path and pnpm store status using workspace root for path resolution when storeDir is relative #​10290.

  • Fixed pnpm run -r failing with "No projects matched the filters" when an empty pnpm-workspace.yaml exists #​10497.

  • Fixed a bug where catalogMode: strict would write the literal string "catalog:" to pnpm-workspace.yaml instead of the resolved version specifier when re-adding an existing catalog dependency #​10176.

  • Fixed the documentation URL shown in pnpm completion --help to point to the correct page at https://pnpm.io/completion #​10281.

  • Skip local file: protocol dependencies during pnpm fetch. This fixes an issue where pnpm fetch would fail in Docker builds when local directory dependencies were not available #​10460.

  • Fixed pnpm audit --json to respect the --audit-level setting for both exit code and output filtering #​10540.

  • update tar to version 7.5.7 to fix security issue

    Updating the version of dependency tar to 7.5.7 because the previous one have a security vulnerability reported here: CVE-2026-24842

  • Fix pnpm audit --fix replacing reference overrides (e.g. $foo) with concrete versions #​10325.

  • Fix shamefullyHoist set via updateConfig in .pnpmfile.cjs not being converted to publicHoistPattern #​10271.

  • pnpm help should correctly report if the currently running pnpm CLI is bundled with Node.js #​10561.

  • Add a warning when the current directory contains the PATH delimiter character. On macOS, folder names containing forward slashes (/) appear as colons (:) at the Unix layer. Since colons are PATH separators in POSIX systems, this breaks PATH injection for node_modules/.bin, causing binaries to not be found when running commands like pnpm exec #​10457.

Platinum Sponsors

Bit

Gold Sponsors

Discord CodeRabbit Workleap
Stackblitz Vite

Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Enabled.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot added Dependencies Pull requests that update a dependency file T-Task Tasks for the team like planning labels Feb 18, 2026
@dbkr
Copy link
Member

dbkr commented Feb 18, 2026

Seems like this upgrade is somehow causing electron-userland/electron-builder#9394

@renovate
Copy link
Contributor Author

renovate bot commented Feb 19, 2026

Edited/Blocked Notification

Renovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR.

You can manually request rebase by checking the rebase/retry box above.

⚠️ Warning: custom changes will be lost.

@t3chguy
Copy link
Member

t3chguy commented Feb 19, 2026

Blocked on electron-userland/electron-builder#9603

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
// Pick the version out of yarn berry patch syntax
// "patch:electron-updater@npm%3A6.4.1#~/.yarn/patches/electron-updater-npm-6.4.1-ef33e6cc39.patch"
if (updaterVersion.startsWith("patch:")) {
const match = updaterVersion.match(/@npm%3A(.+?)#/)

Check failure

Code scanning / CodeQL

Polynomial regular expression used on uncontrolled data High

This
regular expression
that depends on
library input
may run slow on strings starting with '@npm%3A' and with many repetitions of '@npm%3Aa'.
redirectCount = 0
): Promise<string> {
if (debug.enabled) {
debug(`Request: ${safeStringifyJson(options)}`)

Check failure

Code scanning / CodeQL

Clear-text logging of sensitive information High

This logs sensitive data returned by
process environment
as clear text.

Copilot Autofix

AI about 7 hours ago

In general, the safest approach is to avoid logging full request objects that may contain secrets. Instead, log only non‑sensitive metadata (HTTP method, hostname, path, timeout, etc.), or ensure that any logging that could include secrets uses a robust redaction mechanism with explicit allow‑listing of fields.

Here, the best minimal fix without changing behavior of HTTP requests is to change doApiRequest’s debug logging so that it does not stringify the entire options object. We can log only a subset of fields that are not sensitive (e.g., method, hostname, path, port, timeout) and omit headers entirely. This avoids the need to rely on safeStringifyJson’s heuristic, and ensures that authentication data coming from process.env can no longer reach the log sink at all.

Concretely, in electron-builder/packages/builder-util-runtime/src/httpExecutor.ts, within HttpExecutor.doApiRequest, replace:

if (debug.enabled) {
  debug(`Request: ${safeStringifyJson(options)}`)
}

with a call that logs a safe subset, for example:

if (debug.enabled) {
  const { method, hostname, path, port, timeout } = options
  debug(
    `Request: ${JSON.stringify(
      { method, hostname, path, port, timeout },
      null,
      2
    )}`
  )
}

This change is limited to the logging and does not affect request execution. No new imports or utilities are needed; we can use JSON.stringify directly and avoid touching safeStringifyJson itself (which may be used elsewhere).


Suggested changeset 1
electron-builder/packages/builder-util-runtime/src/httpExecutor.ts

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/electron-builder/packages/builder-util-runtime/src/httpExecutor.ts b/electron-builder/packages/builder-util-runtime/src/httpExecutor.ts
--- a/electron-builder/packages/builder-util-runtime/src/httpExecutor.ts
+++ b/electron-builder/packages/builder-util-runtime/src/httpExecutor.ts
@@ -109,7 +109,14 @@
     redirectCount = 0
   ): Promise<string> {
     if (debug.enabled) {
-      debug(`Request: ${safeStringifyJson(options)}`)
+      const { method, hostname, path, port, timeout } = options
+      debug(
+        `Request: ${JSON.stringify(
+          { method, hostname, path, port, timeout },
+          null,
+          2
+        )}`
+      )
     }
 
     return cancellationToken.createPromise<string>((resolve, reject, onCancel) => {
EOF
@@ -109,7 +109,14 @@
redirectCount = 0
): Promise<string> {
if (debug.enabled) {
debug(`Request: ${safeStringifyJson(options)}`)
const { method, hostname, path, port, timeout } = options
debug(
`Request: ${JSON.stringify(
{ method, hostname, path, port, timeout },
null,
2
)}`
)
}

return cancellationToken.createPromise<string>((resolve, reject, onCancel) => {
Copilot is powered by AI and may make mistakes. Always verify output.
requestProcessor: (request: T, reject: (error: Error) => void) => void
) {
if (debug.enabled) {
debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`)

Check failure

Code scanning / CodeQL

Clear-text logging of sensitive information High

This logs sensitive data returned by
process environment
as clear text.

Copilot Autofix

AI about 7 hours ago

In general, the fix is to ensure that logs never contain sensitive information, especially anything derived from secrets or environment configuration. For this case, the problematic sink is the response logging in HttpExecutor.handleResponse. We should avoid logging the full RequestOptions structure there, and instead log only a minimal, non-sensitive subset (status code, method, hostname, and a truncated path), or rely on upstream logging that already covers the request.

The best minimal-impact fix is:

  • Leave safeStringifyJson as-is (it’s used in other contexts).
  • Change handleResponse so it no longer logs safeStringifyJson(options). Instead, log a short message that includes only:
    • response.statusCode and response.statusMessage
    • options.method
    • options.hostname
    • a possibly truncated options.path (to avoid leaking long query strings that could contain identifiers)
  • This keeps the ability to debug HTTP responses while removing the path for sensitive data to reach logs.

Concretely:

  • File to edit: electron-builder/packages/builder-util-runtime/src/httpExecutor.ts
  • In HttpExecutor.handleResponse, replace:
    if (debug.enabled) {
      debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`)
    }
    with something like:
    if (debug.enabled) {
      const { method, hostname, path } = options
      const safePath = typeof path === "string" && path.length > 200 ? path.substring(0, 200) + "…" : path
      debug(`Response: ${response.statusCode} ${response.statusMessage} (method: ${method || "GET"}, host: ${hostname}, path: ${safePath})`)
    }
  • No new imports are needed; we only use basic string operations.

No changes are required in ArtifactPublisherTest.ts or keygenPublisher.ts because the primary risky logging occurs in httpExecutor.ts.


Suggested changeset 1
electron-builder/packages/builder-util-runtime/src/httpExecutor.ts

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/electron-builder/packages/builder-util-runtime/src/httpExecutor.ts b/electron-builder/packages/builder-util-runtime/src/httpExecutor.ts
--- a/electron-builder/packages/builder-util-runtime/src/httpExecutor.ts
+++ b/electron-builder/packages/builder-util-runtime/src/httpExecutor.ts
@@ -153,7 +153,11 @@
     requestProcessor: (request: T, reject: (error: Error) => void) => void
   ) {
     if (debug.enabled) {
-      debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`)
+      const { method, hostname, path } = options
+      const safePath = typeof path === "string" && path.length > 200 ? path.substring(0, 200) + "…" : path
+      debug(
+        `Response: ${response.statusCode} ${response.statusMessage} (method: ${method || "GET"}, host: ${hostname}, path: ${safePath})`
+      )
     }
 
     // we handle any other >= 400 error on request end (read detailed message in the response body)
EOF
@@ -153,7 +153,11 @@
requestProcessor: (request: T, reject: (error: Error) => void) => void
) {
if (debug.enabled) {
debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`)
const { method, hostname, path } = options
const safePath = typeof path === "string" && path.length > 200 ? path.substring(0, 200) + "…" : path
debug(
`Response: ${response.statusCode} ${response.statusMessage} (method: ${method || "GET"}, host: ${hostname}, path: ${safePath})`
)
}

// we handle any other >= 400 error on request end (read detailed message in the response body)
Copilot is powered by AI and may make mistakes. Always verify output.
].includes(level)
) {
// log error message to console so VITEST can capture stacktrace as well
console.log(message, fields)

Check failure

Code scanning / CodeQL

Clear-text logging of sensitive information High

This logs sensitive data returned by
an access to keychainPassword
as clear text.
This logs sensitive data returned by
an access to keychainPassword
as clear text.
This logs sensitive data returned by
an access to keyPasswords
as clear text.
This logs sensitive data returned by
an access to password
as clear text.
This logs sensitive data returned by
an access to password
as clear text.
This logs sensitive data returned by
process environment
as clear text.
This logs sensitive data returned by
process environment
as clear text.
This logs sensitive data returned by
process environment
as clear text.
This logs sensitive data returned by
process environment
as clear text.
return s
}

return `"${s.replace(/"/g, '\\"')}"`

Check failure

Code scanning / CodeQL

Incomplete string escaping or encoding High

This does not escape backslash characters in the input.

Copilot Autofix

AI about 7 hours ago

To fix the problem in general, the escaping routine should escape both double quotes and backslashes in a consistent way, so that any backslash in the original string cannot accidentally act as an escape for a following meta-character. This means replacing each single backslash with a double backslash, then replacing double quotes with an escaped form, before wrapping the entire string in quotes.

Concretely, in electron-builder/packages/electron-builder/src/cli/create-self-signed-cert.ts, we should update quoteString so it first escapes backslashes and then escapes double quotes. The function’s logic determining whether quoting is needed (if (!s.includes(",") && !s.includes('"'))) remains unchanged to preserve current behavior for simple names. Only the return statement should be adjusted so that s is transformed by both s.replace(/\\/g, "\\\\") and s.replace(/"/g, '\\"'), for example by chaining the replace calls. No additional imports or helpers are required.

Suggested changeset 1
electron-builder/packages/electron-builder/src/cli/create-self-signed-cert.ts

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/electron-builder/packages/electron-builder/src/cli/create-self-signed-cert.ts b/electron-builder/packages/electron-builder/src/cli/create-self-signed-cert.ts
--- a/electron-builder/packages/electron-builder/src/cli/create-self-signed-cert.ts
+++ b/electron-builder/packages/electron-builder/src/cli/create-self-signed-cert.ts
@@ -38,5 +38,5 @@
     return s
   }
 
-  return `"${s.replace(/"/g, '\\"')}"`
+  return `"${s.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`
 }
EOF
@@ -38,5 +38,5 @@
return s
}

return `"${s.replace(/"/g, '\\"')}"`
return `"${s.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`
}
Copilot is powered by AI and may make mistakes. Always verify output.
import { Provider, ProviderRuntimeOptions } from "./providers/Provider"

export function isUrlProbablySupportMultiRangeRequests(url: string): boolean {
return !url.includes("s3.amazonaws.com")

Check failure

Code scanning / CodeQL

Incomplete URL substring sanitization High

'
s3.amazonaws.com
' can be anywhere in the URL, and arbitrary hosts may come before or after it.

Copilot Autofix

AI about 7 hours ago

In general, instead of checking url.includes("host"), parse the URL and only check the hostname (or host) field so that hostPattern cannot be matched from the path/query/fragment or from unrelated hostnames. This avoids false positives where "s3.amazonaws.com" appears outside the actual host.

For this specific case, we should replace the substring check in isUrlProbablySupportMultiRangeRequests with logic that parses the URL and inspects the hostname. Using Node’s standard URL class is sufficient and does not require new dependencies. We should treat any URL whose hostname is exactly s3.amazonaws.com or ends with .s3.amazonaws.com as S3-like, and return false in that case; for all other hosts (or unparsable URLs) we keep the previous default behavior (true, meaning "probably supports multi-range requests"). To maintain robustness, wrap URL parsing in a try/catch and fall back to true (i.e., do not disable multi-range) if parsing fails.

Concretely in electron-builder/packages/electron-updater/src/providerFactory.ts:

  • Update isUrlProbablySupportMultiRangeRequests to:
    • Attempt new URL(url) and get hostname.
    • If hostname === "s3.amazonaws.com" or hostname.endsWith(".s3.amazonaws.com"), return false.
    • Otherwise return true.
  • No other code needs modification, and no new imports are required because URL is globally available in modern Node/Electron environments.
Suggested changeset 1
electron-builder/packages/electron-updater/src/providerFactory.ts

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/electron-builder/packages/electron-updater/src/providerFactory.ts b/electron-builder/packages/electron-updater/src/providerFactory.ts
--- a/electron-builder/packages/electron-updater/src/providerFactory.ts
+++ b/electron-builder/packages/electron-updater/src/providerFactory.ts
@@ -21,7 +21,16 @@
 import { Provider, ProviderRuntimeOptions } from "./providers/Provider"
 
 export function isUrlProbablySupportMultiRangeRequests(url: string): boolean {
-  return !url.includes("s3.amazonaws.com")
+  try {
+    const parsed = new URL(url)
+    const hostname = parsed.hostname
+    const isS3Amazonaws =
+      hostname === "s3.amazonaws.com" || hostname.endsWith(".s3.amazonaws.com")
+    return !isS3Amazonaws
+  } catch {
+    // If the URL cannot be parsed, fall back to assuming multi-range is supported
+    return true
+  }
 }
 
 export function createClient(data: PublishConfiguration | AllPublishOptions, updater: AppUpdater, runtimeOptions: ProviderRuntimeOptions): Provider<any> {
EOF
@@ -21,7 +21,16 @@
import { Provider, ProviderRuntimeOptions } from "./providers/Provider"

export function isUrlProbablySupportMultiRangeRequests(url: string): boolean {
return !url.includes("s3.amazonaws.com")
try {
const parsed = new URL(url)
const hostname = parsed.hostname
const isS3Amazonaws =
hostname === "s3.amazonaws.com" || hostname.endsWith(".s3.amazonaws.com")
return !isS3Amazonaws
} catch {
// If the URL cannot be parsed, fall back to assuming multi-range is supported
return true
}
}

export function createClient(data: PublishConfiguration | AllPublishOptions, updater: AppUpdater, runtimeOptions: ProviderRuntimeOptions): Provider<any> {
Copilot is powered by AI and may make mistakes. Always verify output.
config: {
toolsets,
cscLink: protectedCscLink,
cscKeyPassword: "test",

Check failure

Code scanning / SonarCloud

Credentials should not be hard-coded High test

Review this potentially hard-coded password. See more on SonarQube Cloud
config: {
toolsets,
cscLink: protectedCscLink,
cscKeyPassword: "test",

Check failure

Code scanning / SonarCloud

Credentials should not be hard-coded High test

Review this potentially hard-coded password. See more on SonarQube Cloud
config: {
toolsets,
cscLink: protectedCscLink,
cscKeyPassword: "test",

Check failure

Code scanning / SonarCloud

Credentials should not be hard-coded High test

Review this potentially hard-coded password. See more on SonarQube Cloud
config: {
toolsets,
cscLink: protectedCscLink,
cscKeyPassword: "test",

Check failure

Code scanning / SonarCloud

Credentials should not be hard-coded High test

Review this potentially hard-coded password. See more on SonarQube Cloud
},
win: {
signtoolOptions: {
certificatePassword: "pass",

Check failure

Code scanning / SonarCloud

Credentials should not be hard-coded High test

Review this potentially hard-coded password. See more on SonarQube Cloud
.replace(/{{/g, "<%")
.replace(/}}/g, "%>")
.replace(/\${([^}]+)}/g, "<%=$1%>")
return ejs.compile(template)

Check warning

Code scanning / SonarCloud

Templates should not be constructed dynamically Medium

Make sure this dynamically formatted template is safe here. See more on SonarQube Cloud
# cancel-in-progress: true

permissions:
contents: read

Check notice

Code scanning / SonarCloud

Read permissions should be defined at the job level Low test

Move this read permission from workflow level to job level. See more on SonarQube Cloud
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Dependencies Pull requests that update a dependency file T-Task Tasks for the team like planning

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants