123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const Source = require("./Source");
- const RawSource = require("./RawSource");
- const streamChunks = require("./helpers/streamChunks");
- const { getMap, getSourceAndMap } = require("./helpers/getFromStreamChunks");
- const REPLACE_REGEX = /\n(?=.|\s)/g;
- class PrefixSource extends Source {
- constructor(prefix, source) {
- super();
- this._source =
- typeof source === "string" || Buffer.isBuffer(source)
- ? new RawSource(source, true)
- : source;
- this._prefix = prefix;
- }
- getPrefix() {
- return this._prefix;
- }
- original() {
- return this._source;
- }
- source() {
- const node = this._source.source();
- const prefix = this._prefix;
- return prefix + node.replace(REPLACE_REGEX, "\n" + prefix);
- }
- // TODO efficient buffer() implementation
- map(options) {
- return getMap(this, options);
- }
- sourceAndMap(options) {
- return getSourceAndMap(this, options);
- }
- streamChunks(options, onChunk, onSource, onName) {
- const prefix = this._prefix;
- const prefixOffset = prefix.length;
- const linesOnly = !!(options && options.columns === false);
- const { generatedLine, generatedColumn, source } = streamChunks(
- this._source,
- options,
- (
- chunk,
- generatedLine,
- generatedColumn,
- sourceIndex,
- originalLine,
- originalColumn,
- nameIndex
- ) => {
- if (generatedColumn !== 0) {
- // In the middle of the line, we just adject the column
- generatedColumn += prefixOffset;
- } else if (chunk !== undefined) {
- // At the start of the line, when we have source content
- // add the prefix as generated mapping
- // (in lines only mode we just add it to the original mapping
- // for performance reasons)
- if (linesOnly || sourceIndex < 0) {
- chunk = prefix + chunk;
- } else if (prefixOffset > 0) {
- onChunk(prefix, generatedLine, generatedColumn, -1, -1, -1, -1);
- generatedColumn += prefixOffset;
- }
- } else if (!linesOnly) {
- // Without source content, we only need to adject the column info
- // expect in lines only mode where prefix is added to original mapping
- generatedColumn += prefixOffset;
- }
- onChunk(
- chunk,
- generatedLine,
- generatedColumn,
- sourceIndex,
- originalLine,
- originalColumn,
- nameIndex
- );
- },
- onSource,
- onName
- );
- return {
- generatedLine,
- generatedColumn:
- generatedColumn === 0 ? 0 : prefixOffset + generatedColumn,
- source:
- source !== undefined
- ? prefix + source.replace(REPLACE_REGEX, "\n" + prefix)
- : undefined
- };
- }
- updateHash(hash) {
- hash.update("PrefixSource");
- this._source.updateHash(hash);
- hash.update(this._prefix);
- }
- }
- module.exports = PrefixSource;
|