Popüler paketler
Spesifikasyona uygunluk, gerçek kütüphanelerin çalışacağını garanti etmez. JS motorları, test262 testlerinin %99'unu geçse bile üretim kodunda sık sık bozulur; çünkü kütüphaneler, belirli sıradaki Proxy tuzakları, Function.prototype.toString biçimi, zor girdilerde regex davranışı ve Object.keys sıralamasının hesaplanan özellik adlarıyla tam olarak nasıl etkileştiği gibi, spesifikasyonun nadir köşe durumlarına bağlıdır.
Phasis, yaygın kullanılan 204 kütüphaneyi Node.js (V8) ile bayt düzeyinde karşılaştırarak doğrular. Bunlar depodaki tests/Popular/ altında bulunur ve CI, motor kaynağı veya test paketi değiştiğinde bunları çalıştırır.
Kategoriye göre kapsam
| Kategori | Kütüphaneler |
|---|---|
| Ayrıştırıcılar / AST | acorn 8.16.0, chevrotain 11.0.3, parse5 7.2.1, parsimmon 1.18.1, jsep 1.4.0, postcss-value-parser 4.2.0, acorn-walk 8.3.4, estraverse 5.3.0, escodegen 2.1.0, css-tree 3.0.4, sax 1.4.1, nearley 2.20.1 |
| Şablonlama / Markdown / HTML | mustache 4.2.0, handlebars 4.7.9, marked 18.0.3, markdown-it 14.1.0 (+ markdown-it-emoji), markdown-table 3.0.4, showdown 2.1.0, cheerio 1.1.2, htmlparser2 11.0.0 |
| Yardımcı / Fonksiyonel | lodash 4.18.1, ramda 0.31.3, remeda 2.17.4, es-toolkit 1.27.0, immutable 5.1.3, immer 10.1.1, redux 5.0.1, deepmerge 4.3.1, dot-object 2.1.5, lodash.merge 4.6.2, lodash.clonedeep 4.5.0, extend 3.0.2, extend-shallow 3.0.2, mixin-deep 2.0.1, merge-options 3.0.4 |
| Nesne erişimi | dequal 2.0.3, clsx 2.1.1, classnames 2.5.1, get-value 4.0.1, set-value 4.1.0, object.omit 3.0.0, object.pick 1.3.0, is-plain-obj 4.1.0, kind-of 6.0.3 |
| Doğrulama / Şema | zod 4.4.3, yup 1.4.0, valibot 1.1.0, superstruct 2.0.2, validator 13.12.0, email-validator 2.0.4, ajv 8.17.1, @sinclair/typebox 0.34.42, runtypes 6.7.0, typanion 3.14.0, ow 2.0.0 |
| Tarih / saat | dayjs 1.11.20, date-fns 4.1.0, timeago.js 4.0.2, luxon 3.7.3, moment 2.30.2 |
| Matematik / sayılar | bignumber.js 11.1.1, decimal.js 10.6.0, numeral 2.0.6, jsbi 4.3.0, big.js 6.2.2, fraction.js 4.3.7, complex.js 2.4.2, simple-statistics 7.8.8 |
| Karma / kripto | blueimp-md5 2.19.0, crypto-js 4.2.0, fnv-plus 1.3.1, murmurhash3js 3.0.1, hash-sum 2.0.0, jwt-decode 4.0.0, @noble/hashes 2.2.0, tweetnacl 1.0.3, aes-js 3.1.2, bcryptjs 3.0.2, xxhashjs 0.2.2, object-hash 3.0.0 |
| Arama / fark | fuse.js 7.3.0, minisearch 7.1.1, diff 8.0.2, diff-match-patch 1.0.5, fast-deep-equal 3.1.3, fast-equals 5.2.2, fastest-levenshtein 1.0.16, lunr 2.3.9 |
| JSON / veri biçimleri | json5 2.2.3, js-yaml 4.1.0, yaml 2.6.1, toml 3.0.0, smol-toml 1.3.1, fast-json-patch 3.1.1, jmespath 0.16.0, jsonata 2.0.6, jsonpath-plus 10.3.0, mingo 6.7.0, sift 17.1.3, fast-json-stable-stringify 2.1.0, safe-stable-stringify 2.5.0, json-stringify-safe 5.0.1, canonicalize 2.1.0, papaparse 5.5.4 |
| Dizeler / dilbilim | he 1.2.0, slugify 1.6.9, camelcase 8.0.0, entities 6.0.1, pluralize 8.0.0, inflection 3.0.2, wcwidth 1.0.1, emoji-regex 10.4.0, unraw 3.0.0, jsesc 3.1.0, lower-case 2.0.2, upper-case 2.0.2, dot-case 3.0.4, pascal-case 3.1.2, snake-case 3.0.4, title-case 3.0.3, xregexp 5.1.1, escape-string-regexp 5.0.0, ansi-regex 6.1.0, strip-ansi 7.1.2, string-width 8.1.0 |
| URL / web | url-parse 1.5.10, qs 6.13.1, query-string 9.1.1, tldts 6.1.69, punycode 2.3.1, linkifyjs 4.3.1, ipaddr.js 2.2.0, uri-js 4.4.1, url-template 3.1.1, bowser 2.11.0 |
| Sıkıştırma / kodlama / arşiv | pako 2.1.0, lz-string 1.5.0, base64-js 1.5.1, JSZip 3.10.1 |
| Renk | color-string 2.1.1, d3-color 3.1.0, chroma-js 3.1.2, color-name 2.0.0, tinycolor2 1.6.0, color 5.0.3 |
| Klonlama / eşitlik | rfdc 1.4.1, klona 2.0.6, fast-copy 3.0.2 |
| Biçim / görüntüleme | ms 2.1.3, bytes 3.1.2 |
| Kimlikler / UUID'ler | uuid 10.0.0, hexoid 2.0.0, ulid 3.0.1, cuid2 2.2.2, short-unique-id 5.4.3 |
| Tür algılama / glob | type-detect 4.1.0, picomatch 4.0.2, minimatch 10.1.1, wildcard-match 5.1.4, glob-to-regexp 0.4.1, to-regex 4.0.4, array-uniq 3.0.0, array-unique 0.3.2 |
| Semver / yapılandırma | semver 7.6.3, compare-versions 6.1.1, semver-compare 1.0.0 |
| Önbellek / performans | lru-cache 11.0.2, marky 1.3.0, array-flatten 3.0.0, arr-diff 4.0.0 |
| Asenkron / olaylar | eventemitter3 5.0.1, eventemitter2 6.4.10, mitt 3.0.1, p-limit 7.1.1, p-queue 9.0.2, p-defer 5.0.0, p-retry 7.1.0, throttle-debounce 5.0.2, async 3.2.6 |
| Reaktif durum | mobx 6.13.7, xstate 5.23.0, valtio 2.1.5, nanostores 1.0.1, jotai 2.16.1, redux-saga 1.3.0, redux 5.0.1 |
| CSS / stillendirme | postcss 8.5.7, stylis 4.3.6, css-tree 3.0.4 |
| Derleme / AST / derleyiciler | magic-string 0.30.20, escodegen 2.1.0, acorn-walk 8.3.4, estraverse 5.3.0, @babel/parser 7.28.5, terser 5.46.0, prettier 3.3.3, svelte 5.55.7 (derleyici), typescript 6.0.3 |
| MQTT / protokol | mqtt-packet 9.0.4 |
| GraphQL | graphql-js 16.11.0 |
| Sözdizimi vurgulama | highlight.js 11.11.1 |
| Test / doğrulama | chai 6.2.1 |
Toplam: 204 kütüphane Node'un çıktısını birebir üretir. Tümü, son güncellemeden itibaren en son upstream sürüme sabitlenmiştir.
Nasıl çalışır
Her senaryo, üç dosyadan oluşan bir tests/Popular/<lib>/ dizinidir:
tests/Popular/lodash/
├── lodash.js ← vendored upstream library (untouched, UMD bundle)
├── runner.js ← Phasis-side script that exercises the library
└── oracle.txt ← Node.js output of running runner.js (committed)
tests/Popular/PopularPackagesTest.php, şu özelliklere sahip bir PHPUnit veri sağlayıcı testidir:
lodash.js+runner.jsbileşenlerini yeni birnew Phasis\Engine()içine yükler.console.logçıktısını bir arabelleğe alır.- Yakalanan arabelleğin
oracle.txtile bayt düzeyinde eşit olduğunu doğrular.
Bir oracle'ı şu komutla yeniden oluşturun:
node tests/Popular/gen-oracle.js tests/Popular/<lib>
(Vendored kütüphaneyi güncellediğinizde kullanılır — çalıştırıcıyı gerçek Node altında yeniden çalıştırır ve oracle.txt üzerine yazar.)
CI Kapısı
İş akışı: .github/workflows/popular.yml.
main deposundaki src/, tests/Popular/, phpunit.xml.dist, Composer dosyalarını veya iş akışının kendisini değiştiren push ve pull request işlemlerinde ve manuel tetiklemeyle çalışır. İki adım:
- Phasis tarafı — her kütüphaneyi Phasis üzerinden çalıştırıp kaydedilmiş oracle ile karşılaştıran PHPUnit
populartest paketini çalıştırır. Tek bir bayt bile farklıysa başarısız olur. - Node ile yeniden doğrulama —
node tests/Popular/gen-oracle.js …öğesini her kütüphanede çalıştırır ve yeniden oluşturulan oracle'ın depodakiyle eşleştiğini doğrular. “Vendored kütüphane güncellendi ama oracle güncellenmedi” sapmasını tespit eder.
PR birleştirilmeden önce ikisi de başarılı olmalıdır. test262 kazanımı lodash'i bozuyorsa kabul edilemez; lodash kazanımı test262 öğesini bozuyorsa o da kabul edilemez.
Bu kütüphaneler neden seçildi
- acorn — Her JS motorunda en kırılgan alan ayrıştırmadır. Modern JS tarafından eklenen her sözdizimi uç durumunu sınar. Phasis, acorn ile her türlü modern kodu ayrıştırabiliyorsa çalışma zamanı sağlamdır.
- mustache.js — Şablonlama, Phasis ürününün özellikle hedeflediği gömülü kullanım alanlarından biridir (README'ın ilk somut örneği “şablonlama motorlarıdır”). Mustache, gerçek şablonlarda olduğu sırayla yineleme, kapsam çözümleme ve dize dönüştürme işlemlerini sınar.
- lodash — Dünyada en yaygın kullanılan JS yardımcı kütüphanesi. 300+ işlevi, geçişli olarak standart kütüphanedeki her yönteme dokunur. lodash çalışıyorsa genel veri dönüştürme JS da çalışır.
- marked — Markdown oluşturma. Uygulamalı bir testtir; düzenli ifadeleri (birçoğunu) ve satırlar arası durum içeren dize işlemlerini sınar. PCRE2 (Phasis'ın geri dönüş seçeneği) ile V8 Irregexp'i arasındaki düzenli ifade motoru farklılıklarını ortaya çıkarır.
- dayjs — Tarih/saat aritmetiği, hiçbir test262 testinin yakalayamadığı, yaygın bir bir eksik/fazla hatası kaynağıdır. dayjs; oluşturucu çeşitlerini, yaz saati uygulaması bakımından eşdeğer ay sınırları arasındaki aritmetiği ve biçim belirteçlerinin genişletilmesini, her JS tarih kütüphanesinin kullandığı kod yollarında sınar.
- bignumber.js — TypedArray kullanmadan yapılan keyfi hassasiyetli aritmetik; dize tabanlı sayı ayrıştırmayı, büyük tamsayılarla çarpma/bölme döngülerini ve yuvarlama modu yönlendirmesini sınar. Bunların tümü saf JS ile çalışır, dolayısıyla tüm yük motora biner. Number ↔ String dönüşümündeki ince hataları ortaya çıkarır.
- json5 — Esnek JSON ayrıştırması, büyük ölçüde karakter sınıfı düzenli ifadelerine ve durumsal belirteçlemeye dayanır. Hem düzenli ifade doğruluğu hem de dize yineleme uç durumları için iyi bir erken uyarı testidir.
- fuse.js —
_classCallCheckkullanan, Babel ile dönüştürülmüş bir UMD'dir (her ES6 öncesi sınıfın kullandığıthis instanceof Ctorkalıbı) ve tam bitap bulanık eşleştirme algoritmasını sınar. Babel ile dönüştürülmüş her kütüphanede görülen yapı budur; Fuse'u bozan her şey npm ekosisteminin yarısını da bozar. - handlebars — Derleme ve ardından oluşturma işlemlerini yapan, tüm özelliklere sahip bir şablonlama aracıdır.
evaliçermeyen çalışma zamanı yolunu tek bir büyükcompile()girdisi üzerinden sınar; AST gezinmesini, dinamik bir arama tablosuyla yardımcı yönlendirmeyi veinstanceofkullananSafeStringmarka denetimini de kapsar. mustache.js aracının daha basit şablon gezginine karşı iyi bir karşılaştırmadır. - zod — Çalışma zamanı şema doğrulaması. Yöntem zincirlemesiyle iyileştirilmiş alt sınıflar döndüren,
ZodString,ZodObject,ZodArray,ZodUnion, … gibi kapsamlı sınıf hiyerarşileri; JS tarafındaki.issuesdizi yapısının Node ile bayt bayt eşleşmesini gerektiren yapılandırılmış hata biçimlendirme; ve ayırt edici/literal etiket kalıpları. Modern TypeScript uygulamalarının yarısını saran, nesne yönelimli yoğun doğrulama kodlarını sınar. - typescript — Gömülü motor üzerinde çalışan gerçek TypeScript derleyicisi. Keyfi TS'yi yeniden ayrıştıran, AST'de dolaşan ve JS üreten, küçültülmüş 9 MB'lık derleyici; akla gelebilecek en ağır saf-JS yüküdür. Phasis; generics, async/await, enum'lar ve sınıf hiyerarşilerini
tscile bayt bayt aynı olacak şekilde dönüştürebiliyorsa dil semantiği sağlamdır. - prettier — Belirli görüşlere sahip bir JS biçimlendiricisidir. JS'i JS ile biçimlendirmek, motorun her belirtim ayrıntısını kodunuzu biçimlendiren aynı kontrol akışıyla çalıştırır; eşsiz derecede zorlu bir iş yüküdür.
- svelte/compiler — Svelte ürününün bağımsız derleyicisi.
.sveltekaynak kodunu ayrıştırır, AST'de dolaşır ve hem istemci hem de SSR hedefleri için JS üretir. - terser / @babel/parser / postcss — JS küçültücüsü, JS ayrıştırıcısı, CSS son işlemcisi. Keyfi girdileri yeniden ayrıştıran, küçültülmüş on binlerce kod satırı; nadir AST biçimlerinin ortaya çıktığı alan.
- ajv — JSON şema doğrulayıcısı; her şemayı
new Function(...)üzerinden özel bir doğrulayıcı işleve JIT ile derler. Çoğu şema/şablonlama kütüphanesinin dayandığı Function oluşturucu yolunu sınar. - mobx — Proxy tabanlı reaktif durum. Gözlemlenebilir bir değerin her okuması, bağımlılık kaydeden bir Proxy
gettuzağından geçer; her yazma tepki işlevlerini tetikler. Proxy altyapısı, gözlemlenebilir Map'ler/diziler/iç içe nesneler ve autorun zamanlayıcısı için stres testidir. - cheerio / htmlparser2 — Hızlı bir HTML ayrıştırıcısı üzerine kurulu, sunucu tarafında çalışan jQuery. Seçici motoru ayrıştırmasını, DOM tarzı gezinmeyi, öznitelik düzenlemeyi ve HTML serileştirmesini tek pakette sunar.
- graphql-js / jsonata — GraphQL referans uygulaması ve bir JSON sorgu dili. Her ikisi de şema, doğrulama ve özyinelemeli değerlendiriciler açısından yoğundur; bunlar, “tarayıcıdaki veri katmanı” kodunun tipik özellikleridir.
- JSZip — Asenkron ZIP arşivi oluşturucu. İşleri
setImmediatetabanlı zamanlama üzerinden yönlendirir ve gerçek ikili çıktı üretir; hem zamanlayıcı yüzeyini hem deUint8Arrayağırlıklı yolları sınar. - moment / luxon — Tarih/saat aritmetiği. moment değiştirilebilir, elle ayarlanmış bir UMD'dir; luxon ise modern, değiştirilemez yeniden yazımıdır. Birlikte biçimlendirme, ayrıştırma ve saat dilimi bakımından eşdeğer ay/yıl hesaplarının tamamını kapsarlar.
- mqtt-packet — Saf-JS MQTT 3.1.1 / 5.0 codec'i. Bayt düzeyinde paketleme ve kod çözmenin yanı sıra, Ek-B dilbilgisi uç durumlarını sınayan base64 dışı alfabe düzenli ifade karakter sınıflarını da kapsar.
- xstate / valtio / nanostores / jotai / redux-saga — Modern durum yönetimi yelpazesi. Durum makineleri, proxy durumu, atom depoları, türetilmiş atomlar ve üreteç tabanlı etki çalıştırıcılar; her kütüphane farklı bir reaktivite biçimini sınar.
- escodegen / acorn-walk / estraverse / magic-string — AST araçları. Kod üretimi, gezinme ve kaynağı bozmadan düzenleme; herhangi bir JS-üzerinde-JS dönüştürücünün (derleme araçları, kod modları, lint araçları) yapı taşları.
- papaparse / lunr / yaml / sax / css-tree — Saf ayrıştırıcılar ve belirteçleyiciler. CSV, tam metin arama dizini, YAML 1.2, akış tabanlı SAX tarzı XML ve CSS AST'si. Farklı dilbilgileriyle karakter düzeyinde tarama ve düzenli ifade davranışı için iyi erken uyarı testleridir.
Daha fazlasını ekleme
Üç dosyalı yapıya sahip yeni bir dizini tests/Popular/<name>/ altına ekleyin, ardından:
node tests/Popular/gen-oracle.js tests/Popular/<name> # one-time, generates oracle.txt
git add tests/Popular/<name>
PHPUnit paketi sonraki çalıştırmada dizini otomatik olarak bulur; tests/Popular/ değişikliğe dokunduğu için CI da onu çalıştırır.
Eklenmeye değer güçlü adaylar: chevrotain (ayrıştırıcı birleştirici; kapanımlar ve düzenli ifadeleri sınar), nanoid (kripto/rastgelelik sınırı), date-fns (dayjs'in ötesinde saat dilimi özellikleri).