diff --git a/package-lock.json b/package-lock.json index da15f2bd9..7013b09eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11682,7 +11682,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", - "dev": true, "dependencies": { "is-regexp": "^3.0.0" }, @@ -11697,7 +11696,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", - "dev": true, "engines": { "node": ">=12" }, @@ -12141,7 +12139,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", - "dev": true, "engines": { "node": ">=12" }, @@ -15749,7 +15746,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", - "dev": true, "engines": { "node": ">=14.16" }, @@ -17125,6 +17121,17 @@ "node": ">= 12" } }, + "node_modules/ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -17378,6 +17385,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-ip": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", + "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", + "dependencies": { + "ip-regex": "^5.0.0", + "super-regex": "^0.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -26529,7 +26551,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==", - "dev": true, "dependencies": { "clone-regexp": "^3.0.0", "function-timeout": "^0.1.0", @@ -27078,7 +27099,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", - "dev": true, "dependencies": { "convert-hrtime": "^5.0.0" }, @@ -31303,9 +31323,6 @@ "name": "@usebruno/common", "version": "0.1.0", "license": "MIT", - "dependencies": { - "tough-cookie": "^6.0.0" - }, "devDependencies": { "@babel/preset-env": "^7.26.9", "@babel/preset-typescript": "^7.27.0", @@ -31837,34 +31854,6 @@ "node": ">=4" } }, - "packages/bruno-common/node_modules/ip-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", - "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/bruno-common/node_modules/is-ip": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", - "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", - "dev": true, - "dependencies": { - "ip-regex": "^5.0.0", - "super-regex": "^0.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "packages/bruno-common/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -31872,17 +31861,6 @@ "dev": true, "license": "MIT" }, - "packages/bruno-common/node_modules/tough-cookie": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", - "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, "packages/bruno-common/node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -33403,7 +33381,9 @@ "@grpc/proto-loader": "^0.7.15", "@types/qs": "^6.9.18", "axios": "^1.9.0", - "grpc-reflection-js": "^0.3.0" + "grpc-reflection-js": "^0.3.0", + "is-ip": "^5.0.1", + "tough-cookie": "^6.0.0" }, "devDependencies": { "@babel/preset-env": "^7.22.0", @@ -33451,6 +33431,17 @@ "proxy-from-env": "^1.1.0" } }, + "packages/bruno-requests/node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, "packages/bruno-schema": { "name": "@usebruno/schema", "version": "0.7.0", diff --git a/packages/bruno-cli/src/utils/cookies.js b/packages/bruno-cli/src/utils/cookies.js index f4aaef547..9e160a784 100644 --- a/packages/bruno-cli/src/utils/cookies.js +++ b/packages/bruno-cli/src/utils/cookies.js @@ -1 +1 @@ -module.exports = require('@usebruno/common').cookies; +module.exports = require('@usebruno/requests').cookies; diff --git a/packages/bruno-common/package.json b/packages/bruno-common/package.json index dc5bdb44a..c989069df 100644 --- a/packages/bruno-common/package.json +++ b/packages/bruno-common/package.json @@ -56,8 +56,5 @@ }, "overrides": { "rollup": "3.29.5" - }, - "dependencies": { - "tough-cookie": "^6.0.0" } } diff --git a/packages/bruno-common/src/index.ts b/packages/bruno-common/src/index.ts index 15e55346e..e72c1d847 100644 --- a/packages/bruno-common/src/index.ts +++ b/packages/bruno-common/src/index.ts @@ -1,6 +1,5 @@ export { mockDataFunctions } from './utils/faker-functions'; export { default as interpolate } from './interpolate'; export { default as isRequestTagsIncluded } from './tags'; -export { default as cookies } from './cookies'; export * as utils from './utils'; \ No newline at end of file diff --git a/packages/bruno-common/src/utils/index.ts b/packages/bruno-common/src/utils/index.ts index 4f79ff185..eee1e5d9b 100644 --- a/packages/bruno-common/src/utils/index.ts +++ b/packages/bruno-common/src/utils/index.ts @@ -2,8 +2,4 @@ export { encodeUrl, parseQueryParams, buildQueryString, -} from './url'; - -export { - isPotentiallyTrustworthyOrigin -} from './url/validation'; \ No newline at end of file +} from './url'; \ No newline at end of file diff --git a/packages/bruno-electron/src/store/cookies.js b/packages/bruno-electron/src/store/cookies.js index 0704fb64e..3b6953991 100644 --- a/packages/bruno-electron/src/store/cookies.js +++ b/packages/bruno-electron/src/store/cookies.js @@ -1,5 +1,5 @@ const Store = require('electron-store'); -const { cookies: cookiesModule } = require('@usebruno/common'); +const { cookies: cookiesModule } = require('@usebruno/requests'); const { cookieJar } = cookiesModule; const { Cookie } = require('tough-cookie'); const { createCookieString } = cookiesModule; diff --git a/packages/bruno-electron/src/utils/cookies.js b/packages/bruno-electron/src/utils/cookies.js index f4aaef547..9e160a784 100644 --- a/packages/bruno-electron/src/utils/cookies.js +++ b/packages/bruno-electron/src/utils/cookies.js @@ -1 +1 @@ -module.exports = require('@usebruno/common').cookies; +module.exports = require('@usebruno/requests').cookies; diff --git a/packages/bruno-js/src/bru.js b/packages/bruno-js/src/bru.js index c717166d6..2b677a88f 100644 --- a/packages/bruno-js/src/bru.js +++ b/packages/bruno-js/src/bru.js @@ -1,7 +1,7 @@ const { cloneDeep } = require('lodash'); const { interpolate: _interpolate } = require('@usebruno/common'); const { sendRequest } = require('@usebruno/requests').scripting; -const { jar: createCookieJar } = require('@usebruno/common').cookies; +const { jar: createCookieJar } = require('@usebruno/requests').cookies; const variableNameRegex = /^[\w-.]*$/; diff --git a/packages/bruno-requests/jest.config.js b/packages/bruno-requests/jest.config.js index 554150cbe..ae522cdc8 100644 --- a/packages/bruno-requests/jest.config.js +++ b/packages/bruno-requests/jest.config.js @@ -3,7 +3,7 @@ module.exports = { '^.+\\.(ts|js)$': 'babel-jest', }, transformIgnorePatterns: [ - '/node_modules/(?!(lodash-es)/)', + '/node_modules/(?!(lodash-es|is-ip|ip-regex|super-regex|function-timeout|time-span|convert-hrtime|clone-regexp|is-regexp)/)' ], testEnvironment: 'node', testMatch: [ diff --git a/packages/bruno-requests/package.json b/packages/bruno-requests/package.json index f8faa128d..266b3b472 100644 --- a/packages/bruno-requests/package.json +++ b/packages/bruno-requests/package.json @@ -24,8 +24,10 @@ "@grpc/grpc-js": "^1.13.3", "@grpc/proto-loader": "^0.7.15", "@types/qs": "^6.9.18", + "axios": "^1.9.0", "grpc-reflection-js": "^0.3.0", - "axios": "^1.9.0" + "is-ip": "^5.0.1", + "tough-cookie": "^6.0.0" }, "devDependencies": { "@babel/preset-env": "^7.22.0", @@ -37,8 +39,8 @@ "@rollup/plugin-typescript": "^9.0.2", "@types/jest": "^29.5.11", "babel-jest": "^29.7.0", - "jest": "^29.2.0", "builtin-modules": "^5.0.0", + "jest": "^29.2.0", "rollup": "3.29.5", "rollup-plugin-dts": "^5.0.0", "rollup-plugin-peer-deps-external": "^2.2.4", @@ -48,4 +50,4 @@ "overrides": { "rollup": "3.29.5" } -} \ No newline at end of file +} diff --git a/packages/bruno-common/tests/cookies/cookie-jar-wrapper.spec.js b/packages/bruno-requests/src/cookies/index.spec.ts similarity index 76% rename from packages/bruno-common/tests/cookies/cookie-jar-wrapper.spec.js rename to packages/bruno-requests/src/cookies/index.spec.ts index c95dbaabe..22071828d 100644 --- a/packages/bruno-common/tests/cookies/cookie-jar-wrapper.spec.js +++ b/packages/bruno-requests/src/cookies/index.spec.ts @@ -1,11 +1,17 @@ -const cookiesModule = require('../../src/cookies/index.ts').default; +import cookiesModule from './index'; +import { Cookie } from 'tough-cookie'; + +// Provide explicit type for the cookie-jar wrapper returned by cookiesModule.jar() +type CookieJarWrapper = ReturnType; + +const jarFactory = (): CookieJarWrapper => cookiesModule.jar(); describe('Bruno Cookie Jar Wrapper - API Examples', () => { - let jar; + let jar: CookieJarWrapper; const testUrl = 'https://api.example.com'; beforeEach(() => { - jar = cookiesModule.jar(); + jar = jarFactory(); // Clear all cookies before each test jar.clear(); }); @@ -19,7 +25,7 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.setCookie(testUrl, cookieName, cookieValue); // Get the cookie back - const cookie = await jar.getCookie(testUrl, cookieName); + const cookie = (await jar.getCookie(testUrl, cookieName))!; expect(cookie.key).toBe(cookieName); expect(cookie.value).toBe(cookieValue); expect(cookie.domain).toBe('api.example.com'); @@ -36,7 +42,7 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.setCookie(testUrl, cookieObj); - const cookie = await jar.getCookie(testUrl + '/api', 'sessionId'); + const cookie = (await jar.getCookie(testUrl + '/api', 'sessionId'))!; expect(cookie.key).toBe('sessionId'); expect(cookie.value).toBe('abc123'); expect(cookie.path).toBe('/api'); @@ -61,10 +67,10 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.setCookies(testUrl, cookies); // Verify all cookies were set - const retrievedCookies = await jar.getCookies(testUrl); + const retrievedCookies = (await jar.getCookies(testUrl)) as Cookie[]; expect(retrievedCookies).toHaveLength(3); - const cookieNames = retrievedCookies.map(c => c.key); + const cookieNames = retrievedCookies.map((c: Cookie) => c.key); expect(cookieNames).toContain('cookie1'); expect(cookieNames).toContain('cookie2'); expect(cookieNames).toContain('cookie3'); @@ -76,13 +82,13 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.setCookie(testUrl, 'session', 'sess456'); await jar.setCookie(testUrl, 'prefs', 'theme=dark'); - const cookies = await jar.getCookies(testUrl); + const cookies = (await jar.getCookies(testUrl)) as Cookie[]; expect(cookies).toHaveLength(3); - const cookieMap = cookies.reduce((map, cookie) => { + const cookieMap = (cookies as Cookie[]).reduce>((map, cookie: Cookie) => { map[cookie.key] = cookie.value; return map; - }, {}); + }, {} as Record); expect(cookieMap.auth).toBe('token123'); expect(cookieMap.session).toBe('sess456'); @@ -100,10 +106,10 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.deleteCookie(testUrl, 'remove'); // Verify only one cookie remains - const cookies = await jar.getCookies(testUrl); + const cookies = (await jar.getCookies(testUrl)) as Cookie[]; expect(cookies).toHaveLength(1); - expect(cookies[0].key).toBe('keep'); - expect(cookies[0].value).toBe('keepValue'); + expect(cookies[0]!.key).toBe('keep'); + expect(cookies[0]!.value).toBe('keepValue'); }); test('deleteCookies removes all cookies for URL', async () => { @@ -115,7 +121,7 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.deleteCookies(testUrl); // Verify no cookies remain - const cookies = await jar.getCookies(testUrl); + const cookies = (await jar.getCookies(testUrl)) as Cookie[]; expect(cookies).toHaveLength(0); }); @@ -128,8 +134,8 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.clear(); // Verify no cookies remain for any URL - const cookies1 = await jar.getCookies('https://site1.com'); - const cookies2 = await jar.getCookies('https://site2.com'); + const cookies1 = (await jar.getCookies('https://site1.com')) as Cookie[]; + const cookies2 = (await jar.getCookies('https://site2.com')) as Cookie[]; expect(cookies1).toHaveLength(0); expect(cookies2).toHaveLength(0); @@ -146,7 +152,7 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { }); test('setCookies handles invalid input', async () => { - await expect(jar.setCookies(testUrl, 'not-an-array')).rejects.toThrow('expects an array'); + await expect(jar.setCookies(testUrl, 'not-an-array' as any)).rejects.toThrow('expects an array'); }); test('setCookie handles missing cookie name in object', async () => { @@ -163,7 +169,7 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.setCookie(apiUrl, 'authToken', authToken); // Later in the session - retrieve auth token - const cookie = await jar.getCookie(apiUrl, 'authToken'); + const cookie = (await jar.getCookie(apiUrl, 'authToken'))!; expect(cookie.value).toBe(authToken); // Simulate logout - remove auth cookie @@ -187,13 +193,13 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.setCookies(sessionUrl, sessionCookies); // Retrieve all session cookies - const cookies = await jar.getCookies(sessionUrl); + const cookies = (await jar.getCookies(sessionUrl)) as Cookie[]; expect(cookies).toHaveLength(3); // Find specific cookies - const sessionCookie = cookies.find(c => c.key === 'sessionId'); - const csrfCookie = cookies.find(c => c.key === 'csrfToken'); - const prefsCookie = cookies.find(c => c.key === 'userPrefs'); + const sessionCookie = cookies.find((c: Cookie) => c.key === 'sessionId')!; + const csrfCookie = cookies.find((c: Cookie) => c.key === 'csrfToken')!; + const prefsCookie = cookies.find((c: Cookie) => c.key === 'userPrefs')!; expect(sessionCookie.value).toBe('sess_123'); expect(sessionCookie.httpOnly).toBe(true); @@ -212,15 +218,15 @@ describe('Bruno Cookie Jar Wrapper - API Examples', () => { await jar.setCookie(baseUrl, { key: 'api', value: 'api_val', path: '/api' }); await jar.setCookie(baseUrl, { key: 'admin', value: 'admin_val', path: '/admin' }); - const rootCookies = await jar.getCookies(baseUrl + '/'); - const globalCookie = rootCookies.find(c => c.key === 'global'); + const rootCookies = (await jar.getCookies(baseUrl + '/')) as Cookie[]; + const globalCookie = rootCookies.find((c: Cookie) => c.key === 'global')!; expect(globalCookie).toBeTruthy(); expect(globalCookie.value).toBe('global_val'); - const apiCookies = await jar.getCookies(baseUrl + '/api/users'); + const apiCookies = (await jar.getCookies(baseUrl + '/api/users')) as Cookie[]; expect(apiCookies.length).toBeGreaterThanOrEqual(2); - const apiCookieNames = apiCookies.map(c => c.key); + const apiCookieNames = apiCookies.map((c: Cookie) => c.key); expect(apiCookieNames).toContain('global'); expect(apiCookieNames).toContain('api'); }); diff --git a/packages/bruno-common/src/cookies/index.ts b/packages/bruno-requests/src/cookies/index.ts similarity index 99% rename from packages/bruno-common/src/cookies/index.ts rename to packages/bruno-requests/src/cookies/index.ts index c591428f3..dfd9482bc 100644 --- a/packages/bruno-common/src/cookies/index.ts +++ b/packages/bruno-requests/src/cookies/index.ts @@ -1,7 +1,7 @@ import { Cookie, CookieJar } from 'tough-cookie'; import each from 'lodash/each'; import moment from 'moment'; -import { isPotentiallyTrustworthyOrigin } from '../utils'; +import { isPotentiallyTrustworthyOrigin } from '../utils/url-validation'; const cookieJar = new CookieJar(); diff --git a/packages/bruno-requests/src/index.ts b/packages/bruno-requests/src/index.ts index 9326c08a1..82d596828 100644 --- a/packages/bruno-requests/src/index.ts +++ b/packages/bruno-requests/src/index.ts @@ -1,5 +1,6 @@ export { addDigestInterceptor, getOAuth2Token } from './auth'; export { GrpcClient, generateGrpcSampleMessage } from './grpc'; +export { default as cookies } from './cookies'; export * as network from './network'; diff --git a/packages/bruno-common/src/utils/url/validation.spec.ts b/packages/bruno-requests/src/utils/url-validation.spec.ts similarity index 98% rename from packages/bruno-common/src/utils/url/validation.spec.ts rename to packages/bruno-requests/src/utils/url-validation.spec.ts index 1732898f5..b2b35e602 100644 --- a/packages/bruno-common/src/utils/url/validation.spec.ts +++ b/packages/bruno-requests/src/utils/url-validation.spec.ts @@ -1,4 +1,4 @@ -import { isPotentiallyTrustworthyOrigin } from './validation'; +import { isPotentiallyTrustworthyOrigin } from './url-validation'; describe('isPotentiallyTrustworthyOrigin', () => { describe('secure schemes', () => { diff --git a/packages/bruno-common/src/utils/url/validation.ts b/packages/bruno-requests/src/utils/url-validation.ts similarity index 100% rename from packages/bruno-common/src/utils/url/validation.ts rename to packages/bruno-requests/src/utils/url-validation.ts