UNPKG

@voiceflow/common

Version:

Junk drawer of utility functions

118 lines (117 loc) 4.73 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.deepVariableSubstitution = exports.transformStringVariableToNumber = exports.sanitizeVariables = exports.replaceVariables = exports.splitVariableName = exports.variableReplacer = void 0; const constants_1 = require("../constants"); const get_js_1 = __importDefault(require("lodash/get.js")); const variableReplacer = (match, inner, variables, modifier = (val) => val) => { const { id, path } = (0, exports.splitVariableName)(inner); if (!(id in variables)) { return match; } if (!path) { return modifier(variables[id]); } try { const variable = typeof variables[id] === 'string' ? JSON.parse(variables[id]) : variables[id]; return modifier((0, get_js_1.default)(variable, path, 0)); } catch (err) { if (err?.message.includes('is not valid JSON')) { return 0; } throw err; } }; exports.variableReplacer = variableReplacer; const splitVariableName = (inner, options = { pathWithDotPrefix: false }) => { const firstDotIndex = inner.indexOf('.'); const firstSquareBracketIndex = inner.indexOf('['); if (firstDotIndex === -1 && firstSquareBracketIndex === -1) { return { id: inner, path: '' }; } if (firstDotIndex !== -1 && firstSquareBracketIndex === -1) { return { id: inner.slice(0, firstDotIndex), path: options.pathWithDotPrefix ? inner.slice(firstDotIndex) : inner.slice(firstDotIndex + 1), }; } if (firstDotIndex === -1 && firstSquareBracketIndex !== -1) { return { id: inner.slice(0, firstSquareBracketIndex), path: inner.slice(firstSquareBracketIndex), }; } if (firstDotIndex < firstSquareBracketIndex) { return { id: inner.slice(0, firstDotIndex), path: options.pathWithDotPrefix ? inner.slice(firstDotIndex) : inner.slice(firstDotIndex + 1), }; } return { id: inner.slice(0, firstSquareBracketIndex), path: inner.slice(firstSquareBracketIndex), }; }; exports.splitVariableName = splitVariableName; function replaceVariables(phrase, variables, { trim = true, modifier, keepTypeIfOnlyVariable = false, } = {}) { const stringPhrase = typeof phrase === 'string' ? phrase : String(phrase ?? ''); const formattedPhrase = trim ? stringPhrase.trim() : phrase; if (!formattedPhrase) { return ''; } if (keepTypeIfOnlyVariable && formattedPhrase.match(constants_1.VARIABLE_ONLY_REGEXP)) { // remove the curly braces {} from phrase to get the inner const inner = formattedPhrase.slice(1, -1); return (0, exports.variableReplacer)(formattedPhrase, inner, variables, modifier); } return formattedPhrase.replace(constants_1.READABLE_VARIABLE_REGEXP, (match, inner) => String((0, exports.variableReplacer)(match, inner, variables, modifier))); } exports.replaceVariables = replaceVariables; // turn float variables to 4 decimal places const sanitizeVariables = (variables) => Object.entries(variables).reduce((acc, [key, value]) => { if (typeof value === 'number' && !Number.isInteger(value)) { acc[key] = value.toFixed(4); } else { acc[key] = value; } return acc; }, {}); exports.sanitizeVariables = sanitizeVariables; const transformStringVariableToNumber = (str) => { if (typeof str === 'number') { return str; } if (str?.startsWith('0') && str.length > 1) { return str; } const number = Number(str); return Number.isNaN(number) ? str : number; }; exports.transformStringVariableToNumber = transformStringVariableToNumber; const deepVariableSubstitution = (bodyData, variableMap, options) => { const _recurse = (subCollection) => { if (!subCollection) { return subCollection; } if (typeof subCollection === 'string') { return replaceVariables(subCollection, variableMap, options); } if (Array.isArray(subCollection)) { return subCollection.map((v) => _recurse(v)); } if (typeof subCollection === 'object') { Object.keys(subCollection).forEach((key) => { // eslint-disable-next-line no-param-reassign subCollection[key] = _recurse(subCollection[key]); }); return subCollection; } return subCollection; }; return _recurse(bodyData); }; exports.deepVariableSubstitution = deepVariableSubstitution;