| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const getPaths = require("./getPaths");const forEachBail = require("./forEachBail");module.exports = class SymlinkPlugin {	constructor(source, target) {		this.source = source;		this.target = target;	}	apply(resolver) {		const target = resolver.ensureHook(this.target);		const fs = resolver.fileSystem;		resolver			.getHook(this.source)			.tapAsync("SymlinkPlugin", (request, resolveContext, callback) => {				const pathsResult = getPaths(request.path);				const pathSeqments = pathsResult.seqments;				const paths = pathsResult.paths;				let containsSymlink = false;				forEachBail.withIndex(					paths,					(path, idx, callback) => {						fs.readlink(path, (err, result) => {							if (!err && result) {								pathSeqments[idx] = result;								containsSymlink = true;								// Shortcut when absolute symlink found								if (/^(\/|[a-zA-Z]:($|\\))/.test(result))									return callback(null, idx);							}							callback();						});					},					(err, idx) => {						if (!containsSymlink) return callback();						const resultSeqments =							typeof idx === "number"								? pathSeqments.slice(0, idx + 1)								: pathSeqments.slice();						const result = resultSeqments.reverse().reduce((a, b) => {							return resolver.join(a, b);						});						const obj = Object.assign({}, request, {							path: result						});						resolver.doResolve(							target,							obj,							"resolved symlink to " + result,							resolveContext,							callback						);					}				);			});	}};
 |