@usebruno/js 0.19.0 → 0.21.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.19.0",
3
+ "version": "0.21.0",
4
4
  "license": "MIT",
5
5
  "main": "src/index.js",
6
6
  "files": [
@@ -20,7 +20,7 @@
20
20
  "ajv": "^8.12.0",
21
21
  "ajv-formats": "^2.1.1",
22
22
  "atob": "^2.1.2",
23
- "axios": "^1.5.1",
23
+ "axios": "1.7.5",
24
24
  "btoa": "^1.2.1",
25
25
  "chai": "^4.3.7",
26
26
  "chai-string": "^1.5.0",
@@ -30,7 +30,7 @@
30
30
  "lodash": "^4.17.21",
31
31
  "moment": "^2.29.4",
32
32
  "nanoid": "3.3.4",
33
- "node-fetch": "^2.7.0",
33
+ "node-fetch": "2.7.0",
34
34
  "node-vault": "^0.10.2",
35
35
  "path": "^0.12.7",
36
36
  "quickjs-emscripten": "^0.29.2",
@@ -38,16 +38,10 @@
38
38
  },
39
39
  "devDependencies": {
40
40
  "@rollup/plugin-commonjs": "^23.0.2",
41
- "@rollup/plugin-json": "^6.1.0",
42
41
  "@rollup/plugin-node-resolve": "^15.0.1",
43
- "rollup": "3.2.5",
44
- "rollup-plugin-node-builtins": "^2.1.2",
45
- "rollup-plugin-node-globals": "^1.4.0",
46
- "rollup-plugin-polyfill-node": "^0.13.0",
42
+ "rollup": "3.29.5",
47
43
  "rollup-plugin-terser": "^7.0.2",
48
44
  "stream": "^0.0.2",
49
- "terser": "^5.31.1",
50
- "uglify-js": "^3.18.0",
51
45
  "util": "^0.12.5"
52
46
  }
53
47
  }
package/src/bru.js CHANGED
@@ -5,7 +5,7 @@ const { interpolate } = require('@usebruno/common');
5
5
  const variableNameRegex = /^[\w-.]*$/;
6
6
 
7
7
  class Bru {
8
- constructor(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables) {
8
+ constructor(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables) {
9
9
  this.envVariables = envVariables || {};
10
10
  this.runtimeVariables = runtimeVariables || {};
11
11
  this.processEnvVars = cloneDeep(processEnvVars || {});
@@ -13,6 +13,7 @@ class Bru {
13
13
  this.collectionVariables = collectionVariables || {};
14
14
  this.folderVariables = folderVariables || {};
15
15
  this.requestVariables = requestVariables || {};
16
+ this.globalEnvironmentVariables = globalEnvironmentVariables || {};
16
17
  this.collectionPath = collectionPath;
17
18
  this.historyLogger = historyLogger;
18
19
  this.setVisualizations = setVisualizations;
@@ -24,6 +25,7 @@ class Bru {
24
25
  }
25
26
 
26
27
  const combinedVars = {
28
+ ...this.globalEnvironmentVariables,
27
29
  ...this.collectionVariables,
28
30
  ...this.envVariables,
29
31
  ...this.folderVariables,
@@ -76,6 +78,18 @@ class Bru {
76
78
  this.envVariables[key] = value;
77
79
  }
78
80
 
81
+ getGlobalEnvVar(key) {
82
+ return this._interpolate(this.globalEnvironmentVariables[key]);
83
+ }
84
+
85
+ setGlobalEnvVar(key, value) {
86
+ if (!key) {
87
+ throw new Error('Creating a env variable without specifying a name is not allowed.');
88
+ }
89
+
90
+ this.globalEnvironmentVariables[key] = value;
91
+ }
92
+
79
93
  hasVar(key) {
80
94
  return Object.hasOwn(this.runtimeVariables, key);
81
95
  }
@@ -119,6 +133,14 @@ class Bru {
119
133
  delete this.runtimeVariables[key];
120
134
  }
121
135
 
136
+ deleteAllVars() {
137
+ for (let key in this.runtimeVariables) {
138
+ if (this.runtimeVariables.hasOwnProperty(key)) {
139
+ delete this.runtimeVariables[key];
140
+ }
141
+ }
142
+ }
143
+
122
144
  getCollectionVar(key) {
123
145
  return this._interpolate(this.collectionVariables[key]);
124
146
  }
@@ -2,13 +2,14 @@ const { interpolate } = require('@usebruno/common');
2
2
 
3
3
  const interpolateString = (
4
4
  str,
5
- { envVariables = {}, runtimeVariables = {}, processEnvVars = {}, collectionVariables = {}, folderVariables = {}, requestVariables = {} }
5
+ { envVariables = {}, runtimeVariables = {}, processEnvVars = {}, collectionVariables = {}, folderVariables = {}, requestVariables = {}, globalEnvironmentVariables = {} }
6
6
  ) => {
7
7
  if (!str || !str.length || typeof str !== 'string') {
8
8
  return str;
9
9
  }
10
10
 
11
11
  const combinedVars = {
12
+ ...globalEnvironmentVariables,
12
13
  ...collectionVariables,
13
14
  ...envVariables,
14
15
  ...folderVariables,
@@ -192,6 +192,7 @@ const evaluateRhsOperand = (rhsOperand, operator, context, runtime) => {
192
192
  }
193
193
 
194
194
  const interpolationContext = {
195
+ globalEnvironmentVariables: context.bru.globalEnvironmentVariables,
195
196
  collectionVariables: context.bru.collectionVariables,
196
197
  folderVariables: context.bru.folderVariables,
197
198
  requestVariables: context.bru.requestVariables,
@@ -240,6 +241,7 @@ class AssertRuntime {
240
241
  }
241
242
 
242
243
  runAssertions(assertions, request, response, envVariables, runtimeVariables, processEnvVars, historyLogger, secretVariables) {
244
+ const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
243
245
  const collectionVariables = request?.collectionVariables || {};
244
246
  const folderVariables = request?.folderVariables || {};
245
247
  const requestVariables = request?.requestVariables || {};
@@ -258,7 +260,8 @@ class AssertRuntime {
258
260
  secretVariables,
259
261
  collectionVariables,
260
262
  folderVariables,
261
- requestVariables
263
+ requestVariables,
264
+ globalEnvironmentVariables
262
265
  );
263
266
  const req = new BrunoRequest(request, historyLogger);
264
267
  const res = createResponseParser(response);
@@ -270,6 +273,7 @@ class AssertRuntime {
270
273
  };
271
274
 
272
275
  const context = {
276
+ ...globalEnvironmentVariables,
273
277
  ...collectionVariables,
274
278
  ...envVariables,
275
279
  ...folderVariables,
@@ -53,10 +53,11 @@ class ScriptRuntime {
53
53
  let setVisualizations = (data) => {
54
54
  visualizations.push(data);
55
55
  }
56
+ const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
56
57
  const collectionVariables = request?.collectionVariables || {};
57
58
  const folderVariables = request?.folderVariables || {};
58
59
  const requestVariables = request?.requestVariables || {};
59
- const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables);
60
+ const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables);
60
61
  const req = new BrunoRequest(request, historyLogger);
61
62
  const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
62
63
  const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
@@ -109,6 +110,7 @@ class ScriptRuntime {
109
110
  envVariables: cleanJson(envVariables),
110
111
  runtimeVariables: cleanJson(runtimeVariables),
111
112
  visualizations,
113
+ globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
112
114
  nextRequestName: bru.nextRequest
113
115
  };
114
116
  }
@@ -157,6 +159,7 @@ class ScriptRuntime {
157
159
  envVariables: cleanJson(envVariables),
158
160
  runtimeVariables: cleanJson(runtimeVariables),
159
161
  visualizations,
162
+ globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
160
163
  nextRequestName: bru.nextRequest
161
164
  };
162
165
  }
@@ -178,10 +181,11 @@ class ScriptRuntime {
178
181
  let setVisualizations = (data) => {
179
182
  visualizations.push(data);
180
183
  }
184
+ const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
181
185
  const collectionVariables = request?.collectionVariables || {};
182
186
  const folderVariables = request?.folderVariables || {};
183
187
  const requestVariables = request?.requestVariables || {};
184
- const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables);
188
+ const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, setVisualizations, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables);
185
189
  const req = new BrunoRequest(request, historyLogger);
186
190
  const res = new BrunoResponse(response);
187
191
  const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
@@ -231,6 +235,7 @@ class ScriptRuntime {
231
235
  envVariables: cleanJson(envVariables),
232
236
  runtimeVariables: cleanJson(runtimeVariables),
233
237
  visualizations,
238
+ globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
234
239
  nextRequestName: bru.nextRequest
235
240
  };
236
241
  }
@@ -279,6 +284,7 @@ class ScriptRuntime {
279
284
  envVariables: cleanJson(envVariables),
280
285
  runtimeVariables: cleanJson(runtimeVariables),
281
286
  visualizations,
287
+ globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
282
288
  nextRequestName: bru.nextRequest
283
289
  };
284
290
  }
@@ -50,10 +50,11 @@ class TestRuntime {
50
50
  historyLogger,
51
51
  secretVariables
52
52
  ) {
53
+ const globalEnvironmentVariables = request?.globalEnvironmentVariables || {};
53
54
  const collectionVariables = request?.collectionVariables || {};
54
55
  const folderVariables = request?.folderVariables || {};
55
56
  const requestVariables = request?.requestVariables || {};
56
- const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, undefined, secretVariables, collectionVariables, folderVariables, requestVariables);
57
+ const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, historyLogger, undefined, secretVariables, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables);
57
58
  const req = new BrunoRequest(request, historyLogger);
58
59
  const res = new BrunoResponse(response);
59
60
  const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
@@ -83,12 +84,12 @@ class TestRuntime {
83
84
  request,
84
85
  envVariables,
85
86
  runtimeVariables,
87
+ globalEnvironmentVariables,
86
88
  results: __brunoTestResults.getResults(),
87
89
  nextRequestName: bru.nextRequest
88
90
  };
89
91
  }
90
92
 
91
-
92
93
  const context = {
93
94
  test,
94
95
  bru,
@@ -173,6 +174,7 @@ class TestRuntime {
173
174
  request,
174
175
  envVariables: cleanJson(envVariables),
175
176
  runtimeVariables: cleanJson(runtimeVariables),
177
+ globalEnvironmentVariables: cleanJson(globalEnvironmentVariables),
176
178
  results: cleanJson(__brunoTestResults.getResults()),
177
179
  nextRequestName: bru.nextRequest
178
180
  };
@@ -60,7 +60,9 @@ class VarsRuntime {
60
60
  _.each(enabledVars, (v) => {
61
61
  try {
62
62
  const value = evaluateJsExpressionBasedOnRuntime(v.value, context, this.runtime);
63
- bru.setVar(v.name, value);
63
+ if (v.name) {
64
+ bru.setVar(v.name, value);
65
+ }
64
66
  } catch (error) {
65
67
  errors.set(v.name, error);
66
68
  }
@@ -21,6 +21,12 @@ const addBruShimToContext = (vm, bru) => {
21
21
  vm.setProp(bruObject, 'getProcessEnv', getProcessEnv);
22
22
  getProcessEnv.dispose();
23
23
 
24
+ let hasEnvVar = vm.newFunction('hasEnvVar', function (key) {
25
+ return marshallToVm(bru.hasEnvVar(vm.dump(key)), vm);
26
+ });
27
+ vm.setProp(bruObject, 'hasEnvVar', hasEnvVar);
28
+ hasEnvVar.dispose();
29
+
24
30
  let getEnvVar = vm.newFunction('getEnvVar', function (key) {
25
31
  return marshallToVm(bru.getEnvVar(vm.dump(key)), vm);
26
32
  });
@@ -33,6 +39,24 @@ const addBruShimToContext = (vm, bru) => {
33
39
  vm.setProp(bruObject, 'setEnvVar', setEnvVar);
34
40
  setEnvVar.dispose();
35
41
 
42
+ let getGlobalEnvVar = vm.newFunction('getGlobalEnvVar', function (key) {
43
+ return marshallToVm(bru.getGlobalEnvVar(vm.dump(key)), vm);
44
+ });
45
+ vm.setProp(bruObject, 'getGlobalEnvVar', getGlobalEnvVar);
46
+ getGlobalEnvVar.dispose();
47
+
48
+ let setGlobalEnvVar = vm.newFunction('setGlobalEnvVar', function (key, value) {
49
+ bru.setGlobalEnvVar(vm.dump(key), vm.dump(value));
50
+ });
51
+ vm.setProp(bruObject, 'setGlobalEnvVar', setGlobalEnvVar);
52
+ setGlobalEnvVar.dispose();
53
+
54
+ let hasVar = vm.newFunction('hasVar', function (key) {
55
+ return marshallToVm(bru.hasVar(vm.dump(key)), vm);
56
+ });
57
+ vm.setProp(bruObject, 'hasVar', hasVar);
58
+ hasVar.dispose();
59
+
36
60
  let getVar = vm.newFunction('getVar', function (key) {
37
61
  return marshallToVm(bru.getVar(vm.dump(key)), vm);
38
62
  });
@@ -45,6 +69,18 @@ const addBruShimToContext = (vm, bru) => {
45
69
  vm.setProp(bruObject, 'setVar', setVar);
46
70
  setVar.dispose();
47
71
 
72
+ let deleteVar = vm.newFunction('deleteVar', function (key) {
73
+ bru.deleteVar(vm.dump(key));
74
+ });
75
+ vm.setProp(bruObject, 'deleteVar', deleteVar);
76
+ deleteVar.dispose();
77
+
78
+ let deleteAllVars = vm.newFunction('deleteAllVars', function () {
79
+ bru.deleteAllVars();
80
+ });
81
+ vm.setProp(bruObject, 'deleteAllVars', deleteAllVars);
82
+ deleteAllVars.dispose();
83
+
48
84
  let setNextRequest = vm.newFunction('setNextRequest', function (nextRequest) {
49
85
  bru.setNextRequest(vm.dump(nextRequest));
50
86
  });
@@ -1,17 +1,19 @@
1
1
  const { marshallToVm } = require('../utils');
2
2
 
3
3
  const addBrunoResponseShimToContext = (vm, res) => {
4
- const resObject = vm.newObject();
4
+ let resFn = vm.newFunction('res', function (exprStr) {
5
+ return marshallToVm(res(vm.dump(exprStr)), vm);
6
+ });
5
7
 
6
8
  const status = marshallToVm(res?.status, vm);
7
9
  const headers = marshallToVm(res?.headers, vm);
8
10
  const body = marshallToVm(res?.body, vm);
9
11
  const responseTime = marshallToVm(res?.responseTime, vm);
10
12
 
11
- vm.setProp(resObject, 'status', status);
12
- vm.setProp(resObject, 'headers', headers);
13
- vm.setProp(resObject, 'body', body);
14
- vm.setProp(resObject, 'responseTime', responseTime);
13
+ vm.setProp(resFn, 'status', status);
14
+ vm.setProp(resFn, 'headers', headers);
15
+ vm.setProp(resFn, 'body', body);
16
+ vm.setProp(resFn, 'responseTime', responseTime);
15
17
 
16
18
  status.dispose();
17
19
  headers.dispose();
@@ -21,35 +23,41 @@ const addBrunoResponseShimToContext = (vm, res) => {
21
23
  let getStatus = vm.newFunction('getStatus', function () {
22
24
  return marshallToVm(res.getStatus(), vm);
23
25
  });
24
- vm.setProp(resObject, 'getStatus', getStatus);
26
+ vm.setProp(resFn, 'getStatus', getStatus);
25
27
  getStatus.dispose();
26
28
 
27
29
  let getHeader = vm.newFunction('getHeader', function (name) {
28
30
  return marshallToVm(res.getHeader(vm.dump(name)), vm);
29
31
  });
30
- vm.setProp(resObject, 'getHeader', getHeader);
32
+ vm.setProp(resFn, 'getHeader', getHeader);
31
33
  getHeader.dispose();
32
34
 
33
35
  let getHeaders = vm.newFunction('getHeaders', function () {
34
36
  return marshallToVm(res.getHeaders(), vm);
35
37
  });
36
- vm.setProp(resObject, 'getHeaders', getHeaders);
38
+ vm.setProp(resFn, 'getHeaders', getHeaders);
37
39
  getHeaders.dispose();
38
40
 
39
41
  let getBody = vm.newFunction('getBody', function () {
40
42
  return marshallToVm(res.getBody(), vm);
41
43
  });
42
- vm.setProp(resObject, 'getBody', getBody);
44
+ vm.setProp(resFn, 'getBody', getBody);
43
45
  getBody.dispose();
44
46
 
45
47
  let getResponseTime = vm.newFunction('getResponseTime', function () {
46
48
  return marshallToVm(res.getResponseTime(), vm);
47
49
  });
48
- vm.setProp(resObject, 'getResponseTime', getResponseTime);
50
+ vm.setProp(resFn, 'getResponseTime', getResponseTime);
49
51
  getResponseTime.dispose();
50
52
 
51
- vm.setProp(vm.global, 'res', resObject);
52
- resObject.dispose();
53
+ let setBody = vm.newFunction('setBody', function (data) {
54
+ res.setBody(vm.dump(data));
55
+ });
56
+ vm.setProp(resFn, 'setBody', setBody);
57
+ setBody.dispose();
58
+
59
+ vm.setProp(vm.global, 'res', resFn);
60
+ resFn.dispose();
53
61
  };
54
62
 
55
63
  module.exports = addBrunoResponseShimToContext;