feat: init
This commit is contained in:
168
node_modules/@tybys/wasm-util/lib/mjs/wasi/path.mjs
generated
vendored
Normal file
168
node_modules/@tybys/wasm-util/lib/mjs/wasi/path.mjs
generated
vendored
Normal file
@@ -0,0 +1,168 @@
|
||||
import { validateString } from "./util.mjs";
|
||||
const CHAR_DOT = 46; /* . */
|
||||
const CHAR_FORWARD_SLASH = 47; /* / */
|
||||
function isPosixPathSeparator(code) {
|
||||
return code === CHAR_FORWARD_SLASH;
|
||||
}
|
||||
function normalizeString(path, allowAboveRoot, separator, isPathSeparator) {
|
||||
let res = '';
|
||||
let lastSegmentLength = 0;
|
||||
let lastSlash = -1;
|
||||
let dots = 0;
|
||||
let code = 0;
|
||||
for (let i = 0; i <= path.length; ++i) {
|
||||
if (i < path.length) {
|
||||
code = path.charCodeAt(i);
|
||||
}
|
||||
else if (isPathSeparator(code)) {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
code = CHAR_FORWARD_SLASH;
|
||||
}
|
||||
if (isPathSeparator(code)) {
|
||||
if (lastSlash === i - 1 || dots === 1) {
|
||||
// NOOP
|
||||
}
|
||||
else if (dots === 2) {
|
||||
if (res.length < 2 || lastSegmentLength !== 2 ||
|
||||
res.charCodeAt(res.length - 1) !== CHAR_DOT ||
|
||||
res.charCodeAt(res.length - 2) !== CHAR_DOT) {
|
||||
if (res.length > 2) {
|
||||
const lastSlashIndex = res.indexOf(separator);
|
||||
if (lastSlashIndex === -1) {
|
||||
res = '';
|
||||
lastSegmentLength = 0;
|
||||
}
|
||||
else {
|
||||
res = res.slice(0, lastSlashIndex);
|
||||
lastSegmentLength =
|
||||
res.length - 1 - res.indexOf(separator);
|
||||
}
|
||||
lastSlash = i;
|
||||
dots = 0;
|
||||
continue;
|
||||
}
|
||||
else if (res.length !== 0) {
|
||||
res = '';
|
||||
lastSegmentLength = 0;
|
||||
lastSlash = i;
|
||||
dots = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (allowAboveRoot) {
|
||||
res += res.length > 0 ? `${separator}..` : '..';
|
||||
lastSegmentLength = 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (res.length > 0) {
|
||||
res += `${separator}${path.slice(lastSlash + 1, i)}`;
|
||||
}
|
||||
else {
|
||||
res = path.slice(lastSlash + 1, i);
|
||||
}
|
||||
lastSegmentLength = i - lastSlash - 1;
|
||||
}
|
||||
lastSlash = i;
|
||||
dots = 0;
|
||||
}
|
||||
else if (code === CHAR_DOT && dots !== -1) {
|
||||
++dots;
|
||||
}
|
||||
else {
|
||||
dots = -1;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
export function resolve(...args) {
|
||||
let resolvedPath = '';
|
||||
let resolvedAbsolute = false;
|
||||
for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
||||
const path = i >= 0 ? args[i] : '/';
|
||||
validateString(path, 'path');
|
||||
// Skip empty entries
|
||||
if (path.length === 0) {
|
||||
continue;
|
||||
}
|
||||
resolvedPath = `${path}/${resolvedPath}`;
|
||||
resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
|
||||
}
|
||||
// At this point the path should be resolved to a full absolute path, but
|
||||
// handle relative paths to be safe (might happen when process.cwd() fails)
|
||||
// Normalize the path
|
||||
resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator);
|
||||
if (resolvedAbsolute) {
|
||||
return `/${resolvedPath}`;
|
||||
}
|
||||
return resolvedPath.length > 0 ? resolvedPath : '.';
|
||||
}
|
||||
export function relative(from, to) {
|
||||
validateString(from, 'from');
|
||||
validateString(to, 'to');
|
||||
if (from === to)
|
||||
return '';
|
||||
// Trim leading forward slashes.
|
||||
from = resolve(from);
|
||||
to = resolve(to);
|
||||
if (from === to)
|
||||
return '';
|
||||
const fromStart = 1;
|
||||
const fromEnd = from.length;
|
||||
const fromLen = fromEnd - fromStart;
|
||||
const toStart = 1;
|
||||
const toLen = to.length - toStart;
|
||||
// Compare paths to find the longest common path from root
|
||||
const length = (fromLen < toLen ? fromLen : toLen);
|
||||
let lastCommonSep = -1;
|
||||
let i = 0;
|
||||
for (; i < length; i++) {
|
||||
const fromCode = from.charCodeAt(fromStart + i);
|
||||
if (fromCode !== to.charCodeAt(toStart + i)) {
|
||||
break;
|
||||
}
|
||||
else if (fromCode === CHAR_FORWARD_SLASH) {
|
||||
lastCommonSep = i;
|
||||
}
|
||||
}
|
||||
if (i === length) {
|
||||
if (toLen > length) {
|
||||
if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) {
|
||||
// We get here if `from` is the exact base path for `to`.
|
||||
// For example: from='/foo/bar'; to='/foo/bar/baz'
|
||||
return to.slice(toStart + i + 1);
|
||||
}
|
||||
if (i === 0) {
|
||||
// We get here if `from` is the root
|
||||
// For example: from='/'; to='/foo'
|
||||
return to.slice(toStart + i);
|
||||
}
|
||||
}
|
||||
else if (fromLen > length) {
|
||||
if (from.charCodeAt(fromStart + i) === CHAR_FORWARD_SLASH) {
|
||||
// We get here if `to` is the exact base path for `from`.
|
||||
// For example: from='/foo/bar/baz'; to='/foo/bar'
|
||||
lastCommonSep = i;
|
||||
}
|
||||
else if (i === 0) {
|
||||
// We get here if `to` is the root.
|
||||
// For example: from='/foo/bar'; to='/'
|
||||
lastCommonSep = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
let out = '';
|
||||
// Generate the relative path based on the path difference between `to`
|
||||
// and `from`.
|
||||
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
|
||||
if (i === fromEnd ||
|
||||
from.charCodeAt(i) === CHAR_FORWARD_SLASH) {
|
||||
out += out.length === 0 ? '..' : '/..';
|
||||
}
|
||||
}
|
||||
// Lastly, append the rest of the destination (`to`) path that comes after
|
||||
// the common path parts.
|
||||
return `${out}${to.slice(toStart + lastCommonSep)}`;
|
||||
}
|
||||
Reference in New Issue
Block a user