feat/rename collectionVariables variable name to runtimeVariables (#2638)

* pr review changes

* collection root object in export json

* import environment updates

* tests run execution order fix for collection runs

* updated validations

* collectionVariables -> runtimeVariables

* removed husky, adjusted indentation

---------

Co-authored-by: Anoop M D <anoop.md1421@gmail.com>
This commit is contained in:
lohit 2024-07-17 17:21:03 +05:30 committed by GitHub
parent e60aaf2ea9
commit ab9bcbe5ed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 128 additions and 132 deletions

View File

@ -1,4 +0,0 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx pretty-quick --staged

View File

@ -73,7 +73,7 @@ const GenerateCodeItem = ({ collection, item, onClose }) => {
const interpolatedUrl = interpolateUrl({ const interpolatedUrl = interpolateUrl({
url: requestUrl, url: requestUrl,
envVars, envVars,
collectionVariables: collection.collectionVariables, runtimeVariables: collection.runtimeVariables,
processEnvVars: collection.processEnvVariables processEnvVars: collection.processEnvVariables
}); });

View File

@ -62,10 +62,10 @@ const EnvVariables = ({ collection, theme }) => {
); );
}; };
const CollectionVariables = ({ collection, theme }) => { const RuntimeVariables = ({ collection, theme }) => {
const collectionVariablesFound = Object.keys(collection.collectionVariables).length > 0; const runtimeVariablesFound = Object.keys(collection.runtimeVariables).length > 0;
const collectionVariableArray = Object.entries(collection.collectionVariables).map(([name, value]) => ({ const runtimeVariableArray = Object.entries(collection.runtimeVariables).map(([name, value]) => ({
name, name,
value, value,
secret: false secret: false
@ -73,11 +73,11 @@ const CollectionVariables = ({ collection, theme }) => {
return ( return (
<> <>
<h1 className="font-semibold mb-2">Collection Variables</h1> <h1 className="font-semibold mb-2">Runtime Variables</h1>
{collectionVariablesFound ? ( {runtimeVariablesFound ? (
<KeyValueExplorer data={collectionVariableArray} theme={theme} /> <KeyValueExplorer data={runtimeVariableArray} theme={theme} />
) : ( ) : (
<div className="muted text-xs">No collection variables found</div> <div className="muted text-xs">No runtime variables found</div>
)} )}
</> </>
); );
@ -90,13 +90,13 @@ const VariablesEditor = ({ collection }) => {
return ( return (
<StyledWrapper className="px-4 py-4"> <StyledWrapper className="px-4 py-4">
<CollectionVariables collection={collection} theme={reactInspectorTheme} /> <RuntimeVariables collection={collection} theme={reactInspectorTheme} />
<EnvVariables collection={collection} theme={reactInspectorTheme} /> <EnvVariables collection={collection} theme={reactInspectorTheme} />
<div className="mt-8 muted text-xs"> <div className="mt-8 muted text-xs">
Note: As of today, collection variables can only be set via the API -{' '} Note: As of today, runtime variables can only be set via the API - <span className="font-medium">getVar()</span>{' '}
<span className="font-medium">getVar()</span> and <span className="font-medium">setVar()</span>. <br /> and <span className="font-medium">setVar()</span>. <br />
In the next release, we will add a UI to set and modify collection variables. In the next release, we will add a UI to set and modify runtime variables.
</div> </div>
</StyledWrapper> </StyledWrapper>
); );

View File

@ -195,7 +195,7 @@ export const sendCollectionOauth2Request = (collectionUid, itemUid) => (dispatch
const externalSecrets = getExternalCollectionSecretsForActiveEnvironment({ collection }); const externalSecrets = getExternalCollectionSecretsForActiveEnvironment({ collection });
const secretVariables = getFormattedCollectionSecretVariables({ externalSecrets }); const secretVariables = getFormattedCollectionSecretVariables({ externalSecrets });
_sendCollectionOauth2Request(collection, environment, collectionCopy.collectionVariables, itemUid, secretVariables) _sendCollectionOauth2Request(collection, environment, collectionCopy.runtimeVariables, itemUid, secretVariables)
.then((response) => { .then((response) => {
if (response?.data?.error) { if (response?.data?.error) {
toast.error(response?.data?.error); toast.error(response?.data?.error);
@ -224,7 +224,7 @@ export const sendRequest = (item, collectionUid) => (dispatch, getState) => {
const collectionCopy = cloneDeep(collection); const collectionCopy = cloneDeep(collection);
const environment = findEnvironmentInCollection(collectionCopy, collectionCopy.activeEnvironmentUid); const environment = findEnvironmentInCollection(collectionCopy, collectionCopy.activeEnvironmentUid);
sendNetworkRequest(itemCopy, collectionCopy, environment, collectionCopy.collectionVariables) sendNetworkRequest(itemCopy, collectionCopy, environment, collectionCopy.runtimeVariables)
.then((response) => { .then((response) => {
return dispatch( return dispatch(
responseReceived({ responseReceived({
@ -314,7 +314,7 @@ export const runCollectionFolder = (collectionUid, folderUid, recursive) => (dis
folder, folder,
collectionCopy, collectionCopy,
environment, environment,
collectionCopy.collectionVariables, collectionCopy.runtimeVariables,
recursive recursive
) )
.then(resolve) .then(resolve)
@ -1036,7 +1036,7 @@ export const openCollectionEvent = (uid, pathname, brunoConfig) => (dispatch, ge
name: brunoConfig.name, name: brunoConfig.name,
pathname: pathname, pathname: pathname,
items: [], items: [],
collectionVariables: {}, runtimeVariables: {},
brunoConfig: brunoConfig brunoConfig: brunoConfig
}; };

View File

@ -200,7 +200,7 @@ export const collectionsSlice = createSlice({
} }
}, },
scriptEnvironmentUpdateEvent: (state, action) => { scriptEnvironmentUpdateEvent: (state, action) => {
const { collectionUid, envVariables, collectionVariables } = action.payload; const { collectionUid, envVariables, runtimeVariables } = action.payload;
const collection = findCollectionByUid(state.collections, collectionUid); const collection = findCollectionByUid(state.collections, collectionUid);
if (collection) { if (collection) {
@ -230,7 +230,7 @@ export const collectionsSlice = createSlice({
}); });
} }
collection.collectionVariables = collectionVariables; collection.runtimeVariables = runtimeVariables;
} }
}, },
processEnvUpdateEvent: (state, action) => { processEnvUpdateEvent: (state, action) => {

View File

@ -798,7 +798,7 @@ export const getAllVariables = (collection, item) => {
return { return {
...environmentVariables, ...environmentVariables,
...requestVariables, ...requestVariables,
...collection.collectionVariables, ...collection.runtimeVariables,
pathParams: { pathParams: {
...pathParams ...pathParams
}, },

View File

@ -1,9 +1,9 @@
import { safeStringifyJSON } from 'utils/common'; import { safeStringifyJSON } from 'utils/common';
export const sendNetworkRequest = async (item, collection, environment, collectionVariables) => { export const sendNetworkRequest = async (item, collection, environment, runtimeVariables) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (['http-request', 'graphql-request'].includes(item.type)) { if (['http-request', 'graphql-request'].includes(item.type)) {
sendHttpRequest(item, collection, environment, collectionVariables) sendHttpRequest(item, collection, environment, runtimeVariables)
.then((response) => { .then((response) => {
resolve({ resolve({
state: 'success', state: 'success',
@ -22,22 +22,22 @@ export const sendNetworkRequest = async (item, collection, environment, collecti
}); });
}; };
const sendHttpRequest = async (item, collection, environment, collectionVariables) => { const sendHttpRequest = async (item, collection, environment, runtimeVariables) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const { ipcRenderer } = window; const { ipcRenderer } = window;
ipcRenderer ipcRenderer
.invoke('send-http-request', item, collection, environment, collectionVariables) .invoke('send-http-request', item, collection, environment, runtimeVariables)
.then(resolve) .then(resolve)
.catch(reject); .catch(reject);
}); });
}; };
export const sendCollectionOauth2Request = async (collection, environment, collectionVariables) => { export const sendCollectionOauth2Request = async (collection, environment, runtimeVariables) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const { ipcRenderer } = window; const { ipcRenderer } = window;
ipcRenderer ipcRenderer
.invoke('send-collection-oauth2-request', collection, environment, collectionVariables) .invoke('send-collection-oauth2-request', collection, environment, runtimeVariables)
.then(resolve) .then(resolve)
.catch(reject); .catch(reject);
}); });

View File

@ -107,14 +107,14 @@ export const isValidUrl = (url) => {
} }
}; };
export const interpolateUrl = ({ url, envVars, collectionVariables, processEnvVars }) => { export const interpolateUrl = ({ url, envVars, runtimeVariables, processEnvVars }) => {
if (!url || !url.length || typeof url !== 'string') { if (!url || !url.length || typeof url !== 'string') {
return; return;
} }
return interpolate(url, { return interpolate(url, {
...envVars, ...envVars,
...collectionVariables, ...runtimeVariables,
process: { process: {
env: { env: {
...processEnvVars ...processEnvVars

View File

@ -129,10 +129,10 @@ describe('Url Utils - interpolateUrl, interpolateUrlPathParams', () => {
const expectedUrl = 'https://example.com/api/:id/path?foo=foo_value&bar=bar_value&baz=baz_value'; const expectedUrl = 'https://example.com/api/:id/path?foo=foo_value&bar=bar_value&baz=baz_value';
const envVars = { host: 'https://example.com', foo: 'foo_value' }; const envVars = { host: 'https://example.com', foo: 'foo_value' };
const collectionVariables = { bar: 'bar_value' }; const runtimeVariables = { bar: 'bar_value' };
const processEnvVars = { baz: 'baz_value' }; const processEnvVars = { baz: 'baz_value' };
const result = interpolateUrl({ url, envVars, collectionVariables, processEnvVars }); const result = interpolateUrl({ url, envVars, runtimeVariables, processEnvVars });
expect(result).toEqual(expectedUrl); expect(result).toEqual(expectedUrl);
}); });
@ -153,10 +153,10 @@ describe('Url Utils - interpolateUrl, interpolateUrlPathParams', () => {
const expectedUrl = 'https://example.com/api/123/path?foo=foo_value&bar=bar_value&baz=baz_value'; const expectedUrl = 'https://example.com/api/123/path?foo=foo_value&bar=bar_value&baz=baz_value';
const envVars = { host: 'https://example.com', foo: 'foo_value' }; const envVars = { host: 'https://example.com', foo: 'foo_value' };
const collectionVariables = { bar: 'bar_value' }; const runtimeVariables = { bar: 'bar_value' };
const processEnvVars = { baz: 'baz_value' }; const processEnvVars = { baz: 'baz_value' };
const intermediateResult = interpolateUrl({ url, envVars, collectionVariables, processEnvVars }); const intermediateResult = interpolateUrl({ url, envVars, runtimeVariables, processEnvVars });
const result = interpolateUrlPathParams(intermediateResult, params); const result = interpolateUrlPathParams(intermediateResult, params);
expect(result).toEqual(expectedUrl); expect(result).toEqual(expectedUrl);

View File

@ -312,7 +312,7 @@ const handler = async function (argv) {
recursive = true; recursive = true;
} }
const collectionVariables = {}; const runtimeVariables = {};
let envVars = {}; let envVars = {};
if (env) { if (env) {
@ -462,7 +462,7 @@ const handler = async function (argv) {
bruFilepath, bruFilepath,
bruJson, bruJson,
collectionPath, collectionPath,
collectionVariables, runtimeVariables,
envVars, envVars,
processEnvVars, processEnvVars,
brunoConfig, brunoConfig,

View File

@ -1,13 +1,13 @@
const { forOwn, cloneDeep } = require('lodash'); const { forOwn, cloneDeep } = require('lodash');
const { interpolate } = require('@usebruno/common'); const { interpolate } = require('@usebruno/common');
const interpolateString = (str, { envVars, collectionVariables, processEnvVars }) => { const interpolateString = (str, { envVars, runtimeVariables, processEnvVars }) => {
if (!str || !str.length || typeof str !== 'string') { if (!str || !str.length || typeof str !== 'string') {
return str; return str;
} }
processEnvVars = processEnvVars || {}; processEnvVars = processEnvVars || {};
collectionVariables = collectionVariables || {}; runtimeVariables = runtimeVariables || {};
// we clone envVars because we don't want to modify the original object // we clone envVars because we don't want to modify the original object
envVars = envVars ? cloneDeep(envVars) : {}; envVars = envVars ? cloneDeep(envVars) : {};
@ -24,10 +24,10 @@ const interpolateString = (str, { envVars, collectionVariables, processEnvVars }
}); });
}); });
// collectionVariables take precedence over envVars // runtimeVariables take precedence over envVars
const combinedVars = { const combinedVars = {
...envVars, ...envVars,
...collectionVariables, ...runtimeVariables,
process: { process: {
env: { env: {
...processEnvVars ...processEnvVars

View File

@ -12,7 +12,7 @@ const getContentType = (headers = {}) => {
return contentType; return contentType;
}; };
const interpolateVars = (request, envVars = {}, collectionVariables = {}, processEnvVars = {}) => { const interpolateVars = (request, envVars = {}, runtimeVariables = {}, processEnvVars = {}) => {
// we clone envVars because we don't want to modify the original object // we clone envVars because we don't want to modify the original object
envVars = cloneDeep(envVars); envVars = cloneDeep(envVars);
@ -33,10 +33,10 @@ const interpolateVars = (request, envVars = {}, collectionVariables = {}, proces
return str; return str;
} }
// collectionVariables take precedence over envVars // runtimeVariables take precedence over envVars
const combinedVars = { const combinedVars = {
...envVars, ...envVars,
...collectionVariables, ...runtimeVariables,
process: { process: {
env: { env: {
...processEnvVars ...processEnvVars

View File

@ -25,7 +25,7 @@ const runSingleRequest = async function (
filename, filename,
bruJson, bruJson,
collectionPath, collectionPath,
collectionVariables, runtimeVariables,
envVariables, envVariables,
processEnvVars, processEnvVars,
brunoConfig, brunoConfig,
@ -62,7 +62,7 @@ const runSingleRequest = async function (
preRequestVars, preRequestVars,
request, request,
envVariables, envVariables,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
processEnvVars processEnvVars
); );
@ -79,7 +79,7 @@ const runSingleRequest = async function (
decomment(requestScriptFile), decomment(requestScriptFile),
request, request,
envVariables, envVariables,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
null, null,
processEnvVars, processEnvVars,
@ -91,7 +91,7 @@ const runSingleRequest = async function (
} }
// interpolate variables inside request // interpolate variables inside request
interpolateVars(request, envVariables, collectionVariables, processEnvVars); interpolateVars(request, envVariables, runtimeVariables, processEnvVars);
if (!protocolRegex.test(request.url)) { if (!protocolRegex.test(request.url)) {
request.url = `http://${request.url}`; request.url = `http://${request.url}`;
@ -120,7 +120,7 @@ const runSingleRequest = async function (
const interpolationOptions = { const interpolationOptions = {
envVars: envVariables, envVars: envVariables,
collectionVariables, runtimeVariables,
processEnvVars processEnvVars
}; };
@ -282,7 +282,7 @@ const runSingleRequest = async function (
request, request,
response, response,
envVariables, envVariables,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
processEnvVars processEnvVars
); );
@ -300,7 +300,7 @@ const runSingleRequest = async function (
request, request,
response, response,
envVariables, envVariables,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
null, null,
processEnvVars, processEnvVars,
@ -321,7 +321,7 @@ const runSingleRequest = async function (
request, request,
response, response,
envVariables, envVariables,
collectionVariables, runtimeVariables,
processEnvVars processEnvVars
); );
@ -345,7 +345,7 @@ const runSingleRequest = async function (
request, request,
response, response,
envVariables, envVariables,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
null, null,
processEnvVars, processEnvVars,

View File

@ -87,7 +87,7 @@ const configureRequest = async (
collectionUid, collectionUid,
request, request,
envVars, envVars,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
collectionPath collectionPath
) => { ) => {
@ -118,7 +118,7 @@ const configureRequest = async (
const brunoConfig = getBrunoConfig(collectionUid); const brunoConfig = getBrunoConfig(collectionUid);
const interpolationOptions = { const interpolationOptions = {
envVars, envVars,
collectionVariables, runtimeVariables,
processEnvVars processEnvVars
}; };
@ -211,7 +211,7 @@ const configureRequest = async (
let requestCopy = cloneDeep(request); let requestCopy = cloneDeep(request);
switch (request?.oauth2?.grantType) { switch (request?.oauth2?.grantType) {
case 'authorization_code': case 'authorization_code':
interpolateVars(requestCopy, envVars, collectionVariables, processEnvVars); interpolateVars(requestCopy, envVars, runtimeVariables, processEnvVars);
const { data: authorizationCodeData, url: authorizationCodeAccessTokenUrl } = const { data: authorizationCodeData, url: authorizationCodeAccessTokenUrl } =
await resolveOAuth2AuthorizationCodeAccessToken(requestCopy, collectionUid); await resolveOAuth2AuthorizationCodeAccessToken(requestCopy, collectionUid);
request.method = 'POST'; request.method = 'POST';
@ -220,7 +220,7 @@ const configureRequest = async (
request.url = authorizationCodeAccessTokenUrl; request.url = authorizationCodeAccessTokenUrl;
break; break;
case 'client_credentials': case 'client_credentials':
interpolateVars(requestCopy, envVars, collectionVariables, processEnvVars); interpolateVars(requestCopy, envVars, runtimeVariables, processEnvVars);
const { data: clientCredentialsData, url: clientCredentialsAccessTokenUrl } = const { data: clientCredentialsData, url: clientCredentialsAccessTokenUrl } =
await transformClientCredentialsRequest(requestCopy); await transformClientCredentialsRequest(requestCopy);
request.method = 'POST'; request.method = 'POST';
@ -229,7 +229,7 @@ const configureRequest = async (
request.url = clientCredentialsAccessTokenUrl; request.url = clientCredentialsAccessTokenUrl;
break; break;
case 'password': case 'password':
interpolateVars(requestCopy, envVars, collectionVariables, processEnvVars); interpolateVars(requestCopy, envVars, runtimeVariables, processEnvVars);
const { data: passwordData, url: passwordAccessTokenUrl } = await transformPasswordCredentialsRequest( const { data: passwordData, url: passwordAccessTokenUrl } = await transformPasswordCredentialsRequest(
requestCopy requestCopy
); );
@ -308,7 +308,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
) => { ) => {
@ -320,7 +320,7 @@ const registerNetworkIpc = (mainWindow) => {
preRequestVars, preRequestVars,
request, request,
envVars, envVars,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
processEnvVars processEnvVars
); );
@ -335,7 +335,7 @@ const registerNetworkIpc = (mainWindow) => {
decomment(requestScript), decomment(requestScript),
request, request,
envVars, envVars,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
onConsoleLog, onConsoleLog,
processEnvVars, processEnvVars,
@ -344,14 +344,14 @@ const registerNetworkIpc = (mainWindow) => {
mainWindow.webContents.send('main:script-environment-update', { mainWindow.webContents.send('main:script-environment-update', {
envVariables: scriptResult.envVariables, envVariables: scriptResult.envVariables,
collectionVariables: scriptResult.collectionVariables, runtimeVariables: scriptResult.runtimeVariables,
requestUid, requestUid,
collectionUid collectionUid
}); });
} }
// interpolate variables inside request // interpolate variables inside request
interpolateVars(request, envVars, collectionVariables, processEnvVars); interpolateVars(request, envVars, runtimeVariables, processEnvVars);
// if this is a graphql request, parse the variables, only after interpolation // if this is a graphql request, parse the variables, only after interpolation
// https://github.com/usebruno/bruno/issues/884 // https://github.com/usebruno/bruno/issues/884
@ -375,7 +375,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
) => { ) => {
@ -388,7 +388,7 @@ const registerNetworkIpc = (mainWindow) => {
request, request,
response, response,
envVars, envVars,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
processEnvVars processEnvVars
); );
@ -396,7 +396,7 @@ const registerNetworkIpc = (mainWindow) => {
if (result) { if (result) {
mainWindow.webContents.send('main:script-environment-update', { mainWindow.webContents.send('main:script-environment-update', {
envVariables: result.envVariables, envVariables: result.envVariables,
collectionVariables: result.collectionVariables, runtimeVariables: result.runtimeVariables,
requestUid, requestUid,
collectionUid collectionUid
}); });
@ -419,7 +419,7 @@ const registerNetworkIpc = (mainWindow) => {
request, request,
response, response,
envVars, envVars,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
onConsoleLog, onConsoleLog,
processEnvVars, processEnvVars,
@ -428,7 +428,7 @@ const registerNetworkIpc = (mainWindow) => {
mainWindow.webContents.send('main:script-environment-update', { mainWindow.webContents.send('main:script-environment-update', {
envVariables: scriptResult.envVariables, envVariables: scriptResult.envVariables,
collectionVariables: scriptResult.collectionVariables, runtimeVariables: scriptResult.runtimeVariables,
requestUid, requestUid,
collectionUid collectionUid
}); });
@ -437,7 +437,7 @@ const registerNetworkIpc = (mainWindow) => {
}; };
// handler for sending http request // handler for sending http request
ipcMain.handle('send-http-request', async (event, item, collection, environment, collectionVariables) => { ipcMain.handle('send-http-request', async (event, item, collection, environment, runtimeVariables) => {
const collectionUid = collection.uid; const collectionUid = collection.uid;
const collectionPath = collection.pathname; const collectionPath = collection.pathname;
const cancelTokenUid = uuid(); const cancelTokenUid = uuid();
@ -470,7 +470,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
); );
@ -479,7 +479,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionUid, collectionUid,
request, request,
envVars, envVars,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
collectionPath collectionPath
); );
@ -564,7 +564,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
); );
@ -578,7 +578,7 @@ const registerNetworkIpc = (mainWindow) => {
request, request,
response, response,
envVars, envVars,
collectionVariables, runtimeVariables,
processEnvVars processEnvVars
); );
@ -603,7 +603,7 @@ const registerNetworkIpc = (mainWindow) => {
request, request,
response, response,
envVars, envVars,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
onConsoleLog, onConsoleLog,
processEnvVars, processEnvVars,
@ -620,7 +620,7 @@ const registerNetworkIpc = (mainWindow) => {
mainWindow.webContents.send('main:script-environment-update', { mainWindow.webContents.send('main:script-environment-update', {
envVariables: testResults.envVariables, envVariables: testResults.envVariables,
collectionVariables: testResults.collectionVariables, runtimeVariables: testResults.runtimeVariables,
requestUid, requestUid,
collectionUid collectionUid
}); });
@ -642,7 +642,7 @@ const registerNetworkIpc = (mainWindow) => {
} }
}); });
ipcMain.handle('send-collection-oauth2-request', async (event, collection, environment, collectionVariables) => { ipcMain.handle('send-collection-oauth2-request', async (event, collection, environment, runtimeVariables) => {
try { try {
const collectionUid = collection.uid; const collectionUid = collection.uid;
const collectionPath = collection.pathname; const collectionPath = collection.pathname;
@ -663,17 +663,17 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
); );
interpolateVars(request, envVars, collection.collectionVariables, processEnvVars); interpolateVars(request, envVars, collection.runtimeVariables, processEnvVars);
const axiosInstance = await configureRequest( const axiosInstance = await configureRequest(
collection.uid, collection.uid,
request, request,
envVars, envVars,
collection.collectionVariables, collection.runtimeVariables,
processEnvVars, processEnvVars,
collectionPath collectionPath
); );
@ -699,7 +699,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
); );
@ -756,7 +756,7 @@ const registerNetworkIpc = (mainWindow) => {
const requestUid = uuid(); const requestUid = uuid();
const collectionPath = collection.pathname; const collectionPath = collection.pathname;
const collectionUid = collection.uid; const collectionUid = collection.uid;
const collectionVariables = collection.collectionVariables; const runtimeVariables = collection.runtimeVariables;
const processEnvVars = getProcessEnvVars(collectionUid); const processEnvVars = getProcessEnvVars(collectionUid);
const brunoConfig = getBrunoConfig(collection.uid); const brunoConfig = getBrunoConfig(collection.uid);
const scriptingConfig = get(brunoConfig, 'scripts', {}); const scriptingConfig = get(brunoConfig, 'scripts', {});
@ -768,17 +768,17 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
); );
interpolateVars(request, envVars, collection.collectionVariables, processEnvVars); interpolateVars(request, envVars, collection.runtimeVariables, processEnvVars);
const axiosInstance = await configureRequest( const axiosInstance = await configureRequest(
collection.uid, collection.uid,
request, request,
envVars, envVars,
collection.collectionVariables, collection.runtimeVariables,
processEnvVars, processEnvVars,
collectionPath collectionPath
); );
@ -792,7 +792,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
); );
@ -819,7 +819,7 @@ const registerNetworkIpc = (mainWindow) => {
ipcMain.handle( ipcMain.handle(
'renderer:run-collection-folder', 'renderer:run-collection-folder',
async (event, folder, collection, environment, collectionVariables, recursive) => { async (event, folder, collection, environment, runtimeVariables, recursive) => {
const collectionUid = collection.uid; const collectionUid = collection.uid;
const collectionPath = collection.pathname; const collectionPath = collection.pathname;
const folderUid = folder ? folder.uid : null; const folderUid = folder ? folder.uid : null;
@ -902,7 +902,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
); );
@ -930,7 +930,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionUid, collectionUid,
request, request,
envVars, envVars,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
collectionPath collectionPath
); );
@ -998,7 +998,7 @@ const registerNetworkIpc = (mainWindow) => {
collectionPath, collectionPath,
collectionRoot, collectionRoot,
collectionUid, collectionUid,
collectionVariables, runtimeVariables,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
); );
@ -1016,7 +1016,7 @@ const registerNetworkIpc = (mainWindow) => {
request, request,
response, response,
envVars, envVars,
collectionVariables, runtimeVariables,
processEnvVars processEnvVars
); );
@ -1040,7 +1040,7 @@ const registerNetworkIpc = (mainWindow) => {
request, request,
response, response,
envVars, envVars,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
onConsoleLog, onConsoleLog,
processEnvVars, processEnvVars,
@ -1055,7 +1055,7 @@ const registerNetworkIpc = (mainWindow) => {
mainWindow.webContents.send('main:script-environment-update', { mainWindow.webContents.send('main:script-environment-update', {
envVariables: testResults.envVariables, envVariables: testResults.envVariables,
collectionVariables: testResults.collectionVariables, runtimeVariables: testResults.runtimeVariables,
collectionUid collectionUid
}); });
} }

View File

@ -1,13 +1,13 @@
const { forOwn, cloneDeep } = require('lodash'); const { forOwn, cloneDeep } = require('lodash');
const { interpolate } = require('@usebruno/common'); const { interpolate } = require('@usebruno/common');
const interpolateString = (str, { envVars, collectionVariables, processEnvVars }) => { const interpolateString = (str, { envVars, runtimeVariables, processEnvVars }) => {
if (!str || !str.length || typeof str !== 'string') { if (!str || !str.length || typeof str !== 'string') {
return str; return str;
} }
processEnvVars = processEnvVars || {}; processEnvVars = processEnvVars || {};
collectionVariables = collectionVariables || {}; runtimeVariables = runtimeVariables || {};
// we clone envVars because we don't want to modify the original object // we clone envVars because we don't want to modify the original object
envVars = envVars ? cloneDeep(envVars) : {}; envVars = envVars ? cloneDeep(envVars) : {};
@ -24,10 +24,10 @@ const interpolateString = (str, { envVars, collectionVariables, processEnvVars }
}); });
}); });
// collectionVariables take precedence over envVars // runtimeVariables take precedence over envVars
const combinedVars = { const combinedVars = {
...envVars, ...envVars,
...collectionVariables, ...runtimeVariables,
process: { process: {
env: { env: {
...processEnvVars ...processEnvVars

View File

@ -12,7 +12,7 @@ const getContentType = (headers = {}) => {
return contentType; return contentType;
}; };
const interpolateVars = (request, envVars = {}, collectionVariables = {}, processEnvVars = {}) => { const interpolateVars = (request, envVars = {}, runtimeVariables = {}, processEnvVars = {}) => {
const requestVariables = request?.requestVariables || {}; const requestVariables = request?.requestVariables || {};
// we clone envVars because we don't want to modify the original object // we clone envVars because we don't want to modify the original object
envVars = cloneDeep(envVars); envVars = cloneDeep(envVars);
@ -34,11 +34,11 @@ const interpolateVars = (request, envVars = {}, collectionVariables = {}, proces
return str; return str;
} }
// collectionVariables take precedence over envVars // runtimeVariables take precedence over envVars
const combinedVars = { const combinedVars = {
...envVars, ...envVars,
...requestVariables, ...requestVariables,
...collectionVariables, ...runtimeVariables,
process: { process: {
env: { env: {
...processEnvVars ...processEnvVars

View File

@ -4,9 +4,9 @@ const { interpolate } = require('@usebruno/common');
const variableNameRegex = /^[\w-.]*$/; const variableNameRegex = /^[\w-.]*$/;
class Bru { class Bru {
constructor(envVariables, collectionVariables, processEnvVars, collectionPath, requestVariables) { constructor(envVariables, runtimeVariables, processEnvVars, collectionPath, requestVariables) {
this.envVariables = envVariables || {}; this.envVariables = envVariables || {};
this.collectionVariables = collectionVariables || {}; this.runtimeVariables = runtimeVariables || {};
this.processEnvVars = cloneDeep(processEnvVars || {}); this.processEnvVars = cloneDeep(processEnvVars || {});
this.requestVariables = requestVariables || {}; this.requestVariables = requestVariables || {};
this.collectionPath = collectionPath; this.collectionPath = collectionPath;
@ -20,7 +20,7 @@ class Bru {
const combinedVars = { const combinedVars = {
...this.envVariables, ...this.envVariables,
...this.requestVariables, ...this.requestVariables,
...this.collectionVariables, ...this.runtimeVariables,
process: { process: {
env: { env: {
...this.processEnvVars ...this.processEnvVars
@ -60,7 +60,7 @@ class Bru {
} }
hasVar(key) { hasVar(key) {
return Object.hasOwn(this.collectionVariables, key); return Object.hasOwn(this.runtimeVariables, key);
} }
setVar(key, value) { setVar(key, value) {
@ -75,7 +75,7 @@ class Bru {
); );
} }
this.collectionVariables[key] = value; this.runtimeVariables[key] = value;
} }
getVar(key) { getVar(key) {
@ -86,11 +86,11 @@ class Bru {
); );
} }
return this._interpolate(this.collectionVariables[key]); return this._interpolate(this.runtimeVariables[key]);
} }
deleteVar(key) { deleteVar(key) {
delete this.collectionVariables[key]; delete this.runtimeVariables[key];
} }
getRequestVar(key) { getRequestVar(key) {

View File

@ -2,7 +2,7 @@ const { interpolate } = require('@usebruno/common');
const interpolateString = ( const interpolateString = (
str, str,
{ envVariables = {}, collectionVariables = {}, processEnvVars = {}, requestVariables = {} } { envVariables = {}, runtimeVariables = {}, processEnvVars = {}, requestVariables = {} }
) => { ) => {
if (!str || !str.length || typeof str !== 'string') { if (!str || !str.length || typeof str !== 'string') {
return str; return str;
@ -11,7 +11,7 @@ const interpolateString = (
const combinedVars = { const combinedVars = {
...envVariables, ...envVariables,
...requestVariables, ...requestVariables,
...collectionVariables, ...runtimeVariables,
process: { process: {
env: { env: {
...processEnvVars ...processEnvVars

View File

@ -168,7 +168,7 @@ const evaluateRhsOperand = (rhsOperand, operator, context) => {
const interpolationContext = { const interpolationContext = {
requestVariables: context.bru.requestVariables, requestVariables: context.bru.requestVariables,
collectionVariables: context.bru.collectionVariables, runtimeVariables: context.bru.runtimeVariables,
envVariables: context.bru.envVariables, envVariables: context.bru.envVariables,
processEnvVars: context.bru.processEnvVars processEnvVars: context.bru.processEnvVars
}; };
@ -204,14 +204,14 @@ const evaluateRhsOperand = (rhsOperand, operator, context) => {
}; };
class AssertRuntime { class AssertRuntime {
runAssertions(assertions, request, response, envVariables, collectionVariables, processEnvVars) { runAssertions(assertions, request, response, envVariables, runtimeVariables, processEnvVars) {
const requestVariables = request?.requestVariables || {}; const requestVariables = request?.requestVariables || {};
const enabledAssertions = _.filter(assertions, (a) => a.enabled); const enabledAssertions = _.filter(assertions, (a) => a.enabled);
if (!enabledAssertions.length) { if (!enabledAssertions.length) {
return []; return [];
} }
const bru = new Bru(envVariables, collectionVariables, processEnvVars, undefined, requestVariables); const bru = new Bru(envVariables, runtimeVariables, processEnvVars, undefined, requestVariables);
const req = new BrunoRequest(request); const req = new BrunoRequest(request);
const res = createResponseParser(response); const res = createResponseParser(response);
@ -224,7 +224,7 @@ class AssertRuntime {
const context = { const context = {
...envVariables, ...envVariables,
...requestVariables, ...requestVariables,
...collectionVariables, ...runtimeVariables,
...processEnvVars, ...processEnvVars,
...bruContext ...bruContext
}; };

View File

@ -38,14 +38,14 @@ class ScriptRuntime {
script, script,
request, request,
envVariables, envVariables,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
onConsoleLog, onConsoleLog,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
) { ) {
const requestVariables = request?.requestVariables || {}; const requestVariables = request?.requestVariables || {};
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath, requestVariables); const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, requestVariables);
const req = new BrunoRequest(request); const req = new BrunoRequest(request);
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false); const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []); const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
@ -126,7 +126,7 @@ class ScriptRuntime {
return { return {
request, request,
envVariables: cleanJson(envVariables), envVariables: cleanJson(envVariables),
collectionVariables: cleanJson(collectionVariables), runtimeVariables: cleanJson(runtimeVariables),
nextRequestName: bru.nextRequest nextRequestName: bru.nextRequest
}; };
} }
@ -136,14 +136,14 @@ class ScriptRuntime {
request, request,
response, response,
envVariables, envVariables,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
onConsoleLog, onConsoleLog,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
) { ) {
const requestVariables = request?.requestVariables || {}; const requestVariables = request?.requestVariables || {};
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath, requestVariables); const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, requestVariables);
const req = new BrunoRequest(request); const req = new BrunoRequest(request);
const res = new BrunoResponse(response); const res = new BrunoResponse(response);
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false); const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
@ -221,7 +221,7 @@ class ScriptRuntime {
return { return {
response, response,
envVariables: cleanJson(envVariables), envVariables: cleanJson(envVariables),
collectionVariables: cleanJson(collectionVariables), runtimeVariables: cleanJson(runtimeVariables),
nextRequestName: bru.nextRequest nextRequestName: bru.nextRequest
}; };
} }

View File

@ -39,14 +39,14 @@ class TestRuntime {
request, request,
response, response,
envVariables, envVariables,
collectionVariables, runtimeVariables,
collectionPath, collectionPath,
onConsoleLog, onConsoleLog,
processEnvVars, processEnvVars,
scriptingConfig scriptingConfig
) { ) {
const requestVariables = request?.requestVariables || {}; const requestVariables = request?.requestVariables || {};
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath, requestVariables); const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, requestVariables);
const req = new BrunoRequest(request); const req = new BrunoRequest(request);
const res = new BrunoResponse(response); const res = new BrunoResponse(response);
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false); const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
@ -75,7 +75,7 @@ class TestRuntime {
return { return {
request, request,
envVariables, envVariables,
collectionVariables, runtimeVariables,
results: __brunoTestResults.getResults() results: __brunoTestResults.getResults()
}; };
} }
@ -146,7 +146,7 @@ class TestRuntime {
return { return {
request, request,
envVariables: cleanJson(envVariables), envVariables: cleanJson(envVariables),
collectionVariables: cleanJson(collectionVariables), runtimeVariables: cleanJson(runtimeVariables),
results: cleanJson(__brunoTestResults.getResults()) results: cleanJson(__brunoTestResults.getResults())
}; };
} }

View File

@ -4,7 +4,7 @@ const BrunoRequest = require('../bruno-request');
const { evaluateJsTemplateLiteral, evaluateJsExpression, createResponseParser } = require('../utils'); const { evaluateJsTemplateLiteral, evaluateJsExpression, createResponseParser } = require('../utils');
class VarsRuntime { class VarsRuntime {
runPreRequestVars(vars, request, envVariables, collectionVariables, collectionPath, processEnvVars) { runPreRequestVars(vars, request, envVariables, runtimeVariables, collectionPath, processEnvVars) {
if (!request?.requestVariables) { if (!request?.requestVariables) {
request.requestVariables = {}; request.requestVariables = {};
} }
@ -13,7 +13,7 @@ class VarsRuntime {
return; return;
} }
const bru = new Bru(envVariables, collectionVariables, processEnvVars); const bru = new Bru(envVariables, runtimeVariables, processEnvVars);
const req = new BrunoRequest(request); const req = new BrunoRequest(request);
const bruContext = { const bruContext = {
@ -23,7 +23,7 @@ class VarsRuntime {
const context = { const context = {
...envVariables, ...envVariables,
...collectionVariables, ...runtimeVariables,
...bruContext ...bruContext
}; };
@ -33,14 +33,14 @@ class VarsRuntime {
}); });
} }
runPostResponseVars(vars, request, response, envVariables, collectionVariables, collectionPath, processEnvVars) { runPostResponseVars(vars, request, response, envVariables, runtimeVariables, collectionPath, processEnvVars) {
const requestVariables = request?.requestVariables || {}; const requestVariables = request?.requestVariables || {};
const enabledVars = _.filter(vars, (v) => v.enabled); const enabledVars = _.filter(vars, (v) => v.enabled);
if (!enabledVars.length) { if (!enabledVars.length) {
return; return;
} }
const bru = new Bru(envVariables, collectionVariables, processEnvVars, undefined, requestVariables); const bru = new Bru(envVariables, runtimeVariables, processEnvVars, undefined, requestVariables);
const req = new BrunoRequest(request); const req = new BrunoRequest(request);
const res = createResponseParser(response); const res = createResponseParser(response);
@ -52,7 +52,7 @@ class VarsRuntime {
const context = { const context = {
...envVariables, ...envVariables,
...collectionVariables, ...runtimeVariables,
...bruContext ...bruContext
}; };
@ -75,7 +75,7 @@ class VarsRuntime {
return { return {
envVariables, envVariables,
collectionVariables, runtimeVariables,
error error
}; };
} }

View File

@ -116,7 +116,7 @@ describe('runtime', () => {
const runtime = new ScriptRuntime(); const runtime = new ScriptRuntime();
const result = await runtime.runRequestScript(script, { ...baseRequest }, {}, {}, '.', null, process.env); const result = await runtime.runRequestScript(script, { ...baseRequest }, {}, {}, '.', null, process.env);
expect(result.collectionVariables.validation).toBeTruthy(); expect(result.runtimeVariables.validation).toBeTruthy();
}); });
}); });
@ -171,7 +171,7 @@ describe('runtime', () => {
null, null,
process.env process.env
); );
expect(result.collectionVariables.validation).toBeTruthy(); expect(result.runtimeVariables.validation).toBeTruthy();
}); });
}); });
}); });

View File

@ -309,7 +309,7 @@ const collectionSchema = Yup.object({
runnerResult: Yup.object({ runnerResult: Yup.object({
items: Yup.array() items: Yup.array()
}), }),
collectionVariables: Yup.object(), runtimeVariables: Yup.object(),
brunoConfig: Yup.object(), brunoConfig: Yup.object(),
root: folderRootSchema root: folderRootSchema
}) })