From 6d768ab291796b8a602f0031ed23e00ef6f11d03 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 27 Apr 2022 10:49:03 -0400 Subject: [PATCH 1/4] Add fromMap API --- package-lock.json | 9 +-- package.json | 3 +- rollup.config.js | 1 + src/gen-mapping.ts | 26 ++++++++- test/gen-mapping.test.js | 121 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 151 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb18581..77e2daa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "devDependencies": { "@rollup/plugin-typescript": "8.3.2", @@ -91,7 +92,6 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -113,7 +113,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -3354,8 +3353,7 @@ "@jridgewell/resolve-uri": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", - "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", - "dev": true + "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==" }, "@jridgewell/set-array": { "version": "1.1.0", @@ -3371,7 +3369,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" diff --git a/package.json b/package.json index e614b61..b9d04b5 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ }, "dependencies": { "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } } diff --git a/rollup.config.js b/rollup.config.js index 83fa33f..ffe984c 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -14,6 +14,7 @@ function configure(esm) { globals: { '@jridgewell/set-array': 'setArray', '@jridgewell/sourcemap-codec': 'sourcemapCodec', + '@jridgewell/trace-mapping': 'traceMapping', }, }, plugins: [ diff --git a/src/gen-mapping.ts b/src/gen-mapping.ts index 4b1eb2e..ae1d86d 100644 --- a/src/gen-mapping.ts +++ b/src/gen-mapping.ts @@ -1,6 +1,8 @@ import { SetArray, put } from '@jridgewell/set-array'; import { encode } from '@jridgewell/sourcemap-codec'; +import { TraceMap, decodedMappings } from '@jridgewell/trace-mapping'; +import type { SourceMapInput } from '@jridgewell/trace-mapping'; import type { SourceMapSegment } from './sourcemap-segment'; import type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types'; @@ -96,6 +98,11 @@ export let decodedMap: (map: GenMapping) => DecodedSourceMap; */ export let encodedMap: (map: GenMapping) => EncodedSourceMap; +/** + * Constructs a new GenMapping, using the already present mappings of the input. + */ +export let fromMap: (input: SourceMapInput) => GenMapping; + /** * Returns an array of high-level mapping objects for every recorded segment, which could then be * passed to the `source-map` library. @@ -128,7 +135,7 @@ export class GenMapping { } = map; const line = getLine(mappings, genLine); - if (source == null) { + if (!source) { const seg: SourceMapSegment = [genColumn]; const index = getColumnIndex(line, genColumn, seg); return insert(line, index, seg); @@ -222,6 +229,18 @@ export class GenMapping { return out; }; + + fromMap = (input) => { + const map = new TraceMap(input); + const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot }); + + putAll(gen._names, map.names); + putAll(gen._sources, map.sources as string[]); + gen._sourcesContent = map.sourcesContent || map.sources.map(() => null); + gen._mappings = decodedMappings(map) as GenMapping['_mappings']; + + return gen; + }; } } @@ -274,9 +293,12 @@ function compareNum(a: number, b: number): number { } function insert(array: T[], index: number, value: T) { - if (index === -1) return; for (let i = array.length; i > index; i--) { array[i] = array[i - 1]; } array[index] = value; } + +function putAll(strarr: SetArray, array: string[]) { + for (let i = 0; i < array.length; i++) put(strarr, array[i]); +} diff --git a/test/gen-mapping.test.js b/test/gen-mapping.test.js index 443c2a2..8b1816b 100644 --- a/test/gen-mapping.test.js +++ b/test/gen-mapping.test.js @@ -6,6 +6,7 @@ const { decodedMap, encodedMap, allMappings, + fromMap, } = require('..'); const assert = require('assert'); @@ -430,4 +431,124 @@ describe('GenMapping', () => { ]); }); }); + + describe('fromMap', () => { + it('copies version', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + names: [], + sources: ['input.js'], + sourcesContent: [], + mappings: [], + }); + const map = fromMap(input); + + assert.strictEqual(decodedMap(map).version, 3); + }); + + it('copies file name', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + file: 'output.js', + names: [], + sources: ['input.js'], + sourcesContent: [], + mappings: [], + }); + const map = fromMap(input); + + assert.strictEqual(decodedMap(map).file, 'output.js'); + }); + + it('copies sourceRoot', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + names: [], + sourceRoot: 'foo/', + sources: ['input.js'], + sourcesContent: [], + mappings: [], + }); + const map = fromMap(input); + + assert.strictEqual(decodedMap(map).sourceRoot, 'foo/'); + }); + + it('copies sources', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + names: [], + sources: ['input.js'], + sourcesContent: [], + mappings: [], + }); + const map = fromMap(input); + + assert.deepEqual(decodedMap(map).sources, ['input.js']); + }); + + it('copies sourcesContent', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + names: [], + sources: ['input.js'], + sourcesContent: ['input'], + mappings: [], + }); + const map = fromMap(input); + + assert.deepEqual(decodedMap(map).sourcesContent, ['input']); + }); + + it('creates sourcesContent', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + names: [], + sources: ['input.js'], + mappings: [], + }); + const map = fromMap(input); + + assert.deepEqual(decodedMap(map).sourcesContent, [null]); + }); + + it('copies names', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + names: ['foo'], + sources: ['input.js'], + sourcesContent: [], + mappings: [[[0, 0, 0, 0, 0]]], + }); + const map = fromMap(input); + + assert.deepEqual(decodedMap(map).names, ['foo']); + }); + + it('copies decoded mappings', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + names: [], + sources: ['input.js'], + sourcesContent: [], + mappings: [[[1, 0, 2, 3, 0]]], + }); + const map = fromMap(input); + + assert.deepEqual(decodedMap(map).mappings, [[[1, 0, 2, 3, 0]]]); + }); + + it('copies encoded mappings', () => { + const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + version: 3, + names: [], + sources: ['input.js'], + sourcesContent: [], + mappings: 'CAEGA', + }); + const map = fromMap(input); + + assert.deepEqual(decodedMap(map).mappings, [[[1, 0, 2, 3, 0]]]); + }); + }); }); From 180a319ae3536b846778a49749bc00c6ed4836cd Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 27 Apr 2022 11:00:21 -0400 Subject: [PATCH 2/4] Update benchmarks --- README.md | 84 ++++++++++++------------ benchmark/index.mjs | 156 ++++++++++++++++---------------------------- 2 files changed, 99 insertions(+), 141 deletions(-) diff --git a/README.md b/README.md index c9f09b3..8798c26 100644 --- a/README.md +++ b/README.md @@ -58,69 +58,69 @@ assert.deepEqual(encodedMap(map), { node v18.0.0 amp.js.map -gen-mapping: addSegment x 462 ops/sec ±1.53% (91 runs sampled) -gen-mapping: addMapping x 471 ops/sec ±0.77% (93 runs sampled) -source-map-js: addMapping x 178 ops/sec ±1.14% (84 runs sampled) -source-map-0.6.1: addMapping x 178 ops/sec ±1.21% (84 runs sampled) -source-map-0.8.0: addMapping x 177 ops/sec ±1.21% (83 runs sampled) -Fastest is gen-mapping: addMapping,gen-mapping: addSegment - -gen-mapping: decoded output x 157,499,812 ops/sec ±0.25% (100 runs sampled) -gen-mapping: encoded output x 625 ops/sec ±1.95% (88 runs sampled) -source-map-js: encoded output x 162 ops/sec ±0.37% (84 runs sampled) -source-map-0.6.1: encoded output x 161 ops/sec ±0.51% (84 runs sampled) -source-map-0.8.0: encoded output x 191 ops/sec ±0.12% (90 runs sampled) +gen-mapping: addSegment x 450 ops/sec ±1.16% (87 runs sampled) +gen-mapping: addMapping x 430 ops/sec ±0.90% (90 runs sampled) +source-map-js: addMapping x 178 ops/sec ±1.06% (84 runs sampled) +source-map-0.6.1: addMapping x 177 ops/sec ±1.07% (84 runs sampled) +source-map-0.8.0: addMapping x 178 ops/sec ±0.98% (84 runs sampled) +Fastest is gen-mapping: addSegment + +gen-mapping: decoded output x 157,549,649 ops/sec ±0.14% (97 runs sampled) +gen-mapping: encoded output x 669 ops/sec ±1.34% (95 runs sampled) +source-map-js: encoded output x 160 ops/sec ±0.64% (83 runs sampled) +source-map-0.6.1: encoded output x 161 ops/sec ±0.47% (84 runs sampled) +source-map-0.8.0: encoded output x 190 ops/sec ±0.28% (90 runs sampled) Fastest is gen-mapping: decoded output *** babel.min.js.map -gen-mapping: addSegment x 35.38 ops/sec ±4.48% (48 runs sampled) -gen-mapping: addMapping x 29.93 ops/sec ±5.03% (55 runs sampled) -source-map-js: addMapping x 22.19 ops/sec ±3.39% (41 runs sampled) -source-map-0.6.1: addMapping x 22.57 ops/sec ±2.90% (41 runs sampled) -source-map-0.8.0: addMapping x 22.73 ops/sec ±2.84% (41 runs sampled) +gen-mapping: addSegment x 51.09 ops/sec ±4.58% (56 runs sampled) +gen-mapping: addMapping x 39.38 ops/sec ±4.40% (54 runs sampled) +source-map-js: addMapping x 21.65 ops/sec ±3.34% (40 runs sampled) +source-map-0.6.1: addMapping x 21.90 ops/sec ±3.59% (41 runs sampled) +source-map-0.8.0: addMapping x 21.89 ops/sec ±3.10% (41 runs sampled) Fastest is gen-mapping: addSegment -gen-mapping: decoded output x 157,767,591 ops/sec ±0.10% (99 runs sampled) -gen-mapping: encoded output x 97.06 ops/sec ±1.69% (73 runs sampled) -source-map-js: encoded output x 17.51 ops/sec ±2.27% (37 runs sampled) -source-map-0.6.1: encoded output x 17.40 ops/sec ±4.61% (35 runs sampled) -source-map-0.8.0: encoded output x 17.83 ops/sec ±4.85% (36 runs sampled) +gen-mapping: decoded output x 154,505,123 ops/sec ±0.45% (100 runs sampled) +gen-mapping: encoded output x 84.17 ops/sec ±5.44% (66 runs sampled) +source-map-js: encoded output x 17.57 ops/sec ±4.55% (33 runs sampled) +source-map-0.6.1: encoded output x 16.43 ops/sec ±7.03% (34 runs sampled) +source-map-0.8.0: encoded output x 16.60 ops/sec ±6.44% (32 runs sampled) Fastest is gen-mapping: decoded output *** preact.js.map -gen-mapping: addSegment x 13,516 ops/sec ±0.27% (98 runs sampled) -gen-mapping: addMapping x 12,117 ops/sec ±0.25% (97 runs sampled) -source-map-js: addMapping x 4,285 ops/sec ±1.53% (98 runs sampled) -source-map-0.6.1: addMapping x 4,482 ops/sec ±0.20% (100 runs sampled) -source-map-0.8.0: addMapping x 4,482 ops/sec ±0.28% (99 runs sampled) +gen-mapping: addSegment x 11,643 ops/sec ±3.36% (91 runs sampled) +gen-mapping: addMapping x 10,921 ops/sec ±0.63% (87 runs sampled) +source-map-js: addMapping x 4,534 ops/sec ±0.25% (98 runs sampled) +source-map-0.6.1: addMapping x 4,572 ops/sec ±0.18% (99 runs sampled) +source-map-0.8.0: addMapping x 4,519 ops/sec ±0.27% (99 runs sampled) Fastest is gen-mapping: addSegment -gen-mapping: decoded output x 157,769,691 ops/sec ±0.06% (92 runs sampled) -gen-mapping: encoded output x 18,610 ops/sec ±1.03% (93 runs sampled) -source-map-js: encoded output x 5,397 ops/sec ±0.38% (97 runs sampled) -source-map-0.6.1: encoded output x 5,422 ops/sec ±0.16% (100 runs sampled) -source-map-0.8.0: encoded output x 5,595 ops/sec ±0.11% (100 runs sampled) +gen-mapping: decoded output x 157,554,436 ops/sec ±0.09% (98 runs sampled) +gen-mapping: encoded output x 17,673 ops/sec ±1.11% (87 runs sampled) +source-map-js: encoded output x 5,526 ops/sec ±0.63% (93 runs sampled) +source-map-0.6.1: encoded output x 5,679 ops/sec ±0.21% (98 runs sampled) +source-map-0.8.0: encoded output x 5,911 ops/sec ±0.14% (101 runs sampled) Fastest is gen-mapping: decoded output *** react.js.map -gen-mapping: addSegment x 5,058 ops/sec ±0.27% (100 runs sampled) -gen-mapping: addMapping x 4,352 ops/sec ±0.13% (97 runs sampled) -source-map-js: addMapping x 1,569 ops/sec ±0.19% (99 runs sampled) -source-map-0.6.1: addMapping x 1,550 ops/sec ±0.31% (97 runs sampled) -source-map-0.8.0: addMapping x 1,560 ops/sec ±0.18% (99 runs sampled) +gen-mapping: addSegment x 4,168 ops/sec ±1.08% (81 runs sampled) +gen-mapping: addMapping x 3,842 ops/sec ±1.27% (84 runs sampled) +source-map-js: addMapping x 1,510 ops/sec ±1.63% (95 runs sampled) +source-map-0.6.1: addMapping x 1,537 ops/sec ±0.34% (97 runs sampled) +source-map-0.8.0: addMapping x 1,546 ops/sec ±0.29% (98 runs sampled) Fastest is gen-mapping: addSegment -gen-mapping: decoded output x 157,479,701 ops/sec ±0.14% (99 runs sampled) -gen-mapping: encoded output x 6,392 ops/sec ±1.03% (94 runs sampled) -source-map-js: encoded output x 2,213 ops/sec ±0.36% (99 runs sampled) -source-map-0.6.1: encoded output x 2,238 ops/sec ±0.23% (100 runs sampled) -source-map-0.8.0: encoded output x 2,304 ops/sec ±0.20% (100 runs sampled) +gen-mapping: decoded output x 157,136,960 ops/sec ±0.13% (92 runs sampled) +gen-mapping: encoded output x 6,494 ops/sec ±0.56% (96 runs sampled) +source-map-js: encoded output x 2,206 ops/sec ±0.25% (100 runs sampled) +source-map-0.6.1: encoded output x 2,188 ops/sec ±0.51% (99 runs sampled) +source-map-0.8.0: encoded output x 2,254 ops/sec ±0.27% (100 runs sampled) Fastest is gen-mapping: decoded output ``` diff --git a/benchmark/index.mjs b/benchmark/index.mjs index 5d941de..df88e5f 100644 --- a/benchmark/index.mjs +++ b/benchmark/index.mjs @@ -11,6 +11,7 @@ import { addMapping, encodedMap, decodedMap, + fromMap, } from '../dist/gen-mapping.mjs'; import { SourceMapGenerator as SourceMapGeneratorJs, SourceMapConsumer } from 'source-map-js'; import { SourceMapGenerator as SourceMapGenerator061 } from 'source-map'; @@ -32,9 +33,15 @@ async function bench(file) { const line = mappings[i]; for (let j = 0; j < line.length; j++) { const seg = line[j]; - if (seg.length === 1) addSegment(map, i, seg[0]); - else if (seg.length === 4) addSegment(map, i, seg[0], sources[seg[1]], seg[2], seg[3]); - else addSegment(map, i, seg[0], sources[seg[1]], seg[2], seg[3], names[seg[4]]); + let source, sourceLine, sourceColumn, name; + const genColumn = seg[0]; + if (seg.length !== 1) { + source = sources[seg[1]]; + sourceLine = seg[2]; + sourceColumn = seg[3]; + if (seg.length === 5) name = names[seg[4]]; + } + addSegment(map, i, genColumn, source, sourceLine, sourceColumn, name); } } }) @@ -44,28 +51,18 @@ async function bench(file) { const line = mappings[i]; for (let j = 0; j < line.length; j++) { const seg = line[j]; - if (seg.length === 1) { - addMapping(map, { - generated: { line: i + 1, column: seg[0] }, - source: seg.length === 1 ? undefined : sources[seg[1]], - original: seg.length === 1 ? undefined : { line: seg[2] + 1, column: seg[3] }, - name: seg.length !== 5 ? undefined : names[seg[4]], - }); - } else if (seg.length === 4) { - addMapping(map, { - generated: { line: i + 1, column: seg[0] }, - source: sources[seg[1]], - original: { line: seg[2] + 1, column: seg[3] }, - name: undefined, - }); - } else { - addMapping(map, { - generated: { line: i + 1, column: seg[0] }, - source: sources[seg[1]], - original: { line: seg[2] + 1, column: seg[3] }, - name: names[seg[4]], - }); + const mapping = { + generated: { line: i + 1, column: seg[0] }, + source: undefined, + original: undefined, + name: undefined, + }; + if (seg.length !== 1) { + mapping.source = sources[seg[1]]; + mapping.original = { line: seg[2] + 1, column: seg[3] }; + if (seg.length === 5) mapping.name = names[seg[4]]; } + addMapping(map, mapping); } } }) @@ -75,28 +72,18 @@ async function bench(file) { const line = mappings[i]; for (let j = 0; j < line.length; j++) { const seg = line[j]; - if (seg.length === 1) { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: seg.length === 1 ? undefined : sources[seg[1]], - original: seg.length === 1 ? undefined : { line: seg[2] + 1, column: seg[3] }, - name: seg.length !== 5 ? undefined : names[seg[4]], - }); - } else if (seg.length === 4) { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: sources[seg[1]], - original: { line: seg[2] + 1, column: seg[3] }, - name: undefined, - }); - } else { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: sources[seg[1]], - original: { line: seg[2] + 1, column: seg[3] }, - name: names[seg[4]], - }); + const mapping = { + generated: { line: i + 1, column: seg[0] }, + source: undefined, + original: undefined, + name: undefined, + }; + if (seg.length !== 1) { + mapping.source = sources[seg[1]]; + mapping.original = { line: seg[2] + 1, column: seg[3] }; + if (seg.length === 5) mapping.name = names[seg[4]]; } + map.addMapping(mapping); } } }) @@ -106,28 +93,18 @@ async function bench(file) { const line = mappings[i]; for (let j = 0; j < line.length; j++) { const seg = line[j]; - if (seg.length === 1) { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: seg.length === 1 ? undefined : sources[seg[1]], - original: seg.length === 1 ? undefined : { line: seg[2] + 1, column: seg[3] }, - name: seg.length !== 5 ? undefined : names[seg[4]], - }); - } else if (seg.length === 4) { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: sources[seg[1]], - original: { line: seg[2] + 1, column: seg[3] }, - name: undefined, - }); - } else { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: sources[seg[1]], - original: { line: seg[2] + 1, column: seg[3] }, - name: names[seg[4]], - }); + const mapping = { + generated: { line: i + 1, column: seg[0] }, + source: undefined, + original: undefined, + name: undefined, + }; + if (seg.length !== 1) { + mapping.source = sources[seg[1]]; + mapping.original = { line: seg[2] + 1, column: seg[3] }; + if (seg.length === 5) mapping.name = names[seg[4]]; } + map.addMapping(mapping); } } }) @@ -137,34 +114,24 @@ async function bench(file) { const line = mappings[i]; for (let j = 0; j < line.length; j++) { const seg = line[j]; - if (seg.length === 1) { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: seg.length === 1 ? undefined : sources[seg[1]], - original: seg.length === 1 ? undefined : { line: seg[2] + 1, column: seg[3] }, - name: seg.length !== 5 ? undefined : names[seg[4]], - }); - } else if (seg.length === 4) { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: sources[seg[1]], - original: { line: seg[2] + 1, column: seg[3] }, - name: undefined, - }); - } else { - map.addMapping({ - generated: { line: i + 1, column: seg[0] }, - source: sources[seg[1]], - original: { line: seg[2] + 1, column: seg[3] }, - name: names[seg[4]], - }); + const mapping = { + generated: { line: i + 1, column: seg[0] }, + source: undefined, + original: undefined, + name: undefined, + }; + if (seg.length !== 1) { + mapping.source = sources[seg[1]]; + mapping.original = { line: seg[2] + 1, column: seg[3] }; + if (seg.length === 5) mapping.name = names[seg[4]]; } + map.addMapping(mapping); } } }) // add listeners - .on('error', ({ error }) => console.error(error)) + .on('error', (event) => console.error(event.target.error)) .on('cycle', (event) => { console.log(String(event.target)); }) @@ -176,19 +143,10 @@ async function bench(file) { console.log(''); const consumer = new SourceMapConsumer(map); + const genmap = fromMap(map); const smgjs = SourceMapGeneratorJs.fromSourceMap(consumer); const smg061 = SourceMapGenerator061.fromSourceMap(consumer); const smgWasm = SourceMapGeneratorWasm.fromSourceMap(consumer); - const genmap = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot }); - for (let i = 0; i < mappings.length; i++) { - const line = mappings[i]; - for (let j = 0; j < line.length; j++) { - const seg = line[j]; - if (seg.length === 1) addSegment(genmap, i, seg[0]); - else if (seg.length === 4) addSegment(genmap, i, seg[0], sources[seg[1]], seg[2], seg[3]); - else addSegment(genmap, i, seg[0], sources[seg[1]], seg[2], seg[3], names[seg[4]]); - } - } new Benchmark.Suite() .add('gen-mapping: decoded output', () => { @@ -207,7 +165,7 @@ async function bench(file) { smgWasm.toJSON(); }) // add listeners - .on('error', ({ error }) => console.error(error)) + .on('error', (event) => console.error(event.target.error)) .on('cycle', (event) => { console.log(String(event.target)); }) From ff4047ff4e2d98092643bbea9dec4878b7cd614e Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 27 Apr 2022 14:52:13 -0400 Subject: [PATCH 3/4] Rename decodedMap/encodedMap to toDecodedMap/toEncodedMap --- benchmark/index.mjs | 8 ++-- src/gen-mapping.ts | 10 ++-- test/gen-mapping.test.js | 98 ++++++++++++++++++++-------------------- 3 files changed, 58 insertions(+), 58 deletions(-) diff --git a/benchmark/index.mjs b/benchmark/index.mjs index df88e5f..f15b07d 100644 --- a/benchmark/index.mjs +++ b/benchmark/index.mjs @@ -9,8 +9,8 @@ import { GenMapping, addSegment, addMapping, - encodedMap, - decodedMap, + toEncodedMap, + toDecodedMap, fromMap, } from '../dist/gen-mapping.mjs'; import { SourceMapGenerator as SourceMapGeneratorJs, SourceMapConsumer } from 'source-map-js'; @@ -150,10 +150,10 @@ async function bench(file) { new Benchmark.Suite() .add('gen-mapping: decoded output', () => { - decodedMap(genmap); + toDecodedMap(genmap); }) .add('gen-mapping: encoded output', () => { - encodedMap(genmap); + toEncodedMap(genmap); }) .add('source-map-js: encoded output', () => { smgjs.toJSON(); diff --git a/src/gen-mapping.ts b/src/gen-mapping.ts index ae1d86d..7c5b7ce 100644 --- a/src/gen-mapping.ts +++ b/src/gen-mapping.ts @@ -90,13 +90,13 @@ export let setSourceContent: (map: GenMapping, source: string, content: string | * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects * a sourcemap, or to JSON.stringify. */ -export let decodedMap: (map: GenMapping) => DecodedSourceMap; +export let toDecodedMap: (map: GenMapping) => DecodedSourceMap; /** * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects * a sourcemap, or to JSON.stringify. */ -export let encodedMap: (map: GenMapping) => EncodedSourceMap; +export let toEncodedMap: (map: GenMapping) => EncodedSourceMap; /** * Constructs a new GenMapping, using the already present mappings of the input. @@ -173,7 +173,7 @@ export class GenMapping { sourcesContent[put(sources, source)] = content; }; - decodedMap = (map) => { + toDecodedMap = (map) => { const { file, sourceRoot, @@ -194,8 +194,8 @@ export class GenMapping { }; }; - encodedMap = (map) => { - const decoded = decodedMap(map); + toEncodedMap = (map) => { + const decoded = toDecodedMap(map); return { ...decoded, mappings: encode(decoded.mappings as SourceMapSegment[][]), diff --git a/test/gen-mapping.test.js b/test/gen-mapping.test.js index 8b1816b..1e8177c 100644 --- a/test/gen-mapping.test.js +++ b/test/gen-mapping.test.js @@ -3,107 +3,107 @@ const { addSegment, addMapping, setSourceContent, - decodedMap, - encodedMap, + toDecodedMap, + toEncodedMap, allMappings, fromMap, } = require('..'); const assert = require('assert'); describe('GenMapping', () => { - describe('decodedMap', () => { + describe('toDecodedMap', () => { it('has version', () => { const map = new GenMapping({ file: 'output.js' }); - assert.strictEqual(decodedMap(map).version, 3); + assert.strictEqual(toDecodedMap(map).version, 3); }); it('has file name', () => { const map = new GenMapping({ file: 'output.js' }); - assert.strictEqual(decodedMap(map).file, 'output.js'); + assert.strictEqual(toDecodedMap(map).file, 'output.js'); }); it('has sourceRoot', () => { const map = new GenMapping({ sourceRoot: 'foo/' }); - assert.strictEqual(decodedMap(map).sourceRoot, 'foo/'); + assert.strictEqual(toDecodedMap(map).sourceRoot, 'foo/'); }); it('has sources', () => { const map = new GenMapping(); addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); - assert.deepEqual(decodedMap(map).sources, ['input.js']); + assert.deepEqual(toDecodedMap(map).sources, ['input.js']); }); it('has sourcesContent', () => { const map = new GenMapping(); setSourceContent(map, 'input.js', 'input'); - assert.deepEqual(decodedMap(map).sourcesContent, ['input']); + assert.deepEqual(toDecodedMap(map).sourcesContent, ['input']); }); it('has names', () => { const map = new GenMapping(); addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); - assert.deepEqual(decodedMap(map).names, ['foo']); + assert.deepEqual(toDecodedMap(map).names, ['foo']); }); it('has mappings', () => { const map = new GenMapping(); addSegment(map, 0, 1, 'input.js', 2, 3, 'foo'); - assert.deepEqual(decodedMap(map).mappings, [[[1, 0, 2, 3, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[1, 0, 2, 3, 0]]]); }); }); - describe('encodedMap', () => { + describe('toEncodedMap', () => { it('has version', () => { const map = new GenMapping({ file: 'output.js' }); - assert.strictEqual(encodedMap(map).version, 3); + assert.strictEqual(toEncodedMap(map).version, 3); }); it('has file name', () => { const map = new GenMapping({ file: 'output.js' }); - assert.strictEqual(encodedMap(map).file, 'output.js'); + assert.strictEqual(toEncodedMap(map).file, 'output.js'); }); it('has sourceRoot', () => { const map = new GenMapping({ sourceRoot: 'foo/' }); - assert.strictEqual(encodedMap(map).sourceRoot, 'foo/'); + assert.strictEqual(toEncodedMap(map).sourceRoot, 'foo/'); }); it('has sources', () => { const map = new GenMapping(); addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); - assert.deepEqual(encodedMap(map).sources, ['input.js']); + assert.deepEqual(toEncodedMap(map).sources, ['input.js']); }); it('has sourcesContent', () => { const map = new GenMapping(); setSourceContent(map, 'input.js', 'input'); - assert.deepEqual(encodedMap(map).sourcesContent, ['input']); + assert.deepEqual(toEncodedMap(map).sourcesContent, ['input']); }); it('has names', () => { const map = new GenMapping(); addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); - assert.deepEqual(encodedMap(map).names, ['foo']); + assert.deepEqual(toEncodedMap(map).names, ['foo']); }); it('has mappings', () => { const map = new GenMapping(); addSegment(map, 0, 1, 'input.js', 2, 3, 'foo'); - assert.deepEqual(encodedMap(map).mappings, 'CAEGA'); + assert.deepEqual(toEncodedMap(map).mappings, 'CAEGA'); }); }); @@ -112,28 +112,28 @@ describe('GenMapping', () => { const map = new GenMapping(); addSegment(map, 0, 0); - assert.deepEqual(decodedMap(map).mappings, [[[0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0]]]); }); it('records nameless source segment', () => { const map = new GenMapping(); addSegment(map, 0, 0, 'input.js', 0, 0); - assert.deepEqual(decodedMap(map).mappings, [[[0, 0, 0, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0, 0, 0, 0]]]); }); it('records named source segment', () => { const map = new GenMapping(); addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); - assert.deepEqual(decodedMap(map).mappings, [[[0, 0, 0, 0, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0, 0, 0, 0, 0]]]); }); it('uses 0-based line', () => { const map = new GenMapping(); addSegment(map, 1, 0, 'input.js', 1, 0, 'foo'); - assert.deepEqual(decodedMap(map).mappings, [[], [[0, 0, 1, 0, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[], [[0, 0, 1, 0, 0]]]); }); it('can skip back and forth in generated lines', () => { @@ -142,7 +142,7 @@ describe('GenMapping', () => { addSegment(map, 2, 0, 'input.js', 2, 0); addSegment(map, 0, 0, 'input.js', 0, 0); - assert.deepEqual(decodedMap(map).mappings, [[[0, 0, 0, 0]], [[0, 0, 1, 0]], [[0, 0, 2, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0, 0, 0, 0]], [[0, 0, 1, 0]], [[0, 0, 2, 0]]]); }); it('sorts generated column', () => { @@ -151,7 +151,7 @@ describe('GenMapping', () => { addSegment(map, 0, 2, 'input.js', 0, 0); addSegment(map, 0, 0, 'input.js', 0, 0); - assert.deepEqual(decodedMap(map).mappings, [ + assert.deepEqual(toDecodedMap(map).mappings, [ [ [0, 0, 0, 0], [1, 0, 0, 0], @@ -167,7 +167,7 @@ describe('GenMapping', () => { addSegment(map, 0, 0, 'input.js', 0, 0); addSegment(map, 0, 0, 'foo.js', 0, 0); - assert.deepEqual(decodedMap(map).mappings, [ + assert.deepEqual(toDecodedMap(map).mappings, [ [ [0, 0, 0, 0], [0, 1, 0, 0], @@ -183,7 +183,7 @@ describe('GenMapping', () => { addSegment(map, 0, 0, 'input.js', 2, 0); addSegment(map, 0, 0, 'input.js', 0, 0); - assert.deepEqual(decodedMap(map).mappings, [ + assert.deepEqual(toDecodedMap(map).mappings, [ [ [0, 0, 0, 0], [0, 0, 1, 0], @@ -199,7 +199,7 @@ describe('GenMapping', () => { addSegment(map, 0, 0, 'input.js', 0, 2); addSegment(map, 0, 0, 'input.js', 0, 0); - assert.deepEqual(decodedMap(map).mappings, [ + assert.deepEqual(toDecodedMap(map).mappings, [ [ [0, 0, 0, 0], [0, 0, 0, 1], @@ -215,7 +215,7 @@ describe('GenMapping', () => { addSegment(map, 0, 0, 'input.js', 0, 0, 'bar'); addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); - assert.deepEqual(decodedMap(map).mappings, [ + assert.deepEqual(toDecodedMap(map).mappings, [ [ [0, 0, 0, 0, 0], [0, 0, 0, 0, 1], @@ -230,7 +230,7 @@ describe('GenMapping', () => { addSegment(map, 0, 0, 'input.js', 0, 0); addSegment(map, 0, 0); - assert.deepEqual(decodedMap(map).mappings, [[[0], [0, 0, 0, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0], [0, 0, 0, 0]]]); }); it('sorts sourceless segment before named segment', () => { @@ -239,7 +239,7 @@ describe('GenMapping', () => { addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); addSegment(map, 0, 0); - assert.deepEqual(decodedMap(map).mappings, [[[0], [0, 0, 0, 0, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0], [0, 0, 0, 0, 0]]]); }); it('sorts source segment before named segment', () => { @@ -248,7 +248,7 @@ describe('GenMapping', () => { addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); addSegment(map, 0, 0, 'input.js', 0, 0); - assert.deepEqual(decodedMap(map).mappings, [ + assert.deepEqual(toDecodedMap(map).mappings, [ [ [0, 0, 0, 0], [0, 0, 0, 0, 0], @@ -263,7 +263,7 @@ describe('GenMapping', () => { addSegment(map, 1, 0); addSegment(map, 0, 0); - assert.deepEqual(decodedMap(map).mappings, [[[0], [0]], [[0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0], [0]], [[0]]]); }); it('skips equivalent source segment', () => { @@ -273,7 +273,7 @@ describe('GenMapping', () => { addSegment(map, 1, 0, 'input.js', 0, 0); addSegment(map, 0, 0, 'input.js', 0, 0); - assert.deepEqual(decodedMap(map).mappings, [ + assert.deepEqual(toDecodedMap(map).mappings, [ [ [0, 0, 0, 0], [0, 0, 0, 0], @@ -289,7 +289,7 @@ describe('GenMapping', () => { addSegment(map, 1, 0, 'input.js', 0, 0, 'foo'); addSegment(map, 0, 0, 'input.js', 0, 0, 'foo'); - assert.deepEqual(decodedMap(map).mappings, [ + assert.deepEqual(toDecodedMap(map).mappings, [ [ [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], @@ -308,7 +308,7 @@ describe('GenMapping', () => { setSourceContent(map, 'bar.js', 'bar'); setSourceContent(map, 'input.js', 'input'); - assert.deepEqual(decodedMap(map).sourcesContent, ['input', null, 'bar']); + assert.deepEqual(toDecodedMap(map).sourcesContent, ['input', null, 'bar']); }); }); @@ -317,7 +317,7 @@ describe('GenMapping', () => { const map = new GenMapping(); addMapping(map, { generated: { line: 1, column: 0 } }); - assert.deepEqual(decodedMap(map).mappings, [[[0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0]]]); }); it('records nameless source segment', () => { @@ -328,7 +328,7 @@ describe('GenMapping', () => { original: { line: 1, column: 0 }, }); - assert.deepEqual(decodedMap(map).mappings, [[[0, 0, 0, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0, 0, 0, 0]]]); }); it('records named source segment', () => { @@ -340,7 +340,7 @@ describe('GenMapping', () => { name: 'foo', }); - assert.deepEqual(decodedMap(map).mappings, [[[0, 0, 0, 0, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[0, 0, 0, 0, 0]]]); }); it('uses 1-based line', () => { @@ -352,7 +352,7 @@ describe('GenMapping', () => { name: 'foo', }); - assert.deepEqual(decodedMap(map).mappings, [[], [[0, 0, 1, 0, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[], [[0, 0, 1, 0, 0]]]); }); }); @@ -443,7 +443,7 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.strictEqual(decodedMap(map).version, 3); + assert.strictEqual(toDecodedMap(map).version, 3); }); it('copies file name', () => { @@ -457,7 +457,7 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.strictEqual(decodedMap(map).file, 'output.js'); + assert.strictEqual(toDecodedMap(map).file, 'output.js'); }); it('copies sourceRoot', () => { @@ -471,7 +471,7 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.strictEqual(decodedMap(map).sourceRoot, 'foo/'); + assert.strictEqual(toDecodedMap(map).sourceRoot, 'foo/'); }); it('copies sources', () => { @@ -484,7 +484,7 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.deepEqual(decodedMap(map).sources, ['input.js']); + assert.deepEqual(toDecodedMap(map).sources, ['input.js']); }); it('copies sourcesContent', () => { @@ -497,7 +497,7 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.deepEqual(decodedMap(map).sourcesContent, ['input']); + assert.deepEqual(toDecodedMap(map).sourcesContent, ['input']); }); it('creates sourcesContent', () => { @@ -509,7 +509,7 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.deepEqual(decodedMap(map).sourcesContent, [null]); + assert.deepEqual(toDecodedMap(map).sourcesContent, [null]); }); it('copies names', () => { @@ -522,7 +522,7 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.deepEqual(decodedMap(map).names, ['foo']); + assert.deepEqual(toDecodedMap(map).names, ['foo']); }); it('copies decoded mappings', () => { @@ -535,11 +535,11 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.deepEqual(decodedMap(map).mappings, [[[1, 0, 2, 3, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[1, 0, 2, 3, 0]]]); }); it('copies encoded mappings', () => { - const input = /** @type {import('@jridgewell/trace-mapping').DecodedSourceMap} */ ({ + const input = /** @type {import('@jridgewell/trace-mapping').EncodedSourceMap} */ ({ version: 3, names: [], sources: ['input.js'], @@ -548,7 +548,7 @@ describe('GenMapping', () => { }); const map = fromMap(input); - assert.deepEqual(decodedMap(map).mappings, [[[1, 0, 2, 3, 0]]]); + assert.deepEqual(toDecodedMap(map).mappings, [[[1, 0, 2, 3, 0]]]); }); }); }); From 89f096a56f878be21ddd83d5a2fdae17c6e7c09d Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 27 Apr 2022 14:52:48 -0400 Subject: [PATCH 4/4] 0.2.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77e2daa..076f6a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jridgewell/gen-mapping", - "version": "0.1.1", + "version": "0.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@jridgewell/gen-mapping", - "version": "0.1.1", + "version": "0.2.0", "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.0", diff --git a/package.json b/package.json index b9d04b5..cf97247 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jridgewell/gen-mapping", - "version": "0.1.1", + "version": "0.2.0", "description": "Generate source maps", "keywords": [ "source",