@@ -9,7 +9,7 @@ const contentDispositionParser = require('content-disposition');
9
9
const mime = require ( 'mime-types' ) ;
10
10
const FormData = require ( 'form-data' ) ;
11
11
const { ipcMain } = require ( 'electron' ) ;
12
- const { each, get, extend, cloneDeep } = require ( 'lodash' ) ;
12
+ const { each, get, extend, cloneDeep, merge } = require ( 'lodash' ) ;
13
13
const { NtlmClient } = require ( 'axios-ntlm' ) ;
14
14
const { VarsRuntime, AssertRuntime, ScriptRuntime, TestRuntime } = require ( '@usebruno/js' ) ;
15
15
const { interpolateString } = require ( './interpolate-string' ) ;
@@ -24,7 +24,7 @@ const { uuid, safeStringifyJSON, safeParseJSON, parseDataFromResponse, parseData
24
24
const { chooseFileToSave, writeBinaryFile, writeFile } = require ( '../../utils/filesystem' ) ;
25
25
const { addCookieToJar, getDomainsWithCookies, getCookieStringForUrl } = require ( '../../utils/cookies' ) ;
26
26
const { createFormData } = require ( '../../utils/form-data' ) ;
27
- const { findItemInCollectionByPathname, sortFolder, getAllRequestsInFolderRecursively, getEnvVars } = require ( '../../utils/collection' ) ;
27
+ const { findItemInCollectionByPathname, sortFolder, getAllRequestsInFolderRecursively, getEnvVars, getTreePathFromCollectionToItem , mergeVars } = require ( '../../utils/collection' ) ;
28
28
const { getOAuth2TokenUsingAuthorizationCode, getOAuth2TokenUsingClientCredentials, getOAuth2TokenUsingPasswordCredentials } = require ( '../../utils/oauth2' ) ;
29
29
const { preferencesUtil } = require ( '../../store/preferences' ) ;
30
30
const { getProcessEnvVars } = require ( '../../store/process-env' ) ;
@@ -317,6 +317,77 @@ const configureRequest = async (
317
317
return axiosInstance ;
318
318
} ;
319
319
320
+ const fetchGqlSchemaHandler = async ( event , endpoint , environment , _request , collection ) => {
321
+ try {
322
+ const requestTreePath = getTreePathFromCollectionToItem ( collection , _request ) ;
323
+ // Create a clone of the request to avoid mutating the original
324
+ const resolvedRequest = cloneDeep ( _request ) ;
325
+ // mergeVars modifies the request in place, but we'll assign it to ensure consistency
326
+ mergeVars ( collection , resolvedRequest , requestTreePath ) ;
327
+ const envVars = getEnvVars ( environment ) ;
328
+
329
+ const globalEnvironmentVars = collection . globalEnvironmentVariables ;
330
+ const folderVars = resolvedRequest . folderVariables ;
331
+ const requestVariables = resolvedRequest . requestVariables ;
332
+ const collectionVariables = resolvedRequest . collectionVariables ;
333
+ const runtimeVars = collection . runtimeVariables ;
334
+
335
+ // Precedence: runtimeVars > requestVariables > folderVars > envVars > collectionVariables > globalEnvironmentVars
336
+ const resolvedVars = merge (
337
+ { } ,
338
+ globalEnvironmentVars ,
339
+ collectionVariables ,
340
+ envVars ,
341
+ folderVars ,
342
+ requestVariables ,
343
+ runtimeVars
344
+ ) ;
345
+
346
+ const collectionRoot = get ( collection , 'root' , { } ) ;
347
+ const request = prepareGqlIntrospectionRequest ( endpoint , resolvedVars , _request , collectionRoot ) ;
348
+
349
+ request . timeout = preferencesUtil . getRequestTimeout ( ) ;
350
+
351
+ if ( ! preferencesUtil . shouldVerifyTls ( ) ) {
352
+ request . httpsAgent = new https . Agent ( {
353
+ rejectUnauthorized : false
354
+ } ) ;
355
+ }
356
+
357
+ const collectionPath = collection . pathname ;
358
+ const processEnvVars = getProcessEnvVars ( collection . uid ) ;
359
+
360
+ const axiosInstance = await configureRequest (
361
+ collection . uid ,
362
+ request ,
363
+ envVars ,
364
+ collection . runtimeVariables ,
365
+ processEnvVars ,
366
+ collectionPath
367
+ ) ;
368
+
369
+ const response = await axiosInstance ( request ) ;
370
+
371
+ return {
372
+ status : response . status ,
373
+ statusText : response . statusText ,
374
+ headers : response . headers ,
375
+ data : response . data
376
+ } ;
377
+ } catch ( error ) {
378
+ if ( error . response ) {
379
+ return {
380
+ status : error . response . status ,
381
+ statusText : error . response . statusText ,
382
+ headers : error . response . headers ,
383
+ data : error . response . data
384
+ } ;
385
+ }
386
+
387
+ return Promise . reject ( error ) ;
388
+ }
389
+ } ;
390
+
320
391
const registerNetworkIpc = ( mainWindow ) => {
321
392
const onConsoleLog = ( type , args ) => {
322
393
console [ type ] ( ...args ) ;
@@ -804,84 +875,8 @@ const registerNetworkIpc = (mainWindow) => {
804
875
} ) ;
805
876
} ) ;
806
877
807
- ipcMain . handle ( 'fetch-gql-schema' , async ( event , endpoint , environment , _request , collection ) => {
808
- try {
809
- const envVars = getEnvVars ( environment ) ;
810
- const collectionRoot = get ( collection , 'root' , { } ) ;
811
- const request = prepareGqlIntrospectionRequest ( endpoint , envVars , _request , collectionRoot ) ;
812
-
813
- request . timeout = preferencesUtil . getRequestTimeout ( ) ;
814
-
815
- if ( ! preferencesUtil . shouldVerifyTls ( ) ) {
816
- request . httpsAgent = new https . Agent ( {
817
- rejectUnauthorized : false
818
- } ) ;
819
- }
820
-
821
- const requestUid = uuid ( ) ;
822
- const collectionPath = collection . pathname ;
823
- const collectionUid = collection . uid ;
824
- const runtimeVariables = collection . runtimeVariables ;
825
- const processEnvVars = getProcessEnvVars ( collectionUid ) ;
826
- const brunoConfig = getBrunoConfig ( collection . uid ) ;
827
- const scriptingConfig = get ( brunoConfig , 'scripts' , { } ) ;
828
- scriptingConfig . runtime = getJsSandboxRuntime ( collection ) ;
829
-
830
- await runPreRequest (
831
- request ,
832
- requestUid ,
833
- envVars ,
834
- collectionPath ,
835
- collection ,
836
- collectionUid ,
837
- runtimeVariables ,
838
- processEnvVars ,
839
- scriptingConfig
840
- ) ;
841
-
842
- interpolateVars ( request , envVars , collection . runtimeVariables , processEnvVars ) ;
843
- const axiosInstance = await configureRequest (
844
- collection . uid ,
845
- request ,
846
- envVars ,
847
- collection . runtimeVariables ,
848
- processEnvVars ,
849
- collectionPath
850
- ) ;
851
- const response = await axiosInstance ( request ) ;
852
-
853
- await runPostResponse (
854
- request ,
855
- response ,
856
- requestUid ,
857
- envVars ,
858
- collectionPath ,
859
- collection ,
860
- collectionUid ,
861
- runtimeVariables ,
862
- processEnvVars ,
863
- scriptingConfig
864
- ) ;
865
-
866
- return {
867
- status : response . status ,
868
- statusText : response . statusText ,
869
- headers : response . headers ,
870
- data : response . data
871
- } ;
872
- } catch ( error ) {
873
- if ( error . response ) {
874
- return {
875
- status : error . response . status ,
876
- statusText : error . response . statusText ,
877
- headers : error . response . headers ,
878
- data : error . response . data
879
- } ;
880
- }
881
-
882
- return Promise . reject ( error ) ;
883
- }
884
- } ) ;
878
+ // handler for fetch-gql-schema
879
+ ipcMain . handle ( 'fetch-gql-schema' , fetchGqlSchemaHandler )
885
880
886
881
ipcMain . handle (
887
882
'renderer:run-collection-folder' ,
@@ -1342,3 +1337,4 @@ const registerNetworkIpc = (mainWindow) => {
1342
1337
module . exports = registerNetworkIpc ;
1343
1338
module . exports . configureRequest = configureRequest ;
1344
1339
module . exports . getCertsAndProxyConfig = getCertsAndProxyConfig ;
1340
+ module . exports . fetchGqlSchemaHandler = fetchGqlSchemaHandler ;
0 commit comments