@flex-development/pathe
Version:
Universal drop-in replacement for node:path
51 lines (50 loc) • 1.63 kB
JavaScript
import { DRIVE_PATH_REGEX } from "#internal/constants";
import validateURLString from "#internal/validate-url-string";
import extname from "#lib/extname";
import isDeviceRoot from "#lib/is-device-root";
import isSep from "#lib/is-sep";
import removeExt from "#lib/remove-ext";
import root from "#lib/root";
import toPosix from "#lib/to-posix";
function parse(input) {
validateURLString(input, "input");
input = String(input);
const parsed = { base: "", dir: "", ext: "", name: "", root: "" };
if (input.length) {
input = toPosix(input);
if (isSep(input) || isDeviceRoot(input) || input.length === 2 && DRIVE_PATH_REGEX.test(input)) {
parsed.root = parsed.dir = input;
} else if (input.length === 1) {
parsed.base = parsed.name = input;
} else {
parsed.root = root(input);
let endBase = -1;
let startBase = parsed.root.length;
let separator = true;
for (let i = input.length - 1; i >= parsed.root.length; --i) {
if (isSep(input[i])) {
if (!separator) {
startBase = i + 1;
break;
}
continue;
}
if (endBase === -1) {
separator = false;
endBase = i + 1;
}
}
if (endBase !== -1) {
parsed.base = input.slice(startBase, endBase);
parsed.ext = extname(input);
parsed.name = removeExt(parsed.base, parsed.ext);
}
parsed.dir = startBase && startBase !== parsed.root.length ? input.slice(0, startBase - 1) : parsed.root;
}
}
return parsed;
}
var parse_default = parse;
export {
parse_default as default
};