diff --git a/packages/bruno-app/src/utils/codemirror/autocomplete.js b/packages/bruno-app/src/utils/codemirror/autocomplete.js index 2e79fdaa7..72cf2c7f6 100644 --- a/packages/bruno-app/src/utils/codemirror/autocomplete.js +++ b/packages/bruno-app/src/utils/codemirror/autocomplete.js @@ -136,6 +136,7 @@ const STATIC_API_HINTS = { 'bru.getCollectionName()', 'bru.isSafeMode()', 'bru.getOauth2CredentialVar(key)', + 'bru.hasGlobalEnvVar(key)', 'bru.getGlobalEnvVar(key)', 'bru.setGlobalEnvVar(key, value)', // 'bru.deleteGlobalEnvVar(key)', diff --git a/packages/bruno-converters/src/postman/postman-translations.js b/packages/bruno-converters/src/postman/postman-translations.js index 2da15b7c0..28df382f4 100644 --- a/packages/bruno-converters/src/postman/postman-translations.js +++ b/packages/bruno-converters/src/postman/postman-translations.js @@ -30,6 +30,7 @@ const replacements = { 'pm\\.response\\.responseTime': 'res.getResponseTime()', 'pm\\.globals\\.set\\(': 'bru.setGlobalEnvVar(', 'pm\\.globals\\.get\\(': 'bru.getGlobalEnvVar(', + 'pm\\.globals\\.has\\(': 'bru.hasGlobalEnvVar(', // 'pm\\.globals\\.unset\\(': 'bru.deleteGlobalEnvVar(', 'pm\\.globals\\.toObject\\(': 'bru.getAllGlobalEnvVars(', // 'pm\\.globals\\.clear\\(': 'bru.deleteAllGlobalEnvVars(', diff --git a/packages/bruno-converters/src/utils/bruno-to-postman-translator.js b/packages/bruno-converters/src/utils/bruno-to-postman-translator.js index 5ff3a6aa8..29555f7cc 100644 --- a/packages/bruno-converters/src/utils/bruno-to-postman-translator.js +++ b/packages/bruno-converters/src/utils/bruno-to-postman-translator.js @@ -20,6 +20,7 @@ const simpleTranslations = { // Global variables 'bru.getGlobalEnvVar': 'pm.globals.get', 'bru.setGlobalEnvVar': 'pm.globals.set', + 'bru.hasGlobalEnvVar': 'pm.globals.has', // 'bru.deleteGlobalEnvVar': 'pm.globals.unset', 'bru.getAllGlobalEnvVars': 'pm.globals.toObject', // 'bru.deleteAllGlobalEnvVars': 'pm.globals.clear', diff --git a/packages/bruno-converters/src/utils/postman-to-bruno-translator.js b/packages/bruno-converters/src/utils/postman-to-bruno-translator.js index 3b222bf50..10cfeea99 100644 --- a/packages/bruno-converters/src/utils/postman-to-bruno-translator.js +++ b/packages/bruno-converters/src/utils/postman-to-bruno-translator.js @@ -12,6 +12,7 @@ const simpleTranslations = { // Global Variables 'pm.globals.get': 'bru.getGlobalEnvVar', 'pm.globals.set': 'bru.setGlobalEnvVar', + 'pm.globals.has': 'bru.hasGlobalEnvVar', 'pm.globals.replaceIn': 'bru.interpolate', // 'pm.globals.unset': 'bru.deleteGlobalEnvVar', 'pm.globals.toObject': 'bru.getAllGlobalEnvVars', @@ -313,30 +314,6 @@ const complexTransformations = [ } }, - // pm.globals.has requires special handling - { - pattern: 'pm.globals.has', - transform: (path, j) => { - const callExpr = path.parent.value; - const args = callExpr.arguments; - - // Create: bru.getGlobalEnvVar(arg) !== undefined && bru.getGlobalEnvVar(arg) !== null - return j.logicalExpression( - '&&', - j.binaryExpression( - '!==', - j.callExpression(j.identifier('bru.getGlobalEnvVar'), args), - j.identifier('undefined') - ), - j.binaryExpression( - '!==', - j.callExpression(j.identifier('bru.getGlobalEnvVar'), args), - j.identifier('null') - ) - ); - } - }, - // pm.request.headers.add({key, value}) -> req.setHeader(key, value) { pattern: 'pm.request.headers.add', diff --git a/packages/bruno-converters/tests/bruno/bruno-to-postman-translations/variables.test.js b/packages/bruno-converters/tests/bruno/bruno-to-postman-translations/variables.test.js index 758158918..bf4dae6cf 100644 --- a/packages/bruno-converters/tests/bruno/bruno-to-postman-translations/variables.test.js +++ b/packages/bruno-converters/tests/bruno/bruno-to-postman-translations/variables.test.js @@ -51,6 +51,12 @@ describe('Bruno to Postman Variables Translation', () => { expect(translatedCode).toBe('pm.globals.set("test", "value");'); }); + it('should translate bru.hasGlobalEnvVar', () => { + const code = 'bru.hasGlobalEnvVar("token");'; + const translatedCode = translateBruToPostman(code); + expect(translatedCode).toBe('pm.globals.has("token");'); + }); + // Collection variables tests it('should translate bru.getCollectionVar', () => { const code = 'bru.getCollectionVar("baseUrl");'; diff --git a/packages/bruno-converters/tests/postman/postman-translations/transpiler-tests/variables.test.js b/packages/bruno-converters/tests/postman/postman-translations/transpiler-tests/variables.test.js index 30e12f249..4832f13f8 100644 --- a/packages/bruno-converters/tests/postman/postman-translations/transpiler-tests/variables.test.js +++ b/packages/bruno-converters/tests/postman/postman-translations/transpiler-tests/variables.test.js @@ -244,23 +244,20 @@ describe('Variables Translation', () => { const code = 'pm.globals.has("token");'; const translatedCode = translateCode(code); - expect(translatedCode).toContain('bru.getGlobalEnvVar("token") !== undefined'); - expect(translatedCode).toContain('bru.getGlobalEnvVar("token") !== null'); + expect(translatedCode).toBe('bru.hasGlobalEnvVar("token");'); }); it('should translate pm.globals.has in conditional', () => { const code = 'if (pm.globals.has("authToken")) { console.log("Token exists"); }'; const translatedCode = translateCode(code); - expect(translatedCode).toContain('bru.getGlobalEnvVar("authToken") !== undefined'); - expect(translatedCode).toContain('bru.getGlobalEnvVar("authToken") !== null'); - expect(translatedCode).toContain('console.log("Token exists");'); + expect(translatedCode).toBe('if (bru.hasGlobalEnvVar("authToken")) { console.log("Token exists"); }'); }); it('should translate pm.globals.has with variable assignment', () => { const code = 'const hasGlobal = pm.globals.has("config");'; const translatedCode = translateCode(code); - expect(translatedCode).toContain('const hasGlobal = bru.getGlobalEnvVar("config") !== undefined && bru.getGlobalEnvVar("config") !== null'); + expect(translatedCode).toBe('const hasGlobal = bru.hasGlobalEnvVar("config");'); }); }); diff --git a/packages/bruno-js/src/bru.js b/packages/bruno-js/src/bru.js index f728f15c0..0e0a87f5b 100644 --- a/packages/bruno-js/src/bru.js +++ b/packages/bruno-js/src/bru.js @@ -222,6 +222,10 @@ class Bru { } } + hasGlobalEnvVar(key) { + return Object.hasOwn(this.globalEnvironmentVariables, key); + } + getGlobalEnvVar(key) { return this.interpolate(this.globalEnvironmentVariables[key]); } diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/bru.js b/packages/bruno-js/src/sandbox/quickjs/shims/bru.js index 708ef755e..83a3d6e11 100644 --- a/packages/bruno-js/src/sandbox/quickjs/shims/bru.js +++ b/packages/bruno-js/src/sandbox/quickjs/shims/bru.js @@ -116,6 +116,12 @@ const addBruShimToContext = (vm, bru) => { vm.setProp(bruObject, 'getAllGlobalEnvVars', getAllGlobalEnvVars); getAllGlobalEnvVars.dispose(); + let hasGlobalEnvVar = vm.newFunction('hasGlobalEnvVar', function (key) { + return marshallToVm(bru.hasGlobalEnvVar(vm.dump(key)), vm); + }); + vm.setProp(bruObject, 'hasGlobalEnvVar', hasGlobalEnvVar); + hasGlobalEnvVar.dispose(); + // TODO: deleteAllGlobalEnvVars works in the request lifecycle but does not update the UI. // Re-enable once the UI sync issue is resolved. // let deleteAllGlobalEnvVars = vm.newFunction('deleteAllGlobalEnvVars', function () {