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