UNPKG

metamorphosi

Version:
173 lines 8.4 kB
"use strict"; 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