UNPKG

6.75 kBJavaScriptView Raw
1"use strict";
2var __assign = (this && this.__assign) || function () {
3 __assign = Object.assign || function(t) {
4 for (var s, i = 1, n = arguments.length; i < n; i++) {
5 s = arguments[i];
6 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7 t[p] = s[p];
8 }
9 return t;
10 };
11 return __assign.apply(this, arguments);
12};
13Object.defineProperty(exports, "__esModule", { value: true });
14var vm_1 = require("vm");
15var logging_1 = require("./logging");
16var nodeGlobals_1 = require("./nodeGlobals");
17function injectVariableAccessAndEvaluate(expression, scenarioVariables) {
18 var regex = /{{(\w*)}}/g;
19 var variables = {};
20 var expressionWithVariables = searchForMatchingStrings(regex, expression).reduce(function (previousString, variable) {
21 variables[variable] = scenarioVariables.get(variable);
22 var searchValue = "{{" + variable + "}}";
23 return previousString.replace(searchValue, variable);
24 }, expression);
25 return vm_1.runInNewContext(expressionWithVariables, __assign(__assign({}, nodeGlobals_1.nodeGlobals), variables));
26}
27exports.injectVariableAccessAndEvaluate = injectVariableAccessAndEvaluate;
28function injectVarsToString(str, scenarioVariables, ctx) {
29 var regex = /{{(\w*)}}/g;
30 return searchForMatchingStrings(regex, str).reduce(function (previousString, variable) {
31 var replaceValue = scenarioVariables.get(variable);
32 if (replaceValue !== undefined) {
33 var searchValue = "{{" + variable + "}}";
34 logging_1.getLogger(ctx.scenario).debug("Replacing '" + searchValue + "' with '" + replaceValue + "'", ctx);
35 return previousString.replace(searchValue, "" + replaceValue);
36 }
37 logging_1.getLogger(ctx.scenario).debug("Not able to replace {{" + variable + "}} because no variable with that name found!", ctx);
38 return previousString;
39 }, str);
40}
41function injectEvalAndVarsToString(str, scenarioVariables, ctx) {
42 var afterEvalToString = injectEvaluationToString(str, ctx, scenarioVariables);
43 var afterVarInjection = injectVarsToString(afterEvalToString, scenarioVariables, ctx);
44 var _a = injectEvaluationToNumber(afterVarInjection, ctx, scenarioVariables), afterEvalToNumber = _a[0], foundNumericExpression = _a[1];
45 // if the string contains only number description, that can be converted, then return a number, in other case return a string
46 if (foundNumericExpression &&
47 afterEvalToNumber === (+afterEvalToNumber).toString()) {
48 return +afterEvalToNumber;
49 }
50 return afterEvalToNumber;
51}
52exports.injectEvalAndVarsToString = injectEvalAndVarsToString;
53function injectEvalAndVarsToMap(keyValueMap, scenarioVariables, ctx) {
54 var copy = keyValueMap instanceof Array ? [] : {};
55 Object.assign(copy, keyValueMap);
56 for (var _i = 0, _a = Object.entries(copy); _i < _a.length; _i++) {
57 var mapEntry = _a[_i];
58 var key = mapEntry[0];
59 var value = mapEntry[1];
60 if (value instanceof Object) {
61 // contains nested values
62 copy[key] = injectEvalAndVarsToMap(value, scenarioVariables, ctx);
63 }
64 else if (typeof value === 'string') {
65 copy[key] = injectEvalAndVarsToString(value, scenarioVariables, ctx);
66 }
67 }
68 return copy;
69}
70exports.injectEvalAndVarsToMap = injectEvalAndVarsToMap;
71function searchForMatchingStrings(regex, str) {
72 var regexCopy = regex;
73 var m;
74 var matchingStrings = [];
75 while ((m = regexCopy.exec(str)) !== null) {
76 if (m.index === regexCopy.lastIndex)
77 regexCopy.lastIndex += 1;
78 matchingStrings.push(m[1]);
79 }
80 return matchingStrings;
81}
82function injectEvaluationToString(str, ctx, vars) {
83 // the vars (scenario variable) should be left available here in order to access
84 // and set them from within evaluated expressions
85 var regex = /{{{(.*?)}}}/g;
86 var result = str;
87 searchForMatchingStrings(regex, result).forEach(function (expression) {
88 var replaceValue = (function () { return eval(expression); }).call(buildExpHelpers(vars));
89 if (replaceValue) {
90 var searchValue = "{{{" + expression + "}}}";
91 logging_1.getLogger(ctx.scenario).debug("Replacing '" + searchValue + "' with '" + replaceValue + "'", ctx);
92 result = result.replace(searchValue, replaceValue);
93 }
94 else {
95 logging_1.getLogger(ctx.scenario).debug("Not able to replace {{{" + expression + "}}} !", ctx);
96 }
97 });
98 return result;
99}
100function injectEvaluationToNumber(str, ctx, vars) {
101 // the vars (scenario variable) should be left available here in order to access
102 // and set them from within evaluated expressions
103 var regex = /<<<(.*?)>>>/g;
104 var foundNumericExpression = false;
105 var result = str;
106 searchForMatchingStrings(regex, result).forEach(function (expression) {
107 foundNumericExpression = true;
108 var replaceValue = (function () { return eval(expression); }).call(buildExpHelpers(vars));
109 if (replaceValue) {
110 var searchValue = "<<<" + expression + ">>>";
111 logging_1.getLogger(ctx.scenario).debug("Replacing '\"" + searchValue + "\"' with '" + replaceValue + "'", ctx);
112 result = result.replace(searchValue, replaceValue);
113 }
114 else {
115 logging_1.getLogger(ctx.scenario).debug("Not able to replace {{{" + expression + "}}} !", ctx);
116 }
117 });
118 return [result, foundNumericExpression];
119}
120function buildExpHelpers(vars) {
121 return {
122 get: function (name) {
123 return vars.get(name);
124 },
125 set: function (name, value) {
126 return vars.set(name, value);
127 },
128 getAndInc: function (name) {
129 var currentValue = vars.get(name);
130 vars.set(name, currentValue + 1);
131 return currentValue;
132 },
133 getAndIncBy: function (name, howMuch) {
134 var currentValue = vars.get(name);
135 vars.set(name, currentValue + howMuch);
136 return currentValue;
137 },
138 incAndGet: function (name) {
139 var targetValue = vars.get(name) + 1;
140 vars.set(name, targetValue);
141 return targetValue;
142 },
143 incByAndGet: function (name, howMuch) {
144 var targetValue = vars.get(name) + howMuch;
145 vars.set(name, targetValue);
146 return targetValue;
147 },
148 datePlusMinutesIso: function (minutes) {
149 return new Date(Date.now() + minutes * 60e3).toISOString();
150 },
151 timestampPlusMinutes: function (minutes) {
152 return Date.now() + minutes * 60e3;
153 },
154 };
155}