Skip to content

Commit 58af3c1

Browse files
authored
feat: migrate from source-map to @jridgewell/trace-mapping (#12692)
1 parent 5183c15 commit 58af3c1

File tree

8 files changed

+48
-41
lines changed

8 files changed

+48
-41
lines changed

packages/jest-reporters/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"@jest/test-result": "^28.0.0-alpha.9",
1818
"@jest/transform": "^28.0.0-alpha.9",
1919
"@jest/types": "^28.0.0-alpha.9",
20+
"@jridgewell/trace-mapping": "^0.3.4",
2021
"@types/node": "*",
2122
"chalk": "^4.0.0",
2223
"collect-v8-coverage": "^1.0.0",
@@ -31,7 +32,6 @@
3132
"jest-util": "^28.0.0-alpha.9",
3233
"jest-worker": "^28.0.0-alpha.9",
3334
"slash": "^3.0.0",
34-
"source-map": "^0.6.1",
3535
"string-length": "^4.0.1",
3636
"terminal-link": "^2.0.0",
3737
"v8-to-istanbul": "^8.1.0"

packages/jest-reporters/src/CoverageReporter.ts

+4-9
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77

88
import * as path from 'path';
99
import {mergeProcessCovs} from '@bcoe/v8-coverage';
10+
import type {EncodedSourceMap} from '@jridgewell/trace-mapping';
1011
import chalk = require('chalk');
1112
import glob = require('glob');
1213
import * as fs from 'graceful-fs';
1314
import istanbulCoverage = require('istanbul-lib-coverage');
1415
import istanbulReport = require('istanbul-lib-report');
1516
import libSourceMaps = require('istanbul-lib-source-maps');
1617
import istanbulReports = require('istanbul-reports');
17-
import type {RawSourceMap} from 'source-map';
1818
import v8toIstanbul = require('v8-to-istanbul');
1919
import type {
2020
AggregatedResult,
@@ -31,12 +31,6 @@ import BaseReporter from './BaseReporter';
3131
import getWatermarks from './getWatermarks';
3232
import type {CoverageWorker, ReporterContext} from './types';
3333

34-
// This is fixed in a newer versions of source-map, but our dependencies are still stuck on old versions
35-
interface FixedRawSourceMap extends Omit<RawSourceMap, 'version'> {
36-
version: number;
37-
file?: string;
38-
}
39-
4034
const FAIL_COLOR = chalk.bold.red;
4135
const RUNNING_TEST_COLOR = chalk.bold.dim;
4236

@@ -437,7 +431,7 @@ export default class CoverageReporter extends BaseReporter {
437431
mergedCoverages.result.map(async res => {
438432
const fileTransform = fileTransforms.get(res.url);
439433

440-
let sourcemapContent: FixedRawSourceMap | undefined = undefined;
434+
let sourcemapContent: EncodedSourceMap | undefined = undefined;
441435

442436
if (
443437
fileTransform?.sourceMapPath &&
@@ -456,7 +450,8 @@ export default class CoverageReporter extends BaseReporter {
456450
originalSource: fileTransform.originalCode,
457451
source: fileTransform.code,
458452
sourceMap: {
459-
sourcemap: {file: res.url, ...sourcemapContent},
453+
// remove `as any` after https://github.com/istanbuljs/v8-to-istanbul/pull/186 is released
454+
sourcemap: {file: res.url, ...sourcemapContent} as any,
460455
},
461456
}
462457
: {source: fs.readFileSync(res.url, 'utf8')},

packages/jest-source-map/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
"./package.json": "./package.json"
1818
},
1919
"dependencies": {
20+
"@jridgewell/trace-mapping": "^0.3.4",
2021
"callsites": "^3.0.0",
21-
"graceful-fs": "^4.2.9",
22-
"source-map": "^0.6.1"
22+
"graceful-fs": "^4.2.9"
2323
},
2424
"devDependencies": {
2525
"@types/graceful-fs": "^4.1.3"

packages/jest-source-map/src/__tests__/getCallsite.test.ts

+28-15
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,19 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8+
import {originalPositionFor} from '@jridgewell/trace-mapping';
89
import * as fs from 'graceful-fs';
9-
import SourceMap from 'source-map';
1010
import getCallsite from '../getCallsite';
1111

1212
jest.mock('graceful-fs');
13+
jest.mock('@jridgewell/trace-mapping', () => {
14+
const actual = jest.requireActual('@jridgewell/trace-mapping');
15+
16+
return {
17+
...actual,
18+
originalPositionFor: jest.fn(actual.originalPositionFor),
19+
};
20+
});
1321

1422
describe('getCallsite', () => {
1523
test('without source map', () => {
@@ -35,30 +43,35 @@ describe('getCallsite', () => {
3543
});
3644

3745
test('reads source map file to determine line and column', () => {
38-
(fs.readFileSync as jest.Mock).mockImplementation(() => 'file data');
46+
(fs.readFileSync as jest.Mock).mockImplementation(() =>
47+
JSON.stringify({
48+
file: 'file.js',
49+
mappings: 'AAAA,OAAO,MAAM,KAAK,GAAG,QAAd',
50+
names: [],
51+
sources: ['file.js'],
52+
sourcesContent: ["export const hello = 'foobar';\\n"],
53+
version: 3,
54+
}),
55+
);
3956

4057
const sourceMapColumn = 1;
4158
const sourceMapLine = 2;
4259

43-
SourceMap.SourceMapConsumer = class {
44-
originalPositionFor(params: Record<string, number>) {
45-
expect(params).toMatchObject({
46-
column: expect.any(Number),
47-
line: expect.any(Number),
48-
});
49-
50-
return {
51-
column: sourceMapColumn,
52-
line: sourceMapLine,
53-
};
54-
}
55-
};
60+
jest.mocked(originalPositionFor).mockImplementation(() => ({
61+
column: sourceMapColumn,
62+
line: sourceMapLine,
63+
}));
5664

5765
const site = getCallsite(0, new Map([[__filename, 'mockedSourceMapFile']]));
5866

5967
expect(site.getFileName()).toEqual(__filename);
6068
expect(site.getColumnNumber()).toEqual(sourceMapColumn);
6169
expect(site.getLineNumber()).toEqual(sourceMapLine);
70+
expect(originalPositionFor).toHaveBeenCalledTimes(1);
71+
expect(originalPositionFor).toHaveBeenCalledWith(expect.anything(), {
72+
column: expect.any(Number),
73+
line: expect.any(Number),
74+
});
6275
expect(fs.readFileSync).toHaveBeenCalledWith('mockedSourceMapFile', 'utf8');
6376
});
6477
});

packages/jest-source-map/src/getCallsite.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8+
import {TraceMap, originalPositionFor} from '@jridgewell/trace-mapping';
89
import callsites = require('callsites');
910
import {readFileSync} from 'graceful-fs';
10-
import {SourceMapConsumer} from 'source-map';
1111
import type {SourceMapRegistry} from './types';
1212

1313
// Copied from https://github.com/rexxars/sourcemap-decorate-callsites/blob/5b9735a156964973a75dc62fd2c7f0c1975458e8/lib/index.js#L113-L158
1414
const addSourceMapConsumer = (
1515
callsite: callsites.CallSite,
16-
consumer: SourceMapConsumer,
16+
tracer: TraceMap,
1717
) => {
1818
const getLineNumber = callsite.getLineNumber;
1919
const getColumnNumber = callsite.getColumnNumber;
20-
let position: ReturnType<typeof consumer.originalPositionFor> | null = null;
20+
let position: ReturnType<typeof originalPositionFor> | null = null;
2121

2222
function getPosition() {
2323
if (!position) {
24-
position = consumer.originalPositionFor({
24+
position = originalPositionFor(tracer, {
2525
column: getColumnNumber.call(callsite) || -1,
2626
line: getLineNumber.call(callsite) || -1,
2727
});
@@ -57,8 +57,7 @@ export default function getCallsite(
5757
if (sourceMapFileName) {
5858
try {
5959
const sourceMap = readFileSync(sourceMapFileName, 'utf8');
60-
// @ts-expect-error: Not allowed to pass string
61-
addSourceMapConsumer(stack, new SourceMapConsumer(sourceMap));
60+
addSourceMapConsumer(stack, new TraceMap(sourceMap));
6261
} catch {
6362
// ignore
6463
}

packages/jest-transform/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"dependencies": {
2020
"@babel/core": "^7.11.6",
2121
"@jest/types": "^28.0.0-alpha.9",
22+
"@jridgewell/trace-mapping": "^0.3.4",
2223
"babel-plugin-istanbul": "^6.1.1",
2324
"chalk": "^4.0.0",
2425
"convert-source-map": "^1.4.0",
@@ -30,7 +31,6 @@
3031
"micromatch": "^4.0.4",
3132
"pirates": "^4.0.4",
3233
"slash": "^3.0.0",
33-
"source-map": "^0.6.1",
3434
"write-file-atomic": "^4.0.1"
3535
},
3636
"devDependencies": {

packages/jest-transform/src/types.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8-
import type {RawSourceMap} from 'source-map';
8+
import type {EncodedSourceMap} from '@jridgewell/trace-mapping';
99
import type {Config, TransformTypes} from '@jest/types';
1010

1111
export interface ShouldInstrumentOptions
@@ -26,8 +26,8 @@ export interface Options
2626
isInternalModule?: boolean;
2727
}
2828

29-
// This is fixed in [email protected], but we can't upgrade yet since it's async
30-
interface FixedRawSourceMap extends Omit<RawSourceMap, 'version'> {
29+
// `babel` and `@jridgewell/trace-mapping` disagrees - `number` vs `3`
30+
interface FixedRawSourceMap extends Omit<EncodedSourceMap, 'version'> {
3131
version: number;
3232
}
3333

yarn.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -2758,6 +2758,7 @@ __metadata:
27582758
"@jest/test-utils": ^28.0.0-alpha.9
27592759
"@jest/transform": ^28.0.0-alpha.9
27602760
"@jest/types": ^28.0.0-alpha.9
2761+
"@jridgewell/trace-mapping": ^0.3.4
27612762
"@types/exit": ^0.1.30
27622763
"@types/glob": ^7.1.1
27632764
"@types/graceful-fs": ^4.1.3
@@ -2783,7 +2784,6 @@ __metadata:
27832784
jest-worker: ^28.0.0-alpha.9
27842785
mock-fs: ^5.1.2
27852786
slash: ^3.0.0
2786-
source-map: ^0.6.1
27872787
string-length: ^4.0.1
27882788
strip-ansi: ^6.0.0
27892789
terminal-link: ^2.0.0
@@ -2808,10 +2808,10 @@ __metadata:
28082808
version: 0.0.0-use.local
28092809
resolution: "@jest/source-map@workspace:packages/jest-source-map"
28102810
dependencies:
2811+
"@jridgewell/trace-mapping": ^0.3.4
28112812
"@types/graceful-fs": ^4.1.3
28122813
callsites: ^3.0.0
28132814
graceful-fs: ^4.2.9
2814-
source-map: ^0.6.1
28152815
languageName: unknown
28162816
linkType: soft
28172817

@@ -2872,6 +2872,7 @@ __metadata:
28722872
"@babel/core": ^7.11.6
28732873
"@jest/test-utils": ^28.0.0-alpha.9
28742874
"@jest/types": ^28.0.0-alpha.9
2875+
"@jridgewell/trace-mapping": ^0.3.4
28752876
"@types/babel__core": ^7.1.14
28762877
"@types/convert-source-map": ^1.5.1
28772878
"@types/fast-json-stable-stringify": ^2.0.0
@@ -2890,7 +2891,6 @@ __metadata:
28902891
micromatch: ^4.0.4
28912892
pirates: ^4.0.4
28922893
slash: ^3.0.0
2893-
source-map: ^0.6.1
28942894
write-file-atomic: ^4.0.1
28952895
languageName: unknown
28962896
linkType: soft
@@ -2950,7 +2950,7 @@ __metadata:
29502950
languageName: node
29512951
linkType: hard
29522952

2953-
"@jridgewell/trace-mapping@npm:^0.3.0":
2953+
"@jridgewell/trace-mapping@npm:^0.3.0, @jridgewell/trace-mapping@npm:^0.3.4":
29542954
version: 0.3.4
29552955
resolution: "@jridgewell/trace-mapping@npm:0.3.4"
29562956
dependencies:

0 commit comments

Comments
 (0)