mono/packages/fs/dist/inspect.js
2025-03-21 00:53:11 +01:00

137 lines
11 KiB
JavaScript

import * as fs from 'node:fs';
import { readlinkSync, statSync, lstatSync, readFileSync } from 'node:fs';
import pkg from 'mime';
const { getType } = pkg;
import * as pathUtil from 'node:path';
import { createHash } from 'node:crypto';
import { validateArgument, validateOptions } from './utils/validate.js';
import { ENodeType } from './interfaces.js';
export const supportedChecksumAlgorithms = ['md5', 'sha1', 'sha256', 'sha512'];
export function DefaultInspectOptions() {
return {
times: true,
mode: true
};
}
export function validateInput(methodName, path, options) {
const methodSignature = methodName + '(path, [options])';
validateArgument(methodSignature, 'path', path, ['string']);
validateOptions(methodSignature, 'options', options, {
checksum: ['string'],
mode: ['boolean'],
times: ['boolean'],
absolutePath: ['boolean'],
symlinks: ['boolean'],
size: 'number',
mime: 'string'
});
if (options && options.checksum !== undefined
&& !supportedChecksumAlgorithms.includes(options.checksum)) {
throw new Error('Argument "options.checksum" passed to ' + methodSignature
+ ' must have one of values: ' + supportedChecksumAlgorithms.join(', '));
}
}
const createInspectObj = (path, options, stat) => {
const obj = {};
obj.name = pathUtil.basename(path);
if (stat.isFile()) {
obj.type = ENodeType.FILE;
obj.size = stat.size;
}
else if (stat.isDirectory()) {
obj.type = ENodeType.DIR;
}
else if (stat.isSymbolicLink()) {
obj.type = ENodeType.SYMLINK;
}
else {
obj.type = ENodeType.OTHER;
}
if (options.mode) {
obj.mode = stat.mode;
}
if (options.mime) {
if (stat.isDirectory()) {
obj.mime = 'inode/directory';
}
else if (stat.isBlockDevice()) {
obj.mime = 'inode/blockdevice';
}
else if (stat.isCharacterDevice()) {
obj.mime = 'inode/chardevice';
}
else if (stat.isSymbolicLink()) {
obj.mime = 'inode/symlink';
}
else if (stat.isFIFO()) {
obj.mime = 'inode/fifo';
}
else if (stat.isSocket()) {
obj.mime = 'inode/socket';
}
else {
obj.mime = getType(path);
}
}
if (options.times) {
obj.accessTime = stat.atime;
obj.modifyTime = stat.mtime;
obj.changeTime = stat.ctime;
obj.birthTime = stat.birthtime;
}
if (options.absolutePath) {
obj.absolutePath = path;
}
return obj;
};
export function createItem(path, options) {
options = options || DefaultInspectOptions();
const stat = (options.symlinks ? lstatSync : statSync)(path);
return createInspectObj(path, options, stat);
}
// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------
const fileChecksum = (path, algo) => {
const hash = createHash(algo);
const data = readFileSync(path);
hash.update(data);
return hash.digest('hex');
};
const addExtraFieldsSync = (path, inspectObj, options) => {
if (inspectObj.type === ENodeType.FILE && options.checksum) {
inspectObj[options.checksum] = fileChecksum(path, options.checksum);
}
else if (inspectObj.type === ENodeType.SYMLINK) {
inspectObj.pointsAt = readlinkSync(path);
}
return inspectObj;
};
export function sync(path, options) {
let statOperation = fs.lstatSync;
let stat;
const opts = options || {};
if (opts.symlinks === "follow") {
statOperation = fs.statSync;
}
try {
stat = statOperation(path);
}
catch (err) {
// Detection if path exists
if (err.code === "ENOENT") {
// Doesn't exist. Return undefined instead of throwing.
return undefined;
}
throw err;
}
const inspectObj = createInspectObj(path, opts, stat);
addExtraFieldsSync(path, inspectObj, opts);
return inspectObj;
}
export const async = async (path, options) => {
options = options || {};
const stat = await (options.symlinks ? fs.promises.lstat : fs.promises.statfs)(path);
return addExtraFieldsSync(path, createInspectObj(path, options, stat), options);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnNwZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzdCLE9BQU8sRUFBUyxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFaEYsT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDO0FBQ3ZCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFFeEIsT0FBTyxLQUFNLFFBQVEsTUFBTSxXQUFXLENBQUE7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxpQkFBaUIsQ0FBQTtBQUVuRSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBYSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0FBRXhGLE1BQU0sVUFBVSxxQkFBcUI7SUFDcEMsT0FBTztRQUNOLEtBQUssRUFBRSxJQUFJO1FBQ1gsSUFBSSxFQUFFLElBQUk7S0FDVixDQUFDO0FBQ0gsQ0FBQztBQUNELE1BQU0sVUFBVSxhQUFhLENBQUMsVUFBa0IsRUFBRSxJQUFZLEVBQUUsT0FBeUI7SUFDeEYsTUFBTSxlQUFlLEdBQVcsVUFBVSxHQUFHLG1CQUFtQixDQUFDO0lBQ2pFLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM1RCxlQUFlLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUU7UUFDcEQsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3BCLElBQUksRUFBRSxDQUFD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