{"id":16125754,"url":"https://github.com/dy/analogs","last_synced_at":"2025-09-12T23:30:54.406Z","repository":{"id":25358963,"uuid":"28786747","full_name":"dy/analogs","owner":"dy","description":"Collection of common use-case npm packages \u0026 tools alternatives","archived":false,"fork":false,"pushed_at":"2025-07-22T15:27:09.000Z","size":1883,"stargazers_count":9,"open_issues_count":6,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-22T17:32:10.845Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-01-04T21:34:56.000Z","updated_at":"2025-07-22T15:27:13.000Z","dependencies_parsed_at":"2024-12-26T17:23:53.520Z","dependency_job_id":"5ff8d678-fb6e-4738-92d0-0d0a47e8c999","html_url":"https://github.com/dy/analogs","commit_stats":{"total_commits":193,"total_committers":1,"mean_commits":193.0,"dds":0.0,"last_synced_commit":"a95d0e58f75624ff1b0850ef09c6f8fef6ecbbf0"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dy/analogs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dy%2Fanalogs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dy%2Fanalogs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dy%2Fanalogs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dy%2Fanalogs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dy","download_url":"https://codeload.github.com/dy/analogs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dy%2Fanalogs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274893250,"owners_count":25369278,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-12T02:00:09.324Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-09T21:31:34.133Z","updated_at":"2025-09-12T23:30:54.388Z","avatar_url":"https://github.com/dy.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# analogs\n\n## acestudio.ai\n\n* elevenlabs\n\n## document-persist-fragment\n\n* group-nodes https://github.com/WebReflection/group-nodes/tree/main\n\n## virtual-scroll\n\n* lenis\n* virtual-scroll\n* scroll-timeline\n\n## sal\n* aos (animate on scroll)\n\n## Textarea syntax highlight\n\n* https://github.com/adriancs2/Textarea-Syntax-Highlight?tab=readme-ov-file\n* https://github.com/kueblc/LDT\n\n## image 2 video\n* luma ray +end frame, -amorphic hallucinations\n* sora - no continuity, splits video on scenes\n* pika - not a single meaningful result\n* runwayml +end/mid rame -too shy, uncreative\n* replicate/minimax +good ideas -too fast results +realistic\n\n## bestchange.org\n\n* https://chexch.com/\n* https://kurs.expert/\n* https://www.okchanger.ru/\n\n## elevenlabs\n* rask.ai\n* https://www.speechlab.ai/\n\n## QuickJS\n\n* https://github.com/NerdLang/nerd\n* justin\n* jasm\n* porffor\n* bun\n* https://github.com/ferus-web/bali\n\n## CLI\n\n* meow\n* [vorpal](https://github.com/dthree/vorpal)\n* [commander](https://www.npmjs.com/package/commander)\n* [inquirer](https://www.npmjs.com/package/inquirer)\n* [args](https://github.com/leo/args)\n* [arg](https://github.com/vercel/arg)\n\n## apple watch ui\n\n* https://codepen.io/AndrisJefimovs/pen/JjGogaq\n* https://codeburst.io/deconstructing-the-iconic-apple-watch-bubble-ui-aba68a405689\n* https://codepen.io/anon/pen/myqamE\n* https://www.npmjs.com/package/react-bubble-ui?activeTab=readme\n* https://dzinlife.com/Apple-Watch-Spring-Board/\n\n## audio languages\n\n* [tilt](https://github.com/munshkr/tilt)\n* [soul](https://github.com/soul-lang/SOUL)\n* [mono](https://github.com/stagas/mono)\n* [juce]([https://juicelang.org/](https://docs.juce.com/master/tutorial_audio_thumbnail.html))\n\n## wasm languages\n\n* [min](https://github.com/r-lyeh/min)\n* [chasm](https://github.com/ColinEberhardt/chasm)\n* [grain](https://github.com/grain-lang/grain)\n* [wren](https://github.com/wren-lang/wren)\n* [co](https://github.com/rsms/co)\n* [compis](https://github.com/rsms/compis)\n* [v](https://github.com/vlang/v)\n* [nim](https://github.com/nim-lang/Nim)\n* [zig](https://ziglang.org/documentation/master/#WebAssembly)\n* [cyber](https://github.com/fubark/cyber)\n* [cito](https://github.com/pfusik/cito)\n* [thinscript](https://github.com/evanw/thinscript)\n* [poetry](https://github.com/FantasyInternet/poetry/)\n* [lys](https://www.npmjs.com/package/lys)\n* [WebBS](https://github.com/mx-scissortail/WebBS)\n* [ToyLang](https://github.com/JustinSDK/toy_lang)\n* [schism](https://github.com/dominikrys/schism)\n\n## Animated terminal\n\n * https://terminalizer.com/\n * https://asciinema.org/explore/featured\n\n## midjourney\n\n* [lexica.art](https://lexica.art)\n* https://creator.nightcafe.studio/\n* dall-e\n* diffusion bee\n* [dreamlike.art](https://dreamlike.art/create)\n\n## cypress\n\n* playwright\n* nightwatch\n\n## react-toastify\n\n* noty\n* js-notifier\n* https://github.com/timolins/react-hot-toast\n* https://github.com/emilkowalski/sonner\n\n## preact/signals\n\n* [usignal](https://www.npmjs.com/package/usignal)\n* [@webreflection/signal](https://github.com/webreflection/signal)\n* value-ref\n* [ulive](https://www.npmjs.com/package/ulive)\n* [trkl](https://github.com/jbreckmckye/trkl)\n\n## alpinejs\n\n* https://lucia.js.org/docs/fundementals/special-cases\n* https://github.com/vuejs/petite-vue\n\n## JS engines\n\n* [engine262](https://github.com/engine262/engine262)\n* [Jessie](https://github.com/endojs/Jessie)\n* [xst](https://github.com/Moddable-OpenSource/moddable-xst)\n\n## [carbon.sh](https://carbon.now.sh/)\n\n* [chalk.ist](https://chalk.ist/)\n* [ray.so](https://ray.so/)\n* [snappify](https://snappify.io/editor)\n\n## [wabt](https://github.com/WebAssembly/wabt)\n\n* [watr](https://github.com/audio-lab/watr)\n* [wat-compiler](https://github.com/stagas/wat-compiler)\n\n## typescript\n\n* [rtype](https://github.com/ericelliott/rtype)\n* [rfx](https://github.com/ericelliott/rfx)\n* [hegel](https://github.com/JSMonk/hegel)\n* [flow](https://flow.org/)\n\n## templated\n\n* consolidate\n\n## fourier-transform\n\n* [wasm-fourier](https://github.com/linanova/wasm-fourier)\n\n## [stretchy](https://github.com/LeaVerou/stretchy)\n\n* [textarea-autosize](https://github.com/github/textarea-autosize)\n* [autosize](https://github.com/jackmoore/autosize)\n\n## expression evaluator\n\n* subscript\n* jexpr\n* https://github.com/devrafalko/string-math\n* https://github.com/naivesound/expr-js\n* https://github.com/masyl/funex\n* https://github.com/chidiwilliams/expression-evaluator\n* https://github.com/bugwheels94/math-expression-evaluator\n* https://github.com/akira-cn/js-expression\n* https://bundlephobia.com/package/bcx-expression-evaluator@1.2.1\n* https://github.com/arthanzel/evaluatex\n* https://github.com/TomFrost/Jexl\n* https://github.com/silentmatt/expr-eval\n* https://github.com/philipszdavido/expr_parser_js\n* https://github.com/kdinev/EpsilonJS\n* https://github.com/peakchen90/decimal-eval\n* https://github.com/foo123/Xpresion\n* https://github.com/abdullah2993/expression-parser\n* https://github.com/ppaska/arithmetic-calculator\n* https://github.com/EricSmekens/jsep\n\n## template parts\n\n* [spect/template-parts](https://github.com/spect/template-parts)\n* [github/jtml](https://github.com/github/jtml)\n* [github/template-parts](https://github.com/github/template-parts)\n* [template-instantiation-prollyfill](https://www.npmjs.com/package/template-instantiation-prollyfill)\n* [template-instantiation-polyfill](https://www.npmjs.com/package/template-instantiation-polyfill)\n\n## Video player (+youtube)\n\n* yt-player\n* youtube-player\n* [plyr](https://github.com/sampotts/plyr)\n* [clappr](https://github.com/clappr/clappr)\n* [mediaelementjs](http://www.mediaelementjs.com/)\n* [dplayer](https://dplayer.js.org/)\n* [jplayer](https://www.npmjs.com/package/jplayer)\n* [playable](https://www.npmjs.com/package/playable)\n* [videojs-youtube](https://github.com/videojs/videojs-youtube)\n\n## yeoman\n\n* [plop](https://github.com/plopjs/plop)\n* [slush](https://www.npmjs.com/package/slush)\n* hygen\n* [template-file](https://www.npmjs.com/package/template-file)\n\n## [git-issue](https://github.com/dspinellis/git-issue)\n\n* [git-bug](https://github.com/MichaelMure/git-bug)\n* [full list](https://dist-bugs.branchable.com/software/)\n\n## greenshock\n\n* motion one\n* anime.js\n\n## jsinspect\n* jscpd\n* pmd\n\n## gl-waveform\n\n* uPlot\n* https://github.com/danchitnis/webgl-plot\n* https://github.com/huww98/TimeChart\n* [wavesurfer](https://wavesurfer-js.org/)\n* [waves-ui](https://github.com/wavesjs/waves-ui)\n\n\n## [proposal-refs](https://github.com/rbuckton/proposal-refs#examples)\n\n* [@esfx/ref](https://github.com/esfx/esfx)\n\n## cancelling\n\n* [abort controller](https://developer.mozilla.org/en-US/docs/Web/API/AbortController)\n* [`push(null)`](https://nodejs.org/api/stream.html#stream_readable_unshift_chunk_encoding)\n* [p-cancelable](https://www.npmjs.com/package/p-cancelable)\n* [@esfx/cancelable](https://github.com/esfx/esfx)\n\n## worker-timers\n* audio-context-timers\n* stable-timers\n\n## worker-dom\n\n* https://github.com/ampproject/worker-dom\n* https://github.com/AshleyScirra/via.js\n* https://github.com/neomjs/neo\n* https://github.com/BuilderIO/partytown\n* https://github.com/GoogleChromeLabs/clooney\n\n## [theme-ui](https://system-ui.com/theme/)\n* universal-design-token\n* theo\n* lona\n\n## react\n* [rax](https://github.com/alibaba/rax)\n* [preact](https://ghub.io/preact)\n* [inferno](https://ghub.io/inferno)\n* [riact](https://www.npmjs.com/package/riact)\n* [reaction](https://npmjs.com/reaction)\n* [hacky](https://github.com/aidenybai/hacky)\n* [fre](https://github.com/yisar/fre)\n\n## generator components\n\n* [yeet](https://github.com/tornqvist/yeet)\n\n## augmentor\n\n* dom-augmentor\n* preact-hooks\n* react-hooks\n* rax-hooks\n* [tng-hooks](https://github.com/getify/TNG-Hooks)\n\n## microbundle\n\n* [bundt](https://www.npmjs.com/package/bundt)\n* [parcel](https://ghub.io/parcel)\n* [pika/pack](https://ghub.io/pika/pack)\n* [babel](https://ghub.io/babel)\n* [swc](https://ghub.io/swc)\n* [webrunify](https://ghub.io/webrunify)\n* [fastpack](https://ghub.io/https://github.com/fastpack/fastpack)\n* [pax](https://ghub.io/pax)\n* [esbundle](https://github.com/evanw/esbuild)\n* [fuse box](https://ghub.io/fuse-box)\n* [nexe](https://ghub.io/nexe)\n* [sucrace](https://github.com/alangpierce/sucrase)\n* [klap](https://github.com/osdevisnot/klap)\n* https://dev.to/shadowtime2000/list-of-js-bundlers-14ee\n\n\n## hyperscript\n\n* [hyperscript](https://github.com/hyperhype/hyperscript)\n* [jsx-dom](https://github.com/proteriax/jsx-dom)\n* [hyperscript-strict](https://github.com/dmitriz/hyperscript-strict)\n* [hyps](https://github.com/ahdinosaur/hyps)\n* [html-tag](https://www.npmjs.com/package/html-tag)\n* [hyperf](https://github.com/spectjs/hyperf)\n* [create-element-x](https://github.com/qwtel/create-element-x)\n* [html-dom](https://github.com/stagas/html-vdom)\n\n## virtual-dom\n* [million](https://github.com/aidenybai/million)\n* [vhtml](https://github.com/developit/vhtml)\n* [val](https://github.com/skatejs/val)\n* [mutant](https://github.com/mmckegg/mutant#htmlelement--h)\n* [virtual-dom](https://www.npmjs.com/package/virtual-dom)\n* [react-hyperscript](https://ghub.io/react-hyperscript)\n* [mercury](https://github.com/Raynos/mercury)\n* [virtual-hyperscript](https://github.com/Matt-Esch/virtual-dom/tree/master/virtual-hyperscript)\n* [elementx](https://github.com/queckezz/elementx)\n* [mich-h](https://github.com/tunnckoCore/mich-h)\n* [hastscript](https://github.com/syntax-tree/hastscript)\n* [vdomini](https://github.com/stagas/vdomini)\n* [petit-dom](https://github.com/yelouafi/petit-dom)\n* [render-jsx](https://github.com/loreanvictor/render-jsx)\n* [vele](https://github.com/stagas/vele)\n* [dot-dom](https://github.com/wavesoft/dot-dom)\n* [little-vdom](https://github.com/luwes/little-vdom)\n\n## incremental-dom, html builders, vdom-like\n\n* [incremental-dom]()\n* [mikado](https://github.com/nextapps-de/mikado)\n* [html-chain](https://github.com/maael/html-chain)\n* [scriber](https://jccazeaux.github.io/scriber/)\n* [domchanger](https://github.com/creationix/domchanger)\n* [shaven](https://github.com/ad-si/shaven)\n* [tusk](https://github.com/DylanPiercey/tusk)\n\n## morphdom\n\n* [diffhtml](https://ghub.io/diffhtml)\n* [nanomorph](https://ghub.io/nanomorph)\n* [snabbdom](https://ghub.io/snabbdom)\n* [set-dom](https://github.com/DylanPiercey/set-dom)\n* remorph\n* [jsx-dom](https://ghub.io/jsx-dom)\n\n## hyperx\n\n* htm\n* [htl](https://github.com/observablehq/htl)\n* xhtm\n* nanohtml\n* [domtagger](https://github.com/WebReflection/domtagger)\n* [t7](https://github.com/trueadm/t7)\n\n## runpkg.com\n\n* npmfs\n* unpkg/\n\n## https://cdn.jsdelivr.net/npm/sprae/sprae.min.js\n\n* https://unpkg.com/sprae@3.1.0/sprae.min.js\n* https://esm.sh/sprae@3.1.0/sprae.min.js\n* https://cdn.skypack.dev/sprae\n\n## page.js\n\n* [director](https://www.npmjs.com/package/director)\n* [navigo](https://github.com/krasimir/navigo)\n* [enroute](https://github.com/lapwinglabs/enroute)\n* [a-route](https://github.com/WebReflection/a-route)\n\n## html-to-react\n\n* [htmr](https://www.npmjs.com/package/htmr)\n* [react-from-dom](https://www.npmjs.com/package/react-from-dom)\n* [html2react](https://www.npmjs.com/package/html2react)\n* ...manymanyothers\n\n## remount\n\n* [customel](https://www.npmjs.com/package/customel)\n* react-mount\n* https://github.com/jhukdev/preactement\n...manymanyothers\n\n## normalize.css\n\n* [picnic](https://github.com/franciscop/picnic)\n* [clrs](http://clrs.cc/)\n\n## assert\n\n* better-assert\n* chai\n* power-assert\n\n## diffing\n\n* [microdiff](https://github.com/gajus/liqe)\n\n## color\n\n* tinycolor2\n* onecolor\n* sumi-color\n* color-js\n* jquery-color\n* color-forge\n* chroma-js\n* colorjs\n* warna\n* kolor\n* colors.js\n* rgbcolor\n* tinytinycolor\n* chameleon-js\n* colorama\n* alchemist-js\n* [color.js](https://github.com/LeaVerou/color.js)\n* [colord](https://github.com/omgovich/colord)\n* [culori](https://github.com/Evercoder/culori)\n\n## color-picker\n\n* [vanilla-colorful](https://github.com/web-padawan/vanilla-colorful)\n* [react-colorful](https://github.com/omgovich/react-colorful)\n\n## esrecurse\n\n* ast-types\n\n## ast-redeclare\n\n* ast-hoist\n* hoister\n\n## contains\n\n* node-contains\n* within-element\n\n## [satisfy](https://github.com/padolsey/satisfy)\n\n* [emmet](https://github.com/emmetio/emmet)\n* [selector-to-tag](https://github.com/surdu/selector-to-tag)\n\n## uneval\n\n* tosource\n\n## closest\n\n* findup-element\n* component-closest\n\n## component-cookie\n\n* mmm-cookies\n* cookie-monster\n* cookie-cutter\n\n## weakmap\n\n* polymer-weakmap/weakmap\n\n## get-document\n\n* get-doc\n* global\n\n## [html-document](https://ghub.io/html-document)\n\n* [basichtml](https://ghub.io/basichtml)\n* [dom-lite](https://ghub.io/dom-lite)\n* [jsdom](https://ghub.io/jsdom)\n* [happy-dom](https://ghub.io/happy-dom)\n* [undom](https://ghub.io/undom)\n* [simple-dom](https://ghub.io/simple-dom)\n* [micro-dom](https://ghub.io/micro-dom)\n* [min-document](https://github.com/Raynos/min-document)\n* [nodom](https://github.com/redom/nodom)\n\n\n## emitter\n\n* component-emitter\n* eventemitter\n* emitter-component\n* emmy\n* enot\n* component-event\n* [on-off](https://github.com/fregante/on-off)\n\n## arr-flatten\n\n* array-flatten\n* amp-flatten\n* Array.prototype.flat\n\n## esprima\n\n* esprima\n* recast\n* falafel\n* acorn\n* [tenko](https://github.com/pvdz/tenko)\n* [babel-parser](https://github.com/babel/babel/tree/master/packages/babel-parser)\n* [escaya](https://github.com/escaya/escaya)\n\n## escope\n\n* escope\n* ast-scope\n* scopup\n* ecma-variable-scope\n* periscope\n\n## mutype/is-object\n\n101/is-object\n\n## array-uniq\n\n* uniq\n* lodash.uniq\n* uniq-component\n* possible-array-uniq\n\n## uniq-id\n\n* gen-uid\n* unique\n* uid\n* uid2\n* uid-util\n* micro-uid\n* component-uid\n* j-uid\n* unique-id\n* uniqid\n* short-uid\n* puid\n* amp-unique-id\n* genuid\n* simple-uid\n* random-id\n* smart-id\n* uuid-pure\n* simple-random-id\n* nid\n\n## cookie-cutter\n\n* browser-cookies\n* hardtrack\n* es-cookie\n\n## matches-selector\n\n* matches-selector-2\n* component-matches-selector\n* matches-selector-shim\n* matches-dom-selector\n* desandro-matches-selector\n* queried@matches\n\n## buffer-list\n\n* audio-buffer-list\n* [multi-buffer-data-view](https://github.com/chrisguttandin/multi-buffer-data-view)\n\n## xtend\n\n* component-object\n* object-assign\n\n## query-component\n\n* query-relative\n* dom-select\n* qwery\n* domy-element\n* querie\n\n## jquery\n\n* zepto\n* [cheerio](https://github.com/cheeriojs/cheerio)\n* [cash](https://github.com/kenwheeler/cash)\n* [tiny-style](https://github.com/DavidTimms/tiny-style)\n* [jbone](https://github.com/kupriyanenko/jbone)\n* [domstatic](https://github.com/webpro/DOMtastic)\n* [parasitejs](https://www.npmjs.com/package/parasitejs)\n* [min.js](https://github.com/remy/min.js)\n* [laroux](https://github.com/eserozvataf/laroux.js)\n* [cash](https://github.com/kenwheeler/cash)\n* [umbrellajs](https://www.npmjs.com/package/umbrellajs)\n* [bliss](https://github.com/leaverou/bliss/)\n* [NodeList](https://github.com/eorroe/NodeList.js)\n* [ki](https://github.com/dciccale/ki.js/blob/master/ki.js)\n* [miq](https://bitstorm.org/javascript/miq/)\n* [psquery](https://github.com/pseudosavant/psQuery)\n* [balalaika](https://github.com/finom/balalaika)\n* [bala](https://github.com/finom/bala)\n* [metamorph](https://github.com/tomhuda/metamorph.js)\n* [aph](https://github.com/kaisermann/aph)\n* [dollardom](https://github.com/julienw/dollardom)\n* [sul](https://github.com/MrOnlineCoder/sul.js)\n* [select-dom](https://github.com/fregante/select-dom)\n* [get-elements-array](https://github.com/fregante/get-elements-array)\n* [sprint](https://github.com/bendc/sprint)\n* [dominus](https://www.npmjs.com/package/dominus)\n* [d3-selection](https://npmjs.org/d3-selection)\n* [jquasi](https://www.npmjs.com/package/jquasi)\n\n## regl-line\n\n* [regl-gpu-lines](https://github.com/rreusser/regl-gpu-lines)\n* [regl-line2d](https://github.com/gl-vis/regl-line2d)\n* [regl-insta-lines](https://github.com/deluksic/regl-insta-lines)\n* [drawing-lines](https://mattdesl.svbtle.com/drawing-lines-is-hard)\n* [instanced-lines](https://wwwtyro.net/2021/10/01/instanced-lines-part-2.html)\n* [screen-projected-lines](https://github.com/substack/screen-projected-lines)\n\n## Observable tc39\n\n* [zen-observable](https://www.npmjs.com/package/zen-observable) \n* [rxjs](https://www.npmjs.com/package/rxjs)\n* [most](https://www.npmjs.com/package/most)\n* [xstream](https://www.npmjs.com/package/xstream)\n* [bacon](https://www.npmjs.com/package/baconjs)\n* [kefir](https://www.npmjs.com/package/kefir)\n* [flyd](https://www.npmjs.com/package/flyd)\n* [core-js](https://github.com/zloirock/core-js#observable)\n* [fate-observable](https://github.com/shanewholloway/node-fate-observable)\n* [indefinite-observable](https://www.npmjs.com/package/indefinite-observable)\n* [es-observable](https://www.npmjs.com/package/es-observable)\n* [light-observable](https://www.npmjs.com/package/light-observable)\n* can?\n* any-observable\n* [newsletter](https://github.com/alexeyraspopov/newsletter)\n* ...other observables\n\n## stateful observers, object observers\n* [micro-observer](https://github.com/tannerntannern/micro-observer)\n* [defi](https://github.com/defijs/defi)\n* [on-change](https://github.com/sindresorhus/on-change)\n* [atama](https://github.com/franciscop/atama)\n* [introspected](https://github.com/WebReflection/introspected)\n* [icaro](https://github.com/GianlucaGuarini/icaro)\n* [fp-ts](https://github.com/gcanti/fp-ts)\n* [object-observer](https://github.com/gullerya/object-observer)\n* [observable](https://github.com/dominictarr/observable)\n* [observ](https://github.com/Raynos/observ)\n* [observable-props](https://www.npmjs.com/package/observable-props)\n* [mutant](https://www.npmjs.com/package/mutant)\n* [ironjs](https://github.com/ironjs)\n\n## stream\n\n* xstream\n* [streamx](https://github.com/mafintosh/streamx)\n* pull-stream\n* push-stream\n* [pipe-me](https://github.com/sartaj/pipe-me)\n\n## is-array\n\n* mutype/is-array\n* an-array\n* isarray\n\n## clamp\n\n## is-number\n\n* mutype/is-number\n101/is-number\n* amp-is-number\n* is\n\n## mucss\n\n* mucss/css\n* dom-style\n\n## mucss/offset\n\n* document-offset\n* jquery.offset\n\n## inherits\n\n* component-inherit\n* component-inherits\n* util\n\n## debug\n\n* redebug\n\n## getprop\n\n* keypath\n* dotprop\n* idx\n* dot-prop\n* dlv\n\n## independence\n\n* Lots of deps injectors\n\n## placer\n\n* [adjust](https://www.npmjs.com/package/adjust)\n* [tether](https://github.com/HubSpot/tether)\n* [positions](https://github.com/QubitProducts/positions)\n* [positionining](https://github.com/mattlewis92/positioning#readme)\n* [popper](https://ghub.io/popper)\n* [satellite](https://github.com/jkroso/satellite)\n* [nanopop](https://github.com/Simonwep/nanopop)\n* [floating-ui](https://github.com/atomiks/floating-ui)\n\n## esm\n\n* reify\n* autoesm\n\n## jison\n\n* bison\n* [moo](https://github.com/no-context/moo)\n* [gruffalo](https://github.com/no-context/gruffalo)\n* [bennu/parsec](https://github.com/mattbierner/bennu)\n* [maitreya](https://www.npmjs.com/package/maitreya)\n* [syntax](https://github.com/DmitrySoshnikov/syntax)\n* [bavary](https://github.com/Simonwep/bavary)\n* [lezer](https://github.com/lezer-parser/lezer-generator)\n* [Pasukon](https://github.com/gosukiwi/Pasukon)\n* [ohm](https://github.com/harc/ohm)\n\n## onload\n\n* fast-on-load\n* disconnected\n* [element-ready](https://www.npmjs.com/package/element-ready)\n* [when-elements](https://github.com/indiana-university/when-elements)\n* [disco](https://github.com/luwes/disco)\n\n## selector-observer\n\n* [regular-elements](https://github.com/WebReflection/regular-elements)\n* [watched](https://www.npmjs.com/package/watched)\n* [spect/$](spect.ly)\n* `insertionQuery`\n* `mutation-summary` \n* `qso`\n* [SelectorListener](https://github.com/csuwildcat/SelectorListener)\n\n## tape\n\n* [node:test](https://nodejs.org/api/test.html)\n* [node-core-test](https://github.com/nodejs/node-core-test)\n* [tst](https://ghub.io/tst)\n* [tap](https://ghub.io/tap)\n* [zora](https://github.com/lorenzofox3/zora/issues/16#issuecomment-383876913)\n* [ava](https://ghub.io/ava)\n* [tapes](https://www.npmjs.com/package/tapes)\n* [tape-es](https://github.com/vanillaes/tape-es)\n* [brittle](https://github.com/davidmarkclements/brittle)\n* [uvu](https://github.com/lukeed/uvu)\n* jest\n* [pitesti](https://github.com/bengl/pitesti)\n\n## [tape-run](https://ghub.io/tape-run)\n\n* [browser-run](https://www.npmjs.com/package/browser-run)\n* [browser-env](https://ghub.io/browser-env) with `node -r esm -r ./test/register.js test/index.js`\n* testling\n* [prova](https://github.com/azer/prova)\n* [smokestack](https://github.com/hughsk/smokestack)\n* [cappadonna](https://github.com/mikeal/cappadonna)\n* [node-as-browser](https://github.com/seebigs/node-as-browser)\n\n## tuple\n\n* [many-keys-map](https://github.com/fregante/many-keys-map)\n* [many-keys-weakmap](https://github.com/fregante/many-keys-weakmap)\n* [tuplerone](https://ghub.io/tuplerone)\n* [multi-key-cache](https://www.npmjs.com/package/multi-key-cache)\n* [multikey](https://www.npmjs.com/package/multikey)\n* [composite-key-weakmap](https://www.npmjs.com/package/@allex/composite-key-weakmap)\n* [compositekey](https://www.npmjs.com/package/@bradleymeck/compositekey)\n* [multikey-map](https://www.npmjs.com/package/multikey-map)\n\n## [control-panel](https://github.com/freeman-lab/control-panel#readme)\n\n* [dat-gui](https://github.com/dataarts/dat.gui)\n* settings-panel\n* [tweakpane](https://github.com/cocopon/tweakpane)\n* [leva](https://github.com/pmndrs/leva)\n* [uil](https://github.com/lo-th/uil)\n* [control-kit](https://github.com/automat/controlkit.js/)\n* [lil-gui](https://github.com/georgealways/lil-gui)\n\n## haunted\n\n* [fuco](https://github.com/wtnbass/fuco)\n* [atomico](https://ghub.io/atomico)\n\n## static-eval\n\n* ast-eval\n* kudzu\n* [prepack](https://prepack.io/)\n\n## node-localstorage\n\n* [dom-storage](https://www.npmjs.com/package/dom-storage)\n\n## [funding](https://github.com/feross/funding)\n\n* [open-funding](https://github.com/ralphtheninja/open-funding)\n* [feedopensource](https://github.com/dominictarr/feedopensource)\n* [lemonadestand](https://github.com/nayafia/lemonade-stand)\n\n## serve\n\n* http-server\n* [polka](https://github.com/lukeed/polka)\n* [zwitterion](https://github.com/lastmjs/zwitterion)\n* servor\n* es-dev-server\n* live-server\n* lite-server\n* browser-sync\n* [sirv](https://github.com/lukeed/sirv)\n\n## import-maps\n\n* @import-maps/resolve\n\n## include-fragment-element\n\n* [html-include-element](https://github.com/justinfagnani/html-include-element)\n* imported-template, html-import, juicy-html, html-import\n* html-imports\n* xm\n\n## skillbox\n\n* geekbrains\n\n\u003c!--\n* There are lots of similar packages in npm which basically do the same thing but are called differently, from large ones like **underscore / lodash / amp** to atomic like **is / is-function / is-type**. Thousands of them.\n\n* Such an overobundance creates a trouble for the end user choosing the proper alternative, as the difference between packages is not always clear. If a package has a `README`, it does not always has a comparison with alternatives or a list of unique features. The user can rely on rating, downloads, dependent packages and code metrics, and other empiric params, and it may work, though it is work.\n\n* A problem appears in browserifying an app. If the application has dependencies which innerly use different similar packages, that results in overbloated bundle, comprising all the equivalent packages. With npm@3 that issue is less acute as it unfolds dep structure, but still, if some package use bundled version, it results in repeated chunks.\n\n* Also taking as an example the @azer’s case - having list of analogous packages would alleviate that situation.\n\n* This repository is an attempt to collect and structurize synonimic npm packages and work out tools to manage package analogs.\n\n* The main goal is to come up with a tool that can collapse synonimic dependencies in the final bundle according to specified criterias. That will reduce users concerns about what package to use within their modules, how to get minimal possible build size, whether used packages code is optimal and doesn’t contain unecessary modules. Also it will reduce npm’s entropy.\n\n\n# Duplication cases\n\n* Unecessary packages, which can be easily excluded, like `debug`, `node-noop` or other null-like.\n\t* → Detect dead code\n\t* [ ] Avoidable via [mcjs](https://github.com/dfcreative/mcjs) + [ccjs](https://github.com/dcodeIO/ClosureCompiler.js) advanced.\n\t\t* How?\n\t* [ ] Compose a list of dead packages.\n* Polyfillable packages, like `contains`, `matches-selector` or `mutation-observer`.\n\t* → Find polyfillable packages, replace with polyfills\n\t* [ ] Use transform using a polyfilled feature:\n\t`module.exports = function contains(a,b){return a.contains(b))`. This feature will be automatically detected by [autopolyfiller](https://github.com/azproduction/autopolyfiller) in resulting code.\n* Copy-pasted package code instead of requiring a package; code chunks repeating existing package functional, like `typeof x === y`.\n\t* [ ] Use code clone detection, suggest replacing packages\n* Code chunks synonimic to existing packages (functionally, not syntactically).\n\t* Only test can detect whether one lib is analogous to another, though partly. It’s too difficult for clone detector, even functional. E. g. `debug/redebug`, `is-object`,...\n\t* [ ] Manual picked analogs\n\t* [ ] Cross-testing\n* Wrapped packages: AMD, CJS, closure.\n\t* Normalize requirement style. Ideally - ES6, as far it’s going to be a standard. unUMDify, unwrap, uncommon, - transform to ES6 form.\n\t* [ ] 26: transform/unwrap any module/requirement to es6-style.\n* Heavyweight packages required only for a couple of functions, like jQuery for `ajax` or `css`, `husl` without extra conversions (within color-space), or `chai.assert`.\n\t* → Find used parts, replace with atomic stubs\n\t* [ ] [esextract](https://github.com/dfcreative/esextract) - a tool removing all the code except for passed export signature, like `$.isArray`. Like tree shaking.\n\n\n# Flow\n\n* Generalized, finding a package’s repeating inclusions in code is finging branches (chunks) in a source AST which are synonimic/equal to the branches from the dict (existing packages).\n\t* A trivial algorithm:\n\t\t1. Transform source to AST.\n\t\t2. Go from the stem, slice AST by one, get list of [code] branches.\n\t\t3. For each branch\n\t\t\t1. Normalize it’s code (find root form from the current synonim - inc. empty code).\n\t\t\t2. Compare it with the dict of modules (existing branches), if it triggers true - suggest replace.\n\t* [Suffix tree example](http://www.allisons.org/ll/AlgDS/Tree/Suffix/)\n\t* [DECKARD](http://dl.acm.org/citation.cfm?id=1248843)\n\t* [Clone algorithms digest](http://dl.acm.org/citation.cfm?id=1531101)\n\n* Autopolyfiller basically has the same resolution algorithm: it searches for specific inclusions and triggers polyfills to be inserted. Package detection could be done the same way: detected signatures triggers code chunk able to be replaced.\n\n* Package replacement is done via transform.\n\t* It is similar to webpack-loaders technic.\n\t* It creates some overhead, e. g. `withinElement` and `contains`.\n\t\t* Find a way to avoid overhead?\n\t* Transforms generalize package inclusion to any synonimic code.\n\n* Code clone detection is only a part of the whole system: it can’t detect that zepto is equivalent to jquery. It is needed for:\n\t* Detecting inlined sources\n\t* Giving suggestions on which package to use instead of a chunk\n\n* Code test is the final metric to check a code.\n\n* Replacing modules is basically mocking them. Take a look at `mock`, `node-mock`.\n\n* Package developers are responsible for picking proper analogs to their package. So it should be a `analogs` field in package.json, containing statements accordind to the syntax.\n\t* That way excludes need in version respondance - current version includes actual analogs.\n\n\n# `analogs` field in package.json\n\n* Syntax for precise describing analogs:\n\n```json\n\"analogs\": [\n\t\"analog\",\n\t\"analog/sub\",\n\t\"analog@^0.2.0\",\n\t{\n\t\t\"name\": \"analog/adapter\",\n\t\t\"version\": \"*\",\n\t\t\"code\": \"var a = require('analog'); module.exports = function(x,y){return a(y,x)}\"\n\t},\n\t{\n\t\t\"code\": \"//just shim for useless modules\"\n\t}\n]\n```\n\n* Read as \"_package `x` replaces analogs `y`, `z`_\". This provides generalizing direction and is more natural for package developers, as a new package basically extends/shims existing one. Note that backwise replacement is not always possible.\n\n\n# Parts\n\n1. Find a list of possible analogs for a package, or how package is synonimic to existing ones.\n\t* npm search by tag\n\t* indexed description\n\t* code similarity\n\t\t* min/gzipped size\n\t\t* indexed\n\t\t* AST similarity\n\t\t\t* meta-names for tokens\n\t* include inner packages search\n\t* Find by criterias from 4.\n\t* Mutually passed tests\n2. Run a test over an extraneous package\n\t* Run test over a list of packages\n3. Assess each package: size, deps, tests compat, license type, test type, browser compat, env compat, codeclimate\n4. Deps minifier for a bundle\n\t* by min size\n\t* by min deps\n\t* by max compat (IE5+)\n\t* by license\n\t* for currect project deps\n5. Apply equivalent deps set to a build.\n6. Side libs plugins: mcjs option, webpack plugin/loader, browserify plugin.\n7. Compare two similar packages (esp. by API).\n\n\n\n# Sub projects\n\n* [ ] Code-synonim - test whether one code chunk is functionally equivalent to another chunk. Or rather assess code similarity (give percentage by criterias).\n\t* [ ] Code-normalize - get normalized code chunk\n\t* [ ] Code-generalize - get generalized code chunk (literals are replaced)\n\t* [ ] Edge-data - list of data for automated testing functions\n* [ ] Code-readability - restructurize code so to enhance readability order\n* [ ] Code-extract - leaves only the code needed for producing passed exports signature result.\n* [ ] Eseval - eval dead code branches\n* [ ] analogs online picker - site similar to kangax es6 table, but with package analogs, manually picked.\n\n--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdy%2Fanalogs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdy%2Fanalogs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdy%2Fanalogs/lists"}