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