Skip to content

fix: allow exotic dependencies under workspace packages (pnpm/pnpm#13… - #13719

Merged
zkochan merged 1 commit into
pnpm:mainfrom
Ayush442842q:fix/13682-block-exotic-subdeps-catalog
Aug 17, 2026
Merged

fix: allow exotic dependencies under workspace packages (pnpm/pnpm#13…#13719
zkochan merged 1 commit into
pnpm:mainfrom
Ayush442842q:fix/13682-block-exotic-subdeps-catalog

Conversation

@Ayush442842q

@Ayush442842q Ayush442842q commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Summary

When blockExoticSubdeps is enabled, pnpm prevents resolving transitive subdependencies via exotic protocols (like git, url, or file). However, direct dependencies of workspace packages are explicitly declared by the user in the repository. They should not be blocked as "subdependencies" even when they are resolved at a depth > 0 (e.g., when a workspace app depends on a workspace package, which in turn depends on an exotic catalog dependency).

This PR:

  • Bypasses the blockExoticSubdeps check if the parent package was resolved via 'workspace' (indicating it is a workspace package).
  • Implements the fix in both the TypeScript and Rust (pacquet) dependency resolvers.
  • Adds corresponding tests for both implementations.

Closes #13682

Squash Commit Body

Allow exotic dependencies (git/url/file) when they are direct dependencies of workspace packages under blockExoticSubdeps.

- TS: Skip blockExoticSubdeps check in resolveDependencies if options.parentPkg.resolvedVia === 'workspace'.
- Rust: Thread parent_resolved_via Option through resolve_node and resolve_node_seed, bypassing checks when Some("workspace").
- Added TS integration test in blockExoticSubdeps.ts and Rust unit test in tests.rs.

Closes pnpm/pnpm#13682

Checklist

  • I checked the referenced issue and verified that none of the PRs
    already linked to it solves it.
  • The change is implemented in both the TypeScript CLI and the Rust
    pnpm/ port.
  • Added a changeset (pnpm changeset) if this PR changes any published
    package. Keep it short and written for pnpm users — it becomes a release note.
  • Added or updated tests.
  • Updated the documentation if needed.

View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Summary by CodeRabbit

  • Bug Fixes
    • Workspace packages can now use Git and other exotic transitive dependencies when exotic subdependencies are blocked.
    • Existing restrictions remain in place for exotic dependencies under packages resolved through other methods.
    • Improved dependency resolution consistency across fresh, recursive, and lockfile-based installations.

@Ayush442842q
Ayush442842q requested a review from zkochan as a code owner August 7, 2026 23:30
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 493baa6c-ddef-4745-888c-65faf79968fe

📥 Commits

Reviewing files that changed from the base of the PR and between 49ea66c and db50557.

📒 Files selected for processing (5)
  • pnpm/crates/resolving-deps-resolver/src/resolve_dependency_tree.rs
  • pnpm/crates/resolving-deps-resolver/src/resolve_dependency_tree/walk.rs
  • pnpm/crates/resolving-deps-resolver/src/tests.rs
  • pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts
  • pnpm11/installing/deps-resolver/src/resolveDependencies.ts
🚧 Files skipped from review as they are similar to previous changes (5)
  • pnpm/crates/resolving-deps-resolver/src/resolve_dependency_tree.rs
  • pnpm/crates/resolving-deps-resolver/src/tests.rs
  • pnpm11/installing/deps-resolver/src/resolveDependencies.ts
  • pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts
  • pnpm/crates/resolving-deps-resolver/src/resolve_dependency_tree/walk.rs

📝 Walkthrough

Walkthrough

Workspace provenance now flows through recursive dependency resolution. Exotic dependencies under workspace-resolved packages bypass blockExoticSubdeps rejection. Rust resolver tests and pnpm@11 integration tests cover Git and GitHub dependency cases.

Changes

Workspace exotic dependency handling

Layer / File(s) Summary
Propagate workspace provenance
pnpm/crates/resolving-deps-resolver/src/resolve_dependency_tree.rs, pnpm/crates/resolving-deps-resolver/src/resolve_dependency_tree/walk.rs, pnpm11/installing/deps-resolver/src/resolveDependencies.ts
Resolution paths forward parent workspace provenance and allow exotic children when the parent uses the workspace protocol.
Validate workspace resolution
pnpm/crates/resolving-deps-resolver/src/tests.rs, pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts
Tests verify Git and GitHub dependencies under workspace packages with blockExoticSubdeps enabled.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to db505

The change is localized to allowing explicitly declared exotic dependencies for workspace packages, with coverage in both resolver implementations; no actionable merge-blocking risk remains after normal checks and review.

Assessment against linked issues

Objective Addressed Explanation
Allow explicitly defined exotic dependencies under workspace packages when blockExoticSubdeps is enabled [#13682]

Suggested labels: product: pacquet, product: pnpm@11

Suggested reviewers: zkochan

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Aug 7, 2026

Copy link
Copy Markdown

Confidence Score: 4/5

The resolver fix appears functionally safe, but the required release changeset must be added before merging so the published behavior change enters the release plan.

The cross-stack behavior change affects published packages, while the current HEAD still has no changeset recording the affected packages, version intent, or user-facing release note.

Files Needing Attention: pnpm11/installing/deps-resolver/src/resolveDependencies.ts and the missing .changeset entry

Reviews (3): Last reviewed commit: "fix: allow exotic dependencies under wor..." | Re-trigger Greptile

Comment thread pnpm11/installing/deps-resolver/src/resolveDependencies.ts
Comment thread pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts (1)

122-123: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Remove comments that restate the test code.

Lines 122 and 144 repeat the dependency declaration and the test expectation. The test name and setup already state both facts.

Proposed cleanup
         version: '1.0.0',
         dependencies: {
-          // Direct git dependency in workspace project
           'is-negative': 'github:kevva/is-negative#1.0.0',
         },
       },
@@
-  // This should not fail even when blockExoticSubdeps is true
   await mutateModules(importers, testDefaults({

As per coding guidelines, comments must document non-obvious contracts or invariants and must not restate code.

Also applies to: 144-144

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts` around
lines 122 - 123, Remove the comments immediately above the dependency
declaration and the corresponding test expectation in the blockExoticSubdeps
test; keep the setup and assertions unchanged, since the comments only restate
what the code already expresses.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts`:
- Around line 145-149: Extend the test around mutateModules with assertions on
the resulting dependency tree: verify that project-1 links project-2 and that
project-2 installs is-negative. Keep the existing blockExoticSubdeps setup, but
inspect the installed module state rather than only relying on mutateModules
completing without throwing.

---

Nitpick comments:
In `@pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts`:
- Around line 122-123: Remove the comments immediately above the dependency
declaration and the corresponding test expectation in the blockExoticSubdeps
test; keep the setup and assertions unchanged, since the comments only restate
what the code already expresses.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 73437890-a21c-4109-996d-7f6ec1cd2f5e

📥 Commits

Reviewing files that changed from the base of the PR and between 6b6205b and 1b24180.

📒 Files selected for processing (4)
  • pnpm/crates/resolving-deps-resolver/src/resolve_dependency_tree.rs
  • pnpm/crates/resolving-deps-resolver/src/tests.rs
  • pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts
  • pnpm11/installing/deps-resolver/src/resolveDependencies.ts

Comment thread pnpm11/installing/deps-installer/test/install/blockExoticSubdeps.ts
@Ayush442842q
Ayush442842q force-pushed the fix/13682-block-exotic-subdeps-catalog branch from 1b24180 to caebfa4 Compare August 8, 2026 00:07
@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@codecov-commenter

codecov-commenter commented Aug 8, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 88.32%. Comparing base (49ea66c) to head (db50557).

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #13719   +/-   ##
=======================================
  Coverage   88.31%   88.32%           
=======================================
  Files         629      629           
  Lines      104352   104357    +5     
=======================================
+ Hits        92163    92175   +12     
+ Misses      12189    12182    -7     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Integrated-Benchmark Report (Linux)

Commit: db50557f95b7

Regular scenarios report direct and pnpr installs. The peer-heavy resolver scenario compares current Rust, main Rust, and TypeScript pnpm. Bencher consumes pacquet@HEAD and pnpr@HEAD.

The tables below show mean ± σ; Bencher thresholds on the minimum latency, which is far less perturbed by shared-runner contention (noise only adds time).

Scenario: Isolated linker: fresh restore, cold cache + cold store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 2.711 ± 0.173 2.409 2.913 1.75 ± 0.18
pacquet@main 2.581 ± 0.125 2.440 2.839 1.67 ± 0.16
pnpr@HEAD 1.545 ± 0.122 1.387 1.704 1.00
pnpr@main 1.550 ± 0.149 1.363 1.764 1.00 ± 0.13
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 2.71053186314,
      "stddev": 0.17298129060939935,
      "median": 2.7527560699399998,
      "user": 2.02553424,
      "system": 1.5973476,
      "min": 2.4087969019399997,
      "max": 2.91252952494
    },
    {
      "command": "pacquet@main",
      "mean": 2.58125870814,
      "stddev": 0.12535435441858936,
      "median": 2.56649584894,
      "user": 1.96974534,
      "system": 1.4639248000000002,
      "min": 2.44045010894,
      "max": 2.8391293429399997
    },
    {
      "command": "pnpr@HEAD",
      "mean": 1.5446909085400002,
      "stddev": 0.12213521370590584,
      "median": 1.55664179544,
      "user": 1.2209152399999998,
      "system": 1.2693366000000004,
      "min": 1.38651443694,
      "max": 1.70409562194
    },
    {
      "command": "pnpr@main",
      "mean": 1.5504314579399998,
      "stddev": 0.149486416452129,
      "median": 1.5608737429400001,
      "user": 1.2601550400000001,
      "system": 1.2811315,
      "min": 1.36265548394,
      "max": 1.76356987294
    }
  ]
}

Scenario: Isolated linker: fresh restore, hot cache + hot store

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 271.1 ± 9.1 254.4 282.2 1.00
pacquet@main 279.8 ± 17.1 249.0 313.5 1.03 ± 0.07
pnpr@HEAD 276.6 ± 11.0 259.9 296.7 1.02 ± 0.05
pnpr@main 291.2 ± 8.2 274.4 302.7 1.07 ± 0.05
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.27105353916,
      "stddev": 0.00905891471683406,
      "median": 0.27258904916000004,
      "user": 0.2442572,
      "system": 0.5278225799999999,
      "min": 0.25442370716,
      "max": 0.28215499016
    },
    {
      "command": "pacquet@main",
      "mean": 0.27975375906,
      "stddev": 0.017134694087588984,
      "median": 0.27794459766,
      "user": 0.25788289999999997,
      "system": 0.55127558,
      "min": 0.24902965216000003,
      "max": 0.31352574616
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.27658586556000003,
      "stddev": 0.011015752785528053,
      "median": 0.27692946366000004,
      "user": 0.22768249999999995,
      "system": 0.54644788,
      "min": 0.25989851516,
      "max": 0.29671719716
    },
    {
      "command": "pnpr@main",
      "mean": 0.2911953125600001,
      "stddev": 0.008193652529002575,
      "median": 0.29011633116,
      "user": 0.2612368,
      "system": 0.57262388,
      "min": 0.27443619316,
      "max": 0.30274937416000003
    }
  ]
}

Scenario: Isolated linker: repeat install, hot cache + hot store

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 8.6 ± 2.3 6.2 15.8 1.24 ± 0.36
pacquet@main 7.0 ± 0.7 6.0 10.8 1.01 ± 0.15
pnpr@HEAD 7.3 ± 0.7 6.2 10.7 1.06 ± 0.15
pnpr@main 6.9 ± 0.7 6.0 10.1 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.008579706026589584,
      "stddev": 0.00232215552459428,
      "median": 0.0078379752,
      "user": 0.00528228011560693,
      "system": 0.0033445142196531787,
      "min": 0.006247786700000001,
      "max": 0.0157673777
    },
    {
      "command": "pacquet@main",
      "mean": 0.007034306003621172,
      "stddev": 0.0007336612651885444,
      "median": 0.006767304700000001,
      "user": 0.004627790194986076,
      "system": 0.0024522191643454043,
      "min": 0.006047549700000001,
      "max": 0.0108294827
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.007330287583419691,
      "stddev": 0.0007397344018838529,
      "median": 0.007206991700000001,
      "user": 0.004823942279792743,
      "system": 0.0025556145077720214,
      "min": 0.0061822537,
      "max": 0.010661445700000001
    },
    {
      "command": "pnpr@main",
      "mean": 0.006941376026219511,
      "stddev": 0.0006919267062614224,
      "median": 0.006720897200000001,
      "user": 0.004694352317073169,
      "system": 0.0022935175609756103,
      "min": 0.0059913137000000005,
      "max": 0.0101356957
    }
  ]
}

Scenario: Isolated linker: repeat install, cold cache + hot store

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 7.3 ± 0.8 5.8 10.5 1.11 ± 0.15
pacquet@main 6.6 ± 0.5 5.7 8.3 1.00
pnpr@HEAD 6.8 ± 0.7 5.8 10.5 1.03 ± 0.13
pnpr@main 7.2 ± 0.8 6.1 10.7 1.10 ± 0.14
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.00731996269047619,
      "stddev": 0.0008076026909576944,
      "median": 0.0073972595,
      "user": 0.004735881904761905,
      "system": 0.0026531154285714294,
      "min": 0.005842247,
      "max": 0.010501607000000001
    },
    {
      "command": "pacquet@main",
      "mean": 0.006567663900355871,
      "stddev": 0.00047944640745560947,
      "median": 0.006460612,
      "user": 0.004438366263345198,
      "system": 0.0022041621352313157,
      "min": 0.005747889,
      "max": 0.008312427
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.006785427547619046,
      "stddev": 0.000686355849353222,
      "median": 0.006578052,
      "user": 0.004289439047619045,
      "system": 0.002570089404761906,
      "min": 0.00577466,
      "max": 0.010507680000000002
    },
    {
      "command": "pnpr@main",
      "mean": 0.007196217857575759,
      "stddev": 0.0007881927281714735,
      "median": 0.006972304,
      "user": 0.004720710909090909,
      "system": 0.002548081333333333,
      "min": 0.006053575,
      "max": 0.010666027000000002
    }
  ]
}

Scenario: Isolated linker: fresh install, cold cache + cold store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 2.790 ± 0.017 2.759 2.815 1.77 ± 0.15
pacquet@main 2.766 ± 0.026 2.728 2.813 1.75 ± 0.15
pnpr@HEAD 1.577 ± 0.135 1.458 1.854 1.00
pnpr@main 1.698 ± 0.133 1.476 1.851 1.08 ± 0.12
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 2.79045722662,
      "stddev": 0.017026860629833725,
      "median": 2.79531938702,
      "user": 1.7630821400000003,
      "system": 1.4302237599999996,
      "min": 2.7587040125200004,
      "max": 2.81504911352
    },
    {
      "command": "pacquet@main",
      "mean": 2.7660675167200006,
      "stddev": 0.02550982953856564,
      "median": 2.7605945920200003,
      "user": 1.6823856399999997,
      "system": 1.4014198599999999,
      "min": 2.7278470245200004,
      "max": 2.8128001195200003
    },
    {
      "command": "pnpr@HEAD",
      "mean": 1.5774255089199998,
      "stddev": 0.1354496085936675,
      "median": 1.5282384925199999,
      "user": 1.1670935400000002,
      "system": 1.2690088599999998,
      "min": 1.4584638965199999,
      "max": 1.85361710652
    },
    {
      "command": "pnpr@main",
      "mean": 1.6977593536199997,
      "stddev": 0.13252068786378796,
      "median": 1.71781162652,
      "user": 1.0895224399999999,
      "system": 1.3071435599999996,
      "min": 1.4755213975199999,
      "max": 1.8505682475199998
    }
  ]
}

Scenario: Isolated linker: fresh install, hot cache + hot store

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 446.4 ± 22.3 417.7 484.5 1.41 ± 0.09
pacquet@main 441.9 ± 21.0 415.9 484.1 1.40 ± 0.08
pnpr@HEAD 337.1 ± 21.3 303.5 363.9 1.07 ± 0.08
pnpr@main 316.1 ± 10.8 301.2 334.7 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.44637550338,
      "stddev": 0.022313147066666168,
      "median": 0.43741514038000007,
      "user": 0.55243008,
      "system": 0.6965709999999999,
      "min": 0.41768211338000005,
      "max": 0.48454684638000006
    },
    {
      "command": "pacquet@main",
      "mean": 0.4418695248800001,
      "stddev": 0.02103867898195737,
      "median": 0.4365722443800001,
      "user": 0.5241433799999999,
      "system": 0.7333392000000001,
      "min": 0.41590351438000006,
      "max": 0.4841498993800001
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.3371227771800001,
      "stddev": 0.021313112477076984,
      "median": 0.33414897088000006,
      "user": 0.24142747999999994,
      "system": 0.5565945,
      "min": 0.30354814438000005,
      "max": 0.36392453338
    },
    {
      "command": "pnpr@main",
      "mean": 0.31611448778000006,
      "stddev": 0.010799642048721775,
      "median": 0.31471855288000006,
      "user": 0.21495628,
      "system": 0.5542701,
      "min": 0.30119739938000006,
      "max": 0.33473863238000007
    }
  ]
}

Scenario: Isolated linker: fresh install, cold cache + hot store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 1.917 ± 0.016 1.900 1.950 6.02 ± 0.22
pacquet@main 1.894 ± 0.021 1.864 1.923 5.95 ± 0.23
pnpr@HEAD 0.318 ± 0.012 0.296 0.337 1.00
pnpr@main 0.321 ± 0.014 0.300 0.343 1.01 ± 0.06
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 1.9167983542000002,
      "stddev": 0.015758484679137263,
      "median": 1.9089385954,
      "user": 0.8273055600000001,
      "system": 0.7861488999999999,
      "min": 1.9001299664000002,
      "max": 1.9497294574000001
    },
    {
      "command": "pacquet@main",
      "mean": 1.8941823219,
      "stddev": 0.02092980580025804,
      "median": 1.8961828794000002,
      "user": 0.7853721599999999,
      "system": 0.7772702,
      "min": 1.8636163844000002,
      "max": 1.9234172974000001
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.3182008794000001,
      "stddev": 0.011511790729591952,
      "median": 0.3149160409,
      "user": 0.21261955999999996,
      "system": 0.5464417,
      "min": 0.2958560874,
      "max": 0.33745037640000003
    },
    {
      "command": "pnpr@main",
      "mean": 0.3206356105,
      "stddev": 0.014212844902351477,
      "median": 0.3239808449,
      "user": 0.21607275999999995,
      "system": 0.5573197,
      "min": 0.3004237954,
      "max": 0.34320201240000003
    }
  ]
}

Scenario: Isolated linker: fresh resolve, hot cache, offline

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 270.4 ± 53.0 215.9 368.5 2.76 ± 0.55
pacquet@main 242.6 ± 19.4 201.9 274.1 2.48 ± 0.21
pnpr@HEAD 99.5 ± 3.0 94.9 106.5 1.02 ± 0.04
pnpr@main 97.9 ± 2.7 92.5 104.9 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.27039500399666666,
      "stddev": 0.052952091000669534,
      "median": 0.25304528458000003,
      "user": 0.2185985066666667,
      "system": 0.07994263666666666,
      "min": 0.21592818908000003,
      "max": 0.36847547208000003
    },
    {
      "command": "pacquet@main",
      "mean": 0.24263971162545453,
      "stddev": 0.01938930160242902,
      "median": 0.24775514108000002,
      "user": 0.19443084000000005,
      "system": 0.0637008109090909,
      "min": 0.20192570008000002,
      "max": 0.27408642808
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.09949333984666667,
      "stddev": 0.0029535201660212834,
      "median": 0.09891761658,
      "user": 0.028937673333333334,
      "system": 0.013211886666666665,
      "min": 0.09490961608000001,
      "max": 0.10648150008
    },
    {
      "command": "pnpr@main",
      "mean": 0.09788041350857143,
      "stddev": 0.0026787846953456266,
      "median": 0.09720798358,
      "user": 0.02841266142857143,
      "system": 0.011809918571428569,
      "min": 0.09251303508,
      "max": 0.10494464708000001
    }
  ]
}

Scenario: Isolated linker: peer-heavy resolve, hot cache, offline

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 524.9 ± 52.1 458.2 600.3 1.00
pacquet@main 577.7 ± 130.4 469.3 869.6 1.10 ± 0.27
pnpm@HEAD 3247.4 ± 148.4 3052.5 3510.4 6.19 ± 0.68
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.5248766428955555,
      "stddev": 0.05212618643637823,
      "median": 0.51127712434,
      "user": 0.5053519422222221,
      "system": 0.10536531111111112,
      "min": 0.45821845334,
      "max": 0.60025205634
    },
    {
      "command": "pacquet@main",
      "mean": 0.5776607767844445,
      "stddev": 0.13040519091500208,
      "median": 0.53631401434,
      "user": 0.5554047199999999,
      "system": 0.12812853333333335,
      "min": 0.46934610234,
      "max": 0.86956361234
    },
    {
      "command": "pnpm@HEAD",
      "mean": 3.247350528784445,
      "stddev": 0.14843779462135123,
      "median": 3.22506322534,
      "user": 4.971555164444444,
      "system": 0.30689208888888886,
      "min": 3.05253375334,
      "max": 3.51044223334
    }
  ]
}

Scenario: Isolated linker: fresh restore, cold cache + cold store + cold pnpr

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 4.647 ± 0.196 4.473 5.040 1.30 ± 0.07
pacquet@main 4.668 ± 0.186 4.472 5.014 1.31 ± 0.07
pnpr@HEAD 3.614 ± 0.123 3.475 3.840 1.01 ± 0.05
pnpr@main 3.571 ± 0.116 3.454 3.800 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 4.646590645120001,
      "stddev": 0.19605782356382637,
      "median": 4.56180196872,
      "user": 2.16006554,
      "system": 1.6238068599999997,
      "min": 4.47334168322,
      "max": 5.03982171622
    },
    {
      "command": "pacquet@main",
      "mean": 4.66750195492,
      "stddev": 0.18586113333167625,
      "median": 4.60718992522,
      "user": 2.11412254,
      "system": 1.57572236,
      "min": 4.47187609122,
      "max": 5.01421816522
    },
    {
      "command": "pnpr@HEAD",
      "mean": 3.61393170802,
      "stddev": 0.12315264715010855,
      "median": 3.58380009572,
      "user": 1.36499954,
      "system": 1.3093929599999998,
      "min": 3.4754141882200003,
      "max": 3.83991097122
    },
    {
      "command": "pnpr@main",
      "mean": 3.5709802434199993,
      "stddev": 0.11634601926639275,
      "median": 3.5480094717200004,
      "user": 1.31769574,
      "system": 1.28958766,
      "min": 3.45447083022,
      "max": 3.80024852322
    }
  ]
}

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

🐰 Bencher Report

Projectpnpm's project
Branchpr/13719
Testbedpacquet
Click to view all benchmark results
BenchmarkLatencyBenchmark Result
milliseconds (ms)
(Result Δ%)
Upper Boundary
milliseconds (ms)
(Limit %)
isolated-linker.fresh-install.cold-cache.cold-store📈 view plot
🚷 view threshold
2,758.70 ms
(-1.13%)Baseline: 2,790.31 ms
3,348.37 ms
(82.39%)
isolated-linker.fresh-install.cold-cache.hot-store📈 view plot
🚷 view threshold
1,900.13 ms
(-0.80%)Baseline: 1,915.47 ms
2,298.57 ms
(82.67%)
isolated-linker.fresh-install.hot-cache.hot-store📈 view plot
🚷 view threshold
417.68 ms
(-10.35%)Baseline: 465.92 ms
559.11 ms
(74.70%)
isolated-linker.fresh-resolve.hot-cache.offline📈 view plot
🚷 view threshold
215.93 ms
(-3.74%)Baseline: 224.32 ms
269.19 ms
(80.21%)
isolated-linker.fresh-restore.cold-cache.cold-store📈 view plot
🚷 view threshold
2,408.80 ms
(-2.01%)Baseline: 2,458.33 ms
2,950.00 ms
(81.65%)
isolated-linker.fresh-restore.cold-cache.cold-store.cold-pnpr📈 view plot
🚷 view threshold
4,473.34 ms
(-0.92%)Baseline: 4,515.03 ms
5,418.03 ms
(82.56%)
isolated-linker.fresh-restore.hot-cache.hot-store📈 view plot
🚷 view threshold
254.42 ms
(-13.03%)Baseline: 292.56 ms
351.07 ms
(72.47%)
isolated-linker.peer-heavy-resolve.hot-cache.offline📈 view plot
🚷 view threshold
458.22 ms
(-10.46%)Baseline: 511.74 ms
614.09 ms
(74.62%)
isolated-linker.repeat-install.cold-cache.hot-store📈 view plot
🚷 view threshold
5.84 ms
isolated-linker.repeat-install.hot-cache.hot-store📈 view plot
🚷 view threshold
6.25 ms
🐰 View full continuous benchmarking report in Bencher

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

🐰 Bencher Report

Projectpnpm's project
Branchpr/13719
Testbedpnpr

⚠️ WARNING: No Threshold found!

Without a Threshold, no Alerts will ever be generated.

Click here to create a new Threshold
For more information, see the Threshold documentation.
To only post results if a Threshold exists, set the --ci-only-thresholds flag.

Click to view all benchmark results
BenchmarkLatencymilliseconds (ms)
isolated-linker.fresh-install.cold-cache.cold-store📈 view plot
⚠️ NO THRESHOLD
1,458.46 ms
isolated-linker.fresh-install.cold-cache.hot-store📈 view plot
⚠️ NO THRESHOLD
295.86 ms
isolated-linker.fresh-install.hot-cache.hot-store📈 view plot
⚠️ NO THRESHOLD
303.55 ms
isolated-linker.fresh-resolve.hot-cache.offline📈 view plot
⚠️ NO THRESHOLD
94.91 ms
isolated-linker.fresh-restore.cold-cache.cold-store📈 view plot
⚠️ NO THRESHOLD
1,386.51 ms
isolated-linker.fresh-restore.cold-cache.cold-store.cold-pnpr📈 view plot
⚠️ NO THRESHOLD
3,475.41 ms
isolated-linker.fresh-restore.hot-cache.hot-store📈 view plot
⚠️ NO THRESHOLD
259.90 ms
isolated-linker.repeat-install.cold-cache.hot-store📈 view plot
⚠️ NO THRESHOLD
5.77 ms
isolated-linker.repeat-install.hot-cache.hot-store📈 view plot
⚠️ NO THRESHOLD
6.18 ms
🐰 View full continuous benchmarking report in Bencher

@Ayush442842q
Ayush442842q force-pushed the fix/13682-block-exotic-subdeps-catalog branch from caebfa4 to db50557 Compare August 14, 2026 16:46
@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@zkochan
zkochan merged commit cf57dcb into pnpm:main Aug 17, 2026
36 checks passed
@Ayush442842q
Ayush442842q deleted the fix/13682-block-exotic-subdeps-catalog branch August 22, 2026 12:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

blockExoticSubdeps incorrectly blocks workspace catalog: ref

3 participants