Source

node/src/FileStrategies/NodeJSONFileManager.ts

import path from 'path';
import { FileStrategies } from 'quickrl.core';
import { writeFile, readFile, mkdir } from 'fs/promises';

/**
 * Options for Json File Strategy
 * @category Node
 * @subcategory FileStrategies
 * @property {string} filePath The path to the file
 */
export interface JSONFileOptions {
    filePath: string;
}

/**
 * File Saver for saving json files in node
 * @category Node
 * @subcategory FileStrategies
 * @implements JSONSaver
 * @param {JSONFileOptions} options save options
 */
export class NodeJSONFileSaver<T extends object>
    implements FileStrategies.JSONSaver<T>
{
    private options: JSONFileOptions;
    constructor(options: JSONFileOptions) {
        this.options = options;
    }

    async save(data: T): Promise<boolean> {
        const folderPath = path.dirname(this.options.filePath);
        await mkdir(folderPath, { recursive: true }).catch(() => {
            console.error('something went wrong');
            return false;
        });
        await writeFile(this.options.filePath, JSON.stringify(data));
        return true;
    }
}

/**
 * File Loader for loading json files in node
 * @category Node
 * @subcategory FileStrategies
 * @implements JSONLoader
 * @param {JSONFileOptions} options load options
 */
export class NodeJSONFileLoader<T extends object>
    implements FileStrategies.JSONLoader<T>
{
    private options: JSONFileOptions;
    constructor(options: JSONFileOptions) {
        this.options = options;
    }

    async load(): Promise<T> {
        let qtable: Buffer = await readFile(this.options.filePath);
        return JSON.parse(qtable.toString());
    }
}