137 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
						|
	Author Tobias Koppers @sokra
 | 
						|
*/
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
const Source = require("./Source");
 | 
						|
const streamChunksOfRawSource = require("./helpers/streamChunksOfRawSource");
 | 
						|
const {
 | 
						|
	internString,
 | 
						|
	isDualStringBufferCachingEnabled,
 | 
						|
} = require("./helpers/stringBufferUtils");
 | 
						|
 | 
						|
/** @typedef {import("./Source").HashLike} HashLike */
 | 
						|
/** @typedef {import("./Source").MapOptions} MapOptions */
 | 
						|
/** @typedef {import("./Source").RawSourceMap} RawSourceMap */
 | 
						|
/** @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 */
 | 
						|
 | 
						|
class RawSource extends Source {
 | 
						|
	/**
 | 
						|
	 * @param {string | Buffer} value value
 | 
						|
	 * @param {boolean=} convertToString convert to string
 | 
						|
	 */
 | 
						|
	constructor(value, convertToString = false) {
 | 
						|
		super();
 | 
						|
		const isBuffer = Buffer.isBuffer(value);
 | 
						|
		if (!isBuffer && typeof value !== "string") {
 | 
						|
			throw new TypeError("argument 'value' must be either string or Buffer");
 | 
						|
		}
 | 
						|
		this._valueIsBuffer = !convertToString && isBuffer;
 | 
						|
		const internedString =
 | 
						|
			typeof value === "string" ? internString(value) : undefined;
 | 
						|
		/**
 | 
						|
		 * @private
 | 
						|
		 * @type {undefined | string | Buffer}
 | 
						|
		 */
 | 
						|
		this._value =
 | 
						|
			convertToString && isBuffer
 | 
						|
				? undefined
 | 
						|
				: typeof value === "string"
 | 
						|
					? internedString
 | 
						|
					: value;
 | 
						|
		/**
 | 
						|
		 * @private
 | 
						|
		 * @type {undefined | Buffer}
 | 
						|
		 */
 | 
						|
		this._valueAsBuffer = isBuffer ? value : undefined;
 | 
						|
		/**
 | 
						|
		 * @private
 | 
						|
		 * @type {undefined | string}
 | 
						|
		 */
 | 
						|
		this._valueAsString = isBuffer ? undefined : internedString;
 | 
						|
	}
 | 
						|
 | 
						|
	isBuffer() {
 | 
						|
		return this._valueIsBuffer;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @returns {SourceValue} source
 | 
						|
	 */
 | 
						|
	source() {
 | 
						|
		if (this._value === undefined) {
 | 
						|
			const value =
 | 
						|
				/** @type {Buffer} */
 | 
						|
				(this._valueAsBuffer).toString("utf8");
 | 
						|
			if (isDualStringBufferCachingEnabled()) {
 | 
						|
				this._value = internString(value);
 | 
						|
			}
 | 
						|
			return value;
 | 
						|
		}
 | 
						|
		return this._value;
 | 
						|
	}
 | 
						|
 | 
						|
	buffer() {
 | 
						|
		if (this._valueAsBuffer === undefined) {
 | 
						|
			const value = Buffer.from(/** @type {string} */ (this._value), "utf8");
 | 
						|
			if (isDualStringBufferCachingEnabled()) {
 | 
						|
				this._valueAsBuffer = value;
 | 
						|
			}
 | 
						|
			return value;
 | 
						|
		}
 | 
						|
		return this._valueAsBuffer;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param {MapOptions=} options map options
 | 
						|
	 * @returns {RawSourceMap | null} map
 | 
						|
	 */
 | 
						|
	// eslint-disable-next-line no-unused-vars
 | 
						|
	map(options) {
 | 
						|
		return null;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @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) {
 | 
						|
		let strValue = this._valueAsString;
 | 
						|
		if (strValue === undefined) {
 | 
						|
			const value = this.source();
 | 
						|
			strValue = typeof value === "string" ? value : value.toString("utf8");
 | 
						|
			if (isDualStringBufferCachingEnabled()) {
 | 
						|
				this._valueAsString = internString(strValue);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return streamChunksOfRawSource(
 | 
						|
			strValue,
 | 
						|
			onChunk,
 | 
						|
			onSource,
 | 
						|
			onName,
 | 
						|
			Boolean(options && options.finalSource),
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param {HashLike} hash hash
 | 
						|
	 * @returns {void}
 | 
						|
	 */
 | 
						|
	updateHash(hash) {
 | 
						|
		hash.update("RawSource");
 | 
						|
		hash.update(this.buffer());
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
module.exports = RawSource;
 |