@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.
@@ -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 NodeSecrets = require('node-vault');
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
- collectionVariables,
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
- collectionVariables,
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
- const vm = new NodeVM({
119
- sandbox: context,
120
- require: {
121
- context: 'sandbox',
122
- external: true,
123
- root: [collectionPath, ...additionalContextRootsAbsolute],
124
- mock: {
125
- // node libs
126
- path,
127
- stream,
128
- util,
129
- url,
130
- http,
131
- https,
132
- punycode,
133
- zlib,
134
- // 3rd party libs
135
- ajv,
136
- 'ajv-formats': addFormats,
137
- btoa,
138
- atob,
139
- lodash,
140
- moment,
141
- uuid,
142
- nanoid,
143
- axios,
144
- chai,
145
- 'node-fetch': fetch,
146
- 'crypto-js': CryptoJS,
147
- ...whitelistedModules,
148
- fs: allowScriptFilesystemAccess ? fs : undefined,
149
- 'node-vault': NodeSecrets
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
- const asyncVM = vm.run(`module.exports = async () => { ${testsFile}}`, path.join(collectionPath, 'vm.js'));
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
- collectionVariables: cleanJson(collectionVariables),
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 { evaluateJsTemplateLiteral, evaluateJsExpression, createResponseParser } = require('../utils');
4
+ const { evaluateJsExpression, createResponseParser } = require('../utils');
5
5
 
6
- class VarsRuntime {
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
- const bruContext = {
37
- bru,
38
- req
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
- const context = {
42
- ...envVariables,
43
- ...collectionVariables,
44
- ...secretVars,
45
- ...bruContext
46
- };
17
+ return evaluateJsExpression(expr, context);
18
+ };
47
19
 
48
- _.each(enabledVars, (v) => {
49
- const value = evaluateJsTemplateLiteral(v.value, context);
50
- request?.requestVariables && (request.requestVariables[v.name] = value);
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
- collectionVariables,
35
+ runtimeVariables,
74
36
  processEnvVars,
75
37
  null,
76
38
  historyLogger,
77
- undefined, // setHtmlVisualizationString
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
- ...collectionVariables,
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 = evaluateJsExpression(v.value, context);
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
- collectionVariables,
78
+ runtimeVariables,
117
79
  error
118
80
  };
119
81
  }