UNPKG

@alinex/datastore

Version:

Read, work and write data structures from and to differents locations and formats.

108 lines 3.77 kB
"use strict"; 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