@flex-development/pathe
Version:
Universal drop-in replacement for node:path
74 lines (73 loc) • 2.15 kB
JavaScript
import canParseURL from "#internal/can-parse-url";
import { DRIVE_PATH_REGEX } from "#internal/constants";
import validateString from "#internal/validate-string";
import validateURLString from "#internal/validate-url-string";
import delimiter from "#lib/delimiter";
import isSep from "#lib/is-sep";
import toPosix from "#lib/to-posix";
function basename(input, suffix) {
if (suffix !== null && suffix !== void 0) {
validateString(suffix, "suffix");
suffix = toPosix(suffix);
}
validateURLString(input, "input");
input = String(toPosix(input));
let start = 0;
let end = -1;
let separator = true;
if (canParseURL(input)) {
start = input.lastIndexOf(new URL(input).pathname);
if (start === -1) start = input.length;
if (DRIVE_PATH_REGEX.test(input.slice(start + 1))) start++;
}
if (DRIVE_PATH_REGEX.test(input.slice(start))) {
start = input.indexOf(delimiter, start) + 1;
}
if (typeof suffix === "string" && suffix.length && suffix.length <= input.length) {
if (input === suffix) return "";
let extIdx = suffix.length - 1;
let firstNonSlashEnd = -1;
for (let i = input.length - 1; i >= start; --i) {
const char = input[i];
if (isSep(char)) {
if (!separator) {
start = i + 1;
break;
}
} else {
if (firstNonSlashEnd === -1) {
separator = false;
firstNonSlashEnd = i + 1;
}
if (extIdx >= 0) {
if (char === suffix[extIdx]) {
if (--extIdx === -1) end = i;
} else {
extIdx = -1;
end = firstNonSlashEnd;
}
}
}
}
if (start === end) end = firstNonSlashEnd;
else if (end === -1) end = input.length;
} else {
for (let i = input.length - 1; i >= start; --i) {
if (isSep(input[i])) {
if (!separator) {
start = i + 1;
break;
}
} else if (end === -1) {
separator = false;
end = i + 1;
}
}
if (end === -1) return "";
}
return input.slice(start, end);
}
var basename_default = basename;
export {
basename_default as default
};