@flex-development/pathe
Version:
Universal drop-in replacement for node:path
51 lines (50 loc) • 2.09 kB
JavaScript
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
};