Releases: fallow-rs/srcmap
v0.3.5 - Corrected Release Tagging
Bug fixes
- Corrected the release sequencing after the earlier
v0.3.4tag mismatch. - Cut a clean follow-up patch release from the actual release commit.
Infrastructure / CI
- Carries forward the npm trusted publishing alignment from
v0.3.4. - Keeps the release workflow on the same OIDC/trusted publishing path used by
fallow.
Full Changelog: v0.3.4...v0.3.5
v0.3.4 - Trusted Publishing Alignment
Features
- Aligned npm publishing with the trusted publishing flow used in
fallow.
Bug fixes
- Removed
NODE_AUTH_TOKENfrom the npm publish job so package publishing no longer depends on the legacy npm token path. - Added a recent npm bootstrap step for trusted publishing compatibility.
- Added publish fallback logic so package jobs retry without provenance if provenance publishing fails.
Infrastructure / CI
- Updated the release workflow to use the OIDC/trusted publishing path consistently for npm releases.
Full Changelog: v0.3.3...v0.3.4
v0.3.3 - Coverage Workflow Hardening
New crates / packages
- No new crates or top-level packages in this patch release.
- The existing npm wrapper packages now participate more reliably in the release and test flow.
Features
- Added a first-class offset-based coverage helper for
@srcmap/sourcemap-wasm. - Added a
fallow-cloud-style coverage benchmark fixture that models cached maps and beacon-style offset batches.
Performance
- Optimized coverage offset lookup paths for repeated batch workloads.
- Added batch-oriented measurement for WASM and NAPI lookups so the benchmark reflects the real bulk coverage path instead of only individual lookup loops.
Bug fixes
- Fixed release/version synchronization so newly published JS wrapper packages stay aligned.
- Fixed CI and release workflow issues around npm publishing, benchmark imports, and JS hygiene.
- Corrected coverage helper compatibility across WASM and NAPI batch APIs.
Breaking changes
- None.
Infrastructure / CI
- Expanded JS test coverage to include wrapper and compat suites.
- Extended coverage/reporting to cover more of the published JS surface.
- Tightened CI around benchmark compilation, JS hygiene, and production-coverage workflow validation.
Full Changelog: v0.3.2...v0.3.3
v0.3.2 - Repo hardening and package refresh
Features
- Refresh the JS and WASM package surfaces across
@srcmap/gen-mapping,@srcmap/source-map,@srcmap/trace-mapping,@srcmap/remapping, and@srcmap/sourcemap. - Tighten the CLI surface and test coverage around schema, lookup, validation, and remapping workflows.
Performance
- Expand benchmark coverage and real-world fixture handling to make package and runtime comparisons more representative.
- Continue tuning Rust core crates and bindings with follow-on cleanup across generator, sourcemap, remapping, scopes, and symbolication paths.
Bug Fixes
- Fix compatibility and API edge cases across the Rust crates and the Node.js bindings.
- Sync all published Rust and npm package versions to
0.3.2so internal package references stay aligned.
Infrastructure / CI
- Raise the repository quality baseline with stricter linting, formatting, dependency, and workflow checks.
- Update release automation and supporting GitHub workflows for more reliable publishing.
- Add pnpm workspace metadata and related maintenance configuration to keep JS package management predictable.
Full Changelog: v0.3.1...v0.3.2
v0.3.1 — Codec decode 2-4x faster, repo moved to fallow-rs
Performance
-
srcmap_codec::decodeis 2-4x faster on real-world source maps. A single attribute change (#[inline]→#[inline(always)]onvlq_decode) closes the cross-crate inlining gap that prevented rustc from inlining the VLQ inner loop into the codec's decode path. Benchmarks on real fixtures:- preact (17 KB mappings): 68.6 µs → 17.2 µs (−75%)
- chartjs (490 KB mappings): 3.15 ms → 1.22 ms (−61%)
- pdfjs (2.3 MB mappings): 11.49 ms → 6.15 ms (−46%)
This benefits all consumers of
@srcmap/codecandsrcmap-codec— the speedup propagates through NAPI and WASM bindings automatically.
Infrastructure
- Repository transferred from
BartWaardenburg/srcmaptofallow-rs/srcmap. The old URL redirects automatically. Allrepositoryfields inCargo.tomlandpackage.jsonfiles updated. - NAPI build no longer overwrites hand-written type definitions. The
--dtsflag now redirects auto-generated types totarget/, protecting the curatedindex.d.tsin@srcmap/codecand@srcmap/sourcemap. - Five new criterion benchmark groups (
parse_backends,json_only,real_world,lite_paths,vlq_isolation) for profiling parse-path performance. Includes real-world fixtures (preact, chartjs, pdfjs) and A/B comparisons across JSON deserializers.
Full Changelog: v0.3.0...v0.3.1
v0.3.0 — Remote debugging: fetch, sources, and context
Features
Remote source map debugging workflow
Three new CLI commands that enable debugging any production website without access to its source code:
srcmap fetch <url> — Download a JS/CSS bundle and its source map from a URL. Automatically resolves sourceMappingURL references (inline data URIs, external URLs, and conventional .map suffix fallback).
srcmap fetch https://cdn.example.com/app.min.js -o ./debug
# Fetching https://cdn.example.com/app.min.js...
# Saved ./debug/app.min.js (142 KB)
# Fetching https://cdn.example.com/app.min.js.map...
# Saved ./debug/app.min.js.map (1.2 MB)srcmap sources <file.map> — List or extract embedded sourcesContent entries. Extract mode writes all original source files to disk, preserving directory structure and handling webpack:///, file:///, and relative path prefixes.
srcmap sources app.min.js.map # list all sources
srcmap sources app.min.js.map --extract -o ./src # extract to disksrcmap lookup --context <n> — Show surrounding lines of original source code around a mapped position. Works with both human-readable and --json output.
srcmap lookup bundle.js.map 0 500 --context 5
# ../src/create-element.js:33:20
#
# 30 |
# 31 | // If a Component VNode, check for and apply defaultProps
# 32 | // Note: type may be undefined in development, must never error here.
# > 33 | if (typeof type == 'function' && type.defaultProps != null) {
# 34 | for (i in type.defaultProps) {
# 35 | if (normalizedProps[i] === UNDEFINED) {
# 36 | normalizedProps[i] = type.defaultProps[i];Full debugging workflow
These three commands chain together for the complete "debug any website" use case:
srcmap fetch https://cdn.example.com/app.min.js -o ./debug
srcmap sources ./debug/app.min.js.map --extract -o ./src
srcmap lookup ./debug/app.min.js.map 0 84729 --context 5This is the use case where srcmap is genuinely needed — LLMs can't decode VLQ mappings, position lookup requires binary search over decoded segments, and there's no other service doing this for you.
Testing
- 43 integration tests (up from 32) covering all new commands and edge cases
- New test fixture for
webpack:///and relative path source name sanitization - Edge case coverage for
--context 0, missingsourcesContent, and--jsonerror output
Documentation
- CLI README and root README updated with all new commands
- Schema introspection (
srcmap schema) includesfetch,sources, and--contextflag - New
FETCH_ERRORerror code documented
Infrastructure
- Added
ureqHTTP client dependency (blocking, rustls TLS) for thefetchcommand
Full Changelog: v0.2.3...v0.3.0
v0.2.3 — jridgewell remapping parity & wrapper packages
New Packages
Three wrapper packages provide drop-in compatibility with the jridgewell source map ecosystem:
@srcmap/source-map— Mozillasource-mapv0.6 synchronous API compatible replacement@srcmap/gen-mapping— Drop-in for@jridgewell/gen-mapping@srcmap/remapping— Drop-in for@jridgewell/remapping/@ampproject/remapping
All three use WASM under the hood and pass cross-validation tests against their jridgewell counterparts.
Bug Fixes
-
Fix
generatedPositionFordefault bias — The Rust public API incorrectly defaulted toLeastUpperBound. Now defaults toGreatestLowerBound, matching@jridgewell/trace-mappingsemantics. -
Remapping: match jridgewell deduplication behavior — Implement
skipSourcelessandskipSourcelogic so remapped output is byte-identical to@jridgewell/remapping:- Skip sourceless segments at line start
- Skip consecutive sourceless segments on the same line
- Skip sourced segments identical to the previous on the same line
-
Remapping: filter empty-string sources — Sources that are empty strings (from JSON
null) are now treated as generated-only segments instead of being passed through, matching jridgewell'sif (!source)behavior. -
Remapping: drop unmapped upstream segments — When an upstream source map has no mapping at the queried position, the segment is now dropped entirely (matching jridgewell's
if (traced == null) continue;), rather than keeping the outer reference. -
Remapping: lazy source/name registration — Upstream sources and names are only added to the output when a mapping actually references them. Previously, all upstream sources/names were eagerly registered, causing unreferenced entries to appear in the output.
-
Auto-wrap duck-typed objects in
originalPositionFor/generatedPositionFor— Objects with source map properties (like Vite'sDecodedMap) are automatically wrapped in aTraceMap. -
Handle undefined
sourcesContentand decoded mappings — Gracefully handle edge cases in parsed source map inputs. -
Fix
generatedPositionForsame-line constraint — Both GLB and LUB are now properly constrained to the same original line.
Features
remap_chain— Compose a chain of pre-parsed source maps without a loader closurefrom_data_url/fromDataUrl— Parse source maps fromdata:URLsinto_parts()/to_writer()— Zero-copy generator output for embedding- Mutable setters on
SourceMap—set_file,set_source_root,set_debug_id - WASM serialization —
toJson()on WASMSourceMap - Web target builds —
wasm-pack build --target webfor browser bundles
Performance
- Generator VLQ encoding — Auto-detect sorted mappings to skip the sort pass; unsafe VLQ encoding for pre-allocated buffers
- Remapping composition — Flat index tables with pre-built source/name remap vectors eliminate per-mapping HashMap lookups
Cross-Validation
New compat.test.mjs suites validate exact output match against:
@jridgewell/trace-mapping(26 tests)@jridgewell/remapping(11 tests)
Full Changelog: v0.2.2...v0.2.3
v0.2.2 — Performance, Hermes & React Native support
New crates
- srcmap-hermes — Hermes/React Native source map extensions: function map parsing, profile section handling, and source map composition for the Hermes bytecode compiler pipeline
- srcmap-ram-bundle — React Native RAM bundle parser: supports both indexed and file-based RAM bundle formats, module extraction, and source map association
Features
- LazySourceMap fast-scan mode (
from_json_fast) — defers all VLQ decoding at construction time, only scanning for semicolons. VLQ state is computed progressively on demand, giving the fastest possible parse for random-access lookup patterns - No-content parsing (
from_json_no_content,from_vlq) — skipsourcesContentallocation entirely for WASM bindings where content is kept on the JS side, reducing memory copies across the WASM boundary - SourceView — line-indexed source text viewer with O(1) line access, smart name extraction around positions, and JS identifier validation
- Source map utilities —
resolve_source_map_url,to_data_url,from_data_url,make_relative_pathfor common source map manipulation tasks - Generator
assume_sortedmode — skip the O(n log n) sort when mappings are already in order (common for bundlers), avoiding both the sort and theVec<&Mapping>allocation - CJS/ESM dual exports for
@srcmap/trace-mapping— properexportsfield withimport/requireconditions
Performance
- Unchecked VLQ encode with pre-allocated buffers — unsafe fast path (~30% faster encode) with cache-line-aligned base64 lookup table
- FxHashMap in generator for source/name dedup (faster than std HashMap for string keys)
- Better buffer capacity estimates across codec and generator to avoid reallocations
- Generator
to_jsonrewritten to usestd::io::Writewith pre-sized buffers
Bug fixes
- Copy-constructor double-free —
new TraceMap(existingTraceMap)now deep-copies instead of sharing the WASM pointer generatedPositionForbias convention — fixed to match spec: 0 = GREATEST_LOWER_BOUND (default), -1 = LEAST_UPPER_BOUNDnormalizePathfor source resolution — removes.and..segments, matching@jridgewell/resolve-uribehavior- URI scheme passthrough —
data:,webpack://, and other absolute URIs preserved inresolvedSources - Decoded mappings stride — fixed 6→7 to account for
is_range_mappingfield - VLQ overflow threshold — tightened from shift≥64 to shift≥60, rejecting malformed inputs earlier
- Range mapping cross-line bounds — range marking now correctly bounded to current line's mappings
MappingsIterfield validation — rejects 2-field and 3-field segments (only 1, 4, or 5 are valid per ECMA-426)decode_mappings_rangeOOM — capsend_lineagainst actual line count to prevent allocation on pathological inputrange_mapping_fallbackunderflow — usessaturating_subwhen query column precedes range mapping column- WASM
source()/name()— now returnOptionwith bounds checking instead of panicking on invalid indices
Infrastructure
- GitHub Actions bumped to v5 (checkout, setup-node, upload/download-artifact)
- Release drafter with auto-labeling by conventional commit prefix
- Community health files: CODE_OF_CONDUCT, CONTRIBUTING, SECURITY, issue/PR templates
- Pre-commit hook for
cargo fmtcheck
Full Changelog: v0.2.1...v0.2.2
Full Changelog: v0.2.1...v0.2.2
v0.2.1 — CLI tests, SourceMapBuilder, ECMA-426 conformance
Features
-
srcmap scopesCLI command — Decode and inspect ECMA-426 scopes data from source maps directly on the command line, with both human-readable and JSON output formats. -
SourceMapBuilder— A new high-level builder API onSourceMapthat mirrorsSourceMapGeneratorbut produces aSourceMapdirectly, avoiding a JSON serialization roundtrip. Supports all mapping types including range mappings, source content, ignore lists, and debug IDs. -
Usage examples for every crate — Each crate now ships with comprehensive examples (
cargo run --example <name>), covering common workflows: VLQ encoding/decoding, source map consumption, lazy parsing, streaming generation, bundler-style concatenation, composition, scopes debugging, and error symbolication. CI verifies these compile on every push.
Bug Fixes
- ECMA-426 conformance — Fixed several spec compliance issues:
- Two-field and three-field VLQ segments are now correctly rejected during decoding (spec requires 1, 4, or 5 fields)
- Added 25 conformance test cases covering version validation, segment rejection, column snapping, source root handling, indexed maps, and scopes roundtrips
- Codec now returns proper errors for invalid segment lengths instead of silently accepting them
Performance
- Bundler-scale remap benchmark — Added a realistic benchmark simulating a 50-module bundler concat + remap pipeline, measuring both the streaming and regular remap paths at scale.
Infrastructure
- 32 CLI integration tests — Full test coverage for all
srcmapsubcommands (decode, encode, info, lookup, resolve, mappings, validate, concat, remap, scopes, symbolicate, schema), including stdin piping, JSON output, error handling, and dry-run modes. - CI example compilation check —
cargo build --examples --workspaceruns on every push to catch broken examples early.
Full Changelog: v0.2.0...v0.2.1
Full Changelog: v0.2.0...v0.2.1
v0.2.0 — Symbolication, streaming APIs, and ECMA-426 scopes
New crates & packages
srcmap-symbolicate— Stack trace symbolication with V8, SpiderMonkey, and JSC engine support. Batch symbolication, debug ID resolution, and structured JSON output.@srcmap/symbolicate-wasm— WASM bindings for symbolication in the browser and Node.js.@srcmap/scopes-wasm— WASM bindings for ECMA-426 scopes encode/decode.@srcmap/trace-mapping— Drop-in compatibility wrapper for@jridgewell/trace-mapping, backed by srcmap's Rust/WASM core.- NAPI bindings for
generatorandremappingcrates.
Features
- Range mappings — Full encode/decode/lookup support for the ECMA-426 range mappings proposal. Range-aware remapping preserves range metadata through composition.
- Streaming APIs —
StreamingGeneratorbuilds source maps without buffering all mappings in memory.remap_streamingcomposes source maps on the fly. - Lazy/incremental parsing —
LazySourceMapdecodes individual lines on demand, useful for large maps where you only need a few lookups. toDecodedMap()— Convert aGeneratordirectly to a decoded source map without serializing to JSON first.- Lookup bias — LUB (least upper bound) and GLB (greatest lower bound) lookup modes for both forward and reverse lookups.
- Extension field passthrough — Unknown fields in source map JSON (e.g.,
x_facebook_sources) are preserved through parse/serialize roundtrips. x_google_ignoreListfallback — Automatically readsx_google_ignoreListwhenignoreListis absent.sourceMappingURLextraction — Parse//# sourceMappingURL=from JS/CSS, with inline base64 data URI decoding.- Deep validation —
validate_deep()checks out-of-bounds indices, unreferenced sources, and out-of-order mappings. excludeContentoption — OmitsourcesContentfrom serialized output.- Browser WASM targets — All WASM packages now ship browser builds with async initialization.
Performance
- Inlined
Segmentstruct — Stack-allocated[i64; 5]replaces heap-allocatedVec, eliminating allocation per segment during decode. - VLQ single-char fast path — Single-character VLQ values (covers ~90% of real-world segments) decode without looping.
- Capacity hints — Pre-allocated buffers based on mappings string length reduce reallocations during decode.
- Zero-allocation WASM lookups —
originalPositionFlatandoriginalPositionBufreturn results without JS object allocation overhead, matching native JS lookup speed.
Testing
- ECMA-426 conformance suite — 16 conformance tests covering the source map spec, integrated into CI.
- Real-world benchmarks — Benchmarks against Preact, Chart.js, and PDF.js source maps for representative performance numbers.
Architecture improvements
- Comprehensive refactoring across all crates for consistency, error handling, and code quality.
- Improved documentation with doc-tests and README updates for every crate.
Full Changelog: v0.1.3...v0.2.0
Full Changelog: v0.1.3...v0.2.0