source: frontend/node_modules/webpack-sources/lib/helpers/streamChunksOfSourceMap.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: 11.7 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
8const getGeneratedSourceInfo = require("./getGeneratedSourceInfo");
9const getSource = require("./getSource");
10const readMappings = require("./readMappings");
11const splitIntoLines = require("./splitIntoLines");
12
13/** @typedef {import("../Source").RawSourceMap} RawSourceMap */
14/** @typedef {import("./getGeneratedSourceInfo").GeneratedSourceInfo} GeneratedSourceInfo */
15/** @typedef {import("./streamChunks").OnChunk} OnChunk */
16/** @typedef {import("./streamChunks").OnName} OnName */
17/** @typedef {import("./streamChunks").OnSource} OnSource */
18
19/**
20 * @param {string} source source
21 * @param {RawSourceMap} sourceMap source map
22 * @param {OnChunk} onChunk on chunk
23 * @param {OnSource} onSource on source
24 * @param {OnName} onName on name
25 * @returns {GeneratedSourceInfo} generated source info
26 */
27const streamChunksOfSourceMapFull = (
28 source,
29 sourceMap,
30 onChunk,
31 onSource,
32 onName,
33) => {
34 const lines = splitIntoLines(source);
35 const linesLength = lines.length;
36 if (linesLength === 0) {
37 return {
38 generatedLine: 1,
39 generatedColumn: 0,
40 };
41 }
42 const { sources, sourcesContent, names, mappings } = sourceMap;
43 for (let i = 0; i < sources.length; i++) {
44 onSource(
45 i,
46 getSource(sourceMap, i),
47 (sourcesContent && sourcesContent[i]) || undefined,
48 );
49 }
50 if (names) {
51 for (let i = 0; i < names.length; i++) {
52 onName(i, names[i]);
53 }
54 }
55
56 const lastLine = lines[linesLength - 1];
57 const lastNewLine = lastLine.endsWith("\n");
58 const finalLine = lastNewLine ? linesLength + 1 : linesLength;
59 const finalColumn = lastNewLine ? 0 : lastLine.length;
60
61 let currentGeneratedLine = 1;
62 let currentGeneratedColumn = 0;
63
64 let mappingActive = false;
65 let activeMappingSourceIndex = -1;
66 let activeMappingOriginalLine = -1;
67 let activeMappingOriginalColumn = -1;
68 let activeMappingNameIndex = -1;
69
70 /**
71 * @param {number} generatedLine generated line
72 * @param {number} generatedColumn generated column
73 * @param {number} sourceIndex source index
74 * @param {number} originalLine original line
75 * @param {number} originalColumn original column
76 * @param {number} nameIndex name index
77 * @returns {void}
78 */
79 const onMapping = (
80 generatedLine,
81 generatedColumn,
82 sourceIndex,
83 originalLine,
84 originalColumn,
85 nameIndex,
86 ) => {
87 if (mappingActive && currentGeneratedLine <= linesLength) {
88 let chunk;
89 const mappingLine = currentGeneratedLine;
90 const mappingColumn = currentGeneratedColumn;
91 const line = lines[currentGeneratedLine - 1];
92 if (generatedLine !== currentGeneratedLine) {
93 chunk = line.slice(currentGeneratedColumn);
94 currentGeneratedLine++;
95 currentGeneratedColumn = 0;
96 } else {
97 chunk = line.slice(currentGeneratedColumn, generatedColumn);
98 currentGeneratedColumn = generatedColumn;
99 }
100 if (chunk) {
101 onChunk(
102 chunk,
103 mappingLine,
104 mappingColumn,
105 activeMappingSourceIndex,
106 activeMappingOriginalLine,
107 activeMappingOriginalColumn,
108 activeMappingNameIndex,
109 );
110 }
111 mappingActive = false;
112 }
113 if (generatedLine > currentGeneratedLine && currentGeneratedColumn > 0) {
114 if (currentGeneratedLine <= linesLength) {
115 const chunk = lines[currentGeneratedLine - 1].slice(
116 currentGeneratedColumn,
117 );
118 onChunk(
119 chunk,
120 currentGeneratedLine,
121 currentGeneratedColumn,
122 -1,
123 -1,
124 -1,
125 -1,
126 );
127 }
128 currentGeneratedLine++;
129 currentGeneratedColumn = 0;
130 }
131 // Emit each fully-passed generated line. Once we move past the last
132 // available line we stop emitting, but still need to advance the
133 // counter to `generatedLine` so subsequent state matches the caller.
134 while (
135 generatedLine > currentGeneratedLine &&
136 currentGeneratedLine <= linesLength
137 ) {
138 onChunk(
139 lines[currentGeneratedLine - 1],
140 currentGeneratedLine,
141 0,
142 -1,
143 -1,
144 -1,
145 -1,
146 );
147 currentGeneratedLine++;
148 }
149 if (currentGeneratedLine < generatedLine) {
150 currentGeneratedLine = generatedLine;
151 }
152 if (generatedColumn > currentGeneratedColumn) {
153 if (currentGeneratedLine <= linesLength) {
154 const chunk = lines[currentGeneratedLine - 1].slice(
155 currentGeneratedColumn,
156 generatedColumn,
157 );
158 onChunk(
159 chunk,
160 currentGeneratedLine,
161 currentGeneratedColumn,
162 -1,
163 -1,
164 -1,
165 -1,
166 );
167 }
168 currentGeneratedColumn = generatedColumn;
169 }
170 if (
171 sourceIndex >= 0 &&
172 (generatedLine < finalLine ||
173 (generatedLine === finalLine && generatedColumn < finalColumn))
174 ) {
175 mappingActive = true;
176 activeMappingSourceIndex = sourceIndex;
177 activeMappingOriginalLine = originalLine;
178 activeMappingOriginalColumn = originalColumn;
179 activeMappingNameIndex = nameIndex;
180 }
181 };
182 readMappings(mappings, onMapping);
183 onMapping(finalLine, finalColumn, -1, -1, -1, -1);
184 return {
185 generatedLine: finalLine,
186 generatedColumn: finalColumn,
187 };
188};
189
190/**
191 * @param {string} source source
192 * @param {RawSourceMap} sourceMap source map
193 * @param {OnChunk} onChunk on chunk
194 * @param {OnSource} onSource on source
195 * @param {OnName} _onName on name
196 * @returns {GeneratedSourceInfo} generated source info
197 */
198const streamChunksOfSourceMapLinesFull = (
199 source,
200 sourceMap,
201 onChunk,
202 onSource,
203 _onName,
204) => {
205 const lines = splitIntoLines(source);
206 const linesLength = lines.length;
207 if (linesLength === 0) {
208 return {
209 generatedLine: 1,
210 generatedColumn: 0,
211 };
212 }
213 const { sources, sourcesContent, mappings } = sourceMap;
214 for (let i = 0; i < sources.length; i++) {
215 onSource(
216 i,
217 getSource(sourceMap, i),
218 (sourcesContent && sourcesContent[i]) || undefined,
219 );
220 }
221
222 let currentGeneratedLine = 1;
223
224 /**
225 * @param {number} generatedLine generated line
226 * @param {number} _generatedColumn generated column
227 * @param {number} sourceIndex source index
228 * @param {number} originalLine original line
229 * @param {number} originalColumn original column
230 * @param {number} _nameIndex name index
231 * @returns {void}
232 */
233 const onMapping = (
234 generatedLine,
235 _generatedColumn,
236 sourceIndex,
237 originalLine,
238 originalColumn,
239 _nameIndex,
240 ) => {
241 if (
242 sourceIndex < 0 ||
243 generatedLine < currentGeneratedLine ||
244 generatedLine > linesLength
245 ) {
246 return;
247 }
248 // `generatedLine <= linesLength` is guaranteed by the guard above, so
249 // every line we iterate over is in bounds — no per-iteration length
250 // check needed.
251 while (generatedLine > currentGeneratedLine) {
252 onChunk(
253 lines[currentGeneratedLine - 1],
254 currentGeneratedLine,
255 0,
256 -1,
257 -1,
258 -1,
259 -1,
260 );
261 currentGeneratedLine++;
262 }
263 onChunk(
264 lines[generatedLine - 1],
265 generatedLine,
266 0,
267 sourceIndex,
268 originalLine,
269 originalColumn,
270 -1,
271 );
272 currentGeneratedLine++;
273 };
274 readMappings(mappings, onMapping);
275 for (; currentGeneratedLine <= linesLength; currentGeneratedLine++) {
276 onChunk(
277 lines[currentGeneratedLine - 1],
278 currentGeneratedLine,
279 0,
280 -1,
281 -1,
282 -1,
283 -1,
284 );
285 }
286
287 const lastLine = lines[linesLength - 1];
288 const lastNewLine = lastLine.endsWith("\n");
289
290 const finalLine = lastNewLine ? linesLength + 1 : linesLength;
291 const finalColumn = lastNewLine ? 0 : lastLine.length;
292
293 return {
294 generatedLine: finalLine,
295 generatedColumn: finalColumn,
296 };
297};
298
299/**
300 * @param {string} source source
301 * @param {RawSourceMap} sourceMap source map
302 * @param {OnChunk} onChunk on chunk
303 * @param {OnSource} onSource on source
304 * @param {OnName} onName on name
305 * @returns {GeneratedSourceInfo} generated source info
306 */
307const streamChunksOfSourceMapFinal = (
308 source,
309 sourceMap,
310 onChunk,
311 onSource,
312 onName,
313) => {
314 const result = getGeneratedSourceInfo(source);
315 const { generatedLine: finalLine, generatedColumn: finalColumn } = result;
316
317 if (finalLine === 1 && finalColumn === 0) return result;
318 const { sources, sourcesContent, names, mappings } = sourceMap;
319 for (let i = 0; i < sources.length; i++) {
320 onSource(
321 i,
322 getSource(sourceMap, i),
323 (sourcesContent && sourcesContent[i]) || undefined,
324 );
325 }
326 if (names) {
327 for (let i = 0; i < names.length; i++) {
328 onName(i, names[i]);
329 }
330 }
331
332 let mappingActiveLine = 0;
333
334 /**
335 * @param {number} generatedLine generated line
336 * @param {number} generatedColumn generated column
337 * @param {number} sourceIndex source index
338 * @param {number} originalLine original line
339 * @param {number} originalColumn original column
340 * @param {number} nameIndex name index
341 * @returns {void}
342 */
343 const onMapping = (
344 generatedLine,
345 generatedColumn,
346 sourceIndex,
347 originalLine,
348 originalColumn,
349 nameIndex,
350 ) => {
351 if (
352 generatedLine >= /** @type {number} */ (finalLine) &&
353 (generatedColumn >= /** @type {number} */ (finalColumn) ||
354 generatedLine > /** @type {number} */ (finalLine))
355 ) {
356 return;
357 }
358 if (sourceIndex >= 0) {
359 onChunk(
360 undefined,
361 generatedLine,
362 generatedColumn,
363 sourceIndex,
364 originalLine,
365 originalColumn,
366 nameIndex,
367 );
368 mappingActiveLine = generatedLine;
369 } else if (mappingActiveLine === generatedLine) {
370 onChunk(undefined, generatedLine, generatedColumn, -1, -1, -1, -1);
371 mappingActiveLine = 0;
372 }
373 };
374 readMappings(mappings, onMapping);
375 return result;
376};
377
378/**
379 * @param {string} source source
380 * @param {RawSourceMap} sourceMap source map
381 * @param {OnChunk} onChunk on chunk
382 * @param {OnSource} onSource on source
383 * @param {OnName} _onName on name
384 * @returns {GeneratedSourceInfo} generated source info
385 */
386const streamChunksOfSourceMapLinesFinal = (
387 source,
388 sourceMap,
389 onChunk,
390 onSource,
391 _onName,
392) => {
393 const result = getGeneratedSourceInfo(source);
394 const { generatedLine, generatedColumn } = result;
395 if (generatedLine === 1 && generatedColumn === 0) {
396 return {
397 generatedLine: 1,
398 generatedColumn: 0,
399 };
400 }
401
402 const { sources, sourcesContent, mappings } = sourceMap;
403 for (let i = 0; i < sources.length; i++) {
404 onSource(
405 i,
406 getSource(sourceMap, i),
407 (sourcesContent && sourcesContent[i]) || undefined,
408 );
409 }
410
411 const finalLine =
412 generatedColumn === 0
413 ? /** @type {number} */ (generatedLine) - 1
414 : /** @type {number} */ (generatedLine);
415
416 let currentGeneratedLine = 1;
417
418 /**
419 * @param {number} generatedLine generated line
420 * @param {number} _generatedColumn generated column
421 * @param {number} sourceIndex source index
422 * @param {number} originalLine original line
423 * @param {number} originalColumn original column
424 * @param {number} _nameIndex name index
425 * @returns {void}
426 */
427 const onMapping = (
428 generatedLine,
429 _generatedColumn,
430 sourceIndex,
431 originalLine,
432 originalColumn,
433 _nameIndex,
434 ) => {
435 if (
436 sourceIndex >= 0 &&
437 currentGeneratedLine <= generatedLine &&
438 generatedLine <= finalLine
439 ) {
440 onChunk(
441 undefined,
442 generatedLine,
443 0,
444 sourceIndex,
445 originalLine,
446 originalColumn,
447 -1,
448 );
449 currentGeneratedLine = generatedLine + 1;
450 }
451 };
452 readMappings(mappings, onMapping);
453 return result;
454};
455
456/**
457 * @param {string} source source
458 * @param {RawSourceMap} sourceMap source map
459 * @param {OnChunk} onChunk on chunk
460 * @param {OnSource} onSource on source
461 * @param {OnName} onName on name
462 * @param {boolean} finalSource final source
463 * @param {boolean} columns columns
464 * @returns {GeneratedSourceInfo} generated source info
465 */
466module.exports = (
467 source,
468 sourceMap,
469 onChunk,
470 onSource,
471 onName,
472 finalSource,
473 columns,
474) => {
475 if (columns) {
476 return finalSource
477 ? streamChunksOfSourceMapFinal(
478 source,
479 sourceMap,
480 onChunk,
481 onSource,
482 onName,
483 )
484 : streamChunksOfSourceMapFull(
485 source,
486 sourceMap,
487 onChunk,
488 onSource,
489 onName,
490 );
491 }
492 return finalSource
493 ? streamChunksOfSourceMapLinesFinal(
494 source,
495 sourceMap,
496 onChunk,
497 onSource,
498 onName,
499 )
500 : streamChunksOfSourceMapLinesFull(
501 source,
502 sourceMap,
503 onChunk,
504 onSource,
505 onName,
506 );
507};
Note: See TracBrowser for help on using the repository browser.