@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usebruno/js",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "license": "MIT",
5
5
  "main": "src/index.js",
6
6
  "files": [
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, path.join(collectionPath, 'vm.js'));
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 Javascript expression
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 serilaization error when sent to the renderer process
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)