UNPKG

@alinex/datastore

Version:

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

129 lines 4.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cast = exports.format = exports.parse = exports.formats = void 0; const path_1 = require("path"); const debug_1 = require("debug"); const luxon_1 = require("luxon"); const core_1 = require("@alinex/core"); const debug = debug_1.default('datastore:format'); exports.formats = [ 'bson', 'coffee', 'cson', 'csv', 'html', 'ini', 'js', 'json', 'msgpack', 'properties', 'text', 'binary', 'toml', 'xlsx', 'xls', 'xml', 'yaml' ]; const alias = { htm: 'html', javascript: 'js', mjs: 'mjs', ts: 'js', log: 'text', txt: 'text', yml: 'yaml' }; function detect(pathname) { if (!path_1.extname(pathname)) return null; let ext = path_1.extname(pathname) .replace(/^\./, '') .toLowerCase(); if (alias[ext]) ext = alias[ext]; if (exports.formats.indexOf(ext) !== -1) return ext; return detect(path_1.basename(pathname, path_1.extname(pathname))); } const handler = function (parsedUri, options) { let ext = null; if (options && options.format) { ext = options.format; if (ext) { if (alias[ext]) ext = alias[ext]; if (exports.formats.indexOf(ext) == -1) ext = null; } } else if (parsedUri.hash) { ext = detect(parsedUri.hash.substr(1)); } else { if (!parsedUri.pathname) return Promise.reject(`Missing path in ${parsedUri.href}`); ext = detect(parsedUri.pathname); } if (!ext) { return Promise.reject(new core_1.ExitError(`Could not detect formatter based on file extension of ${parsedUri.pathname}, specify in options.`, 'Possible formats are: ' + exports.formats.join(', '))); } return Promise.resolve().then(() => require(`./${ext}`)); }; exports.parse = async function (parsedUri, buffer, options) { if (debug.enabled) { return handler(parsedUri, options).then(mod => mod.parse(parsedUri, buffer, options).then(data => { debug('got data:', data); return data; })); } return handler(parsedUri, options).then(mod => mod.parse(parsedUri, buffer, options)); }; exports.format = async function (parsedUri, data, options) { if (!parsedUri.pathname) throw new Error('No pathname given in URI'); return handler(parsedUri, options).then(mod => mod.format(parsedUri, data, options)); }; const cast = function (obj, ...types) { if (typeof obj !== 'object') return obj; Object.keys(obj).forEach(key => { if (typeof obj[key] === 'string') { const n = Number(obj[key]); if (types.includes('boolean') && obj[key] == 'true') obj[key] = true; else if (types.includes('boolean') && obj[key] == 'false') obj[key] = false; else if (types.includes('number') && !isNaN(n)) { obj[key] = n; } else if (types.includes('date')) { const d = luxon_1.DateTime.fromISO(obj[key]); if (d.isValid) obj[key] = d.toJSDate(); } else if (types.includes('isodate') && obj[key].match(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}/)) { const d = luxon_1.DateTime.fromISO(obj[key]); if (d.isValid) obj[key] = d.toJSDate(); } } else if (typeof obj[key] == 'object' && obj[key]) { obj[key] = exports.cast(obj[key], ...types); } }); if (types.includes('array')) { let num = 0; let isArray = true; Object.keys(obj).forEach(k => { if (k !== `${num++}`) isArray = false; }); if (isArray) obj = Object.keys(obj).map(k => obj[k]); } return obj; }; exports.cast = cast; exports.default = { parse: exports.parse, format: exports.format, cast: exports.cast }; //# sourceMappingURL=index.js.map