| | "use strict"; |
| |
|
| | Object.defineProperty(exports, "__esModule", { |
| | value: true |
| | }); |
| | exports.default = void 0; |
| | class Buffer { |
| | constructor(map, indentChar) { |
| | this._map = null; |
| | this._buf = ""; |
| | this._str = ""; |
| | this._appendCount = 0; |
| | this._last = 0; |
| | this._queue = []; |
| | this._queueCursor = 0; |
| | this._canMarkIdName = true; |
| | this._indentChar = ""; |
| | this._fastIndentations = []; |
| | this._position = { |
| | line: 1, |
| | column: 0 |
| | }; |
| | this._sourcePosition = { |
| | identifierName: undefined, |
| | identifierNamePos: undefined, |
| | line: undefined, |
| | column: undefined, |
| | filename: undefined |
| | }; |
| | this._map = map; |
| | this._indentChar = indentChar; |
| | for (let i = 0; i < 64; i++) { |
| | this._fastIndentations.push(indentChar.repeat(i)); |
| | } |
| | 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, |
| | identifierNamePos: undefined, |
| | filename: "" |
| | }); |
| | } |
| | } |
| | _pushQueue(char, repeat, line, column, 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.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 __mergedMap() { |
| | return this.map; |
| | }, |
| | 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.filename); |
| | } |
| | queueIndentation(repeat) { |
| | if (repeat === 0) return; |
| | this._pushQueue(-1, repeat, 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; |
| | if (char === -1) { |
| | const fastIndentation = this._fastIndentations[repeat]; |
| | if (fastIndentation !== undefined) { |
| | this._str += fastIndentation; |
| | } else { |
| | this._str += repeat > 1 ? this._indentChar.repeat(repeat) : this._indentChar; |
| | } |
| | } else { |
| | this._str += repeat > 1 ? String.fromCharCode(char).repeat(repeat) : String.fromCharCode(char); |
| | } |
| | if (char !== 10) { |
| | this._mark(sourcePos.line, sourcePos.column, sourcePos.identifierName, sourcePos.identifierNamePos, sourcePos.filename); |
| | this._position.column += repeat; |
| | } else { |
| | this._position.line++; |
| | this._position.column = 0; |
| | } |
| | if (this._canMarkIdName) { |
| | sourcePos.identifierName = undefined; |
| | sourcePos.identifierNamePos = undefined; |
| | } |
| | } |
| | _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, |
| | identifierNamePos, |
| | filename |
| | } = sourcePos; |
| | let line = sourcePos.line; |
| | if ((identifierName != null || identifierNamePos != null) && this._canMarkIdName) { |
| | sourcePos.identifierName = undefined; |
| | sourcePos.identifierNamePos = undefined; |
| | } |
| | let i = str.indexOf("\n"); |
| | let last = 0; |
| | if (i !== 0) { |
| | this._mark(line, column, identifierName, identifierNamePos, filename); |
| | } |
| | while (i !== -1) { |
| | position.line++; |
| | position.column = 0; |
| | last = i + 1; |
| | if (last < len && line !== undefined) { |
| | this._mark(++line, 0, null, null, filename); |
| | } |
| | i = str.indexOf("\n", last); |
| | } |
| | position.column += len - last; |
| | } |
| | _mark(line, column, identifierName, identifierNamePos, filename) { |
| | var _this$_map; |
| | (_this$_map = this._map) == null || _this$_map.mark(this._position, line, column, identifierName, identifierNamePos, 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) { |
| | cb(); |
| | return; |
| | } |
| | this.source("start", loc); |
| | const identifierName = loc.identifierName; |
| | const sourcePos = this._sourcePosition; |
| | if (identifierName) { |
| | this._canMarkIdName = false; |
| | sourcePos.identifierName = identifierName; |
| | } |
| | cb(); |
| | if (identifierName) { |
| | this._canMarkIdName = true; |
| | sourcePos.identifierName = undefined; |
| | sourcePos.identifierNamePos = undefined; |
| | } |
| | this.source("end", loc); |
| | } |
| | source(prop, loc) { |
| | if (!this._map) return; |
| | this._normalizePosition(prop, loc, 0); |
| | } |
| | sourceWithOffset(prop, loc, columnOffset) { |
| | if (!this._map) return; |
| | this._normalizePosition(prop, loc, columnOffset); |
| | } |
| | _normalizePosition(prop, loc, columnOffset) { |
| | const pos = loc[prop]; |
| | const target = this._sourcePosition; |
| | if (pos) { |
| | target.line = pos.line; |
| | target.column = Math.max(pos.column + columnOffset, 0); |
| | 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; |
| |
|
| | |
| |
|