Pāriet uz saturu

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:

Text
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:

  1. Ielādē lodash.js + runner.js jaunā new Phasis\Engine().
  2. Uztver console.log izvadi buferī.
  3. Pārbauda, ka uztvertā bufera baiti sakrīt ar oracle.txt.

Atkārtoti ģenerējiet etalonvērtību ar:

Apvalks
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:

  1. Phasis puse — palaiž PHPUnit popular testu 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.
  2. 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 Ctor rakstu, 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īgu compile() ieejas punktu, AST šķērsošanu, palīgfunkciju izsaukšanu ar dinamisku uzmeklēšanas tabulu un SafeString zīmola pārbaudi, kas izmanto instanceof dažā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 .issues masī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ē .svelte pirmkodu, šķē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 get slazdu, 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 setImmediate palīdzību un izveido reālu bināru izvadi, pārbaudot gan taimeru saskarni, gan Uint8Array intensī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:

Apvalks
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).