mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| var fs = require("fs");
 | |
| 
 | |
| function Cache(options) {
 | |
| 	this.options = options = options || {};
 | |
| 	this.map = {};
 | |
| }
 | |
| var $ = Cache.prototype;
 | |
| module.exports = Cache;
 | |
| 
 | |
| $.get = function(request, callback) {
 | |
| 	var self = this;
 | |
| 	var item = self.map[request];
 | |
| 	if(!item) return callback(new Error("No Entry"));
 | |
| 	var count = item.files.length;
 | |
| 	var invalid = false;
 | |
| 	item.files.forEach(function(file) {
 | |
| 		fs.stat(file.path, function(err, stat) {
 | |
| 			if(err) return invalidate(err.toString());
 | |
| 			if(!stat) return invalidate("Cannot read stat");
 | |
| 			if(stat.mtime.getTime() !== file.time)
 | |
| 				return invalidate("File " + file.path + " has changed");
 | |
| 			valid();
 | |
| 		});
 | |
| 	});
 | |
| 	if(item.files.length === 0) valid();
 | |
| 	function invalidate(msg) {
 | |
| 		if(invalid) return;
 | |
| 		invalid = true;
 | |
| 		callback(new Error(msg));
 | |
| 	}
 | |
| 	function valid() {
 | |
| 		if(invalid) return;
 | |
| 		count--;
 | |
| 		if(count <= 0)
 | |
| 			callback(null, item.value);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| $.create = function(request) {
 | |
| 	var self = this;
 | |
| 	var item = {
 | |
| 		files: []
 | |
| 	};
 | |
| 	var cacheEntry = {
 | |
| 		add: function(path) {
 | |
| 			item.files.push({
 | |
| 				path: path,
 | |
| 				// TODO do it asynchronly
 | |
| 				time: fs.statSync(path).mtime.getTime()
 | |
| 			});
 | |
| 		},
 | |
| 		clear: function() {
 | |
| 			item.files.length = 0;
 | |
| 		},
 | |
| 		save: function(value) {
 | |
| 			item.value = value;
 | |
| 			self.map[request] = item;
 | |
| 			cacheEntry.saved = true;
 | |
| 		}
 | |
| 	}
 | |
| 	return cacheEntry;
 | |
| } |