index.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. "use strict";
  2. var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
  3. if (k2 === undefined) k2 = k;
  4. var desc = Object.getOwnPropertyDescriptor(m, k);
  5. if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
  6. desc = { enumerable: true, get: function() { return m[k]; } };
  7. }
  8. Object.defineProperty(o, k2, desc);
  9. }) : (function(o, m, k, k2) {
  10. if (k2 === undefined) k2 = k;
  11. o[k2] = m[k];
  12. }));
  13. var __exportStar = (this && this.__exportStar) || function(m, exports) {
  14. for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
  15. };
  16. Object.defineProperty(exports, "__esModule", { value: true });
  17. exports.buildStacks = exports.buildMappings = exports.SourceMap = void 0;
  18. __exportStar(require("muggle-string"), exports);
  19. class SourceMap {
  20. get memo() {
  21. if (!this._memo) {
  22. const self = this;
  23. this._memo = {
  24. sourceRange: createMemo('sourceRange'),
  25. generatedRange: createMemo('generatedRange'),
  26. };
  27. function createMemo(key) {
  28. const offsets = new Set();
  29. for (const mapping of self.mappings) {
  30. offsets.add(mapping[key][0]);
  31. offsets.add(mapping[key][1]);
  32. }
  33. const arr = [...offsets].sort((a, b) => a - b).map(offset => ({ offset, mappings: new Set() }));
  34. for (const mapping of self.mappings) {
  35. const startIndex = binarySearch(mapping[key][0]);
  36. const endIndex = binarySearch(mapping[key][1]);
  37. for (let i = startIndex; i <= endIndex; i++) {
  38. arr[i].mappings.add(mapping);
  39. }
  40. }
  41. return arr;
  42. function binarySearch(start) {
  43. let low = 0;
  44. let high = arr.length - 1;
  45. while (low <= high) {
  46. const mid = Math.floor((low + high) / 2);
  47. const midValue = arr[mid];
  48. if (midValue.offset < start) {
  49. low = mid + 1;
  50. }
  51. else if (midValue.offset > start) {
  52. high = mid - 1;
  53. }
  54. else {
  55. return mid;
  56. }
  57. }
  58. }
  59. }
  60. }
  61. return this._memo;
  62. }
  63. constructor(mappings) {
  64. this.mappings = mappings;
  65. }
  66. toSourceOffset(start, baseOnRight = false) {
  67. for (const mapped of this.matching(start, 'generatedRange', 'sourceRange', baseOnRight)) {
  68. return mapped;
  69. }
  70. }
  71. toGeneratedOffset(start, baseOnRight = false) {
  72. for (const mapped of this.matching(start, 'sourceRange', 'generatedRange', baseOnRight)) {
  73. return mapped;
  74. }
  75. }
  76. toSourceOffsets(start, baseOnRight = false) {
  77. return this.matching(start, 'generatedRange', 'sourceRange', baseOnRight);
  78. }
  79. toGeneratedOffsets(start, baseOnRight = false) {
  80. return this.matching(start, 'sourceRange', 'generatedRange', baseOnRight);
  81. }
  82. *matching(startOffset, from, to, baseOnRight) {
  83. const memo = this.memo[from];
  84. if (memo.length === 0)
  85. return;
  86. const { low: start, high: end, } = this.binarySearchMemo(memo, startOffset);
  87. const skip = new Set();
  88. for (let i = start; i <= end; i++) {
  89. for (const mapping of memo[i].mappings) {
  90. if (skip.has(mapping)) {
  91. continue;
  92. }
  93. skip.add(mapping);
  94. const mapped = this.matchOffset(startOffset, mapping[from], mapping[to], baseOnRight);
  95. if (mapped !== undefined) {
  96. yield [mapped, mapping];
  97. }
  98. }
  99. }
  100. }
  101. matchOffset(start, mappedFromRange, mappedToRange, baseOnRight) {
  102. if (start >= mappedFromRange[0] && start <= mappedFromRange[1]) {
  103. let offset = mappedToRange[0] + start - mappedFromRange[0];
  104. if (baseOnRight) {
  105. offset += (mappedToRange[1] - mappedToRange[0]) - (mappedFromRange[1] - mappedFromRange[0]);
  106. }
  107. if (offset >= mappedToRange[0] && offset <= mappedToRange[1]) {
  108. return offset;
  109. }
  110. }
  111. }
  112. binarySearchMemo(array, start) {
  113. let low = 0;
  114. let high = array.length - 1;
  115. while (low <= high) {
  116. const mid = Math.floor((low + high) / 2);
  117. const midValue = array[mid];
  118. if (midValue.offset < start) {
  119. low = mid + 1;
  120. }
  121. else if (midValue.offset > start) {
  122. high = mid - 1;
  123. }
  124. else {
  125. low = mid;
  126. high = mid;
  127. break;
  128. }
  129. }
  130. return {
  131. low: Math.max(Math.min(low, high, array.length - 1), 0),
  132. high: Math.min(Math.max(low, high, 0), array.length - 1),
  133. };
  134. }
  135. }
  136. exports.SourceMap = SourceMap;
  137. function buildMappings(chunks) {
  138. let length = 0;
  139. const mappings = [];
  140. for (const segment of chunks) {
  141. if (typeof segment === 'string') {
  142. length += segment.length;
  143. }
  144. else {
  145. mappings.push({
  146. generatedRange: [length, length + segment[0].length],
  147. source: segment[1],
  148. sourceRange: typeof segment[2] === 'number' ? [segment[2], segment[2] + segment[0].length] : segment[2],
  149. // @ts-ignore
  150. data: segment[3],
  151. });
  152. length += segment[0].length;
  153. }
  154. }
  155. return mappings;
  156. }
  157. exports.buildMappings = buildMappings;
  158. function buildStacks(chunks, stacks) {
  159. let offset = 0;
  160. let index = 0;
  161. const result = [];
  162. for (const stack of stacks) {
  163. const start = offset;
  164. for (let i = 0; i < stack.length; i++) {
  165. const segment = chunks[index + i];
  166. if (typeof segment === 'string') {
  167. offset += segment.length;
  168. }
  169. else {
  170. offset += segment[0].length;
  171. }
  172. }
  173. index += stack.length;
  174. result.push({
  175. range: [start, offset],
  176. source: stack.stack,
  177. });
  178. }
  179. return result;
  180. }
  181. exports.buildStacks = buildStacks;
  182. //# sourceMappingURL=index.js.map