source: frontend/node_modules/webpack-sources/lib/helpers/createMappingsSerializer.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 5.5 KB
Line 
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5
6"use strict";
7
8/**
9 * @callback MappingsSerializer
10 * @param {number} generatedLine generated line
11 * @param {number} generatedColumn generated column
12 * @param {number} sourceIndex source index
13 * @param {number} originalLine original line
14 * @param {number} originalColumn generated line
15 * @param {number} nameIndex generated line
16 * @returns {string} result
17 */
18
19const ALPHABET = [
20 ..."ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
21];
22
23const CONTINUATION_BIT = 0x20;
24
25/**
26 * Append a VLQ-encoded signed integer to `str`. Hoisted to module scope so
27 * that both serializers share a single function object and avoid allocating
28 * a new closure on every call.
29 * @param {string} str current string buffer
30 * @param {number} value signed integer to encode
31 * @returns {string} updated string buffer
32 */
33const writeValue = (str, value) => {
34 const sign = (value >>> 31) & 1;
35 const mask = value >> 31;
36 const absValue = (value + mask) ^ mask;
37 let data = (absValue << 1) | sign;
38 for (;;) {
39 const sextet = data & 0x1f;
40 data >>= 5;
41 if (data === 0) {
42 return str + ALPHABET[sextet];
43 }
44 str += ALPHABET[sextet | CONTINUATION_BIT];
45 }
46};
47
48const createFullMappingsSerializer = () => {
49 let currentLine = 1;
50 let currentColumn = 0;
51 let currentSourceIndex = 0;
52 let currentOriginalLine = 1;
53 let currentOriginalColumn = 0;
54 let currentNameIndex = 0;
55 let activeMapping = false;
56 let activeName = false;
57 let initial = true;
58 /** @type {MappingsSerializer} */
59 return (
60 generatedLine,
61 generatedColumn,
62 sourceIndex,
63 originalLine,
64 originalColumn,
65 nameIndex,
66 ) => {
67 if (activeMapping && currentLine === generatedLine) {
68 // A mapping is still active
69 if (
70 sourceIndex === currentSourceIndex &&
71 originalLine === currentOriginalLine &&
72 originalColumn === currentOriginalColumn &&
73 !activeName &&
74 nameIndex < 0
75 ) {
76 // avoid repeating the same original mapping
77 return "";
78 }
79 }
80 // No mapping is active
81 else if (sourceIndex < 0) {
82 // avoid writing unneccessary generated mappings
83 return "";
84 }
85
86 let str;
87 if (currentLine < generatedLine) {
88 // Consecutive lines (diff === 1) are the dominant case; avoid the
89 // `.repeat()` call entirely for them.
90 str =
91 generatedLine === currentLine + 1
92 ? ";"
93 : ";".repeat(generatedLine - currentLine);
94 currentLine = generatedLine;
95 currentColumn = 0;
96 initial = false;
97 } else if (initial) {
98 str = "";
99 initial = false;
100 } else {
101 str = ",";
102 }
103
104 str = writeValue(str, generatedColumn - currentColumn);
105 currentColumn = generatedColumn;
106 if (sourceIndex >= 0) {
107 activeMapping = true;
108 if (sourceIndex === currentSourceIndex) {
109 str += "A";
110 } else {
111 str = writeValue(str, sourceIndex - currentSourceIndex);
112 currentSourceIndex = sourceIndex;
113 }
114 str = writeValue(str, originalLine - currentOriginalLine);
115 currentOriginalLine = originalLine;
116 if (originalColumn === currentOriginalColumn) {
117 str += "A";
118 } else {
119 str = writeValue(str, originalColumn - currentOriginalColumn);
120 currentOriginalColumn = originalColumn;
121 }
122 if (nameIndex >= 0) {
123 str = writeValue(str, nameIndex - currentNameIndex);
124 currentNameIndex = nameIndex;
125 activeName = true;
126 } else {
127 activeName = false;
128 }
129 } else {
130 activeMapping = false;
131 }
132 return str;
133 };
134};
135
136const createLinesOnlyMappingsSerializer = () => {
137 let lastWrittenLine = 0;
138 let currentLine = 1;
139 let currentSourceIndex = 0;
140 let currentOriginalLine = 1;
141 /** @type {MappingsSerializer} */
142 return (
143 generatedLine,
144 _generatedColumn,
145 sourceIndex,
146 originalLine,
147 _originalColumn,
148 _nameIndex,
149 ) => {
150 if (sourceIndex < 0) {
151 // avoid writing generated mappings at all
152 return "";
153 }
154 if (lastWrittenLine === generatedLine) {
155 // avoid writing multiple original mappings per line
156 return "";
157 }
158 let str;
159 lastWrittenLine = generatedLine;
160 if (generatedLine === currentLine + 1) {
161 currentLine = generatedLine;
162 if (sourceIndex === currentSourceIndex) {
163 if (originalLine === currentOriginalLine + 1) {
164 currentOriginalLine = originalLine;
165 return ";AACA";
166 }
167 str = ";AA";
168 str = writeValue(str, originalLine - currentOriginalLine);
169 currentOriginalLine = originalLine;
170 return `${str}A`;
171 }
172 str = ";A";
173 str = writeValue(str, sourceIndex - currentSourceIndex);
174 currentSourceIndex = sourceIndex;
175 str = writeValue(str, originalLine - currentOriginalLine);
176 currentOriginalLine = originalLine;
177 return `${str}A`;
178 }
179 str = ";".repeat(generatedLine - currentLine);
180 currentLine = generatedLine;
181 if (sourceIndex === currentSourceIndex) {
182 if (originalLine === currentOriginalLine + 1) {
183 currentOriginalLine = originalLine;
184 return `${str}AACA`;
185 }
186 str += "AA";
187 str = writeValue(str, originalLine - currentOriginalLine);
188 currentOriginalLine = originalLine;
189 return `${str}A`;
190 }
191 str += "A";
192 str = writeValue(str, sourceIndex - currentSourceIndex);
193 currentSourceIndex = sourceIndex;
194 str = writeValue(str, originalLine - currentOriginalLine);
195 currentOriginalLine = originalLine;
196 return `${str}A`;
197 };
198};
199
200/**
201 * @param {{ columns?: boolean }=} options options
202 * @returns {MappingsSerializer} mappings serializer
203 */
204const createMappingsSerializer = (options) => {
205 const linesOnly = options && options.columns === false;
206 return linesOnly
207 ? createLinesOnlyMappingsSerializer()
208 : createFullMappingsSerializer();
209};
210
211module.exports = createMappingsSerializer;
Note: See TracBrowser for help on using the repository browser.