csv-database
Version:
lightweight CSV database
49 lines (48 loc) • 1.58 kB
JavaScript
const fs = require("fs");
const doesFileExist = (filename) => new Promise((resolve, reject) => {
fs.exists(filename, resolve);
});
const createFile = (filename, data) => new Promise((resolve, reject) => {
fs.writeFile(filename, data, err => {
err ? reject(err) : resolve();
});
});
const createFileIfNotExist = async (filename, model, delimiter) => {
try {
if (!await doesFileExist(filename)) {
const headers = model.reduce((header, cell) => header + delimiter + cell);
await createFile(filename, headers);
}
}
catch (err) {
throw new Error("error creating csv file : " + err);
}
};
const hasSameModel = (obj, model) => {
const objKeys = Object.keys(obj);
const objHasKey = key => objKeys.find(k => k === key);
for (const key of model) {
if (!objHasKey(key))
return false;
}
// if length is different, arrays are not equal
return objKeys.length === model.length;
};
const validate = async (parser, model) => {
let validated = false;
// stop at first line once model has been validated
const checkModel = data => {
if (!validated && !hasSameModel(data, model))
throw new Error("csv model doesn't correspond");
validated = true;
};
const events = {
onData: checkModel
};
return parser.read(events);
};
const initDb = async (filename, model, delimiter, parser) => {
await createFileIfNotExist(filename, model, delimiter);
await validate(parser, model);
};
module.exports = initDb;