UNPKG

@noggin/elastic-noggin-sdk

Version:
160 lines (159 loc) 6.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WriteTemplateAny = exports.WriteTemplate = exports.ParseTemplateAny = exports.ParseTemplate = exports.IsFormulaSpec = exports.QuoteString = exports.Stringify = exports.Parser = void 0; const formula_lexer_1 = require("./formula-lexer"); const lodash_1 = require("lodash"); let parser; function parserFactory() { const newParser = new formula_lexer_1.Parser(); newParser.yy = { handler: { helper: { number: function (num) { switch (typeof num) { case 'number': return num; case 'string': if (!isNaN(num)) { return num.indexOf('.') > -1 ? parseFloat(num) : parseInt(num, 10); } } return num; }, numberInverted: function (num) { return this.number(num) * (-1); }, string: function (str) { return str.substring(1, str.length - 1).replace(/\\"/g, '"'); }, callFunction: function (funcName, args = []) { return { name: funcName.toUpperCase(), args: args }; } } } }; return newParser; } function Parser(formulaStr) { if (!parser) { parser = parserFactory(); } return parser.parse(formulaStr); } exports.Parser = Parser; function Stringify(formula) { if (typeof formula === 'string') { return QuoteString(formula); } if (typeof formula === 'number') { return isNaN(formula) ? '' : formula.toString(); } const spec = formula; const argStrs = spec.args.map(Stringify); return spec.name + '(' + argStrs.join(',') + ')'; } exports.Stringify = Stringify; function QuoteString(str) { return '"' + str.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"'; } exports.QuoteString = QuoteString; function IsFormulaSpec(formula) { return typeof formula !== 'string' && typeof formula !== 'number'; } exports.IsFormulaSpec = IsFormulaSpec; function ParseTemplate(formula, template) { const result = {}; if (formula.name !== template.name) { parseTemplateErr(formula, template, 'Unexpected formula name'); } if (formula.args.length !== template.args.length) { parseTemplateErr(formula, template, 'Argument length different'); } for (let i = 0; i < template.args.length; i++) { if (typeof template.args[i] === 'string' && template.args[i].substr(0, 1) === '$') { if (IsFormulaSpec(formula.args[i])) { parseTemplateErr(formula, template, 'Expected static value for argument ' + (1 + i)); } else { result[template.args[i]] = formula.args[i]; } } else if (!IsFormulaSpec(template.args[i])) { if (formula.args[i] !== template.args[i]) { parseTemplateErr(formula, template, 'Unexpected value argument ' + (1 + i)); } } else { if (IsFormulaSpec(formula.args[i])) { (0, lodash_1.merge)(result, ParseTemplate(formula.args[i], template.args[i])); } else { const subFormulaName = template.args[i].name; parseTemplateErr(formula, template, 'Expected ' + subFormulaName + ' formula for argument ' + (1 + i)); } } } return result; } exports.ParseTemplate = ParseTemplate; function ParseTemplateAny(formula, template) { const result = {}; if (formula.name !== template.name) { parseTemplateErr(formula, template, 'Unexpected formula name'); } if (formula.args.length !== template.args.length) { parseTemplateErr(formula, template, 'Argument length different'); } for (let i = 0; i < template.args.length; i++) { if (typeof template.args[i] === 'string' && template.args[i].substr(0, 1) === '$') { result[template.args[i]] = formula.args[i]; } else if (!IsFormulaSpec(template.args[i])) { if (formula.args[i] !== template.args[i]) { parseTemplateErr(formula, template, 'Unexpected value argument ' + (1 + i)); } } else { if (IsFormulaSpec(formula.args[i])) { (0, lodash_1.merge)(result, ParseTemplateAny(formula.args[i], template.args[i])); } else { const subFormulaName = template.args[i].name; parseTemplateErr(formula, template, 'Expected ' + subFormulaName + ' formula for argument ' + (1 + i)); } } } return result; } exports.ParseTemplateAny = ParseTemplateAny; function parseTemplateErr(formula, template, message) { throw new Error('Does not conform to formula template: ' + message + ': ' + Stringify(formula) + ' != ' + Stringify(template)); } function WriteTemplate(template, inserts) { const formula = { name: template.name, args: [] }; formula.args = template.args.map(arg => { if (IsFormulaSpec(arg)) { return WriteTemplate(arg, inserts); } if (typeof arg === 'string' && arg.substr(0, 1) === '$') { return inserts.hasOwnProperty(arg) ? inserts[arg] : { name: 'ARRAY', args: [] }; } return arg; }); return formula; } exports.WriteTemplate = WriteTemplate; function WriteTemplateAny(template, inserts) { const formula = { name: template.name, args: [] }; formula.args = template.args.map(arg => { if (IsFormulaSpec(arg)) { return WriteTemplateAny(arg, inserts); } if (typeof arg === 'string' && arg.substr(0, 1) === '$') { return inserts.hasOwnProperty(arg) ? inserts[arg] : { name: 'ARRAY', args: [] }; } return arg; }); return formula; } exports.WriteTemplateAny = WriteTemplateAny;