From 1ec24d11382c75ee8c6944c6bb6c14a8367d2cc2 Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Tue, 24 Jan 2023 18:27:47 +0530 Subject: [PATCH] feat: scripting support (#16) --- package.json | 1 + .../RequestPane/HttpRequestPane/index.js | 4 +- packages/bruno-app/src/utils/network/index.js | 4 +- packages/bruno-electron/package.json | 2 + packages/bruno-electron/src/ipc/network.js | 7 +++ packages/bruno-js/package.json | 12 +++++ packages/bruno-js/src/index.js | 7 +++ .../bruno-js/src/scripts/bruno-request.js | 47 +++++++++++++++++++ .../bruno-js/src/scripts/script-runtime.js | 26 ++++++++++ 9 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 packages/bruno-js/package.json create mode 100644 packages/bruno-js/src/index.js create mode 100644 packages/bruno-js/src/scripts/bruno-request.js create mode 100644 packages/bruno-js/src/scripts/script-runtime.js diff --git a/package.json b/package.json index 018b3938..40d3533e 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 cdc3b1de..fdc3e93c 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 337a15f0..c46876f5 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 0f4a8a62..2b3707b6 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 c1f8e6d9..761c4aa6 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 00000000..3094265b --- /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 00000000..1a5001f1 --- /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 00000000..4fc4116e --- /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 00000000..caebfe45 --- /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