metamorphosi
Version:
Transform jsons using templates
173 lines • 8.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transform = exports.getTransform = exports.getTransformer = void 0;
const eval_1 = require("./eval");
const compact_1 = require("./compact");
const value_key_types_1 = require("./value-key-types");
function getTransformer(template, options) {
console.log('Use getTrasform instead of getTrasnformer');
return ($, $1) => transform(template, { ...options, $, $1 });
}
exports.getTransformer = getTransformer;
function getTransform(template, options) {
return ($, $1) => transform(template, { ...options, $, $1 });
}
exports.getTransform = getTransform;
function transform(template, { dropValues = ['', null, undefined], $1, $, cb = x => x }) {
const propertyType = getValueType(template);
return process()[propertyType](template, { dropValues, $1, $, transform, cb });
}
exports.transform = transform;
function getValueType(template) {
switch (typeof template) {
case 'number':
return value_key_types_1.TemplateValueType.LITERAL_NUMBER;
case 'string':
return template.startsWith('$.') || template.startsWith('$1.') || template === '$' || template === '$1'
? value_key_types_1.TemplateValueType.JSON_PATH
: value_key_types_1.TemplateValueType.LITERAL_STRING;
case 'boolean':
return value_key_types_1.TemplateValueType.LITERAL_BOOLEAN;
case 'object':
return Array.isArray(template) ? value_key_types_1.TemplateValueType.ARRAY : value_key_types_1.TemplateValueType.OBJECT;
case 'function':
return value_key_types_1.TemplateValueType.FUNCTION;
case 'undefined':
return value_key_types_1.TemplateValueType.UNDEFINED;
default:
throw new TypeError(`Undefined template: ${template}`);
}
}
function process() {
const literalCb = (template, options) => options.cb(compact_1.compact(template, [], options.dropValues));
return {
[value_key_types_1.TemplateValueType.LITERAL_NUMBER]: literalCb,
[value_key_types_1.TemplateValueType.LITERAL_STRING]: literalCb,
[value_key_types_1.TemplateValueType.LITERAL_BOOLEAN]: literalCb,
[value_key_types_1.TemplateValueType.UNDEFINED]: literalCb,
[value_key_types_1.TemplateValueType.FUNCTION](template, options) {
var _a;
try {
return transform(template(options.$, options.$1), options);
}
catch (e) {
if (!((_a = e.message) === null || _a === void 0 ? void 0 : _a.includes('Cannot read propert')))
console.warn(`Warning: ${e.message}`);
}
},
[value_key_types_1.TemplateValueType.ARRAY](template, options) {
return compact_1.compact(template.map(t => transform(t, options)));
},
[value_key_types_1.TemplateValueType.JSON_PATH](template, options) {
return options.cb(compact_1.compact(eval_1.evaluate(options.$, template, options.$1), [], options.dropValues));
},
[value_key_types_1.TemplateValueType.OBJECT](template, options) {
var _a, _b, _c, _d;
if (template === null && compact_1.compact(null, [], options.dropValues) !== undefined)
return null;
const result = {};
let checkIf = [];
let keep = false;
for (let key in template) {
let keyType = getTemplateKeyType(key);
let destKey = key;
switch (keyType) {
case value_key_types_1.TemplateKeyType.TYPE_ARRAY: {
destKey = getArrayKey(key);
let originObj = getOriginArray(key, options);
if (!Array.isArray(originObj) && originObj) {
console.warn(`Warning: ${getOriginArrayKey(key)} is not an Array: ${originObj}`);
break;
}
let value = originObj === null || originObj === void 0 ? void 0 : originObj.map((o, index, array) => {
const $ = {
$: o,
$index: index,
$array: originObj,
'': options.$,
...o
};
return transform(template[key], { ...options, $ });
});
if (((_a = result[destKey]) === null || _a === void 0 ? void 0 : _a.length) > 0) {
value === null || value === void 0 ? void 0 : value.forEach(v => result[destKey].push(v));
}
else {
result[destKey] = compact_1.compact(value, [], options.dropValues);
}
break;
}
case value_key_types_1.TemplateKeyType.DUPLICATE:
destKey = getDuplicateDestKey(key);
case value_key_types_1.TemplateKeyType.SIMPLE: {
let value = transform(template[key], options);
if (((_b = result[destKey]) === null || _b === void 0 ? void 0 : _b.length) > 0) {
value === null || value === void 0 ? void 0 : value.forEach(v => result[destKey].push(v));
}
else {
result[destKey] = value;
}
break;
}
case value_key_types_1.TemplateKeyType.TEMPLATE: {
let newKey = transform(key, options);
let value = transform(template[key], options);
if (((_c = result[newKey]) === null || _c === void 0 ? void 0 : _c.length) > 0) {
value === null || value === void 0 ? void 0 : value.forEach(v => result[newKey].push(v));
}
else {
result[newKey] = value;
}
break;
}
case value_key_types_1.TemplateKeyType.IF:
checkIf = template[key].filter(element => typeof element === 'string');
try {
if (template[key]
.filter(cb => typeof cb === 'function')
.map(cb => cb(options.$, options.$1))
.some(val => !val)) {
return;
}
}
catch (err) {
if (!((_d = err.message) === null || _d === void 0 ? void 0 : _d.includes('Cannot read propert')))
console.warn(`Warning: ${err.message}`);
return;
}
break;
case value_key_types_1.TemplateKeyType.KEEP:
keep = template[key];
break;
}
}
return compact_1.compact(result, checkIf, options.dropValues, keep);
}
};
}
function getDuplicateDestKey(key) {
return key.split('.$')[0];
}
function getTemplateKeyType(key) {
if (key.indexOf('[$') > 0 && key.indexOf(']') > 0)
return value_key_types_1.TemplateKeyType.TYPE_ARRAY;
if (key.startsWith('$.') && !key.startsWith('$..'))
return value_key_types_1.TemplateKeyType.TEMPLATE;
if (key.indexOf('.$') > 0 && key.indexOf('..$') === -1)
return value_key_types_1.TemplateKeyType.DUPLICATE;
if (key === '$if')
return value_key_types_1.TemplateKeyType.IF;
if (key === '$keep')
return value_key_types_1.TemplateKeyType.KEEP;
return value_key_types_1.TemplateKeyType.SIMPLE;
}
function getArrayKey(key) {
return key.split('[$')[0];
}
function getOriginArrayKey(key) {
return key.split('[')[1].split(']')[0];
}
function getOriginArray(key, options) {
return eval_1.evaluate(options.$, getOriginArrayKey(key), options.$1);
}
//# sourceMappingURL=transform.js.map