mono/packages/fs/dist/utils/paths.js

64 lines
5.4 KiB
JavaScript

import path from "node:path";
import os from "node:os";
import { sanitizeFilename, validateFilename, E_FilenameError, E_Sanitize } from "./name.js";
import { sync as move } from "../move.js";
import { sync as exists } from "../exists.js";
export var E_PathError;
(function (E_PathError) {
E_PathError[E_PathError["NONE"] = 0] = "NONE";
E_PathError[E_PathError["INVALID_CHAR"] = 1] = "INVALID_CHAR";
E_PathError[E_PathError["RESERVED_NAME"] = 2] = "RESERVED_NAME";
E_PathError[E_PathError["LEADING_TRAILING_SPACE"] = 4] = "LEADING_TRAILING_SPACE";
E_PathError[E_PathError["PATH_TOO_LONG"] = 8] = "PATH_TOO_LONG"; // Path exceeds Windows MAX_PATH limit
})(E_PathError || (E_PathError = {}));
export function sanitize(filePath, flags = E_Sanitize.REMOVE_EMOJIS) {
const segments = path.normalize(filePath).split(path.sep);
const sanitizedSegments = segments.map(segment => sanitizeFilename(segment, flags));
return sanitizedSegments.join(path.sep);
}
export function validatePath(filePath = "") {
let errorFlags = E_PathError.NONE;
// Check for Windows MAX_PATH limit
if (os.platform() === "win32" && filePath.length > 260) {
errorFlags |= E_PathError.PATH_TOO_LONG;
}
const segments = path.normalize(filePath).split(path.sep);
for (const segment of segments) {
if (!segment)
continue;
const validation = validateFilename(segment);
if (validation.errorFlags & E_FilenameError.INVALID_CHAR) {
errorFlags |= E_PathError.INVALID_CHAR;
}
if (validation.errorFlags & E_FilenameError.RESERVED_NAME) {
errorFlags |= E_PathError.RESERVED_NAME;
}
if (validation.errorFlags & E_FilenameError.LEADING_TRAILING_SPACE) {
errorFlags |= E_PathError.LEADING_TRAILING_SPACE;
}
}
return {
isValid: errorFlags === E_PathError.NONE,
errorFlags
};
}
export function renameFileIfNeeded(filePath, flags) {
if (!exists(filePath)) {
return filePath;
}
const dir = path.dirname(filePath);
const originalFilename = path.basename(filePath);
const sanitizedFilename = sanitizeFilename(originalFilename, flags);
if (originalFilename === sanitizedFilename) {
return filePath;
}
const newPath = path.join(dir, sanitizedFilename);
try {
move(filePath, newPath);
return newPath;
}
catch (error) {
return filePath;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUV4QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMzRixPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN6QyxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUU3QyxNQUFNLENBQU4sSUFBWSxXQU1YO0FBTkQsV0FBWSxXQUFXO0lBQ3RCLDZDQUFRLENBQUE7SUFDUiw2REFBcUIsQ0FBQTtJQUNyQiwrREFBc0IsQ0FBQTtJQUN0QixpRkFBK0IsQ0FBQTtJQUMvQiwrREFBc0IsQ0FBQSxDQUFRLHNDQUFzQztBQUNyRSxDQUFDLEVBTlcsV0FBVyxLQUFYLFdBQVcsUUFNdEI7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLFFBQWdCLEVBQUUsUUFBb0IsVUFBVSxDQUFDLGFBQWE7SUFDdEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ25GLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN4QyxDQUFDO0FBT0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxXQUFtQixFQUFFO0lBQ2pELElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFFbEMsbUNBQW1DO0lBQ25DLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3hELFVBQVUsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFMUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTztZQUFFLFNBQVE7UUFDdEIsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFNUMsSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxRCxVQUFVLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzRCxVQUFVLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3BFLFVBQVUsSUFBSSxXQUFXLENBQUMsc0JBQXNCLENBQUM7UUFDbEQsQ0FBQztJQUNGLENBQUM7SUFDRCxPQUFPO1FBQ04sT0FBTyxFQUFFLFVBQVUsS0FBSyxXQUFXLENBQUMsSUFBSTtRQUN4QyxVQUFVO0tBQ1YsQ0FBQTtBQUNGLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsUUFBZ0IsRUFBRSxLQUFpQjtJQUNyRSxJQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxRQUFRLENBQUE7SUFDaEIsQ0FBQztJQUNFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2hELE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDbkUsSUFBSSxnQkFBZ0IsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFDSixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0lBQzlDLElBQUksQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdkIsT0FBTyxPQUFPLENBQUE7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLFFBQVEsQ0FBQTtJQUNuQixDQUFDO0FBQ0wsQ0FBQyJ9