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

64 lines
5.3 KiB
JavaScript

import path from "node:path";
import os from "node:os";
import { sanitizeFilename, validateFilename, E_FilenameError } 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) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUV4QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFjLE1BQU0sV0FBVyxDQUFBO0FBQzNGLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRTdDLE1BQU0sQ0FBTixJQUFZLFdBTVg7QUFORCxXQUFZLFdBQVc7SUFDdEIsNkNBQVEsQ0FBQTtJQUNSLDZEQUFxQixDQUFBO0lBQ3JCLCtEQUFzQixDQUFBO0lBQ3RCLGlGQUErQixDQUFBO0lBQy9CLCtEQUFzQixDQUFBLENBQVEsc0NBQXNDO0FBQ3JFLENBQUMsRUFOVyxXQUFXLEtBQVgsV0FBVyxRQU10QjtBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsUUFBZ0IsRUFBRSxLQUFLO0lBQy9DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDeEMsQ0FBQztBQU9ELE1BQU0sVUFBVSxZQUFZLENBQUMsV0FBbUIsRUFBRTtJQUNqRCxJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBRWxDLG1DQUFtQztJQUNuQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN4RCxVQUFVLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTFELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU87WUFBRSxTQUFRO1FBQ3RCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRTVDLElBQUksVUFBVSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUQsVUFBVSxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksVUFBVSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0QsVUFBVSxJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksVUFBVSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNwRSxVQUFVLElBQUksV0FBVyxDQUFDLHNCQUFzQixDQUFDO1FBQ2xELENBQUM7SUFDRixDQUFDO0lBQ0QsT0FBTztRQUNOLE9BQU8sRUFBRSxVQUFVLEtBQUssV0FBVyxDQUFDLElBQUk7UUFDeEMsVUFBVTtLQUNWLENBQUE7QUFDRixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFFBQWdCLEVBQUUsS0FBaUI7SUFDckUsSUFBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sUUFBUSxDQUFBO0lBQ2hCLENBQUM7SUFDRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNoRCxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ25FLElBQUksZ0JBQWdCLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBQ0osTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUM5QyxJQUFJLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3ZCLE9BQU8sT0FBTyxDQUFBO0lBQ2xCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsT0FBTyxRQUFRLENBQUE7SUFDbkIsQ0FBQztBQUNMLENBQUMifQ==