68 lines
2.5 KiB
JavaScript
68 lines
2.5 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.build = void 0;
|
|
const fs_1 = __importDefault(require("fs"));
|
|
const path_1 = require("path");
|
|
const resolveSymlinksAsync = function (path, state, callback) {
|
|
const { queue, options: { suppressErrors }, } = state;
|
|
queue.enqueue();
|
|
fs_1.default.realpath(path, (error, resolvedPath) => {
|
|
if (error)
|
|
return queue.dequeue(suppressErrors ? null : error, state);
|
|
fs_1.default.stat(resolvedPath, (error, stat) => {
|
|
if (error)
|
|
return queue.dequeue(suppressErrors ? null : error, state);
|
|
if (stat.isDirectory() && isRecursive(path, resolvedPath, state))
|
|
return queue.dequeue(null, state);
|
|
callback(stat, resolvedPath);
|
|
queue.dequeue(null, state);
|
|
});
|
|
});
|
|
};
|
|
const resolveSymlinks = function (path, state, callback) {
|
|
const { queue, options: { suppressErrors }, } = state;
|
|
queue.enqueue();
|
|
try {
|
|
const resolvedPath = fs_1.default.realpathSync(path);
|
|
const stat = fs_1.default.statSync(resolvedPath);
|
|
if (stat.isDirectory() && isRecursive(path, resolvedPath, state))
|
|
return;
|
|
callback(stat, resolvedPath);
|
|
}
|
|
catch (e) {
|
|
if (!suppressErrors)
|
|
throw e;
|
|
}
|
|
};
|
|
function build(options, isSynchronous) {
|
|
if (!options.resolveSymlinks || options.excludeSymlinks)
|
|
return null;
|
|
return isSynchronous ? resolveSymlinks : resolveSymlinksAsync;
|
|
}
|
|
exports.build = build;
|
|
function isRecursive(path, resolved, state) {
|
|
if (state.options.useRealPaths)
|
|
return isRecursiveUsingRealPaths(resolved, state);
|
|
let parent = (0, path_1.dirname)(path);
|
|
let depth = 1;
|
|
while (parent !== state.root && depth < 2) {
|
|
const resolvedPath = state.symlinks.get(parent);
|
|
const isSameRoot = !!resolvedPath &&
|
|
(resolvedPath === resolved ||
|
|
resolvedPath.startsWith(resolved) ||
|
|
resolved.startsWith(resolvedPath));
|
|
if (isSameRoot)
|
|
depth++;
|
|
else
|
|
parent = (0, path_1.dirname)(parent);
|
|
}
|
|
state.symlinks.set(path, resolved);
|
|
return depth > 1;
|
|
}
|
|
function isRecursiveUsingRealPaths(resolved, state) {
|
|
return state.visited.includes(resolved + state.options.pathSeparator);
|
|
}
|