Skip to content

Commit

Permalink
module: add SourceMap.lineLengths
Browse files Browse the repository at this point in the history
Fix: nodejs#48460
PR-URL: nodejs#48461
Fixes: nodejs#48460
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
  • Loading branch information
isaacs authored and Ceres6 committed Aug 14, 2023
1 parent 3d2e0ba commit 7e908d3
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 4 deletions.
6 changes: 5 additions & 1 deletion doc/api/module.md
Original file line number Diff line number Diff line change
Expand Up @@ -271,9 +271,10 @@ added:
- v12.17.0
-->
#### `new SourceMap(payload)`
#### `new SourceMap(payload[, { lineLengths }])`
* `payload` {Object}
* `lineLengths` {number\[]}
Creates a new `sourceMap` instance.
Expand All @@ -287,6 +288,9 @@ Creates a new `sourceMap` instance.
* `mappings`: {string}
* `sourceRoot`: {string}
`lineLengths` is an optional array of the length of each line in the
generated code.
#### `sourceMap.payload`
* Returns: {Object}
Expand Down
16 changes: 15 additions & 1 deletion lib/internal/source_map/source_map.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,13 @@ class SourceMap {
#mappings = [];
#sources = {};
#sourceContentByURL = {};
#lineLengths = undefined;

/**
* @constructor
* @param {SourceMapV3} payload
*/
constructor(payload) {
constructor(payload, { lineLengths } = { __proto__: null }) {
if (!base64Map) {
const base64Digits =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
Expand All @@ -140,6 +141,9 @@ class SourceMap {
}
this.#payload = cloneSourceMapV3(payload);
this.#parseMappingPayload();
if (ArrayIsArray(lineLengths) && lineLengths.length) {
this.#lineLengths = lineLengths;
}
}

/**
Expand All @@ -149,6 +153,16 @@ class SourceMap {
return cloneSourceMapV3(this.#payload);
}

/**
* @return {number[] | undefined} line lengths of generated source code
*/
get lineLengths() {
if (this.#lineLengths) {
return ArrayPrototypeSlice(this.#lineLengths);
}
return undefined;
}

#parseMappingPayload = () => {
if (this.#payload.sections) {
this.#parseSections(this.#payload.sections);
Expand Down
2 changes: 1 addition & 1 deletion lib/internal/source_map/source_map_cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ function findSourceMap(sourceURL) {
}
let sourceMap = entry.sourceMap;
if (sourceMap === undefined) {
sourceMap = new SourceMap(entry.data);
sourceMap = new SourceMap(entry.data, { lineLengths: entry.lineLengths });
entry.sourceMap = sourceMap;
}
return sourceMap;
Expand Down
12 changes: 11 additions & 1 deletion test/parallel/test-source-map-api.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ const { readFileSync } = require('fs');
assert.strictEqual(fileName, originalSource);
assert.strictEqual(lineNumber, 3);
assert.strictEqual(columnNumber, 6);
assert(Array.isArray(sourceMap.lineLengths));
assert(!sourceMap.lineLengths.some((len) => (typeof len !== 'number')));
}

// findSourceMap() can be used in Error.prepareStackTrace() to lookup
Expand Down Expand Up @@ -116,7 +118,10 @@ const { readFileSync } = require('fs');
const payload = JSON.parse(readFileSync(
require.resolve('../fixtures/source-map/disk.map'), 'utf8'
));
const sourceMap = new SourceMap(payload);
const lineLengths = readFileSync(
require.resolve('../fixtures/source-map/disk.map'), 'utf8'
).replace(/\n$/, '').split('\n').map((l) => l.length);
const sourceMap = new SourceMap(payload, { lineLengths });
const {
originalLine,
originalColumn,
Expand All @@ -125,6 +130,11 @@ const { readFileSync } = require('fs');
assert.strictEqual(originalLine, 2);
assert.strictEqual(originalColumn, 4);
assert(originalSource.endsWith('disk.js'));
const sourceMapLineLengths = sourceMap.lineLengths;
for (let i = 0; i < sourceMapLineLengths.length; i++) {
assert.strictEqual(sourceMapLineLengths[i], lineLengths[i]);
}
assert.strictEqual(sourceMapLineLengths.length, lineLengths.length);
// The stored payload should be a clone:
assert.strictEqual(payload.mappings, sourceMap.payload.mappings);
assert.notStrictEqual(payload, sourceMap.payload);
Expand Down

0 comments on commit 7e908d3

Please sign in to comment.