@alinex/datastore
Version:
Read, work and write data structures from and to differents locations and formats.
87 lines • 2.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.format = exports.parse = exports.formats = void 0;
const path_1 = require("path");
const debug_1 = require("debug");
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));
};
exports.default = { parse: exports.parse, format: exports.format };
//# sourceMappingURL=index.js.map