UNPKG

@push.rocks/smartfile

Version:

High-level file representation classes (SmartFile, StreamFile, VirtualDirectory) for efficient in-memory file management in Node.js using TypeScript. Works seamlessly with @push.rocks/smartfs for filesystem operations.

152 lines 12.6 kB
import { SmartFile } from './classes.smartfile.js'; import * as plugins from './plugins.js'; /** * a virtual directory exposes a fs api * Use SmartFileFactory to create instances of this class */ export class VirtualDirectory { // STATIC static async fromFsDirPath(pathArg, smartFs, factory) { if (!smartFs || !factory) { throw new Error('No SmartFs/Factory instance available. Create VirtualDirectory through SmartFileFactory.'); } const newVirtualDir = new VirtualDirectory(smartFs, factory); // Use smartFs to list directory and factory to create SmartFiles const entries = await smartFs.directory(pathArg).recursive().list(); const smartfiles = await Promise.all(entries .filter((entry) => entry.isFile) .map((entry) => factory.fromFilePath(entry.path, pathArg))); newVirtualDir.addSmartfiles(smartfiles); return newVirtualDir; } static async fromVirtualDirTransferableObject(virtualDirTransferableObjectArg, smartFs, factory) { const newVirtualDir = new VirtualDirectory(smartFs, factory); for (const fileArg of virtualDirTransferableObjectArg.files) { const smartFile = SmartFile.enfoldFromJson(fileArg); // Update smartFs reference if available if (smartFs) { smartFile.smartFs = smartFs; } newVirtualDir.addSmartfiles([smartFile]); } return newVirtualDir; } static fromFileArray(files, smartFs, factory) { const vdir = new VirtualDirectory(smartFs, factory); vdir.addSmartfiles(files); return vdir; } static empty(smartFs, factory) { return new VirtualDirectory(smartFs, factory); } // INSTANCE smartfileArray = []; smartFs; factory; constructor(smartFs, factory) { this.smartFs = smartFs; this.factory = factory; } // ============================================ // Collection Mutations // ============================================ addSmartfiles(smartfileArrayArg) { this.smartfileArray = this.smartfileArray.concat(smartfileArrayArg); } addSmartfile(smartfileArg) { this.smartfileArray.push(smartfileArg); } removeByPath(pathArg) { const initialLength = this.smartfileArray.length; this.smartfileArray = this.smartfileArray.filter(f => f.path !== pathArg); return this.smartfileArray.length < initialLength; } clear() { this.smartfileArray = []; } merge(otherVDir) { this.addSmartfiles(otherVDir.smartfileArray); } // ============================================ // Collection Queries // ============================================ exists(pathArg) { return this.smartfileArray.some(f => f.path === pathArg); } has(pathArg) { return this.exists(pathArg); } async getFileByPath(pathArg) { return this.smartfileArray.find(f => f.path === pathArg); } listFiles() { return [...this.smartfileArray]; } listDirectories() { const dirs = new Set(); for (const file of this.smartfileArray) { const dir = plugins.path.dirname(file.path); if (dir !== '.') { dirs.add(dir); } } return Array.from(dirs).sort(); } filter(predicate) { const newVDir = new VirtualDirectory(this.smartFs, this.factory); newVDir.addSmartfiles(this.smartfileArray.filter(predicate)); return newVDir; } map(fn) { const newVDir = new VirtualDirectory(this.smartFs, this.factory); newVDir.addSmartfiles(this.smartfileArray.map(fn)); return newVDir; } find(predicate) { return this.smartfileArray.find(predicate); } size() { return this.smartfileArray.length; } isEmpty() { return this.smartfileArray.length === 0; } async toVirtualDirTransferableObject() { return { files: this.smartfileArray.map((smartfileArg) => smartfileArg.foldToJson()), }; } async saveToDisk(dirArg) { console.log(`writing VirtualDirectory with ${this.smartfileArray.length} files to directory: --> ${dirArg}`); for (const smartfileArg of this.smartfileArray) { const filePath = await smartfileArg.writeToDir(dirArg); console.log(`wrote ${smartfileArg.relative} to --> ${filePath}`); } } async shiftToSubdirectory(subDir) { const newVirtualDir = new VirtualDirectory(this.smartFs, this.factory); for (const file of this.smartfileArray) { if (file.path.startsWith(subDir)) { const adjustedFilePath = plugins.path.relative(subDir, file.path); file.path = adjustedFilePath; newVirtualDir.addSmartfiles([file]); } } return newVirtualDir; } async loadFromDisk(dirArg) { // Load from disk, replacing current collection this.clear(); const loaded = await VirtualDirectory.fromFsDirPath(dirArg, this.smartFs, this.factory); this.addSmartfiles(loaded.smartfileArray); } async addVirtualDirectory(virtualDir, newRoot) { for (const file of virtualDir.smartfileArray) { file.path = plugins.path.join(newRoot, file.path); } this.addSmartfiles(virtualDir.smartfileArray); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy52aXJ0dWFsZGlyZWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy52aXJ0dWFsZGlyZWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQU14Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFNBQVM7SUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FDL0IsT0FBZSxFQUNmLE9BQWEsRUFDYixPQUFhO1FBRWIsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEZBQTBGLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFN0QsaUVBQWlFO1FBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwRSxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2xDLE9BQU87YUFDSixNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7YUFDcEMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FDbEUsQ0FBQztRQUNGLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFeEMsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQ2xELCtCQUF5RixFQUN6RixPQUFhLEVBQ2IsT0FBYTtRQUViLE1BQU0sYUFBYSxHQUFHLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdELEtBQUssTUFBTSxPQUFPLElBQUksK0JBQStCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQWMsQ0FBQztZQUNqRSx3Q0FBd0M7WUFDeEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWCxTQUFpQixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDdkMsQ0FBQztZQUNELGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFrQixFQUFFLE9BQWEsRUFBRSxPQUFhO1FBQzFFLE1BQU0sSUFBSSxHQUFHLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFhLEVBQUUsT0FBYTtRQUM5QyxPQUFPLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxXQUFXO0lBQ0osY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDaEMsT0FBTyxDQUFPO0lBQ2QsT0FBTyxDQUFPO0lBRXRCLFlBQVksT0FBYSxFQUFFLE9BQWE7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVELCtDQUErQztJQUMvQyx1QkFBdUI7SUFDdkIsK0NBQStDO0lBRXhDLGFBQWEsQ0FBQyxpQkFBOEI7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTSxZQUFZLENBQUMsWUFBdUI7UUFDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLFlBQVksQ0FBQyxPQUFlO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO0lBQ3BELENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUEyQjtRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLHFCQUFxQjtJQUNyQiwrQ0FBK0M7SUFFeEMsTUFBTSxDQUFDLE9BQWU7UUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLEdBQUcsQ0FBQyxPQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFlO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxlQUFlO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBdUM7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLEdBQUcsQ0FBQyxFQUFrQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sSUFBSSxDQUFDLFNBQXVDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLElBQUk7UUFDVCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLEtBQUssQ0FBQyw4QkFBOEI7UUFDekMsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQzlDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FDMUI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBYztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU07VUFDakUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoQixLQUFLLE1BQU0sWUFBWSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLFlBQVksQ0FBQyxRQUFRO2NBQ2xDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBYztRQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZFLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO2dCQUM3QixhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWM7UUFDdEMsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLG1CQUFtQixDQUM5QixVQUE0QixFQUM1QixPQUFlO1FBRWYsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0YifQ==