90 lines
7.7 KiB
JavaScript
90 lines
7.7 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getFolderSize = void 0;
|
|
const path_1 = require("path");
|
|
/**
|
|
* Returns an object containing the size of the folder and a list of errors encountered while traversing the folder.
|
|
*
|
|
* If any errors are returned, the returned folder size is likely smaller than the real folder size.
|
|
*
|
|
* @param {string} itemPath - Path of the folder.
|
|
* @param {object} [options] - Options.
|
|
* @param {boolean} [options.bigint] - Should the folder size be returned as a BigInt instead of a Number.
|
|
* @param {object} [options.ignore] - If a file's path matches this regex object, its size is not counted.
|
|
* @param {object} [options.fs] - The filesystem that should be used. Uses node fs by default.
|
|
*
|
|
* @returns {Promise<{size: number | bigint, errors: Array<Error> | null}>} - An object containing the size of the folder in bytes and a list of encountered errors.
|
|
*/
|
|
const getFolderSize = async (itemPath, options) => await core(itemPath, options, { errors: true });
|
|
exports.getFolderSize = getFolderSize;
|
|
/**
|
|
* Returns the size of the folder. If any errors are encountered while traversing the folder, they are silently ignored.
|
|
*
|
|
* The returned folder size might be smaller than the real folder size. It is impossible to know for sure, since errors are ignored.
|
|
*
|
|
* @param {string} itemPath - Path of the folder.
|
|
* @param {object} [options] - Options.
|
|
* @param {boolean} [options.bigint] - Should the folder size be returned as a BigInt instead of a Number.
|
|
* @param {object} [options.ignore] - If a file's path matches this regex object, its size is not counted.
|
|
* @param {object} [options.fs] - The filesystem that should be used. Uses node fs by default.
|
|
*
|
|
* @returns {Promise<number | bigint>} - The size of the folder in bytes.
|
|
*/
|
|
exports.getFolderSize.loose = async (itemPath, options) => await core(itemPath, options);
|
|
/**
|
|
* Returns the size of the folder. If any errors are encountered while traversing the folder, this method will throw an error.
|
|
*
|
|
* Because errors will otherwise make this method fail, the returned folder size will always be accurate.
|
|
*
|
|
* @param {string} itemPath - Path of the folder.
|
|
* @param {object} [options] - Options.
|
|
* @param {boolean} [options.bigint] - Should the folder size be returned as a BigInt instead of a Number.
|
|
* @param {object} [options.ignore] - If a file's path matches this regex object, its size is not counted.
|
|
* @param {object} [options.fs] - The filesystem that should be used. Uses node fs by default.
|
|
*
|
|
* @returns {Promise<number | bigint>} - The size of the folder in bytes.
|
|
*/
|
|
exports.getFolderSize.strict = async (itemPath, options) => await core(itemPath, options, { strict: true });
|
|
async function core(rootItemPath, options = {}, returnType = {}) {
|
|
const fs = options.fs || await Promise.resolve().then(() => require('fs/promises'));
|
|
const fileSizes = new Map();
|
|
const errors = [];
|
|
await processItem(rootItemPath);
|
|
async function processItem(itemPath) {
|
|
if (options.ignore?.test(itemPath))
|
|
return;
|
|
const stats = returnType.strict ? await fs.lstat(itemPath, { bigint: true }) : await fs.lstat(itemPath, { bigint: true }).catch(error => errors.push(error));
|
|
if (typeof stats !== 'object')
|
|
return;
|
|
fileSizes.set(stats.ino, stats.size);
|
|
if (stats.isDirectory()) {
|
|
const directoryItems = returnType.strict ? await fs.readdir(itemPath) : await fs.readdir(itemPath).catch(error => errors.push(error));
|
|
if (typeof directoryItems !== 'object')
|
|
return;
|
|
await Promise.all(directoryItems.map(directoryItem => processItem((0, path_1.join)(itemPath, directoryItem))));
|
|
}
|
|
}
|
|
let folderSize = Array.from(fileSizes.values()).reduce((total, fileSize) => total + fileSize, 0n);
|
|
if (!options.bigint) {
|
|
if (folderSize > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
const error = new RangeError('The folder size is too large to return as a Number. You can instruct this package to return a BigInt instead.');
|
|
if (returnType.strict) {
|
|
throw error;
|
|
}
|
|
else {
|
|
errors.push(error);
|
|
}
|
|
}
|
|
folderSize = Number(folderSize);
|
|
}
|
|
if (returnType.errors) {
|
|
return {
|
|
size: folderSize,
|
|
errors: errors.length > 0 ? errors : null,
|
|
};
|
|
}
|
|
else {
|
|
return folderSize;
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQXdDO0FBQ3hDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNJLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7QUFBMUYsUUFBQSxhQUFhLGlCQUE2RTtBQUV2Rzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxxQkFBYSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRWpGOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILHFCQUFhLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFJbEcsS0FBSyxVQUFVLElBQUksQ0FBRSxZQUFZLEVBQUUsVUFBYyxFQUFFLEVBQUUsYUFBaUIsRUFBRTtJQUN0RSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLDJDQUFhLGFBQWEsRUFBQyxDQUFDO0lBRXJELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBRWxCLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRWhDLEtBQUssVUFBVSxXQUFXLENBQUMsUUFBUTtRQUNqQyxJQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUFF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
|