123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- 'use strict';
- const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
- function normalizeWindowsPath(input = "") {
- if (!input) {
- return input;
- }
- return input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
- }
- const _UNC_REGEX = /^[/\\]{2}/;
- const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/;
- const _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
- const _ROOT_FOLDER_RE = /^\/([A-Za-z]:)?$/;
- const sep = "/";
- const delimiter = ":";
- const normalize = function(path) {
- if (path.length === 0) {
- return ".";
- }
- path = normalizeWindowsPath(path);
- const isUNCPath = path.match(_UNC_REGEX);
- const isPathAbsolute = isAbsolute(path);
- const trailingSeparator = path[path.length - 1] === "/";
- path = normalizeString(path, !isPathAbsolute);
- if (path.length === 0) {
- if (isPathAbsolute) {
- return "/";
- }
- return trailingSeparator ? "./" : ".";
- }
- if (trailingSeparator) {
- path += "/";
- }
- if (_DRIVE_LETTER_RE.test(path)) {
- path += "/";
- }
- if (isUNCPath) {
- if (!isPathAbsolute) {
- return `//./${path}`;
- }
- return `//${path}`;
- }
- return isPathAbsolute && !isAbsolute(path) ? `/${path}` : path;
- };
- const join = function(...arguments_) {
- if (arguments_.length === 0) {
- return ".";
- }
- let joined;
- for (const argument of arguments_) {
- if (argument && argument.length > 0) {
- if (joined === void 0) {
- joined = argument;
- } else {
- joined += `/${argument}`;
- }
- }
- }
- if (joined === void 0) {
- return ".";
- }
- return normalize(joined.replace(/\/\/+/g, "/"));
- };
- function cwd() {
- if (typeof process !== "undefined" && typeof process.cwd === "function") {
- return process.cwd().replace(/\\/g, "/");
- }
- return "/";
- }
- const resolve = function(...arguments_) {
- arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
- let resolvedPath = "";
- let resolvedAbsolute = false;
- for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
- const path = index >= 0 ? arguments_[index] : cwd();
- if (!path || path.length === 0) {
- continue;
- }
- resolvedPath = `${path}/${resolvedPath}`;
- resolvedAbsolute = isAbsolute(path);
- }
- resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute);
- if (resolvedAbsolute && !isAbsolute(resolvedPath)) {
- return `/${resolvedPath}`;
- }
- return resolvedPath.length > 0 ? resolvedPath : ".";
- };
- function normalizeString(path, allowAboveRoot) {
- let res = "";
- let lastSegmentLength = 0;
- let lastSlash = -1;
- let dots = 0;
- let char = null;
- for (let index = 0; index <= path.length; ++index) {
- if (index < path.length) {
- char = path[index];
- } else if (char === "/") {
- break;
- } else {
- char = "/";
- }
- if (char === "/") {
- if (lastSlash === index - 1 || dots === 1) ; else if (dots === 2) {
- if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
- if (res.length > 2) {
- const lastSlashIndex = res.lastIndexOf("/");
- if (lastSlashIndex === -1) {
- res = "";
- lastSegmentLength = 0;
- } else {
- res = res.slice(0, lastSlashIndex);
- lastSegmentLength = res.length - 1 - res.lastIndexOf("/");
- }
- lastSlash = index;
- dots = 0;
- continue;
- } else if (res.length > 0) {
- res = "";
- lastSegmentLength = 0;
- lastSlash = index;
- dots = 0;
- continue;
- }
- }
- if (allowAboveRoot) {
- res += res.length > 0 ? "/.." : "..";
- lastSegmentLength = 2;
- }
- } else {
- if (res.length > 0) {
- res += `/${path.slice(lastSlash + 1, index)}`;
- } else {
- res = path.slice(lastSlash + 1, index);
- }
- lastSegmentLength = index - lastSlash - 1;
- }
- lastSlash = index;
- dots = 0;
- } else if (char === "." && dots !== -1) {
- ++dots;
- } else {
- dots = -1;
- }
- }
- return res;
- }
- const isAbsolute = function(p) {
- return _IS_ABSOLUTE_RE.test(p);
- };
- const toNamespacedPath = function(p) {
- return normalizeWindowsPath(p);
- };
- const _EXTNAME_RE = /.(\.[^./]+)$/;
- const extname = function(p) {
- const match = _EXTNAME_RE.exec(normalizeWindowsPath(p));
- return match && match[1] || "";
- };
- const relative = function(from, to) {
- const _from = resolve(from).replace(_ROOT_FOLDER_RE, "$1").split("/");
- const _to = resolve(to).replace(_ROOT_FOLDER_RE, "$1").split("/");
- if (_to[0][1] === ":" && _from[0][1] === ":" && _from[0] !== _to[0]) {
- return _to.join("/");
- }
- const _fromCopy = [..._from];
- for (const segment of _fromCopy) {
- if (_to[0] !== segment) {
- break;
- }
- _from.shift();
- _to.shift();
- }
- return [..._from.map(() => ".."), ..._to].join("/");
- };
- const dirname = function(p) {
- const segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
- if (segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0])) {
- segments[0] += "/";
- }
- return segments.join("/") || (isAbsolute(p) ? "/" : ".");
- };
- const format = function(p) {
- const segments = [p.root, p.dir, p.base ?? p.name + p.ext].filter(Boolean);
- return normalizeWindowsPath(
- p.root ? resolve(...segments) : segments.join("/")
- );
- };
- const basename = function(p, extension) {
- const lastSegment = normalizeWindowsPath(p).split("/").pop();
- return extension && lastSegment.endsWith(extension) ? lastSegment.slice(0, -extension.length) : lastSegment;
- };
- const parse = function(p) {
- const root = normalizeWindowsPath(p).split("/").shift() || "/";
- const base = basename(p);
- const extension = extname(base);
- return {
- root,
- dir: dirname(p),
- base,
- ext: extension,
- name: base.slice(0, base.length - extension.length)
- };
- };
- const path = {
- __proto__: null,
- basename: basename,
- delimiter: delimiter,
- dirname: dirname,
- extname: extname,
- format: format,
- isAbsolute: isAbsolute,
- join: join,
- normalize: normalize,
- normalizeString: normalizeString,
- parse: parse,
- relative: relative,
- resolve: resolve,
- sep: sep,
- toNamespacedPath: toNamespacedPath
- };
- exports.basename = basename;
- exports.delimiter = delimiter;
- exports.dirname = dirname;
- exports.extname = extname;
- exports.format = format;
- exports.isAbsolute = isAbsolute;
- exports.join = join;
- exports.normalize = normalize;
- exports.normalizeString = normalizeString;
- exports.normalizeWindowsPath = normalizeWindowsPath;
- exports.parse = parse;
- exports.path = path;
- exports.relative = relative;
- exports.resolve = resolve;
- exports.sep = sep;
- exports.toNamespacedPath = toNamespacedPath;
|