UNPKG

template-transformer

Version:
134 lines 6.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.transform = 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) { return ($, $1) => transform(template, { ...options, $, $1 }); } exports.getTransformer = getTransformer; 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; 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.FUNCTION](template, options) { try { return transform(template(options.$, options.$1), options); } catch (e) { } }, [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; if (template === null && compact_1.compact(null, [], options.dropValues) !== undefined) return null; const result = {}; let checkIf = []; 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, $ }); }).filter((x) => compact_1.compact(x, [], options.dropValues) !== undefined); if (((_a = result[destKey]) === null || _a === void 0 ? void 0 : _a.length) > 0) value.unshift(...result[destKey]); result[destKey] = value; 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 (Array.isArray(value) && ((_b = result[destKey]) === null || _b === void 0 ? void 0 : _b.length) > 0) value.unshift(...result[destKey]); result[destKey] = value; break; } case value_key_types_1.TemplateKeyType.TEMPLATE: { let newKey = transform(key, options); let value = transform(template[key], options); if (Array.isArray(value) && ((_c = result[newKey]) === null || _c === void 0 ? void 0 : _c.length) > 0) value.unshift(...result[newKey]); result[newKey] = value; break; } case value_key_types_1.TemplateKeyType.IF: checkIf = template[key]; break; } } return compact_1.compact(result, checkIf, options.dropValues); }, }; } 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; 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