@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.
175 lines • 12.7 kB
JavaScript
import * as plugins from './plugins.js';
import { SmartFile } from './classes.smartfile.js';
import { StreamFile } from './classes.streamfile.js';
import { VirtualDirectory } from './classes.virtualdirectory.js';
export class SmartFileFactory {
smartFs; // Will be typed as SmartFs once we import from @push.rocks/smartfs
constructor(smartFs) {
this.smartFs = smartFs;
}
/**
* Creates a default factory using Node.js filesystem provider
*/
static nodeFs() {
const smartFs = new plugins.smartfs.SmartFs(new plugins.smartfs.SmartFsProviderNode());
return new SmartFileFactory(smartFs);
}
/**
* Get the underlying SmartFs instance
*/
getSmartFs() {
return this.smartFs;
}
// ============================================
// SmartFile Factory Methods
// ============================================
/**
* Creates a SmartFile from a file path on disk
*/
async fromFilePath(filePath, baseArg = process.cwd()) {
if (!this.smartFs) {
throw new Error('No SmartFs instance available. Cannot read from filesystem without SmartFs.');
}
filePath = plugins.path.resolve(filePath);
const content = await this.smartFs.file(filePath).read();
const fileBuffer = Buffer.from(content);
return new SmartFile({
contentBuffer: fileBuffer,
base: baseArg,
path: plugins.path.relative(baseArg, filePath),
}, this.smartFs);
}
/**
* Creates a SmartFile from a URL
*/
async fromUrl(urlArg) {
const response = await plugins.smartrequest.SmartRequest.create()
.url(urlArg)
.accept('binary')
.get();
const buffer = Buffer.from(await response.arrayBuffer());
return new SmartFile({
contentBuffer: buffer,
base: process.cwd(),
path: urlArg,
}, this.smartFs);
}
/**
* Creates a SmartFile from a Buffer
*/
fromBuffer(filePath, contentBufferArg, baseArg = process.cwd()) {
// Use filePath as-is if it's already relative, otherwise compute relative path
const relativePath = plugins.path.isAbsolute(filePath)
? plugins.path.relative(baseArg, filePath)
: filePath;
return new SmartFile({
contentBuffer: contentBufferArg,
base: baseArg,
path: relativePath,
}, this.smartFs);
}
/**
* Creates a SmartFile from a string
*/
fromString(filePath, contentStringArg, encodingArg = 'utf8', baseArg = process.cwd()) {
// Use filePath as-is if it's already relative, otherwise compute relative path
const relativePath = plugins.path.isAbsolute(filePath)
? plugins.path.relative(baseArg, filePath)
: filePath;
return new SmartFile({
contentBuffer: Buffer.from(contentStringArg, encodingArg),
base: baseArg,
path: relativePath,
}, this.smartFs);
}
/**
* Creates a SmartFile from a stream
*/
async fromStream(stream, filePath, baseArg = process.cwd()) {
return new Promise((resolve, reject) => {
const chunks = [];
stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
stream.on('error', (error) => reject(error));
stream.on('end', () => {
const contentBuffer = Buffer.concat(chunks);
const smartfile = new SmartFile({
contentBuffer: contentBuffer,
base: baseArg,
path: plugins.path.relative(baseArg, filePath),
}, this.smartFs);
resolve(smartfile);
});
});
}
/**
* Creates a SmartFile from folded JSON
*/
async fromFoldedJson(foldedJsonArg) {
const parsed = plugins.smartjson.parse(foldedJsonArg);
return new SmartFile(parsed, this.smartFs);
}
// ============================================
// StreamFile Factory Methods
// ============================================
/**
* Creates a StreamFile from a file path
*/
async streamFromPath(filePath) {
return StreamFile.fromPath(filePath, this.smartFs);
}
/**
* Creates a StreamFile from a URL
*/
async streamFromUrl(url) {
return StreamFile.fromUrl(url, this.smartFs);
}
/**
* Creates a StreamFile from a Buffer
*/
streamFromBuffer(buffer, relativeFilePath) {
return StreamFile.fromBuffer(buffer, relativeFilePath, this.smartFs);
}
/**
* Creates a StreamFile from a Node.js Readable stream
*/
streamFromStream(stream, relativeFilePath, multiUse = false) {
return StreamFile.fromStream(stream, relativeFilePath, multiUse, this.smartFs);
}
// ============================================
// VirtualDirectory Factory Methods
// ============================================
/**
* Creates a VirtualDirectory from a filesystem directory path
*/
async virtualDirectoryFromPath(pathArg) {
return VirtualDirectory.fromFsDirPath(pathArg, this.smartFs, this);
}
/**
* Creates an empty VirtualDirectory
*/
virtualDirectoryEmpty() {
return new VirtualDirectory(this.smartFs, this);
}
/**
* Creates a VirtualDirectory from an array of SmartFiles
*/
virtualDirectoryFromFileArray(files) {
const vdir = new VirtualDirectory(this.smartFs, this);
vdir.addSmartfiles(files);
return vdir;
}
/**
* Creates a VirtualDirectory from a transferable object
*/
async virtualDirectoryFromTransferable(virtualDirTransferableObjectArg) {
const newVirtualDir = new VirtualDirectory(this.smartFs, this);
for (const fileArg of virtualDirTransferableObjectArg.files) {
const smartFile = SmartFile.enfoldFromJson(fileArg);
// Update the smartFs reference
smartFile.smartFs = this.smartFs;
newVirtualDir.addSmartfiles([smartFile]);
}
return newVirtualDir;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGZpbGUuZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc21hcnRmaWxlLmZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVqRSxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLE9BQU8sQ0FBTSxDQUFDLG1FQUFtRTtJQUV6RixZQUFZLE9BQVk7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE1BQU07UUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsNEJBQTRCO0lBQzVCLCtDQUErQztJQUUvQzs7T0FFRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQ3ZCLFFBQWdCLEVBQ2hCLFVBQWtCLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7UUFDakcsQ0FBQztRQUVELFFBQVEsR0FBRyxPQUFPLENB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