summaryrefslogtreecommitdiff
path: root/node_modules/webpack-sources/lib/helpers/readMappings.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack-sources/lib/helpers/readMappings.js')
-rw-r--r--node_modules/webpack-sources/lib/helpers/readMappings.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/node_modules/webpack-sources/lib/helpers/readMappings.js b/node_modules/webpack-sources/lib/helpers/readMappings.js
new file mode 100644
index 00000000..31cb48d2
--- /dev/null
+++ b/node_modules/webpack-sources/lib/helpers/readMappings.js
@@ -0,0 +1,116 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ALPHABET =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+const CONTINUATION_BIT = 0x20;
+const END_SEGMENT_BIT = 0x40;
+const NEXT_LINE = END_SEGMENT_BIT | 0x01;
+const INVALID = END_SEGMENT_BIT | 0x02;
+const DATA_MASK = 0x1f;
+
+const ccToValue = new Uint8Array("z".charCodeAt(0) + 1);
+{
+ ccToValue.fill(INVALID);
+ for (let i = 0; i < ALPHABET.length; i++) {
+ ccToValue[ALPHABET.charCodeAt(i)] = i;
+ }
+ ccToValue[",".charCodeAt(0)] = END_SEGMENT_BIT;
+ ccToValue[";".charCodeAt(0)] = NEXT_LINE;
+}
+const ccMax = ccToValue.length - 1;
+
+/**
+ * @param {string} mappings the mappings string
+ * @param {function(number, number, number, number, number, number): void} onMapping called for each mapping
+ * @returns {void}
+ */
+const readMappings = (mappings, onMapping) => {
+ // generatedColumn, [sourceIndex, originalLine, orignalColumn, [nameIndex]]
+ const currentData = new Uint32Array([0, 0, 1, 0, 0]);
+ let currentDataPos = 0;
+ // currentValue will include a sign bit at bit 0
+ let currentValue = 0;
+ let currentValuePos = 0;
+ let generatedLine = 1;
+ let generatedColumn = -1;
+ for (let i = 0; i < mappings.length; i++) {
+ const cc = mappings.charCodeAt(i);
+ if (cc > ccMax) continue;
+ const value = ccToValue[cc];
+ if ((value & END_SEGMENT_BIT) !== 0) {
+ // End current segment
+ if (currentData[0] > generatedColumn) {
+ if (currentDataPos === 1) {
+ onMapping(generatedLine, currentData[0], -1, -1, -1, -1);
+ } else if (currentDataPos === 4) {
+ onMapping(
+ generatedLine,
+ currentData[0],
+ currentData[1],
+ currentData[2],
+ currentData[3],
+ -1
+ );
+ } else if (currentDataPos === 5) {
+ onMapping(
+ generatedLine,
+ currentData[0],
+ currentData[1],
+ currentData[2],
+ currentData[3],
+ currentData[4]
+ );
+ }
+ generatedColumn = currentData[0];
+ }
+ currentDataPos = 0;
+ if (value === NEXT_LINE) {
+ // Start new line
+ generatedLine++;
+ currentData[0] = 0;
+ generatedColumn = -1;
+ }
+ } else if ((value & CONTINUATION_BIT) === 0) {
+ // last sextet
+ currentValue |= value << currentValuePos;
+ const finalValue =
+ currentValue & 1 ? -(currentValue >> 1) : currentValue >> 1;
+ currentData[currentDataPos++] += finalValue;
+ currentValuePos = 0;
+ currentValue = 0;
+ } else {
+ currentValue |= (value & DATA_MASK) << currentValuePos;
+ currentValuePos += 5;
+ }
+ }
+ // End current segment
+ if (currentDataPos === 1) {
+ onMapping(generatedLine, currentData[0], -1, -1, -1, -1);
+ } else if (currentDataPos === 4) {
+ onMapping(
+ generatedLine,
+ currentData[0],
+ currentData[1],
+ currentData[2],
+ currentData[3],
+ -1
+ );
+ } else if (currentDataPos === 5) {
+ onMapping(
+ generatedLine,
+ currentData[0],
+ currentData[1],
+ currentData[2],
+ currentData[3],
+ currentData[4]
+ );
+ }
+};
+
+module.exports = readMappings;