diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 6c1bec01a..9b92dbfa6 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -103,6 +103,8 @@ const registerNetworkIpc = (mainWindow) => { const request = prepareRequest(_request); const envVars = getEnvVars(environment); const processEnvVars = getProcessEnvVars(collectionUid); + const brunoConfig = getBrunoConfig(collectionUid); + const allowScriptFilesystemAccess = get(brunoConfig, 'filesystemAccess.allow', false); try { // make axios work in node using form data @@ -154,7 +156,8 @@ const registerNetworkIpc = (mainWindow) => { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ); mainWindow.webContents.send('main:script-environment-update', { @@ -166,7 +169,6 @@ const registerNetworkIpc = (mainWindow) => { } // proxy configuration - const brunoConfig = getBrunoConfig(collectionUid); const proxyEnabled = get(brunoConfig, 'proxy.enabled', false); if (proxyEnabled) { const proxyProtocol = get(brunoConfig, 'proxy.protocol'); @@ -278,7 +280,8 @@ const registerNetworkIpc = (mainWindow) => { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ); mainWindow.webContents.send('main:script-environment-update', { @@ -323,7 +326,8 @@ const registerNetworkIpc = (mainWindow) => { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ); mainWindow.webContents.send('main:run-request-event', { @@ -397,7 +401,8 @@ const registerNetworkIpc = (mainWindow) => { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ); mainWindow.webContents.send('main:run-request-event', { @@ -483,6 +488,8 @@ const registerNetworkIpc = (mainWindow) => { const collectionUid = collection.uid; const collectionPath = collection.pathname; const folderUid = folder ? folder.uid : null; + const brunoConfig = getBrunoConfig(collectionUid); + const allowScriptFilesystemAccess = get(brunoConfig, 'filesystemAccess.allow', false); const onConsoleLog = (type, args) => { console[type](...args); @@ -588,7 +595,8 @@ const registerNetworkIpc = (mainWindow) => { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ); mainWindow.webContents.send('main:script-environment-update', { @@ -599,7 +607,6 @@ const registerNetworkIpc = (mainWindow) => { } // proxy configuration - const brunoConfig = getBrunoConfig(collectionUid); const proxyEnabled = get(brunoConfig, 'proxy.enabled', false); if (proxyEnabled) { const proxyProtocol = get(brunoConfig, 'proxy.protocol'); @@ -690,7 +697,8 @@ const registerNetworkIpc = (mainWindow) => { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ); mainWindow.webContents.send('main:script-environment-update', { @@ -733,7 +741,8 @@ const registerNetworkIpc = (mainWindow) => { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ); mainWindow.webContents.send('main:run-folder-event', { @@ -812,7 +821,8 @@ const registerNetworkIpc = (mainWindow) => { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ); mainWindow.webContents.send('main:run-folder-event', { diff --git a/packages/bruno-js/src/bru.js b/packages/bruno-js/src/bru.js index 6eec791fa..3cd9e8f5f 100644 --- a/packages/bruno-js/src/bru.js +++ b/packages/bruno-js/src/bru.js @@ -2,10 +2,11 @@ const Handlebars = require('handlebars'); const { cloneDeep } = require('lodash'); class Bru { - constructor(envVariables, collectionVariables, processEnvVars) { + constructor(envVariables, collectionVariables, processEnvVars, collectionPath) { this.envVariables = envVariables; this.collectionVariables = collectionVariables; this.processEnvVars = cloneDeep(processEnvVars || {}); + this.collectionPath = collectionPath; } _interpolateEnvVar = (str) => { @@ -24,6 +25,10 @@ class Bru { }); }; + cwd() { + return this.collectionPath; + } + getEnvName() { return this.envVariables.__name__; } diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index 41af51eee..46c88b0c1 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -7,6 +7,7 @@ const util = require('util'); const zlib = require('zlib'); const url = require('url'); const punycode = require('punycode'); +const fs = require('fs'); const Bru = require('../bru'); const BrunoRequest = require('../bruno-request'); const BrunoResponse = require('../bruno-response'); @@ -27,6 +28,8 @@ const CryptoJS = require('crypto-js'); class ScriptRuntime { constructor() {} + // This approach is getting out of hand + // Need to refactor this to use a single arg (object) instead of 7 async runRequestScript( script, request, @@ -34,9 +37,10 @@ class ScriptRuntime { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ) { - const bru = new Bru(envVariables, collectionVariables, processEnvVars); + const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath); const req = new BrunoRequest(request); const context = { @@ -84,7 +88,8 @@ class ScriptRuntime { axios, chai, 'node-fetch': fetch, - 'crypto-js': CryptoJS + 'crypto-js': CryptoJS, + fs: allowScriptFilesystemAccess ? fs : undefined } } }); @@ -105,9 +110,10 @@ class ScriptRuntime { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ) { - const bru = new Bru(envVariables, collectionVariables, processEnvVars); + const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath); const req = new BrunoRequest(request); const res = new BrunoResponse(response); @@ -138,6 +144,16 @@ class ScriptRuntime { external: true, root: [collectionPath], mock: { + // node libs + path, + stream, + util, + url, + http, + https, + punycode, + zlib, + // 3rd party libs atob, btoa, lodash, @@ -146,7 +162,8 @@ class ScriptRuntime { nanoid, axios, 'node-fetch': fetch, - 'crypto-js': CryptoJS + 'crypto-js': CryptoJS, + fs: allowScriptFilesystemAccess ? fs : undefined } } }); diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index 47daccd62..efefb451f 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -1,6 +1,14 @@ const { NodeVM } = require('vm2'); const chai = require('chai'); const path = require('path'); +const http = require('http'); +const https = require('https'); +const stream = require('stream'); +const util = require('util'); +const zlib = require('zlib'); +const url = require('url'); +const punycode = require('punycode'); +const fs = require('fs'); const Bru = require('../bru'); const BrunoRequest = require('../bruno-request'); const BrunoResponse = require('../bruno-response'); @@ -29,9 +37,10 @@ class TestRuntime { collectionVariables, collectionPath, onConsoleLog, - processEnvVars + processEnvVars, + allowScriptFilesystemAccess ) { - const bru = new Bru(envVariables, collectionVariables, processEnvVars); + const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath); const req = new BrunoRequest(request); const res = new BrunoResponse(response); @@ -78,6 +87,16 @@ class TestRuntime { external: true, root: [collectionPath], mock: { + // node libs + path, + stream, + util, + url, + http, + https, + punycode, + zlib, + // 3rd party libs atob, axios, btoa, @@ -86,7 +105,8 @@ class TestRuntime { uuid, nanoid, chai, - 'crypto-js': CryptoJS + 'crypto-js': CryptoJS, + fs: allowScriptFilesystemAccess ? fs : undefined } } });