Populārās pakotnes
Atbilstība specifikācijai negarantē, ka darbosies īstas bibliotēkas. JS dzinēji, kas iztur 99 % test262 testu, ražošanas kodā joprojām bieži nedarbojas, jo bibliotēkas ir atkarīgas no daudzām mazām specifikācijas niansēm — Proxy slazdiem noteiktā secībā, Function.prototype.toString formas, regulāro izteiksmju darbības ar sarežģītām ievadēm un precīza veida, kā Object.keys secība mijiedarbojas ar aprēķinātiem rekvizītu nosaukumiem.
Phasis pārbauda 204 plaši izmantotas bibliotēkas pa baitam, salīdzinot tās ar Node.js (V8). Tās atrodas repozitorija mapē tests/Popular/, un CI palaiž to testus ikreiz, kad mainās dzinēja pirmkods vai testu kopa.
Aptvērums pa kategorijām
| Kategorija | Bibliotēkas |
|---|---|
| Parseri / 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 |
| Veidnes / 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 |
| Utilītas / funkcionālā programmēšana | 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 |
| Objektu piekļuve | 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 |
| Validācija / shēma | 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 |
| Datums / laiks | dayjs 1.11.20, date-fns 4.1.0, timeago.js 4.0.2, luxon 3.7.3, moment 2.30.2 |
| Matemātika / skaitļi | 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 |
| Jaucējvērtības / kriptogrāfija | 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 |
| Meklēšana / atšķirības | 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 / datu formāti | 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 |
| Virknes / lingvistika | 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 / tīmeklis | 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 |
| Saspiešana / kodēšana / arhivēšana | pako 2.1.0, lz-string 1.5.0, base64-js 1.5.1, JSZip 3.10.1 |
| Krāsas | 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 |
| Klonēšana / vienādība | rfdc 1.4.1, klona 2.0.6, fast-copy 3.0.2 |
| Formāts / attēlojums | ms 2.1.3, bytes 3.1.2 |
| ID / UUID | uuid 10.0.0, hexoid 2.0.0, ulid 3.0.1, cuid2 2.2.2, short-unique-id 5.4.3 |
| Tipa noteikšana / 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 / konfigurācija | semver 7.6.3, compare-versions 6.1.1, semver-compare 1.0.0 |
| Kešatmiņas / veiktspēja | lru-cache 11.0.2, marky 1.3.0, array-flatten 3.0.0, arr-diff 4.0.0 |
| Asinhronitāte / notikumi | 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 |
| Reaktīvais stāvoklis | 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 / stili | postcss 8.5.7, stylis 4.3.6, css-tree 3.0.4 |
| Būvēšana / AST / kompilatori | 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 (kompilators), typescript 6.0.3 |
| MQTT / protokols | mqtt-packet 9.0.4 |
| GraphQL | graphql-js 16.11.0 |
| Sintakses izcelšana | highlight.js 11.11.1 |
| Testēšana / apgalvojumi | chai 6.2.1 |
Kopā: 204 bibliotēkas precīzi atkārto Node izvadi. Visas ir piesaistītas jaunākajam augšupstraumes laidienam pēdējā atjauninājuma brīdī.
Kā tas darbojas
Katrs scenārijs ir tests/Popular/<lib>/ direktorijs ar trim failiem:
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 ir PHPUnit datu nodrošinātāja tests, kas:
- Ielādē
lodash.js+runner.jsjaunānew Phasis\Engine(). - Uztver
console.logizvadi buferī. - Pārbauda, ka uztvertā bufera baiti sakrīt ar
oracle.txt.
Atkārtoti ģenerējiet etalonvērtību ar:
node tests/Popular/gen-oracle.js tests/Popular/<lib>
(Izmanto, atjauninot iekļauto bibliotēku: no jauna palaiž izpildītāju īstā Node vidē un pārraksta oracle.txt.)
CI pārbaudes nosacījums
Darbplūsma: .github/workflows/popular.yml.
Darbojas, kad kods tiek nosūtīts uz main vai izveidoti izmaiņu pieprasījumi, kas skar src/, tests/Popular/, phpunit.xml.dist, Composer failus vai pašu darbplūsmu, kā arī manuāli palaižot darbplūsmu. Divas darbības:
- Phasis puse — palaiž PHPUnit
populartestu kopu, kas izpilda katru bibliotēku, izmantojot Phasis, un salīdzina rezultātus ar apstiprināto etalonvērtību. Neizdodas, ja atšķiras kaut viens baits. - Node atkārtota pārbaude — palaiž
node tests/Popular/gen-oracle.js …katrai bibliotēkai un pārbauda, vai no jauna ģenerētā etalonvērtība sakrīt ar repozitorijā esošo. Atklāj neatbilstību, ja iekļautā bibliotēka ir atjaunināta, bet etalonvērtība nav atjaunināta.
Abām pārbaudēm jāizdodas, pirms PR tiek apvienots. test262 uzlabojums, kura dēļ pārstāj darboties lodash, nav pieņemams; tāpat nav pieņemams lodash uzlabojums, kura dēļ pārstāj darboties test262.
Kāpēc izvēlētas šīs bibliotēkas
- acorn — parsēšana ir trauslākā virsma jebkurā JS dzinējā. Tā pārbauda visus mūsdienu JS pievienotos sintakses stūrakmeņus. Ja Phasis ar acorn spēj parsēt patvaļīgu mūsdienu kodu, izpildvide ir uzticama.
- mustache.js — veidņu apstrāde ir viens no iegulšanas lietojuma gadījumiem, kam Phasis ir īpaši paredzēts (README pirmais konkrētais piemērs ir “veidņu dzinēji”). Mustache pārbauda iterāciju, tvēruma atrisināšanu un virkņu pārveidošanu tādā secībā, kādā to dara īstas veidnes.
- lodash — pasaulē visbiežāk izmantotā JS utilītu bibliotēka. Tās vairāk nekā 44 300 funkcijas netieši izmanto katru standarta bibliotēkas metodi. Ja lodash darbojas, darbojas arī vispārīga datu pārveidošanas JS.
- marked — Markdown atveidošana. Praktiska pārbaude, kas izmanto regulārās izteiksmes (daudz) un virkņu apstrādi ar stāvokli vairākās rindās. Atklāj regulāro izteiksmju dzinēja atšķirības starp PCRE2 (Phasis rezerves variantu) un V8 Irregexp.
- dayjs — datuma un laika aritmētika ir klasisks kļūdu avots, ko neatklāj neviens test262 gadījums. dayjs pārbauda konstruktoru variantus, aritmētiku pāri mēnešu robežām, kas atbilst pārejai uz vasaras laiku, un formāta marķieru izvēršanu aptuveni tajos pašos koda ceļos, ko izmanto katra JS datumu bibliotēka.
- bignumber.js — patvaļīgas precizitātes aritmētika bez TypedArrays pārbauda skaitļu parsēšanu no virknēm, lielu veselu skaitļu reizināšanas un dalīšanas ciklus, kā arī noapaļošanas režīmu izvēli — visu tīrā JS, tāpēc visu slodzi uzņemas dzinējs. Atklāj jebkādas smalkas kļūmes skaitļu un virkņu konvertēšanā.
- json5 — pielaidīga JSON parsēšana lielā mērā balstās uz rakstzīmju klašu regulārajām izteiksmēm un stāvoklī balstītu tokenizāciju. Labs lakmusa tests gan regulāro izteiksmju korektumam, gan virkņu iterācijas robežgadījumiem.
- fuse.js — ar Babel pārveidota UMD versija, kas pārbauda
_classCallCheck(this instanceof Ctorrakstu, ko izmanto katra pirms ES6 ar pārveidotāju apstrādāta klase), kā arī pilno bitap aptuvenās meklēšanas algoritmu. Šādu struktūru izmanto katra ar Babel pārveidotā bibliotēka, tāpēc viss, kas salauž Fuse, salauž pusi npm ekosistēmas. - handlebars — pilnvērtīga veidņu apstrāde ar kompilēšanu pirms atveidošanas. Pārbauda izpildlaika ceļu bez
eval, izmantojot vienu milzīgucompile()ieejas punktu, AST šķērsošanu, palīgfunkciju izsaukšanu ar dinamisku uzmeklēšanas tabulu unSafeStringzīmola pārbaudi, kas izmantoinstanceofdažādās vidēs. Pretstats vienkāršākajam mustache.js veidņu šķērsošanas mehānismam. - zod — izpildlaika shēmu validācija. Sarežģītas klašu hierarhijas (
ZodString,ZodObject,ZodArray,ZodUnion, …) ar metožu ķēdēm, kas atgriež precizētas apakšklases, strukturētu kļūdu formatēšanu, kur JS puses.issuesmasīva struktūrai precīzi jāsakrīt ar Node, un diskriminatoru un literāļu marķieru modeļiem. Pārbauda objektorientēti intensīvu validācijas kodu, kas aptver pusi mūsdienu TypeScript lietotņu. - typescript — īstais TypeScript kompilators, kas darbojas iegultajā dzinējā. 9 MB minificēta kompilatora, kas no jauna parsē patvaļīgu TS, šķērso AST un izvada JS — iztēlojamies smagāko tīrā JS slodzi. Ja Phasis spēj pārveidot vispārīgus tipus, async/await, uzskaitījumus un klašu hierarhijas, iegūstot baitu pa baitam identisku rezultātu kā
tsc, valodas semantika ir uzticama. - prettier — stingrus stilistiskos principus ievērojošs JS formatētājs. Formatējot JS ar JS, dzinējs iziet cauri katram specifikācijas stūrakmenim, izmantojot to pašu vadības plūsmu, kas formatē jūsu kodu — tā ir unikāli prasīga slodze.
- svelte/compiler — Svelte atsevišķais kompilators. Parsē
.sveltepirmkodu, šķērso AST un izvada JS klienta un SSR mērķiem. - terser / @babel/parser / postcss — JS minificētājs, JS parsētājs, CSS pēcapstrādes rīks. Desmitiem tūkstošu minificēta koda rindu, kas atkārtoti parsē patvaļīgas ievades — te parādās reti sastopamas AST struktūras.
- ajv — JSON shēmu validators, kas, izmantojot
new Function(...), JIT kompilē katru shēmu par pielāgotu validatora funkciju. Pārbauda ceļu ar Function konstruktoru, ko izmanto lielākā daļa shēmu un veidņu bibliotēku. - mobx — uz starpniekobjektiem balstīts reaktīvs stāvoklis. Katrs novērojamā objekta lasījums notiek caur Proxy
getslazdu, kas reģistrē atkarību; katra rakstīšana iedarbina reakcijas. Slodzes tests Proxy infrastruktūrai, novērojamām Map, masīvām un ligzdotiem objektiem, kā arī autorun plānotājam. - cheerio / htmlparser2 — servera puses jQuery, kas veidots uz ātra HTML parsētāja. Selektoru dzinēja parsēšana, DOM stila šķērsošana, atribūtu pārveidošana un HTML serializācija vienā pakotnē.
- graphql-js / jsonata — GraphQL atsauces realizācija un JSON vaicājumu valoda. Abas intensīvi izmanto shēmas, validāciju un rekursīvus vērtētājus — tipisku “datu slāņa pārlūkprogrammā” kodu.
- JSZip — asinhrons ZIP arhīvu veidotājs. Darbus ieplāno ar
setImmediatepalīdzību un izveido reālu bināru izvadi, pārbaudot gan taimeru saskarni, ganUint8Arrayintensīvos ceļus. - moment / luxon — datuma un laika aritmētika. moment ir maināma, ar rokām optimizēta UMD versija; luxon ir mūsdienīgs nemainīgs pārveidojums. Kopā tās aptver visu formatēšanas, parsēšanas un laika joslu ziņā līdzvērtīgu mēnešu un gadu aprēķinu klāstu.
- mqtt-packet — tīrs JS MQTT 3.1.1 / 5.0 kodētājs un dekodētājs. Baitu līmeņa sapakošana un dekodēšana, kā arī rakstzīmju klases ar base64 alfabētā neietilpstošām regulārajām izteiksmēm, kas pārbauda Annex-B gramatikas robežgadījumus.
- xstate / valtio / nanostores / jotai / redux-saga — mūsdienu stāvokļa pārvaldības rīku daudzveidība. Stāvokļu mašīnas, starpniekobjektu stāvoklis, atomu krātuves, atvasināti atomi, ģeneratoros balstīti efektu izpildītāji — katra bibliotēka pārbauda atšķirīgu reaktivitātes veidu.
- escodegen / acorn-walk / estraverse / magic-string — AST rīki. Koda ģenerēšana, šķērsošana un nedestruktīva pirmkoda rediģēšana — pamatelementi jebkuram JS-uz-JS pārveidotājam (būvēšanas rīkiem, koda pārveidošanas skriptiem, linteriem).
- papaparse / lunr / yaml / sax / css-tree — tīri parsētāji un tokenizētāji. CSV, pilnteksta meklēšanas indekss, YAML 1.2, straumējoša SAX tipa XML un CSS AST. Atšķirīgas gramatikas, bet visas ir labi lakmusa testi rakstzīmju līmeņa skenēšanai un regulāro izteiksmju darbībai.
Pievienošana
Izveidojiet jaunu direktoriju zem tests/Popular/<name>/ ar trīs failu struktūru, pēc tam:
node tests/Popular/gen-oracle.js tests/Popular/<name> # one-time, generates oracle.txt
git add tests/Popular/<name>
Nākamajā palaišanas reizē PHPUnit komplekts to atradīs automātiski, un CI to iekļaus, jo izmaiņas skar tests/Popular/.
Labi kandidāti, ko vērts pievienot: chevrotain (parsētāju kombinators, pārbauda aizvēršanas un regulārās izteiksmes), nanoid (kriptogrāfijas un nejaušības robežgadījumi), date-fns (laika joslu funkcijas papildus dayjs).