Releases: fallow-rs/srcmap
v0.3.6 — scopes-based symbolication and trace-mapping parity fixes
Features
- Scopes-based function name resolution in
srcmap-symbolicate. When a mapping has no associatedname, the symbolicator now walks the scopes-proposal range tree at the generated position, skips hidden ranges, and returns the innermost stack-frame scope's original name. Implements theFindOriginalFunctionNameoperation from the ECMA-426 scopes proposal, so symbolicated frames pick up readable function names from scopes data alone.
Bug fixes
srcmap-sourcemap: match@jridgewell/trace-mappingtie-break for duplicate-column segments. When two segments share a generated column, GLB now returns the earliest-equal segment and LUB returns the latest-equal, matchingtrace-mappingsemantics. Rust'sbinary_search_by_keypreviously returned an unspecified index among equal keys, which could pick aNO_SOURCEsegment over the source-bearing one and break drop-in parity.srcmap-sourcemap: preserve metadata when flattening indexed (sectioned) maps.debugId,x_*/x-*extensions, andsourceRootfrom the outer map are now propagated into the flattened result, and scopes from each section are merged (generated ranges offset, definition and source indices remapped) instead of being dropped.srcmap-remapping: only compose the inner map against its matching outer source.compose_pairpreviously returned the inner map for every outer source, so unrelated passthrough sources were incorrectly rewritten through the inner map. The match is now restricted to outer sources that equalinner.file(or the sole outer source wheninner.fileis unset).
Docs
- Reframe "full ECMA-426 compliance" as stable core support plus explicitly-labelled draft proposals.
debugId,rangeMappings, scopes/variables, andsourcesFunctionMappingsare not in the published ECMA-426 core — README, ROADMAP, crate/package READMEs, and the repo badge now say so, and ROADMAP links point at the canonicaltc39/ecma426proposal files.
Full Changelog: v0.3.5...v0.3.6
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