Our npm packages
We have been publishing to npm for 10.8 years now: 156 packages in that time, roughly 14.3 a year, of which 138 are current and 18 have been retired. The oldest two are still here and still maintained — detergent and object-boolean-combinations, both from 2015. At the other end sit html-entity-codec and string-typo-match, both from 2026.
Our speciality is non-parsing code processing — algorithms which read the source as a string and never build a syntax tree, so broken and templated input stays workable. It is not an HTML-only habit: html-crush applies it to HTML, email-comb to CSS, json-comb to JSON, and csv-sort to the awkward CSV that banks export.
The shapes vary more than the subject matter suggests. That same scannerless approach turns up over Sass variables, package.json, TypeScript declarations, CSV, IANA language codes, Commitizen changelogs and plain English prose. The APIs run from classes ( ranges-push) through callback-only traversal ( ast-monkey-traverse-with-lookahead) to a dozen command-line apps ( csv-sort-cli), and there is a tokeniser and a parser producing our own AST design, a monkey to walk it, a linter built on Node’s EventEmitter ( emlint), a Gulp plugin and an ESLint one.
Then the oddities: a string uglifier built on cryptographic principles ( string-uglify), a program which reverse-engineers Bitbucket’s slug algorithm ( bitbucket-slug), one which generates all 2n boolean combinations of an options object so the unit tests can cover every one of them ( test-mixer), and a mock program whose only job is to normalise everybody else’s benchmark scores ( perf-ref).
Everything below is grouped by what it operates on: HTML and CSS, ranges, strings, plain objects and arrays, ASTs, monorepo tooling, the command line and everything that fits nowhere else — with the four flagship libraries up front.
Of the 110 packages in the monorepo, 22 (20%) declare no dependencies at all, 90 (82%) never reach outside Codsen code however deep you follow them, and another 9 bottom out at exactly one outside library. The lot pulls in 18 distinct third-party packages, while our own codsen-utils is used by 77 of them.
Every one of those 110 is gated at 100% line coverage, and 32 of them at 100% branches, functions and statements as well — a package which slips below its threshold fails the build instead of shipping. Benchmarks are checked in for 99 of them, 1,003 recorded runs so far, and a release more than 10% slower than its own baseline fails the build too. There are 852 runnable examples across 101 of the packages, all automatically tested, and 10,093 commits behind the lot.
Downloads and dependencies
See how downloads are shared across our packages and how the libraries fit together. The download window is printed on each chart.
Follow the connections between Codsen packages
Arrows lead from a package to its dependency. Each package name links to its documentation. Dashed boxes mark packages whose outgoing dependencies are unknown. This map shows only Codsen dependencies.
Open the dependency map at full size to zoom into the labels on a small screen.
Explore one package’s dependencies in 3D
Choose a package, then rotate or zoom its dependency graph. This snapshot includes resolved production and optional dependencies, including third-party packages; a fresh install can resolve different versions.
Open the dependency explorer on its own page. The explorer also includes a linked text list of the dependencies.
View all charts, rankings and download history or inspect the chart data.
Flagship Libraries
HTML Processing Libraries Σ=16
They all process HTML and CSS. Our speciality is non-parsing algorithms — we don’t parse and then work on AST and then render. We aim to work on the source code directly while traversing it as a string.
The idea is, if you don’t parse the HTML, you can support broken or mixed code. Unless you write your parser, it becomes a bottleneck — parser throws here and there, and you can do nothing about it.
It is vital to support broken code because this allows us to make broken code-fixing programs.
Also, we often aim to support the processing of HTML mixed with other, known or unknown, source code (typically, programming or templating languages).
Range Libraries Σ=12
We needed a way to compose multiple string amendment operations. We started to mark each operation as an array, for example, [1, 5] means “delete from string index 1 to 5”.
If you wish to put something after deletion as well, it goes as the third element in the array.
All these packages process arrays of range arrays in various ways.
String Processing Libraries Σ=27
They process string inputs, which might be text, code or something else as long as it is of a string-type.
Plain Object or Array Libraries Σ=15
Usually, plain objects come from JSON files, and often they are deeply nested. The following libraries help us to traverse them, set and delete keys and compare objects.
Array-processing libraries deal with tasks like sorting, deletion or conversion to other structures.
AST Libraries Σ=12
AST stands for Abstract Syntax Tree, it’s a fancy name for nested output of a parser. Typically, it’s an array or a plain object with many layers of nested elements.
Lerna Libraries Σ=3
While maintaining our monorepo we found that some essential tools were missing, so we created them!
CLI Apps Σ=6
All the following libraries are command-line applications. You install them using -g flag via npm, for example, npm i -g json-sort-cli. Often a package/library/program would have its CLI counterpart: you can use a package programmatically, inside your programs, or you can use its CLI in the terminal, as a standalone program.
For example, csv-sort package is string-in, string-out function. It’s meant to be used by websites, CLIs and Node programs.csv-sort-cli “taps it” and adds file I/O layer and lets you read/write/sort files directly, via a command line.
Miscellaneous Libraries Σ=14
That’s all programs which don’t belong to any of the categories above. Here we have programs doing everything, from CSV sorting to Tap output parsing; from regexes to converting colour hex codes.