Ports
| Language | Package | Status |
|---|---|---|
| JavaScript / TypeScript | trackparse on npm |
Reference implementation. 12,965 / 12,965 fixtures. Tracklists in trackparse/tracklist |
| Python | trackparse on PyPI |
12,965 / 12,965 fixtures, output identical to JS. Tracklists in trackparse.tracklist |
| Rust | trackparse on crates.io |
Planned, same fixtures |
All three share one version number. The spec, the JavaScript package and the Python package are released together, and CI fails if their versions drift apart.
Adding a language
Section titled “Adding a language”A port is done when it passes every fixture and every invariant. There's no partial credit and no port-specific behaviour. The Python port maps one to one onto the JavaScript source files, which makes it a good second reference.
The checklist, in short:
- Generate source from
spec/dataandspec/VERSION, with a check mode for CI. - Implement the R0 primitives: the whitespace set, word keys, dedup keys, code-point iteration.
- Build the pipeline in the order of
js/src/parser.ts, then tracklists as a separate module. - Write the fixture matcher (about 40 lines) and a runner over both fixture folders, with schema validation and a skip list that can only shrink.
- Add property tests for the spec invariants.
- Expose an API that's idiomatic for the language but returns the same JSON.
- Extend the cross-port diff so every fixture's complete output is compared with JavaScript.
The full version, including the traps the Python port fell into (UTF-16 positions in a few
internal places, JavaScript's trim(), object key order, banker's rounding), is in
AGENTS.md.