64 lines
5.4 KiB
JavaScript
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
|