| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const forEachBail = require("./forEachBail");const getPaths = require("./getPaths");const { getType, PathType } = require("./util/path");/** @typedef {import("./Resolver")} Resolver *//** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */module.exports = class SymlinkPlugin {	/**	 * @param {string | ResolveStepHook} source source	 * @param {string | ResolveStepHook} target target	 */	constructor(source, target) {		this.source = source;		this.target = target;	}	/**	 * @param {Resolver} resolver the resolver	 * @returns {void}	 */	apply(resolver) {		const target = resolver.ensureHook(this.target);		const fs = resolver.fileSystem;		resolver			.getHook(this.source)			.tapAsync("SymlinkPlugin", (request, resolveContext, callback) => {				if (request.ignoreSymlinks) return callback();				const pathsResult = getPaths(request.path);				const pathSegments = pathsResult.segments;				const paths = pathsResult.paths;				let containsSymlink = false;				let idx = -1;				forEachBail(					paths,					(path, callback) => {						idx++;						if (resolveContext.fileDependencies)							resolveContext.fileDependencies.add(path);						fs.readlink(path, (err, result) => {							if (!err && result) {								pathSegments[idx] = result;								containsSymlink = true;								// Shortcut when absolute symlink found								const resultType = getType(result.toString());								if (									resultType === PathType.AbsoluteWin ||									resultType === PathType.AbsolutePosix								) {									return callback(null, idx);								}							}							callback();						});					},					(err, idx) => {						if (!containsSymlink) return callback();						const resultSegments =							typeof idx === "number"								? pathSegments.slice(0, idx + 1)								: pathSegments.slice();						const result = resultSegments.reduceRight((a, b) => {							return resolver.join(a, b);						});						const obj = {							...request,							path: result						};						resolver.doResolve(							target,							obj,							"resolved symlink to " + result,							resolveContext,							callback						);					}				);			});	}};
 |