You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					165 lines
				
				5.2 KiB
			
		
		
			
		
	
	
					165 lines
				
				5.2 KiB
			| 
											3 years ago
										 | const comma = ','.charCodeAt(0); | ||
|  | const semicolon = ';'.charCodeAt(0); | ||
|  | const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | ||
|  | const intToChar = new Uint8Array(64); // 64 possible chars.
 | ||
|  | const charToInt = new Uint8Array(128); // z is 122 in ASCII
 | ||
|  | for (let i = 0; i < chars.length; i++) { | ||
|  |     const c = chars.charCodeAt(i); | ||
|  |     intToChar[i] = c; | ||
|  |     charToInt[c] = i; | ||
|  | } | ||
|  | // Provide a fallback for older environments.
 | ||
|  | const td = typeof TextDecoder !== 'undefined' | ||
|  |     ? /* #__PURE__ */ new TextDecoder() | ||
|  |     : typeof Buffer !== 'undefined' | ||
|  |         ? { | ||
|  |             decode(buf) { | ||
|  |                 const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength); | ||
|  |                 return out.toString(); | ||
|  |             }, | ||
|  |         } | ||
|  |         : { | ||
|  |             decode(buf) { | ||
|  |                 let out = ''; | ||
|  |                 for (let i = 0; i < buf.length; i++) { | ||
|  |                     out += String.fromCharCode(buf[i]); | ||
|  |                 } | ||
|  |                 return out; | ||
|  |             }, | ||
|  |         }; | ||
|  | function decode(mappings) { | ||
|  |     const state = new Int32Array(5); | ||
|  |     const decoded = []; | ||
|  |     let index = 0; | ||
|  |     do { | ||
|  |         const semi = indexOf(mappings, index); | ||
|  |         const line = []; | ||
|  |         let sorted = true; | ||
|  |         let lastCol = 0; | ||
|  |         state[0] = 0; | ||
|  |         for (let i = index; i < semi; i++) { | ||
|  |             let seg; | ||
|  |             i = decodeInteger(mappings, i, state, 0); // genColumn
 | ||
|  |             const col = state[0]; | ||
|  |             if (col < lastCol) | ||
|  |                 sorted = false; | ||
|  |             lastCol = col; | ||
|  |             if (hasMoreVlq(mappings, i, semi)) { | ||
|  |                 i = decodeInteger(mappings, i, state, 1); // sourcesIndex
 | ||
|  |                 i = decodeInteger(mappings, i, state, 2); // sourceLine
 | ||
|  |                 i = decodeInteger(mappings, i, state, 3); // sourceColumn
 | ||
|  |                 if (hasMoreVlq(mappings, i, semi)) { | ||
|  |                     i = decodeInteger(mappings, i, state, 4); // namesIndex
 | ||
|  |                     seg = [col, state[1], state[2], state[3], state[4]]; | ||
|  |                 } | ||
|  |                 else { | ||
|  |                     seg = [col, state[1], state[2], state[3]]; | ||
|  |                 } | ||
|  |             } | ||
|  |             else { | ||
|  |                 seg = [col]; | ||
|  |             } | ||
|  |             line.push(seg); | ||
|  |         } | ||
|  |         if (!sorted) | ||
|  |             sort(line); | ||
|  |         decoded.push(line); | ||
|  |         index = semi + 1; | ||
|  |     } while (index <= mappings.length); | ||
|  |     return decoded; | ||
|  | } | ||
|  | function indexOf(mappings, index) { | ||
|  |     const idx = mappings.indexOf(';', index); | ||
|  |     return idx === -1 ? mappings.length : idx; | ||
|  | } | ||
|  | function decodeInteger(mappings, pos, state, j) { | ||
|  |     let value = 0; | ||
|  |     let shift = 0; | ||
|  |     let integer = 0; | ||
|  |     do { | ||
|  |         const c = mappings.charCodeAt(pos++); | ||
|  |         integer = charToInt[c]; | ||
|  |         value |= (integer & 31) << shift; | ||
|  |         shift += 5; | ||
|  |     } while (integer & 32); | ||
|  |     const shouldNegate = value & 1; | ||
|  |     value >>>= 1; | ||
|  |     if (shouldNegate) { | ||
|  |         value = -0x80000000 | -value; | ||
|  |     } | ||
|  |     state[j] += value; | ||
|  |     return pos; | ||
|  | } | ||
|  | function hasMoreVlq(mappings, i, length) { | ||
|  |     if (i >= length) | ||
|  |         return false; | ||
|  |     return mappings.charCodeAt(i) !== comma; | ||
|  | } | ||
|  | function sort(line) { | ||
|  |     line.sort(sortComparator); | ||
|  | } | ||
|  | function sortComparator(a, b) { | ||
|  |     return a[0] - b[0]; | ||
|  | } | ||
|  | function encode(decoded) { | ||
|  |     const state = new Int32Array(5); | ||
|  |     const bufLength = 1024 * 16; | ||
|  |     const subLength = bufLength - 36; | ||
|  |     const buf = new Uint8Array(bufLength); | ||
|  |     const sub = buf.subarray(0, subLength); | ||
|  |     let pos = 0; | ||
|  |     let out = ''; | ||
|  |     for (let i = 0; i < decoded.length; i++) { | ||
|  |         const line = decoded[i]; | ||
|  |         if (i > 0) { | ||
|  |             if (pos === bufLength) { | ||
|  |                 out += td.decode(buf); | ||
|  |                 pos = 0; | ||
|  |             } | ||
|  |             buf[pos++] = semicolon; | ||
|  |         } | ||
|  |         if (line.length === 0) | ||
|  |             continue; | ||
|  |         state[0] = 0; | ||
|  |         for (let j = 0; j < line.length; j++) { | ||
|  |             const segment = line[j]; | ||
|  |             // We can push up to 5 ints, each int can take at most 7 chars, and we
 | ||
|  |             // may push a comma.
 | ||
|  |             if (pos > subLength) { | ||
|  |                 out += td.decode(sub); | ||
|  |                 buf.copyWithin(0, subLength, pos); | ||
|  |                 pos -= subLength; | ||
|  |             } | ||
|  |             if (j > 0) | ||
|  |                 buf[pos++] = comma; | ||
|  |             pos = encodeInteger(buf, pos, state, segment, 0); // genColumn
 | ||
|  |             if (segment.length === 1) | ||
|  |                 continue; | ||
|  |             pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex
 | ||
|  |             pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine
 | ||
|  |             pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn
 | ||
|  |             if (segment.length === 4) | ||
|  |                 continue; | ||
|  |             pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex
 | ||
|  |         } | ||
|  |     } | ||
|  |     return out + td.decode(buf.subarray(0, pos)); | ||
|  | } | ||
|  | function encodeInteger(buf, pos, state, segment, j) { | ||
|  |     const next = segment[j]; | ||
|  |     let num = next - state[j]; | ||
|  |     state[j] = next; | ||
|  |     num = num < 0 ? (-num << 1) | 1 : num << 1; | ||
|  |     do { | ||
|  |         let clamped = num & 0b011111; | ||
|  |         num >>>= 5; | ||
|  |         if (num > 0) | ||
|  |             clamped |= 0b100000; | ||
|  |         buf[pos++] = intToChar[clamped]; | ||
|  |     } while (num > 0); | ||
|  |     return pos; | ||
|  | } | ||
|  | 
 | ||
|  | export { decode, encode }; | ||
|  | //# sourceMappingURL=sourcemap-codec.mjs.map
 |