Validating Source Map Processing Implementation in Parcel Bundler
This test suite validates source map functionality in Parcel bundler, focusing on matching, loading, and parsing source map data from various formats. It ensures reliable source mapping for both inline and referenced source maps.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
parcel-bundler/parcel
packages/core/utils/test/sourcemap.test.js
import assert from 'assert';
import {
matchSourceMappingURL,
loadSourceMapUrl,
loadSourceMap,
} from '../src/sourcemap';
import {NodeFS} from '@parcel/fs';
import path from 'path';
const fs = new NodeFS();
describe('loadSourceMap', () => {
it('should not match sourceMappingURL when not at the end of the bundle', () => {
// Code example taken from livescript.js (issue #2408 in parcel-bundler)
// This snippet lead to JSAsset.js being mislead and incorrectly trying to
// load (due to false-positive match) sourcemap before fix was introduced
let code = fs.readFileSync(
path.join(__dirname, './input/sourcemap/no-sourcemap.js'),
'utf-8',
);
assert(!matchSourceMappingURL(code));
});
it('should match referenced-min sourceMappingURL when correctly inserted at end of the bundle', () => {
let code = fs.readFileSync(
path.join(__dirname, './input/sourcemap/referenced-min.js'),
'utf-8',
);
assert(!!matchSourceMappingURL(code));
});
it('should match inline sourceMappingURL when correctly inserted at end of the bundle', () => {
// inline source map taken from https://github.com/thlorenz/inline-source-map
let code = fs.readFileSync(
path.join(__dirname, './input/sourcemap/inline.js'),
'utf-8',
);
assert(!!matchSourceMappingURL(code));
});
it('Should be able to load sourcemap data from a url reference', async () => {
let filename = path.join(__dirname, './input/sourcemap/referenced-min.js');
let contents = fs.readFileSync(filename, 'utf-8');
let foundMap = await loadSourceMapUrl(fs, filename, contents);
assert.equal(foundMap.url, 'file://referenced-min.js.map');
assert.equal(
foundMap.filename,
path.join(__dirname, 'input/sourcemap/referenced-min.js.map'),
);
assert.deepEqual(foundMap.map, {
version: 3,
sources: ['./referenced.js'],
names: ['hello', 'l', 'o', 'console', 'log'],
mappings:
'AAAA,SAASA,QACP,IAAIC,EAAI,QACNC,EAAI,QACNC,QAAQC,IAAIH,EAAI,IAAMC,EAAI,KAE5BF',
});
});
it('Should be able to load sourcemap data from an inline url reference', async () => {
let filename = path.join(__dirname, './input/sourcemap/inline.js');
let contents = fs.readFileSync(filename, 'utf-8');
let foundMap = await loadSourceMapUrl(fs, filename, contents);
assert.equal(
foundMap.url,
'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyJmb28uanMiLCJiYXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O1VBQ0c7Ozs7Ozs7Ozs7Ozs7O3NCQ0RIO3NCQUNBIn0=',
);
assert.equal(foundMap.filename, filename);
assert.deepEqual(foundMap.map, {
version: 3,
file: '',
sources: ['foo.js', 'bar.js'],
names: [],
mappings: ';;;;;;;;;UACG;;;;;;;;;;;;;;sBCDH;sBACA',
});
});
it('Should be able to load a SourceMap instance from a file', async () => {
let filename = path.join(__dirname, './input/sourcemap/referenced-min.js');
let contents = fs.readFileSync(filename, 'utf-8');
let map = await loadSourceMap(filename, contents, {
fs,
projectRoot: __dirname,
});
assert(!!map);
let parsedMap = map.getMap();
assert.deepEqual(parsedMap.sources, ['input/sourcemap/referenced.js']);
assert.deepEqual(parsedMap.names, ['hello', 'l', 'o', 'console', 'log']);
assert.deepEqual(parsedMap.mappings, [
{
generated: {line: 1, column: 0},
original: {line: 1, column: 0},
source: 0,
},
{
generated: {line: 1, column: 9},
original: {line: 1, column: 9},
source: 0,
name: 0,
},
{
generated: {line: 1, column: 17},
original: {line: 2, column: 2},
source: 0,
},
{
generated: {line: 1, column: 21},
original: {line: 2, column: 6},
source: 0,
name: 1,
},
{
generated: {line: 1, column: 23},
original: {line: 2, column: 10},
source: 0,
},
{
generated: {line: 1, column: 31},
original: {line: 3, column: 4},
source: 0,
name: 2,
},
{
generated: {line: 1, column: 33},
original: {line: 3, column: 8},
source: 0,
},
{
generated: {line: 1, column: 41},
original: {line: 4, column: 2},
source: 0,
name: 3,
},
{
generated: {line: 1, column: 49},
original: {line: 4, column: 10},
source: 0,
name: 4,
},
{
generated: {line: 1, column: 53},
original: {line: 4, column: 14},
source: 0,
name: 1,
},
{
generated: {line: 1, column: 55},
original: {line: 4, column: 18},
source: 0,
},
{
generated: {line: 1, column: 59},
original: {line: 4, column: 24},
source: 0,
name: 2,
},
{
generated: {line: 1, column: 61},
original: {line: 4, column: 28},
source: 0,
},
{
generated: {line: 1, column: 66},
original: {line: 6, column: 0},
source: 0,
name: 0,
},
]);
});
it('Should remap sources when using sourceRoot', async () => {
let filename = path.join(__dirname, './input/sourcemap/referenced-min.js');
let contents = fs.readFileSync(filename, 'utf-8');
let map = await loadSourceMap(filename, contents, {
fs,
projectRoot: __dirname,
});
assert(!!map);
let parsedMap = map.getMap();
assert.deepEqual(parsedMap.sources, ['input/sourcemap/referenced.js']);
});
it('Should remap sources when using sourceRoot', async () => {
let filename = path.join(__dirname, './input/sourcemap/source-root.js');
let contents = fs.readFileSync(filename, 'utf-8');
let map = await loadSourceMap(filename, contents, {
fs,
projectRoot: __dirname,
});
assert(!!map);
let parsedMap = map.getMap();
assert.deepEqual(parsedMap.sources, ['input/source.js']);
});
});