ata-validator
1.61.3 · 29 Oct 2026MIT21.8k / weekRepositoryHomepagenpmAtom feed
Upgrading ata-validator from 1.11.0 to 1.12.0
1 release in betweenevery note read
Reading releases, release notes and advisories…
Release by release
- new
date-timestopped asking every character where it sits. The scan tested each of nineteen positions against the separator indices before checking the digit; the separators are now read directly by index and each digit becomes its value in the same read that validates it, so the field numbers cost nothing extra. 40.8 to 19.5 ns on a valid value, medians across separate processes. Same answers as before on every month, day and clock boundary and under 150k random mutations. - new
uuidreads the four hyphens by index and the 32 hex digits in five runs with fixed bounds, instead of a case-insensitive regular expression. A digit is one unsigned compare and a letter one more after folding case with a single OR. 48.4 to 35.1 ns; 300k mutated and random strings against the old expression with 0 mismatches. - new
timereads fixed positions the same way instead of running a regular expression: 15.6 to 12.1 ns, and 200k mutations against the old pattern with 0 mismatches. - new
urireads the scheme from the front and scans the rest once instead of running two regular expressions: 39.3 to 32.8 ns, interleaved medians. The remaining scan then became two tiers, because the measured answer was not the expected one: a hand-written character loop beat the old\sexpression in isolation but lost to the engine's scanner inside a compiled validator, since\sis what forced the Unicode machinery in. The first tier asks whether anything sits outside printable ASCII, a one-byte class the engine scans at its own speed and no ordinary URI ever trips; only a string that trips it pays for the loop that knows the exact reserved set. On a nested schema carrying six URLs, 215.5 to 189.4 ns per document, medians across separate processes.uri-referenceshares the same scan. Fuzzed over every code point in the BMP in three positions, 0 mismatches. - new
The Standard Schema bridge stopped paying for enrichment it throws away. An issue carries a message and a path and nothing else, but
~standard.validateread the rich error list, which builds suggestions, ranks and source frames per error. It now takes the raw, schema-ordered list through the same build the rich path uses, andparsePointerPathwalks the pointer in one pass instead of split, filter, map and a regex per segment. A 16-error rejection went from 17.6 to 4.3 microseconds; messages and order are unchanged, andtests/test_standard_schema.jsholds issues to exact parity withvalidate().errors. Schemas usingerrorMessagekeep their custom messages. - fixed
The compiled engine refused a lowercase zone letter in
timethat the interpreter accepted:00:00:00zanswered differently depending on which engine ran the schema, anddate-timetook either case in both. One implementation now answers for every engine, and it takes both cases, per RFC 3339.
- new
1 internal line (docs, tests, tooling) left out.