1 | "use strict";
|
2 | var __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 | };
|
13 | Object.defineProperty(exports, "__esModule", { value: true });
|
14 | var vm_1 = require("vm");
|
15 | var logging_1 = require("./logging");
|
16 | var nodeGlobals_1 = require("./nodeGlobals");
|
17 | function 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 | }
|
27 | exports.injectVariableAccessAndEvaluate = injectVariableAccessAndEvaluate;
|
28 | function 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 | }
|
41 | function 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 |
|
46 | if (foundNumericExpression &&
|
47 | afterEvalToNumber === (+afterEvalToNumber).toString()) {
|
48 | return +afterEvalToNumber;
|
49 | }
|
50 | return afterEvalToNumber;
|
51 | }
|
52 | exports.injectEvalAndVarsToString = injectEvalAndVarsToString;
|
53 | function 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 |
|
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 | }
|
70 | exports.injectEvalAndVarsToMap = injectEvalAndVarsToMap;
|
71 | function 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 | }
|
82 | function injectEvaluationToString(str, ctx, vars) {
|
83 |
|
84 |
|
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 | }
|
100 | function injectEvaluationToNumber(str, ctx, vars) {
|
101 |
|
102 |
|
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 | }
|
120 | function 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 | }
|