UNPKG

@jsvfs/core

Version:

The JavaScript Virtual File System - an extensible engine for file operations.

144 lines 5.45 kB
"use strict"; 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