68 lines
1.8 KiB
JavaScript
68 lines
1.8 KiB
JavaScript
/**
|
|
* Copyright (c) 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
'use strict';
|
|
|
|
const newline = /\r\n?|\n|\u2028|\u2029/g;
|
|
const countLines =
|
|
string => (string.match(newline) || []).length + 1; // fastest implementation
|
|
|
|
function lineToLineSourceMap(source, filename) {
|
|
// The first line mapping in our package is the base64vlq code for zeros (A).
|
|
const firstLine = 'AAAA;';
|
|
|
|
// Most other lines in our mappings are all zeros (for module, column etc)
|
|
// except for the lineno mapping: curLineno - prevLineno = 1; Which is C.
|
|
const line = 'AACA;';
|
|
|
|
return {
|
|
version: 3,
|
|
sources: [filename],
|
|
mappings: firstLine + Array(countLines(source)).join(line),
|
|
};
|
|
}
|
|
|
|
const wrapperEnd = wrappedCode => wrappedCode.indexOf('{') + 1;
|
|
|
|
const Section = (line, column, map) => ({map, offset: {line, column}});
|
|
|
|
function combineSourceMaps({modules, withCustomOffsets}) {
|
|
let offsets;
|
|
const sections = [];
|
|
const sourceMap = {
|
|
version: 3,
|
|
sections,
|
|
};
|
|
|
|
if (withCustomOffsets) {
|
|
offsets = sourceMap.x_facebook_offsets = [];
|
|
}
|
|
|
|
let line = 0;
|
|
modules.forEach(({code, id, map, name}) => {
|
|
const hasOffset = withCustomOffsets && id != null;
|
|
const column = hasOffset ? wrapperEnd(code) : 0;
|
|
sections.push(Section(line, column, map || lineToLineSourceMap(code, name)));
|
|
if (hasOffset) {
|
|
offsets[id] = line;
|
|
}
|
|
line += countLines(code);
|
|
});
|
|
|
|
return sourceMap;
|
|
}
|
|
|
|
const joinModules = modules => modules.map(m => m.code).join('\n');
|
|
|
|
module.exports = {
|
|
countLines,
|
|
lineToLineSourceMap,
|
|
combineSourceMaps,
|
|
joinModules,
|
|
};
|