@usebruno/js 0.27.0 → 0.29.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 +2 -2
- package/src/bru.js +49 -3
- package/src/bruno-response.js +4 -2
- package/src/runtime/assert-runtime.js +3 -1
- package/src/runtime/script-runtime.js +13 -3
- package/src/runtime/test-runtime.js +3 -2
- package/src/runtime/vars-runtime.js +8 -10
- package/src/sandbox/quickjs/shims/bru.js +43 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usebruno/js",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"files": [
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"sandbox:bundle-libraries": "node ./src/sandbox/bundle-libraries.js"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@usebruno/common": "0.
|
|
18
|
+
"@usebruno/common": "0.4.0",
|
|
19
19
|
"@usebruno/crypto-js": "^3.1.9",
|
|
20
20
|
"@usebruno/query": "0.1.0",
|
|
21
21
|
"ajv": "^8.12.0",
|
package/src/bru.js
CHANGED
|
@@ -5,7 +5,8 @@ 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, globalEnvironmentVariables, oauth2CredentialVariables) {
|
|
8
|
+
constructor(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables, oauth2CredentialVariables, iterationDetails) {
|
|
9
|
+
|
|
9
10
|
this.envVariables = envVariables || {};
|
|
10
11
|
this.runtimeVariables = runtimeVariables || {};
|
|
11
12
|
this.processEnvVars = cloneDeep(processEnvVars || {});
|
|
@@ -18,6 +19,7 @@ class Bru {
|
|
|
18
19
|
this.collectionPath = collectionPath;
|
|
19
20
|
this.historyLogger = historyLogger;
|
|
20
21
|
this.setVisualizations = setVisualizations;
|
|
22
|
+
|
|
21
23
|
this.runner = {
|
|
22
24
|
skipRequest: () => {
|
|
23
25
|
this.skipRequest = true;
|
|
@@ -27,9 +29,14 @@ class Bru {
|
|
|
27
29
|
},
|
|
28
30
|
setNextRequest: (nextRequest) => {
|
|
29
31
|
this.nextRequest = nextRequest;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
+
},
|
|
33
|
+
iterationData: new IterationDataManager(iterationDetails?.iterationData),
|
|
34
|
+
iterationIndex: iterationDetails?.iterationIndex,
|
|
35
|
+
totalIterations: iterationDetails?.totalIterations
|
|
36
|
+
};
|
|
37
|
+
|
|
32
38
|
}
|
|
39
|
+
|
|
33
40
|
|
|
34
41
|
_interpolate = (str) => {
|
|
35
42
|
if (!str || !str.length || typeof str !== 'string') {
|
|
@@ -210,4 +217,43 @@ class Bru {
|
|
|
210
217
|
}
|
|
211
218
|
}
|
|
212
219
|
|
|
220
|
+
class IterationDataManager {
|
|
221
|
+
constructor(iterationData) {
|
|
222
|
+
this._data = iterationData;
|
|
223
|
+
|
|
224
|
+
if (!this._data) {
|
|
225
|
+
this._data = {};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
set(key, value) {
|
|
230
|
+
if (!this._data) {
|
|
231
|
+
this._data = {};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
this._data[key] = value;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
get(key) {
|
|
238
|
+
if (!key) {
|
|
239
|
+
return this._data || {};
|
|
240
|
+
}
|
|
241
|
+
return this._data?.[key];
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
has(key) {
|
|
245
|
+
return this._data && key in this._data;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
stringify() {
|
|
249
|
+
return JSON.stringify(this.get());
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
unset(key) {
|
|
253
|
+
if (this._data[key]) {
|
|
254
|
+
delete this._data[key];
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
213
259
|
module.exports = Bru;
|
package/src/bruno-response.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const { get } = require('@usebruno/query');
|
|
2
|
+
const _ = require('lodash');
|
|
2
3
|
|
|
3
4
|
class BrunoResponse {
|
|
4
5
|
constructor(res) {
|
|
@@ -46,8 +47,9 @@ class BrunoResponse {
|
|
|
46
47
|
return;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
this.res.data =
|
|
50
|
+
const clonedData = _.cloneDeep(data);
|
|
51
|
+
this.res.data = clonedData;
|
|
52
|
+
this.body = clonedData;
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
55
|
|
|
@@ -250,6 +250,7 @@ class AssertRuntime {
|
|
|
250
250
|
const collectionVariables = request?.collectionVariables || {};
|
|
251
251
|
const folderVariables = request?.folderVariables || {};
|
|
252
252
|
const requestVariables = request?.requestVariables || {};
|
|
253
|
+
const iterationDetails = request?.runnerIterationDetails || {};
|
|
253
254
|
const enabledAssertions = _.filter(assertions, (a) => a.enabled);
|
|
254
255
|
if (!enabledAssertions.length) {
|
|
255
256
|
return [];
|
|
@@ -267,7 +268,8 @@ class AssertRuntime {
|
|
|
267
268
|
folderVariables,
|
|
268
269
|
requestVariables,
|
|
269
270
|
globalEnvironmentVariables,
|
|
270
|
-
oauth2CredentialVariables
|
|
271
|
+
oauth2CredentialVariables,
|
|
272
|
+
iterationDetails
|
|
271
273
|
);
|
|
272
274
|
const req = new BrunoRequest(request, historyLogger);
|
|
273
275
|
const res = createResponseParser(response);
|
|
@@ -61,7 +61,9 @@ class ScriptRuntime {
|
|
|
61
61
|
const collectionVariables = request?.collectionVariables || {};
|
|
62
62
|
const folderVariables = request?.folderVariables || {};
|
|
63
63
|
const requestVariables = request?.requestVariables || {};
|
|
64
|
-
const
|
|
64
|
+
const iterationDetails = request?.runnerIterationDetails || {};
|
|
65
|
+
// TODO please clean this up
|
|
66
|
+
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables, oauth2CredentialVariables, iterationDetails);
|
|
65
67
|
const req = new BrunoRequest(request);
|
|
66
68
|
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
67
69
|
const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
|
|
@@ -202,11 +204,17 @@ class ScriptRuntime {
|
|
|
202
204
|
const collectionVariables = request?.collectionVariables || {};
|
|
203
205
|
const folderVariables = request?.folderVariables || {};
|
|
204
206
|
const requestVariables = request?.requestVariables || {};
|
|
205
|
-
const
|
|
207
|
+
const iterationDetails = request?.runnerIterationDetails || {};
|
|
208
|
+
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables, oauth2CredentialVariables, iterationDetails);
|
|
206
209
|
const req = new BrunoRequest(request);
|
|
207
210
|
const res = new BrunoResponse(response);
|
|
208
211
|
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
209
212
|
const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
|
|
213
|
+
const additionalContextRoots = get(scriptingConfig, 'additionalContextRoots', []);
|
|
214
|
+
const additionalContextRootsAbsolute = lodash
|
|
215
|
+
.chain(additionalContextRoots)
|
|
216
|
+
.map((acr) => (acr.startsWith('/') ? acr : path.join(collectionPath, acr)))
|
|
217
|
+
.value();
|
|
210
218
|
|
|
211
219
|
const whitelistedModules = {};
|
|
212
220
|
|
|
@@ -270,7 +278,7 @@ class ScriptRuntime {
|
|
|
270
278
|
context: 'sandbox',
|
|
271
279
|
builtin: [ "*" ],
|
|
272
280
|
external: true,
|
|
273
|
-
root: [collectionPath],
|
|
281
|
+
root: [collectionPath, ...additionalContextRootsAbsolute],
|
|
274
282
|
mock: {
|
|
275
283
|
// node libs
|
|
276
284
|
path,
|
|
@@ -293,6 +301,8 @@ class ScriptRuntime {
|
|
|
293
301
|
axios,
|
|
294
302
|
'node-fetch': fetch,
|
|
295
303
|
'crypto-js': CryptoJS,
|
|
304
|
+
'xml2js': xml2js,
|
|
305
|
+
cheerio,
|
|
296
306
|
...whitelistedModules,
|
|
297
307
|
fs: allowScriptFilesystemAccess ? fs : undefined,
|
|
298
308
|
'node-vault': NodeVault
|
|
@@ -77,8 +77,9 @@ class TestRuntime {
|
|
|
77
77
|
const collectionVariables = request?.collectionVariables || {};
|
|
78
78
|
const folderVariables = request?.folderVariables || {};
|
|
79
79
|
const requestVariables = request?.requestVariables || {};
|
|
80
|
-
const
|
|
81
|
-
const
|
|
80
|
+
const iterationDetails = request?.runnerIterationDetails || {};
|
|
81
|
+
const assertionResults = request?.assertionResults || [];
|
|
82
|
+
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, undefined, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables, oauth2CredentialVariables, iterationDetails);
|
|
82
83
|
const req = new BrunoRequest(request, historyLogger);
|
|
83
84
|
const res = new BrunoResponse(response);
|
|
84
85
|
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
@@ -2,6 +2,7 @@ const _ = require('lodash');
|
|
|
2
2
|
const Bru = require('../bru');
|
|
3
3
|
const BrunoRequest = require('../bruno-request');
|
|
4
4
|
const { evaluateJsExpression, createResponseParser } = require('../utils');
|
|
5
|
+
const { cleanJson } = require('../utils');
|
|
5
6
|
|
|
6
7
|
const { executeQuickJsVm } = require('../sandbox/quickjs');
|
|
7
8
|
|
|
@@ -25,21 +26,17 @@ class VarsRuntime {
|
|
|
25
26
|
|
|
26
27
|
runPostResponseVars(vars, request, response, envVariables, runtimeVariables, collectionPath, processEnvVars, historyLogger, secretVars = {}) {
|
|
27
28
|
const requestVariables = request?.requestVariables || {};
|
|
29
|
+
const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
|
|
30
|
+
const oauth2CredentialVariables = request?.oauth2CredentialVariables || {};
|
|
31
|
+
const collectionVariables = request?.collectionVariables || {};
|
|
32
|
+
const folderVariables = request?.folderVariables || {};
|
|
33
|
+
const iterationDetails = request?.runnerIterationDetails || {};
|
|
28
34
|
const enabledVars = _.filter(vars, (v) => v.enabled);
|
|
29
35
|
if (!enabledVars.length) {
|
|
30
36
|
return;
|
|
31
37
|
}
|
|
32
38
|
|
|
33
|
-
const bru = new Bru(
|
|
34
|
-
envVariables,
|
|
35
|
-
runtimeVariables,
|
|
36
|
-
processEnvVars,
|
|
37
|
-
null,
|
|
38
|
-
historyLogger,
|
|
39
|
-
undefined, // setVisualizations
|
|
40
|
-
secretVars,
|
|
41
|
-
requestVariables
|
|
42
|
-
);
|
|
39
|
+
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, undefined, secretVars, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables, oauth2CredentialVariables, iterationDetails);
|
|
43
40
|
const req = new BrunoRequest(request, historyLogger);
|
|
44
41
|
const res = createResponseParser(response);
|
|
45
42
|
|
|
@@ -78,6 +75,7 @@ class VarsRuntime {
|
|
|
78
75
|
return {
|
|
79
76
|
envVariables,
|
|
80
77
|
runtimeVariables,
|
|
78
|
+
globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
|
|
81
79
|
error
|
|
82
80
|
};
|
|
83
81
|
}
|
|
@@ -4,6 +4,7 @@ const { marshallToVm } = require('../utils');
|
|
|
4
4
|
const addBruShimToContext = (vm, bru) => {
|
|
5
5
|
const bruObject = vm.newObject();
|
|
6
6
|
const bruRunnerObject = vm.newObject();
|
|
7
|
+
const bruRunnerIterationDataObject = vm.newObject();
|
|
7
8
|
|
|
8
9
|
let cwd = vm.newFunction('cwd', function () {
|
|
9
10
|
return marshallToVm(bru.cwd(), vm);
|
|
@@ -119,6 +120,47 @@ const addBruShimToContext = (vm, bru) => {
|
|
|
119
120
|
vm.setProp(bruRunnerObject, 'setNextRequest', runnerSetNextRequest);
|
|
120
121
|
runnerSetNextRequest.dispose();
|
|
121
122
|
|
|
123
|
+
let runnerIterationIndex = marshallToVm(bru?.runner?.iterationIndex, vm);
|
|
124
|
+
vm.setProp(bruRunnerObject, 'iterationIndex', runnerIterationIndex);
|
|
125
|
+
runnerIterationIndex.dispose();
|
|
126
|
+
|
|
127
|
+
let runnerTotalIterations = marshallToVm(bru?.runner?.totalIterations, vm);
|
|
128
|
+
vm.setProp(bruRunnerObject, 'totalIterations', runnerTotalIterations);
|
|
129
|
+
runnerTotalIterations.dispose();
|
|
130
|
+
|
|
131
|
+
let runnerSetIterationData = vm.newFunction('set', function (key, value) {
|
|
132
|
+
bru?.runner?.iterationData?.set(vm.dump(key), vm.dump(value));
|
|
133
|
+
});
|
|
134
|
+
vm.setProp(bruRunnerIterationDataObject, 'set', runnerSetIterationData);
|
|
135
|
+
runnerSetIterationData.dispose();
|
|
136
|
+
|
|
137
|
+
let runnerUnsetIterationData = vm.newFunction('unset', function (key) {
|
|
138
|
+
bru?.runner?.iterationData?.unset(vm.dump(key));
|
|
139
|
+
});
|
|
140
|
+
vm.setProp(bruRunnerIterationDataObject, 'unset', runnerUnsetIterationData);
|
|
141
|
+
runnerUnsetIterationData.dispose();
|
|
142
|
+
|
|
143
|
+
let runnerGetIterationData = vm.newFunction('get', function (key) {
|
|
144
|
+
if (key) {
|
|
145
|
+
return marshallToVm(bru?.runner?.iterationData?.get(vm.dump(key)), vm);
|
|
146
|
+
}
|
|
147
|
+
return marshallToVm(bru?.runner?.iterationData?.get(), vm);
|
|
148
|
+
});
|
|
149
|
+
vm.setProp(bruRunnerIterationDataObject, 'get', runnerGetIterationData);
|
|
150
|
+
runnerGetIterationData.dispose();
|
|
151
|
+
|
|
152
|
+
let runnerHasIterationData = vm.newFunction('has', function (key) {
|
|
153
|
+
return marshallToVm(bru?.runner?.iterationData?.has(vm.dump(key)), vm);
|
|
154
|
+
});
|
|
155
|
+
vm.setProp(bruRunnerIterationDataObject, 'has', runnerHasIterationData);
|
|
156
|
+
runnerHasIterationData.dispose();
|
|
157
|
+
|
|
158
|
+
let runnerStringifyIterationData = vm.newFunction('stringify', function () {
|
|
159
|
+
return marshallToVm(bru?.runner?.iterationData?.stringify(), vm);
|
|
160
|
+
});
|
|
161
|
+
vm.setProp(bruRunnerIterationDataObject, 'stringify', runnerStringifyIterationData);
|
|
162
|
+
runnerStringifyIterationData.dispose();
|
|
163
|
+
|
|
122
164
|
let visualize = vm.newFunction('visualize', function (type, data) {
|
|
123
165
|
bru.visualize(vm.dump(type), vm.dump(data));
|
|
124
166
|
});
|
|
@@ -224,6 +266,7 @@ const addBruShimToContext = (vm, bru) => {
|
|
|
224
266
|
});
|
|
225
267
|
sleep.consume((handle) => vm.setProp(bruObject, 'sleep', handle));
|
|
226
268
|
|
|
269
|
+
vm.setProp(bruRunnerObject, 'iterationData', bruRunnerIterationDataObject);
|
|
227
270
|
vm.setProp(bruObject, 'runner', bruRunnerObject);
|
|
228
271
|
vm.setProp(vm.global, 'bru', bruObject);
|
|
229
272
|
bruObject.dispose();
|