UNPKG

@ctrl/golang-template

Version:
146 lines 4.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = exports.indexReplace = exports.variableReplace = exports.rangeReplace = exports.ifElseReplace = exports.joinReplace = exports.reReplace = void 0; const util_1 = require("./util"); function reReplace(str, variables) { const regex = /{{\s*re_replace\s+(\..+?)\s+"(.*?)"\s+"(.*?)"\s*}}/; let result = str; let m; while ((m = regex.exec(result)) !== null) { const all = m[0]; const prop = m[1]; const regexp = m[2]; const newvalue = m[3]; const replaceRegex = new RegExp(regexp, 'g'); const input = (0, util_1.get)(variables, prop.substring(1)); const expanded = input.replace(replaceRegex, newvalue); result = result.replace(all, expanded); } return result; } exports.reReplace = reReplace; function joinReplace(str, variables) { const regex = /{{\s*join\s+\.(.+?)\s+"(.*?)"\s*}}/; let result = str; let m; while ((m = regex.exec(result)) !== null) { const all = m[0]; const prop = m[1]; const delimiter = m[2]; const input = (0, util_1.get)(variables, prop); const expanded = input.join(delimiter); result = result.replace(all, expanded); } return result; } exports.joinReplace = joinReplace; function ifElseReplace(str, variables) { const regex = /{{\s*if\s*(.+?)\s*}}([\S\s]*?){{\s*else\s*}}([\S\s]*?){{\s*end\s*}}/; let result = str; let m; while ((m = regex.exec(result)) !== null) { let conditionResult; const all = m[0]; const condition = m[1]; const onTrue = m[2]; const onFalse = m[3]; if (condition.startsWith('.')) { let conditionResultState = false; const value = (0, util_1.get)(variables, condition.substring(1)); if (value === null || value === undefined) { conditionResultState = false; } else if (typeof value === 'string') { conditionResultState = value.length > 0; } else if (Array.isArray(value)) { conditionResultState = value.length > 0; } else if (typeof value === 'boolean') { conditionResultState = value; } else { throw new Error(`Unexpceted type for variable ${condition}: ${typeof value}`); } conditionResult = conditionResultState ? onTrue : onFalse; } else { throw new Error('Functionality not implemented'); } result = result.replace(all, conditionResult); } return result; } exports.ifElseReplace = ifElseReplace; function rangeReplace(str, variables) { const regex = /{{\s*range\s*(.+?)\s*}}(.*?){{\.}}(.*?){{end}}/; let result = str; let m; while ((m = regex.exec(result)) !== null) { let expanded = ''; const all = m[0]; const prop = m[1]; const prefix = m[2]; const postfix = m[3]; const arr = (0, util_1.get)(variables, prop.substring(1)); if (arr && Array.isArray(arr)) { for (const value of arr) { expanded += `${prefix}${value}${postfix}`; } } result = result.replace(all, expanded); } return result; } exports.rangeReplace = rangeReplace; function variableReplace(str, variables) { const regex = /{{\s*(\..+?)\s*}}/; let result = str; let m; while ((m = regex.exec(result)) !== null) { const all = m[0]; const prop = m[1]; const value = (0, util_1.get)(variables, prop.substring(1)); result = result.replace(all, value); } return result; } exports.variableReplace = variableReplace; function indexReplace(str, variables) { const regex = /{{\s*index\s*(\..+?)\s+(.+?)\s*}}/; let result = str; let m; while ((m = regex.exec(result)) !== null) { const all = m[0]; const prop = m[1]; const index = m[2]; const top = (0, util_1.get)(variables, prop.substring(1)); let value; // @ts-expect-error if (isNaN(index)) { value = top[index.substring(1, index.length - 1)]; } else { value = top[parseInt(index, 10)]; } result = result.replace(all, value); } return result; } exports.indexReplace = indexReplace; /** * Parse template and insert variables * @param str golang style template * @param variables object of variables to insert */ function parse(str, variables) { let result = reReplace(str, variables); result = joinReplace(result, variables); result = ifElseReplace(result, variables); result = rangeReplace(result, variables); result = variableReplace(result, variables); result = indexReplace(result, variables); return result; } exports.parse = parse; //# sourceMappingURL=index.js.map