@usebruno/js 0.5.0 → 0.7.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/license.md ADDED
@@ -0,0 +1,22 @@
1
+
2
+ MIT License
3
+
4
+ Copyright (c) 2022 Anoop M D, Anusree P S and Contributors
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@usebruno/js",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
+ "license": "MIT",
4
5
  "main": "src/index.js",
5
6
  "files": [
6
7
  "src",
@@ -18,7 +19,9 @@
18
19
  "atob": "^2.1.2",
19
20
  "axios": "^0.26.0",
20
21
  "btoa": "^1.2.1",
22
+ "chai": "^4.3.7",
21
23
  "crypto-js": "^4.1.1",
24
+ "handlebars": "^4.7.8",
22
25
  "json-query": "^2.2.2",
23
26
  "lodash": "^4.17.21",
24
27
  "moment": "^2.29.4",
package/src/bru.js CHANGED
@@ -1,7 +1,32 @@
1
+ const Handlebars = require('handlebars');
2
+ const { cloneDeep } = require('lodash');
3
+
1
4
  class Bru {
2
- constructor(envVariables, collectionVariables) {
5
+ constructor(envVariables, collectionVariables, processEnvVars, collectionPath) {
3
6
  this.envVariables = envVariables;
4
7
  this.collectionVariables = collectionVariables;
8
+ this.processEnvVars = cloneDeep(processEnvVars || {});
9
+ this.collectionPath = collectionPath;
10
+ }
11
+
12
+ _interpolateEnvVar = (str) => {
13
+ if (!str || !str.length || typeof str !== 'string') {
14
+ return str;
15
+ }
16
+
17
+ const template = Handlebars.compile(str, { noEscape: true });
18
+
19
+ return template({
20
+ process: {
21
+ env: {
22
+ ...this.processEnvVars
23
+ }
24
+ }
25
+ });
26
+ };
27
+
28
+ cwd() {
29
+ return this.collectionPath;
5
30
  }
6
31
 
7
32
  getEnvName() {
@@ -9,11 +34,11 @@ class Bru {
9
34
  }
10
35
 
11
36
  getProcessEnv(key) {
12
- return process.env[key];
37
+ return this.processEnvVars[key];
13
38
  }
14
39
 
15
40
  getEnvVar(key) {
16
- return this.envVariables[key];
41
+ return this._interpolateEnvVar(this.envVariables[key]);
17
42
  }
18
43
 
19
44
  setEnvVar(key, value) {
@@ -7,6 +7,7 @@ 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');
10
11
  const Bru = require('../bru');
11
12
  const BrunoRequest = require('../bruno-request');
12
13
  const BrunoResponse = require('../bruno-response');
@@ -21,13 +22,25 @@ const uuid = require('uuid');
21
22
  const nanoid = require('nanoid');
22
23
  const axios = require('axios');
23
24
  const fetch = require('node-fetch');
25
+ const chai = require('chai');
24
26
  const CryptoJS = require('crypto-js');
25
27
 
26
28
  class ScriptRuntime {
27
29
  constructor() {}
28
30
 
29
- async runRequestScript(script, request, envVariables, collectionVariables, collectionPath, onConsoleLog) {
30
- const bru = new Bru(envVariables, collectionVariables);
31
+ // This approach is getting out of hand
32
+ // Need to refactor this to use a single arg (object) instead of 7
33
+ async runRequestScript(
34
+ script,
35
+ request,
36
+ envVariables,
37
+ collectionVariables,
38
+ collectionPath,
39
+ onConsoleLog,
40
+ processEnvVars,
41
+ allowScriptFilesystemAccess
42
+ ) {
43
+ const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
31
44
  const req = new BrunoRequest(request);
32
45
 
33
46
  const context = {
@@ -73,8 +86,10 @@ class ScriptRuntime {
73
86
  uuid,
74
87
  nanoid,
75
88
  axios,
89
+ chai,
76
90
  'node-fetch': fetch,
77
- 'crypto-js': CryptoJS
91
+ 'crypto-js': CryptoJS,
92
+ fs: allowScriptFilesystemAccess ? fs : undefined
78
93
  }
79
94
  }
80
95
  });
@@ -87,8 +102,18 @@ class ScriptRuntime {
87
102
  };
88
103
  }
89
104
 
90
- async runResponseScript(script, request, response, envVariables, collectionVariables, collectionPath, onConsoleLog) {
91
- const bru = new Bru(envVariables, collectionVariables);
105
+ async runResponseScript(
106
+ script,
107
+ request,
108
+ response,
109
+ envVariables,
110
+ collectionVariables,
111
+ collectionPath,
112
+ onConsoleLog,
113
+ processEnvVars,
114
+ allowScriptFilesystemAccess
115
+ ) {
116
+ const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
92
117
  const req = new BrunoRequest(request);
93
118
  const res = new BrunoResponse(response);
94
119
 
@@ -119,6 +144,16 @@ class ScriptRuntime {
119
144
  external: true,
120
145
  root: [collectionPath],
121
146
  mock: {
147
+ // node libs
148
+ path,
149
+ stream,
150
+ util,
151
+ url,
152
+ http,
153
+ https,
154
+ punycode,
155
+ zlib,
156
+ // 3rd party libs
122
157
  atob,
123
158
  btoa,
124
159
  lodash,
@@ -127,7 +162,8 @@ class ScriptRuntime {
127
162
  nanoid,
128
163
  axios,
129
164
  'node-fetch': fetch,
130
- 'crypto-js': CryptoJS
165
+ 'crypto-js': CryptoJS,
166
+ fs: allowScriptFilesystemAccess ? fs : undefined
131
167
  }
132
168
  }
133
169
  });
@@ -1,6 +1,14 @@
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');
4
12
  const Bru = require('../bru');
5
13
  const BrunoRequest = require('../bruno-request');
6
14
  const BrunoResponse = require('../bruno-response');
@@ -10,6 +18,7 @@ const { cleanJson } = require('../utils');
10
18
 
11
19
  // Inbuilt Library Support
12
20
  const atob = require('atob');
21
+ const axios = require('axios');
13
22
  const btoa = require('btoa');
14
23
  const lodash = require('lodash');
15
24
  const moment = require('moment');
@@ -20,8 +29,18 @@ const CryptoJS = require('crypto-js');
20
29
  class TestRuntime {
21
30
  constructor() {}
22
31
 
23
- runTests(testsFile, request, response, envVariables, collectionVariables, collectionPath, onConsoleLog) {
24
- const bru = new Bru(envVariables, collectionVariables);
32
+ async runTests(
33
+ testsFile,
34
+ request,
35
+ response,
36
+ envVariables,
37
+ collectionVariables,
38
+ collectionPath,
39
+ onConsoleLog,
40
+ processEnvVars,
41
+ allowScriptFilesystemAccess
42
+ ) {
43
+ const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
25
44
  const req = new BrunoRequest(request);
26
45
  const res = new BrunoResponse(response);
27
46
 
@@ -68,18 +87,32 @@ class TestRuntime {
68
87
  external: true,
69
88
  root: [collectionPath],
70
89
  mock: {
90
+ // node libs
91
+ path,
92
+ stream,
93
+ util,
94
+ url,
95
+ http,
96
+ https,
97
+ punycode,
98
+ zlib,
99
+ // 3rd party libs
71
100
  atob,
101
+ axios,
72
102
  btoa,
73
103
  lodash,
74
104
  moment,
75
105
  uuid,
76
106
  nanoid,
77
- 'crypto-js': CryptoJS
107
+ chai,
108
+ 'crypto-js': CryptoJS,
109
+ fs: allowScriptFilesystemAccess ? fs : undefined
78
110
  }
79
111
  }
80
112
  });
81
113
 
82
- vm.run(testsFile, path.join(collectionPath, 'vm.js'));
114
+ const asyncVM = vm.run(`module.exports = async () => { ${testsFile}}`, path.join(collectionPath, 'vm.js'));
115
+ await asyncVM();
83
116
 
84
117
  return {
85
118
  request,
@@ -4,13 +4,13 @@ const BrunoRequest = require('../bruno-request');
4
4
  const { evaluateJsTemplateLiteral, evaluateJsExpression, createResponseParser } = require('../utils');
5
5
 
6
6
  class VarsRuntime {
7
- runPreRequestVars(vars, request, envVariables, collectionVariables, collectionPath) {
7
+ runPreRequestVars(vars, request, envVariables, collectionVariables, collectionPath, processEnvVars) {
8
8
  const enabledVars = _.filter(vars, (v) => v.enabled);
9
9
  if (!enabledVars.length) {
10
10
  return;
11
11
  }
12
12
 
13
- const bru = new Bru(envVariables, collectionVariables);
13
+ const bru = new Bru(envVariables, collectionVariables, processEnvVars);
14
14
  const req = new BrunoRequest(request);
15
15
 
16
16
  const bruContext = {
@@ -34,13 +34,13 @@ class VarsRuntime {
34
34
  };
35
35
  }
36
36
 
37
- runPostResponseVars(vars, request, response, envVariables, collectionVariables, collectionPath) {
37
+ runPostResponseVars(vars, request, response, envVariables, collectionVariables, collectionPath, processEnvVars) {
38
38
  const enabledVars = _.filter(vars, (v) => v.enabled);
39
39
  if (!enabledVars.length) {
40
40
  return;
41
41
  }
42
42
 
43
- const bru = new Bru(envVariables, collectionVariables);
43
+ const bru = new Bru(envVariables, collectionVariables, processEnvVars);
44
44
  const req = new BrunoRequest(request);
45
45
  const res = createResponseParser(response);
46
46
 
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)