@usebruno/js 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/bru.js +23 -1
- package/src/interpolate-string.js +2 -1
- package/src/runtime/assert-runtime.js +5 -1
- package/src/runtime/script-runtime.js +8 -2
- package/src/runtime/test-runtime.js +4 -2
- package/src/runtime/vars-runtime.js +3 -1
- package/src/sandbox/quickjs/shims/bru.js +36 -0
package/package.json
CHANGED
package/src/bru.js
CHANGED
|
@@ -5,7 +5,7 @@ const { interpolate } = require('@usebruno/common');
|
|
|
5
5
|
const variableNameRegex = /^[\w-.]*$/;
|
|
6
6
|
|
|
7
7
|
class Bru {
|
|
8
|
-
constructor(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables) {
|
|
8
|
+
constructor(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables) {
|
|
9
9
|
this.envVariables = envVariables || {};
|
|
10
10
|
this.runtimeVariables = runtimeVariables || {};
|
|
11
11
|
this.processEnvVars = cloneDeep(processEnvVars || {});
|
|
@@ -13,6 +13,7 @@ class Bru {
|
|
|
13
13
|
this.collectionVariables = collectionVariables || {};
|
|
14
14
|
this.folderVariables = folderVariables || {};
|
|
15
15
|
this.requestVariables = requestVariables || {};
|
|
16
|
+
this.globalEnvironmentVariables = globalEnvironmentVariables || {};
|
|
16
17
|
this.collectionPath = collectionPath;
|
|
17
18
|
this.historyLogger = historyLogger;
|
|
18
19
|
this.setVisualizations = setVisualizations;
|
|
@@ -24,6 +25,7 @@ class Bru {
|
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
const combinedVars = {
|
|
28
|
+
...this.globalEnvironmentVariables,
|
|
27
29
|
...this.collectionVariables,
|
|
28
30
|
...this.envVariables,
|
|
29
31
|
...this.folderVariables,
|
|
@@ -76,6 +78,18 @@ class Bru {
|
|
|
76
78
|
this.envVariables[key] = value;
|
|
77
79
|
}
|
|
78
80
|
|
|
81
|
+
getGlobalEnvVar(key) {
|
|
82
|
+
return this._interpolate(this.globalEnvironmentVariables[key]);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
setGlobalEnvVar(key, value) {
|
|
86
|
+
if (!key) {
|
|
87
|
+
throw new Error('Creating a env variable without specifying a name is not allowed.');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
this.globalEnvironmentVariables[key] = value;
|
|
91
|
+
}
|
|
92
|
+
|
|
79
93
|
hasVar(key) {
|
|
80
94
|
return Object.hasOwn(this.runtimeVariables, key);
|
|
81
95
|
}
|
|
@@ -119,6 +133,14 @@ class Bru {
|
|
|
119
133
|
delete this.runtimeVariables[key];
|
|
120
134
|
}
|
|
121
135
|
|
|
136
|
+
deleteAllVars() {
|
|
137
|
+
for (let key in this.runtimeVariables) {
|
|
138
|
+
if (this.runtimeVariables.hasOwnProperty(key)) {
|
|
139
|
+
delete this.runtimeVariables[key];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
122
144
|
getCollectionVar(key) {
|
|
123
145
|
return this._interpolate(this.collectionVariables[key]);
|
|
124
146
|
}
|
|
@@ -2,13 +2,14 @@ const { interpolate } = require('@usebruno/common');
|
|
|
2
2
|
|
|
3
3
|
const interpolateString = (
|
|
4
4
|
str,
|
|
5
|
-
{ envVariables = {}, runtimeVariables = {}, processEnvVars = {}, collectionVariables = {}, folderVariables = {}, requestVariables = {} }
|
|
5
|
+
{ envVariables = {}, runtimeVariables = {}, processEnvVars = {}, collectionVariables = {}, folderVariables = {}, requestVariables = {}, globalEnvironmentVariables = {} }
|
|
6
6
|
) => {
|
|
7
7
|
if (!str || !str.length || typeof str !== 'string') {
|
|
8
8
|
return str;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
const combinedVars = {
|
|
12
|
+
...globalEnvironmentVariables,
|
|
12
13
|
...collectionVariables,
|
|
13
14
|
...envVariables,
|
|
14
15
|
...folderVariables,
|
|
@@ -192,6 +192,7 @@ const evaluateRhsOperand = (rhsOperand, operator, context, runtime) => {
|
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
const interpolationContext = {
|
|
195
|
+
globalEnvironmentVariables: context.bru.globalEnvironmentVariables,
|
|
195
196
|
collectionVariables: context.bru.collectionVariables,
|
|
196
197
|
folderVariables: context.bru.folderVariables,
|
|
197
198
|
requestVariables: context.bru.requestVariables,
|
|
@@ -240,6 +241,7 @@ class AssertRuntime {
|
|
|
240
241
|
}
|
|
241
242
|
|
|
242
243
|
runAssertions(assertions, request, response, envVariables, runtimeVariables, processEnvVars, historyLogger, secretVariables) {
|
|
244
|
+
const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
|
|
243
245
|
const collectionVariables = request?.collectionVariables || {};
|
|
244
246
|
const folderVariables = request?.folderVariables || {};
|
|
245
247
|
const requestVariables = request?.requestVariables || {};
|
|
@@ -258,7 +260,8 @@ class AssertRuntime {
|
|
|
258
260
|
secretVariables,
|
|
259
261
|
collectionVariables,
|
|
260
262
|
folderVariables,
|
|
261
|
-
requestVariables
|
|
263
|
+
requestVariables,
|
|
264
|
+
globalEnvironmentVariables
|
|
262
265
|
);
|
|
263
266
|
const req = new BrunoRequest(request, historyLogger);
|
|
264
267
|
const res = createResponseParser(response);
|
|
@@ -270,6 +273,7 @@ class AssertRuntime {
|
|
|
270
273
|
};
|
|
271
274
|
|
|
272
275
|
const context = {
|
|
276
|
+
...globalEnvironmentVariables,
|
|
273
277
|
...collectionVariables,
|
|
274
278
|
...envVariables,
|
|
275
279
|
...folderVariables,
|
|
@@ -53,10 +53,11 @@ class ScriptRuntime {
|
|
|
53
53
|
let setVisualizations = (data) => {
|
|
54
54
|
visualizations.push(data);
|
|
55
55
|
}
|
|
56
|
+
const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
|
|
56
57
|
const collectionVariables = request?.collectionVariables || {};
|
|
57
58
|
const folderVariables = request?.folderVariables || {};
|
|
58
59
|
const requestVariables = request?.requestVariables || {};
|
|
59
|
-
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables);
|
|
60
|
+
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables);
|
|
60
61
|
const req = new BrunoRequest(request, historyLogger);
|
|
61
62
|
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
62
63
|
const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
|
|
@@ -109,6 +110,7 @@ class ScriptRuntime {
|
|
|
109
110
|
envVariables: cleanJson(envVariables),
|
|
110
111
|
runtimeVariables: cleanJson(runtimeVariables),
|
|
111
112
|
visualizations,
|
|
113
|
+
globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
|
|
112
114
|
nextRequestName: bru.nextRequest
|
|
113
115
|
};
|
|
114
116
|
}
|
|
@@ -157,6 +159,7 @@ class ScriptRuntime {
|
|
|
157
159
|
envVariables: cleanJson(envVariables),
|
|
158
160
|
runtimeVariables: cleanJson(runtimeVariables),
|
|
159
161
|
visualizations,
|
|
162
|
+
globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
|
|
160
163
|
nextRequestName: bru.nextRequest
|
|
161
164
|
};
|
|
162
165
|
}
|
|
@@ -178,10 +181,11 @@ class ScriptRuntime {
|
|
|
178
181
|
let setVisualizations = (data) => {
|
|
179
182
|
visualizations.push(data);
|
|
180
183
|
}
|
|
184
|
+
const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
|
|
181
185
|
const collectionVariables = request?.collectionVariables || {};
|
|
182
186
|
const folderVariables = request?.folderVariables || {};
|
|
183
187
|
const requestVariables = request?.requestVariables || {};
|
|
184
|
-
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables);
|
|
188
|
+
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables);
|
|
185
189
|
const req = new BrunoRequest(request, historyLogger);
|
|
186
190
|
const res = new BrunoResponse(response);
|
|
187
191
|
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
@@ -231,6 +235,7 @@ class ScriptRuntime {
|
|
|
231
235
|
envVariables: cleanJson(envVariables),
|
|
232
236
|
runtimeVariables: cleanJson(runtimeVariables),
|
|
233
237
|
visualizations,
|
|
238
|
+
globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
|
|
234
239
|
nextRequestName: bru.nextRequest
|
|
235
240
|
};
|
|
236
241
|
}
|
|
@@ -279,6 +284,7 @@ class ScriptRuntime {
|
|
|
279
284
|
envVariables: cleanJson(envVariables),
|
|
280
285
|
runtimeVariables: cleanJson(runtimeVariables),
|
|
281
286
|
visualizations,
|
|
287
|
+
globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
|
|
282
288
|
nextRequestName: bru.nextRequest
|
|
283
289
|
};
|
|
284
290
|
}
|
|
@@ -50,10 +50,11 @@ class TestRuntime {
|
|
|
50
50
|
historyLogger,
|
|
51
51
|
secretVariables
|
|
52
52
|
) {
|
|
53
|
+
const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
|
|
53
54
|
const collectionVariables = request?.collectionVariables || {};
|
|
54
55
|
const folderVariables = request?.folderVariables || {};
|
|
55
56
|
const requestVariables = request?.requestVariables || {};
|
|
56
|
-
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, undefined, secretVariables, collectionVariables, folderVariables, requestVariables);
|
|
57
|
+
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, undefined, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables);
|
|
57
58
|
const req = new BrunoRequest(request, historyLogger);
|
|
58
59
|
const res = new BrunoResponse(response);
|
|
59
60
|
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
@@ -83,12 +84,12 @@ class TestRuntime {
|
|
|
83
84
|
request,
|
|
84
85
|
envVariables,
|
|
85
86
|
runtimeVariables,
|
|
87
|
+
globalEnvironmentVariables,
|
|
86
88
|
results: __brunoTestResults.getResults(),
|
|
87
89
|
nextRequestName: bru.nextRequest
|
|
88
90
|
};
|
|
89
91
|
}
|
|
90
92
|
|
|
91
|
-
|
|
92
93
|
const context = {
|
|
93
94
|
test,
|
|
94
95
|
bru,
|
|
@@ -173,6 +174,7 @@ class TestRuntime {
|
|
|
173
174
|
request,
|
|
174
175
|
envVariables: cleanJson(envVariables),
|
|
175
176
|
runtimeVariables: cleanJson(runtimeVariables),
|
|
177
|
+
globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
|
|
176
178
|
results: cleanJson(__brunoTestResults.getResults()),
|
|
177
179
|
nextRequestName: bru.nextRequest
|
|
178
180
|
};
|
|
@@ -60,7 +60,9 @@ class VarsRuntime {
|
|
|
60
60
|
_.each(enabledVars, (v) => {
|
|
61
61
|
try {
|
|
62
62
|
const value = evaluateJsExpressionBasedOnRuntime(v.value, context, this.runtime);
|
|
63
|
-
|
|
63
|
+
if (v.name) {
|
|
64
|
+
bru.setVar(v.name, value);
|
|
65
|
+
}
|
|
64
66
|
} catch (error) {
|
|
65
67
|
errors.set(v.name, error);
|
|
66
68
|
}
|
|
@@ -21,6 +21,12 @@ const addBruShimToContext = (vm, bru) => {
|
|
|
21
21
|
vm.setProp(bruObject, 'getProcessEnv', getProcessEnv);
|
|
22
22
|
getProcessEnv.dispose();
|
|
23
23
|
|
|
24
|
+
let hasEnvVar = vm.newFunction('hasEnvVar', function (key) {
|
|
25
|
+
return marshallToVm(bru.hasEnvVar(vm.dump(key)), vm);
|
|
26
|
+
});
|
|
27
|
+
vm.setProp(bruObject, 'hasEnvVar', hasEnvVar);
|
|
28
|
+
hasEnvVar.dispose();
|
|
29
|
+
|
|
24
30
|
let getEnvVar = vm.newFunction('getEnvVar', function (key) {
|
|
25
31
|
return marshallToVm(bru.getEnvVar(vm.dump(key)), vm);
|
|
26
32
|
});
|
|
@@ -33,6 +39,24 @@ const addBruShimToContext = (vm, bru) => {
|
|
|
33
39
|
vm.setProp(bruObject, 'setEnvVar', setEnvVar);
|
|
34
40
|
setEnvVar.dispose();
|
|
35
41
|
|
|
42
|
+
let getGlobalEnvVar = vm.newFunction('getGlobalEnvVar', function (key) {
|
|
43
|
+
return marshallToVm(bru.getGlobalEnvVar(vm.dump(key)), vm);
|
|
44
|
+
});
|
|
45
|
+
vm.setProp(bruObject, 'getGlobalEnvVar', getGlobalEnvVar);
|
|
46
|
+
getGlobalEnvVar.dispose();
|
|
47
|
+
|
|
48
|
+
let setGlobalEnvVar = vm.newFunction('setGlobalEnvVar', function (key, value) {
|
|
49
|
+
bru.setGlobalEnvVar(vm.dump(key), vm.dump(value));
|
|
50
|
+
});
|
|
51
|
+
vm.setProp(bruObject, 'setGlobalEnvVar', setGlobalEnvVar);
|
|
52
|
+
setGlobalEnvVar.dispose();
|
|
53
|
+
|
|
54
|
+
let hasVar = vm.newFunction('hasVar', function (key) {
|
|
55
|
+
return marshallToVm(bru.hasVar(vm.dump(key)), vm);
|
|
56
|
+
});
|
|
57
|
+
vm.setProp(bruObject, 'hasVar', hasVar);
|
|
58
|
+
hasVar.dispose();
|
|
59
|
+
|
|
36
60
|
let getVar = vm.newFunction('getVar', function (key) {
|
|
37
61
|
return marshallToVm(bru.getVar(vm.dump(key)), vm);
|
|
38
62
|
});
|
|
@@ -45,6 +69,18 @@ const addBruShimToContext = (vm, bru) => {
|
|
|
45
69
|
vm.setProp(bruObject, 'setVar', setVar);
|
|
46
70
|
setVar.dispose();
|
|
47
71
|
|
|
72
|
+
let deleteVar = vm.newFunction('deleteVar', function (key) {
|
|
73
|
+
bru.deleteVar(vm.dump(key));
|
|
74
|
+
});
|
|
75
|
+
vm.setProp(bruObject, 'deleteVar', deleteVar);
|
|
76
|
+
deleteVar.dispose();
|
|
77
|
+
|
|
78
|
+
let deleteAllVars = vm.newFunction('deleteAllVars', function () {
|
|
79
|
+
bru.deleteAllVars();
|
|
80
|
+
});
|
|
81
|
+
vm.setProp(bruObject, 'deleteAllVars', deleteAllVars);
|
|
82
|
+
deleteAllVars.dispose();
|
|
83
|
+
|
|
48
84
|
let setNextRequest = vm.newFunction('setNextRequest', function (nextRequest) {
|
|
49
85
|
bru.setNextRequest(vm.dump(nextRequest));
|
|
50
86
|
});
|