@usebruno/js 0.14.0 → 0.16.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 +22 -4
- package/src/bru.js +48 -22
- package/src/bruno-request.js +101 -3
- package/src/interpolate-string.js +4 -2
- package/src/runtime/assert-runtime.js +52 -20
- package/src/runtime/script-runtime.js +64 -39
- package/src/runtime/test-runtime.js +62 -55
- package/src/runtime/vars-runtime.js +22 -60
- package/src/sandbox/bundle-browser-rollup.js +502 -0
- package/src/sandbox/bundle-libraries.js +88 -0
- package/src/sandbox/quickjs/index.js +193 -0
- package/src/sandbox/quickjs/shims/bru.js +99 -0
- package/src/sandbox/quickjs/shims/bruno-request.js +112 -0
- package/src/sandbox/quickjs/shims/bruno-response.js +55 -0
- package/src/sandbox/quickjs/shims/console.js +46 -0
- package/src/sandbox/quickjs/shims/lib/axios.js +72 -0
- package/src/sandbox/quickjs/shims/lib/index.js +13 -0
- package/src/sandbox/quickjs/shims/lib/nanoid.js +24 -0
- package/src/sandbox/quickjs/shims/lib/path.js +28 -0
- package/src/sandbox/quickjs/shims/lib/uuid.js +30 -0
- package/src/sandbox/quickjs/shims/local-module.js +35 -0
- package/src/sandbox/quickjs/shims/test.js +63 -0
- package/src/sandbox/quickjs/utils/index.js +33 -0
- package/src/utils.js +6 -1
|
@@ -15,7 +15,7 @@ const BrunoRequest = require('../bruno-request');
|
|
|
15
15
|
const BrunoResponse = require('../bruno-response');
|
|
16
16
|
const Test = require('../test');
|
|
17
17
|
const TestResults = require('../test-results');
|
|
18
|
-
const { cleanJson } = require('../utils');
|
|
18
|
+
const { cleanJson, appendAwaitToTestFunc } = require('../utils');
|
|
19
19
|
|
|
20
20
|
// Inbuilt Library Support
|
|
21
21
|
const ajv = require('ajv');
|
|
@@ -29,17 +29,20 @@ const nanoid = require('nanoid');
|
|
|
29
29
|
const axios = require('axios');
|
|
30
30
|
const fetch = require('node-fetch');
|
|
31
31
|
const CryptoJS = require('crypto-js');
|
|
32
|
-
const
|
|
32
|
+
const NodeVault = require('node-vault');
|
|
33
|
+
const { executeQuickJsVmAsync } = require('../sandbox/quickjs');
|
|
33
34
|
|
|
34
35
|
class TestRuntime {
|
|
35
|
-
constructor() {
|
|
36
|
+
constructor(props) {
|
|
37
|
+
this.runtime = props?.runtime || 'vm2';
|
|
38
|
+
}
|
|
36
39
|
|
|
37
40
|
async runTests(
|
|
38
41
|
testsFile,
|
|
39
42
|
request,
|
|
40
43
|
response,
|
|
41
44
|
envVariables,
|
|
42
|
-
|
|
45
|
+
runtimeVariables,
|
|
43
46
|
collectionPath,
|
|
44
47
|
onConsoleLog,
|
|
45
48
|
processEnvVars,
|
|
@@ -47,17 +50,10 @@ class TestRuntime {
|
|
|
47
50
|
historyLogger,
|
|
48
51
|
secretVariables
|
|
49
52
|
) {
|
|
53
|
+
const collectionVariables = request?.collectionVariables || {};
|
|
54
|
+
const folderVariables = request?.folderVariables || {};
|
|
50
55
|
const requestVariables = request?.requestVariables || {};
|
|
51
|
-
const bru = new Bru(
|
|
52
|
-
envVariables,
|
|
53
|
-
collectionVariables,
|
|
54
|
-
processEnvVars,
|
|
55
|
-
collectionPath,
|
|
56
|
-
historyLogger,
|
|
57
|
-
undefined, // setHtmlVisualizationString
|
|
58
|
-
secretVariables,
|
|
59
|
-
requestVariables
|
|
60
|
-
);
|
|
56
|
+
const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, undefined, secretVariables, collectionVariables, folderVariables, requestVariables);
|
|
61
57
|
const req = new BrunoRequest(request, historyLogger);
|
|
62
58
|
const res = new BrunoResponse(response);
|
|
63
59
|
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
@@ -86,11 +82,13 @@ class TestRuntime {
|
|
|
86
82
|
return {
|
|
87
83
|
request,
|
|
88
84
|
envVariables,
|
|
89
|
-
|
|
90
|
-
results: __brunoTestResults.getResults()
|
|
85
|
+
runtimeVariables,
|
|
86
|
+
results: __brunoTestResults.getResults(),
|
|
87
|
+
nextRequestName: bru.nextRequest
|
|
91
88
|
};
|
|
92
89
|
}
|
|
93
90
|
|
|
91
|
+
|
|
94
92
|
const context = {
|
|
95
93
|
test,
|
|
96
94
|
bru,
|
|
@@ -111,48 +109,56 @@ class TestRuntime {
|
|
|
111
109
|
log: customLogger('log'),
|
|
112
110
|
info: customLogger('info'),
|
|
113
111
|
warn: customLogger('warn'),
|
|
112
|
+
debug: customLogger('debug'),
|
|
114
113
|
error: customLogger('error')
|
|
115
114
|
};
|
|
116
115
|
}
|
|
117
116
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
context:
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
117
|
+
if (this.runtime === 'quickjs') {
|
|
118
|
+
await executeQuickJsVmAsync({
|
|
119
|
+
script: testsFile,
|
|
120
|
+
context: context
|
|
121
|
+
});
|
|
122
|
+
} else {
|
|
123
|
+
// default runtime is vm2
|
|
124
|
+
const vm = new NodeVM({
|
|
125
|
+
sandbox: context,
|
|
126
|
+
require: {
|
|
127
|
+
context: 'sandbox',
|
|
128
|
+
external: true,
|
|
129
|
+
root: [collectionPath, ...additionalContextRootsAbsolute],
|
|
130
|
+
mock: {
|
|
131
|
+
// node libs
|
|
132
|
+
path,
|
|
133
|
+
stream,
|
|
134
|
+
util,
|
|
135
|
+
url,
|
|
136
|
+
http,
|
|
137
|
+
https,
|
|
138
|
+
punycode,
|
|
139
|
+
zlib,
|
|
140
|
+
// 3rd party libs
|
|
141
|
+
ajv,
|
|
142
|
+
'ajv-formats': addFormats,
|
|
143
|
+
btoa,
|
|
144
|
+
atob,
|
|
145
|
+
lodash,
|
|
146
|
+
moment,
|
|
147
|
+
uuid,
|
|
148
|
+
nanoid,
|
|
149
|
+
axios,
|
|
150
|
+
chai,
|
|
151
|
+
'node-fetch': fetch,
|
|
152
|
+
'crypto-js': CryptoJS,
|
|
153
|
+
...whitelistedModules,
|
|
154
|
+
fs: allowScriptFilesystemAccess ? fs : undefined,
|
|
155
|
+
'node-vault': NodeVault
|
|
156
|
+
}
|
|
150
157
|
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
await asyncVM();
|
|
158
|
+
});
|
|
159
|
+
const asyncVM = vm.run(`module.exports = async () => { ${testsFile}}`, path.join(collectionPath, 'vm.js'));
|
|
160
|
+
await asyncVM();
|
|
161
|
+
}
|
|
156
162
|
|
|
157
163
|
if (historyLogger) {
|
|
158
164
|
historyLogger({
|
|
@@ -166,8 +172,9 @@ class TestRuntime {
|
|
|
166
172
|
return {
|
|
167
173
|
request,
|
|
168
174
|
envVariables: cleanJson(envVariables),
|
|
169
|
-
|
|
170
|
-
results: cleanJson(__brunoTestResults.getResults())
|
|
175
|
+
runtimeVariables: cleanJson(runtimeVariables),
|
|
176
|
+
results: cleanJson(__brunoTestResults.getResults()),
|
|
177
|
+
nextRequestName: bru.nextRequest
|
|
171
178
|
};
|
|
172
179
|
}
|
|
173
180
|
}
|
|
@@ -1,67 +1,29 @@
|
|
|
1
1
|
const _ = require('lodash');
|
|
2
2
|
const Bru = require('../bru');
|
|
3
3
|
const BrunoRequest = require('../bruno-request');
|
|
4
|
-
const {
|
|
4
|
+
const { evaluateJsExpression, createResponseParser } = require('../utils');
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
runPreRequestVars(
|
|
8
|
-
vars,
|
|
9
|
-
request,
|
|
10
|
-
envVariables,
|
|
11
|
-
collectionVariables,
|
|
12
|
-
collectionPath,
|
|
13
|
-
processEnvVars,
|
|
14
|
-
historyLogger,
|
|
15
|
-
secretVars = {}
|
|
16
|
-
) {
|
|
17
|
-
if (!request?.requestVariables) {
|
|
18
|
-
request.requestVariables = {};
|
|
19
|
-
}
|
|
20
|
-
const enabledVars = _.filter(vars, (v) => v.enabled);
|
|
21
|
-
if (!enabledVars.length) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const bru = new Bru(
|
|
26
|
-
envVariables,
|
|
27
|
-
collectionVariables,
|
|
28
|
-
processEnvVars,
|
|
29
|
-
null,
|
|
30
|
-
historyLogger,
|
|
31
|
-
undefined, // setHtmlVisualizationString
|
|
32
|
-
secretVars
|
|
33
|
-
);
|
|
34
|
-
const req = new BrunoRequest(request, historyLogger);
|
|
6
|
+
const { executeQuickJsVm } = require('../sandbox/quickjs');
|
|
35
7
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
8
|
+
const evaluateJsExpressionBasedOnRuntime = (expr, context, runtime, mode) => {
|
|
9
|
+
if (runtime === 'quickjs') {
|
|
10
|
+
return executeQuickJsVm({
|
|
11
|
+
script: expr,
|
|
12
|
+
context,
|
|
13
|
+
scriptType: 'expression'
|
|
14
|
+
});
|
|
15
|
+
}
|
|
40
16
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
...collectionVariables,
|
|
44
|
-
...secretVars,
|
|
45
|
-
...bruContext
|
|
46
|
-
};
|
|
17
|
+
return evaluateJsExpression(expr, context);
|
|
18
|
+
};
|
|
47
19
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
20
|
+
class VarsRuntime {
|
|
21
|
+
constructor(props) {
|
|
22
|
+
this.runtime = props?.runtime || 'vm2';
|
|
23
|
+
this.mode = props?.mode || 'developer';
|
|
52
24
|
}
|
|
53
25
|
|
|
54
|
-
runPostResponseVars(
|
|
55
|
-
vars,
|
|
56
|
-
request,
|
|
57
|
-
response,
|
|
58
|
-
envVariables,
|
|
59
|
-
collectionVariables,
|
|
60
|
-
collectionPath,
|
|
61
|
-
processEnvVars,
|
|
62
|
-
historyLogger,
|
|
63
|
-
secretVars = {}
|
|
64
|
-
) {
|
|
26
|
+
runPostResponseVars(vars, request, response, envVariables, runtimeVariables, collectionPath, processEnvVars, historyLogger, secretVars = {}) {
|
|
65
27
|
const requestVariables = request?.requestVariables || {};
|
|
66
28
|
const enabledVars = _.filter(vars, (v) => v.enabled);
|
|
67
29
|
if (!enabledVars.length) {
|
|
@@ -70,11 +32,11 @@ class VarsRuntime {
|
|
|
70
32
|
|
|
71
33
|
const bru = new Bru(
|
|
72
34
|
envVariables,
|
|
73
|
-
|
|
35
|
+
runtimeVariables,
|
|
74
36
|
processEnvVars,
|
|
75
37
|
null,
|
|
76
38
|
historyLogger,
|
|
77
|
-
undefined, //
|
|
39
|
+
undefined, // setVisualizations
|
|
78
40
|
secretVars,
|
|
79
41
|
requestVariables
|
|
80
42
|
);
|
|
@@ -89,7 +51,7 @@ class VarsRuntime {
|
|
|
89
51
|
|
|
90
52
|
const context = {
|
|
91
53
|
...envVariables,
|
|
92
|
-
...
|
|
54
|
+
...runtimeVariables,
|
|
93
55
|
...secretVars,
|
|
94
56
|
...bruContext
|
|
95
57
|
};
|
|
@@ -97,7 +59,7 @@ class VarsRuntime {
|
|
|
97
59
|
const errors = new Map();
|
|
98
60
|
_.each(enabledVars, (v) => {
|
|
99
61
|
try {
|
|
100
|
-
const value =
|
|
62
|
+
const value = evaluateJsExpressionBasedOnRuntime(v.value, context, this.runtime);
|
|
101
63
|
bru.setVar(v.name, value);
|
|
102
64
|
} catch (error) {
|
|
103
65
|
errors.set(v.name, error);
|
|
@@ -113,7 +75,7 @@ class VarsRuntime {
|
|
|
113
75
|
|
|
114
76
|
return {
|
|
115
77
|
envVariables,
|
|
116
|
-
|
|
78
|
+
runtimeVariables,
|
|
117
79
|
error
|
|
118
80
|
};
|
|
119
81
|
}
|