137 lines
11 KiB
JavaScript
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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
|