| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | 
							- /*
 
-  MIT License http://www.opensource.org/licenses/mit-license.php
 
-  Author Tobias Koppers @sokra
 
-  */
 
- "use strict";
 
- const { Tapable, HookMap, SyncHook, SyncWaterfallHook } = require("tapable");
 
- const Factory = require("enhanced-resolve").ResolverFactory;
 
- const { cachedCleverMerge } = require("./util/cleverMerge");
 
- /** @typedef {import("enhanced-resolve").Resolver} Resolver */
 
- const EMTPY_RESOLVE_OPTIONS = {};
 
- module.exports = class ResolverFactory extends Tapable {
 
- 	constructor() {
 
- 		super();
 
- 		this.hooks = {
 
- 			resolveOptions: new HookMap(
 
- 				() => new SyncWaterfallHook(["resolveOptions"])
 
- 			),
 
- 			resolver: new HookMap(() => new SyncHook(["resolver", "resolveOptions"]))
 
- 		};
 
- 		this._pluginCompat.tap("ResolverFactory", options => {
 
- 			let match;
 
- 			match = /^resolve-options (.+)$/.exec(options.name);
 
- 			if (match) {
 
- 				this.hooks.resolveOptions
 
- 					.for(match[1])
 
- 					.tap(options.fn.name || "unnamed compat plugin", options.fn);
 
- 				return true;
 
- 			}
 
- 			match = /^resolver (.+)$/.exec(options.name);
 
- 			if (match) {
 
- 				this.hooks.resolver
 
- 					.for(match[1])
 
- 					.tap(options.fn.name || "unnamed compat plugin", options.fn);
 
- 				return true;
 
- 			}
 
- 		});
 
- 		this.cache2 = new Map();
 
- 	}
 
- 	get(type, resolveOptions) {
 
- 		resolveOptions = resolveOptions || EMTPY_RESOLVE_OPTIONS;
 
- 		const ident = `${type}|${JSON.stringify(resolveOptions)}`;
 
- 		const resolver = this.cache2.get(ident);
 
- 		if (resolver) return resolver;
 
- 		const newResolver = this._create(type, resolveOptions);
 
- 		this.cache2.set(ident, newResolver);
 
- 		return newResolver;
 
- 	}
 
- 	_create(type, resolveOptions) {
 
- 		const originalResolveOptions = Object.assign({}, resolveOptions);
 
- 		resolveOptions = this.hooks.resolveOptions.for(type).call(resolveOptions);
 
- 		const resolver = Factory.createResolver(resolveOptions);
 
- 		if (!resolver) {
 
- 			throw new Error("No resolver created");
 
- 		}
 
- 		/** @type {Map<Object, Resolver>} */
 
- 		const childCache = new Map();
 
- 		resolver.withOptions = options => {
 
- 			const cacheEntry = childCache.get(options);
 
- 			if (cacheEntry !== undefined) return cacheEntry;
 
- 			const mergedOptions = cachedCleverMerge(originalResolveOptions, options);
 
- 			const resolver = this.get(type, mergedOptions);
 
- 			childCache.set(options, resolver);
 
- 			return resolver;
 
- 		};
 
- 		this.hooks.resolver.for(type).call(resolver, resolveOptions);
 
- 		return resolver;
 
- 	}
 
- };
 
 
  |