@alinex/datastore
Version:
Read, work and write data structures from and to differents locations and formats.
108 lines • 3.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.format = exports.parse = void 0;
const path_1 = require("path");
const debug_1 = require("debug");
const luxon_1 = require("luxon");
const flat = require("flat");
const csvParse = require("csv-parse/lib/sync");
const csvStringify = require("csv-stringify/lib/sync");
const debug = debug_1.default("datastore:format:csv");
function toObject(arr, recordFormat) {
let res = recordFormat ? [] : {};
arr.forEach(row => {
if (recordFormat) {
res.push(flat.unflatten(row));
}
else {
res[row[0]] = row[1] === "" ? null : row[1];
}
});
return recordFormat ? res : flat.unflatten(res);
}
function toArray(obj) {
let res = [];
if (Array.isArray(obj)) {
Object.keys(obj).forEach(key => {
res.push(flat.flatten(obj[key]));
});
}
else {
obj = flat.flatten(obj);
Object.keys(obj).forEach(key => {
res.push([key, obj[key]]);
});
}
return res;
}
const parse = function (parsedUri, buffer, options) {
if (!parsedUri.pathname)
return Promise.reject(`No pathname given in ${parsedUri.href}`);
const pathname = parsedUri.hash || path_1.basename(parsedUri.pathname);
debug(`parsing ${pathname}`);
const delimiter = options && options.delimiter ? options.delimiter : ",";
const quote = options && options.quote !== undefined ? options.quote : '"';
let recordFormat = (options && options.records) ||
csvParse(buffer.toString().replace(/\n.*/s, ""), { delimiter: delimiter })[0].length > 2;
try {
return Promise.resolve(toObject(csvParse(buffer.toString(), {
columns: recordFormat,
delimiter,
quote,
skip_empty_lines: true,
cast: (value, context) => {
if (context.quoting === false) {
if (value === "")
return null;
if (value === "false")
return false;
if (value === "true")
return true;
if (value === "f")
return false;
if (value === "t")
return true;
const n = Number(value);
if (isNaN(n))
return value;
return n;
}
else if (context.index === 1 && value.match(/[-:]/)) {
const d = luxon_1.DateTime.fromISO(value);
return d.isValid ? d.toJSDate() : value;
}
else {
return value;
}
}
}), recordFormat));
}
catch (err) {
err.data = buffer.toString();
return Promise.reject(err);
}
;
};
exports.parse = parse;
const format = function (parsedUri, data) {
if (!parsedUri.pathname)
return Promise.reject(`No pathname given in ${parsedUri.href}`);
const pathname = parsedUri.hash || path_1.basename(parsedUri.pathname);
debug(`formatting for ${pathname}`);
const list = toArray(data);
return Promise.resolve(Buffer.from(csvStringify(list, {
delimiter: ",",
header: Array.isArray(list[0]) ? false : true,
cast: {
boolean: value => (value ? "true" : "false"),
date: value => {
return { value: value.toISOString(), quoted: true };
},
string: value => {
return { value: value, quoted: true };
}
}
}).replace(/\n/g, '\r\n')));
};
exports.format = format;
//# sourceMappingURL=csv.js.map