UNPKG

@flex-development/pathe

Version:

Universal drop-in replacement for node:path

51 lines (50 loc) 2.09 kB
import { isWindows } from "#internal/constants"; import domainToASCII from "#internal/domain-to-ascii"; import validateString from "#internal/validate-string"; import delimiter from "#lib/delimiter"; import isSep from "#lib/is-sep"; import resolveWith from "#lib/resolve-with"; import sep from "#lib/sep"; import toPosix from "#lib/to-posix"; import { ERR_INVALID_ARG_VALUE } from "@flex-development/errnode"; var path_to_file_url_default = pathToFileURL; function pathToFileURL(path, options) { validateString(path, "path"); path = toPosix(path); let url; if ((options?.windows ?? /* c8 ignore next */ isWindows) && path.startsWith(sep.repeat(2))) { const prefixLength = path.startsWith(`${sep}${sep}?${sep}UNC${sep}`) ? 8 : 2; const hostnameEndIndex = path.indexOf(sep, prefixLength); if (hostnameEndIndex === -1 || hostnameEndIndex === 2) { const reason = hostnameEndIndex < 0 ? "Missing UNC resource path" : "Empty UNC servername"; throw new ERR_INVALID_ARG_VALUE("path", path, reason); } const outURL = new URL("file" + delimiter + sep.repeat(2)); outURL.hostname = domainToASCII(path.slice(prefixLength, hostnameEndIndex)); outURL.pathname = encodePathChars(path.slice(hostnameEndIndex)); url = outURL; } else { let resolved = resolveWith(path, options); if (isSep(path[path.length - 1]) && !isSep(resolved[resolved.length - 1])) { resolved += sep; } resolved = encodePathChars(resolved); if (resolved.includes("?")) resolved = resolved.replace(/\?/g, "%3F"); if (resolved.includes("#")) resolved = resolved.replace(/#/g, "%23"); url = new URL("file" + delimiter + sep.repeat(2) + resolved); } return options?.string ? String(url) : url; } function encodePathChars(path) { if (path.includes("%")) path = path.replace(/%/g, "%25"); if (path.includes("\n")) path = path.replace(/\n/g, "%0A"); if (path.includes("\r")) path = path.replace(/\r/g, "%0D"); if (path.includes(" ")) path = path.replace(/\t/g, "%09"); return path; } export { path_to_file_url_default as default };