<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>pnpm Blog</title>
        <link>https://pnpm.io/uk/blog</link>
        <description>pnpm Blog</description>
        <lastBuildDate>Wed, 27 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>uk</language>
        <item>
            <title><![CDATA[pnpm 11.4]]></title>
            <link>https://pnpm.io/uk/blog/releases/11.4</link>
            <guid>https://pnpm.io/uk/blog/releases/11.4</guid>
            <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 11.4 closes a cluster of supply-chain holes around lockfile integrity, credential scoping, git resolutions, patch files, and dependency aliases, makes tarball-integrity mismatches a hard install failure by default (with a narrowly-scoped --update-checksums opt-in), and changes pnpm runtime set to write to devEngines.runtime instead of engines.runtime by default.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 11.4 closes a cluster of supply-chain holes around lockfile integrity, credential scoping, git resolutions, patch files, and dependency aliases, makes tarball-integrity mismatches a hard install failure by default (with a narrowly-scoped <code>--update-checksums</code> opt-in), and changes <code>pnpm runtime set</code> to write to <code>devEngines.runtime</code> instead of <code>engines.runtime</code> by default.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/11.4#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="tarball-integrity-mismatches-are-now-a-hard-failure">Tarball-integrity mismatches are now a hard failure<a href="https://pnpm.io/uk/blog/releases/11.4#tarball-integrity-mismatches-are-now-a-hard-failure" class="hash-link" aria-label="Пряме посилання на Tarball-integrity mismatches are now a hard failure" title="Пряме посилання на Tarball-integrity mismatches are now a hard failure" translate="no">​</a></h3>
<p>Previously, <code>pnpm install</code> (non-frozen) would log <code>ERR_PNPM_TARBALL_INTEGRITY</code> when a downloaded tarball's hash didn't match the lockfile, silently re-resolve from the registry, and overwrite the locked integrity. A compromised registry, proxy, or republished version could therefore substitute attacker-controlled content on a clean machine even though the project shipped a committed lockfile.</p>
<p><code>pnpm install</code> now exits with <code>ERR_PNPM_TARBALL_INTEGRITY</code> and a hint pointing at the new opt-in flag.</p>
<p>The only opt-in is <strong><code>pnpm install --update-checksums</code></strong> — narrowly scoped to refreshing the locked integrity values from what the registry currently serves. It mirrors yarn's flag of the same name. A warning still prints when the bypass takes effect so the operation is auditable.</p>
<p><code>--force</code> and <code>pnpm update</code> deliberately do <strong>not</strong> bypass the integrity check. They are routine refresh operations; silently overwriting a locked integrity in those flows would erase the protection a committed lockfile is supposed to provide. <code>--frozen-lockfile</code> behavior is unchanged. <code>--fix-lockfile</code> keeps its documented purpose (filling in missing lockfile entries) and is also not a bypass.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-runtime-set-writes-to-devenginesruntime-by-default"><code>pnpm runtime set</code> writes to <code>devEngines.runtime</code> by default<a href="https://pnpm.io/uk/blog/releases/11.4#pnpm-runtime-set-writes-to-devenginesruntime-by-default" class="hash-link" aria-label="Пряме посилання на pnpm-runtime-set-writes-to-devenginesruntime-by-default" title="Пряме посилання на pnpm-runtime-set-writes-to-devenginesruntime-by-default" translate="no">​</a></h3>
<p><a href="https://pnpm.io/uk/cli/runtime"><code>pnpm runtime set &lt;name&gt; &lt;version&gt;</code></a> now saves the runtime to <code>devEngines.runtime</code> by default instead of <code>engines.runtime</code>. Pass <code>--save-prod</code> (or <code>-P</code>) to save it to <code>engines.runtime</code> instead. See <a href="https://github.com/pnpm/pnpm/issues/11948" target="_blank" rel="noopener noreferrer">#11948</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/11.4#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="security-unscoped-credentials-no-longer-leak-across-registries">Security: unscoped credentials no longer leak across registries<a href="https://pnpm.io/uk/blog/releases/11.4#security-unscoped-credentials-no-longer-leak-across-registries" class="hash-link" aria-label="Пряме посилання на Security: unscoped credentials no longer leak across registries" title="Пряме посилання на Security: unscoped credentials no longer leak across registries" translate="no">​</a></h3>
<p>An unscoped <code>_authToken</code> (or <code>_auth</code>, or <code>username</code> + <code>_password</code>, or <code>tokenHelper</code>) defined in one source — <code>~/.npmrc</code>, <code>~/.config/pnpm/auth.ini</code>, a workspace <code>.npmrc</code>, CLI flags, etc. — would be sent as an <code>Authorization</code> header to whichever registry a different (potentially untrusted) source named. The same exposure extended to client TLS credentials (<code>cert</code>, <code>key</code>).</p>
<p>pnpm now rewrites each unscoped per-registry setting (<code>_authToken</code>, <code>_auth</code>, <code>username</code>, <code>_password</code>, <code>tokenHelper</code>, <code>cert</code>, <code>key</code>) to its URL-scoped form at load time, using the <code>registry=</code> value declared in the same source (or the npmjs default registry if the source declares none). A later layer overriding <code>registry=</code> therefore cannot pull an unscoped credential along, because it is already pinned to the URL its author intended. <code>ca</code> / <code>cafile</code> are intentionally not rescoped — they're trust anchors, not credentials, and corporate MITM-proxy setups rely on them applying globally.</p>
<p>Every rescope emits a deprecation warning telling the user where the setting was pinned and how to write it directly. npm has rejected unscoped credentials outright since <code>npm@9</code>, and pnpm intends to remove support in a future major release. To target a specific registry, write the setting URL-scoped:</p>
<div class="language-ini codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">.npmrc</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-ini codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key attr-name" style="color:#00a4db">//registry.example.com/:_authToken</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">//registry.example.com/:cert</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">...</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="security-lockfile-entries-without-integrity-are-rejected">Security: lockfile entries without <code>integrity</code> are rejected<a href="https://pnpm.io/uk/blog/releases/11.4#security-lockfile-entries-without-integrity-are-rejected" class="hash-link" aria-label="Пряме посилання на security-lockfile-entries-without-integrity-are-rejected" title="Пряме посилання на security-lockfile-entries-without-integrity-are-rejected" translate="no">​</a></h3>
<p>Previously, the worker that extracts a downloaded tarball skipped hash verification when no integrity was supplied and minted a fresh one from the unverified bytes. An attacker who could both alter the lockfile (e.g. via a pull request that strips <code>integrity:</code>) and serve modified content at the referenced tarball URL could install a tampered package without any error — including under <code>--frozen-lockfile</code>.</p>
<p>pnpm now fails closed at lockfile-read time with <code>ERR_PNPM_MISSING_TARBALL_INTEGRITY</code>. Git-hosted tarballs (<code>gitHosted: true</code> or a URL on <code>codeload.github.com</code> / <code>bitbucket.org</code> / <code>gitlab.com</code>) and <code>file:</code> tarballs are exempt — the commit SHA in a git-host URL and the user-controlled local path already anchor the bytes.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="security-git-resolutions-reject-non-sha-commit-fields">Security: git resolutions reject non-SHA <code>commit</code> fields<a href="https://pnpm.io/uk/blog/releases/11.4#security-git-resolutions-reject-non-sha-commit-fields" class="hash-link" aria-label="Пряме посилання на security-git-resolutions-reject-non-sha-commit-fields" title="Пряме посилання на security-git-resolutions-reject-non-sha-commit-fields" translate="no">​</a></h3>
<p>Git resolutions whose <code>commit</code> field is not a 40-character hexadecimal SHA are rejected before <code>git</code> is invoked. A malicious lockfile could otherwise smuggle a value such as <code>--upload-pack=&lt;command&gt;</code> through <code>git fetch</code> / <code>git checkout</code>, which on SSH or local-file transports executes the supplied command.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="security-patch-files-writing-outside-the-package-directory-are-rejected">Security: patch files writing outside the package directory are rejected<a href="https://pnpm.io/uk/blog/releases/11.4#security-patch-files-writing-outside-the-package-directory-are-rejected" class="hash-link" aria-label="Пряме посилання на Security: patch files writing outside the package directory are rejected" title="Пряме посилання на Security: patch files writing outside the package directory are rejected" translate="no">​</a></h3>
<p>Patch files whose <code>diff --git</code> headers reference paths outside the patched package directory are now rejected. Previously a malicious <code>.patch</code> file added via a pull request could write, delete, or rename arbitrary files reachable by the user running <code>pnpm install</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="security-dependency-aliases-with-path-traversal-segments-are-rejected">Security: dependency aliases with path-traversal segments are rejected<a href="https://pnpm.io/uk/blog/releases/11.4#security-dependency-aliases-with-path-traversal-segments-are-rejected" class="hash-link" aria-label="Пряме посилання на Security: dependency aliases with path-traversal segments are rejected" title="Пряме посилання на Security: dependency aliases with path-traversal segments are rejected" translate="no">​</a></h3>
<p>Dependency aliases that contain path-traversal segments (such as <code>@x/../../../../../.git/hooks</code>) are rejected when read from a package manifest or symlinked into <code>node_modules</code>. A malicious registry package could otherwise use a transitive dependency key to make <code>pnpm install</code> create symlinks at attacker-chosen paths outside the intended <code>node_modules</code> directory.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="trusted-publisher-metadata-now-requires-provenance">Trusted-publisher metadata now requires provenance<a href="https://pnpm.io/uk/blog/releases/11.4#trusted-publisher-metadata-now-requires-provenance" class="hash-link" aria-label="Пряме посилання на Trusted-publisher metadata now requires provenance" title="Пряме посилання на Trusted-publisher metadata now requires provenance" translate="no">​</a></h3>
<p>Trusted publisher metadata is only treated as the strongest trust evidence when provenance is also present.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="other-fixes">Other fixes<a href="https://pnpm.io/uk/blog/releases/11.4#other-fixes" class="hash-link" aria-label="Пряме посилання на Other fixes" title="Пряме посилання на Other fixes" translate="no">​</a></h3>
<ul>
<li>Fix <code>pnpm deploy</code> crashing with <code>ENOENT: ... lstat '&lt;deployDir&gt;/node_modules'</code> when <code>configDependencies</code> declares pacquet (<code>pacquet</code> or <code>@pnpm/pacquet</code>). The deploy directory never installs config dependencies, so the install engine they designate isn't on disk to invoke; the nested install now skips them.</li>
<li>Limit concurrent project manifest reads while listing large workspaces to avoid <code>EMFILE</code> errors.</li>
<li>Validate <code>devEngines.runtime</code> and <code>engines.runtime</code> version ranges for <code>node</code>, <code>deno</code>, and <code>bun</code> when <code>onFail</code> is set to <code>error</code> or <code>warn</code>. Previously these settings only had an effect with <code>onFail: 'download'</code> — the <code>error</code> and <code>warn</code> modes silently did nothing <a href="https://github.com/pnpm/pnpm/issues/11818" target="_blank" rel="noopener noreferrer">#11818</a>. Violations now throw <code>ERR_PNPM_BAD_RUNTIME_VERSION</code>.</li>
<li>Improve the log message that pnpm prints after auto-adding entries to <code>minimumReleaseAgeExclude</code> when <code>minimumReleaseAge</code> is set without <code>minimumReleaseAgeStrict</code>. The message previously referred to the internal "loose mode" terminology, which wasn't searchable in the docs; it now tells the user to set <code>minimumReleaseAgeStrict</code> to <code>true</code> if they want these updates gated behind a prompt instead <a href="https://github.com/pnpm/pnpm/issues/11747" target="_blank" rel="noopener noreferrer">#11747</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 11.3]]></title>
            <link>https://pnpm.io/uk/blog/releases/11.3</link>
            <guid>https://pnpm.io/uk/blog/releases/11.3</guid>
            <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 11.3 adds support for npm's staged publishing (pnpm stage), the new trustLockfile setting for skipping the supply-chain verification pass on already-trusted lockfiles, and native implementations of pnpm pkg, pnpm repo, and pnpm set-script. It also adds a --skip-manifest-obfuscation flag for pack / publish and cuts the memory footprint of minimumReleaseAge / trustPolicy verification on large workspaces.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 11.3 adds support for npm's staged publishing (<code>pnpm stage</code>), the new <a href="https://pnpm.io/uk/settings#trustlockfile"><code>trustLockfile</code></a> setting for skipping the supply-chain verification pass on already-trusted lockfiles, and native implementations of <code>pnpm pkg</code>, <code>pnpm repo</code>, and <code>pnpm set-script</code>. It also adds a <code>--skip-manifest-obfuscation</code> flag for <code>pack</code> / <code>publish</code> and cuts the memory footprint of <code>minimumReleaseAge</code> / <code>trustPolicy</code> verification on large workspaces.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/11.3#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-stage"><code>pnpm stage</code><a href="https://pnpm.io/uk/blog/releases/11.3#pnpm-stage" class="hash-link" aria-label="Пряме посилання на pnpm-stage" title="Пряме посилання на pnpm-stage" translate="no">​</a></h3>
<p>A new <a href="https://pnpm.io/uk/cli/stage"><code>pnpm stage</code></a> command brings npm's <a href="https://docs.npmjs.com/staged-publishing" target="_blank" rel="noopener noreferrer">staged publishing</a> workflow to pnpm. Staged publishing lets you publish a version that's hidden from <code>npm install</code> until you explicitly approve it — useful for verifying release artifacts, smoke-testing CI, or coordinating multi-package releases.</p>
<p>The available subcommands are:</p>
<div class="language-sh codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-sh codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> stage publish    </span><span class="token comment" style="color:#999988;font-style:italic"># publish a version into staging</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> stage list       </span><span class="token comment" style="color:#999988;font-style:italic"># list staged versions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> stage view       </span><span class="token comment" style="color:#999988;font-style:italic"># view a staged version</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> stage approve    </span><span class="token comment" style="color:#999988;font-style:italic"># promote a staged version to the registry</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> stage reject     </span><span class="token comment" style="color:#999988;font-style:italic"># discard a staged version</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> stage download   </span><span class="token comment" style="color:#999988;font-style:italic"># download a staged tarball</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="trustlockfile"><code>trustLockfile</code><a href="https://pnpm.io/uk/blog/releases/11.3#trustlockfile" class="hash-link" aria-label="Пряме посилання на trustlockfile" title="Пряме посилання на trustlockfile" translate="no">​</a></h3>
<p>A new <a href="https://pnpm.io/uk/settings#trustlockfile"><code>trustLockfile</code></a> setting controls whether <code>pnpm install</code> re-applies the <a href="https://pnpm.io/uk/settings#minimumreleaseage"><code>minimumReleaseAge</code></a> / <code>trustPolicy: 'no-downgrade'</code> checks to every entry in the loaded lockfile. When <code>true</code>, the install treats the lockfile as already-trusted and skips the verification pass — useful for closed-source projects where every commit comes from a trusted author. The default is <code>false</code>, so verification stays on by default.</p>
<p>Set it in <code>pnpm-workspace.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">pnpm-workspace.yaml</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">trustLockfile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></span></code></pre></div></div>
<p>This release also cuts the <strong>memory footprint</strong> of the verification pass itself: the per-(registry, name) trust-meta cache previously retained the full packument — dependency graphs, scripts, README, and per-version manifests — for the entire install. On large workspaces (~4k lockfile entries with <code>minimumReleaseAge</code> + <code>trustPolicy: no-downgrade</code> enabled) this could OOM CI runners with a 2 GB heap cap. The cache now stores only the fields the trust check actually reads (<code>time</code>, per-version <code>_npmUser.trustedPublisher</code>, <code>dist.attestations.provenance</code>); the abbreviated-metadata cache is similarly projected to just the package-level <code>modified</code> field and the set of currently-listed version names. Fixes <a href="https://github.com/pnpm/pnpm/issues/11860" target="_blank" rel="noopener noreferrer">#11860</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="native-pnpm-pkg-pnpm-repo-and-pnpm-set-script">Native <code>pnpm pkg</code>, <code>pnpm repo</code>, and <code>pnpm set-script</code><a href="https://pnpm.io/uk/blog/releases/11.3#native-pnpm-pkg-pnpm-repo-and-pnpm-set-script" class="hash-link" aria-label="Пряме посилання на native-pnpm-pkg-pnpm-repo-and-pnpm-set-script" title="Пряме посилання на native-pnpm-pkg-pnpm-repo-and-pnpm-set-script" translate="no">​</a></h3>
<p>Three more commands that previously delegated to (or were missing without) npm are now implemented natively, following the npm command conventions:</p>
<ul>
<li><a href="https://pnpm.io/uk/cli/pkg"><strong><code>pnpm pkg</code></strong></a> — get / set / delete fields in <code>package.json</code>.</li>
<li><a href="https://pnpm.io/uk/cli/repo"><strong><code>pnpm repo</code></strong></a> — open the repository URL of a package in the browser.</li>
<li><a href="https://pnpm.io/uk/cli/set-script"><strong><code>pnpm set-script</code></strong></a> (alias <code>ss</code>) — add or update an entry in the <code>scripts</code> field of the project manifest. Supports <code>package.json</code>, <code>package.json5</code>, and <code>package.yaml</code> formats.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="--skip-manifest-obfuscation-for-pack-and-publish"><code>--skip-manifest-obfuscation</code> for <code>pack</code> and <code>publish</code><a href="https://pnpm.io/uk/blog/releases/11.3#--skip-manifest-obfuscation-for-pack-and-publish" class="hash-link" aria-label="Пряме посилання на --skip-manifest-obfuscation-for-pack-and-publish" title="Пряме посилання на --skip-manifest-obfuscation-for-pack-and-publish" translate="no">​</a></h3>
<p>A new <a href="https://pnpm.io/uk/cli/publish#--skip-manifest-obfuscation"><code>--skip-manifest-obfuscation</code></a> flag for <a href="https://pnpm.io/uk/cli/pack"><code>pnpm pack</code></a> and <a href="https://pnpm.io/uk/cli/publish"><code>pnpm publish</code></a> keeps the original <code>packageManager</code> field and publish lifecycle scripts in the packed/published manifest instead of stripping them. The pnpm-specific <code>pnpm</code> field continues to be omitted.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/11.3#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h2>
<ul>
<li>Fixed <code>pnpm dlx</code> failing with <code>ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND</code> when the installed package's CAS slot is missing its <code>package.json</code>. Observed in the wild for <code>pnpm dlx node@runtime:&lt;version&gt;</code> when the GVS slot was populated without the synthesized manifest runtime archives need. <code>dlx</code> now falls back to the scopeless package name when the slot's manifest is unreadable — for single-bin packages (the dlx common case, including every <code>runtime:</code> spec) this matches what <code>manifest.bin</code> would have named.</li>
<li>Fixed non-determinism in <code>pnpm dedupe</code> and <code>pnpm install</code> when a dependency graph contains packages with transitive peer dependencies on each other (e.g. <code>@aws-sdk/client-sts</code> and <code>@aws-sdk/client-sso-oidc</code>) and <code>auto-install-peers</code> is enabled. The lockfile no longer flips between two equally-valid forms across consecutive runs. The root cause was that <code>resolveDependencies</code> pushed onto its <code>pkgAddresses</code> / <code>postponedResolutionsQueue</code> arrays from inside <code>Promise.all</code>-spawned callbacks, so completion-order timing leaked into the array order and downstream cyclic-peer suffix assignment. Fixes <a href="https://github.com/pnpm/pnpm/issues/8155" target="_blank" rel="noopener noreferrer">#8155</a>.</li>
<li>Fixed a regression where <code>pnpm add &lt;github-shorthand&gt;</code> (and any other wanted-dependency whose alias can't be parsed from the user-supplied spec, e.g. tarball URLs or <code>pnpm/test-git-fetch#sha</code>) was silently dropped from the manifest update and from <code>pendingBuilds</code>.</li>
<li>Fixed <code>pnpm add --config</code> leaving orphan entries in <code>pnpm-lock.env.yaml</code> (the optional subdependencies of the previously resolved version of the updated config dependency).</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 11.2]]></title>
            <link>https://pnpm.io/uk/blog/releases/11.2</link>
            <guid>https://pnpm.io/uk/blog/releases/11.2</guid>
            <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 11.2 ships an experimental opt-in into pacquet (the Rust port of pnpm) as the install backend, expands config dependencies to install one level of optionalDependencies (so the esbuild/swc platform-binary pattern works for config deps too), wires up the long-documented pnpm login --scope flag, and surfaces runtime entries (Node.js, Deno, Bun) in pnpm outdated and pnpm update --interactive.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 11.2 ships an experimental opt-in into <a href="https://npmx.dev/package/@pnpm/pacquet" target="_blank" rel="noopener noreferrer">pacquet</a> (the Rust port of pnpm) as the install backend, expands <a href="https://pnpm.io/uk/config-dependencies">config dependencies</a> to install one level of <code>optionalDependencies</code> (so the esbuild/swc platform-binary pattern works for config deps too), wires up the long-documented <code>pnpm login --scope</code> flag, and surfaces runtime entries (Node.js, Deno, Bun) in <code>pnpm outdated</code> and <code>pnpm update --interactive</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/11.2#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="experimental-pacquet-as-the-install-backend">Experimental: pacquet as the install backend<a href="https://pnpm.io/uk/blog/releases/11.2#experimental-pacquet-as-the-install-backend" class="hash-link" aria-label="Пряме посилання на Experimental: pacquet as the install backend" title="Пряме посилання на Experimental: pacquet as the install backend" translate="no">​</a></h3>
<p>Adding <a href="https://npmx.dev/package/@pnpm/pacquet" target="_blank" rel="noopener noreferrer"><code>@pnpm/pacquet</code></a> (the Rust port of pnpm) to <code>configDependencies</code> in <code>pnpm-workspace.yaml</code> now delegates the materialization phase of <code>pnpm install</code> to the pacquet binary. pnpm still owns dependency resolution; pacquet only fetches and imports from the freshly-written lockfile. This is an opt-in preview of the Rust install engine — see <a href="https://github.com/pnpm/pnpm/issues/11723" target="_blank" rel="noopener noreferrer">#11723</a>.</p>
<p>To configure pacquet in a project, run:</p>
<div class="language-sh codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-sh codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> @pnpm/pacquet </span><span class="token parameter variable" style="color:#36acaa">--config</span><br></span></code></pre></div></div>
<p>You'll see changes in <code>pnpm-workspace.yaml</code> and <code>pnpm-lock.yaml</code> that should be committed. If you experience any issues with pacquet, please let us know in the GitHub issue you create.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="optionaldependencies-for-config-dependencies"><code>optionalDependencies</code> for config dependencies<a href="https://pnpm.io/uk/blog/releases/11.2#optionaldependencies-for-config-dependencies" class="hash-link" aria-label="Пряме посилання на optionaldependencies-for-config-dependencies" title="Пряме посилання на optionaldependencies-for-config-dependencies" translate="no">​</a></h3>
<p><a href="https://pnpm.io/uk/config-dependencies">Config dependencies</a> now resolve and install one level of <code>optionalDependencies</code> declared by the config dependency, with <code>os</code> / <code>cpu</code> / <code>libc</code> platform filtering applied at install time. This unlocks the esbuild/swc-style pattern where a package ships platform-specific binaries via <code>optionalDependencies</code> — a config dependency can now do the same and have the matching binary symlinked next to it in the global virtual store, so <code>require('pkg-platform-arch')</code> from inside the config dependency resolves correctly.</p>
<p>The env lockfile records all platform variants regardless of host platform, so it remains portable across machines. Each entry in a config dependency's <code>optionalDependencies</code> must declare an exact version — ranges and tags are rejected to keep installs reproducible.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-login---scope"><code>pnpm login --scope</code><a href="https://pnpm.io/uk/blog/releases/11.2#pnpm-login---scope" class="hash-link" aria-label="Пряме посилання на pnpm-login---scope" title="Пряме посилання на pnpm-login---scope" translate="no">​</a></h3>
<p>The long-documented <code>pnpm login --scope &lt;scope&gt;</code> flag is now implemented. The scope is normalized (a leading <code>@</code> is added if missing; blank values are ignored) and an <code>@&lt;scope&gt;:registry=&lt;registry&gt;</code> mapping is written to the pnpm auth file alongside the auth token. Subsequent installs of <code>@&lt;scope&gt;/*</code> packages then route to the chosen registry. Previously the documented flag errored with <code>Unknown option: 'scope'</code>. See <a href="https://github.com/pnpm/pnpm/issues/11716" target="_blank" rel="noopener noreferrer">#11716</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="runtimes-in-outdated-and-update---interactive">Runtimes in <code>outdated</code> and <code>update --interactive</code><a href="https://pnpm.io/uk/blog/releases/11.2#runtimes-in-outdated-and-update---interactive" class="hash-link" aria-label="Пряме посилання на runtimes-in-outdated-and-update---interactive" title="Пряме посилання на runtimes-in-outdated-and-update---interactive" translate="no">​</a></h3>
<p><a href="https://pnpm.io/uk/cli/outdated"><code>pnpm outdated</code></a> and <a href="https://pnpm.io/uk/cli/update"><code>pnpm update --interactive</code></a> now report Node.js, Deno, and Bun runtimes installed as project dependencies (<code>runtime:</code> specifiers). Previously these were silently skipped.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/11.2#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h2>
<ul>
<li>Fixed <code>cafile=&lt;relative-path&gt;</code> in <code>.npmrc</code> being read from the wrong directory when pnpm is invoked from a different cwd (e.g. <code>pnpm --dir &lt;project&gt; install</code> from a CI wrapper or monorepo script). The path is now resolved against the directory of the <code>.npmrc</code> that declared it, not <code>process.cwd()</code>. Before this fix, the install proceeded without the configured CA and the user only saw TLS errors against a private registry with no log line tying back to the wrongly resolved path <a href="https://github.com/pnpm/pnpm/issues/11624" target="_blank" rel="noopener noreferrer">#11624</a>.</li>
<li>Fixed <code>config.registry</code> getting a trailing slash appended when <code>registry</code> is set in <code>.npmrc</code> and no <code>registries.default</code> is provided by <code>pnpm-workspace.yaml</code>.</li>
<li>Fixed global add/update to handle <code>minimumReleaseAge</code> policy violations instead of surfacing an internal resolver guardrail error.</li>
<li>Fixed two crashes with <code>injectWorkspacePackages: true</code> when the lockfile has been pruned (e.g. by <code>turbo prune --docker</code>): a <code>Cannot use 'in' operator to search for 'directory' in undefined</code> from peer-dependency-variant injected snapshots whose base <code>packages:</code> entry had been dropped, and an <code>ERR_PNPM_ENOENT</code> on <code>node_modules/.bin/&lt;tool&gt;</code> after <code>prepare</code> / <code>postinstall</code> re-imported each injected workspace package.</li>
<li>Fixed <code>pnpm login</code> and <code>pnpm logout</code> ignoring <code>registries.default</code> from <code>pnpm-workspace.yaml</code> <a href="https://github.com/pnpm/pnpm/issues/10099" target="_blank" rel="noopener noreferrer">#10099</a>.</li>
<li>Fixed the <code>minimumReleaseAge</code> (publishedBy) maturity shortcut to be inclusive at the cutoff. Previously, abbreviated metadata whose <code>modified</code> field equalled the cutoff fell off the fast path and triggered a full-metadata re-fetch (or a <code>MISSING_TIME</code> error when full metadata wasn't permitted).</li>
<li>Honor <code>publishConfig.access</code> when publishing packages.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="1121">11.2.1<a href="https://pnpm.io/uk/blog/releases/11.2#1121" class="hash-link" aria-label="Пряме посилання на 11.2.1" title="Пряме посилання на 11.2.1" translate="no">​</a></h2>
<ul>
<li>Mark optional subdependency snapshots of config dependencies with <code>optional: true</code> in the env lockfile, matching how optional dependencies are recorded elsewhere in <code>pnpm-lock.yaml</code>. Previously, snapshots for the platform-specific subdeps pulled in via a config dep's <code>optionalDependencies</code> were written as empty objects.</li>
<li>Fixed <code>pickRegistryForPackage</code> returning the wrong registry for an unscoped <code>npm:</code> alias under a scoped local name. A manifest entry like <code>"@private/foo": "npm:lodash@^1"</code> was routing the <code>lodash</code> fetch through <code>registries["@private"]</code>, even though <code>lodash</code> is unscoped.</li>
<li>Don't print <code>Installing config dependencies...</code> when config dependencies are already installed and nothing needs to be fetched, re-linked, or removed.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="1122">11.2.2<a href="https://pnpm.io/uk/blog/releases/11.2#1122" class="hash-link" aria-label="Пряме посилання на 11.2.2" title="Пряме посилання на 11.2.2" translate="no">​</a></h2>
<ul>
<li>When the install engine is delegated to pacquet via <code>configDependencies</code>, the user's CLI flags passed to <code>pnpm install</code> (e.g. <code>--no-runtime</code>, <code>--prod</code>, <code>--dev</code>, <code>--no-optional</code>, <code>--node-linker</code>, <code>--cpu</code> / <code>--os</code> / <code>--libc</code>, <code>--offline</code>, <code>--prefer-offline</code>) are now forwarded to pacquet's <code>install</code> subcommand verbatim. Previously pacquet was invoked with a fixed argument list, so flags like <code>--no-runtime</code> were silently dropped. Flag forwarding is gated on the command being <code>install</code> / <code>i</code>; <code>add</code>, <code>update</code>, and <code>dedupe</code> still don't forward (their flag surface doesn't line up with pacquet's <code>install</code>).</li>
<li>Fixed <code>pnpm up</code> (and <code>pnpm add</code> / <code>pnpm remove</code>) failing with <code>pacquet_package_manager::outdated_lockfile</code> when pacquet is declared in <code>configDependencies</code>. pnpm now passes <code>--ignore-manifest-check</code> to pacquet so its <code>--frozen-lockfile</code> check doesn't fire against the (pre-mutation) <code>package.json</code> pnpm hasn't written yet <a href="https://github.com/pnpm/pnpm/issues/11797" target="_blank" rel="noopener noreferrer">#11797</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 11.1]]></title>
            <link>https://pnpm.io/uk/blog/releases/11.1</link>
            <guid>https://pnpm.io/uk/blog/releases/11.1</guid>
            <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 11.1 adds a few new commands — pnpm audit signatures, pnpm bugs, and pnpm owner — alongside support for installing from arbitrary named registries (including a built-in alias for the GitHub Packages npm registry), the ability to skip runtime installation in CI, and several fixes.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 11.1 adds a few new commands — <a href="https://pnpm.io/uk/cli/audit#signatures"><code>pnpm audit signatures</code></a>, <a href="https://pnpm.io/uk/cli/bugs"><code>pnpm bugs</code></a>, and <a href="https://pnpm.io/uk/cli/owner"><code>pnpm owner</code></a> — alongside support for installing from arbitrary named registries (including a built-in alias for the GitHub Packages npm registry), the ability to skip runtime installation in CI, and several fixes.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/11.1#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-audit-signatures"><code>pnpm audit signatures</code><a href="https://pnpm.io/uk/blog/releases/11.1#pnpm-audit-signatures" class="hash-link" aria-label="Пряме посилання на pnpm-audit-signatures" title="Пряме посилання на pnpm-audit-signatures" translate="no">​</a></h3>
<p>A new <a href="https://pnpm.io/uk/cli/audit#signatures"><code>pnpm audit signatures</code></a> subcommand verifies ECDSA registry signatures for installed packages against keys published at <code>/-/npm/v1/keys</code> <a href="https://github.com/pnpm/pnpm/issues/7909" target="_blank" rel="noopener noreferrer">#7909</a>. Scoped registries are respected; registries that don't publish signing keys are skipped.</p>
<div class="language-sh codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-sh codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> audit signatures</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="named-registries-and-a-built-in-gh-alias">Named registries (and a built-in <code>gh:</code> alias)<a href="https://pnpm.io/uk/blog/releases/11.1#named-registries-and-a-built-in-gh-alias" class="hash-link" aria-label="Пряме посилання на named-registries-and-a-built-in-gh-alias" title="Пряме посилання на named-registries-and-a-built-in-gh-alias" translate="no">​</a></h3>
<p>You can now install packages from the <a href="https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry" target="_blank" rel="noopener noreferrer">GitHub Packages npm registry</a> via a built-in <code>gh:</code> prefix, and — more broadly — from arbitrary named registries in the style of <a href="https://docs.vlt.sh/cli/registries" target="_blank" rel="noopener noreferrer">vlt's named-registry aliases</a>:</p>
<div class="language-sh codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-sh codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> gh:@acme/private</span><br></span></code></pre></div></div>
<p>Authentication is picked up from existing per-URL <code>.npmrc</code> entries (e.g. <code>//npm.pkg.github.com/:_authToken=...</code>), so no separate auth mechanism is required.</p>
<p>Additional aliases — or an override for the built-in <code>gh</code> alias, for GitHub Enterprise Server — can be configured under <code>namedRegistries</code> in <code>pnpm-workspace.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">pnpm-workspace.yaml</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">namedRegistries</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">gh</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//npm.pkg.github.example.com/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">work</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//npm.work.example.com/</span><br></span></code></pre></div></div>
<p>With this, <code>work:@corp/lib@^2.0.0</code> resolves against <code>https://npm.work.example.com/</code>. Див. <a href="https://github.com/pnpm/pnpm/issues/8941" target="_blank" rel="noopener noreferrer">#8941</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="--sbom-spec-version"><code>--sbom-spec-version</code><a href="https://pnpm.io/uk/blog/releases/11.1#--sbom-spec-version" class="hash-link" aria-label="Пряме посилання на --sbom-spec-version" title="Пряме посилання на --sbom-spec-version" translate="no">​</a></h3>
<p><a href="https://pnpm.io/uk/cli/sbom"><code>pnpm sbom</code></a> now accepts a <code>--sbom-spec-version</code> flag to choose the CycloneDX specification version (<code>1.5</code>, <code>1.6</code>, or <code>1.7</code> — default <code>1.7</code>). The flag is only valid with <code>--sbom-format cyclonedx</code>. Див. <a href="https://github.com/pnpm/pnpm/pull/11389" target="_blank" rel="noopener noreferrer">#11389</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="--no-runtime-for-ci-matrices"><code>--no-runtime</code> for CI matrices<a href="https://pnpm.io/uk/blog/releases/11.1#--no-runtime-for-ci-matrices" class="hash-link" aria-label="Пряме посилання на --no-runtime-for-ci-matrices" title="Пряме посилання на --no-runtime-for-ci-matrices" translate="no">​</a></h3>
<p>A new <code>--no-runtime</code> flag (config: <code>runtime=false</code>) skips installing runtime entries (e.g. Node.js downloaded via <code>devEngines.runtime</code>) without modifying the lockfile. The lockfile keeps the runtime entry so frozen-lockfile validation still passes; only the runtime fetch and <code>.bin</code> linking are skipped. This is useful in CI matrices where the runtime is provisioned externally (e.g. via <code>pnpm runtime -g set node &lt;version&gt;</code>) before <code>pnpm install</code> runs.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-bugs"><code>pnpm bugs</code><a href="https://pnpm.io/uk/blog/releases/11.1#pnpm-bugs" class="hash-link" aria-label="Пряме посилання на pnpm-bugs" title="Пряме посилання на pnpm-bugs" translate="no">​</a></h3>
<p>The new <a href="https://pnpm.io/uk/cli/bugs"><code>pnpm bugs</code></a> command opens a package's bug tracker URL in the browser. With no arguments, it reads the current project's <code>package.json</code>; with one or more package names, it fetches each package's metadata from the registry and opens its bug tracker. It falls back to <code>&lt;repository&gt;/issues</code> when the <code>bugs</code> field is missing. Див. <a href="https://github.com/pnpm/pnpm/pull/11279" target="_blank" rel="noopener noreferrer">#11279</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-owner"><code>pnpm owner</code><a href="https://pnpm.io/uk/blog/releases/11.1#pnpm-owner" class="hash-link" aria-label="Пряме посилання на pnpm-owner" title="Пряме посилання на pnpm-owner" translate="no">​</a></h3>
<p>The new <a href="https://pnpm.io/uk/cli/owner"><code>pnpm owner</code></a> command manages package owners on the registry:</p>
<div class="language-sh codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-sh codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> owner </span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">package</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> owner </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">package</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">user</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> owner </span><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">package</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">user</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/11.1#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h2>
<ul>
<li>
<p><code>pnpm view</code> now prints "published X ago by Y" alongside the rest of its output, mirroring <code>npm view</code>. This is useful when comparing against <code>minimumReleaseAge</code>. For example, <code>pnpm view pnpm</code> now shows <code>published 17 hours ago by GitHub Actions</code>.</p>
</li>
<li>
<p><code>pnpm publish</code> now honors the configured HTTP/HTTPS proxy (including the <code>https_proxy</code> / <code>http_proxy</code> / <code>no_proxy</code> environment variables) when polling the registry's <code>doneUrl</code> during the web-based authentication flow. Previously the poll bypassed the proxy, causing the registry to respond <code>403</code> from a different source IP and the login to never complete <a href="https://github.com/pnpm/pnpm/issues/11561" target="_blank" rel="noopener noreferrer">#11561</a>.</p>
</li>
<li>
<p><code>pnpm add -g</code> now installs each space-separated package into its own isolated directory by default. To bundle multiple packages into the same isolated install (so they share dependencies and are removed together), pass them as a comma-separated list. Наприклад:</p>
<ul>
<li><code>pnpm add -g foo bar</code> installs <code>foo</code> and <code>bar</code> as two independent globals — removing one does not affect the other.</li>
<li><code>pnpm add -g foo,bar qar</code> bundles <code>foo</code> and <code>bar</code> into a single isolated install while <code>qar</code> is installed on its own.</li>
</ul>
<p>Related: <a href="https://github.com/pnpm/pnpm/issues/11587" target="_blank" rel="noopener noreferrer">#11587</a>.</p>
</li>
<li>
<p><code>pnpm runtime set &lt;name&gt; &lt;version&gt;</code> no longer fails in the root of a multi-package workspace with the <code>ADDING_TO_ROOT</code> error. Installing the workspace root is a valid target for a runtime, so the command now bypasses that safety check.</p>
</li>
<li>
<p>Fixed <code>pnpm --version</code> hanging for the lifetime of the worker pool after the version was printed. The CLI entry now runs <code>finishWorkers()</code> from its own <code>finally</code>, so every exit path tears the pool down.</p>
</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 11.0]]></title>
            <link>https://pnpm.io/uk/blog/releases/11.0</link>
            <guid>https://pnpm.io/uk/blog/releases/11.0</guid>
            <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 11 is here! This release tightens the security defaults introduced throughout the v10 cycle, drops the npm CLI fallback for publishing in favor of a native implementation, replaces the JSON-per-package store index with a single SQLite database, and isolates global installs so they no longer interfere with each other.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 11 is here! This release tightens the security defaults introduced throughout the v10 cycle, drops the npm CLI fallback for publishing in favor of a native implementation, replaces the JSON-per-package store index with a single SQLite database, and isolates global installs so they no longer interfere with each other.</p>
<p>It also requires Node.js 22 or newer — pnpm itself is now pure ESM.</p>
<p>Upgrading from v10? See the <a href="https://pnpm.io/uk/migration">Migrating from v10 to v11</a> guide. Most config changes are mechanical and can be applied by the <code>pnpm-v10-to-v11</code> codemod.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="highlights">Highlights<a href="https://pnpm.io/uk/blog/releases/11.0#highlights" class="hash-link" aria-label="Пряме посилання на Highlights" title="Пряме посилання на Highlights" translate="no">​</a></h2>
<ul>
<li><strong>Node.js 22+ required.</strong> Support for Node 18, 19, 20, and 21 is dropped. The standalone executable requires glibc 2.27 or newer.</li>
<li><strong>Supply-chain protection on by default.</strong> <a href="https://pnpm.io/uk/settings#minimumreleaseage"><code>minimumReleaseAge</code></a> defaults to <code>1440</code> (1 day) and <a href="https://pnpm.io/uk/settings#blockexoticsubdeps"><code>blockExoticSubdeps</code></a> defaults to <code>true</code>.</li>
<li><strong><code>allowBuilds</code> replaces the legacy build-dependency settings.</strong> <code>onlyBuiltDependencies</code>, <code>onlyBuiltDependenciesFile</code>, <code>neverBuiltDependencies</code>, <code>ignoredBuiltDependencies</code>, and <code>ignoreDepScripts</code> are gone.</li>
<li><strong>Global installs are isolated and use the global virtual store by default.</strong> Each <code>pnpm add -g</code> gets its own directory with its own <code>package.json</code>, <code>node_modules</code>, and lockfile.</li>
<li><strong>New SQLite-backed store index</strong> (store v11), with bundled manifests and hex digests for fewer syscalls and faster installs.</li>
<li><strong>Native publish flow.</strong> <a href="https://pnpm.io/uk/cli/publish"><code>pnpm publish</code></a>, <a href="https://pnpm.io/uk/cli/login"><code>login</code></a>, <a href="https://pnpm.io/uk/cli/logout"><code>logout</code></a>, <a href="https://pnpm.io/uk/cli/view"><code>view</code></a>, <a href="https://pnpm.io/uk/cli/deprecate"><code>deprecate</code></a>, <a href="https://pnpm.io/uk/cli/unpublish"><code>unpublish</code></a>, <a href="https://pnpm.io/uk/cli/dist-tag"><code>dist-tag</code></a>, and <a href="https://pnpm.io/uk/cli/version"><code>version</code></a> no longer delegate to the npm CLI.</li>
<li><strong><code>.npmrc</code> is auth/registry only.</strong> Other settings must live in <code>pnpm-workspace.yaml</code> or the new global <code>config.yaml</code>. Environment variables use the <code>pnpm_config_*</code> prefix.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="breaking-changes">Breaking changes<a href="https://pnpm.io/uk/blog/releases/11.0#breaking-changes" class="hash-link" aria-label="Пряме посилання на Breaking changes" title="Пряме посилання на Breaking changes" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="requirements">Requirements<a href="https://pnpm.io/uk/blog/releases/11.0#requirements" class="hash-link" aria-label="Пряме посилання на Requirements" title="Пряме посилання на Requirements" translate="no">​</a></h3>
<ul>
<li>Drops Node.js 18, 19, 20, and 21.</li>
<li>pnpm is now distributed as pure ESM.</li>
<li>The standalone exe requires glibc 2.27+.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="security--build-defaults">Security &amp; build defaults<a href="https://pnpm.io/uk/blog/releases/11.0#security--build-defaults" class="hash-link" aria-label="Пряме посилання на Security &amp; build defaults" title="Пряме посилання на Security &amp; build defaults" translate="no">​</a></h3>
<p>Several defaults have flipped to safer values:</p>
<table><thead><tr><th>Setting</th><th>New default</th></tr></thead><tbody><tr><td><code>minimumReleaseAge</code></td><td><code>1440</code> (1 day)</td></tr><tr><td><code>minimumReleaseAgeStrict</code></td><td><code>false</code></td></tr><tr><td><code>blockExoticSubdeps</code></td><td><code>true</code></td></tr><tr><td><code>strictDepBuilds</code></td><td><code>true</code></td></tr><tr><td><code>optimisticRepeatInstall</code></td><td><code>true</code></td></tr><tr><td><code>verifyDepsBeforeRun</code></td><td><code>install</code></td></tr></tbody></table>
<p>Newly published packages won't be resolved until they're at least 1 day old. Щоб відмовитися від цього, встановіть значення <code>minimumReleaseAge: 0</code> у файлі <code>pnpm-workspace.yaml</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="allowbuilds-replaces-the-old-build-settings"><code>allowBuilds</code> replaces the old build settings<a href="https://pnpm.io/uk/blog/releases/11.0#allowbuilds-replaces-the-old-build-settings" class="hash-link" aria-label="Пряме посилання на allowbuilds-replaces-the-old-build-settings" title="Пряме посилання на allowbuilds-replaces-the-old-build-settings" translate="no">​</a></h3>
<p><code>onlyBuiltDependencies</code>, <code>onlyBuiltDependenciesFile</code>, <code>neverBuiltDependencies</code>, <code>ignoredBuiltDependencies</code>, and <code>ignoreDepScripts</code> have all been removed. Use <a href="https://pnpm.io/uk/settings#allowbuilds"><code>allowBuilds</code></a> instead — a map from package name patterns to booleans:</p>
<p>Before:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">onlyBuiltDependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> electron</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">onlyBuiltDependenciesFile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"allowed-builds.json"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">neverBuiltDependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> core</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">js</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">ignoredBuiltDependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> esbuild</span><br></span></code></pre></div></div>
<p>After:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">allowBuilds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">electron</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">core-js</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">esbuild</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><br></span></code></pre></div></div>
<p>Also removed: <code>allowNonAppliedPatches</code> (use <code>allowUnusedPatches</code>) and <code>ignorePatchFailures</code> (patch failures now throw).</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="npmrc-is-authregistry-only"><code>.npmrc</code> is auth/registry only<a href="https://pnpm.io/uk/blog/releases/11.0#npmrc-is-authregistry-only" class="hash-link" aria-label="Пряме посилання на npmrc-is-authregistry-only" title="Пряме посилання на npmrc-is-authregistry-only" translate="no">​</a></h3>
<p>pnpm no longer reads non-auth settings from <code>.npmrc</code>. Configuration is split into two categories:</p>
<ul>
<li><strong>Registry and auth settings</strong> — INI files (<code>.npmrc</code>, the global <code>rc</code> file, <code>~/.config/pnpm/auth.ini</code>).</li>
<li><strong>pnpm-specific settings</strong> — YAML files (<code>pnpm-workspace.yaml</code>, the new global <code>~/.config/pnpm/config.yaml</code>).</li>
</ul>
<p>Other related changes:</p>
<ul>
<li>
<p>pnpm no longer reads <code>npm_config_*</code> environment variables. Use <code>pnpm_config_*</code> instead (e.g. <code>pnpm_config_registry</code>).</p>
</li>
<li>
<p>pnpm no longer reads the <code>pnpm</code> field in <code>package.json</code>.</p>
</li>
<li>
<p>pnpm no longer reads npm's global config at <code>$PREFIX/etc/npmrc</code>.</p>
</li>
<li>
<p>Network settings (<code>httpProxy</code>, <code>httpsProxy</code>, <code>noProxy</code>, <code>localAddress</code>, <code>strictSsl</code>, <code>gitShallowHosts</code>) are now written to <code>config.yaml</code> / <code>pnpm-workspace.yaml</code> (still readable from <code>.npmrc</code> to ease migration).</p>
</li>
<li>
<p>A new <code>registries</code> setting in <code>pnpm-workspace.yaml</code> replaces <code>@scope:registry=</code> lines:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">registries</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//registry.npmjs.org/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">"@my-org"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//private.example.com/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">"@internal"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//nexus.corp.com/</span><br></span></code></pre></div></div>
</li>
<li>
<p>Per-project <code>.npmrc</code> is replaced by <code>packageConfigs</code> in <code>pnpm-workspace.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">packages</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"packages/project-1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"packages/project-2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">packageConfigs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">"project-1"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">saveExact</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">"project-2"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">savePrefix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"~"</span><br></span></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="native-publish-flow-no-more-npm-cli-fallback">Native publish flow, no more npm CLI fallback<a href="https://pnpm.io/uk/blog/releases/11.0#native-publish-flow-no-more-npm-cli-fallback" class="hash-link" aria-label="Пряме посилання на Native publish flow, no more npm CLI fallback" title="Пряме посилання на Native publish flow, no more npm CLI fallback" translate="no">​</a></h3>
<p>Commands previously implemented by passing through to the <code>npm</code> CLI have either been <strong>reimplemented natively</strong> or <strong>removed</strong>.</p>
<p>Reimplemented: <a href="https://pnpm.io/uk/cli/publish"><code>publish</code></a>, <a href="https://pnpm.io/uk/cli/view"><code>view</code></a> (<code>info</code>, <code>show</code>, <code>v</code>), <a href="https://pnpm.io/uk/cli/login"><code>login</code></a> (<code>adduser</code>), <a href="https://pnpm.io/uk/cli/logout"><code>logout</code></a>, <a href="https://pnpm.io/uk/cli/deprecate"><code>deprecate</code></a>, <a href="https://pnpm.io/uk/cli/unpublish"><code>unpublish</code></a>, <a href="https://pnpm.io/uk/cli/dist-tag"><code>dist-tag</code></a>, <a href="https://pnpm.io/uk/cli/version"><code>version</code></a>, <a href="https://pnpm.io/uk/cli/search"><code>search</code></a>, <a href="https://pnpm.io/uk/cli/star"><code>star</code>/<code>unstar</code>/<code>stars</code></a>, <a href="https://pnpm.io/uk/cli/whoami"><code>whoami</code></a>, <a href="https://pnpm.io/uk/cli/ping"><code>ping</code></a>, <a href="https://pnpm.io/uk/cli/docs"><code>docs</code>/<code>home</code></a>.</p>
<p>Removed (now throw "not implemented"): <code>access</code>, <code>bugs</code>, <code>edit</code>, <code>issues</code>, <code>owner</code>, <code>prefix</code>, <code>profile</code>, <code>pkg</code>, <code>repo</code>, <code>set-script</code>, <code>team</code>, <code>token</code>, <code>xmas</code>.</p>
<p>A few notes on the new native <code>pnpm publish</code>:</p>
<ul>
<li>The OTP environment variable is now <code>PNPM_CONFIG_OTP</code> (was <code>NPM_CONFIG_OTP</code>).</li>
<li>If the registry asks for OTP and none is provided, pnpm prompts for it interactively.</li>
<li>Web-based authentication shows a scannable QR code and URL.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-audit-uses-the-bulk-advisories-endpoint"><code>pnpm audit</code> uses the bulk advisories endpoint<a href="https://pnpm.io/uk/blog/releases/11.0#pnpm-audit-uses-the-bulk-advisories-endpoint" class="hash-link" aria-label="Пряме посилання на pnpm-audit-uses-the-bulk-advisories-endpoint" title="Пряме посилання на pnpm-audit-uses-the-bulk-advisories-endpoint" translate="no">​</a></h3>
<p>The legacy <code>/-/npm/v1/security/audits{,/quick}</code> endpoints have been retired by the registry. <code>pnpm audit</code> now calls <code>/-/npm/v1/security/advisories/bulk</code>, which doesn't return CVE identifiers — so CVE-based filtering has been replaced with <strong>GHSA-based filtering</strong>:</p>
<ul>
<li><code>auditConfig.ignoreCves</code> → <code>auditConfig.ignoreGhsas</code></li>
<li><code>pnpm audit --ignore &lt;id&gt;</code> and <code>--ignore-unfixable</code> read and write GHSAs</li>
</ul>
<p>To migrate, replace each <code>CVE-YYYY-NNNNN</code> entry under <code>ignoreCves</code> with the matching <code>GHSA-xxxx-xxxx-xxxx</code> (visible in the <code>More info</code> column of <code>pnpm audit</code>) and move it to <code>ignoreGhsas</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="isolated-global-virtual-store-global-installs">Isolated, global-virtual-store global installs<a href="https://pnpm.io/uk/blog/releases/11.0#isolated-global-virtual-store-global-installs" class="hash-link" aria-label="Пряме посилання на Isolated, global-virtual-store global installs" title="Пряме посилання на Isolated, global-virtual-store global installs" translate="no">​</a></h3>
<p><code>pnpm add -g &lt;pkg&gt;</code> and <code>pnx</code> now use the global virtual store, and <strong>each install gets its own isolated directory</strong> at <code>{pnpmHomeDir}/global/v11/{hash}/</code> with its own <code>package.json</code>, <code>node_modules/</code>, and lockfile. This stops global packages from interfering with each other through peer-dependency conflicts, hoisting changes, or version drift.</p>
<ul>
<li><code>pnpm remove -g &lt;pkg&gt;</code> removes the entire installation group containing the package.</li>
<li><code>pnpm update -g [pkg]</code> re-installs into a new isolated directory.</li>
<li><code>pnpm list -g</code> scans isolated directories.</li>
<li><code>pnpm install -g</code> (no args) is no longer supported — use <code>pnpm add -g &lt;pkg&gt;</code>.</li>
</ul>
<p>Globally installed binaries now live in a <code>bin</code> subdirectory of <code>PNPM_HOME</code> (rather than directly in <code>PNPM_HOME</code>), so internal directories like <code>global/</code> and <code>store/</code> don't pollute shell autocompletion. <strong>Run <code>pnpm setup</code> after upgrading</strong> to update your shell configuration.</p>
<p><code>pnpm link</code> has been tightened too: only relative or absolute paths are accepted, <code>--global</code> is removed (use <code>pnpm add -g .</code>), and <code>pnpm link</code> with no arguments is removed.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="other-removals">Other removals<a href="https://pnpm.io/uk/blog/releases/11.0#other-removals" class="hash-link" aria-label="Пряме посилання на Other removals" title="Пряме посилання на Other removals" translate="no">​</a></h3>
<ul>
<li>
<p><code>pnpm server</code>.</p>
</li>
<li>
<p><code>useNodeVersion</code> and <code>executionEnv.nodeVersion</code> — use <code>devEngines.runtime</code> / <code>engines.runtime</code>.</p>
</li>
<li>
<p><code>hooks.fetchers</code> — replaced by the new <code>fetchers</code> field in pnpmfile.</p>
</li>
<li>
<p><code>managePackageManagerVersions</code>, <code>packageManagerStrict</code>, and <code>packageManagerStrictVersion</code>. These all derived the <code>onFail</code> behavior of the legacy <code>packageManager</code> field; the new <code>pmOnFail</code> setting subsumes them:</p>
<table><thead><tr><th>Removed</th><th>Replace with</th></tr></thead><tbody><tr><td><code>managePackageManagerVersions: true</code></td><td><code>pmOnFail: download</code> (default)</td></tr><tr><td><code>managePackageManagerVersions: false</code></td><td><code>pmOnFail: ignore</code></td></tr><tr><td><code>packageManagerStrict: false</code></td><td><code>pmOnFail: warn</code></td></tr><tr><td><code>packageManagerStrictVersion: true</code></td><td><code>pmOnFail: error</code></td></tr><tr><td><code>COREPACK_ENABLE_STRICT=0</code></td><td><code>pmOnFail: warn</code></td></tr></tbody></table>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="new-commands">New commands<a href="https://pnpm.io/uk/blog/releases/11.0#new-commands" class="hash-link" aria-label="Пряме посилання на New commands" title="Пряме посилання на New commands" translate="no">​</a></h2>
<table><thead><tr><th>Команда</th><th>What it does</th></tr></thead><tbody><tr><td><a href="https://pnpm.io/uk/cli/ci"><code>pnpm ci</code></a></td><td>Runs <code>pnpm clean</code> followed by <code>pnpm install --frozen-lockfile</code>. Aliases: <code>clean-install</code>, <code>ic</code>, <code>install-clean</code>.</td></tr><tr><td><a href="https://pnpm.io/uk/cli/clean"><code>pnpm clean</code></a></td><td>Removes <code>node_modules</code> from all workspace projects. <code>--lockfile</code> also removes <code>pnpm-lock.yaml</code>.</td></tr><tr><td><a href="https://pnpm.io/uk/cli/sbom"><code>pnpm sbom</code></a></td><td>Generates a Software Bill of Materials in CycloneDX 1.7 or SPDX 2.3 JSON.</td></tr><tr><td><a href="https://pnpm.io/uk/cli/peers"><code>pnpm peers check</code></a></td><td>Reports unmet/missing peers from the lockfile.</td></tr><tr><td><a href="https://pnpm.io/uk/cli/runtime"><code>pnpm runtime set</code></a></td><td>Installs a runtime; deprecates <code>pnpm env use</code>.</td></tr><tr><td><a href="https://pnpm.io/uk/cli/docs"><code>pnpm docs</code></a> / <code>home</code></td><td>Opens the package homepage.</td></tr><tr><td><a href="https://pnpm.io/uk/cli/ping"><code>pnpm ping</code></a></td><td>Pings the registry.</td></tr><tr><td><a href="https://pnpm.io/uk/cli/with"><code>pnpm with</code></a></td><td>Runs pnpm at a specific (or current) version for a single invocation, bypassing <code>packageManager</code> pins.</td></tr><tr><td><a href="https://pnpm.io/uk/cli/pack-app"><code>pnpm pack-app</code></a></td><td>Packs a CommonJS entry into a standalone executable for one or more target platforms via <a href="https://nodejs.org/api/single-executable-applications.html" target="_blank" rel="noopener noreferrer">Node.js SEA</a>.</td></tr></tbody></table>
<p>Plus the natively reimplemented commands listed under "Native publish flow" above, and short aliases <a href="https://pnpm.io/uk/cli/pn"><code>pn</code></a> for <code>pnpm</code> and <a href="https://pnpm.io/uk/cli/pnx"><code>pnx</code></a> for <code>pnpx</code>/<code>pnpm dlx</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-audit---fixupdate"><code>pnpm audit --fix=update</code><a href="https://pnpm.io/uk/blog/releases/11.0#pnpm-audit---fixupdate" class="hash-link" aria-label="Пряме посилання на pnpm-audit---fixupdate" title="Пряме посилання на pnpm-audit---fixupdate" translate="no">​</a></h3>
<p>Fix vulnerabilities by <strong>updating packages in the lockfile</strong> instead of adding overrides. For more granular control, the new <code>--interactive</code> / <code>-i</code> flag lets you select which advisories to fix:</p>
<div class="language-sh codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-sh codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> audit </span><span class="token parameter variable" style="color:#36acaa">--fix</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">update </span><span class="token parameter variable" style="color:#36acaa">--interactive</span><br></span></code></pre></div></div>
<p><code>pnpm audit --fix</code> also adds the minimum patched version for each advisory to <code>minimumReleaseAgeExclude</code> in <code>pnpm-workspace.yaml</code>, so security fixes can be installed without waiting for <code>minimumReleaseAge</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="esm-pnpmfiles">ESM pnpmfiles<a href="https://pnpm.io/uk/blog/releases/11.0#esm-pnpmfiles" class="hash-link" aria-label="Пряме посилання на ESM pnpmfiles" title="Пряме посилання на ESM pnpmfiles" translate="no">​</a></h2>
<p>Pnpmfiles can now be written in ESM, using the <code>.mjs</code> extension. When <code>.pnpmfile.mjs</code> exists, it takes priority over <code>.pnpmfile.cjs</code>, and only one is loaded.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="store-v11">Store v11<a href="https://pnpm.io/uk/blog/releases/11.0#store-v11" class="hash-link" aria-label="Пряме посилання на Store v11" title="Пряме посилання на Store v11" translate="no">​</a></h2>
<p>The store has been rebuilt around two ideas: read less, do fewer syscalls.</p>
<ul>
<li>The package index is now a single <strong>SQLite database</strong> at <code>$STORE/index.db</code> (with MessagePack values, WAL mode for concurrent access), instead of millions of JSON files under <code>$STORE/index/</code>. Packages missing from the new index are re-fetched on demand.</li>
<li>The <strong>bundled manifest</strong> (name, version, bin, engines, scripts, etc.) is stored directly in the package index, eliminating the need to read <code>package.json</code> from the CAS during resolution and installation.</li>
<li>Index entries store <strong>hex digests</strong> instead of full integrity strings (<code>&lt;algo&gt;-&lt;digest&gt;</code>), and the hash algorithm is recorded once per file instead of per entry. This avoids base64 → hex conversion on every CAS path lookup.</li>
<li>When the global virtual store is enabled, packages that aren't allowed to build (and don't transitively depend on packages that are) get hashes that <strong>don't include the engine name</strong> (platform, arch, Node.js major). ~95% of GVS packages now survive Node.js upgrades and architecture changes without re-import.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="performance">Performance<a href="https://pnpm.io/uk/blog/releases/11.0#performance" class="hash-link" aria-label="Пряме посилання на Performance" title="Пряме посилання на Performance" translate="no">​</a></h2>
<p>A lot of small wins add up to a noticeably faster install:</p>
<ul>
<li><strong><code>undici</code> replaces <code>node-fetch</code></strong> for all HTTP, with Happy Eyeballs (dual-stack), better keep-alive, and an optimized global dispatcher.</li>
<li>Tarball downloads with known size <strong>pre-allocate memory</strong> to avoid double-copy overhead.</li>
<li>The metadata cache is now <strong>NDJSON</strong>, with <code>If-Modified-Since</code> for conditional fetches.</li>
<li><code>minimumReleaseAge</code> checks use the <strong>abbreviated metadata</strong> endpoint to fetch less.</li>
<li>CAS files are written <strong>directly to their content-addressed path</strong> instead of via a temp file + rename — saving ~30k rename syscalls per cold install.</li>
<li>The staging directory is <strong>gone</strong> when importing into <code>node_modules</code>.</li>
<li>Hot-path string operations in the CAS were tightened, and <code>gunzipSync</code> runs with a larger chunk size for fewer buffer allocations during tarball decompression.</li>
<li>During GVS warm reinstalls, redundant internal linking is skipped when no packages were added.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="slimmer-runtime-installs">Slimmer runtime installs<a href="https://pnpm.io/uk/blog/releases/11.0#slimmer-runtime-installs" class="hash-link" aria-label="Пряме посилання на Slimmer runtime installs" title="Пряме посилання на Slimmer runtime installs" translate="no">​</a></h2>
<p>Installing a Node.js runtime via <code>node@runtime:&lt;version&gt;</code> (including <code>pnpm env use</code> and <code>pnpm runtime set node</code>) <strong>no longer extracts the bundled <code>npm</code>, <code>npx</code>, and <code>corepack</code></strong> from the Node.js archive. That cuts roughly half of the files pnpm has to hash, write to the CAS, and link. If you still need <code>npm</code>, install it as a separate package.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="other-notable-changes">Other notable changes<a href="https://pnpm.io/uk/blog/releases/11.0#other-notable-changes" class="hash-link" aria-label="Пряме посилання на Other notable changes" title="Пряме посилання на Other notable changes" translate="no">​</a></h2>
<ul>
<li>
<p><strong>Cleaner script output.</strong> <code>pnpm</code> now prints <code>$ command</code> (to stderr, so stdout stays pipe-friendly) instead of <code>&gt; pkg@version stage path\n&gt; command</code>. Project name and path are shown only when running in a different directory.</p>
</li>
<li>
<p><strong>Peer dependency issues</strong> are no longer rendered as a tree during install — pnpm suggests running <code>pnpm peers check</code> to view them.</p>
</li>
<li>
<p><strong>Lifecycle scripts</strong> no longer get <code>npm_config_*</code> env vars from the pnpm config; only well-known <code>npm_*</code> env vars are set, matching Yarn.</p>
</li>
<li>
<p><strong><code>pnpm init</code></strong> writes <code>devEngines.packageManager</code> instead of <code>packageManager</code> when <code>init-package-manager</code> is enabled, and the default <code>type</code> is now <code>"module"</code>.</p>
</li>
<li>
<p><strong><code>devEngines.packageManager</code></strong> now supports version ranges; the resolved version is stored in <code>pnpm-lock.yaml</code> and reused if it still satisfies the range.</p>
</li>
<li>
<p><strong><code>dedupePeers</code></strong> is a new setting that uses version-only suffixes (<code>name@version</code>) instead of full dep paths, eliminating nested suffixes like <code>(foo@1.0.0(bar@2.0.0))</code> for projects with many recursive peers.</p>
</li>
<li>
<p><strong><code>pnpm approve-builds</code></strong> now accepts positional arguments for non-interactive use; prefix a name with <code>!</code> to deny it.</p>
</li>
<li>
<p><strong>Hidden scripts</strong> — scripts starting with <code>.</code> can only be called from other scripts and don't show up in <code>pnpm run</code>.</p>
</li>
<li>
<p><strong><code>-F</code></strong> is a new short alias for <code>--filter</code>.</p>
</li>
<li>
<p><strong><code>pnpm add</code> short flags</strong> — <code>-d</code> is now <code>--save-dev</code>, <code>-p</code> is <code>--save-prod</code>, <code>-o</code> is <code>--save-optional</code>, <code>-e</code> is <code>--save-exact</code> (only inside <code>pnpm add</code>).</p>
</li>
<li>
<p><strong><code>virtualStoreOnly</code></strong> populates the virtual store without creating importer symlinks, hoisting, bin links, or running lifecycle scripts. Useful for pre-populating a store in Nix builds. <code>pnpm fetch</code> now uses this internally.</p>
</li>
<li>
<p><strong><code>nodeDownloadMirrors</code></strong> in <code>pnpm-workspace.yaml</code> replaces the <code>node-mirror:&lt;channel&gt;</code> <code>.npmrc</code> setting:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">nodeDownloadMirrors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">release</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//my</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mirror.example.com/download/release/</span><br></span></code></pre></div></div>
</li>
<li>
<p><strong>Config dependencies</strong> are now installed into <code>{storeDir}/links/</code> and symlinked into <code>node_modules/.pnpm-config/</code>, so they're shared across projects using the same store. Resolved versions and integrity hashes have moved from <code>pnpm-workspace.yaml</code> to a separate document in <code>pnpm-lock.yaml</code>; old inline-hash projects are migrated automatically.</p>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="upgrading">Upgrading<a href="https://pnpm.io/uk/blog/releases/11.0#upgrading" class="hash-link" aria-label="Пряме посилання на Upgrading" title="Пряме посилання на Upgrading" translate="no">​</a></h2>
<p>See the full <a href="https://pnpm.io/uk/migration">Migrating from v10 to v11</a> guide for the codemod and manual follow-ups. The short version:</p>
<ul>
<li>Bump your CI and dev environments to <strong>Node.js 22+</strong> before upgrading.</li>
<li>Move pnpm settings out of <code>.npmrc</code> into <code>pnpm-workspace.yaml</code> (or the global <code>~/.config/pnpm/config.yaml</code>).</li>
<li>Migrate <code>onlyBuiltDependencies</code> and friends to <code>allowBuilds</code>.</li>
<li>Migrate <code>auditConfig.ignoreCves</code> to <code>auditConfig.ignoreGhsas</code>.</li>
<li>After installing v11, run <code>pnpm setup</code> to update your shell so the new <code>bin</code> subdirectory is on <code>PATH</code>.</li>
</ul>
<p>The full list of changes is in the <a href="https://github.com/pnpm/pnpm/blob/main/pnpm/CHANGELOG.md" target="_blank" rel="noopener noreferrer">changelog</a>. If something you relied on is missing or broken, please open an issue at <a href="https://github.com/pnpm/pnpm/issues" target="_blank" rel="noopener noreferrer">github.com/pnpm/pnpm/issues</a>.</p><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.32]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.32</link>
            <guid>https://pnpm.io/uk/blog/releases/10.32</guid>
            <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[у версії pnpm 10.32 до команди pnpm approve-builds додано параметр --all, який дозволяє затверджувати всі очікувані збірки без інтерактивних запитів.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>у версії pnpm 10.32 до команди <code>pnpm approve-builds</code> додано параметр <code>--all</code>, який дозволяє затверджувати всі очікувані збірки без інтерактивних запитів.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.32#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="прапорець---all-для-команди-pnpm-approve-builds">Прапорець <code>--all</code> для команди <code>pnpm approve-builds</code><a href="https://pnpm.io/uk/blog/releases/10.32#%D0%BF%D1%80%D0%B0%D0%BF%D0%BE%D1%80%D0%B5%D1%86%D1%8C---all-%D0%B4%D0%BB%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B8-pnpm-approve-builds" class="hash-link" aria-label="Пряме посилання на прапорець---all-для-команди-pnpm-approve-builds" title="Пряме посилання на прапорець---all-для-команди-pnpm-approve-builds" translate="no">​</a></h4>
<p>Додано прапорець <code>--all</code> до <code>pnpm approve-builds</code>, який схвалює всі збірки, що очікують на виконання, без інтерактивних запитів <a href="https://github.com/pnpm/pnpm/issues/10136" target="_blank" rel="noopener noreferrer">#10136</a>.</p>
<div class="language-sh codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-sh codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> approve-builds </span><span class="token parameter variable" style="color:#36acaa">--all</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.32#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Скасовано зміну, повʼязану з явним встановленням шляху до конфігураційного файлу npm, що спричиняло регресії.</li>
<li>Скасовано виправлення, повʼязане з <code>lockfile-include-tarball-url</code>. Виправляє <a href="https://github.com/pnpm/pnpm/issues/10915" target="_blank" rel="noopener noreferrer">#10915</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.31]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.31</link>
            <guid>https://pnpm.io/uk/blog/releases/10.31</guid>
            <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[у версії pnpm 10.31 збережено коментарі та форматування під час оновлення файлу pnpm-workspace.yaml, а також виправлено чимало помилок.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>у версії pnpm 10.31 збережено коментарі та форматування під час оновлення файлу <code>pnpm-workspace.yaml</code>, а також виправлено чимало помилок.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.31#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="збереження-коментарів-у-pnpm-workspaceyaml">Збереження коментарів у <code>pnpm-workspace.yaml</code><a href="https://pnpm.io/uk/blog/releases/10.31#%D0%B7%D0%B1%D0%B5%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D1%96%D0%B2-%D1%83-pnpm-workspaceyaml" class="hash-link" aria-label="Пряме посилання на збереження-коментарів-у-pnpm-workspaceyaml" title="Пряме посилання на збереження-коментарів-у-pnpm-workspaceyaml" translate="no">​</a></h4>
<p>Коли pnpm оновлює <code>pnpm-workspace.yaml</code>, коментарі, форматування рядків та пробіли залишаються.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.31#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Додано <code>-F</code> як скорочення для опції <code>--filter</code> у виводі довідки.</li>
<li>Обробка невизначеного pkgSnapshot у 'pnpm why -r' <a href="https://github.com/pnpm/pnpm/issues/10700" target="_blank" rel="noopener noreferrer">#10700</a>.</li>
<li>Виправлено ситуацію, коли headless інсталяція не використовувалася, якщо проєкт містив інʼєкцію залежності <code>file:</code>, що посилалась сама на себе, яка в файлі блокування перетворювалась на <code>link:</code>.</li>
<li>Виправлено ситуацію конкуренції, яка виникала, коли кілька робочих потоків одночасно імпортували один і той самий пакунок у глобальне віртуальний сховище. Операція перейменування тепер допускає помилки <code>ENOTEMPTY</code>/<code>EEXIST</code>, якщо інший потік вже завершив імпорт.</li>
<li>Якщо для параметра <code>lockfile-include-tarball-url</code> встановлено значення <code>false</code>, URL-адреси архівів тепер завжди виключаються з файлу блокування. Раніше URL-адреси архівів все ще могли зʼявлятися для пакунків, розміщених за нестандартними URL-адресами <a href="https://github.com/pnpm/pnpm/issues/6667" target="_blank" rel="noopener noreferrer">#6667</a>.</li>
<li>Виправлено пропускання установки функцією <code>optimisticRepeatInstall</code> у разі зміни параметрів <code>overrides</code>, <code>packageExtensions</code>, <code>ignoredOptionalDependencies</code>, <code>patchedDependencies</code> або <code>peersSuffixMaxLength</code>.</li>
<li>Виправлено помилку <code>pnpm patch-commit</code>, яка виникала з повідомленням «unable to access “/.config/git/attributes”: Permission denied» у середовищах, де змінна HOME не встановлена або має нестандартне значення (контейнери Docker, системи CI) <a href="https://github.com/pnpm/pnpm/issues/6537" target="_blank" rel="noopener noreferrer">#6537</a>.</li>
<li>Виправлено помилку <code>pnpm why -r --parseable</code>, пов’язану з відсутністю залежностей, коли кілька пакунків робочого простору використовують одну й ту саму залежність <a href="https://github.com/pnpm/pnpm/issues/8100" target="_blank" rel="noopener noreferrer">#8100</a>.</li>
<li>Виправлено помилку, через яку параметр <code>link-workspace-packages=true</code> неправильно повʼязував пакети робочого простору, коли запитувана версія не відповідала версії пакунка робочого простору <a href="https://github.com/pnpm/pnpm/issues/10173" target="_blank" rel="noopener noreferrer">#10173</a>.</li>
<li>Виправлено помилку, через яку команда <code>pnpm update --interactive</code> порушувала вирівнювання таблиці при використанні довгих рядків версій, шляхом динамічного розрахунку ширини стовпців замість використання жорстко заданих значень <a href="https://github.com/pnpm/pnpm/issues/10316" target="_blank" rel="noopener noreferrer">#10316</a>.</li>
<li>Параметр, встановлений прапорцем <code>--allow-build</code>, записується в <code>allowBuilds</code>.</li>
<li>Виправлено помилку, через яку при вказанні параметра <code>filter</code> у файлі <code>pnpm-workspace.yaml</code> pnpm не виявляв жодних проєктів.</li>
<li>Вивести повідомлення про допомогу при запуску команди <code>pnpm dlx</code> без аргументів і завершити роботу.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.30]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.30</link>
            <guid>https://pnpm.io/uk/blog/releases/10.30</guid>
            <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[у версії pnpm 10.30 команда pnpm why була перероблена для показу дерева зворотних залежностей, що значно полегшує розуміння причин встановлення того чи іншого пакунка.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>у версії pnpm 10.30 команда <code>pnpm why</code> була перероблена для показу дерева зворотних залежностей, що значно полегшує розуміння причин встановлення того чи іншого пакунка.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.30#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="дерево-зворотних-залежностей-у-pnpm-why">Дерево зворотних залежностей у <code>pnpm why</code><a href="https://pnpm.io/uk/blog/releases/10.30#%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE-%D0%B7%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%BD%D0%B8%D1%85-%D0%B7%D0%B0%D0%BB%D0%B5%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9-%D1%83-pnpm-why" class="hash-link" aria-label="Пряме посилання на дерево-зворотних-залежностей-у-pnpm-why" title="Пряме посилання на дерево-зворотних-залежностей-у-pnpm-why" translate="no">​</a></h4>
<p><code>pnpm why</code> тепер показує дерево зворотних залежностей. Пакунок, що шукається, зʼявляється в корені з його залежними елементами у вигляді гілок, які ведуть назад до коренів робочих просторів. Це замінює попередній вивід у вигляді дерева, який був захаращеним і важким для сприйняття у випадку глибоко вкладених залежностей.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.30#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Оптимізовано продуктивність команд <code>pnpm why</code> та <code>pnpm list</code> у робочих просторах із великою кількістю імпортерів шляхом спільного використання графа залежностей та кешу матеріалізації для всіх імпортерів, замість їхньої окремої перекомпіляції для кожного з них <a href="https://github.com/pnpm/pnpm/pull/10596" target="_blank" rel="noopener noreferrer">#10596</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.29]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.29</link>
            <guid>https://pnpm.io/uk/blog/releases/10.29</guid>
            <pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 10.29 додає підтримку протоколу catalog та містить кілька виправлень помилок.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 10.29 додає підтримку протоколу <code>catalog:</code> до <code>pnpm dlx</code>, дозволяє налаштовувати <code>auditLevel</code> у <code>pnpm-workspace.yaml</code>, підтримує порожній специфікатор <code>workspace:</code> та містить кілька виправлень помилок.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.29#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="catalog-протокол-у-pnpm-dlx">'catalog:' Протокол у 'pnpm dlx'<a href="https://pnpm.io/uk/blog/releases/10.29#catalog-%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB-%D1%83-pnpm-dlx" class="hash-link" aria-label="Пряме посилання на 'catalog:' Протокол у 'pnpm dlx'" title="Пряме посилання на 'catalog:' Протокол у 'pnpm dlx'" translate="no">​</a></h4>
<p>Команда 'pnpm dlx' / 'pnpx' тепер підтримує протокол 'catalog:', що дозволяє звертатися до версій, визначених у каталогах робочого простору:</p>
<div class="language-sh codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-sh codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> dlx shx@catalog:</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="налаштування-auditlevel">Налаштування 'auditLevel'<a href="https://pnpm.io/uk/blog/releases/10.29#%D0%BD%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F-auditlevel" class="hash-link" aria-label="Пряме посилання на Налаштування 'auditLevel'" title="Пряме посилання на Налаштування 'auditLevel'" translate="no">​</a></h4>
<p>'auditLevel' тепер можна налаштувати у файлі 'pnpm-workspace.yaml', тож не потрібно передавати '--audit-level' при кожному виклику 'pnpm audit' <a href="https://github.com/pnpm/pnpm/pull/10540" target="_blank" rel="noopener noreferrer">#10540</a>:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">pnpm-workspace.yaml</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">auditLevel</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> high</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="workspace-протокол"><code>workspace:</code> Протокол<a href="https://pnpm.io/uk/blog/releases/10.29#workspace-%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB" class="hash-link" aria-label="Пряме посилання на workspace-протокол" title="Пряме посилання на workspace-протокол" translate="no">​</a></h4>
<p>Тепер підтримується специфікатор <code>workspace:</code> без діапазону версій. Він розглядається як 'workspace:*' і перетворюється у конкретну версію під час публікації <a href="https://github.com/pnpm/pnpm/pull/10436" target="_blank" rel="noopener noreferrer">#10436</a>:</p>
<div class="language-json codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-json codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"dependencies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"foo"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"workspace:"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.29#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Виправлено помилку нестачі памʼяті в <code>pnpm list</code> (та <code>pnpm why</code>) на великих графах залежностей шляхом заміни рекурсивного конструктора дерев двофазним підходом: граф залежностей BFS з подальшою матеріалізацією кешованого дерева. Дублікати піддерев тепер видаляються у виводі <a href="https://github.com/pnpm/pnpm/pull/10586" target="_blank" rel="noopener noreferrer">#10586</a>.</li>
<li>Виправлено помилку <code>allowBuilds</code> не працює, якщо встановити через <code>.pnpmfile.cjs</code> <a href="https://github.com/pnpm/pnpm/issues/10516" target="_blank" rel="noopener noreferrer">#10516</a>.</li>
<li>Коли встановлено <code>enableGlobalVirtualStore</code>, <code>pnpm deploy</code> тепер ігнорує його та завжди створює локалізоване віртуальне сховище в теці розгортання, щоб забезпечити його автономність.</li>
<li>Виправлено ситуацію, коли <code>pnpm dlx</code> не враховував параметр <code>minimumReleaseAgeExclude</code> <a href="https://github.com/pnpm/pnpm/issues/10338" target="_blank" rel="noopener noreferrer">#10338</a>.</li>
<li>Виправлено помилку, через яку команда <code>pnpm list --json</code> повертала неправильні шляхи при використанні глобального віртуального сховища <a href="https://github.com/pnpm/pnpm/issues/10187" target="_blank" rel="noopener noreferrer">#10187</a>.</li>
<li>Виправлено поведінку команд <code>pnpm store path</code> та <code>pnpm store status</code>: тепер для визначення шляху використовується коренева тека робочого простору, якщо параметр <code>storeDir</code> вказано у відносному форматі <a href="https://github.com/pnpm/pnpm/issues/10290" target="_blank" rel="noopener noreferrer">#10290</a>.</li>
<li>Виправлено ситуацію, коли під час повторного додавання наявної залежності каталогу до файлу <code>pnpm-workspace.yaml</code> записувався літеральний рядок <code>catalog:</code> замість визначеного специфікатора версії <a href="https://github.com/pnpm/pnpm/issues/10176" target="_blank" rel="noopener noreferrer">#10176</a>.</li>
<li>Пропускати локальні залежності протоколу <code>file:</code> під час виконання команди <code>pnpm fetch</code>, що дозволяє виправити збірку в Docker, коли локальні теки залежностей недоступні <a href="https://github.com/pnpm/pnpm/issues/10460" target="_blank" rel="noopener noreferrer">#10460</a>.</li>
<li>Виправлено роботу команди <code>pnpm audit --json</code> так, щоб вона враховувала параметр <code>--audit-level</code> як для коду завершення, так і для фільтрації виводу <a href="https://github.com/pnpm/pnpm/pull/10540" target="_blank" rel="noopener noreferrer">#10540</a>.</li>
<li>Оновлено <code>tar</code> до версії 7.5.7 для виправлення вразливості безпеки (<a href="https://www.cve.org/CVERecord?id=CVE-2026-24842" target="_blank" rel="noopener noreferrer">CVE-2026-24842</a>).</li>
<li>Виправлено: команда <code>pnpm audit --fix</code> тепер замінює перевизначення посилань (наприклад, <code>$foo</code>) на конкретні версії <a href="https://github.com/pnpm/pnpm/issues/10325" target="_blank" rel="noopener noreferrer">#10325</a>.</li>
<li>Виправлено: параметр <code>shamefullyHoist</code>, заданий за допомогою <code>updateConfig</code> у файлі <code>.pnpmfile.cjs</code>, не перетворювався на <code>publicHoistPattern</code> <a href="https://github.com/pnpm/pnpm/issues/10271" target="_blank" rel="noopener noreferrer">#10271</a>.</li>
<li>Команда <code>pnpm help</code> тепер правильно повідомляє, чи входить поточна версія командного рядка pnpm до складу Node.js <a href="https://github.com/pnpm/pnpm/issues/10561" target="_blank" rel="noopener noreferrer">#10561</a>.</li>
<li>Додано попередження, якщо поточна тека містить символ-роздільник PATH, що може призвести до збою вставці шляху <code>node_modules/.bin</code> <a href="https://github.com/pnpm/pnpm/issues/10457" target="_blank" rel="noopener noreferrer">#10457</a>.</li>
<li>Виправлено URL-адресу документації, що показується в <code>pnpm completion --help</code>, щоб вона вказувала на правильну сторінку <a href="https://github.com/pnpm/pnpm/issues/10281" target="_blank" rel="noopener noreferrer">#10281</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.28]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.28</link>
            <guid>https://pnpm.io/uk/blog/releases/10.28</guid>
            <pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[У pnpm 10.28 представлено новий хук beforePacking для налаштування package.json під час публікації, покращено продуктивність інсталяції з використанням фільтрів та виправлено кілька помилок.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>У pnpm 10.28 представлено новий хук <code>beforePacking</code> для налаштування package.json під час публікації, покращено продуктивність інсталяції з використанням фільтрів та виправлено кілька помилок.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.28#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="хук-beforepacking">Хук <code>beforePacking</code><a href="https://pnpm.io/uk/blog/releases/10.28#%D1%85%D1%83%D0%BA-beforepacking" class="hash-link" aria-label="Пряме посилання на хук-beforepacking" title="Пряме посилання на хук-beforepacking" translate="no">​</a></h4>
<p>Додано підтримку нового хука з назвою <code>beforePacking</code>, який дозволяє налаштовувати вміст <code>package.json</code> під час публікації, див. <a href="https://github.com/pnpm/pnpm/issues/3816" target="_blank" rel="noopener noreferrer">#3816</a>.</p>
<p>Цей хук викликається безпосередньо перед створенням tar-архіву під час виконання команд <code>pnpm pack</code> або <code>pnpm publish</code>. Це дає вам можливість змінити маніфест пакунка, який буде включено до опублікованого пакунка, не впливаючи на ваш локальний файл <code>package.json</code>.</p>
<p>Приклад використання у <code>.pnpmfile.cjs</code>:</p>
<div class="language-js codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-js codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">hooks</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">beforePacking</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">pkg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Видалити поля, призначені тільки для розробки</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">delete</span><span class="token plain"> pkg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">devDependencies</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">delete</span><span class="token plain"> pkg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">scripts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Додати метадані публікації</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      pkg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">publishedAt</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Date</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toISOString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> pkg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Див. документацію <a href="https://pnpm.io/uk/pnpmfile#hooksbeforepackingpkg-pkg--promisepkg">.pnpmfile.cjs</a> для отримання додаткової інформації.</p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="продуктивність-інсталяції-з-використанням-фільтрів">Продуктивність інсталяції з використанням фільтрів<a href="https://pnpm.io/uk/blog/releases/10.28#%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%96%D1%81%D1%82%D1%8C-%D1%96%D0%BD%D1%81%D1%82%D0%B0%D0%BB%D1%8F%D1%86%D1%96%D1%97-%D0%B7-%D0%B2%D0%B8%D0%BA%D0%BE%D1%80%D0%B8%D1%81%D1%82%D0%B0%D0%BD%D0%BD%D1%8F%D0%BC-%D1%84%D1%96%D0%BB%D1%8C%D1%82%D1%80%D1%96%D0%B2" class="hash-link" aria-label="Пряме посилання на Продуктивність інсталяції з використанням фільтрів" title="Пряме посилання на Продуктивність інсталяції з використанням фільтрів" translate="no">​</a></h4>
<p>У деяких випадках інсталяція з використанням фільтрів (наприклад, <code>pnpm install --filter ...</code>) була повільнішою, ніж запуск <code>pnpm install</code> без будь-яких фільтрів. Цей регрес продуктивності тепер виправлено. Встановлення з використанням фільтрів мають бути такими ж швидкими або швидшими, ніж повне встановлення, див <a href="https://github.com/pnpm/pnpm/pull/10408" target="_blank" rel="noopener noreferrer">#10408</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.28#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Не додавати символічне посилання на проєкт до реєстру проєктів сховища, якщо сховище знаходиться у вкладеній теці проєкту, див. <a href="https://github.com/pnpm/pnpm/issues/10411" target="_blank" rel="noopener noreferrer">#10411</a>.</li>
<li>Має бути можливість оголосити параметр <code>requiredScripts</code> у <code>pnpm-workspace.yaml</code>, див.&nbsp;<a href="https://github.com/pnpm/pnpm/issues/10261" target="_blank" rel="noopener noreferrer">#10261</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.27]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.27</link>
            <guid>https://pnpm.io/uk/blog/releases/10.27</guid>
            <pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 10.27 додає нове налаштування для ігнорування перевірок політики довіри для старих версій пакунків, вводить реєстр проєктів для глобального очищення віртуального сховища та включає кілька виправлень помилок.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 10.27 додає нове налаштування для ігнорування перевірок політики довіри для старих версій пакунків, вводить реєстр проєктів для глобального очищення віртуального сховища та включає кілька виправлень помилок.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.27#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="trustpolicyignoreafter"><code>trustPolicyIgnoreAfter</code><a href="https://pnpm.io/uk/blog/releases/10.27#trustpolicyignoreafter" class="hash-link" aria-label="Пряме посилання на trustpolicyignoreafter" title="Пряме посилання на trustpolicyignoreafter" translate="no">​</a></h4>
<p>Додавання <code>trustPolicyIgnoreAfter</code> дозволяє ігнорувати перевірки політики довіри для пакунків, опублікованих пізніше, ніж зазначений час, див. <a href="https://github.com/pnpm/pnpm/issues/10352" target="_blank" rel="noopener noreferrer">#10352</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="global-virtual-store-improvements">Global Virtual Store Improvements<a href="https://pnpm.io/uk/blog/releases/10.27#global-virtual-store-improvements" class="hash-link" aria-label="Пряме посилання на Global Virtual Store Improvements" title="Пряме посилання на Global Virtual Store Improvements" translate="no">​</a></h4>
<p>Додано реєстр проєктів для підтримки скорочення глобального віртуального сховища.</p>
<p>Проєкти, що використовують сховище, тепер реєструються через символічні посилання у <code>{storeDir}/v10/projects/</code>. Це дозволяє <code>pnpm store prune</code> відстежувати, які пакунки все ще використовуються активними проєктами, та безпечно видаляти невикористовувані пакунки з глобального віртуального сховища.</p>
<p><strong>Напів-порушення.</strong> Змінено розташування пакетів без області дії у віртуальному глобальному сховищі. Тепер вони будуть зберігатися в теці з назвою <code>@</code>, щоб зберегти однакову глибину ієрархії тек у 4 рівні.</p>
<p>Додано збірку сміття за принципом «позначення та очищення» для глобального віртуального сховища.</p>
<p><code>pnpm store prune</code> тепер видаляє невикористовувані пакунки з теки <code>links/</code> глобального віртуального сховища. Алгоритм:</p>
<ol>
<li>Сканує всі зареєстровані проєкти на наявність символічних посилань, що вказують на сховище</li>
<li>Проходить перехідні залежності, щоб позначити доступні пакунки</li>
<li>Видаляє будь-які теки пакунків, не позначені як доступні</li>
</ol>
<p>Це включає підтримку монорепозиторіїв робочого простору&nbsp;— скануються всі теки <code>node_modules</code> у межах проєкту (включно з тими, що містяться в пакунках робочого простору).</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.27#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Видаємо помилку, якщо значення параметра <code>tokenHelper</code> або <code>&lt;url&gt;:tokenHelper</code> містить змінну середовища.</li>
<li>Залежності Git зі скриптами збірки повинні враховувати налаштування <code>dangerouslyAllowAllBuilds</code> <a href="https://github.com/pnpm/pnpm/issues/10376" target="_blank" rel="noopener noreferrer">#10376</a>.</li>
<li>Пропустити перевірку менеджера пакунки під час запуску з --global, якщо налаштовано проєкт packageManager, і попередити, що перевірку пропущено.</li>
<li>Команда <code>pnpm store prune</code> не повинна завершуватися помилкою, якщо тека кешу dlx містить файли, а не лише теки <a href="https://github.com/pnpm/pnpm/pull/10384" target="_blank" rel="noopener noreferrer">#10384</a></li>
<li>Виправлено помилку (<a href="https://github.com/pnpm/pnpm/issues/9759" target="_blank" rel="noopener noreferrer">#9759</a>), через яку команда <code>pnpm add</code> неправильно змінювала запис теки в <code>pnpm-workspace.yaml</code> на його точну версію.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[🚀 pnpm у 2025 році]]></title>
            <link>https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025</link>
            <guid>https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025</guid>
            <pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[2025 рік став переломним для pnpm. Хоча нашою основною метою було переосмислення моделі безпеки управління пакунками, ми також досягли значного поліпшення продуктивності та зручності роботи розробників.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>2025 рік став переломним для pnpm. Хоча нашою основною метою було переосмислення моделі безпеки управління пакунками, ми також досягли значного поліпшення продуктивності та зручності роботи розробників.</p>
<p>Від стандартного блокування скриптів життєвого циклу до впровадження глобального віртуального сховища&nbsp;— ось огляд основних функцій, реалізованих у 2025 році.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="використання">Використання<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%B2%D0%B8%D0%BA%D0%BE%D1%80%D0%B8%D1%81%D1%82%D0%B0%D0%BD%D0%BD%D1%8F" class="hash-link" aria-label="Пряме посилання на Використання" title="Пряме посилання на Використання" translate="no">​</a></h2>
<p>Згідно зі <a href="https://npm-stat.com/charts.html?package=pnpm&amp;from=2016-12-01&amp;to=2025-12-29" target="_blank" rel="noopener noreferrer">статистикою завантажень</a>, pnpm було завантажено вдвічі більше, ніж у 2024 році!</p>
<p><img decoding="async" loading="lazy" src="https://pnpm.io/uk/assets/images/download-stats-2025-bc5a6c1e5b99cc9ed041229899d563f7.png" width="1990" height="758" class="img_M8jV"></p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="редизайн-головної-сторінки">Редизайн головної сторінки<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D1%80%D0%B5%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD-%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%BE%D1%97-%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B8" class="hash-link" aria-label="Пряме посилання на Редизайн головної сторінки" title="Пряме посилання на Редизайн головної сторінки" translate="no">​</a></h2>
<p>Ви, можливо, помітили, що ми змінили дизайн нашої головної сторінки! Цей редизайн став можливим завдяки нашому найвидатнішому спонсору, <a href="https://bit.cloud/" target="_blank" rel="noopener noreferrer">Bit.cloud</a>.</p>
<p>Нова головна сторінка тепер створена за допомогою <a href="https://bit.cloud/pnpm/website" target="_blank" rel="noopener noreferrer">компонентів Bit</a>, і значна частина роботи була виконана за допомогою агента штучного інтелекту Bit: <a href="https://bit.cloud/products/hope-ai" target="_blank" rel="noopener noreferrer">Hope AI</a>. У нас навіть є власна <a href="https://bit.cloud/pnpm/design" target="_blank" rel="noopener noreferrer">система дизайну тепер</a>.</p>
<div class="theme-admonition theme-admonition-info admonition_g_IF alert alert--info"><div class="admonitionHeading_Ll6V"><span class="admonitionIcon_pyky"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>інформація</div><div class="admonitionContent_e01q"><p>Я працюю повний робочий день у Bit над управлінням залежностями. Під капотом Bit <a href="https://github.com/teambit/bit/blob/9de9a2bce5183d79ee805c4fba3c3386e9384eac/workspace.jsonc#L52-L80" target="_blank" rel="noopener noreferrer">використовує pnpm для встановлення</a>.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="презентація-на-jsnation">Презентація на JSNation<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%BF%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D1%96%D1%8F-%D0%BD%D0%B0-jsnation" class="hash-link" aria-label="Пряме посилання на Презентація на JSNation" title="Пряме посилання на Презентація на JSNation" translate="no">​</a></h2>
<p>Цей рік став для мене важливим етапом, оскільки я вперше виступив з доповіддю на великій міжнародній конференції: JSNation, яка відбулася в червні в Амстердамі. Я хотів би подякувати команді JSNation за цю чудову можливість!</p>
<p><img decoding="async" loading="lazy" src="https://pnpm.io/uk/assets/images/jsnation-2025-e3a119ab673869a6dc5a2e2cd172487e.jpg" width="2048" height="1366" class="img_M8jV"></p>
<p>Я був приємно здивований, наскільки добре відомий pnpm у спільноті та скільки людей використовують його в роботі!</p>
<p>Моя презентація була про <a href="https://pnpm.io/uk/config-dependencies">залежності конфігурації</a>, і ви можете переглянути запис <a href="https://gitnation.com/contents/configurational-dependencies-in-pnpm" target="_blank" rel="noopener noreferrer">тут</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="основні-функції">Основні функції<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%96-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D1%96%D1%97" class="hash-link" aria-label="Пряме посилання на Основні функції" title="Пряме посилання на Основні функції" translate="no">​</a></h2>
<p>Тепер заглибмось в найважливіші зміни, що з'явилися в pnpm v10 протягом 2025 року.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="безпека-як-стандарт">Безпека як стандарт<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%B1%D0%B5%D0%B7%D0%BF%D0%B5%D0%BA%D0%B0-%D1%8F%D0%BA-%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82" class="hash-link" aria-label="Пряме посилання на Безпека як стандарт" title="Пряме посилання на Безпека як стандарт" translate="no">​</a></h3>
<p>Найзначнішим зрушенням цього року став перехід pnpm до «Безпеки як стандарт». У pnpm версії 10.0 ми перестали неявно довіряти встановленим пакункам.</p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="блокування-скриптів-життєвого-циклу-v100">Блокування скриптів життєвого циклу (<a href="https://github.com/pnpm/pnpm/releases/tag/v10.0.0" target="_blank" rel="noopener noreferrer">v10.0</a>)<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%B1%D0%BB%D0%BE%D0%BA%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%96%D0%B2-%D0%B6%D0%B8%D1%82%D1%82%D1%94%D0%B2%D0%BE%D0%B3%D0%BE-%D1%86%D0%B8%D0%BA%D0%BB%D1%83-v100" class="hash-link" aria-label="Пряме посилання на блокування-скриптів-життєвого-циклу-v100" title="Пряме посилання на блокування-скриптів-життєвого-циклу-v100" translate="no">​</a></h4>
<p>Протягом багатьох років команда <code>pnpm install</code> означала довіру до всього дерева залежностей для виконання довільного коду. У версії 10 цю функцію було вимкнено. pnpm більше стандартно не запускає скрипти <code>preinstall</code> або <code>postinstall</code>, що усуває величезну кількість векторів атак на ланцюжок постачання.</p>
<p>Щоб удосконалити цей контроль, ми ввели <a href="https://pnpm.io/uk/settings#allowbuilds"><code>allowBuilds</code></a> у <a href="https://pnpm.io/uk/blog/releases/10.26">v10.26</a>, замінивши попередній <code>onlyBuiltDependencies</code> більш гнучкою конфігурацією:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">allowBuilds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">esbuild</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Дозволити лише конкретні версії</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">nx@21.6.4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="ешелонований-захист-v1016-та-v1021">Ешелонований захист (<a href="https://pnpm.io/uk/blog/releases/10.16">v10.16</a> та <a href="https://pnpm.io/uk/blog/releases/10.21">v10.21</a>)<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%B5%D1%88%D0%B5%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9-%D0%B7%D0%B0%D1%85%D0%B8%D1%81%D1%82-v1016-%D1%82%D0%B0-v1021" class="hash-link" aria-label="Пряме посилання на ешелонований-захист-v1016-та-v1021" title="Пряме посилання на ешелонований-захист-v1016-та-v1021" translate="no">​</a></h4>
<p>Але ми не зупинилися лише на скриптах. Ми додали рівні захисту, щоб виловлювати шкідливі пакунки <em>ще до</em> того, як вони досягнуть вашого диска:</p>
<ul>
<li><strong><a href="https://pnpm.io/uk/settings#minimumreleaseage"><code>minimumReleaseAge</code></a></strong>: Блокує релізи "zero-day" (наприклад, пакунки, випущені менше ніж 24 години тому), даючи спільноті час позначити шкідливі оновлення.</li>
<li><strong><a href="https://pnpm.io/uk/settings#trustpolicy"><code>trustPolicy: no-downgrade</code></a></strong>: Запобігає встановленню оновлень, які мають гіршу репутацію, ніж попередні версії (наприклад, версія, опублікована без перевірки CI/CD).</li>
<li><strong><a href="https://pnpm.io/uk/settings#blockexoticsubdeps"><code>blockExoticSubdeps</code></a></strong>: Запобігає завантаженню перехідних залежностей з ненадійних джерел довіреними залежностями.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="глобальне-віртуальне-сховище-v1012">Глобальне віртуальне сховище (<a href="https://github.com/pnpm/pnpm/releases/tag/v10.12.1" target="_blank" rel="noopener noreferrer">v10.12</a>)<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D0%B5-%D0%B2%D1%96%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B5-%D1%81%D1%85%D0%BE%D0%B2%D0%B8%D1%89%D0%B5-v1012" class="hash-link" aria-label="Пряме посилання на глобальне-віртуальне-сховище-v1012" title="Пряме посилання на глобальне-віртуальне-сховище-v1012" translate="no">​</a></h3>
<p>Одним з оригінальних нововведень pnpm було сховище з адресацією контенту, яке заощаджує місце на диску шляхом дедуплікації файлів. У версії 10.12 ми пішли далі з <strong><a href="https://pnpm.io/uk/settings#enableglobalvirtualstore">Global Virtual Store</a></strong>.</p>
<p>Раніше проєкти мали власну структуру <code>node_modules</code>. Завдяки <code>enableGlobalVirtualStore: true</code>, pnpm тепер може безпосередньо повʼязувати залежності з центрального розташування на диску з вашим проєктом. Це означає:</p>
<ol>
<li><strong>Значна економія місця на диску</strong>: однакові графи залежностей використовуються в усіх проєктах.</li>
<li><strong>Швидше встановлення</strong>: Якщо у вас є 10 проєктів, що використовують <code>react@19</code>, pnpm потрібно лише один раз глобально підключити їх.</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="нативна-підтримка-jsr-v109">Нативна підтримка JSR (<a href="https://github.com/pnpm/pnpm/releases/tag/v10.9.0" target="_blank" rel="noopener noreferrer">v10.9</a>)<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%BD%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0-%D0%BF%D1%96%D0%B4%D1%82%D1%80%D0%B8%D0%BC%D0%BA%D0%B0-jsr-v109" class="hash-link" aria-label="Пряме посилання на нативна-підтримка-jsr-v109" title="Пряме посилання на нативна-підтримка-jsr-v109" translate="no">​</a></h3>
<p>Ми взяли на озброєння новий реєстр JSR з нативною підтримкою. Тепер ви можете встановлювати пакунки безпосередньо з <a href="https://pnpm.io/uk/package-sources#jsr-registry">JSR</a>, використовуючи протокол <code>jsr:</code>:</p>
<div class="language-bash codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-bash codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> jsr:@std/collections</span><br></span></code></pre></div></div>
<p>Це коректно відображається в <code>package.json</code> та безперешкодно обробляє унікальні правила розвʼязання JSR-пакунків разом із вашими залежностями npm.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="конфігураційні-залежності-v100">Конфігураційні залежності (v10.0)<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%BA%D0%BE%D0%BD%D1%84%D1%96%D0%B3%D1%83%D1%80%D0%B0%D1%86%D1%96%D0%B9%D0%BD%D1%96-%D0%B7%D0%B0%D0%BB%D0%B5%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%96-v100" class="hash-link" aria-label="Пряме посилання на Конфігураційні залежності (v10.0)" title="Пряме посилання на Конфігураційні залежності (v10.0)" translate="no">​</a></h3>
<p>Для монорепозиторіїв та складних налаштувань ми ввели <strong><a href="https://pnpm.io/uk/config-dependencies">Конфігураційні залежності</a></strong>. Ця функція дозволяє ділитися та консолідувати конфігурацію pnpm, таку як хуки, патчі та дозволи на збірку, між декількома проєктами.</p>
<p>Конфігураційні залежності встановлюються в <code>node_modules/.pnpm-config</code> <em>до</em> обробки основного графа залежностей. Це означає, що ви можете використовувати їх для:</p>
<ul>
<li>Спільне використання хуків <code>.pnpmfile.cjs</code> між репозиторіями.</li>
<li>Централізувати файли патчів для <code>patchedDependencies</code>.</li>
<li>Підтримувати спільний список пакунків, яким дозволено виконувати скрипти збірки для <code>allowBuilds</code>.</li>
</ul>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">pnpm-workspace.yaml</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">configDependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pnpm-plugin-my-company</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.0.0+sha512-..."</span><br></span></code></pre></div></div>
<p>Це гарантує, що ваша конфігурація pnpm має версії, є узгодженою та доступною саме тоді, коли це потрібно менеджеру пакунків.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="автоматичне-управління-javascript-runtime-v1014--v1021">Автоматичне управління JavaScript Runtime (v10.14 &amp; v10.21)<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%B5-%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%96%D0%BD%D0%BD%D1%8F-javascript-runtime-v1014--v1021" class="hash-link" aria-label="Пряме посилання на Автоматичне управління JavaScript Runtime (v10.14 &amp; v10.21)" title="Пряме посилання на Автоматичне управління JavaScript Runtime (v10.14 &amp; v10.21)" translate="no">​</a></h3>
<p>Ми вже деякий час підтримуємо керування середовищем виконання Node.js. У 2025 році ми розширили цю функцію, щоб підтримати інші середовища виконання, такі як Deno та Bun.</p>
<p>Тепер ви можете вказати потрібне середовище виконання в <code>package.json</code> через <a href="https://pnpm.io/uk/package_json#devenginesruntime"><code>devEngines.runtime</code></a>:</p>
<div class="language-json codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">package.json</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-json codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"devEngines"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"runtime"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"node"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"24.6.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>pnpm автоматично завантажить та використовуватиме цю конкретну версію середовища виконання для запуску скриптів у цьому проєкті. Це робить фразу «Працює на моїй машині» реліктом минулого&nbsp;— всі члени команди використовують однакове середовище виконання, яке повністю управляється pnpm.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="що-далі">Що далі<a href="https://pnpm.io/uk/blog/2025/12/29/pnpm-in-2025#%D1%89%D0%BE-%D0%B4%D0%B0%D0%BB%D1%96" class="hash-link" aria-label="Пряме посилання на Що далі" title="Пряме посилання на Що далі" translate="no">​</a></h2>
<p>Ми вже почали працювати над pnpm v11.0, яка має деякі помітні покращення продуктивності. Глобальне віртуальне сховище ще не є стандартно увімкненим. Ми працюватимемо над виправленнями помилок та відсутніми функціями, щоб потенційно зробити його стандартно увімкненим у майбутньому основному випуску.</p><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>recap</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.26]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.26</link>
            <guid>https://pnpm.io/uk/blog/releases/10.26</guid>
            <pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 10.26 вводить більш суворі стандартні налаштування безпеки для залежностей, що розміщуються на git, додає allowBuilds для детальних дозволів на виконання скриптів та включає нове налаштування для блокування екзотичних перехідних залежностей.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 10.26 вводить більш суворі стандартні налаштування безпеки для залежностей, що розміщуються на git, додає <code>allowBuilds</code> для детальних дозволів на виконання скриптів та включає нове налаштування для блокування екзотичних перехідних залежностей.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.26#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="суворіша-безпека-залежностей-git">Суворіша безпека залежностей Git<a href="https://pnpm.io/uk/blog/releases/10.26#%D1%81%D1%83%D0%B2%D0%BE%D1%80%D1%96%D1%88%D0%B0-%D0%B1%D0%B5%D0%B7%D0%BF%D0%B5%D0%BA%D0%B0-%D0%B7%D0%B0%D0%BB%D0%B5%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9-git" class="hash-link" aria-label="Пряме посилання на Суворіша безпека залежностей Git" title="Пряме посилання на Суворіша безпека залежностей Git" translate="no">​</a></h4>
<p><strong>Напів-порушення.</strong> Залежність, що розміщена на Git, тепер блокується від виконання скриптів <code>prepare</code> під час інсталяції, якщо це не дозволено явно в <code>onlyBuiltDependencies</code> (або <code>allowBuilds</code>) <a href="https://github.com/pnpm/pnpm/pull/10288" target="_blank" rel="noopener noreferrer">#10288</a>. Ця зміна запобігає виконанню шкідливого коду з ненадійних репозиторіїв git.</p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="allowbuilds"><code>allowBuilds</code><a href="https://pnpm.io/uk/blog/releases/10.26#allowbuilds" class="hash-link" aria-label="Пряме посилання на allowbuilds" title="Пряме посилання на allowbuilds" translate="no">​</a></h4>
<p>Додано новий параметр <code>allowBuilds</code>, який забезпечує гнучкий спосіб керування скриптами збірки. Він приймає набір відповідників пакунків, щоб явно дозволити (<code>true</code>) або заборонити (<code>false</code>) виконання скрипту. Це замінює <code>onlyBuiltDependencies</code> та <code>ignoredBuiltDependencies</code> як бажаний метод конфігурації <a href="https://github.com/pnpm/pnpm/pull/10311" target="_blank" rel="noopener noreferrer">#10311</a>.</p>
<p>Приклад:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">allowBuilds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">esbuild</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">core-js</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">nx@21.6.4 || 21.6.5</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="blockexoticsubdeps"><code>blockExoticSubdeps</code><a href="https://pnpm.io/uk/blog/releases/10.26#blockexoticsubdeps" class="hash-link" aria-label="Пряме посилання на blockexoticsubdeps" title="Пряме посилання на blockexoticsubdeps" translate="no">​</a></h4>
<p>Додано нове налаштування <code>blockExoticSubdeps</code> для підвищення безпеки ланцюга постачання. При встановленні значення <code>true</code> запобігає обробці екзотичних протоколів (таких як <code>git+ssh:</code> або безпосередньо <code>https:</code> tar-архівів) у перехідних залежностях. Тільки прямим залежностям дозволено використовувати екзотичні джерела <a href="https://github.com/pnpm/pnpm/pull/10265" target="_blank" rel="noopener noreferrer">#10265</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="хеш-цілісності-для-http-архівів">Хеш цілісності для HTTP-архівів<a href="https://pnpm.io/uk/blog/releases/10.26#%D1%85%D0%B5%D1%88-%D1%86%D1%96%D0%BB%D1%96%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%96-%D0%B4%D0%BB%D1%8F-http-%D0%B0%D1%80%D1%85%D1%96%D0%B2%D1%96%D0%B2" class="hash-link" aria-label="Пряме посилання на Хеш цілісності для HTTP-архівів" title="Пряме посилання на Хеш цілісності для HTTP-архівів" translate="no">​</a></h4>
<p><strong>Напів-порушення.</strong> pnpm тепер обчислює хеш цілісності для залежностей HTTP tar-архівів під час їх завантаження та зберігає його у файлі блокування. Це гарантує, що сервери не зможуть надавати змінений вміст під час наступних інсталяцій без належного виявлення <a href="https://github.com/pnpm/pnpm/pull/10287" target="_blank" rel="noopener noreferrer">#10287</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-pack---dry-run"><code>pnpm pack --dry-run</code><a href="https://pnpm.io/uk/blog/releases/10.26#pnpm-pack---dry-run" class="hash-link" aria-label="Пряме посилання на pnpm-pack---dry-run" title="Пряме посилання на pnpm-pack---dry-run" translate="no">​</a></h4>
<p>Додано підтримку <code>--dry-run</code> до команди <code>pack</code>. Це дозволяє перевірити, які файли будуть включені до tar-архіву, без його фактичного створення <a href="https://github.com/pnpm/pnpm/issues/10301" target="_blank" rel="noopener noreferrer">#10301</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.26#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Показати застарівання у форматі таблиці/списку, коли остання версія є застарілою <a href="https://github.com/pnpm/pnpm/issues/8658" target="_blank" rel="noopener noreferrer">#8658</a>.</li>
<li>Видалення налаштування <code>injectWorkspacePackages</code> із файлу блокування в команді <code>deploy</code> <a href="https://github.com/pnpm/pnpm/pull/10294" target="_blank" rel="noopener noreferrer">#10294</a>.</li>
<li>Нормалізація URL-адреси архівів tar перед збереженням їх у файлі блокування <a href="https://github.com/pnpm/pnpm/pull/10273" target="_blank" rel="noopener noreferrer">#10273</a>.</li>
<li>Виправлено нормалізацію URL-адрес для перенаправлених незмінних залежностей <a href="https://github.com/pnpm/pnpm/pull/10197" target="_blank" rel="noopener noreferrer">#10197</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.25]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.25</link>
            <guid>https://pnpm.io/uk/blog/releases/10.25</guid>
            <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm 10.25 покращує обробку сертифікатів, додає базовий pnpm init та містить кілька виправлень, що покращують якість роботи.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm 10.25 покращує обробку сертифікатів, додає базовий <code>pnpm init</code> та містить кілька виправлень, що покращують якість роботи.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.25#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="сертифікати-для-кожного-реєстру">Сертифікати для кожного реєстру<a href="https://pnpm.io/uk/blog/releases/10.25#%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D1%96%D0%BA%D0%B0%D1%82%D0%B8-%D0%B4%D0%BB%D1%8F-%D0%BA%D0%BE%D0%B6%D0%BD%D0%BE%D0%B3%D0%BE-%D1%80%D0%B5%D1%94%D1%81%D1%82%D1%80%D1%83" class="hash-link" aria-label="Пряме посилання на Сертифікати для кожного реєстру" title="Пряме посилання на Сертифікати для кожного реєстру" translate="no">​</a></h4>
<p>Тепер ви можете завантажувати вбудовані сертифікати з налаштувань <code>cert</code>, <code>ca</code> та <code>key</code> для конкретних URL-адрес реєстру (наприклад, <code>//registry.example.com/:ca=-----BEGIN CERTIFICATE-----...</code>). Раніше pnpm враховував лише записи <code>certfile</code>, <code>cafile</code> та <code>keyfile</code>. Це приводить pnpm у відповідність до поведінки npm <code>.npmrc</code> <a href="https://github.com/pnpm/pnpm/pull/10230" target="_blank" rel="noopener noreferrer">#10230</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-init---bare"><code>pnpm init --bare</code><a href="https://pnpm.io/uk/blog/releases/10.25#pnpm-init---bare" class="hash-link" aria-label="Пряме посилання на pnpm-init---bare" title="Пряме посилання на pnpm-init---bare" translate="no">​</a></h4>
<p>Додано прапорець <code>--bare</code> до <code>pnpm init</code> для створення <code>package.json</code> лише з обовʼязковими полями <a href="https://github.com/pnpm/pnpm/issues/10226" target="_blank" rel="noopener noreferrer">#10226</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.25#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Покращено звітування про ігноровані скрипти залежностей <a href="https://github.com/pnpm/pnpm/pull/10276" target="_blank" rel="noopener noreferrer">#10276</a>.</li>
<li><code>pnpm install</code> тепер збирає будь-які залежності, які були додані до <code>onlyBuiltDependencies</code>, але ще не запустили свої збірки <a href="https://github.com/pnpm/pnpm/pull/10256" target="_blank" rel="noopener noreferrer">#10256</a>.</li>
<li>Команда <code>pnpm publish -r --force</code> опублікує версію, навіть якщо вона вже існує в реєстрі, що відповідає наміру прапорця <a href="https://github.com/pnpm/pnpm/issues/10272" target="_blank" rel="noopener noreferrer">#10272</a>.</li>
<li>Запобігання помилкам <code>ERR_PNPM_MISSING_TIME</code>, коли пакунок, виключений з перевірок політики довіри, не має поля <code>time</code> у своїх метаданих.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Як ми захищаємо нашу редакцію від атак на ланцюжок постачання npm]]></title>
            <link>https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security</link>
            <guid>https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security</guid>
            <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We got lucky with Shai-Hulud 2.0.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>We got lucky with Shai-Hulud 2.0.</p>
<p>In November 2025, a self-replicating npm worm <a href="https://securitylabs.datadoghq.com/articles/shai-hulud-2.0-npm-worm/" target="_blank" rel="noopener noreferrer">compromised 796 packages</a> with 132 million monthly downloads. The attack used preinstall scripts to steal credentials, install persistent backdoors, and in some cases wipe entire developer environments. We weren't affected—not because we had robust defenses, but because we didn't run <code>npm install</code> or <code>npm update</code> during the attack window.</p>
<p>Luck isn't a security strategy.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="who-we-are">Who We Are<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#who-we-are" class="hash-link" aria-label="Пряме посилання на Who We Are" title="Пряме посилання на Who We Are" translate="no">​</a></h2>
<p>I'm Ryan Sobol, Principal Software Engineer at the Seattle Times. We've been using npm as our default package manager for years, with some brief experimentation with Yarn that never gained traction. Now we're piloting pnpm specifically for its client-side security controls that complement the registry-level improvements npm has been rolling out.</p>
<p>Trust is paramount for news organizations, especially these days. A supply chain compromise could expose customer data, employee credentials, production infrastructure, and source code—all things that could take weeks to recover from and potentially require breach notifications to our readers. We understand how expensive these incidents can be in both time and money. That's a path we don't want to go down.</p>
<p>Despite the organizational inertia that comes with sticking to npm, we think pnpm has a real chance here. It's a true drop-in replacement—same commands, same workflows, same registry. That makes the transition achievable in a way previous alternatives weren't.</p>
<p>This isn't a polished case study. It's a real-world data point from a team that's just starting to figure out supply chain security. The challenges we're encountering and how we're thinking about these controls might be useful as you consider implementing them yourself.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="why-client-side-controls-matter">Why Client-Side Controls Matter<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#why-client-side-controls-matter" class="hash-link" aria-label="Пряме посилання на Why Client-Side Controls Matter" title="Пряме посилання на Why Client-Side Controls Matter" translate="no">​</a></h2>
<p>npm has made tremendous progress on supply chain security. <a href="https://docs.npmjs.com/trusted-publishers/" target="_blank" rel="noopener noreferrer">Trusted publishing</a>, <a href="https://docs.npmjs.com/generating-provenance-statements/" target="_blank" rel="noopener noreferrer">provenance attestations</a>, and <a href="https://docs.npmjs.com/about-access-tokens/" target="_blank" rel="noopener noreferrer">granular access tokens</a> are all significant improvements that make it substantially harder to publish malicious packages after compromising maintainer accounts.</p>
<p>But here's the gap: these registry improvements protect the <em><strong>publishing</strong></em> side. They don't prevent <em><strong>consuming</strong></em> malicious packages.</p>
<p>When you run <code>npm install</code> or <code>npm update</code>, lifecycle scripts (e.g., preinstall and postinstall) execute arbitrary code from the internet with full developer privileges—before the package has been evaluated for safety. These scripts can access your credentials (npm, GitHub, AWS, databases), your source code, your cloud infrastructure, and your entire filesystem.</p>
<p>This is the fundamental vulnerability that attacks like Shai-Hulud exploit. Even with these registry improvements, if a legitimate maintainer's account is compromised, attackers can publish a version with malicious lifecycle scripts that execute immediately upon installation—before the community detects the compromise.</p>
<p>That's why we felt we needed defense on both sides: npm's improvements make it harder to <em><strong>publish</strong></em> malicious packages; pnpm's client-side controls make it harder to <em><strong>consume</strong></em> them. These approaches are complementary, not competitive. pnpm uses npm's registry and benefits from all of npm's security improvements while adding an additional layer of protection on the client side.</p>
<p>This is defense-in-depth.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="the-three-layers-were-using">The Three Layers We're Using<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#the-three-layers-were-using" class="hash-link" aria-label="Пряме посилання на The Three Layers We're Using" title="Пряме посилання на The Three Layers We're Using" translate="no">​</a></h2>
<p>For our pilot, we're using three pnpm security controls that work together. Each control addresses a different attack vector, and each has escape hatches for legitimate exceptions. We knew going in that we'd need those exceptions—the real world is messy.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="control-1-lifecycle-script-management">Control 1: Lifecycle Script Management<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#control-1-lifecycle-script-management" class="hash-link" aria-label="Пряме посилання на Control 1: Lifecycle Script Management" title="Пряме посилання на Control 1: Lifecycle Script Management" translate="no">​</a></h3>
<p>One of the main reasons we considered pnpm was learning that it <strong>blocks lifecycle scripts by default</strong>. Unlike other package managers, it doesn't implicitly trust and execute arbitrary code from packages.</p>
<p>In practice, when a package has preinstall or postinstall scripts, pnpm blocks them but installation continues with a warning. This already provides significant protection—malicious scripts won't execute without you explicitly allowing them. However, we were concerned that warnings would be too easy to ignore, especially since installation appears to succeed. We wanted stricter control with <code>strictDepBuilds: true</code>:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">pnpm-workspace.yaml</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">strictDepBuilds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">onlyBuiltDependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> package</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">necessary</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">build</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">scripts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">ignoredBuiltDependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> package</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">unnecessary</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">build</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">scripts</span><br></span></code></pre></div></div>
<p>By "necessary," we mean packages that genuinely need their lifecycle scripts to function—things like native extensions that compile from source or database drivers that link against platform-specific libraries. By "unnecessary," we mean scripts that are optional optimizations or setup steps that don't affect whether the package functions in our use case.</p>
<p>With <code>strictDepBuilds: true</code>, installation fails immediately when it encounters lifecycle scripts, forcing us to:</p>
<ol>
<li>Identify which packages have lifecycle scripts—pnpm tells you exactly which ones</li>
<li>Research what each script does, which can be as easy as feeding the self-contained preinstall or postinstall script into a generative AI for interpretation</li>
<li>Use human judgment to make a conscious, documented decision about whether to allow or block it</li>
</ol>
<p>For our team, this ensures we're making deliberate choices upfront rather than potentially discovering issues later.</p>
<p><strong>Note:</strong> The pnpm team is considering making <code>strictDepBuilds: true</code> the default behavior in v11, and is also exploring clearer naming for the allow/deny syntax based on feedback from teams implementing these controls in practice.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="control-2-release-cooldown">Control 2: Release Cooldown<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#control-2-release-cooldown" class="hash-link" aria-label="Пряме посилання на Control 2: Release Cooldown" title="Пряме посилання на Control 2: Release Cooldown" translate="no">​</a></h3>
<p>This control blocks installation of package versions published within a cooldown period. The idea is to give the community time to detect and remove malicious packages before they reach your environment.</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">pnpm-workspace.yaml</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">minimumReleaseAge</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> &lt;duration</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">in</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">minutes</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">minimumReleaseAgeExclude</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> package</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">critical</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hotfix@1.2.3</span><br></span></code></pre></div></div>
<p><strong>Our mindset shift:</strong> We had to retrain ourselves to stop thinking "newest is best." What we're learning is that from a supply chain security perspective, that's not always the case—slightly older can often be safer. A package that's been available for a period of time gives the community and security researchers time to detect potential issues.</p>
<p>Looking at recent attacks, malicious packages have been detected and removed in varying timeframes. The <a href="https://www.wiz.io/blog/widespread-npm-supply-chain-attack-breaking-down-impact-scope-across-debug-chalk" target="_blank" rel="noopener noreferrer">September 2025 npm supply chain attack</a> that compromised debug, chalk, and 16 other packages saw removal within about 2.5 hours, while <a href="https://securitylabs.datadoghq.com/articles/shai-hulud-2.0-npm-worm/" target="_blank" rel="noopener noreferrer">Shai-Hulud 2.0</a> (November 2025) took about 12 hours. Every attack is different and every recovery timeline will vary, but the appropriate cooldown period depends on your organization's risk tolerance—it could be measured in hours, days, or weeks. Either way, a cooldown period would have blocked these attacks.</p>
<p><strong>The trade-off we accepted:</strong> Given the scale of our organization and our priorities, we're not always on the absolute latest versions of packages—despite best efforts. So this cooldown policy aligns more with our reality than it disrupts it. When we genuinely need a newer version (critical security patches, breaking bugs), we can temporarily exempt it after review.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="control-3-trust-policy">Control 3: Trust Policy<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#control-3-trust-policy" class="hash-link" aria-label="Пряме посилання на Control 3: Trust Policy" title="Пряме посилання на Control 3: Trust Policy" translate="no">​</a></h3>
<p>This control blocks installation when a package version has weaker authentication than previously published versions—often a sign that an attacker compromised maintainer credentials and published from their own machine instead of the official CI/CD pipeline.</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_KdeV">pnpm-workspace.yaml</div><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">trustPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> no</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">downgrade</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">trustPolicyExclude</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> package</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">that</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">migrated</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cicd@1.2.3</span><br></span></code></pre></div></div>
<p><strong>How it works:</strong> npm tracks three trust levels for published packages (strongest to weakest):</p>
<ol>
<li><strong>Trusted Publisher:</strong> Published via GitHub Actions with OIDC tokens and npm provenance</li>
<li><strong>Provenance:</strong> Signed attestation from a CI/CD system</li>
<li><strong>No Trust Evidence:</strong> Published with username/password or token authentication</li>
</ol>
<p>If a newer version has weaker authentication than an older version, installation fails. For example, if v1.0.0 was published with Trusted Publisher but v1.0.1 was published with basic auth, pnpm blocks v1.0.1.</p>
<p>In the <a href="https://www.wiz.io/blog/s1ngularity-supply-chain-attack" target="_blank" rel="noopener noreferrer">s1ngularity attack</a> in August 2025, attackers compromised maintainer credentials and published malicious versions from their own machines. Because they didn't have CI/CD access, the malicious versions had no provenance—a clear trust downgrade. This control would have blocked installation.</p>
<p><strong>When trust downgrades might be legitimate:</strong> New maintainer who hasn't set up provenance yet, CI/CD system migration, emergency hotfix published manually while CI/CD was down. In these cases, we'd investigate why the trust level decreased, verify it's safe, then add to <code>trustPolicyExclude</code>.</p>
<p><strong>Note:</strong> This feature was added to pnpm in November 2025 and is quite new. We're still learning how often legitimate trust downgrades occur in practice.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="how-they-work-together-the-react-example">How They Work Together: The React Example<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#how-they-work-together-the-react-example" class="hash-link" aria-label="Пряме посилання на How They Work Together: The React Example" title="Пряме посилання на How They Work Together: The React Example" translate="no">​</a></h2>
<p>We don't see any of these controls as a silver bullet. They work as layers of defense—when we need to make an exception for one control, the other layers continue protecting us.</p>
<p>Let's look at a real scenario: the <a href="https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components" target="_blank" rel="noopener noreferrer">critical React vulnerability</a> disclosed in December 2025.</p>
<p>This was a serious security issue that required immediate patching. Normally, our release cooldown would prevent us from installing a package version published so recently. But this was a critical security patch—we couldn't wait.</p>
<p>Here's how the layered defense would work in this scenario:</p>
<p><strong>What you'd do:</strong> Add the specific React version to <code>minimumReleaseAgeExclude</code> after reviewing the vulnerability disclosure and verifying the patch was legitimate.</p>
<p><strong>What still protects you:</strong></p>
<ul>
<li><strong>Lifecycle Script Management</strong> is still active—if an attacker had injected malicious lifecycle scripts into the React patch, they would be blocked (React normally has no lifecycle scripts, so any scripts would be immediately suspicious)</li>
<li><strong>Trust Policy</strong> is still active—if an attacker had compromised React's publishing credentials and pushed a malicious "patch" from their own machine, the trust downgrade would be blocked</li>
</ul>
<p>This is why we think exceptions are expected and okay. You make a conscious, documented decision to bypass one control for a legitimate reason, but you still have robust protection from the other layers. No single point of failure.</p>
<p>This is what defense-in-depth looks like in practice for us.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="our-pilot-experience">Our Pilot Experience<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#our-pilot-experience" class="hash-link" aria-label="Пряме посилання на Our Pilot Experience" title="Пряме посилання на Our Pilot Experience" translate="no">​</a></h2>
<p>We implemented all three security controls in one of our backend services as a proof of concept. Total setup time: a few hours to research, understand, and define our approach.</p>
<p>During setup, pnpm identified three packages with lifecycle scripts:</p>
<ul>
<li><strong>esbuild:</strong> Optimizes CLI tool startup by milliseconds—not needed since we only use the JavaScript API</li>
<li><strong>@firebase/util:</strong> Auto-configures client SDK—not needed since we only use the server SDK</li>
<li><strong>protobufjs:</strong> Checks version schema compatibility—not needed since it's a transitive dependency</li>
</ul>
<p>We researched what each script did (reading documentation and feeding the scripts to AI for interpretation), determined none were necessary for our use case, and blocked them. Zero impact on functionality.</p>
<p>That was it. A few hours of initial investment for ongoing protection against Shai-Hulud-style attacks.</p>
<p><strong>What the friction feels like:</strong> These controls create friction by design—and for us, that's a feature, not a bug. The friction forces conscious decisions about what code runs in our environment rather than implicitly trusting everything. When new dependencies have scripts, we anticipate it will take around 15 minutes to review and document the decision.</p>
<p>We expect that the friction will become more intuitive with practice as we get more familiar with the process.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="what-were-learning">What We're Learning<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#what-were-learning" class="hash-link" aria-label="Пряме посилання на What We're Learning" title="Пряме посилання на What We're Learning" translate="no">​</a></h2>
<p>A few things we've learned from our pilot:</p>
<p><strong>The defense-in-depth model actually works.</strong> Having multiple layers on the client side—plus the benefits from npm's publishing-side improvements—means we can be pragmatic about exceptions. When we need to bypass one control for a legitimate reason, the others are still protecting us. This removes the anxiety of making exceptions—they're not security failures, they're the system working as designed.</p>
<p><strong>The mental model takes time.</strong> There's a learning curve to thinking "security-first" rather than "convenience-first." But once the mental model clicks—that slightly older packages are safer, that explicit decisions are better than implicit trust—the workflow feels natural.</p>
<p><strong>These controls are practical for mid-sized teams.</strong> We're not a large tech company with a dedicated security team. We're a mid-sized news media organization with limited engineering resources. If we can implement these controls successfully, they're accessible to most teams.</p>
<p><strong>We're still learning.</strong> The threat landscape evolves, and our approach will too. The trust policy feature is only a few weeks old, and we don't yet know how often legitimate trust downgrades will occur in practice. We're planning to expand these controls to other codebases in the near future, which will give us more data on how they scale with applications with different dependency graphs.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="for-other-teams-considering-this">For Other Teams Considering This<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#for-other-teams-considering-this" class="hash-link" aria-label="Пряме посилання на For Other Teams Considering This" title="Пряме посилання на For Other Teams Considering This" translate="no">​</a></h2>
<p>If you're considering pnpm's security controls, here's what worked for us:</p>
<p><strong>Start with one project.</strong> Piloting on a single codebase first let us get comfortable with the workflow, understand the friction points, and build confidence before considering a broader rollout.</p>
<p><strong>Plan for exceptions upfront.</strong> Go in expecting you'll need exceptions for lifecycle scripts (packages that need compilation), release cooldowns (critical security patches), and trust downgrades (CI/CD migrations). This isn't failure—it's how the system is designed to work.</p>
<p><strong>Use <code>strictDepBuilds: true</code> from day one.</strong> Relying on warnings felt too risky for us. We wanted installation to fail immediately and force the decision. This prevents packages from potentially misbehaving later and ensures deliberate choices.</p>
<p><strong>Document every exception.</strong> Write down why you allowed a lifecycle script or exempted a package. This creates an audit trail, helps future team members understand the reasoning, and makes it easy to clean up exceptions later.</p>
<p><strong>Trust the layers.</strong> When you make an exception for one control, remember the other two are still protecting you. The defense-in-depth model gives you room to be pragmatic.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="share-your-experience">Share Your Experience<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#share-your-experience" class="hash-link" aria-label="Пряме посилання на Share Your Experience" title="Пряме посилання на Share Your Experience" translate="no">​</a></h2>
<p>We'd love to hear from other teams implementing these controls or considering them. What's working? What's challenging? What have you learned? Join the conversation in the <a href="https://github.com/orgs/pnpm/discussions" target="_blank" rel="noopener noreferrer">pnpm GitHub Discussions</a> or share your experiences on social media—we're all learning together.</p>
<h2 class="anchor anchorWithStickyNavbar_VHH3" id="thank-you">Thank You<a href="https://pnpm.io/uk/blog/2025/12/05/newsroom-npm-supply-chain-security#thank-you" class="hash-link" aria-label="Пряме посилання на Thank You" title="Пряме посилання на Thank You" translate="no">​</a></h2>
<p>Thanks to the pnpm team for building these controls and for the thoughtful way they've approached making them both powerful and practical. And thanks for inviting us to share our story.</p>
<p>The work you're doing matters. These controls provide real protection that complements npm's registry improvements. Together, they give teams like ours a fighting chance against increasingly sophisticated supply chain attacks.</p>
<hr>
<p><em>Ryan Sobol is a Principal Software Engineer at the Seattle Times, where he works on mobile and web development, cloud infrastructure, and developer tooling. The views expressed here are his own and based on the Seattle Times' pilot implementation of pnpm's security controls.</em></p><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[pnpm 10.24]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.24</link>
            <guid>https://pnpm.io/uk/blog/releases/10.24</guid>
            <pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[pnpm тепер автоматично масштабує мережевий паралелізм на машинах з великою кількістю ядер і містить кілька виправлень для підвищення надійності.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>pnpm тепер автоматично масштабує мережевий паралелізм на машинах з великою кількістю ядер і містить кілька виправлень для підвищення надійності.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.24#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="адаптивний-мережевий-паралелізм">Адаптивний мережевий паралелізм<a href="https://pnpm.io/uk/blog/releases/10.24#%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%B8%D0%B9-%D0%BC%D0%B5%D1%80%D0%B5%D0%B6%D0%B5%D0%B2%D0%B8%D0%B9-%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%B5%D0%BB%D1%96%D0%B7%D0%BC" class="hash-link" aria-label="Пряме посилання на Адаптивний мережевий паралелізм" title="Пряме посилання на Адаптивний мережевий паралелізм" translate="no">​</a></h4>
<p>Мережевий паралелізм тепер автоматично масштабується в діапазоні від 16 до 64 на основі кількості робочих процесів pnpm (робочі процеси × 3). Це збільшує пропускну здатність на машинах з великою кількістю ядер процесора, зберігаючи при цьому передбачуване використання ресурсів на менших конфігураціях <a href="https://github.com/pnpm/pnpm/issues/10068" target="_blank" rel="noopener noreferrer">#10068</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.24#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li><code>trustPolicy</code> тепер ігнорує підтвердження довіри з попередніх версій під час встановлення не попередньої версії, тому довірена попередня версія не може блокувати встановлення стабільної версії, якій бракує підтвердження довіри.</li>
<li>Обробка помилок <code>ENOENT</code>, що виникають у функції <code>fs.linkSync()</code>, які можуть траплятися в контейнерних середовищах (OverlayFS) замість <code>EXDEV</code>. pnpm тепер коректно повертається до <code>fs.copyFileSync()</code> у цих випадках <a href="https://github.com/pnpm/pnpm/issues/10217" target="_blank" rel="noopener noreferrer">#10217</a>.</li>
<li>Скасовано: <code>pnpm self-update</code> завантажує pnpm з налаштованого реєстру npm <a href="https://github.com/pnpm/pnpm/pull/10205" target="_blank" rel="noopener noreferrer">#10205</a>.</li>
<li>Пакунки, які не мають файлу <code>package.json</code> (як-от Node.js), більше не імпортуються повторно зі сховища під час кожного встановлення. pnpm тепер перевіряє додатковий файл для перевірки пакунка в <code>node_modules</code>.</li>
<li>Правильне зчитування токенів автентифікації для URL-адрес, що містять підкреслення <a href="https://github.com/pnpm/npm-conf/pull/17" target="_blank" rel="noopener noreferrer">#17</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.23]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.23</link>
            <guid>https://pnpm.io/uk/blog/releases/10.23</guid>
            <pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Додано опцію --lockfile-only до pnpm list та різні покращення до pnpm self-update.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>Додано опцію <code>--lockfile-only</code> до <code>pnpm list</code> та різні покращення до <code>pnpm self-update</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.23#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-list---lockfile-only"><code>pnpm list --lockfile-only</code><a href="https://pnpm.io/uk/blog/releases/10.23#pnpm-list---lockfile-only" class="hash-link" aria-label="Пряме посилання на pnpm-list---lockfile-only" title="Пряме посилання на pnpm-list---lockfile-only" translate="no">​</a></h4>
<p>Додано опцію <code>--lockfile-only</code> до <code>pnpm list</code> <a href="https://github.com/pnpm/pnpm/issues/10020" target="_blank" rel="noopener noreferrer">#10020</a>.</p>
<p>Якщо вказано, <code>pnpm list</code> буде зчитувати інформацію про пакунки з файлу блокування замість перевірки фактичної теки <code>node_modules</code>. Це корисно для швидкої перевірки того, що буде встановлено, без необхідності повної установки.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.23#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Команда <code>pnpm self-update</code> має завантажити pnpm з налаштованого реєстру npm <a href="https://github.com/pnpm/pnpm/pull/10205" target="_blank" rel="noopener noreferrer">#10205</a>.</li>
<li><code>pnpm self-update</code> завжди повинен встановлювати невиконуваний пакунок pnpm (pnpm у реєстрі) і ніколи пакунок <code>@pnpm/exe</code> під час встановлення v11 або новішої версії. Наразі ми не можемо надсилати <code>@pnpm/exe</code>, оскільки <code>pkg</code> не працює з ESM <a href="https://github.com/pnpm/pnpm/pull/10190" target="_blank" rel="noopener noreferrer">#10190</a>.</li>
<li>Node.js runtime не додається до "dependencies" у <code>pnpm add</code>, якщо в <code>package.json</code> оголошено налаштування <code>engines.runtime</code> <a href="https://github.com/pnpm/pnpm/issues/10209" target="_blank" rel="noopener noreferrer">#10209</a>.</li>
<li>Інсталяція має завершитися невдачею, якщо додаткову залежність неможливо встановити через помилку перевірки політики довіри <a href="https://github.com/pnpm/pnpm/issues/10208" target="_blank" rel="noopener noreferrer">#10208</a>.</li>
<li><code>pnpm list</code> та <code>pnpm why</code> тепер показують протокол npm: для пакунків з аліасами (наприклад, <code>foo npm:is-odd@3.0.1</code>) <a href="https://github.com/pnpm/pnpm/issues/8660" target="_blank" rel="noopener noreferrer">#8660</a>.</li>
<li>Не додавати зайву скісну риску до URL-адреси дзеркала Node.js <a href="https://github.com/pnpm/pnpm/pull/10204" target="_blank" rel="noopener noreferrer">#10204</a>.</li>
<li><code>pnpm store prune</code> не повинно завершуватися невдачею, якщо сховище містить пакунки Node.js <a href="https://github.com/pnpm/pnpm/issues/10131" target="_blank" rel="noopener noreferrer">#10131</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.22]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.22</link>
            <guid>https://pnpm.io/uk/blog/releases/10.22</guid>
            <pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Додано підтримку виключення пакунків із політики довіри та перевизначення поля engines під час публікації.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>Додано підтримку виключення пакунків із політики довіри та перевизначення поля <code>engines</code> під час публікації.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.22#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="винятки-з-політики-довіри">Винятки з політики довіри<a href="https://pnpm.io/uk/blog/releases/10.22#%D0%B2%D0%B8%D0%BD%D1%8F%D1%82%D0%BA%D0%B8-%D0%B7-%D0%BF%D0%BE%D0%BB%D1%96%D1%82%D0%B8%D0%BA%D0%B8-%D0%B4%D0%BE%D0%B2%D1%96%D1%80%D0%B8" class="hash-link" aria-label="Пряме посилання на Винятки з політики довіри" title="Пряме посилання на Винятки з політики довіри" translate="no">​</a></h4>
<p>Додано підтримку для <a href="https://pnpm.io/uk/settings#trustpolicyexclude"><code>trustPolicyExclude</code></a>.</p>
<p>Тепер ви можете вказати один або кілька конкретних пакунків або версій, які pnpm повинен дозволити встановлювати, навіть якщо ці пакунки не відповідають вимогам політики довіри. Наприклад:</p>
<div class="language-yaml codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-yaml codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">trustPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> no</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">downgrade</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">trustPolicyExclude</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> chokidar@4.0.3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> webpack@4.47.0 </span><span class="token punctuation" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> 5.102.1</span><br></span></code></pre></div></div>
<p>Див. тікет: <a href="https://github.com/pnpm/pnpm/issues/10164" target="_blank" rel="noopener noreferrer">#10164</a></p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="перевизначення-поля-engines-при-публікації">Перевизначення поля engines при публікації<a href="https://pnpm.io/uk/blog/releases/10.22#%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%B8%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%BD%D1%8F-%D0%BF%D0%BE%D0%BB%D1%8F-engines-%D0%BF%D1%80%D0%B8-%D0%BF%D1%83%D0%B1%D0%BB%D1%96%D0%BA%D0%B0%D1%86%D1%96%D1%97" class="hash-link" aria-label="Пряме посилання на Перевизначення поля engines при публікації" title="Пряме посилання на Перевизначення поля engines при публікації" translate="no">​</a></h4>
<p>Дозволяє замінити поле <code>engines</code> при публікації значенням поля <code>publishConfig.engines</code>.</p>
<p>Це дозволяє вказати для опублікованого пакунка інші вимоги до рушія, ніж ті, що використовуються під час розробки.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.22#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Запобігання збою, коли два процеси pnpm одночасно створюють жорсткі посилання на вміст теки в одне й те саме місце призначення <a href="https://github.com/pnpm/pnpm/issues/10179" target="_blank" rel="noopener noreferrer">#10179</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.21]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.21</link>
            <guid>https://pnpm.io/uk/blog/releases/10.21</guid>
            <pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Додано підтримку встановлення середовища виконання Node.js для залежностей та налаштування політики довіри.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>Додано підтримку встановлення середовища виконання Node.js для залежностей та налаштування політики довіри.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.21#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="встановлення-середовища-виконання-nodejs-для-залежностей">Встановлення середовища виконання Node.js для залежностей<a href="https://pnpm.io/uk/blog/releases/10.21#%D0%B2%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8F-%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%BE%D0%B2%D0%B8%D1%89%D0%B0-%D0%B2%D0%B8%D0%BA%D0%BE%D0%BD%D0%B0%D0%BD%D0%BD%D1%8F-nodejs-%D0%B4%D0%BB%D1%8F-%D0%B7%D0%B0%D0%BB%D0%B5%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9" class="hash-link" aria-label="Пряме посилання на Встановлення середовища виконання Node.js для залежностей" title="Пряме посилання на Встановлення середовища виконання Node.js для залежностей" translate="no">​</a></h4>
<p>Додано підтримку автоматичного встановлення середовища виконання Node.js для залежностей. pnpm тепер встановить версію Node.js, необхідну для залежності, якщо ця залежність оголошує середовище виконання Node.js у полі <a href="https://pnpm.io/uk/package_json#enginesruntime"><code>engines.runtime</code></a>. Наприклад:</p>
<div class="language-json codeBlockContainer_pbKI theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cWnm"><pre tabindex="0" class="prism-code language-json codeBlock_dUJW thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_wqoa"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token property" style="color:#36acaa">"engines"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"runtime"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"node"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^24.11.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"onFail"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"download"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Якщо пакунок із залежностями середовища виконання Node.js є CLI-застосунком, pnpm прив’яже CLI-застосунок до необхідної версії Node.js. Це гарантує, що незалежно від глобально встановленого екземпляра Node.js, CLI буде використовувати сумісну версію Node.js.</p>
<p>Якщо пакунок містить скрипт <code>postinstall</code>, цей скрипт буде виконано з використанням вказаної версії Node.js.</p>
<p>Див. PR: <a href="https://github.com/pnpm/pnpm/pull/10141" target="_blank" rel="noopener noreferrer">#10141</a></p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="політика-довіри">Політика довіри<a href="https://pnpm.io/uk/blog/releases/10.21#%D0%BF%D0%BE%D0%BB%D1%96%D1%82%D0%B8%D0%BA%D0%B0-%D0%B4%D0%BE%D0%B2%D1%96%D1%80%D0%B8" class="hash-link" aria-label="Пряме посилання на Політика довіри" title="Пряме посилання на Політика довіри" translate="no">​</a></h4>
<p>Додано новий параметр: <a href="https://pnpm.io/uk/settings#trustpolicy"><code>trustPolicy</code></a>.</p>
<p>При встановленні значення <code>no-downgrade</code> pnpm видасть помилку, якщо рівень довіри до пакунка знизився порівняно з попередніми версіями. Наприклад, якщо пакунок раніше був опублікований надійним видавцем, але зараз має лише походження або не має доказів надійності, встановлення не відбудеться. Це допомагає запобігти встановленню потенційно небезпечних версій.</p>
<p>Див. тікет: <a href="https://github.com/pnpm/pnpm/issues/8889" target="_blank" rel="noopener noreferrer">#8889</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="інші-функції">Інші функції<a href="https://pnpm.io/uk/blog/releases/10.21#%D1%96%D0%BD%D1%88%D1%96-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D1%96%D1%97" class="hash-link" aria-label="Пряме посилання на Інші функції" title="Пряме посилання на Інші функції" translate="no">​</a></h4>
<ul>
<li>Додано підтримку команди <code>pnpm config get globalconfig</code> для отримання шляху до файлу глобальної конфігурації <a href="https://github.com/pnpm/pnpm/issues/9977" target="_blank" rel="noopener noreferrer">#9977</a>.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.21#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Коли користувач запускає <code>pnpm update</code> для залежності, яка безпосередньо не вказана в <code>package.json</code>, жодна з прямих залежностей не повинна оновлюватися <a href="https://github.com/pnpm/pnpm/pull/10155" target="_blank" rel="noopener noreferrer">#10155</a>.</li>
<li>Запобігання збою, коли два процеси pnpm одночасно створюють жорсткі посилання на вміст теки в одне й те саме місце призначення <a href="https://github.com/pnpm/pnpm/pull/10160" target="_blank" rel="noopener noreferrer">#10160</a>.</li>
<li>Налаштування <code>gitBranchLockfile</code> та пов'язаних з ним параметрів через <code>pnpm-workspace.yaml</code> має працювати <a href="https://github.com/pnpm/pnpm/issues/9651" target="_blank" rel="noopener noreferrer">#9651</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[pnpm 10.20]]></title>
            <link>https://pnpm.io/uk/blog/releases/10.20</link>
            <guid>https://pnpm.io/uk/blog/releases/10.20</guid>
            <pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[У цьому випуску додано прапорець --all для команди pnpm help, щоб виводити всі команди.]]></description>
            <content:encoded><![CDATA[<div id="bsa-custom-01" class="bsa-standard"></div><p>У цьому випуску додано прапорець <code>--all</code> для команди <code>pnpm help</code>, щоб виводити всі команди.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="незначні-зміни">Незначні зміни<a href="https://pnpm.io/uk/blog/releases/10.20#%D0%BD%D0%B5%D0%B7%D0%BD%D0%B0%D1%87%D0%BD%D1%96-%D0%B7%D0%BC%D1%96%D0%BD%D0%B8" class="hash-link" aria-label="Пряме посилання на Незначні зміни" title="Пряме посилання на Незначні зміни" translate="no">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_VHH3" id="pnpm-help---all"><code>pnpm help --all</code><a href="https://pnpm.io/uk/blog/releases/10.20#pnpm-help---all" class="hash-link" aria-label="Пряме посилання на pnpm-help---all" title="Пряме посилання на pnpm-help---all" translate="no">​</a></h4>
<p>Додано підтримку опції <code>--all</code> у <code>pnpm help</code> для перегляду всіх команд <a href="https://github.com/pnpm/pnpm/pull/8628" target="_blank" rel="noopener noreferrer">#8628</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_VHH3" id="зміни-в-патчах">Зміни в патчах<a href="https://pnpm.io/uk/blog/releases/10.20#%D0%B7%D0%BC%D1%96%D0%BD%D0%B8-%D0%B2-%D0%BF%D0%B0%D1%82%D1%87%D0%B0%D1%85" class="hash-link" aria-label="Пряме посилання на Зміни в патчах" title="Пряме посилання на Зміни в патчах" translate="no">​</a></h3>
<ul>
<li>Якщо <code>latest</code> версія не відповідає вимогам зрілості, налаштованим за допомогою <code>minimumReleaseAge</code>, виберіть найвищу версію, яка є достатньо зрілою, навіть якщо вона має іншу основну версію <a href="https://github.com/pnpm/pnpm/issues/10100" target="_blank" rel="noopener noreferrer">#10100</a>.</li>
<li>Команда <code>create</code> не повинна перевіряти інформацію про патч.</li>
<li>Встановіть для <code>managePackageManagerVersions</code> значення <code>false</code> під час перемикання на іншу версію інтерфейсу командного рядка pnpm, щоб уникнути подальших перемикань <a href="https://github.com/pnpm/pnpm/issues/10063" target="_blank" rel="noopener noreferrer">#10063</a>.</li>
</ul><script src="//m.servedby-buysellads.com/monetization.custom.js"></script><script>"undefined"!=typeof _bsa&&_bsa&&_bsa.init("custom","CWYI4K7E","placement:pnpmio",{target:"#bsa-custom-01",template:`
<a href="##link##" class="native-banner" style="background: ##backgroundColor##" rel="sponsored noopener" target="_blank" title="##company## — ##tagline##">
<img class="native-img" width="125" src="##logo##" />
<div class="native-main">
  <div class="native-details" style="
      color: ##textColor##;
      border-left: solid 1px ##textColor##;
    ">
    <span class="native-desc">##description##</span>
  </div>
  <span class="native-cta" style="
      color: ##ctaTextColor##;
      background-color: ##ctaBackgroundColor##;
    ">##callToAction##</span>
</div>
</a>
`})</script>]]></content:encoded>
            <category>release</category>
        </item>
    </channel>
</rss>