src/api/functions/resolve-symlink.ts
import fs from "fs";
import { WalkerState, Options } from "../../types";
export type ResolveSymlinkFunction = (
path: string,
state: WalkerState,
callback: (stat: fs.Stats, path: string) => void
) => void;
const resolveSymlinksAsync: ResolveSymlinkFunction = function(
path,
state,
callback
) {
const {
queue,
options: { suppressErrors },
} = state;
queue.enqueue();
fs.realpath(path, (error, resolvedPath) => {
if (error) {
queue.dequeue(suppressErrors ? null : error, state);
return;
}
fs.lstat(resolvedPath, (_error, stat) => {
callback(stat, resolvedPath);
queue.dequeue(null, state);
});
});
};
const resolveSymlinksSync: ResolveSymlinkFunction = function(
path,
state,
callback
) {
try {
const resolvedPath = fs.realpathSync(path);
const stat = fs.lstatSync(resolvedPath);
callback(stat, resolvedPath);
} catch (e) {
if (!state.options.suppressErrors) throw e;
}
};
export function build(
options: Options,
isSynchronous: boolean
): ResolveSymlinkFunction | null {
if (!options.resolveSymlinks) return null;
return isSynchronous ? resolveSymlinksSync : resolveSymlinksAsync;
}