forked from FINAKON/HelpProject
349 lines
14 KiB
Markdown
349 lines
14 KiB
Markdown
|
# @jridgewell/trace-mapping
|
||
|
|
||
|
> Trace the original position through a source map
|
||
|
|
||
|
`trace-mapping` allows you to take the line and column of an output file and trace it to the
|
||
|
original location in the source file through a source map.
|
||
|
|
||
|
You may already be familiar with the [`source-map`][source-map] package's `SourceMapConsumer`. This
|
||
|
provides the same `originalPositionFor` and `generatedPositionFor` API, without requiring WASM.
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
```sh
|
||
|
npm install @jridgewell/trace-mapping
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
```typescript
|
||
|
import {
|
||
|
TraceMap,
|
||
|
originalPositionFor,
|
||
|
generatedPositionFor,
|
||
|
sourceContentFor,
|
||
|
isIgnored,
|
||
|
} from '@jridgewell/trace-mapping';
|
||
|
|
||
|
const tracer = new TraceMap({
|
||
|
version: 3,
|
||
|
sources: ['input.js'],
|
||
|
sourcesContent: ['content of input.js'],
|
||
|
names: ['foo'],
|
||
|
mappings: 'KAyCIA',
|
||
|
ignoreList: [],
|
||
|
});
|
||
|
|
||
|
// Lines start at line 1, columns at column 0.
|
||
|
const traced = originalPositionFor(tracer, { line: 1, column: 5 });
|
||
|
assert.deepEqual(traced, {
|
||
|
source: 'input.js',
|
||
|
line: 42,
|
||
|
column: 4,
|
||
|
name: 'foo',
|
||
|
});
|
||
|
|
||
|
const content = sourceContentFor(tracer, traced.source);
|
||
|
assert.strictEqual(content, 'content for input.js');
|
||
|
|
||
|
const generated = generatedPositionFor(tracer, {
|
||
|
source: 'input.js',
|
||
|
line: 42,
|
||
|
column: 4,
|
||
|
});
|
||
|
assert.deepEqual(generated, {
|
||
|
line: 1,
|
||
|
column: 5,
|
||
|
});
|
||
|
|
||
|
const ignored = isIgnored(tracer, 'input.js');
|
||
|
assert.equal(ignored, false);
|
||
|
```
|
||
|
|
||
|
We also provide a lower level API to get the actual segment that matches our line and column. Unlike
|
||
|
`originalPositionFor`, `traceSegment` uses a 0-base for `line`:
|
||
|
|
||
|
```typescript
|
||
|
import { traceSegment } from '@jridgewell/trace-mapping';
|
||
|
|
||
|
// line is 0-base.
|
||
|
const traced = traceSegment(tracer, /* line */ 0, /* column */ 5);
|
||
|
|
||
|
// Segments are [outputColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
|
||
|
// Again, line is 0-base and so is sourceLine
|
||
|
assert.deepEqual(traced, [5, 0, 41, 4, 0]);
|
||
|
```
|
||
|
|
||
|
### SectionedSourceMaps
|
||
|
|
||
|
The sourcemap spec defines a special `sections` field that's designed to handle concatenation of
|
||
|
output code with associated sourcemaps. This type of sourcemap is rarely used (no major build tool
|
||
|
produces it), but if you are hand coding a concatenation you may need it. We provide an `AnyMap`
|
||
|
helper that can receive either a regular sourcemap or a `SectionedSourceMap` and returns a
|
||
|
`TraceMap` instance:
|
||
|
|
||
|
```typescript
|
||
|
import { AnyMap } from '@jridgewell/trace-mapping';
|
||
|
const fooOutput = 'foo';
|
||
|
const barOutput = 'bar';
|
||
|
const output = [fooOutput, barOutput].join('\n');
|
||
|
|
||
|
const sectioned = new AnyMap({
|
||
|
version: 3,
|
||
|
sections: [
|
||
|
{
|
||
|
// 0-base line and column
|
||
|
offset: { line: 0, column: 0 },
|
||
|
// fooOutput's sourcemap
|
||
|
map: {
|
||
|
version: 3,
|
||
|
sources: ['foo.js'],
|
||
|
names: ['foo'],
|
||
|
mappings: 'AAAAA',
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
// barOutput's sourcemap will not affect the first line, only the second
|
||
|
offset: { line: 1, column: 0 },
|
||
|
map: {
|
||
|
version: 3,
|
||
|
sources: ['bar.js'],
|
||
|
names: ['bar'],
|
||
|
mappings: 'AAAAA',
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
});
|
||
|
|
||
|
const traced = originalPositionFor(sectioned, {
|
||
|
line: 2,
|
||
|
column: 0,
|
||
|
});
|
||
|
|
||
|
assert.deepEqual(traced, {
|
||
|
source: 'bar.js',
|
||
|
line: 1,
|
||
|
column: 0,
|
||
|
name: 'bar',
|
||
|
});
|
||
|
```
|
||
|
|
||
|
## Benchmarks
|
||
|
|
||
|
```
|
||
|
node v20.10.0
|
||
|
|
||
|
amp.js.map - 45120 segments
|
||
|
|
||
|
Memory Usage:
|
||
|
trace-mapping decoded 414164 bytes
|
||
|
trace-mapping encoded 6274352 bytes
|
||
|
source-map-js 10968904 bytes
|
||
|
source-map-0.6.1 17587160 bytes
|
||
|
source-map-0.8.0 8812155 bytes
|
||
|
Chrome dev tools 8672912 bytes
|
||
|
Smallest memory usage is trace-mapping decoded
|
||
|
|
||
|
Init speed:
|
||
|
trace-mapping: decoded JSON input x 205 ops/sec ±0.19% (88 runs sampled)
|
||
|
trace-mapping: encoded JSON input x 405 ops/sec ±1.47% (88 runs sampled)
|
||
|
trace-mapping: decoded Object input x 4,645 ops/sec ±0.15% (98 runs sampled)
|
||
|
trace-mapping: encoded Object input x 458 ops/sec ±1.63% (91 runs sampled)
|
||
|
source-map-js: encoded Object input x 75.48 ops/sec ±1.64% (67 runs sampled)
|
||
|
source-map-0.6.1: encoded Object input x 39.37 ops/sec ±1.44% (53 runs sampled)
|
||
|
Chrome dev tools: encoded Object input x 150 ops/sec ±1.76% (79 runs sampled)
|
||
|
Fastest is trace-mapping: decoded Object input
|
||
|
|
||
|
Trace speed (random):
|
||
|
trace-mapping: decoded originalPositionFor x 44,946 ops/sec ±0.16% (99 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 37,995 ops/sec ±1.81% (89 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 9,230 ops/sec ±1.36% (93 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 8,057 ops/sec ±0.84% (96 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 28,198 ops/sec ±1.12% (91 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 46,276 ops/sec ±1.35% (95 runs sampled)
|
||
|
Fastest is Chrome dev tools: encoded originalPositionFor
|
||
|
|
||
|
Trace speed (ascending):
|
||
|
trace-mapping: decoded originalPositionFor x 204,406 ops/sec ±0.19% (97 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 196,695 ops/sec ±0.24% (99 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 11,948 ops/sec ±0.94% (99 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 10,730 ops/sec ±0.36% (100 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 51,427 ops/sec ±0.21% (98 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 162,615 ops/sec ±0.18% (98 runs sampled)
|
||
|
Fastest is trace-mapping: decoded originalPositionFor
|
||
|
|
||
|
|
||
|
***
|
||
|
|
||
|
|
||
|
babel.min.js.map - 347793 segments
|
||
|
|
||
|
Memory Usage:
|
||
|
trace-mapping decoded 18504 bytes
|
||
|
trace-mapping encoded 35428008 bytes
|
||
|
source-map-js 51676808 bytes
|
||
|
source-map-0.6.1 63367136 bytes
|
||
|
source-map-0.8.0 43158400 bytes
|
||
|
Chrome dev tools 50721552 bytes
|
||
|
Smallest memory usage is trace-mapping decoded
|
||
|
|
||
|
Init speed:
|
||
|
trace-mapping: decoded JSON input x 17.82 ops/sec ±6.35% (35 runs sampled)
|
||
|
trace-mapping: encoded JSON input x 31.57 ops/sec ±7.50% (43 runs sampled)
|
||
|
trace-mapping: decoded Object input x 867 ops/sec ±0.74% (94 runs sampled)
|
||
|
trace-mapping: encoded Object input x 33.83 ops/sec ±7.66% (46 runs sampled)
|
||
|
source-map-js: encoded Object input x 6.58 ops/sec ±3.31% (20 runs sampled)
|
||
|
source-map-0.6.1: encoded Object input x 4.23 ops/sec ±3.43% (15 runs sampled)
|
||
|
Chrome dev tools: encoded Object input x 22.14 ops/sec ±3.79% (41 runs sampled)
|
||
|
Fastest is trace-mapping: decoded Object input
|
||
|
|
||
|
Trace speed (random):
|
||
|
trace-mapping: decoded originalPositionFor x 78,234 ops/sec ±1.48% (29 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 60,761 ops/sec ±1.35% (21 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 51,448 ops/sec ±2.17% (89 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 47,221 ops/sec ±1.99% (15 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 84,002 ops/sec ±1.45% (27 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 106,457 ops/sec ±1.38% (37 runs sampled)
|
||
|
Fastest is Chrome dev tools: encoded originalPositionFor
|
||
|
|
||
|
Trace speed (ascending):
|
||
|
trace-mapping: decoded originalPositionFor x 930,943 ops/sec ±0.25% (99 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 843,545 ops/sec ±0.34% (97 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 114,510 ops/sec ±1.37% (36 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 87,412 ops/sec ±0.72% (92 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 197,709 ops/sec ±0.89% (59 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 688,983 ops/sec ±0.33% (98 runs sampled)
|
||
|
Fastest is trace-mapping: decoded originalPositionFor
|
||
|
|
||
|
|
||
|
***
|
||
|
|
||
|
|
||
|
preact.js.map - 1992 segments
|
||
|
|
||
|
Memory Usage:
|
||
|
trace-mapping decoded 33136 bytes
|
||
|
trace-mapping encoded 254240 bytes
|
||
|
source-map-js 837488 bytes
|
||
|
source-map-0.6.1 961928 bytes
|
||
|
source-map-0.8.0 54384 bytes
|
||
|
Chrome dev tools 709680 bytes
|
||
|
Smallest memory usage is trace-mapping decoded
|
||
|
|
||
|
Init speed:
|
||
|
trace-mapping: decoded JSON input x 3,709 ops/sec ±0.13% (99 runs sampled)
|
||
|
trace-mapping: encoded JSON input x 6,447 ops/sec ±0.22% (101 runs sampled)
|
||
|
trace-mapping: decoded Object input x 83,062 ops/sec ±0.23% (100 runs sampled)
|
||
|
trace-mapping: encoded Object input x 14,980 ops/sec ±0.28% (100 runs sampled)
|
||
|
source-map-js: encoded Object input x 2,544 ops/sec ±0.16% (99 runs sampled)
|
||
|
source-map-0.6.1: encoded Object input x 1,221 ops/sec ±0.37% (97 runs sampled)
|
||
|
Chrome dev tools: encoded Object input x 4,241 ops/sec ±0.39% (93 runs sampled)
|
||
|
Fastest is trace-mapping: decoded Object input
|
||
|
|
||
|
Trace speed (random):
|
||
|
trace-mapping: decoded originalPositionFor x 91,028 ops/sec ±0.14% (94 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 84,348 ops/sec ±0.26% (98 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 26,998 ops/sec ±0.23% (98 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 18,049 ops/sec ±0.26% (100 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 41,916 ops/sec ±0.28% (98 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 88,616 ops/sec ±0.14% (98 runs sampled)
|
||
|
Fastest is trace-mapping: decoded originalPositionFor
|
||
|
|
||
|
Trace speed (ascending):
|
||
|
trace-mapping: decoded originalPositionFor x 319,960 ops/sec ±0.16% (100 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 302,153 ops/sec ±0.18% (100 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 35,574 ops/sec ±0.19% (100 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 19,943 ops/sec ±0.12% (101 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 54,648 ops/sec ±0.20% (99 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 278,319 ops/sec ±0.17% (102 runs sampled)
|
||
|
Fastest is trace-mapping: decoded originalPositionFor
|
||
|
|
||
|
|
||
|
***
|
||
|
|
||
|
|
||
|
react.js.map - 5726 segments
|
||
|
|
||
|
Memory Usage:
|
||
|
trace-mapping decoded 10872 bytes
|
||
|
trace-mapping encoded 681512 bytes
|
||
|
source-map-js 2563944 bytes
|
||
|
source-map-0.6.1 2150864 bytes
|
||
|
source-map-0.8.0 88680 bytes
|
||
|
Chrome dev tools 1149576 bytes
|
||
|
Smallest memory usage is trace-mapping decoded
|
||
|
|
||
|
Init speed:
|
||
|
trace-mapping: decoded JSON input x 1,887 ops/sec ±0.28% (99 runs sampled)
|
||
|
trace-mapping: encoded JSON input x 4,749 ops/sec ±0.48% (97 runs sampled)
|
||
|
trace-mapping: decoded Object input x 74,236 ops/sec ±0.11% (99 runs sampled)
|
||
|
trace-mapping: encoded Object input x 5,752 ops/sec ±0.38% (100 runs sampled)
|
||
|
source-map-js: encoded Object input x 806 ops/sec ±0.19% (97 runs sampled)
|
||
|
source-map-0.6.1: encoded Object input x 418 ops/sec ±0.33% (94 runs sampled)
|
||
|
Chrome dev tools: encoded Object input x 1,524 ops/sec ±0.57% (92 runs sampled)
|
||
|
Fastest is trace-mapping: decoded Object input
|
||
|
|
||
|
Trace speed (random):
|
||
|
trace-mapping: decoded originalPositionFor x 620,201 ops/sec ±0.33% (96 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 579,548 ops/sec ±0.35% (97 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 230,983 ops/sec ±0.62% (54 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 158,145 ops/sec ±0.80% (46 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 343,801 ops/sec ±0.55% (96 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 659,649 ops/sec ±0.49% (98 runs sampled)
|
||
|
Fastest is Chrome dev tools: encoded originalPositionFor
|
||
|
|
||
|
Trace speed (ascending):
|
||
|
trace-mapping: decoded originalPositionFor x 2,368,079 ops/sec ±0.32% (98 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 2,134,039 ops/sec ±2.72% (87 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 290,120 ops/sec ±2.49% (82 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 187,613 ops/sec ±0.86% (49 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 479,569 ops/sec ±0.65% (96 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 2,048,414 ops/sec ±0.24% (98 runs sampled)
|
||
|
Fastest is trace-mapping: decoded originalPositionFor
|
||
|
|
||
|
|
||
|
***
|
||
|
|
||
|
|
||
|
vscode.map - 2141001 segments
|
||
|
|
||
|
Memory Usage:
|
||
|
trace-mapping decoded 5206584 bytes
|
||
|
trace-mapping encoded 208370336 bytes
|
||
|
source-map-js 278493008 bytes
|
||
|
source-map-0.6.1 391564048 bytes
|
||
|
source-map-0.8.0 257508787 bytes
|
||
|
Chrome dev tools 291053000 bytes
|
||
|
Smallest memory usage is trace-mapping decoded
|
||
|
|
||
|
Init speed:
|
||
|
trace-mapping: decoded JSON input x 1.63 ops/sec ±33.88% (9 runs sampled)
|
||
|
trace-mapping: encoded JSON input x 3.29 ops/sec ±36.13% (13 runs sampled)
|
||
|
trace-mapping: decoded Object input x 103 ops/sec ±0.93% (77 runs sampled)
|
||
|
trace-mapping: encoded Object input x 5.42 ops/sec ±28.54% (19 runs sampled)
|
||
|
source-map-js: encoded Object input x 1.07 ops/sec ±13.84% (7 runs sampled)
|
||
|
source-map-0.6.1: encoded Object input x 0.60 ops/sec ±2.43% (6 runs sampled)
|
||
|
Chrome dev tools: encoded Object input x 2.61 ops/sec ±22.00% (11 runs sampled)
|
||
|
Fastest is trace-mapping: decoded Object input
|
||
|
|
||
|
Trace speed (random):
|
||
|
trace-mapping: decoded originalPositionFor x 257,019 ops/sec ±0.97% (93 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 179,163 ops/sec ±0.83% (92 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 73,337 ops/sec ±1.35% (87 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 38,797 ops/sec ±1.66% (88 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 107,758 ops/sec ±1.94% (45 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 188,550 ops/sec ±1.85% (79 runs sampled)
|
||
|
Fastest is trace-mapping: decoded originalPositionFor
|
||
|
|
||
|
Trace speed (ascending):
|
||
|
trace-mapping: decoded originalPositionFor x 447,621 ops/sec ±3.64% (94 runs sampled)
|
||
|
trace-mapping: encoded originalPositionFor x 323,698 ops/sec ±5.20% (88 runs sampled)
|
||
|
source-map-js: encoded originalPositionFor x 78,387 ops/sec ±1.69% (89 runs sampled)
|
||
|
source-map-0.6.1: encoded originalPositionFor x 41,016 ops/sec ±3.01% (25 runs sampled)
|
||
|
source-map-0.8.0: encoded originalPositionFor x 124,204 ops/sec ±0.90% (92 runs sampled)
|
||
|
Chrome dev tools: encoded originalPositionFor x 230,087 ops/sec ±2.61% (93 runs sampled)
|
||
|
Fastest is trace-mapping: decoded originalPositionFor
|
||
|
```
|
||
|
|
||
|
[source-map]: https://www.npmjs.com/package/source-map
|