@usebruno/js 0.6.0 → 0.8.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 +6 -1
- package/src/runtime/script-runtime.js +52 -6
- package/src/runtime/test-runtime.js +43 -5
- package/src/test.js +2 -2
- package/src/utils.js +2 -2
package/package.json
CHANGED
package/src/bru.js
CHANGED
|
@@ -2,10 +2,11 @@ const Handlebars = require('handlebars');
|
|
|
2
2
|
const { cloneDeep } = require('lodash');
|
|
3
3
|
|
|
4
4
|
class Bru {
|
|
5
|
-
constructor(envVariables, collectionVariables, processEnvVars) {
|
|
5
|
+
constructor(envVariables, collectionVariables, processEnvVars, collectionPath) {
|
|
6
6
|
this.envVariables = envVariables;
|
|
7
7
|
this.collectionVariables = collectionVariables;
|
|
8
8
|
this.processEnvVars = cloneDeep(processEnvVars || {});
|
|
9
|
+
this.collectionPath = collectionPath;
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
_interpolateEnvVar = (str) => {
|
|
@@ -24,6 +25,10 @@ class Bru {
|
|
|
24
25
|
});
|
|
25
26
|
};
|
|
26
27
|
|
|
28
|
+
cwd() {
|
|
29
|
+
return this.collectionPath;
|
|
30
|
+
}
|
|
31
|
+
|
|
27
32
|
getEnvName() {
|
|
28
33
|
return this.envVariables.__name__;
|
|
29
34
|
}
|
|
@@ -7,6 +7,8 @@ const util = require('util');
|
|
|
7
7
|
const zlib = require('zlib');
|
|
8
8
|
const url = require('url');
|
|
9
9
|
const punycode = require('punycode');
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const { get } = require('lodash');
|
|
10
12
|
const Bru = require('../bru');
|
|
11
13
|
const BrunoRequest = require('../bruno-request');
|
|
12
14
|
const BrunoResponse = require('../bruno-response');
|
|
@@ -27,6 +29,8 @@ const CryptoJS = require('crypto-js');
|
|
|
27
29
|
class ScriptRuntime {
|
|
28
30
|
constructor() {}
|
|
29
31
|
|
|
32
|
+
// This approach is getting out of hand
|
|
33
|
+
// Need to refactor this to use a single arg (object) instead of 7
|
|
30
34
|
async runRequestScript(
|
|
31
35
|
script,
|
|
32
36
|
request,
|
|
@@ -34,10 +38,24 @@ class ScriptRuntime {
|
|
|
34
38
|
collectionVariables,
|
|
35
39
|
collectionPath,
|
|
36
40
|
onConsoleLog,
|
|
37
|
-
processEnvVars
|
|
41
|
+
processEnvVars,
|
|
42
|
+
scriptingConfig,
|
|
38
43
|
) {
|
|
39
|
-
const bru = new Bru(envVariables, collectionVariables, processEnvVars);
|
|
44
|
+
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
|
|
40
45
|
const req = new BrunoRequest(request);
|
|
46
|
+
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
47
|
+
const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
|
|
48
|
+
|
|
49
|
+
const whitelistedModules = {};
|
|
50
|
+
|
|
51
|
+
for(let module of moduleWhitelist) {
|
|
52
|
+
try {
|
|
53
|
+
whitelistedModules[module] = require(module);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
// Ignore
|
|
56
|
+
console.warn(e);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
41
59
|
|
|
42
60
|
const context = {
|
|
43
61
|
bru,
|
|
@@ -84,7 +102,9 @@ class ScriptRuntime {
|
|
|
84
102
|
axios,
|
|
85
103
|
chai,
|
|
86
104
|
'node-fetch': fetch,
|
|
87
|
-
'crypto-js': CryptoJS
|
|
105
|
+
'crypto-js': CryptoJS,
|
|
106
|
+
...whitelistedModules,
|
|
107
|
+
fs: allowScriptFilesystemAccess ? fs : undefined
|
|
88
108
|
}
|
|
89
109
|
}
|
|
90
110
|
});
|
|
@@ -105,11 +125,25 @@ class ScriptRuntime {
|
|
|
105
125
|
collectionVariables,
|
|
106
126
|
collectionPath,
|
|
107
127
|
onConsoleLog,
|
|
108
|
-
processEnvVars
|
|
128
|
+
processEnvVars,
|
|
129
|
+
scriptingConfig
|
|
109
130
|
) {
|
|
110
|
-
const bru = new Bru(envVariables, collectionVariables, processEnvVars);
|
|
131
|
+
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
|
|
111
132
|
const req = new BrunoRequest(request);
|
|
112
133
|
const res = new BrunoResponse(response);
|
|
134
|
+
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
135
|
+
const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
|
|
136
|
+
|
|
137
|
+
const whitelistedModules = {};
|
|
138
|
+
|
|
139
|
+
for(let module of moduleWhitelist) {
|
|
140
|
+
try {
|
|
141
|
+
whitelistedModules[module] = require(module);
|
|
142
|
+
} catch (e) {
|
|
143
|
+
// Ignore
|
|
144
|
+
console.warn(e);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
113
147
|
|
|
114
148
|
const context = {
|
|
115
149
|
bru,
|
|
@@ -138,6 +172,16 @@ class ScriptRuntime {
|
|
|
138
172
|
external: true,
|
|
139
173
|
root: [collectionPath],
|
|
140
174
|
mock: {
|
|
175
|
+
// node libs
|
|
176
|
+
path,
|
|
177
|
+
stream,
|
|
178
|
+
util,
|
|
179
|
+
url,
|
|
180
|
+
http,
|
|
181
|
+
https,
|
|
182
|
+
punycode,
|
|
183
|
+
zlib,
|
|
184
|
+
// 3rd party libs
|
|
141
185
|
atob,
|
|
142
186
|
btoa,
|
|
143
187
|
lodash,
|
|
@@ -146,7 +190,9 @@ class ScriptRuntime {
|
|
|
146
190
|
nanoid,
|
|
147
191
|
axios,
|
|
148
192
|
'node-fetch': fetch,
|
|
149
|
-
'crypto-js': CryptoJS
|
|
193
|
+
'crypto-js': CryptoJS,
|
|
194
|
+
...whitelistedModules,
|
|
195
|
+
fs: allowScriptFilesystemAccess ? fs : undefined,
|
|
150
196
|
}
|
|
151
197
|
}
|
|
152
198
|
});
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
const { NodeVM } = require('vm2');
|
|
2
2
|
const chai = require('chai');
|
|
3
3
|
const path = require('path');
|
|
4
|
+
const http = require('http');
|
|
5
|
+
const https = require('https');
|
|
6
|
+
const stream = require('stream');
|
|
7
|
+
const util = require('util');
|
|
8
|
+
const zlib = require('zlib');
|
|
9
|
+
const url = require('url');
|
|
10
|
+
const punycode = require('punycode');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const { get } = require('lodash');
|
|
4
13
|
const Bru = require('../bru');
|
|
5
14
|
const BrunoRequest = require('../bruno-request');
|
|
6
15
|
const BrunoResponse = require('../bruno-response');
|
|
@@ -10,6 +19,7 @@ const { cleanJson } = require('../utils');
|
|
|
10
19
|
|
|
11
20
|
// Inbuilt Library Support
|
|
12
21
|
const atob = require('atob');
|
|
22
|
+
const axios = require('axios');
|
|
13
23
|
const btoa = require('btoa');
|
|
14
24
|
const lodash = require('lodash');
|
|
15
25
|
const moment = require('moment');
|
|
@@ -20,7 +30,7 @@ const CryptoJS = require('crypto-js');
|
|
|
20
30
|
class TestRuntime {
|
|
21
31
|
constructor() {}
|
|
22
32
|
|
|
23
|
-
runTests(
|
|
33
|
+
async runTests(
|
|
24
34
|
testsFile,
|
|
25
35
|
request,
|
|
26
36
|
response,
|
|
@@ -28,11 +38,25 @@ class TestRuntime {
|
|
|
28
38
|
collectionVariables,
|
|
29
39
|
collectionPath,
|
|
30
40
|
onConsoleLog,
|
|
31
|
-
processEnvVars
|
|
41
|
+
processEnvVars,
|
|
42
|
+
scriptingConfig
|
|
32
43
|
) {
|
|
33
|
-
const bru = new Bru(envVariables, collectionVariables, processEnvVars);
|
|
44
|
+
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
|
|
34
45
|
const req = new BrunoRequest(request);
|
|
35
46
|
const res = new BrunoResponse(response);
|
|
47
|
+
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
|
|
48
|
+
const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
|
|
49
|
+
|
|
50
|
+
const whitelistedModules = {};
|
|
51
|
+
|
|
52
|
+
for(let module of moduleWhitelist) {
|
|
53
|
+
try {
|
|
54
|
+
whitelistedModules[module] = require(module);
|
|
55
|
+
} catch (e) {
|
|
56
|
+
// Ignore
|
|
57
|
+
console.warn(e);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
36
60
|
|
|
37
61
|
const __brunoTestResults = new TestResults();
|
|
38
62
|
const test = Test(__brunoTestResults, chai);
|
|
@@ -77,19 +101,33 @@ class TestRuntime {
|
|
|
77
101
|
external: true,
|
|
78
102
|
root: [collectionPath],
|
|
79
103
|
mock: {
|
|
104
|
+
// node libs
|
|
105
|
+
path,
|
|
106
|
+
stream,
|
|
107
|
+
util,
|
|
108
|
+
url,
|
|
109
|
+
http,
|
|
110
|
+
https,
|
|
111
|
+
punycode,
|
|
112
|
+
zlib,
|
|
113
|
+
// 3rd party libs
|
|
80
114
|
atob,
|
|
115
|
+
axios,
|
|
81
116
|
btoa,
|
|
82
117
|
lodash,
|
|
83
118
|
moment,
|
|
84
119
|
uuid,
|
|
85
120
|
nanoid,
|
|
86
121
|
chai,
|
|
87
|
-
'crypto-js': CryptoJS
|
|
122
|
+
'crypto-js': CryptoJS,
|
|
123
|
+
...whitelistedModules,
|
|
124
|
+
fs: allowScriptFilesystemAccess ? fs : undefined
|
|
88
125
|
}
|
|
89
126
|
}
|
|
90
127
|
});
|
|
91
128
|
|
|
92
|
-
vm.run(testsFile
|
|
129
|
+
const asyncVM = vm.run(`module.exports = async () => { ${testsFile}}`, path.join(collectionPath, 'vm.js'));
|
|
130
|
+
await asyncVM();
|
|
93
131
|
|
|
94
132
|
return {
|
|
95
133
|
request,
|
package/src/test.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const Test = (__brunoTestResults, chai) => (description, callback) => {
|
|
1
|
+
const Test = (__brunoTestResults, chai) => async (description, callback) => {
|
|
2
2
|
try {
|
|
3
|
-
callback();
|
|
3
|
+
await callback();
|
|
4
4
|
__brunoTestResults.addResult({ description, status: 'pass' });
|
|
5
5
|
} catch (error) {
|
|
6
6
|
console.log(chai.AssertionError);
|
package/src/utils.js
CHANGED
|
@@ -11,7 +11,7 @@ const JS_KEYWORDS = `
|
|
|
11
11
|
.filter((word) => word.length > 0);
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Creates a function from a
|
|
14
|
+
* Creates a function from a JavaScript expression
|
|
15
15
|
*
|
|
16
16
|
* When the function is called, the variables used in this expression are picked up from the context
|
|
17
17
|
*
|
|
@@ -119,7 +119,7 @@ const createResponseParser = (response = {}) => {
|
|
|
119
119
|
};
|
|
120
120
|
|
|
121
121
|
/**
|
|
122
|
-
* Objects that are created inside vm2 execution context result in an
|
|
122
|
+
* Objects that are created inside vm2 execution context result in an serialization error when sent to the renderer process
|
|
123
123
|
* Error sending from webFrameMain: Error: Failed to serialize arguments
|
|
124
124
|
* at s.send (node:electron/js2c/browser_init:169:631)
|
|
125
125
|
* at g.send (node:electron/js2c/browser_init:165:2156)
|