| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 | 
							- /*
 
- 	MIT License http://www.opensource.org/licenses/mit-license.php
 
- 	Author Tobias Koppers @sokra
 
- */
 
- var Tapable = require("tapable");
 
- var createInnerCallback = require("./createInnerCallback");
 
- function Resolver(fileSystem) {
 
- 	Tapable.call(this);
 
- 	this.fileSystem = fileSystem;
 
- }
 
- module.exports = Resolver;
 
- Resolver.prototype = Object.create(Tapable.prototype);
 
- Resolver.prototype.constructor = Resolver;
 
- Resolver.prototype.resolveSync = function resolveSync(context, path, request) {
 
- 	var err, result, sync = false;
 
- 	this.resolve(context, path, request, function(e, r) {
 
- 		err = e;
 
- 		result = r;
 
- 		sync = true;
 
- 	});
 
- 	if(!sync) throw new Error("Cannot 'resolveSync' because the fileSystem is not sync. Use 'resolve'!");
 
- 	if(err) throw err;
 
- 	return result;
 
- };
 
- Resolver.prototype.resolve = function resolve(context, path, request, callback) {
 
- 	if(arguments.length === 3) {
 
- 		throw new Error("Signature changed: context parameter added");
 
- 	}
 
- 	var resolver = this;
 
- 	var obj = {
 
- 		context: context,
 
- 		path: path,
 
- 		request: request
 
- 	};
 
- 	var localMissing;
 
- 	var log;
 
- 	var message = "resolve '" + request + "' in '" + path + "'";
 
- 	function writeLog(msg) {
 
- 		log.push(msg);
 
- 	}
 
- 	function logAsString() {
 
- 		return log.join("\n");
 
- 	}
 
- 	function onError(err, result) {
 
- 		if(callback.log) {
 
- 			for(var i = 0; i < log.length; i++)
 
- 				callback.log(log[i]);
 
- 		}
 
- 		if(err) return callback(err);
 
- 		var error = new Error("Can't " + message);
 
- 		error.details = logAsString();
 
- 		error.missing = localMissing;
 
- 		resolver.applyPlugins("no-resolve", obj, error);
 
- 		return callback(error);
 
- 	}
 
- 	function onResolve(err, result) {
 
- 		if(!err && result) {
 
- 			return callback(null, result.path === false ? false : result.path + (result.query || ""), result);
 
- 		}
 
- 		localMissing = [];
 
- 		log = [];
 
- 		return resolver.doResolve("resolve", obj, message, createInnerCallback(onError, {
 
- 			log: writeLog,
 
- 			missing: localMissing,
 
- 			stack: callback.stack
 
- 		}));
 
- 	}
 
- 	onResolve.missing = callback.missing;
 
- 	onResolve.stack = callback.stack;
 
- 	return this.doResolve("resolve", obj, message, onResolve);
 
- };
 
- Resolver.prototype.doResolve = function doResolve(type, request, message, callback) {
 
- 	var resolver = this;
 
- 	var stackLine = type + ": (" + request.path + ") " +
 
- 		(request.request || "") + (request.query || "") +
 
- 		(request.directory ? " directory" : "") +
 
- 		(request.module ? " module" : "");
 
- 	var newStack = [stackLine];
 
- 	if(callback.stack) {
 
- 		newStack = callback.stack.concat(newStack);
 
- 		if(callback.stack.indexOf(stackLine) >= 0) {
 
- 			// Prevent recursion
 
- 			var recursionError = new Error("Recursion in resolving\nStack:\n  " + newStack.join("\n  "));
 
- 			recursionError.recursion = true;
 
- 			if(callback.log) callback.log("abort resolving because of recursion");
 
- 			return callback(recursionError);
 
- 		}
 
- 	}
 
- 	resolver.applyPlugins("resolve-step", type, request);
 
- 	var beforePluginName = "before-" + type;
 
- 	if(resolver.hasPlugins(beforePluginName)) {
 
- 		resolver.applyPluginsAsyncSeriesBailResult1(beforePluginName, request, createInnerCallback(beforeInnerCallback, {
 
- 			log: callback.log,
 
- 			missing: callback.missing,
 
- 			stack: newStack
 
- 		}, message && ("before " + message), true));
 
- 	} else {
 
- 		runNormal();
 
- 	}
 
- 	function beforeInnerCallback(err, result) {
 
- 		if(arguments.length > 0) {
 
- 			if(err) return callback(err);
 
- 			if(result) return callback(null, result);
 
- 			return callback();
 
- 		}
 
- 		runNormal();
 
- 	}
 
- 	function runNormal() {
 
- 		if(resolver.hasPlugins(type)) {
 
- 			return resolver.applyPluginsAsyncSeriesBailResult1(type, request, createInnerCallback(innerCallback, {
 
- 				log: callback.log,
 
- 				missing: callback.missing,
 
- 				stack: newStack
 
- 			}, message));
 
- 		} else {
 
- 			runAfter();
 
- 		}
 
- 	}
 
- 	function innerCallback(err, result) {
 
- 		if(arguments.length > 0) {
 
- 			if(err) return callback(err);
 
- 			if(result) return callback(null, result);
 
- 			return callback();
 
- 		}
 
- 		runAfter();
 
- 	}
 
- 	function runAfter() {
 
- 		var afterPluginName = "after-" + type;
 
- 		if(resolver.hasPlugins(afterPluginName)) {
 
- 			return resolver.applyPluginsAsyncSeriesBailResult1(afterPluginName, request, createInnerCallback(afterInnerCallback, {
 
- 				log: callback.log,
 
- 				missing: callback.missing,
 
- 				stack: newStack
 
- 			}, message && ("after " + message), true));
 
- 		} else {
 
- 			callback();
 
- 		}
 
- 	}
 
- 	function afterInnerCallback(err, result) {
 
- 		if(arguments.length > 0) {
 
- 			if(err) return callback(err);
 
- 			if(result) return callback(null, result);
 
- 			return callback();
 
- 		}
 
- 		return callback();
 
- 	}
 
- };
 
- Resolver.prototype.parse = function parse(identifier) {
 
- 	if(identifier === "") return null;
 
- 	var part = {
 
- 		request: "",
 
- 		query: "",
 
- 		module: false,
 
- 		directory: false,
 
- 		file: false
 
- 	};
 
- 	var idxQuery = identifier.indexOf("?");
 
- 	if(idxQuery === 0) {
 
- 		part.query = identifier;
 
- 	} else if(idxQuery > 0) {
 
- 		part.request = identifier.slice(0, idxQuery);
 
- 		part.query = identifier.slice(idxQuery);
 
- 	} else {
 
- 		part.request = identifier;
 
- 	}
 
- 	if(part.request) {
 
- 		part.module = this.isModule(part.request);
 
- 		part.directory = this.isDirectory(part.request);
 
- 		if(part.directory) {
 
- 			part.request = part.request.substr(0, part.request.length - 1);
 
- 		}
 
- 	}
 
- 	return part;
 
- };
 
- var notModuleRegExp = /^\.$|^\.[\\\/]|^\.\.$|^\.\.[\/\\]|^\/|^[A-Z]:[\\\/]/i;
 
- Resolver.prototype.isModule = function isModule(path) {
 
- 	return !notModuleRegExp.test(path);
 
- };
 
- var directoryRegExp = /[\/\\]$/i;
 
- Resolver.prototype.isDirectory = function isDirectory(path) {
 
- 	return directoryRegExp.test(path);
 
- };
 
- var memoryFsJoin = require("memory-fs/lib/join");
 
- var memoizedJoin = new Map();
 
- Resolver.prototype.join = function(path, request) {
 
- 	var cacheEntry;
 
- 	var pathCache = memoizedJoin.get(path);
 
- 	if(typeof pathCache === "undefined") {
 
- 		memoizedJoin.set(path, pathCache = new Map());
 
- 	} else {
 
- 		cacheEntry = pathCache.get(request);
 
- 		if(typeof cacheEntry !== "undefined")
 
- 			return cacheEntry;
 
- 	}
 
- 	cacheEntry = memoryFsJoin(path, request);
 
- 	pathCache.set(request, cacheEntry);
 
- 	return cacheEntry;
 
- };
 
- Resolver.prototype.normalize = require("memory-fs/lib/normalize");
 
 
  |