Yama Değişiklikleri

  • pnpm install, Cargo crate'lerinin veya Rust toolchain'inin de kurulduğu bir workspace'te boş bir store ile başlatıldığında artık takılı kalmıyor.
  • pnpm pack ve pnpm publish, artık npm'de olduğu gibi bir dosyayı doğrudan belirten files girdisini glob ve dizin girdilerinden sonra uyguluyor. !dist/index.js gibi adıyla hariç tutulan bir dosya, daha sonraki bir dist/** eşleşmesine rağmen pakete dâhil edilmiyor. lib/secret.js gibi doğrudan yoluyla belirtilen bir dosya ise daha sonraki bir !lib/*.js eşleşmesine rağmen pakete dâhil ediliyor.
  • pnpm install, paket yayımlanan dosyalarının dışındaki bir dosyaya bağlantı verdiğinde ve pnpm hardlink ile içe aktarma yaptığında, enjekte edilmiş workspace bağımlılığında artık bozuk symlink bırakmıyor. Git bağımlılığı kurulurken dosyalar store'a aktarılırken dahili dizin symlink'leri artık atlanıyor.
  • sharedWorkspaceLockfile değeri false olduğunda pnpm install, bir workspace projesinin yeniden adlandırdığı komutu artık bu projeye bağımlı olan projelerde yeniden bağlıyor.
  • pnpm install ve pnpm rebuild, bir bağımlılığın derlenmesi sonucunda script hedefi native executable ile değiştirildiğinde node_modules/.pnpm/node_modules/.bin içindeki privately hoisted .bin shim'lerini artık yeniliyor.
  • pnpm install, mevcut bir lockfile'ı güncellerken paketin peer dependency'lerini belirlemek için artık sıfırdan çözümleme sırasında olduğu gibi paketin manifest dosyasını okuyor.
  • Komutlar, pnpm --version, pnpm self-update ve bilinmeyen flag'lerle yapılan çağrılar; sabitlenmiş pnpm sürümüne geçerken veya bu sürümü pnpm-lock.yaml dosyasına kaydederken artık aynı packageManager ve devEngines.packageManager ayarlarını uyguluyor. --config.<key> flag'leri ve lockfileDir artık tüm giriş noktalarında sürüm geçişine ve lockfile senkronizasyonuna aktarılıyor. pnpm-workspace.yaml veya global config.yaml içindeki okunamayan ancak sürüm sabitleme kararını etkilemeyen ayarlar artık sürüm geçişini engellemiyor.
  • pnpm artık --cache-dir <dir> flag'ini destekliyor. Örneğin: pnpm install --cache-dir /tmp/pnpm-cache.
  • pnpm unpublish komutuna verilen sürüm veya sürüm aralığı yayımlanmış tüm sürümlerle eşleştiğinde hata mesajı artık bunu açıkça belirtiyor ve aynı komutun --force ile kullanılacak hâlini gösteriyor. Önceden hata mesajı, az önce başarısız olmuş olan pnpm unpublish <pkg>@<version> komutunun çalıştırılmasını öneriyordu.
Bu sürümle birlikte pnpm-workspace.yaml, yeni include field’ı üzerinden setting’leri diğer file’lara ve config dependency’lere devredebiliyor. Ayrıca lockfile.integrityTarget: tar, tar registry desteği ve zstd-compressed registry response desteği eklendi. pnpm deploy ve pnpm install artık SOURCE_DATE_EPOCH değerini dikkate alıyor. Registry metadata’sının istenenden farklı bir package name döndürmesi engellendi ve workspace install ile macOS file linking performansı iyileştirildi.

Küçük Değişiklikler​


  • pnpm-workspace.yaml artık yeni include field’ı üzerinden setting’leri diğer YAML file’larına ve config dependency’lere devredebiliyor. Her source yalnızca root manifest tarafından kendisine devredilen setting’leri tanımlayabiliyor ve her setting’in tek bir owner’ı bulunuyor. Setting değiştiren command’lar ilgili setting’i owner file’a yazıyor. Included file içerisindeki relative path’ler o file’ın konumuna göre resolve ediliyor.
  • Config dependency, setting’lerini package.json içerisindeki pnpm.config field’ında belirtilen YAML file üzerinden sağlıyor. Yeni bootConfig setting’i, pnpm’in config dependency’leri ve packageManager üzerinden belirtilen pnpm sürümünü kurarken kullanacağı release-age ve trust policy’yi belirliyor.
  • lockfile.integrityTarget setting’i eklendi. integrityTarget: tar kullanıldığında pnpm-lock.yaml, her package’ın uncompressed tar hash’ini sabitliyor. Böylece registry tarball’ları yeniden compress ettiğinde veya doğrudan tar olarak sunduğunda lockfile değişmiyor. pnpm bir version’ın tar hash’ini store’dan veya bir kez download ederek öğreniyor. pnpm audit signatures, tar hash’ini imzalanmış .tgz integrity değeriyle ilişkilendiriyor.
YAML:
lockfile:
integrityTarget: tar

  • pnpm artık uncompressed tar’ları zstd veya gzip content coding ile sunan registry’lerden installation yapabiliyor. pnpm-lock.yaml her tar’ın hash’ini kaydediyor. Böyle bir registry, registries içerisinde serverType: pnpr olarak tanımlanarak tarball URL’lerinin lockfile’a yazılması önlenebiliyor.
  • pnpm artık tarball download’larının content coding’ini kendisi decode ediyor. Window size değeri 8 MiB’den büyük olan zstd response’ları reddediliyor.
  • Yeni maxTarballUnpackedSize setting’i eklendi. Bu setting, tek bir package’ın unpack edilen file’larının toplam boyutunu sınırlandırıyor. Default limit 4 GiB.
  • Registry revision’ları artık original dahil olmak üzere her zaman uncompressed tar hash’ini pin ediyor. Örneğin +r0 specifier ile revision protocol üzerinden seçilen original sürüm, lockfile’a revision: 0 olarak kaydediliyor ve registry’nin digest route’u üzerinden fetch ediliyor.
  • pnpm, revision tar’ını registry’nin tar, gzip veya zstd olarak göndermesinden bağımsız şekilde doğruluyor. Revision metadata’sının revision 0’ı listelemesi ve seçilen revision’ı işaretlemesi gerekiyor. Eksik revision metadata’sı ERR_PNPM_MALFORMED_METADATA ile reddediliyor.
  • pnpm artık zstd-compressed response’ları kabul ediyor. Zstd kullanan registry’ler özellikle minimumReleaseAge ve trustPolicy gibi setting’lerin kullandığı full package metadata’yı gzip’e kıyasla daha düşük boyutla gönderebiliyor.
  • pnpm deploy ve pnpm install, node_modules/.modules.yaml ve node_modules/.pnpm-workspace-state-v1.json içerisindeki timestamp’ler için SOURCE_DATE_EPOCH environment variable’ını upper bound olarak kullanıyor. Uygun şekilde hazırlanmış aynı project’in aynı epoch ile tekrar deploy edilmesi identical file’lar üretebiliyor.
  • pnpm update --interactive artık cursor’ın bulunduğu row’u cyan renkle vurgularken version değişikliklerinin mevcut renklerini koruyor.

Patch Değişiklikleri​


Güvenlik​


  • Registry, istenenden farklı bir package’a ait metadata döndürürse pnpm artık ERR_PNPM_REGISTRY_NAME_MISMATCH error’ı ile işlemi durduruyor. Önceden package metadata içerisindeki name ile install edildiğinden, istenen package için tanımlanmış allowBuilds rule’ları uygulanmayabiliyordu.
  • minimumReleaseAgeExcludePrune ve trustPolicyExcludePrune artık resolve edilmiş config dependency’ler ve bunların transitive dependency’leri için exclusion’ları koruyor.

Dependency Resolution​


  • pnpm install bir dependency’yi yeniden resolve ettiğinde, fresh install’da olduğu gibi aynı package için mevcut install sırasında zaten resolve edilmiş version’ı yeniden kullanıyor. Önceden lockfile’ın pin ettiği version korunarak package’ın ikinci bir kopyası eklenebiliyordu. Install içerisindeki başka hiçbir dependency farklı bir version tercih etmiyorsa locked version korunmaya devam ediyor. Bir transitive dependency’yi özellikle pin etmek için overrides kullanılabilir.
  • Başka bir workspace project aynı package’ın farklı bir version’ını eklediğinde, project’in bu package üzerindeki auto-installed peer’i artık fresh install’ın seçeceği version’a geçiriliyor.
  • Aynı dependency’yi hem dependencies içerisinde hem de optional peer olarak tanımlayan package, project daha sonra ilgili provider’ı eklediğinde peer’e doğru şekilde bind ediliyor. Lockfile artık package’ın kendi dependency’sinin sağladığı peer dahil olmak üzere tanımlanan tüm peer’leri kaydediyor.
  • pnpm install --prod ve pnpm deploy --prod, bir package’ın hem optional peer hem de kendi dependency’si olarak tanımladığı dependency’yi artık yanlışlıkla kaldırmıyor.
  • Existing lockfile ile pnpm install ve ardından ikinci kez çalıştırılan pnpm dedupe, dependency cycle içerisindeki veya dependent package’a geri dönen optional peer binding’lerini koruyor.
  • pnpm install ve pnpm dedupe, peer suffix’leri peersSuffixMaxLength nedeniyle hash’lenmiş lockfile’lar yeniden kullanılırken own-dependency ve peer-dependency binding’lerini koruyor.
  • Bir workspace project içerisindeki direct dependency upgrade edildiğinde, aynı pnpm install sırasında sibling project’lerdeki eşleşen transitive pin’ler de refresh ediliyor.
  • resolvePeersFromWorkspaceRoot: false kullanıldığında bir workspace project artık yalnızca başka bir project’in dependency’lerinin sağladığı version’a peer bind etmiyor. Bunun yerine ilgili project için peer range’i karşılayan version auto-install ediliyor.
  • pnpm install, pnpm add ve pnpm update, mlly ve pkg-types gibi dependency cycle’a dahil olan dependency’ler için lockfile’daki resolution’ı yeniden kullanıyor. Böylece bu package’ların ve onlara bağlı dependency’lerin registry üzerinden gereksiz yere yeniden resolve edilmesi önleniyor.
  • pnpm.overrides içerisinde workspace:./packages/foo gibi belirtilen workspace path’leri artık pnpm-workspace.yaml dosyasının bulunduğu directory’ye göre resolve ediliyor.
  • pnpm install, artık tanımlanmayan config dependency’leri kaldırıyor. Buna configDependencies setting’inin tamamen kaldırılması da dahil. Frozen install sırasında kaldırılmış config dependency’leri hâlâ içeren lockfile reddediliyor.
  • pnpm install --update-checksums artık tüm locked package’ları yeniden resolve ediyor ve registry’nin güncel olarak bildirdiği integrity değerlerini kaydediyor.
  • pnpm add ve pnpm install artık gist:<id> dependency’lerini ve GitHub Gist URL’lerini kabul ederek Gist archive üzerinden installation yapabiliyor. pnpm pkg fix, gist: repository’lerini npm ile aynı şekilde normalize ediyor; pnpm licenses Gist package’larını ilgili Gist page’e bağlıyor ve pnpm sbom, repository field’ı gist: shorthand kullanan package’ların repository bilgisini raporluyor.
  • pnpm add, path içeren registry URL’lerinin altındaki tarball URL’lerinden package name’i artık doğru şekilde okuyor. Malformed percent escape içeren registry tarball URL’leri de plain tarball URL olarak install ediliyor.
  • minimumReleaseAge ayarlandığında pnpm, cached full metadata’yı tek bir ETag request ile revalidate ediyor. Registry değişmemişse 304 dönebiliyor ve metadata’nın gereksiz yere tekrar download edilmesi önleniyor. resolutionMode değeri lowest-direct veya time-based olduğunda metadata, package’a bağlı tüm workspace project’ler arasında da yeniden kullanılıyor.
  • Cached registry metadata revalidate edilirken registry modification time yalnızca date içeriyorsa If-Modified-Since gönderiliyor. Ayrıca modification time’ın 1970’ten önce olması durumunda oluşan crash düzeltildi.
  • pnpm client ile pnpr server arasına protocol versioning eklendi, resolution response’larında uygulanan resolution policy’ler doğrulanıyor ve structured error code’lar bağlantı üzerinden korunuyor.

Performans​


  • macOS’ta pnpm install performansı önemli ölçüde iyileştirildi. 12-core Mac üzerinde warm store’dan 1.352 package installation süresi 2,2 saniyeden 1,3 saniyeye düşürüldü. pnpm artık CPU core sayısından bağımsız olarak macOS’ta package file’larını node_modules içerisine 4 thread ile yazıyor. Farklı thread sayısı için PNPM_MACOS_LINK_THREADS environment variable’ı kullanılabiliyor; 0 değeri verilirse install’ın geri kalanında kullanılan thread’ler tercih ediliyor.
  • sharedWorkspaceLockfile: false kullanılan büyük workspace’lerde pnpm install hızlandırıldı ve memory kullanımı azaltıldı. Her project’in install işlemi artık diğer tüm workspace project’lerin manifest’lerini tekrar okumuyor. Workspace dependency’lerini bekleyen install’lar da artık workspaceConcurrency limitine dahil ediliyor.

Küçük Değişiklikler​

  • Build işlemi pnpm’in cache key’e dahil edemediği unsurlara bağlı olan package’lar için sideEffectsCache.exclude ayarı eklendi. Buna, native addon’ın link verdiği system library’ler gibi dependency’ler dahil. pnpm, listelenen package’ları her project’te yeniden build ediyor ve bu build’leri local side-effects cache veya remoteCache server üzerinden restore etmiyor ya da kaydetmiyor. Global virtual store kullanıldığında her project, bu package’ların ve bunlara dependency’si olan package’ların kendi copy’sine sahip oluyor. Entry’ler minimumReleaseAgeExclude ile aynı name, @scope/* ve name@version pattern’lerini kullanıyor.
  • pnpm login, web-based login sırasında artık npm-notice response header’ını gösteriyor. Registry’ler bu header’ı, browser üzerinden sign-in işlemini tamamlamak için gereken verification code’u göstermek amacıyla kullanıyor.

Yama Değişiklikleri​

  • --workspace-concurrency=Infinity artık workspace project’lerini concurrency limit olmadan çalıştırıyor. Önceden invalid digit found in string hatasıyla başarısız oluyordu.
  • pnpm install ve diğer recursive command’lar artık updateConfig hook’unun ayarladığı filter ve filterProd değerlerini uyguluyor. Önceden tüm workspace project’lerinde çalışıyorlardı.
  • enable-modules-dir=false artık install sırasında mevcut lockfile’dan reuse edilen package’ları da fetch ediyor. Böylece store, lockfile içinde listelenen tüm package’ları içeriyor.

Patch Değişiklikleri​

  • nodeLinker.type: loaded kullanıldığında pnpm tarafından oluşturulan file’lar artık project’lerin zaten Git’te ignore ettiği node_modules dizinine yazılıyor. Store manifest ve loader şu konumlarda tutuluyor:
    • node_modules/.pnpm/.store-manifest.json
    • node_modules/.pnpm/.store-loader.mjs
      Bin shim’leri ise node_modules/.bin içinde yer alıyor.

    Önceki sürümler .pnpm-store.json ve .pnpm-store-loader.mjs dosyalarını project root’a, ayrıca root ve her workspace package içine .pnpm directory yazıyordu. Reinstall sonrasında bunlar silinebilir.
  • nodeLinker.type: loaded kullanıldığında kendi node_modules directory’sini birlikte dağıtan package’lar, örneğin bundled dependency’leriyle gelen npm, artık store üzerinden yükleniyor. Önceden install içinde böyle tek bir package bulunması bile tüm Node.js process’lerinin başlatılamamasına neden olabiliyordu.
  • nodeLinker.type: loaded ile script’ler artık devEngines.runtime üzerinden kurulmuş Node.js runtime’ını çalıştırabiliyor. Önceden node çağıran her script kendi shim’ini tekrar tekrar çalıştırıyor ve sonunda Argument list too long hatasıyla başarısız oluyordu.
  • nodeLinker.type: loaded ile Node.js process’leri daha hızlı başlıyor. 13.000 stored file içeren bir project’te process başına startup overhead 67 ms’den 18 ms’ye düşürüldü.
  • overrides değiştirildikten sonra, lockfile optional peer dependency’yi başka bir package’ın npm alias’ına resolve ediyorsa pnpm install artık ERR_PNPM_NO_MATCHING_VERSION hatasıyla başarısız olmuyor.
  • catalogPrune kullanılan frozen install artık pnpm-lock.yaml içinde hâlâ kayıtlı olan catalog entry’lerini kaldırmıyor. Önceden bazı workspace project’leri disk üzerinde eksikse pnpm install --frozen-lockfile --filter komutu ERR_PNPM_LOCKFILE_CONFIG_MISMATCH hatası verebiliyordu.
  • pnpm install --fix-lockfile artık lockfile entry’lerindeki deprecated ve hasBin field’larını kaldırmıyor.
  • enableGlobalVirtualStore açıkken node_modules güncelleyen bir install, yarıda kesilmiş önceki install nedeniyle dependency link’leri veya package file’larının bir kısmı eksik kalmış global virtual store package’larını artık onarıyor. Önceden project’in node_modules kaydı package’ı mevcut gösteriyorsa eksik package olduğu gibi korunuyordu.
  • pnpm install artık kendi pnpm-workspace.yaml veya .git directory’sine sahip nested directory içindeki Cargo ve Python project’lerini atlıyor. Buna aynı workspace’in git worktree’si veya ayrı clone’u da dahil.
  • Package metadata için gösterilen Request took warning artık süreyi pnpm request’i gerçekten gönderdiğinde ölçmeye başlıyor. Önceden boş request slot’u bekleme süresi de hesaba katılıyor ve bu yüzden büyük install’larda registry hızlı cevap verse bile gereksiz warning görülebiliyordu.
Bu sürüm, WebContainer build’ini ayrı bir @pnpm/wasm paketine taşıyor, pnpm paketinin boyutunu yeniden yaklaşık 4 MB seviyesine indiriyor ve GitLab CI üzerinde provenance ile pnpm publish kullanımını düzeltiyor.

Yama Değişiklikleri​

  • StackBlitz WebContainers için WebAssembly build’i artık ayrı bir @pnpm/wasm paketi olarak sunuluyor. pnpm ve @pnpm/exe paketleri artık bunu içermiyor; böylece unpacked boyutları yaklaşık 55 MB’tan tekrar yaklaşık 4 MB’a düşüyor. WebContainer içinde pnpm komutunu kullanmak için npm ile @pnpm/wasm kurulmalı.
  • GitLab CI üzerinden provenance ile yapılan pnpm publish işlemleri artık npm registry tarafından 422 hatasıyla reddedilmiyor. Provenance statement artık npm’in yaptığı gibi GitLab CI variable’larını invocation.parameters içine ekliyor.
  • pnpm audit signatures, bir registry signing key isteğini örneğin registry.npmjs.org adresine yönlendirdiğinde artık redirect target’ın TLS ayarlarını kullanıyor. Private registry’ye özel tanımlanmış bir cafile artık yönlendirilmiş isteğin başarısız olmasına neden olmuyor.
  • Injected workspace package, peerDependencies içinde catalog entry kullandığında güncel bir lockfile’ın pnpm install --frozen-lockfile tarafından yanlışlıkla reddedilmesi düzeltildi.
  • [<since>] filter selector, Git 2.24 ile 2.27 sürümlerinde yeniden çalışıyor. Git 2.24’ten daha eski sürümlerde selector artık gereken Git sürümünü açıkça belirten bir hata veriyor.

    Ayrıca dizin adlarında ASCII dışı karakterler bulunan project’lerdeki değişiklikler artık doğru şekilde algılanıyor. Önceden bu değişiklikler parent project’e aitmiş gibi değerlendirilebiliyordu. changedFilesIgnorePattern ve testPattern artık dosya adında ASCII dışı karakterler bulunan değişmiş dosyalarla da eşleşiyor.
  • pnpm executable yaklaşık %10 küçültüldü. macOS arm64 üzerinde boyut 45,1 MB’tan 40,3 MB’a düştü.
  • Uzun release geçmişine sahip package’lar için trust downgrade kontrolleri hızlandırıldı.
  • optimisticRepeatInstall: false kullanıldığında pnpm install, node_modules zaten güncel olsa bile project’in kendi lifecycle script’lerini, örneğin prepare script’ini, artık çalıştırıyor.
  • pnpm self-update, Homebrew üzerinden kurulmuş pnpm için artık hata vererek duruyor ve yüklü formula’ya uygun brew upgrade komutunu gösteriyor; örneğin brew upgrade pnpm veya brew upgrade pnpm@11. Önceden pnpm’in ikinci bir kopyasını kuruyor ancak Homebrew sürümü onu gölgelemeye devam ediyordu.