|
176 | 176 | for (let i = 0; i < vlqTable.length; i++) vlqTable[i] = 0xFF; |
177 | 177 | for (let i = 0; i < vlqChars.length; i++) vlqTable[vlqChars.charCodeAt(i)] = i; |
178 | 178 |
|
179 | | - function decodeMappings(mappings, sourcesCount) { |
| 179 | + function decodeMappings(mappings, sourcesCount, namesCount) { |
180 | 180 | const n = mappings.length; |
181 | 181 | let data = new Int32Array(1024); |
182 | 182 | let dataLength = 0; |
|
203 | 203 | // Scan over the input |
204 | 204 | while (true) { |
205 | 205 | // Read a byte |
206 | | - if (i >= mappings.length) decodeError('Expected extra data'); |
| 206 | + if (i >= mappings.length) decodeError('Unexpected early end of mapping data'); |
207 | 207 | const c = mappings.charCodeAt(i); |
208 | | - if ((c & 0x7F) !== c) decodeError('Invalid character'); |
| 208 | + if ((c & 0x7F) !== c) decodeError(`Invalid mapping character: ${JSON.stringify(String.fromCharCode(c))}`); |
209 | 209 | const index = vlqTable[c & 0x7F]; |
210 | | - if (index === 0xFF) decodeError('Invalid character'); |
| 210 | + if (index === 0xFF) decodeError(`Invalid mapping character: ${JSON.stringify(String.fromCharCode(c))}`); |
211 | 211 | i++; |
212 | 212 |
|
213 | 213 | // Decode the byte |
|
273 | 273 | const generatedColumnDelta = decodeVLQ(); |
274 | 274 | if (generatedColumnDelta < 0) needToSortGeneratedColumns = true; |
275 | 275 | generatedColumn += generatedColumnDelta; |
276 | | - if (generatedColumn < 0) decodeError('Invalid generated column'); |
| 276 | + if (generatedColumn < 0) decodeError(`Invalid generated column: ${generatedColumn}`); |
277 | 277 |
|
278 | 278 | // It's valid for a mapping to have 1, 4, or 5 variable-length fields |
279 | 279 | let isOriginalSourceMissing = true; |
|
288 | 288 | // Read the original source |
289 | 289 | const originalSourceDelta = decodeVLQ(); |
290 | 290 | originalSource += originalSourceDelta; |
291 | | - if (originalSource < 0 || originalSource >= sourcesCount) decodeError('Invalid original source'); |
| 291 | + if (originalSource < 0 || originalSource >= sourcesCount) decodeError(`Original source index ${originalSource} is invalid (there are ${sourcesCount} sources)`); |
292 | 292 |
|
293 | 293 | // Read the original line |
294 | 294 | const originalLineDelta = decodeVLQ(); |
295 | 295 | originalLine += originalLineDelta; |
296 | | - if (originalLine < 0) decodeError('Invalid original line'); |
| 296 | + if (originalLine < 0) decodeError(`Invalid original line: ${originalLine}`); |
297 | 297 |
|
298 | 298 | // Read the original column |
299 | 299 | const originalColumnDelta = decodeVLQ(); |
300 | 300 | originalColumn += originalColumnDelta; |
301 | | - if (originalColumn < 0) decodeError('Invalid original column'); |
| 301 | + if (originalColumn < 0) decodeError(`Invalid original column: ${originalColumn}`); |
302 | 302 |
|
303 | 303 | // Check for the optional name index |
304 | 304 | if (i < n) { |
|
311 | 311 | // Read the optional name index |
312 | 312 | const originalNameDelta = decodeVLQ(); |
313 | 313 | originalName += originalNameDelta; |
314 | | - if (originalName < 0) decodeError('Invalid original name'); |
| 314 | + if (originalName < 0 || originalName >= namesCount) decodeError(`Original name index ${originalName} is invalid (there are ${namesCount} names)`); |
315 | 315 |
|
316 | 316 | // Handle the next character |
317 | 317 | if (i < n) { |
318 | 318 | c = mappings.charCodeAt(i); |
319 | 319 | if (c === 44 /* , */) { |
320 | 320 | i++; |
321 | 321 | } else if (c !== 59 /* ; */) { |
322 | | - decodeError('Invalid character after mapping'); |
| 322 | + decodeError(`Invalid character after mapping: ${JSON.stringify(String.fromCharCode(c))}`); |
323 | 323 | } |
324 | 324 | } |
325 | 325 | } |
|
472 | 472 | }; |
473 | 473 | } |
474 | 474 |
|
475 | | - const data = decodeMappings(mappings, sources.length); |
| 475 | + const data = decodeMappings(mappings, sources.length, names.length); |
476 | 476 | generateInverseMappings(sources, data); |
477 | 477 | return { sources, names, data }; |
478 | 478 | } |
|
0 commit comments