81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| "use strict";
 | |
| 
 | |
| const Source = require("./Source");
 | |
| 
 | |
| class CachedSource extends Source {
 | |
| 	constructor(source) {
 | |
| 		super();
 | |
| 		this._source = source;
 | |
| 		this._cachedSource = undefined;
 | |
| 		this._cachedSize = undefined;
 | |
| 		this._cachedMaps = {};
 | |
| 
 | |
| 		if(source.node) this.node = function(options) {
 | |
| 			return this._source.node(options);
 | |
| 		};
 | |
| 
 | |
| 		if(source.listMap) this.listMap = function(options) {
 | |
| 			return this._source.listMap(options);
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	source() {
 | |
| 		if(typeof this._cachedSource !== "undefined") return this._cachedSource;
 | |
| 		return this._cachedSource = this._source.source();
 | |
| 	}
 | |
| 
 | |
| 	size() {
 | |
| 		if(typeof this._cachedSize !== "undefined") return this._cachedSize;
 | |
| 		if(typeof this._cachedSource !== "undefined") {
 | |
| 			if(Buffer.from.length === 1) return new Buffer(this._cachedSource).length;
 | |
| 			return this._cachedSize = Buffer.byteLength(this._cachedSource);
 | |
| 		}
 | |
| 		return this._cachedSize = this._source.size();
 | |
| 	}
 | |
| 
 | |
| 	sourceAndMap(options) {
 | |
| 		const key = JSON.stringify(options);
 | |
| 		if(typeof this._cachedSource !== "undefined" && key in this._cachedMaps)
 | |
| 			return {
 | |
| 				source: this._cachedSource,
 | |
| 				map: this._cachedMaps[key]
 | |
| 			};
 | |
| 		else if(typeof this._cachedSource !== "undefined") {
 | |
| 			return {
 | |
| 				source: this._cachedSource,
 | |
| 				map: this._cachedMaps[key] = this._source.map(options)
 | |
| 			};
 | |
| 		} else if(key in this._cachedMaps) {
 | |
| 			return {
 | |
| 				source: this._cachedSource = this._source.source(),
 | |
| 				map: this._cachedMaps[key]
 | |
| 			};
 | |
| 		}
 | |
| 		const result = this._source.sourceAndMap(options);
 | |
| 		this._cachedSource = result.source;
 | |
| 		this._cachedMaps[key] = result.map;
 | |
| 		return {
 | |
| 			source: this._cachedSource,
 | |
| 			map: this._cachedMaps[key]
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	map(options) {
 | |
| 		if(!options) options = {};
 | |
| 		const key = JSON.stringify(options);
 | |
| 		if(key in this._cachedMaps)
 | |
| 			return this._cachedMaps[key];
 | |
| 		return this._cachedMaps[key] = this._source.map();
 | |
| 	}
 | |
| 
 | |
| 	updateHash(hash) {
 | |
| 		this._source.updateHash(hash);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| module.exports = CachedSource;
 |