@alinex/datastore
Version:
Read, work and write data structures from and to differents locations and formats.
129 lines • 4.11 kB
JavaScript
;
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