diff --git a/client/src/modules/index.js b/client/src/modules/index.js index 0240d6cf..783f9629 100644 --- a/client/src/modules/index.js +++ b/client/src/modules/index.js @@ -1,4 +1,4 @@ -export { Logger, Utils } from './utils'; +export { Logger, Utils, FileUtils } from './utils'; export { PluginManager } from './pluginmanager'; export { Pluging } from './plugin'; export { BDIpc } from './bdipc'; diff --git a/client/src/modules/utils.js b/client/src/modules/utils.js index 1d969556..8caa9a0b 100644 --- a/client/src/modules/utils.js +++ b/client/src/modules/utils.js @@ -10,6 +10,8 @@ const { Module } = require('./modulebase'); const moment = require('moment'); +const fs = window.require('fs'); +const path = window.require('path'); const logs = []; @@ -48,7 +50,93 @@ class Utils { cb(...args); } } + + static async tryParseJson(jsonString) { + try { + return JSON.parse(jsonString); + } catch (err) { + throw ({ + 'message': 'Failed to parse json', + err + }); + } + } } -module.exports = { Logger, Utils } \ No newline at end of file +class FileUtils { + + static async fileExists(path) { + return new Promise((resolve, reject) => { + fs.stat(path, (err, stats) => { + if (err) return reject({ + 'message': `No such file or directory: ${err.path}`, + err + }); + + if (!stats.isFile()) return reject({ + 'message': `Not a file: ${path}`, + stats + }); + + resolve(); + }); + }); + } + + static async directoryExists(path) { + return new Promise(resolve => { + fs.stat(path, (err, stats) => { + if (err) return reject({ + 'message': `Directory does not exist: ${path}`, + err + }); + + if (!stats.isDirectory()) return reject({ + 'message': `Not a directory: ${path}`, + stats + }); + + resolve(); + }); + }); + } + + static async readFile(path) { + try { + await this.fileExists(path); + } catch (err) { + throw (err); + } + + return new Promise(resolve => { + fs.readFile(path, 'utf-8', (err, data) => { + if (err) reject({ + 'message': `Could not read file: ${path}`, + err + }); + + resolve(data); + }); + }); + } + + static async readJsonFromFile(path) { + let readFile; + try { + readFile = await this.readFile(path); + } catch (err) { + throw (err); + } + + try { + const parsed = await Utils.tryParseJson(readFile); + return parsed; + } catch (err) { + throw (Object.assign(err, { path })); + } + } +} + + +module.exports = { Logger, Utils, FileUtils } \ No newline at end of file