UNPKG

@flex-development/pathe

Version:

Universal drop-in replacement for node:path

51 lines (50 loc) 1.63 kB
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 };