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.
		
		
		
		
		
			
		
			
				
					295 lines
				
				7.4 KiB
			
		
		
			
		
	
	
					295 lines
				
				7.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.default = void 0;
							 | 
						||
| 
								 | 
							
								class Buffer {
							 | 
						||
| 
								 | 
							
								  constructor(map) {
							 | 
						||
| 
								 | 
							
								    this._map = null;
							 | 
						||
| 
								 | 
							
								    this._buf = "";
							 | 
						||
| 
								 | 
							
								    this._str = "";
							 | 
						||
| 
								 | 
							
								    this._appendCount = 0;
							 | 
						||
| 
								 | 
							
								    this._last = 0;
							 | 
						||
| 
								 | 
							
								    this._queue = [];
							 | 
						||
| 
								 | 
							
								    this._queueCursor = 0;
							 | 
						||
| 
								 | 
							
								    this._position = {
							 | 
						||
| 
								 | 
							
								      line: 1,
							 | 
						||
| 
								 | 
							
								      column: 0
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    this._sourcePosition = {
							 | 
						||
| 
								 | 
							
								      identifierName: undefined,
							 | 
						||
| 
								 | 
							
								      line: undefined,
							 | 
						||
| 
								 | 
							
								      column: undefined,
							 | 
						||
| 
								 | 
							
								      filename: undefined
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    this._map = map;
							 | 
						||
| 
								 | 
							
								    this._allocQueue();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  _allocQueue() {
							 | 
						||
| 
								 | 
							
								    const queue = this._queue;
							 | 
						||
| 
								 | 
							
								    for (let i = 0; i < 16; i++) {
							 | 
						||
| 
								 | 
							
								      queue.push({
							 | 
						||
| 
								 | 
							
								        char: 0,
							 | 
						||
| 
								 | 
							
								        repeat: 1,
							 | 
						||
| 
								 | 
							
								        line: undefined,
							 | 
						||
| 
								 | 
							
								        column: undefined,
							 | 
						||
| 
								 | 
							
								        identifierName: undefined,
							 | 
						||
| 
								 | 
							
								        filename: ""
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  _pushQueue(char, repeat, line, column, identifierName, filename) {
							 | 
						||
| 
								 | 
							
								    const cursor = this._queueCursor;
							 | 
						||
| 
								 | 
							
								    if (cursor === this._queue.length) {
							 | 
						||
| 
								 | 
							
								      this._allocQueue();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const item = this._queue[cursor];
							 | 
						||
| 
								 | 
							
								    item.char = char;
							 | 
						||
| 
								 | 
							
								    item.repeat = repeat;
							 | 
						||
| 
								 | 
							
								    item.line = line;
							 | 
						||
| 
								 | 
							
								    item.column = column;
							 | 
						||
| 
								 | 
							
								    item.identifierName = identifierName;
							 | 
						||
| 
								 | 
							
								    item.filename = filename;
							 | 
						||
| 
								 | 
							
								    this._queueCursor++;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  _popQueue() {
							 | 
						||
| 
								 | 
							
								    if (this._queueCursor === 0) {
							 | 
						||
| 
								 | 
							
								      throw new Error("Cannot pop from empty queue");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return this._queue[--this._queueCursor];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  get() {
							 | 
						||
| 
								 | 
							
								    this._flush();
							 | 
						||
| 
								 | 
							
								    const map = this._map;
							 | 
						||
| 
								 | 
							
								    const result = {
							 | 
						||
| 
								 | 
							
								      code: (this._buf + this._str).trimRight(),
							 | 
						||
| 
								 | 
							
								      decodedMap: map == null ? void 0 : map.getDecoded(),
							 | 
						||
| 
								 | 
							
								      get map() {
							 | 
						||
| 
								 | 
							
								        const resultMap = map ? map.get() : null;
							 | 
						||
| 
								 | 
							
								        result.map = resultMap;
							 | 
						||
| 
								 | 
							
								        return resultMap;
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      set map(value) {
							 | 
						||
| 
								 | 
							
								        Object.defineProperty(result, "map", {
							 | 
						||
| 
								 | 
							
								          value,
							 | 
						||
| 
								 | 
							
								          writable: true
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      get rawMappings() {
							 | 
						||
| 
								 | 
							
								        const mappings = map == null ? void 0 : map.getRawMappings();
							 | 
						||
| 
								 | 
							
								        result.rawMappings = mappings;
							 | 
						||
| 
								 | 
							
								        return mappings;
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      set rawMappings(value) {
							 | 
						||
| 
								 | 
							
								        Object.defineProperty(result, "rawMappings", {
							 | 
						||
| 
								 | 
							
								          value,
							 | 
						||
| 
								 | 
							
								          writable: true
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    return result;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  append(str, maybeNewline) {
							 | 
						||
| 
								 | 
							
								    this._flush();
							 | 
						||
| 
								 | 
							
								    this._append(str, this._sourcePosition, maybeNewline);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  appendChar(char) {
							 | 
						||
| 
								 | 
							
								    this._flush();
							 | 
						||
| 
								 | 
							
								    this._appendChar(char, 1, this._sourcePosition);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  queue(char) {
							 | 
						||
| 
								 | 
							
								    if (char === 10) {
							 | 
						||
| 
								 | 
							
								      while (this._queueCursor !== 0) {
							 | 
						||
| 
								 | 
							
								        const char = this._queue[this._queueCursor - 1].char;
							 | 
						||
| 
								 | 
							
								        if (char !== 32 && char !== 9) {
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        this._queueCursor--;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const sourcePosition = this._sourcePosition;
							 | 
						||
| 
								 | 
							
								    this._pushQueue(char, 1, sourcePosition.line, sourcePosition.column, sourcePosition.identifierName, sourcePosition.filename);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  queueIndentation(char, repeat) {
							 | 
						||
| 
								 | 
							
								    this._pushQueue(char, repeat, undefined, undefined, undefined, undefined);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  _flush() {
							 | 
						||
| 
								 | 
							
								    const queueCursor = this._queueCursor;
							 | 
						||
| 
								 | 
							
								    const queue = this._queue;
							 | 
						||
| 
								 | 
							
								    for (let i = 0; i < queueCursor; i++) {
							 | 
						||
| 
								 | 
							
								      const item = queue[i];
							 | 
						||
| 
								 | 
							
								      this._appendChar(item.char, item.repeat, item);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this._queueCursor = 0;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  _appendChar(char, repeat, sourcePos) {
							 | 
						||
| 
								 | 
							
								    this._last = char;
							 | 
						||
| 
								 | 
							
								    this._str += repeat > 1 ? String.fromCharCode(char).repeat(repeat) : String.fromCharCode(char);
							 | 
						||
| 
								 | 
							
								    if (char !== 10) {
							 | 
						||
| 
								 | 
							
								      this._mark(sourcePos.line, sourcePos.column, sourcePos.identifierName, sourcePos.filename);
							 | 
						||
| 
								 | 
							
								      this._position.column += repeat;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._position.line++;
							 | 
						||
| 
								 | 
							
								      this._position.column = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  _append(str, sourcePos, maybeNewline) {
							 | 
						||
| 
								 | 
							
								    const len = str.length;
							 | 
						||
| 
								 | 
							
								    const position = this._position;
							 | 
						||
| 
								 | 
							
								    this._last = str.charCodeAt(len - 1);
							 | 
						||
| 
								 | 
							
								    if (++this._appendCount > 4096) {
							 | 
						||
| 
								 | 
							
								      +this._str;
							 | 
						||
| 
								 | 
							
								      this._buf += this._str;
							 | 
						||
| 
								 | 
							
								      this._str = str;
							 | 
						||
| 
								 | 
							
								      this._appendCount = 0;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._str += str;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (!maybeNewline && !this._map) {
							 | 
						||
| 
								 | 
							
								      position.column += len;
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      column,
							 | 
						||
| 
								 | 
							
								      identifierName,
							 | 
						||
| 
								 | 
							
								      filename
							 | 
						||
| 
								 | 
							
								    } = sourcePos;
							 | 
						||
| 
								 | 
							
								    let line = sourcePos.line;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let i = str.indexOf("\n");
							 | 
						||
| 
								 | 
							
								    let last = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (i !== 0) {
							 | 
						||
| 
								 | 
							
								      this._mark(line, column, identifierName, filename);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    while (i !== -1) {
							 | 
						||
| 
								 | 
							
								      position.line++;
							 | 
						||
| 
								 | 
							
								      position.column = 0;
							 | 
						||
| 
								 | 
							
								      last = i + 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (last < len) {
							 | 
						||
| 
								 | 
							
								        this._mark(++line, 0, identifierName, filename);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      i = str.indexOf("\n", last);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    position.column += len - last;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  _mark(line, column, identifierName, filename) {
							 | 
						||
| 
								 | 
							
								    var _this$_map;
							 | 
						||
| 
								 | 
							
								    (_this$_map = this._map) == null ? void 0 : _this$_map.mark(this._position, line, column, identifierName, filename);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  removeTrailingNewline() {
							 | 
						||
| 
								 | 
							
								    const queueCursor = this._queueCursor;
							 | 
						||
| 
								 | 
							
								    if (queueCursor !== 0 && this._queue[queueCursor - 1].char === 10) {
							 | 
						||
| 
								 | 
							
								      this._queueCursor--;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  removeLastSemicolon() {
							 | 
						||
| 
								 | 
							
								    const queueCursor = this._queueCursor;
							 | 
						||
| 
								 | 
							
								    if (queueCursor !== 0 && this._queue[queueCursor - 1].char === 59) {
							 | 
						||
| 
								 | 
							
								      this._queueCursor--;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getLastChar() {
							 | 
						||
| 
								 | 
							
								    const queueCursor = this._queueCursor;
							 | 
						||
| 
								 | 
							
								    return queueCursor !== 0 ? this._queue[queueCursor - 1].char : this._last;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  getNewlineCount() {
							 | 
						||
| 
								 | 
							
								    const queueCursor = this._queueCursor;
							 | 
						||
| 
								 | 
							
								    let count = 0;
							 | 
						||
| 
								 | 
							
								    if (queueCursor === 0) return this._last === 10 ? 1 : 0;
							 | 
						||
| 
								 | 
							
								    for (let i = queueCursor - 1; i >= 0; i--) {
							 | 
						||
| 
								 | 
							
								      if (this._queue[i].char !== 10) {
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      count++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return count === queueCursor && this._last === 10 ? count + 1 : count;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  endsWithCharAndNewline() {
							 | 
						||
| 
								 | 
							
								    const queue = this._queue;
							 | 
						||
| 
								 | 
							
								    const queueCursor = this._queueCursor;
							 | 
						||
| 
								 | 
							
								    if (queueCursor !== 0) {
							 | 
						||
| 
								 | 
							
								      const lastCp = queue[queueCursor - 1].char;
							 | 
						||
| 
								 | 
							
								      if (lastCp !== 10) return;
							 | 
						||
| 
								 | 
							
								      if (queueCursor > 1) {
							 | 
						||
| 
								 | 
							
								        return queue[queueCursor - 2].char;
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        return this._last;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  hasContent() {
							 | 
						||
| 
								 | 
							
								    return this._queueCursor !== 0 || !!this._last;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  exactSource(loc, cb) {
							 | 
						||
| 
								 | 
							
								    if (!this._map) return cb();
							 | 
						||
| 
								 | 
							
								    this.source("start", loc);
							 | 
						||
| 
								 | 
							
								    cb();
							 | 
						||
| 
								 | 
							
								    this.source("end", loc);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  source(prop, loc) {
							 | 
						||
| 
								 | 
							
								    if (!this._map) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._normalizePosition(prop, loc, 0, 0);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  sourceWithOffset(prop, loc, lineOffset, columnOffset) {
							 | 
						||
| 
								 | 
							
								    if (!this._map) return;
							 | 
						||
| 
								 | 
							
								    this._normalizePosition(prop, loc, lineOffset, columnOffset);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  withSource(prop, loc, cb) {
							 | 
						||
| 
								 | 
							
								    if (!this._map) return cb();
							 | 
						||
| 
								 | 
							
								    this.source(prop, loc);
							 | 
						||
| 
								 | 
							
								    cb();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  _normalizePosition(prop, loc, lineOffset, columnOffset) {
							 | 
						||
| 
								 | 
							
								    const pos = loc[prop];
							 | 
						||
| 
								 | 
							
								    const target = this._sourcePosition;
							 | 
						||
| 
								 | 
							
								    target.identifierName = prop === "start" && loc.identifierName || undefined;
							 | 
						||
| 
								 | 
							
								    if (pos) {
							 | 
						||
| 
								 | 
							
								      target.line = pos.line + lineOffset;
							 | 
						||
| 
								 | 
							
								      target.column = pos.column + columnOffset;
							 | 
						||
| 
								 | 
							
								      target.filename = loc.filename;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getCurrentColumn() {
							 | 
						||
| 
								 | 
							
								    const queue = this._queue;
							 | 
						||
| 
								 | 
							
								    const queueCursor = this._queueCursor;
							 | 
						||
| 
								 | 
							
								    let lastIndex = -1;
							 | 
						||
| 
								 | 
							
								    let len = 0;
							 | 
						||
| 
								 | 
							
								    for (let i = 0; i < queueCursor; i++) {
							 | 
						||
| 
								 | 
							
								      const item = queue[i];
							 | 
						||
| 
								 | 
							
								      if (item.char === 10) {
							 | 
						||
| 
								 | 
							
								        lastIndex = len;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      len += item.repeat;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return lastIndex === -1 ? this._position.column + len : len - 1 - lastIndex;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getCurrentLine() {
							 | 
						||
| 
								 | 
							
								    let count = 0;
							 | 
						||
| 
								 | 
							
								    const queue = this._queue;
							 | 
						||
| 
								 | 
							
								    for (let i = 0; i < this._queueCursor; i++) {
							 | 
						||
| 
								 | 
							
								      if (queue[i].char === 10) {
							 | 
						||
| 
								 | 
							
								        count++;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return this._position.line + count;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								exports.default = Buffer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=buffer.js.map
							 |