123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const RawSource = require("./RawSource");
- const Source = require("./Source");
- const { getMap, getSourceAndMap } = require("./helpers/getFromStreamChunks");
- const streamChunks = require("./helpers/streamChunks");
- /** @typedef {import("./Source").HashLike} HashLike */
- /** @typedef {import("./Source").MapOptions} MapOptions */
- /** @typedef {import("./Source").RawSourceMap} RawSourceMap */
- /** @typedef {import("./Source").SourceAndMap} SourceAndMap */
- /** @typedef {import("./Source").SourceValue} SourceValue */
- /** @typedef {import("./helpers/getGeneratedSourceInfo").GeneratedSourceInfo} GeneratedSourceInfo */
- /** @typedef {import("./helpers/streamChunks").OnChunk} OnChunk */
- /** @typedef {import("./helpers/streamChunks").OnName} OnName */
- /** @typedef {import("./helpers/streamChunks").OnSource} OnSource */
- /** @typedef {import("./helpers/streamChunks").Options} Options */
- const REPLACE_REGEX = /\n(?=.|\s)/g;
- class PrefixSource extends Source {
- /**
- * @param {string} prefix prefix
- * @param {string | Buffer | Source} source source
- */
- constructor(prefix, source) {
- super();
- /**
- * @private
- * @type {Source}
- */
- this._source =
- typeof source === "string" || Buffer.isBuffer(source)
- ? new RawSource(source, true)
- : source;
- this._prefix = prefix;
- }
- getPrefix() {
- return this._prefix;
- }
- original() {
- return this._source;
- }
- /**
- * @returns {SourceValue} source
- */
- source() {
- const node = /** @type {string} */ (this._source.source());
- const prefix = this._prefix;
- return prefix + node.replace(REPLACE_REGEX, `\n${prefix}`);
- }
- // TODO efficient buffer() implementation
- /**
- * @param {MapOptions=} options map options
- * @returns {RawSourceMap | null} map
- */
- map(options) {
- return getMap(this, options);
- }
- /**
- * @param {MapOptions=} options map options
- * @returns {SourceAndMap} source and map
- */
- sourceAndMap(options) {
- return getSourceAndMap(this, options);
- }
- /**
- * @param {Options} options options
- * @param {OnChunk} onChunk called for each chunk of code
- * @param {OnSource} onSource called for each source
- * @param {OnName} onName called for each name
- * @returns {GeneratedSourceInfo} generated source info
- */
- streamChunks(options, onChunk, onSource, onName) {
- const prefix = this._prefix;
- const prefixOffset = prefix.length;
- const linesOnly = Boolean(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 + /** @type {number} */ (generatedColumn),
- source:
- source !== undefined
- ? prefix + source.replace(REPLACE_REGEX, `\n${prefix}`)
- : undefined,
- };
- }
- /**
- * @param {HashLike} hash hash
- * @returns {void}
- */
- updateHash(hash) {
- hash.update("PrefixSource");
- this._source.updateHash(hash);
- hash.update(this._prefix);
- }
- }
- module.exports = PrefixSource;
|