mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| function MemoryOutputFileSystem(data) {
 | |
| 	this.data = data || {};
 | |
| }
 | |
| module.exports = MemoryOutputFileSystem;
 | |
| 
 | |
| function isDir(item) {
 | |
| 	if(typeof item != "object") return false;
 | |
| 	return item[""] === true;
 | |
| }
 | |
| 
 | |
| function isFile(item) {
 | |
| 	if(typeof item == "string") return true;
 | |
| 	if(typeof item != "object") return false;
 | |
| 	return !item[""];
 | |
| }
 | |
| 
 | |
| function pathToArray(path) {
 | |
| 	var nix = /^\//.test(path);
 | |
| 	if(!nix) {
 | |
| 		if(!/^[A-Za-z]:\\/.test(path)) return;
 | |
| 		path = path.replace(/\\/g, "/");
 | |
| 	}
 | |
| 	path = path.replace(/\/+/g, "/"); // multi slashs
 | |
| 	path = (nix ? path.substr(1) : path).split("/");
 | |
| 	if(!path[path.length-1]) path.pop();
 | |
| 	return path;
 | |
| }
 | |
| 
 | |
| MemoryOutputFileSystem.prototype.mkdirp = function(_path, callback) {
 | |
| 	var path = pathToArray(_path);
 | |
| 	if(!path) return callback(new Error("Invalid path " + _path));
 | |
| 	if(path.length == 0) return callback();
 | |
| 	var current = this.data;
 | |
| 	for(var i = 0; i < path.length; i++) {
 | |
| 		if(isFile(current[path[i]]))
 | |
| 			return callback(new Error("Path is a file " + _path));
 | |
| 		else if(!isDir(current[path[i]]))
 | |
| 			current[path[i]] = {"":true};
 | |
| 		current = current[path[i]];
 | |
| 	}
 | |
| 	return callback();
 | |
| };
 | |
| 
 | |
| MemoryOutputFileSystem.prototype.mkdir = function(_path, callback) {
 | |
| 	var path = pathToArray(_path);
 | |
| 	if(!path) return callback(new Error("Invalid path " + _path));
 | |
| 	if(path.length == 0) return callback();
 | |
| 	var current = this.data;
 | |
| 	for(var i = 0; i < path.length - 1; i++) {
 | |
| 		if(!isDir(current[path[i]]))
 | |
| 			return callback(new Error("Path doesn't exists " + _path));
 | |
| 		current = current[path[i]];
 | |
| 	}
 | |
| 	if(isDir(current[path[i]]))
 | |
| 		return callback(new Error("Directory already exist " + _path));
 | |
| 	else if(isFile(current[path[i]]))
 | |
| 		return callback(new Error("Cannot mkdir on file " + _path));
 | |
| 	current[path[i]] = {"":true};
 | |
| 	return callback();
 | |
| };
 | |
| 
 | |
| MemoryOutputFileSystem.prototype.rmdir = function(_path, callback) {
 | |
| 	var path = pathToArray(_path);
 | |
| 	if(!path) return callback(new Error("Invalid path " + _path));
 | |
| 	if(path.length == 0) return callback(new Error("Path cannot be removed " + _path));
 | |
| 	var current = this.data;
 | |
| 	for(var i = 0; i < path.length - 1; i++) {
 | |
| 		if(!isDir(current[path[i]]))
 | |
| 			return callback(new Error("Path doesn't exists " + _path));
 | |
| 		current = current[path[i]];
 | |
| 	}
 | |
| 	if(!isDir(current[path[i]]))
 | |
| 		return callback(new Error("Directory doesn't exist " + _path));
 | |
| 	delete current[path[i]];
 | |
| 	return callback();
 | |
| };
 | |
| 
 | |
| MemoryOutputFileSystem.prototype.unlink = function(_path, callback) {
 | |
| 	var path = pathToArray(_path);
 | |
| 	if(!path) return callback(new Error("Invalid path " + _path));
 | |
| 	if(path.length == 0) return callback(new Error("Path cannot be unlinked " + _path));
 | |
| 	var current = this.data;
 | |
| 	for(var i = 0; i < path.length - 1; i++) {
 | |
| 		if(!isDir(current[path[i]]))
 | |
| 			return callback(new Error("Path doesn't exists " + _path));
 | |
| 		current = current[path[i]];
 | |
| 	}
 | |
| 	if(!isFile(current[path[i]]))
 | |
| 		return callback(new Error("File doesn't exist " + _path));
 | |
| 	delete current[path[i]];
 | |
| 	return callback();
 | |
| };
 | |
| 
 | |
| MemoryOutputFileSystem.prototype.writeFile = function(_path, content, callback) {
 | |
| 	if(!content) return callback(new Error("No content"));
 | |
| 	var path = pathToArray(_path);
 | |
| 	if(!path) return callback(new Error("Invalid path " + _path));
 | |
| 	if(path.length == 0) return callback(new Error("Path is not a file " + _path));
 | |
| 	var current = this.data;
 | |
| 	for(var i = 0; i < path.length - 1; i++) {
 | |
| 		if(!isDir(current[path[i]]))
 | |
| 			return callback(new Error("Path doesn't exists " + _path));
 | |
| 		current = current[path[i]];
 | |
| 	}
 | |
| 	if(isDir(current[path[i]]))
 | |
| 		return callback(new Error("Cannot writeFile on directory " + _path));
 | |
| 	current[path[i]] = content;
 | |
| 	return callback();
 | |
| };
 | |
| 
 | |
| MemoryOutputFileSystem.prototype.join = function(a, b) {
 | |
| 	if(a[a.length-1] == "/") return a + b;
 | |
| 	if(a[a.length-1] == "\\") return a + b;
 | |
| 	return a + "/" + b;
 | |
| };
 |