diff --git a/package.json b/package.json
index 018b39386..40d3533ee 100644
--- a/package.json
+++ b/package.json
@@ -6,6 +6,7 @@
"packages/bruno-electron",
"packages/bruno-tauri",
"packages/bruno-schema",
+ "packages/bruno-js",
"packages/bruno-lang",
"packages/bruno-testbench",
"packages/bruno-graphql-docs"
diff --git a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js
index cdc3b1de3..fdc3e93c9 100644
--- a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js
+++ b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js
@@ -75,12 +75,12 @@ const HttpRequestPane = ({ item, collection, leftPaneWidth }) => {
selectTab('headers')}>
Headers
- {/* selectTab('script')}>
+
selectTab('script')}>
Script
selectTab('tests')}>
Tests
-
*/}
+
{/* Moved to post mvp */}
{/* selectTab('auth')}>Auth
*/}
{focusedTab.requestPaneTab === 'body' ? (
diff --git a/packages/bruno-app/src/utils/network/index.js b/packages/bruno-app/src/utils/network/index.js
index 337a15f01..c46876f57 100644
--- a/packages/bruno-app/src/utils/network/index.js
+++ b/packages/bruno-app/src/utils/network/index.js
@@ -86,7 +86,9 @@ const sendHttpRequest = async (request, options, onRequestSent) => {
axiosRequest.data = graphqlQuery;
}
- console.log('>>> Sending Request');
+ if (request.script && request.script.length) {
+ axiosRequest.script = request.script;
+ }
console.log(axiosRequest);
onRequestSent(axiosRequest);
diff --git a/packages/bruno-electron/package.json b/packages/bruno-electron/package.json
index 0f4a8a62b..2b3707b64 100644
--- a/packages/bruno-electron/package.json
+++ b/packages/bruno-electron/package.json
@@ -13,6 +13,7 @@
"pack-app": "electron-builder --dir"
},
"dependencies": {
+ "@usebruno/js": "0.1.0",
"@usebruno/lang": "0.1.0",
"@usebruno/schema": "0.1.0",
"axios": "^0.26.0",
@@ -25,6 +26,7 @@
"is-valid-path": "^0.1.1",
"lodash": "^4.17.21",
"nanoid": "3.3.4",
+ "vm2": "^3.9.13",
"yup": "^0.32.11"
},
"optionalDependencies": {
diff --git a/packages/bruno-electron/src/ipc/network.js b/packages/bruno-electron/src/ipc/network.js
index c1f8e6d95..761c4aa6c 100644
--- a/packages/bruno-electron/src/ipc/network.js
+++ b/packages/bruno-electron/src/ipc/network.js
@@ -2,6 +2,7 @@ const axios = require('axios');
const FormData = require('form-data');
const { ipcMain } = require('electron');
const { forOwn, extend } = require('lodash');
+const { ScriptRuntime } = require('@usebruno/js');
const { cancelTokens, saveCancelToken, deleteCancelToken } = require('../utils/cancel-token');
const registerNetworkIpc = () => {
@@ -25,6 +26,12 @@ const registerNetworkIpc = () => {
saveCancelToken(options.cancelTokenUid, cancelToken);
}
+ if(request.script && request.script.length) {
+ request.script = request.script += '\n onRequest(brunoRequest);';
+ const scriptRuntime = new ScriptRuntime();
+ scriptRuntime.run(request.script, request);
+ }
+
const result = await axios(request);
if(options && options.cancelTokenUid) {
diff --git a/packages/bruno-js/package.json b/packages/bruno-js/package.json
new file mode 100644
index 000000000..3094265b7
--- /dev/null
+++ b/packages/bruno-js/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "@usebruno/js",
+ "version": "0.1.0",
+ "main": "src/index.js",
+ "files": [
+ "src",
+ "package.json"
+ ],
+ "peerDependencies": {
+ "vm2": "^3.9.13"
+ }
+}
diff --git a/packages/bruno-js/src/index.js b/packages/bruno-js/src/index.js
new file mode 100644
index 000000000..1a5001f1b
--- /dev/null
+++ b/packages/bruno-js/src/index.js
@@ -0,0 +1,7 @@
+const {
+ ScriptRuntime
+} = require('./scripts/script-runtime');
+
+module.exports = {
+ ScriptRuntime
+};
diff --git a/packages/bruno-js/src/scripts/bruno-request.js b/packages/bruno-js/src/scripts/bruno-request.js
new file mode 100644
index 000000000..4fc4116e3
--- /dev/null
+++ b/packages/bruno-js/src/scripts/bruno-request.js
@@ -0,0 +1,47 @@
+class BrunoRequest {
+ constructor(request) {
+ this._request = request;
+ }
+
+ getUrl() {
+ return this._request.url;
+ }
+
+ setUrl(url) {
+ this._request.url = url;
+ }
+
+ getMethod() {
+ return this._request.method;
+ }
+
+ setMethod(method) {
+ this._request.method = method;
+ }
+
+ getHeaders() {
+ return this._request.headers;
+ }
+
+ setHeaders(headers) {
+ this._request.headers = headers;
+ }
+
+ getHeader(name) {
+ return this._request.headers[name];
+ }
+
+ setHeader(name, value) {
+ this._request.headers[name] = value;
+ }
+
+ getData() {
+ return this._request.data;
+ }
+
+ setData(data) {
+ this._request.data = data;
+ }
+}
+
+module.exports = BrunoRequest;
\ No newline at end of file
diff --git a/packages/bruno-js/src/scripts/script-runtime.js b/packages/bruno-js/src/scripts/script-runtime.js
new file mode 100644
index 000000000..caebfe455
--- /dev/null
+++ b/packages/bruno-js/src/scripts/script-runtime.js
@@ -0,0 +1,26 @@
+const { NodeVM } = require('vm2');
+const BrunoRequest = require('./bruno-request');
+
+class ScriptRuntime {
+ constructor() {
+ }
+
+ run(script, request) {
+ const brunoRequest = new BrunoRequest(request);
+
+ const context = {
+ brunoRequest
+ };
+ const vm = new NodeVM({
+ sandbox: context
+ });
+
+ vm.run(script);
+
+ return request;
+ }
+}
+
+module.exports = {
+ ScriptRuntime
+};
\ No newline at end of file