@jsvfs/core
Version:
The JavaScript Virtual File System - an extensible engine for file operations.
144 lines • 5.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.setItemAtPath = exports.getItemAtPath = exports.basename = exports.join = exports.destructure = exports.normalize = exports.SEPARATOR = void 0;
const Item_1 = require("./Item");
exports.SEPARATOR = '/';
/** Normalize a path to match expectations. */
function normalize(path) {
const absolute = exports.SEPARATOR + path;
return absolute.replace(/(\\+|\/+)/gu, exports.SEPARATOR);
}
exports.normalize = normalize;
/** Destructure a path to an array. */
function destructure(path) {
return normalize(path).split(exports.SEPARATOR);
}
exports.destructure = destructure;
/** Perform a POSIX join on one or more strings. */
function join(...paths) {
return normalize(paths.join(exports.SEPARATOR));
}
exports.join = join;
/** Get the base name of the given path. */
function basename(path) {
const tree = destructure(path);
if (tree.length === 0 || (tree.length === 1 && tree[0] === '')) {
return exports.SEPARATOR;
}
if (tree[tree.length - 1] === '') {
return tree[tree.length - 2];
}
return tree[tree.length - 1];
}
exports.basename = basename;
function getItemAtPath(root, path, resolveLinks = true) {
const tree = destructure(path);
let item = root;
for (let i = 0; i < tree.length; i += 1) {
let current;
if ('get' in item) {
current = item.get(tree[i]);
}
else {
if (i + 1 < tree.length) {
throw new TypeError(`Expected a folder; encountered a ${item.type} named '${item.name}' at path ${item.path}`);
}
break;
}
if (typeof current === 'undefined') {
throw new ReferenceError(`Item does not exist at path ${path}`);
}
switch (current.type) {
case 'root':
case 'folder':
item = current;
break;
case 'file':
if (i + 1 < tree.length) {
throw new TypeError(`Expected a folder; encountered a ${current.type} named '${current.name}' at path ${current.path}`);
}
item = current;
break;
case 'hardlink':
case 'softlink':
switch (current.contents.type) {
case 'folder':
if (i + 1 === tree.length && !resolveLinks) {
item = current;
}
else {
item = current.contents;
}
break;
case 'file':
if (i + 1 < tree.length) {
throw new TypeError(`Expected a folder; encountered a ${current.contents.type} named '${current.name}' at path ${current.path}`);
}
else if (i + 1 === tree.length && !resolveLinks) {
item = current;
}
else {
item = current.contents;
}
break;
}
break;
default:
throw new TypeError(`FATAL: Unexpected item type ${current.type} encountered.`);
}
}
return item;
}
exports.getItemAtPath = getItemAtPath;
/** Set an item in the file system tree. */
function setItemAtPath(root, item) {
const tree = destructure(item.path);
let parent = root;
for (let i = 0; i < tree.length; i += 1) {
if (i + 1 === tree.length) {
parent.set(item.name, item);
break;
}
let current;
if ('get' in parent) {
current = parent.get(tree[i]);
if (typeof current === 'undefined') {
current = new Item_1.Folder({
adapter: root.adapter,
name: tree[i],
path: join(parent.path, tree[i])
});
parent.set(current.name, current);
parent = current;
continue;
}
}
else {
if (i + 1 < tree.length) {
throw new TypeError(`Expected a folder; encountered a ${item.type} named '${item.name}' at path ${item.path}`);
}
break;
}
switch (current.type) {
case 'root':
case 'folder':
parent = current;
break;
case 'hardlink':
case 'softlink':
switch (current.contents.type) {
case 'root':
case 'folder':
parent = current.contents;
break;
default:
throw new TypeError(`Expected a folder; encountered a ${current.contents.type} named '${current.name}' at path ${current.path}`);
}
break;
default:
throw new TypeError(`Expected a folder; encountered a ${current.type} named '${current.name}' at path ${current.path}`);
}
}
}
exports.setItemAtPath = setItemAtPath;
//# sourceMappingURL=helpers.js.map