mirror of
https://github.com/usebruno/bruno.git
synced 2025-02-18 02:30:58 +01:00
feat: moved env var interpolation logic to electron
This commit is contained in:
parent
977637e556
commit
a45628dd85
@ -108,14 +108,9 @@ export const sendRequest = (item, collectionUid) => (dispatch, getState) => {
|
|||||||
const itemCopy = cloneDeep(item);
|
const itemCopy = cloneDeep(item);
|
||||||
const collectionCopy = cloneDeep(collection);
|
const collectionCopy = cloneDeep(collection);
|
||||||
|
|
||||||
if (collection.activeEnvironmentUid) {
|
|
||||||
const environment = findEnvironmentInCollection(collectionCopy, collection.activeEnvironmentUid);
|
const environment = findEnvironmentInCollection(collectionCopy, collection.activeEnvironmentUid);
|
||||||
if (environment) {
|
|
||||||
interpolateEnvironmentVars(itemCopy, environment.variables);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sendNetworkRequest(itemCopy, collectionUid)
|
sendNetworkRequest(itemCopy, collectionUid, environment)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
return dispatch(
|
return dispatch(
|
||||||
responseReceived({
|
responseReceived({
|
||||||
|
@ -454,61 +454,6 @@ export const isLocalCollection = (collection) => {
|
|||||||
return collection.pathname ? true : false;
|
return collection.pathname ? true : false;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const interpolateEnvironmentVars = (item, variables) => {
|
|
||||||
const envVars = {
|
|
||||||
interpolation: { escapeValue: true }
|
|
||||||
};
|
|
||||||
const _item = item.draft ? item.draft : item;
|
|
||||||
const { request } = _item;
|
|
||||||
each(variables, (variable) => {
|
|
||||||
envVars[variable.name] = variable.value;
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: Find a better interpolation library
|
|
||||||
const interpolate = (str) => {
|
|
||||||
if(!str || !str.length || typeof str !== "string") {
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
return str.reckon(envVars);
|
|
||||||
};
|
|
||||||
|
|
||||||
request.url = interpolate(request.url);
|
|
||||||
|
|
||||||
each(request.headers, (header) => {
|
|
||||||
header.value = interpolate(header.value);
|
|
||||||
});
|
|
||||||
each(request.params, (param) => {
|
|
||||||
param.value = interpolate(param.value);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Todo: Make interpolation work with body mode json
|
|
||||||
switch (request.body.mode) {
|
|
||||||
case 'text': {
|
|
||||||
request.body.text = interpolate(request.body.text);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'xml': {
|
|
||||||
request.body.text = interpolate(request.body.text);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'multipartForm': {
|
|
||||||
each(request.body.multipartForm, (param) => {
|
|
||||||
param.value = interpolate(param.value);
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'formUrlEncoded': {
|
|
||||||
each(request.body.formUrlEncoded, (param) => {
|
|
||||||
param.value = interpolate(param.value);
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return request;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deleteUidsInItem = (item) => {
|
export const deleteUidsInItem = (item) => {
|
||||||
delete item.uid;
|
delete item.uid;
|
||||||
const params = get(item, 'request.params', []);
|
const params = get(item, 'request.params', []);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
export const sendNetworkRequest = async (item, collectionUid) => {
|
export const sendNetworkRequest = async (item, collectionUid, environment) => {
|
||||||
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)) {
|
||||||
const timeStart = Date.now();
|
const timeStart = Date.now();
|
||||||
sendHttpRequest(item, collectionUid)
|
sendHttpRequest(item, collectionUid, environment)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
const timeEnd = Date.now();
|
const timeEnd = Date.now();
|
||||||
resolve({
|
resolve({
|
||||||
@ -20,12 +20,12 @@ export const sendNetworkRequest = async (item, collectionUid) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const sendHttpRequest = async (item, collectionUid) => {
|
const sendHttpRequest = async (item, collectionUid, environment) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const { ipcRenderer } = window;
|
const { ipcRenderer } = window;
|
||||||
|
|
||||||
ipcRenderer
|
ipcRenderer
|
||||||
.invoke('send-http-request', item, collectionUid)
|
.invoke('send-http-request', item, collectionUid, environment)
|
||||||
.then(resolve)
|
.then(resolve)
|
||||||
.catch(reject);
|
.catch(reject);
|
||||||
});
|
});
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
"fs-extra": "^10.1.0",
|
"fs-extra": "^10.1.0",
|
||||||
"is-valid-path": "^0.1.1",
|
"is-valid-path": "^0.1.1",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
|
"mustache": "^4.2.0",
|
||||||
"nanoid": "3.3.4",
|
"nanoid": "3.3.4",
|
||||||
"vm2": "^3.9.13",
|
"vm2": "^3.9.13",
|
||||||
"yup": "^0.32.11"
|
"yup": "^0.32.11"
|
||||||
|
@ -9,12 +9,12 @@ const { uuid } = require('../../utils/common');
|
|||||||
|
|
||||||
const registerNetworkIpc = (mainWindow, watcher, lastOpenedCollections) => {
|
const registerNetworkIpc = (mainWindow, watcher, lastOpenedCollections) => {
|
||||||
// handler for sending http request
|
// handler for sending http request
|
||||||
ipcMain.handle('send-http-request', async (event, item, collectionUid) => {
|
ipcMain.handle('send-http-request', async (event, item, collectionUid, environment) => {
|
||||||
const cancelTokenUid = uuid();
|
const cancelTokenUid = uuid();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const _request = item.draft ? item.draft.request : item.request;
|
const _request = item.draft ? item.draft.request : item.request;
|
||||||
const request = prepareRequest(_request);
|
const request = prepareRequest(_request, environment);
|
||||||
|
|
||||||
// make axios work in node using form data
|
// make axios work in node using form data
|
||||||
// reference: https://github.com/axios/axios/issues/1006#issuecomment-320165427
|
// reference: https://github.com/axios/axios/issues/1006#issuecomment-320165427
|
||||||
|
68
packages/bruno-electron/src/ipc/network/interpolate-vars.js
Normal file
68
packages/bruno-electron/src/ipc/network/interpolate-vars.js
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
const Mustache = require('mustache');
|
||||||
|
const { each } = require('lodash');
|
||||||
|
|
||||||
|
// override the default escape function to prevent escaping
|
||||||
|
Mustache.escape = function (value) {
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
const interpolateVars = (request, environment) => {
|
||||||
|
if(!environment) {
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
const variables = environment.variables;
|
||||||
|
if(!variables || !variables.length) {
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
const envVars = {};
|
||||||
|
each(variables, (variable) => {
|
||||||
|
envVars[variable.name] = Mustache.escape(variable.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
const interpolate = (str) => {
|
||||||
|
if(!str || !str.length || typeof str !== "string") {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Mustache.render(str, envVars);
|
||||||
|
};
|
||||||
|
|
||||||
|
request.url = interpolate(request.url);
|
||||||
|
|
||||||
|
each(request.headers, (header) => {
|
||||||
|
header.value = interpolate(header.value);
|
||||||
|
});
|
||||||
|
each(request.params, (param) => {
|
||||||
|
param.value = interpolate(param.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Todo: Make interpolation work with body mode json
|
||||||
|
switch (request.body.mode) {
|
||||||
|
case 'text': {
|
||||||
|
request.body.text = interpolate(request.body.text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'xml': {
|
||||||
|
request.body.text = interpolate(request.body.text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'multipartForm': {
|
||||||
|
each(request.body.multipartForm, (param) => {
|
||||||
|
param.value = interpolate(param.value);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'formUrlEncoded': {
|
||||||
|
each(request.body.formUrlEncoded, (param) => {
|
||||||
|
param.value = interpolate(param.value);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return request;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = interpolateVars;
|
@ -1,7 +1,9 @@
|
|||||||
const { get, each, filter } = require('lodash');
|
const { get, each, filter } = require('lodash');
|
||||||
const qs = require('qs');
|
const qs = require('qs');
|
||||||
|
const interpolateVars = require('./interpolate-vars');
|
||||||
|
|
||||||
const prepareRequest = (request) => {
|
const prepareRequest = (request, environment) => {
|
||||||
|
interpolateVars(request, environment);
|
||||||
const headers = {};
|
const headers = {};
|
||||||
each(request.headers, (h) => {
|
each(request.headers, (h) => {
|
||||||
if (h.enabled) {
|
if (h.enabled) {
|
||||||
|
Loading…
Reference in New Issue
Block a user