@usebruno/filestore 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/formats/bru/utils/oauth2-additional-params.d.ts +38 -0
- package/dist/cjs/formats/bru/utils/request-parse-and-redact-body-data.d.ts +9 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/workers/formats/bru/utils/oauth2-additional-params.d.ts +38 -0
- package/dist/cjs/workers/formats/bru/utils/request-parse-and-redact-body-data.d.ts +9 -0
- package/dist/cjs/workers/index.d.ts +1 -0
- package/dist/cjs/workers/worker-script.js +1 -1
- package/dist/cjs/workers/worker-script.js.map +1 -1
- package/dist/esm/formats/bru/utils/oauth2-additional-params.d.ts +38 -0
- package/dist/esm/formats/bru/utils/request-parse-and-redact-body-data.d.ts +9 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/workers/formats/bru/utils/oauth2-additional-params.d.ts +38 -0
- package/dist/esm/workers/formats/bru/utils/request-parse-and-redact-body-data.d.ts +9 -0
- package/dist/esm/workers/index.d.ts +1 -0
- package/dist/esm/workers/worker-script.js +1 -1
- package/dist/esm/workers/worker-script.js.map +1 -1
- package/package.json +2 -2
- package/src/formats/bru/index.ts +132 -40
- package/src/formats/bru/tests/fixtures/oauth2-additional-params.js +116 -0
- package/src/formats/bru/tests/fixtures/request-parse-and-redact-body-data/input.bru +66 -0
- package/src/formats/bru/tests/fixtures/request-parse-and-redact-body-data/output.bru +35 -0
- package/src/formats/bru/tests/oauth2-additional-params.spec.js +45 -0
- package/src/formats/bru/tests/request-parse-and-redact-body-data.spec.js +44 -0
- package/src/formats/bru/utils/oauth2-additional-params.ts +141 -0
- package/src/formats/bru/utils/request-parse-and-redact-body-data.ts +77 -0
- package/src/index.ts +8 -0
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/formats/bru/index.ts","../../src/workers/WorkerQueue/index.ts","../../src/workers/index.ts","../../src/index.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport {\n bruToJsonV2,\n jsonToBruV2,\n bruToEnvJsonV2,\n envJsonToBruV2,\n collectionBruToJson as _collectionBruToJson,\n jsonToCollectionBru as _jsonToCollectionBru\n} from '@usebruno/lang';\n\nexport const bruRequestToJson = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : bruToJsonV2(data);\n\n let requestType = _.get(json, 'meta.type');\n if (requestType === 'http') {\n requestType = 'http-request';\n } else if (requestType === 'graphql') {\n requestType = 'graphql-request';\n } else {\n requestType = 'http-request';\n }\n\n const sequence = _.get(json, 'meta.seq');\n const transformedJson = {\n type: requestType,\n name: _.get(json, 'meta.name'),\n seq: !_.isNaN(sequence) ? Number(sequence) : 1,\n settings: _.get(json, 'settings', {}),\n tags: _.get(json, 'meta.tags', []),\n request: {\n method: _.upperCase(_.get(json, 'http.method')),\n url: _.get(json, 'http.url'),\n params: _.get(json, 'params', []),\n headers: _.get(json, 'headers', []),\n auth: _.get(json, 'auth', {}),\n body: _.get(json, 'body', {}),\n script: _.get(json, 'script', {}),\n vars: _.get(json, 'vars', {}),\n assertions: _.get(json, 'assertions', []),\n tests: _.get(json, 'tests', ''),\n docs: _.get(json, 'docs', '')\n }\n };\n\n transformedJson.request.auth.mode = _.get(json, 'http.auth', 'none');\n transformedJson.request.body.mode = _.get(json, 'http.body', 'none');\n\n return transformedJson;\n } catch (e) {\n return Promise.reject(e);\n }\n};\n\nexport const jsonRequestToBru = (json: any): string => {\n try {\n let type = _.get(json, 'type');\n if (type === 'http-request') {\n type = 'http';\n } else if (type === 'graphql-request') {\n type = 'graphql';\n } else {\n type = 'http';\n }\n\n const sequence = _.get(json, 'seq');\n const bruJson = {\n meta: {\n name: _.get(json, 'name'),\n type: type,\n seq: !_.isNaN(sequence) ? Number(sequence) : 1,\n tags: _.get(json, 'tags', []),\n },\n http: {\n method: _.lowerCase(_.get(json, 'request.method')),\n url: _.get(json, 'request.url'),\n auth: _.get(json, 'request.auth.mode', 'none'),\n body: _.get(json, 'request.body.mode', 'none')\n },\n params: _.get(json, 'request.params', []),\n headers: _.get(json, 'request.headers', []),\n auth: _.get(json, 'request.auth', {}),\n body: _.get(json, 'request.body', {}),\n script: _.get(json, 'request.script', {}),\n vars: {\n req: _.get(json, 'request.vars.req', []),\n res: _.get(json, 'request.vars.res', [])\n },\n assertions: _.get(json, 'request.assertions', []),\n tests: _.get(json, 'request.tests', ''),\n settings: _.get(json, 'settings', {}),\n docs: _.get(json, 'request.docs', '')\n };\n\n const bru = jsonToBruV2(bruJson);\n return bru;\n } catch (error) {\n throw error;\n }\n};\n\nexport const bruCollectionToJson = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : _collectionBruToJson(data);\n\n const transformedJson: any = {\n request: {\n headers: _.get(json, 'headers', []),\n auth: _.get(json, 'auth', {}),\n script: _.get(json, 'script', {}),\n vars: _.get(json, 'vars', {}),\n tests: _.get(json, 'tests', '')\n },\n settings: _.get(json, 'settings', {}),\n docs: _.get(json, 'docs', '')\n };\n\n // add meta if it exists\n // this is only for folder bru file\n if (json.meta) {\n transformedJson.meta = {\n name: json.meta.name\n };\n \n // Include seq if it exists\n if (json.meta.seq !== undefined) {\n const sequence = json.meta.seq;\n transformedJson.meta.seq = !isNaN(sequence) ? Number(sequence) : 1;\n }\n }\n\n return transformedJson;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const jsonCollectionToBru = (json: any, isFolder?: boolean): string => {\n try {\n const collectionBruJson: any = {\n headers: _.get(json, 'request.headers', []),\n script: {\n req: _.get(json, 'request.script.req', ''),\n res: _.get(json, 'request.script.res', '')\n },\n vars: {\n req: _.get(json, 'request.vars.req', []),\n res: _.get(json, 'request.vars.res', [])\n },\n tests: _.get(json, 'request.tests', ''),\n auth: _.get(json, 'request.auth', {}),\n docs: _.get(json, 'docs', '')\n };\n\n // add meta if it exists\n // this is only for folder bru file\n if (json?.meta) {\n collectionBruJson.meta = {\n name: json.meta.name\n };\n \n // Include seq if it exists\n if (json.meta.seq !== undefined) {\n const sequence = json.meta.seq;\n collectionBruJson.meta.seq = !isNaN(sequence) ? Number(sequence) : 1;\n }\n }\n\n if (!isFolder) {\n collectionBruJson.auth = _.get(json, 'request.auth', {});\n }\n\n return _jsonToCollectionBru(collectionBruJson);\n } catch (error) {\n throw error;\n }\n};\n\nexport const bruEnvironmentToJson = (bru: string): any => {\n try {\n const json = bruToEnvJsonV2(bru);\n\n // the app env format requires each variable to have a type\n // this need to be evaluated and safely removed\n // i don't see it being used in schema validation\n if (json && json.variables && json.variables.length) {\n _.each(json.variables, (v: any) => (v.type = 'text'));\n }\n\n return json;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const jsonEnvironmentToBru = (json: any): string => {\n try {\n const bru = envJsonToBruV2(json);\n return bru;\n } catch (error) {\n throw error;\n }\n}; ","import { Worker } from 'node:worker_threads';\n\ninterface QueuedTask {\n priority: number;\n scriptPath: string;\n data: any;\n taskType: 'parse' | 'stringify';\n resolve?: (value: any) => void;\n reject?: (reason?: any) => void;\n}\n\nclass WorkerQueue {\n private queue: QueuedTask[];\n private isProcessing: boolean;\n private workers: Record<string, Worker>;\n\n constructor() {\n this.queue = [];\n this.isProcessing = false;\n this.workers = {};\n }\n\n async getWorkerForScriptPath(scriptPath: string) {\n if (!this.workers) this.workers = {}; \n let worker = this.workers[scriptPath];\n if (!worker || worker.threadId === -1) {\n this.workers[scriptPath] = worker = new Worker(scriptPath);\n }\n return worker;\n }\n \n async enqueue(task: QueuedTask) {\n const { priority, scriptPath, data, taskType } = task;\n\n return new Promise((resolve, reject) => {\n this.queue.push({ priority, scriptPath, data, taskType, resolve, reject });\n this.queue?.sort((taskX, taskY) => taskX?.priority - taskY?.priority);\n this.processQueue();\n });\n }\n\n async processQueue() {\n if (this.isProcessing || this.queue.length === 0){\n return;\n } \n\n this.isProcessing = true;\n const { scriptPath, data, taskType, resolve, reject } = this.queue.shift() as QueuedTask;\n\n try {\n const result = await this.runWorker({ scriptPath, data, taskType });\n resolve?.(result);\n } catch (error) {\n reject?.(error);\n } finally {\n this.isProcessing = false;\n this.processQueue();\n }\n }\n\n async runWorker({ scriptPath, data, taskType }: { scriptPath: string; data: any; taskType: 'parse' | 'stringify' }) {\n return new Promise(async (resolve, reject) => {\n let worker = await this.getWorkerForScriptPath(scriptPath);\n \n const messageHandler = (data: any) => {\n worker.off('message', messageHandler);\n worker.off('error', errorHandler);\n worker.off('exit', exitHandler);\n \n if (data?.error) {\n reject(new Error(data?.error));\n } else {\n resolve(data);\n }\n };\n\n const errorHandler = (error: Error) => {\n worker.off('message', messageHandler);\n worker.off('error', errorHandler);\n worker.off('exit', exitHandler);\n reject(error);\n };\n\n const exitHandler = (code: number) => {\n worker.off('message', messageHandler);\n worker.off('error', errorHandler);\n worker.off('exit', exitHandler);\n // Remove dead worker from cache\n delete this.workers[scriptPath];\n reject(new Error(`Worker stopped with exit code ${code}`));\n };\n \n worker.on('message', messageHandler);\n worker.on('error', errorHandler);\n worker.on('exit', exitHandler);\n\n worker.postMessage({ taskType, data });\n });\n }\n\n async cleanup() {\n const promises = Object.values(this.workers).map(worker => {\n if (worker.threadId !== -1) {\n return worker.terminate();\n }\n return Promise.resolve();\n });\n \n await Promise.allSettled(promises);\n this.workers = {};\n }\n}\n\nexport default WorkerQueue;","import WorkerQueue from './WorkerQueue';\nimport { Lane } from '../types';\nimport path from 'node:path';\n\nconst sizeInMB = (size: number): number => {\n return size / (1024 * 1024);\n}\n\nconst getSize = (data: any): number => {\n return sizeInMB(typeof data === 'string' ? Buffer.byteLength(data, 'utf8') : Buffer.byteLength(JSON.stringify(data), 'utf8'));\n}\n\n/**\n * Lanes are used to determine which worker queue to use based on the size of the data.\n * \n * The first lane is for smaller files (<0.1MB), the second lane is for larger files (>=0.1MB).\n * This helps with parsing performance.\n */\nconst LANES: Lane[] = [{\n maxSize: 0.005\n},{\n maxSize: 0.1\n},{\n maxSize: 1\n},{\n maxSize: 10\n},{\n maxSize: 100\n}];\n\ninterface WorkerQueueWithSize {\n maxSize: number;\n workerQueue: WorkerQueue;\n\n}\n\nclass BruParserWorker {\n private workerQueues: WorkerQueueWithSize[];\n\n constructor() {\n this.workerQueues = LANES?.map(lane => ({\n maxSize: lane?.maxSize,\n workerQueue: new WorkerQueue()\n }));\n }\n\n private getWorkerQueue(size: number): WorkerQueue {\n // Find the first queue that can handle the given size\n // or fallback to the last queue for largest files\n const queueForSize = this.workerQueues.find((queue) => \n queue.maxSize >= size\n );\n\n return queueForSize?.workerQueue ?? this.workerQueues[this.workerQueues.length - 1].workerQueue;\n }\n\n private async enqueueTask({ data, taskType }: { data: any; taskType: 'parse' | 'stringify' }): Promise<any> {\n const size = getSize(data);\n const workerQueue = this.getWorkerQueue(size);\n const workerScriptPath = path.join(__dirname, './workers/worker-script.js');\n \n return workerQueue.enqueue({\n data,\n priority: size,\n scriptPath: workerScriptPath,\n taskType,\n });\n }\n\n async parseRequest(data: any): Promise<any> {\n return this.enqueueTask({ data, taskType: 'parse' });\n }\n\n async stringifyRequest(data: any): Promise<any> {\n return this.enqueueTask({ data, taskType: 'stringify' });\n }\n\n async cleanup(): Promise<void> {\n const cleanupPromises = this.workerQueues.map(({ workerQueue }) => \n workerQueue.cleanup()\n );\n await Promise.allSettled(cleanupPromises);\n }\n}\n\nexport default BruParserWorker; ","import {\n bruRequestToJson,\n jsonRequestToBru,\n bruCollectionToJson,\n jsonCollectionToBru,\n bruEnvironmentToJson,\n jsonEnvironmentToBru\n} from './formats/bru';\nimport { dotenvToJson } from '@usebruno/lang';\nimport BruParserWorker from './workers';\nimport {\n ParseOptions,\n StringifyOptions,\n ParsedRequest,\n ParsedCollection,\n ParsedEnvironment\n} from './types';\n\nexport const parseRequest = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruRequestToJson(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const stringifyRequest = (requestObj: ParsedRequest, options: StringifyOptions = { format: 'bru' }): string => {\n if (options.format === 'bru') {\n return jsonRequestToBru(requestObj);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nlet globalWorkerInstance: BruParserWorker | null = null;\n\nconst getWorkerInstance = (): BruParserWorker => {\n if (!globalWorkerInstance) {\n globalWorkerInstance = new BruParserWorker();\n }\n return globalWorkerInstance;\n};\n\nexport const parseRequestViaWorker = async (content: string): Promise<any> => {\n const fileParserWorker = getWorkerInstance();\n return await fileParserWorker.parseRequest(content);\n};\n\nexport const stringifyRequestViaWorker = async (requestObj: any): Promise<string> => {\n const fileParserWorker = getWorkerInstance();\n return await fileParserWorker.stringifyRequest(requestObj);\n};\n\nexport const parseCollection = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruCollectionToJson(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const stringifyCollection = (collectionObj: ParsedCollection, options: StringifyOptions = { format: 'bru' }): string => {\n if (options.format === 'bru') {\n return jsonCollectionToBru(collectionObj, false);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const parseFolder = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruCollectionToJson(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const stringifyFolder = (folderObj: any, options: StringifyOptions = { format: 'bru' }): string => {\n if (options.format === 'bru') {\n return jsonCollectionToBru(folderObj, true);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const parseEnvironment = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruEnvironmentToJson(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const stringifyEnvironment = (envObj: ParsedEnvironment, options: StringifyOptions = { format: 'bru' }): string => {\n if (options.format === 'bru') {\n return jsonEnvironmentToBru(envObj);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\n\nexport const parseDotEnv = (content: string): Record<string, string> => {\n return dotenvToJson(content);\n};\n\nexport { BruParserWorker };\nexport * from './types';"],"names":["bruCollectionToJson","data","parsed","json","_collectionBruToJson","transformedJson","request","headers","_","get","auth","script","vars","tests","settings","docs","meta","name","undefined","seq","sequence","isNaN","Number","error","Promise","reject","jsonCollectionToBru","isFolder","collectionBruJson","req","res","_jsonToCollectionBru","WorkerQueue","constructor","this","queue","isProcessing","workers","getWorkerForScriptPath","scriptPath","worker","threadId","Worker","enqueue","task","priority","taskType","resolve","push","sort","taskX","taskY","processQueue","length","shift","result","runWorker","async","messageHandler","off","errorHandler","exitHandler","Error","code","on","postMessage","cleanup","promises","Object","values","map","terminate","allSettled","LANES","maxSize","BruParserWorker","workerQueues","lane","workerQueue","getWorkerQueue","size","queueForSize","find","enqueueTask","Buffer","byteLength","JSON","stringify","getSize","workerScriptPath","path","join","__dirname","parseRequest","stringifyRequest","cleanupPromises","content","options","format","bruToJsonV2","requestType","type","tags","method","upperCase","url","params","body","assertions","mode","e","bruRequestToJson","requestObj","bruJson","http","lowerCase","jsonToBruV2","jsonRequestToBru","globalWorkerInstance","getWorkerInstance","parseRequestViaWorker","fileParserWorker","stringifyRequestViaWorker","parseCollection","stringifyCollection","collectionObj","parseFolder","stringifyFolder","folderObj","parseEnvironment","bru","bruToEnvJsonV2","variables","each","v","bruEnvironmentToJson","stringifyEnvironment","envObj","envJsonToBruV2","jsonEnvironmentToBru","parseDotEnv","dotenvToJson"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/formats/bru/utils/oauth2-additional-params.ts","../../src/formats/bru/index.ts","../../src/workers/WorkerQueue/index.ts","../../src/workers/index.ts","../../src/formats/bru/utils/request-parse-and-redact-body-data.ts","../../src/index.ts"],"sourcesContent":["type T_Oauth2ParameterType = 'authorization' | 'token' | 'refresh';\ntype T_Oauth2ParameterSendInType = 'headers' | 'queryparams' | 'body';\n\nexport interface T_OAuth2AdditionalParam {\n name: string;\n value: string;\n enabled: boolean;\n sendIn: T_Oauth2ParameterSendInType\n}\n\nexport interface T_OAuth2AdditionalParameters {\n authorization?: T_OAuth2AdditionalParam[];\n token?: T_OAuth2AdditionalParam[];\n refresh?: T_OAuth2AdditionalParam[];\n}\n\nexport interface T_Oauth2Auth {\n grantType: string;\n additionalParameters?: T_OAuth2AdditionalParameters;\n}\n\nexport interface T_BruJson {\n auth: {\n oauth2: T_Oauth2Auth;\n };\n oauth2_additional_parameters_auth_req_headers?: any[];\n oauth2_additional_parameters_auth_req_queryparams?: any[];\n oauth2_additional_parameters_access_token_req_headers?: any[];\n oauth2_additional_parameters_access_token_req_queryparams?: any[];\n oauth2_additional_parameters_access_token_req_bodyvalues?: any[];\n oauth2_additional_parameters_refresh_token_req_headers?: any[];\n oauth2_additional_parameters_refresh_token_req_queryparams?: any[];\n oauth2_additional_parameters_refresh_token_req_bodyvalues?: any[];\n}\n\ninterface T_Oauth2ParameterMapping {\n type: T_Oauth2ParameterType;\n sendIn: T_Oauth2ParameterSendInType;\n source: keyof T_BruJson;\n}\n\nconst PARAMETER_MAPPINGS: T_Oauth2ParameterMapping[] = [\n // Authorization parameters (only for authorization_code grant type)\n { type: 'authorization', sendIn: 'headers', source: 'oauth2_additional_parameters_auth_req_headers' },\n { type: 'authorization', sendIn: 'queryparams', source: 'oauth2_additional_parameters_auth_req_queryparams' },\n \n // Token parameters (for all grant types)\n { type: 'token', sendIn: 'headers', source: 'oauth2_additional_parameters_access_token_req_headers' },\n { type: 'token', sendIn: 'queryparams', source: 'oauth2_additional_parameters_access_token_req_queryparams' },\n { type: 'token', sendIn: 'body', source: 'oauth2_additional_parameters_access_token_req_bodyvalues' },\n \n // Refresh parameters (for grant types that support refresh)\n { type: 'refresh', sendIn: 'headers', source: 'oauth2_additional_parameters_refresh_token_req_headers' },\n { type: 'refresh', sendIn: 'queryparams', source: 'oauth2_additional_parameters_refresh_token_req_queryparams' },\n { type: 'refresh', sendIn: 'body', source: 'oauth2_additional_parameters_refresh_token_req_bodyvalues' },\n];\n\n/**\n * Maps source parameters to T_OAuth2AdditionalParam format\n */\nconst mapParametersFromSource = (sourceParams: any[], sendIn: T_Oauth2ParameterSendInType): T_OAuth2AdditionalParam[] => {\n if (!sourceParams?.length) {\n return [];\n }\n \n return sourceParams.map(param => ({\n ...param,\n sendIn\n }));\n};\n\n/**\n * Checks if a parameter type should be included based on grant type\n */\nconst shouldIncludeParameterType = (type: T_Oauth2ParameterType, grantType: string): boolean => {\n // Authorization parameters are only valid for authorization_code grant type\n if (type === 'authorization') {\n return grantType === 'authorization_code' || grantType === 'implicit';\n }\n\n if (type === 'token' || type === 'refresh') {\n return grantType !== 'implicit';\n }\n \n // Token and refresh parameters are valid for all grant types\n return true;\n};\n\n/**\n * Collects all parameters for a specific type (authorization, token, or refresh)\n */\nconst collectParametersForType = (\n json: T_BruJson, \n type: T_Oauth2ParameterType, \n grantType: string\n): T_OAuth2AdditionalParam[] => {\n if (!shouldIncludeParameterType(type, grantType)) {\n return [];\n }\n\n const relevantMappings = PARAMETER_MAPPINGS.filter(mapping => mapping.type === type);\n const allParams: T_OAuth2AdditionalParam[] = [];\n\n for (const mapping of relevantMappings) {\n const sourceParams = json[mapping.source] as any[];\n const mappedParams = mapParametersFromSource(sourceParams, mapping.sendIn);\n allParams.push(...mappedParams);\n }\n\n return allParams;\n};\n\n/**\n * This function extracts OAuth2 additional parameters from various sources in the bru json data and organizes\n * them into a structured format based on their usage context (authorization, token, refresh).\n * \n * @param json - json object containing OAuth2 configuration and additional parameters\n * @returns OAuth2 additional parameters\n */\nexport const getOauth2AdditionalParameters = (json: T_BruJson): T_OAuth2AdditionalParameters => {\n const grantType = json.auth.oauth2.grantType;\n const additionalParameters: T_OAuth2AdditionalParameters = {};\n\n try {\n // Collect parameters for each type\n const parameterTypes: T_Oauth2ParameterType[] = ['authorization', 'token', 'refresh'];\n \n for (const type of parameterTypes) {\n const params = collectParametersForType(json, type, grantType);\n if (params.length > 0) {\n additionalParameters[type] = params;\n }\n }\n }\n catch(error) {\n console.error(error);\n console.error(\"Error while getting the oauth2 additional parameters!\");\n }\n \n return additionalParameters;\n};","import * as _ from 'lodash';\nimport {\n bruToJsonV2,\n jsonToBruV2,\n bruToEnvJsonV2,\n envJsonToBruV2,\n collectionBruToJson as _collectionBruToJson,\n jsonToCollectionBru as _jsonToCollectionBru\n} from '@usebruno/lang';\nimport { getOauth2AdditionalParameters } from './utils/oauth2-additional-params';\n\nexport const bruRequestToJson = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : bruToJsonV2(data);\n\n let requestType = _.get(json, 'meta.type');\n switch (requestType) {\n case 'http':\n requestType = 'http-request';\n break;\n case 'graphql':\n requestType = 'graphql-request';\n break;\n case 'grpc':\n requestType = 'grpc-request';\n break;\n default:\n requestType = 'http-request';\n }\n\n const sequence = _.get(json, 'meta.seq');\n const transformedJson = {\n type: requestType,\n name: _.get(json, 'meta.name'),\n seq: !_.isNaN(sequence) ? Number(sequence) : 1,\n settings: _.get(json, 'settings', {}),\n tags: _.get(json, 'meta.tags', []),\n request: {\n method:\n requestType === 'grpc-request' ? _.get(json, 'grpc.method', '') : _.upperCase(_.get(json, 'http.method')),\n url: _.get(json, requestType === 'grpc-request' ? 'grpc.url' : 'http.url'),\n headers: requestType === 'grpc-request' ? _.get(json, 'metadata', []) : _.get(json, 'headers', []),\n auth: _.get(json, 'auth', {}),\n body: _.get(json, 'body', {}),\n script: _.get(json, 'script', {}),\n vars: _.get(json, 'vars', {}),\n assertions: _.get(json, 'assertions', []),\n tests: _.get(json, 'tests', ''),\n docs: _.get(json, 'docs', '')\n }\n };\n\n // Add request type specific fields\n if (requestType === 'grpc-request') {\n const selectedMethodType = _.get(json, 'grpc.methodType');\n selectedMethodType && ((transformedJson.request as any).methodType = selectedMethodType);\n const protoPath = _.get(json, 'grpc.protoPath');\n protoPath && ((transformedJson.request as any).protoPath = protoPath);\n transformedJson.request.auth.mode = _.get(json, 'grpc.auth', 'none');\n transformedJson.request.body = _.get(json, 'body', {\n mode: 'grpc',\n grpc: _.get(json, 'body.grpc', [\n {\n name: 'message 1',\n content: '{}'\n }\n ])\n });\n } else {\n // For HTTP and GraphQL\n (transformedJson.request as any).params = _.get(json, 'params', []);\n transformedJson.request.auth.mode = _.get(json, 'http.auth', 'none');\n transformedJson.request.body.mode = _.get(json, 'http.body', 'none');\n }\n\n // add oauth2 additional parameters if they exist\n const hasOauth2GrantType = json?.auth?.oauth2?.grantType;\n if (hasOauth2GrantType) {\n const additionalParameters = getOauth2AdditionalParameters(json);\n const hasAdditionalParameters = Object.keys(additionalParameters || {}).length > 0;\n if (hasAdditionalParameters) {\n transformedJson.request.auth.oauth2.additionalParameters = additionalParameters;\n }\n }\n\n return transformedJson;\n } catch (error) {\n throw error;\n }\n};\n\nexport const jsonRequestToBru = (json: any): string => {\n try {\n let type = _.get(json, 'type');\n switch (type) {\n case 'http-request':\n type = 'http';\n break;\n case 'graphql-request':\n type = 'graphql';\n break;\n case 'grpc-request':\n type = 'grpc';\n break;\n default:\n type = 'http';\n }\n\n const sequence = _.get(json, 'seq');\n\n // Start with the common meta section\n const bruJson = {\n meta: {\n name: _.get(json, 'name'),\n type: type,\n seq: !_.isNaN(sequence) ? Number(sequence) : 1,\n tags: _.get(json, 'tags', [])\n }\n } as any;\n\n // For HTTP and GraphQL requests, maintain the current structure\n if (type === 'http' || type === 'graphql') {\n bruJson.http = {\n method: _.lowerCase(_.get(json, 'request.method')),\n url: _.get(json, 'request.url'),\n auth: _.get(json, 'request.auth.mode', 'none'),\n body: _.get(json, 'request.body.mode', 'none')\n };\n bruJson.params = _.get(json, 'request.params', []);\n bruJson.body = _.get(json, 'request.body', {\n mode: 'json',\n json: '{}'\n });\n } // For gRPC, add gRPC-specific structure but maintain field names\n else if (type === 'grpc') {\n bruJson.grpc = {\n url: _.get(json, 'request.url'),\n auth: _.get(json, 'request.auth.mode', 'none'),\n body: _.get(json, 'request.body.mode', 'grpc')\n };\n // Only add method if it exists\n const method = _.get(json, 'request.method');\n const methodType = _.get(json, 'request.methodType');\n const protoPath = _.get(json, 'request.protoPath');\n if (method) bruJson.grpc.method = method;\n if (methodType) bruJson.grpc.methodType = methodType;\n if (protoPath) bruJson.grpc.protoPath = protoPath;\n bruJson.body = _.get(json, 'request.body', {\n mode: 'grpc',\n grpc: _.get(json, 'request.body.grpc', [\n {\n name: 'message 1',\n content: '{}'\n }\n ])\n });\n }\n\n // Common fields for all request types\n if (type === 'grpc') {\n bruJson.metadata = _.get(json, 'request.headers', []); // Use metadata for gRPC\n } else {\n bruJson.headers = _.get(json, 'request.headers', []); // Use headers for HTTP/GraphQL\n }\n bruJson.auth = _.get(json, 'request.auth', {});\n bruJson.script = _.get(json, 'request.script', {});\n bruJson.vars = {\n req: _.get(json, 'request.vars.req', []),\n res: _.get(json, 'request.vars.res', [])\n };\n // should we add assertions and tests for grpc requests?\n bruJson.assertions = _.get(json, 'request.assertions', []);\n bruJson.tests = _.get(json, 'request.tests', '');\n bruJson.settings = _.get(json, 'settings', {});\n bruJson.docs = _.get(json, 'request.docs', '');\n\n const bru = jsonToBruV2(bruJson);\n return bru;\n } catch (error) {\n throw error;\n }\n};\n\nexport const bruCollectionToJson = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : _collectionBruToJson(data);\n\n const transformedJson: any = {\n request: {\n headers: _.get(json, 'headers', []),\n auth: _.get(json, 'auth', {}),\n script: _.get(json, 'script', {}),\n vars: _.get(json, 'vars', {}),\n tests: _.get(json, 'tests', '')\n },\n settings: _.get(json, 'settings', {}),\n docs: _.get(json, 'docs', '')\n };\n\n // add meta if it exists\n // this is only for folder bru file\n if (json.meta) {\n transformedJson.meta = {\n name: json.meta.name\n };\n\n // Include seq if it exists\n if (json.meta.seq !== undefined) {\n const sequence = json.meta.seq;\n transformedJson.meta.seq = !isNaN(sequence) ? Number(sequence) : 1;\n }\n }\n\n // add oauth2 additional parameters if they exist\n const hasOauth2GrantType = json?.auth?.oauth2?.grantType;\n if (hasOauth2GrantType) {\n const additionalParameters = getOauth2AdditionalParameters(json);\n const hasAdditionalParameters = Object.keys(additionalParameters).length > 0;\n if (hasAdditionalParameters) {\n transformedJson.request.auth.oauth2.additionalParameters = additionalParameters;\n }\n }\n\n return transformedJson;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const jsonCollectionToBru = (json: any, isFolder?: boolean): string => {\n try {\n const collectionBruJson: any = {\n headers: _.get(json, 'request.headers', []),\n script: {\n req: _.get(json, 'request.script.req', ''),\n res: _.get(json, 'request.script.res', '')\n },\n vars: {\n req: _.get(json, 'request.vars.req', []),\n res: _.get(json, 'request.vars.res', [])\n },\n tests: _.get(json, 'request.tests', ''),\n auth: _.get(json, 'request.auth', {}),\n docs: _.get(json, 'docs', '')\n };\n\n // add meta if it exists\n // this is only for folder bru file\n if (json?.meta) {\n collectionBruJson.meta = {\n name: json.meta.name\n };\n\n // Include seq if it exists\n if (json.meta.seq !== undefined) {\n const sequence = json.meta.seq;\n collectionBruJson.meta.seq = !isNaN(sequence) ? Number(sequence) : 1;\n }\n }\n\n if (!isFolder) {\n collectionBruJson.auth = _.get(json, 'request.auth', {});\n }\n\n return _jsonToCollectionBru(collectionBruJson);\n } catch (error) {\n throw error;\n }\n};\n\nexport const bruEnvironmentToJson = (bru: string): any => {\n try {\n const json = bruToEnvJsonV2(bru);\n\n // the app env format requires each variable to have a type\n // this need to be evaluated and safely removed\n // i don't see it being used in schema validation\n if (json && json.variables && json.variables.length) {\n _.each(json.variables, (v: any) => (v.type = 'text'));\n }\n\n return json;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const jsonEnvironmentToBru = (json: any): string => {\n try {\n const bru = envJsonToBruV2(json);\n return bru;\n } catch (error) {\n throw error;\n }\n};\n","import { Worker } from 'node:worker_threads';\n\ninterface QueuedTask {\n priority: number;\n scriptPath: string;\n data: any;\n taskType: 'parse' | 'stringify';\n resolve?: (value: any) => void;\n reject?: (reason?: any) => void;\n}\n\nclass WorkerQueue {\n private queue: QueuedTask[];\n private isProcessing: boolean;\n private workers: Record<string, Worker>;\n\n constructor() {\n this.queue = [];\n this.isProcessing = false;\n this.workers = {};\n }\n\n async getWorkerForScriptPath(scriptPath: string) {\n if (!this.workers) this.workers = {}; \n let worker = this.workers[scriptPath];\n if (!worker || worker.threadId === -1) {\n this.workers[scriptPath] = worker = new Worker(scriptPath);\n }\n return worker;\n }\n \n async enqueue(task: QueuedTask) {\n const { priority, scriptPath, data, taskType } = task;\n\n return new Promise((resolve, reject) => {\n this.queue.push({ priority, scriptPath, data, taskType, resolve, reject });\n this.queue?.sort((taskX, taskY) => taskX?.priority - taskY?.priority);\n this.processQueue();\n });\n }\n\n async processQueue() {\n if (this.isProcessing || this.queue.length === 0){\n return;\n } \n\n this.isProcessing = true;\n const { scriptPath, data, taskType, resolve, reject } = this.queue.shift() as QueuedTask;\n\n try {\n const result = await this.runWorker({ scriptPath, data, taskType });\n resolve?.(result);\n } catch (error) {\n reject?.(error);\n } finally {\n this.isProcessing = false;\n this.processQueue();\n }\n }\n\n async runWorker({ scriptPath, data, taskType }: { scriptPath: string; data: any; taskType: 'parse' | 'stringify' }) {\n return new Promise(async (resolve, reject) => {\n let worker = await this.getWorkerForScriptPath(scriptPath);\n \n const messageHandler = (data: any) => {\n worker.off('message', messageHandler);\n worker.off('error', errorHandler);\n worker.off('exit', exitHandler);\n \n if (data?.error) {\n reject(new Error(data?.error));\n } else {\n resolve(data);\n }\n };\n\n const errorHandler = (error: Error) => {\n worker.off('message', messageHandler);\n worker.off('error', errorHandler);\n worker.off('exit', exitHandler);\n reject(error);\n };\n\n const exitHandler = (code: number) => {\n worker.off('message', messageHandler);\n worker.off('error', errorHandler);\n worker.off('exit', exitHandler);\n // Remove dead worker from cache\n delete this.workers[scriptPath];\n reject(new Error(`Worker stopped with exit code ${code}`));\n };\n \n worker.on('message', messageHandler);\n worker.on('error', errorHandler);\n worker.on('exit', exitHandler);\n\n worker.postMessage({ taskType, data });\n });\n }\n\n async cleanup() {\n const promises = Object.values(this.workers).map(worker => {\n if (worker.threadId !== -1) {\n return worker.terminate();\n }\n return Promise.resolve();\n });\n \n await Promise.allSettled(promises);\n this.workers = {};\n }\n}\n\nexport default WorkerQueue;","import WorkerQueue from './WorkerQueue';\nimport { Lane } from '../types';\nimport path from 'node:path';\n\nconst sizeInMB = (size: number): number => {\n return size / (1024 * 1024);\n}\n\nconst getSize = (data: any): number => {\n return sizeInMB(typeof data === 'string' ? Buffer.byteLength(data, 'utf8') : Buffer.byteLength(JSON.stringify(data), 'utf8'));\n}\n\n/**\n * Lanes are used to determine which worker queue to use based on the size of the data.\n * \n * The first lane is for smaller files (<0.1MB), the second lane is for larger files (>=0.1MB).\n * This helps with parsing performance.\n */\nconst LANES: Lane[] = [{\n maxSize: 0.005\n},{\n maxSize: 0.1\n},{\n maxSize: 1\n},{\n maxSize: 10\n},{\n maxSize: 100\n}];\n\ninterface WorkerQueueWithSize {\n maxSize: number;\n workerQueue: WorkerQueue;\n\n}\n\nclass BruParserWorker {\n private workerQueues: WorkerQueueWithSize[];\n\n constructor() {\n this.workerQueues = LANES?.map(lane => ({\n maxSize: lane?.maxSize,\n workerQueue: new WorkerQueue()\n }));\n }\n\n private getWorkerQueue(size: number): WorkerQueue {\n // Find the first queue that can handle the given size\n // or fallback to the last queue for largest files\n const queueForSize = this.workerQueues.find((queue) => \n queue.maxSize >= size\n );\n\n return queueForSize?.workerQueue ?? this.workerQueues[this.workerQueues.length - 1].workerQueue;\n }\n\n private async enqueueTask({ data, taskType }: { data: any; taskType: 'parse' | 'stringify' }): Promise<any> {\n const size = getSize(data);\n const workerQueue = this.getWorkerQueue(size);\n const workerScriptPath = path.join(__dirname, './workers/worker-script.js');\n \n return workerQueue.enqueue({\n data,\n priority: size,\n scriptPath: workerScriptPath,\n taskType,\n });\n }\n\n async parseRequest(data: any): Promise<any> {\n return this.enqueueTask({ data, taskType: 'parse' });\n }\n\n async stringifyRequest(data: any): Promise<any> {\n return this.enqueueTask({ data, taskType: 'stringify' });\n }\n\n async cleanup(): Promise<void> {\n const cleanupPromises = this.workerQueues.map(({ workerQueue }) => \n workerQueue.cleanup()\n );\n await Promise.allSettled(cleanupPromises);\n }\n}\n\nexport default BruParserWorker; ","/**\n * Parses a .bru file and extracts body content while redacting it from the main content\n * @param {string} bruFileContent - The raw content of the .bru file\n * @returns {Object} Object containing redacted file content and extracted body data\n */\nexport const bruRequestParseAndRedactBodyData = (bruFileContent: string) => {\n try {\n // Define the patterns that indicate the start of different body types\n const bodyTypePatterns = [\n \"body:json {\",\n \"body:text {\",\n \"body:xml {\",\n \"body:sparql {\",\n \"body:graphql {\"\n ];\n\n // Normalize line endings to LF\n bruFileContent = (bruFileContent || '').replace(/\\r\\n/g, '\\n');\n\n const EOL = `\\n`;\n\n /**\n * Removes the leading 2-space indentation from each line of a string\n * @param {string} indentedString - The string with leading spaces to remove\n * @returns {string} The string with indentation removed\n */\n const removeLeadingIndentation = (indentedString: string) => {\n if (!indentedString || !indentedString.length) {\n return indentedString || '';\n }\n\n return indentedString\n .split(EOL)\n .map((line) => line.replace(/^ /, ''))\n .join(EOL);\n };\n\n // Split the file content into blocks\n let fileContentBlocks = bruFileContent.split(`${EOL}}${EOL}`);\n fileContentBlocks = fileContentBlocks.filter(Boolean).map(_ => _.trim());\n\n // Extract body blocks and their content\n const extractedBodyBlocks = fileContentBlocks\n .filter(block => bodyTypePatterns.some(pattern => block.startsWith(pattern)))\n .reduce((bodyContentMap: Record<string, string>, bodyBlock) => {\n // Extract the body type (json, text, xml, etc.) from the first line\n const firstLine = bodyBlock.split(EOL)[0];\n const bodyType = firstLine.split(`body:`)[1].split(/\\s/)[0];\n \n // Extract the body content (everything between the opening and closing braces)\n const bodyContentLines = bodyBlock.split(EOL).slice(1);\n const rawBodyContent = bodyContentLines.join(EOL);\n \n // Remove indentation from the body content\n const cleanBodyContent = removeLeadingIndentation(rawBodyContent);\n \n bodyContentMap[bodyType] = cleanBodyContent;\n return bodyContentMap;\n }, {});\n\n // Filter out body blocks to get the remaining file content\n const fileContentWithoutBodyBlocks = fileContentBlocks.filter(block => \n !bodyTypePatterns.some(pattern => block.startsWith(pattern))\n );\n\n return {\n bruFileStringWithRedactedBody: fileContentWithoutBodyBlocks.join(`${EOL}}${EOL}${EOL}`).concat(`${EOL}}${EOL}`),\n extractedBodyContent: extractedBodyBlocks\n };\n } catch (error) {\n console.error('Error parsing and redacting body data:', error);\n return {\n bruFileStringWithRedactedBody: bruFileContent,\n extractedBodyContent: {}\n };\n }\n};","import {\n bruRequestToJson,\n jsonRequestToBru,\n bruCollectionToJson,\n jsonCollectionToBru,\n bruEnvironmentToJson,\n jsonEnvironmentToBru\n} from './formats/bru';\nimport { dotenvToJson } from '@usebruno/lang';\nimport BruParserWorker from './workers';\nimport {\n ParseOptions,\n StringifyOptions,\n ParsedRequest,\n ParsedCollection,\n ParsedEnvironment\n} from './types';\nimport { bruRequestParseAndRedactBodyData } from './formats/bru/utils/request-parse-and-redact-body-data';\n\nexport const parseRequest = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruRequestToJson(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const parseRequestAndRedactBody = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruRequestParseAndRedactBodyData(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const stringifyRequest = (requestObj: ParsedRequest, options: StringifyOptions = { format: 'bru' }): string => {\n if (options.format === 'bru') {\n return jsonRequestToBru(requestObj);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nlet globalWorkerInstance: BruParserWorker | null = null;\n\nconst getWorkerInstance = (): BruParserWorker => {\n if (!globalWorkerInstance) {\n globalWorkerInstance = new BruParserWorker();\n }\n return globalWorkerInstance;\n};\n\nexport const parseRequestViaWorker = async (content: string): Promise<any> => {\n const fileParserWorker = getWorkerInstance();\n return await fileParserWorker.parseRequest(content);\n};\n\nexport const stringifyRequestViaWorker = async (requestObj: any): Promise<string> => {\n const fileParserWorker = getWorkerInstance();\n return await fileParserWorker.stringifyRequest(requestObj);\n};\n\nexport const parseCollection = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruCollectionToJson(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const stringifyCollection = (collectionObj: ParsedCollection, options: StringifyOptions = { format: 'bru' }): string => {\n if (options.format === 'bru') {\n return jsonCollectionToBru(collectionObj, false);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const parseFolder = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruCollectionToJson(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const stringifyFolder = (folderObj: any, options: StringifyOptions = { format: 'bru' }): string => {\n if (options.format === 'bru') {\n return jsonCollectionToBru(folderObj, true);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const parseEnvironment = (content: string, options: ParseOptions = { format: 'bru' }): any => {\n if (options.format === 'bru') {\n return bruEnvironmentToJson(content);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\nexport const stringifyEnvironment = (envObj: ParsedEnvironment, options: StringifyOptions = { format: 'bru' }): string => {\n if (options.format === 'bru') {\n return jsonEnvironmentToBru(envObj);\n }\n throw new Error(`Unsupported format: ${options.format}`);\n};\n\n\nexport const parseDotEnv = (content: string): Record<string, string> => {\n return dotenvToJson(content);\n};\n\nexport { BruParserWorker };\nexport * from './types';"],"names":["PARAMETER_MAPPINGS","type","sendIn","source","mapParametersFromSource","sourceParams","length","map","param","collectParametersForType","json","grantType","shouldIncludeParameterType","relevantMappings","filter","mapping","allParams","mappedParams","push","getOauth2AdditionalParameters","auth","oauth2","additionalParameters","parameterTypes","params","error","console","bruCollectionToJson","data","parsed","_collectionBruToJson","transformedJson","request","headers","_","get","script","vars","tests","settings","docs","meta","name","undefined","seq","sequence","isNaN","Number","hasOauth2GrantType","Object","keys","Promise","reject","jsonCollectionToBru","isFolder","collectionBruJson","req","res","_jsonToCollectionBru","WorkerQueue","constructor","this","queue","isProcessing","workers","getWorkerForScriptPath","scriptPath","worker","threadId","Worker","enqueue","task","priority","taskType","resolve","sort","taskX","taskY","processQueue","shift","result","runWorker","async","messageHandler","off","errorHandler","exitHandler","Error","code","on","postMessage","cleanup","promises","values","terminate","allSettled","LANES","maxSize","BruParserWorker","workerQueues","lane","workerQueue","getWorkerQueue","size","queueForSize","find","enqueueTask","Buffer","byteLength","JSON","stringify","getSize","workerScriptPath","path","join","__dirname","parseRequest","stringifyRequest","cleanupPromises","content","options","format","bruToJsonV2","requestType","tags","method","upperCase","url","body","assertions","selectedMethodType","methodType","protoPath","mode","grpc","bruRequestToJson","parseRequestAndRedactBody","bruFileContent","bodyTypePatterns","replace","EOL","removeLeadingIndentation","indentedString","split","line","fileContentBlocks","Boolean","trim","extractedBodyBlocks","block","some","pattern","startsWith","reduce","bodyContentMap","bodyBlock","bodyType","rawBodyContent","slice","cleanBodyContent","bruFileStringWithRedactedBody","concat","extractedBodyContent","bruRequestParseAndRedactBodyData","requestObj","bruJson","http","lowerCase","metadata","jsonToBruV2","jsonRequestToBru","globalWorkerInstance","getWorkerInstance","parseRequestViaWorker","fileParserWorker","stringifyRequestViaWorker","parseCollection","stringifyCollection","collectionObj","parseFolder","stringifyFolder","folderObj","parseEnvironment","bru","bruToEnvJsonV2","variables","each","v","bruEnvironmentToJson","stringifyEnvironment","envObj","envJsonToBruV2","jsonEnvironmentToBru","parseDotEnv","dotenvToJson"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
type T_Oauth2ParameterSendInType = 'headers' | 'queryparams' | 'body';
|
|
2
|
+
export interface T_OAuth2AdditionalParam {
|
|
3
|
+
name: string;
|
|
4
|
+
value: string;
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
sendIn: T_Oauth2ParameterSendInType;
|
|
7
|
+
}
|
|
8
|
+
export interface T_OAuth2AdditionalParameters {
|
|
9
|
+
authorization?: T_OAuth2AdditionalParam[];
|
|
10
|
+
token?: T_OAuth2AdditionalParam[];
|
|
11
|
+
refresh?: T_OAuth2AdditionalParam[];
|
|
12
|
+
}
|
|
13
|
+
export interface T_Oauth2Auth {
|
|
14
|
+
grantType: string;
|
|
15
|
+
additionalParameters?: T_OAuth2AdditionalParameters;
|
|
16
|
+
}
|
|
17
|
+
export interface T_BruJson {
|
|
18
|
+
auth: {
|
|
19
|
+
oauth2: T_Oauth2Auth;
|
|
20
|
+
};
|
|
21
|
+
oauth2_additional_parameters_auth_req_headers?: any[];
|
|
22
|
+
oauth2_additional_parameters_auth_req_queryparams?: any[];
|
|
23
|
+
oauth2_additional_parameters_access_token_req_headers?: any[];
|
|
24
|
+
oauth2_additional_parameters_access_token_req_queryparams?: any[];
|
|
25
|
+
oauth2_additional_parameters_access_token_req_bodyvalues?: any[];
|
|
26
|
+
oauth2_additional_parameters_refresh_token_req_headers?: any[];
|
|
27
|
+
oauth2_additional_parameters_refresh_token_req_queryparams?: any[];
|
|
28
|
+
oauth2_additional_parameters_refresh_token_req_bodyvalues?: any[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* This function extracts OAuth2 additional parameters from various sources in the bru json data and organizes
|
|
32
|
+
* them into a structured format based on their usage context (authorization, token, refresh).
|
|
33
|
+
*
|
|
34
|
+
* @param json - json object containing OAuth2 configuration and additional parameters
|
|
35
|
+
* @returns OAuth2 additional parameters
|
|
36
|
+
*/
|
|
37
|
+
export declare const getOauth2AdditionalParameters: (json: T_BruJson) => T_OAuth2AdditionalParameters;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses a .bru file and extracts body content while redacting it from the main content
|
|
3
|
+
* @param {string} bruFileContent - The raw content of the .bru file
|
|
4
|
+
* @returns {Object} Object containing redacted file content and extracted body data
|
|
5
|
+
*/
|
|
6
|
+
export declare const bruRequestParseAndRedactBodyData: (bruFileContent: string) => {
|
|
7
|
+
bruFileStringWithRedactedBody: string;
|
|
8
|
+
extractedBodyContent: Record<string, string>;
|
|
9
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import BruParserWorker from './workers';
|
|
2
2
|
import { ParseOptions, StringifyOptions, ParsedRequest, ParsedCollection, ParsedEnvironment } from './types';
|
|
3
3
|
export declare const parseRequest: (content: string, options?: ParseOptions) => any;
|
|
4
|
+
export declare const parseRequestAndRedactBody: (content: string, options?: ParseOptions) => any;
|
|
4
5
|
export declare const stringifyRequest: (requestObj: ParsedRequest, options?: StringifyOptions) => string;
|
|
5
6
|
export declare const parseRequestViaWorker: (content: string) => Promise<any>;
|
|
6
7
|
export declare const stringifyRequestViaWorker: (requestObj: any) => Promise<string>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("node:worker_threads"),t=require("lodash"),r=require("@usebruno/lang");function s(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var a=s(t);
|
|
1
|
+
"use strict";var e=require("node:worker_threads"),t=require("lodash"),r=require("@usebruno/lang");function s(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var a=s(t);const o=[{type:"authorization",sendIn:"headers",source:"oauth2_additional_parameters_auth_req_headers"},{type:"authorization",sendIn:"queryparams",source:"oauth2_additional_parameters_auth_req_queryparams"},{type:"token",sendIn:"headers",source:"oauth2_additional_parameters_access_token_req_headers"},{type:"token",sendIn:"queryparams",source:"oauth2_additional_parameters_access_token_req_queryparams"},{type:"token",sendIn:"body",source:"oauth2_additional_parameters_access_token_req_bodyvalues"},{type:"refresh",sendIn:"headers",source:"oauth2_additional_parameters_refresh_token_req_headers"},{type:"refresh",sendIn:"queryparams",source:"oauth2_additional_parameters_refresh_token_req_queryparams"},{type:"refresh",sendIn:"body",source:"oauth2_additional_parameters_refresh_token_req_bodyvalues"}],n=(e,t)=>e?.length?e.map((e=>({...e,sendIn:t}))):[],u=(e,t,r)=>{if(!((e,t)=>"authorization"===e?"authorization_code"===t||"implicit"===t:"token"!==e&&"refresh"!==e||"implicit"!==t)(t,r))return[];const s=o.filter((e=>e.type===t)),a=[];for(const t of s){const r=e[t.source],s=n(r,t.sendIn);a.push(...s)}return a},g=(e,t=!1)=>{try{const s=t?e:r.bruToJsonV2(e);let o=a.get(s,"meta.type");switch(o){case"http":default:o="http-request";break;case"graphql":o="graphql-request";break;case"grpc":o="grpc-request"}const n=a.get(s,"meta.seq"),g={type:o,name:a.get(s,"meta.name"),seq:a.isNaN(n)?1:Number(n),settings:a.get(s,"settings",{}),tags:a.get(s,"meta.tags",[]),request:{method:"grpc-request"===o?a.get(s,"grpc.method",""):a.upperCase(a.get(s,"http.method")),url:a.get(s,"grpc-request"===o?"grpc.url":"http.url"),headers:"grpc-request"===o?a.get(s,"metadata",[]):a.get(s,"headers",[]),auth:a.get(s,"auth",{}),body:a.get(s,"body",{}),script:a.get(s,"script",{}),vars:a.get(s,"vars",{}),assertions:a.get(s,"assertions",[]),tests:a.get(s,"tests",""),docs:a.get(s,"docs","")}};if("grpc-request"===o){const e=a.get(s,"grpc.methodType");e&&(g.request.methodType=e);const t=a.get(s,"grpc.protoPath");t&&(g.request.protoPath=t),g.request.auth.mode=a.get(s,"grpc.auth","none"),g.request.body=a.get(s,"body",{mode:"grpc",grpc:a.get(s,"body.grpc",[{name:"message 1",content:"{}"}])})}else g.request.params=a.get(s,"params",[]),g.request.auth.mode=a.get(s,"http.auth","none"),g.request.body.mode=a.get(s,"http.body","none");const c=s?.auth?.oauth2?.grantType;if(c){const e=(e=>{const t=e.auth.oauth2.grantType,r={};try{const s=["authorization","token","refresh"];for(const a of s){const s=u(e,a,t);s.length>0&&(r[a]=s)}}catch(e){console.error(e),console.error("Error while getting the oauth2 additional parameters!")}return r})(s);Object.keys(e||{}).length>0&&(g.request.auth.oauth2.additionalParameters=e)}return g}catch(e){throw e}};e.parentPort?.on("message",(async t=>{try{const{taskType:s,data:o}=t;let n;if("parse"===s)n=g(o);else{if("stringify"!==s)throw new Error(`Unknown task type: ${s}`);n=(e=>{try{let t=a.get(e,"type");switch(t){case"http-request":default:t="http";break;case"graphql-request":t="graphql";break;case"grpc-request":t="grpc"}const s=a.get(e,"seq"),o={meta:{name:a.get(e,"name"),type:t,seq:a.isNaN(s)?1:Number(s),tags:a.get(e,"tags",[])}};if("http"===t||"graphql"===t)o.http={method:a.lowerCase(a.get(e,"request.method")),url:a.get(e,"request.url"),auth:a.get(e,"request.auth.mode","none"),body:a.get(e,"request.body.mode","none")},o.params=a.get(e,"request.params",[]),o.body=a.get(e,"request.body",{mode:"json",json:"{}"});else if("grpc"===t){o.grpc={url:a.get(e,"request.url"),auth:a.get(e,"request.auth.mode","none"),body:a.get(e,"request.body.mode","grpc")};const t=a.get(e,"request.method"),r=a.get(e,"request.methodType"),s=a.get(e,"request.protoPath");t&&(o.grpc.method=t),r&&(o.grpc.methodType=r),s&&(o.grpc.protoPath=s),o.body=a.get(e,"request.body",{mode:"grpc",grpc:a.get(e,"request.body.grpc",[{name:"message 1",content:"{}"}])})}return"grpc"===t?o.metadata=a.get(e,"request.headers",[]):o.headers=a.get(e,"request.headers",[]),o.auth=a.get(e,"request.auth",{}),o.script=a.get(e,"request.script",{}),o.vars={req:a.get(e,"request.vars.req",[]),res:a.get(e,"request.vars.res",[])},o.assertions=a.get(e,"request.assertions",[]),o.tests=a.get(e,"request.tests",""),o.settings=a.get(e,"settings",{}),o.docs=a.get(e,"request.docs",""),r.jsonToBruV2(o)}catch(e){throw e}})(o)}e.parentPort?.postMessage(n)}catch(t){console.error("Worker error:",t),e.parentPort?.postMessage({error:t?.message})}}));
|
|
2
2
|
//# sourceMappingURL=worker-script.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-script.js","sources":["../../../src/workers/worker-script.ts","../../../src/formats/bru/index.ts"],"sourcesContent":["import { parentPort } from 'node:worker_threads';\nimport { bruRequestToJson, jsonRequestToBru } from '../formats/bru';\n\ninterface WorkerMessage {\n taskType: 'parse' | 'stringify';\n data: any;\n}\n\nparentPort?.on('message', async (message: WorkerMessage) => {\n try {\n const { taskType, data } = message;\n let result: any;\n\n if (taskType === 'parse') {\n result = bruRequestToJson(data);\n } else if (taskType === 'stringify') {\n result = jsonRequestToBru(data);\n } else {\n throw new Error(`Unknown task type: ${taskType}`);\n }\n\n parentPort?.postMessage(result);\n } catch (error: any) {\n console.error('Worker error:', error);\n parentPort?.postMessage({ error: error?.message });\n }\n});","import * as _ from 'lodash';\nimport {\n bruToJsonV2,\n jsonToBruV2,\n bruToEnvJsonV2,\n envJsonToBruV2,\n collectionBruToJson as _collectionBruToJson,\n jsonToCollectionBru as _jsonToCollectionBru\n} from '@usebruno/lang';\n\nexport const bruRequestToJson = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : bruToJsonV2(data);\n\n let requestType = _.get(json, 'meta.type');\n if (requestType === 'http') {\n requestType = 'http-request';\n } else if (requestType === 'graphql') {\n requestType = 'graphql-request';\n } else {\n requestType = 'http-request';\n }\n\n const sequence = _.get(json, 'meta.seq');\n const transformedJson = {\n type: requestType,\n name: _.get(json, 'meta.name'),\n seq: !_.isNaN(sequence) ? Number(sequence) : 1,\n settings: _.get(json, 'settings', {}),\n tags: _.get(json, 'meta.tags', []),\n request: {\n method: _.upperCase(_.get(json, 'http.method')),\n url: _.get(json, 'http.url'),\n params: _.get(json, 'params', []),\n headers: _.get(json, 'headers', []),\n auth: _.get(json, 'auth', {}),\n body: _.get(json, 'body', {}),\n script: _.get(json, 'script', {}),\n vars: _.get(json, 'vars', {}),\n assertions: _.get(json, 'assertions', []),\n tests: _.get(json, 'tests', ''),\n docs: _.get(json, 'docs', '')\n }\n };\n\n transformedJson.request.auth.mode = _.get(json, 'http.auth', 'none');\n transformedJson.request.body.mode = _.get(json, 'http.body', 'none');\n\n return transformedJson;\n } catch (e) {\n return Promise.reject(e);\n }\n};\n\nexport const jsonRequestToBru = (json: any): string => {\n try {\n let type = _.get(json, 'type');\n if (type === 'http-request') {\n type = 'http';\n } else if (type === 'graphql-request') {\n type = 'graphql';\n } else {\n type = 'http';\n }\n\n const sequence = _.get(json, 'seq');\n const bruJson = {\n meta: {\n name: _.get(json, 'name'),\n type: type,\n seq: !_.isNaN(sequence) ? Number(sequence) : 1,\n tags: _.get(json, 'tags', []),\n },\n http: {\n method: _.lowerCase(_.get(json, 'request.method')),\n url: _.get(json, 'request.url'),\n auth: _.get(json, 'request.auth.mode', 'none'),\n body: _.get(json, 'request.body.mode', 'none')\n },\n params: _.get(json, 'request.params', []),\n headers: _.get(json, 'request.headers', []),\n auth: _.get(json, 'request.auth', {}),\n body: _.get(json, 'request.body', {}),\n script: _.get(json, 'request.script', {}),\n vars: {\n req: _.get(json, 'request.vars.req', []),\n res: _.get(json, 'request.vars.res', [])\n },\n assertions: _.get(json, 'request.assertions', []),\n tests: _.get(json, 'request.tests', ''),\n settings: _.get(json, 'settings', {}),\n docs: _.get(json, 'request.docs', '')\n };\n\n const bru = jsonToBruV2(bruJson);\n return bru;\n } catch (error) {\n throw error;\n }\n};\n\nexport const bruCollectionToJson = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : _collectionBruToJson(data);\n\n const transformedJson: any = {\n request: {\n headers: _.get(json, 'headers', []),\n auth: _.get(json, 'auth', {}),\n script: _.get(json, 'script', {}),\n vars: _.get(json, 'vars', {}),\n tests: _.get(json, 'tests', '')\n },\n settings: _.get(json, 'settings', {}),\n docs: _.get(json, 'docs', '')\n };\n\n // add meta if it exists\n // this is only for folder bru file\n if (json.meta) {\n transformedJson.meta = {\n name: json.meta.name\n };\n \n // Include seq if it exists\n if (json.meta.seq !== undefined) {\n const sequence = json.meta.seq;\n transformedJson.meta.seq = !isNaN(sequence) ? Number(sequence) : 1;\n }\n }\n\n return transformedJson;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const jsonCollectionToBru = (json: any, isFolder?: boolean): string => {\n try {\n const collectionBruJson: any = {\n headers: _.get(json, 'request.headers', []),\n script: {\n req: _.get(json, 'request.script.req', ''),\n res: _.get(json, 'request.script.res', '')\n },\n vars: {\n req: _.get(json, 'request.vars.req', []),\n res: _.get(json, 'request.vars.res', [])\n },\n tests: _.get(json, 'request.tests', ''),\n auth: _.get(json, 'request.auth', {}),\n docs: _.get(json, 'docs', '')\n };\n\n // add meta if it exists\n // this is only for folder bru file\n if (json?.meta) {\n collectionBruJson.meta = {\n name: json.meta.name\n };\n \n // Include seq if it exists\n if (json.meta.seq !== undefined) {\n const sequence = json.meta.seq;\n collectionBruJson.meta.seq = !isNaN(sequence) ? Number(sequence) : 1;\n }\n }\n\n if (!isFolder) {\n collectionBruJson.auth = _.get(json, 'request.auth', {});\n }\n\n return _jsonToCollectionBru(collectionBruJson);\n } catch (error) {\n throw error;\n }\n};\n\nexport const bruEnvironmentToJson = (bru: string): any => {\n try {\n const json = bruToEnvJsonV2(bru);\n\n // the app env format requires each variable to have a type\n // this need to be evaluated and safely removed\n // i don't see it being used in schema validation\n if (json && json.variables && json.variables.length) {\n _.each(json.variables, (v: any) => (v.type = 'text'));\n }\n\n return json;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const jsonEnvironmentToBru = (json: any): string => {\n try {\n const bru = envJsonToBruV2(json);\n return bru;\n } catch (error) {\n throw error;\n }\n}; "],"names":["parentPort","on","async","message","taskType","data","result","parsed","json","bruToJsonV2","requestType","_","get","sequence","transformedJson","type","name","seq","isNaN","Number","settings","tags","request","method","upperCase","url","params","headers","auth","body","script","vars","assertions","tests","docs","mode","e","Promise","reject","bruRequestToJson","Error","bruJson","meta","http","lowerCase","req","res","jsonToBruV2","error","jsonRequestToBru","postMessage","console"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"worker-script.js","sources":["../../../src/formats/bru/utils/oauth2-additional-params.ts","../../../src/formats/bru/index.ts","../../../src/workers/worker-script.ts"],"sourcesContent":["type T_Oauth2ParameterType = 'authorization' | 'token' | 'refresh';\ntype T_Oauth2ParameterSendInType = 'headers' | 'queryparams' | 'body';\n\nexport interface T_OAuth2AdditionalParam {\n name: string;\n value: string;\n enabled: boolean;\n sendIn: T_Oauth2ParameterSendInType\n}\n\nexport interface T_OAuth2AdditionalParameters {\n authorization?: T_OAuth2AdditionalParam[];\n token?: T_OAuth2AdditionalParam[];\n refresh?: T_OAuth2AdditionalParam[];\n}\n\nexport interface T_Oauth2Auth {\n grantType: string;\n additionalParameters?: T_OAuth2AdditionalParameters;\n}\n\nexport interface T_BruJson {\n auth: {\n oauth2: T_Oauth2Auth;\n };\n oauth2_additional_parameters_auth_req_headers?: any[];\n oauth2_additional_parameters_auth_req_queryparams?: any[];\n oauth2_additional_parameters_access_token_req_headers?: any[];\n oauth2_additional_parameters_access_token_req_queryparams?: any[];\n oauth2_additional_parameters_access_token_req_bodyvalues?: any[];\n oauth2_additional_parameters_refresh_token_req_headers?: any[];\n oauth2_additional_parameters_refresh_token_req_queryparams?: any[];\n oauth2_additional_parameters_refresh_token_req_bodyvalues?: any[];\n}\n\ninterface T_Oauth2ParameterMapping {\n type: T_Oauth2ParameterType;\n sendIn: T_Oauth2ParameterSendInType;\n source: keyof T_BruJson;\n}\n\nconst PARAMETER_MAPPINGS: T_Oauth2ParameterMapping[] = [\n // Authorization parameters (only for authorization_code grant type)\n { type: 'authorization', sendIn: 'headers', source: 'oauth2_additional_parameters_auth_req_headers' },\n { type: 'authorization', sendIn: 'queryparams', source: 'oauth2_additional_parameters_auth_req_queryparams' },\n \n // Token parameters (for all grant types)\n { type: 'token', sendIn: 'headers', source: 'oauth2_additional_parameters_access_token_req_headers' },\n { type: 'token', sendIn: 'queryparams', source: 'oauth2_additional_parameters_access_token_req_queryparams' },\n { type: 'token', sendIn: 'body', source: 'oauth2_additional_parameters_access_token_req_bodyvalues' },\n \n // Refresh parameters (for grant types that support refresh)\n { type: 'refresh', sendIn: 'headers', source: 'oauth2_additional_parameters_refresh_token_req_headers' },\n { type: 'refresh', sendIn: 'queryparams', source: 'oauth2_additional_parameters_refresh_token_req_queryparams' },\n { type: 'refresh', sendIn: 'body', source: 'oauth2_additional_parameters_refresh_token_req_bodyvalues' },\n];\n\n/**\n * Maps source parameters to T_OAuth2AdditionalParam format\n */\nconst mapParametersFromSource = (sourceParams: any[], sendIn: T_Oauth2ParameterSendInType): T_OAuth2AdditionalParam[] => {\n if (!sourceParams?.length) {\n return [];\n }\n \n return sourceParams.map(param => ({\n ...param,\n sendIn\n }));\n};\n\n/**\n * Checks if a parameter type should be included based on grant type\n */\nconst shouldIncludeParameterType = (type: T_Oauth2ParameterType, grantType: string): boolean => {\n // Authorization parameters are only valid for authorization_code grant type\n if (type === 'authorization') {\n return grantType === 'authorization_code' || grantType === 'implicit';\n }\n\n if (type === 'token' || type === 'refresh') {\n return grantType !== 'implicit';\n }\n \n // Token and refresh parameters are valid for all grant types\n return true;\n};\n\n/**\n * Collects all parameters for a specific type (authorization, token, or refresh)\n */\nconst collectParametersForType = (\n json: T_BruJson, \n type: T_Oauth2ParameterType, \n grantType: string\n): T_OAuth2AdditionalParam[] => {\n if (!shouldIncludeParameterType(type, grantType)) {\n return [];\n }\n\n const relevantMappings = PARAMETER_MAPPINGS.filter(mapping => mapping.type === type);\n const allParams: T_OAuth2AdditionalParam[] = [];\n\n for (const mapping of relevantMappings) {\n const sourceParams = json[mapping.source] as any[];\n const mappedParams = mapParametersFromSource(sourceParams, mapping.sendIn);\n allParams.push(...mappedParams);\n }\n\n return allParams;\n};\n\n/**\n * This function extracts OAuth2 additional parameters from various sources in the bru json data and organizes\n * them into a structured format based on their usage context (authorization, token, refresh).\n * \n * @param json - json object containing OAuth2 configuration and additional parameters\n * @returns OAuth2 additional parameters\n */\nexport const getOauth2AdditionalParameters = (json: T_BruJson): T_OAuth2AdditionalParameters => {\n const grantType = json.auth.oauth2.grantType;\n const additionalParameters: T_OAuth2AdditionalParameters = {};\n\n try {\n // Collect parameters for each type\n const parameterTypes: T_Oauth2ParameterType[] = ['authorization', 'token', 'refresh'];\n \n for (const type of parameterTypes) {\n const params = collectParametersForType(json, type, grantType);\n if (params.length > 0) {\n additionalParameters[type] = params;\n }\n }\n }\n catch(error) {\n console.error(error);\n console.error(\"Error while getting the oauth2 additional parameters!\");\n }\n \n return additionalParameters;\n};","import * as _ from 'lodash';\nimport {\n bruToJsonV2,\n jsonToBruV2,\n bruToEnvJsonV2,\n envJsonToBruV2,\n collectionBruToJson as _collectionBruToJson,\n jsonToCollectionBru as _jsonToCollectionBru\n} from '@usebruno/lang';\nimport { getOauth2AdditionalParameters } from './utils/oauth2-additional-params';\n\nexport const bruRequestToJson = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : bruToJsonV2(data);\n\n let requestType = _.get(json, 'meta.type');\n switch (requestType) {\n case 'http':\n requestType = 'http-request';\n break;\n case 'graphql':\n requestType = 'graphql-request';\n break;\n case 'grpc':\n requestType = 'grpc-request';\n break;\n default:\n requestType = 'http-request';\n }\n\n const sequence = _.get(json, 'meta.seq');\n const transformedJson = {\n type: requestType,\n name: _.get(json, 'meta.name'),\n seq: !_.isNaN(sequence) ? Number(sequence) : 1,\n settings: _.get(json, 'settings', {}),\n tags: _.get(json, 'meta.tags', []),\n request: {\n method:\n requestType === 'grpc-request' ? _.get(json, 'grpc.method', '') : _.upperCase(_.get(json, 'http.method')),\n url: _.get(json, requestType === 'grpc-request' ? 'grpc.url' : 'http.url'),\n headers: requestType === 'grpc-request' ? _.get(json, 'metadata', []) : _.get(json, 'headers', []),\n auth: _.get(json, 'auth', {}),\n body: _.get(json, 'body', {}),\n script: _.get(json, 'script', {}),\n vars: _.get(json, 'vars', {}),\n assertions: _.get(json, 'assertions', []),\n tests: _.get(json, 'tests', ''),\n docs: _.get(json, 'docs', '')\n }\n };\n\n // Add request type specific fields\n if (requestType === 'grpc-request') {\n const selectedMethodType = _.get(json, 'grpc.methodType');\n selectedMethodType && ((transformedJson.request as any).methodType = selectedMethodType);\n const protoPath = _.get(json, 'grpc.protoPath');\n protoPath && ((transformedJson.request as any).protoPath = protoPath);\n transformedJson.request.auth.mode = _.get(json, 'grpc.auth', 'none');\n transformedJson.request.body = _.get(json, 'body', {\n mode: 'grpc',\n grpc: _.get(json, 'body.grpc', [\n {\n name: 'message 1',\n content: '{}'\n }\n ])\n });\n } else {\n // For HTTP and GraphQL\n (transformedJson.request as any).params = _.get(json, 'params', []);\n transformedJson.request.auth.mode = _.get(json, 'http.auth', 'none');\n transformedJson.request.body.mode = _.get(json, 'http.body', 'none');\n }\n\n // add oauth2 additional parameters if they exist\n const hasOauth2GrantType = json?.auth?.oauth2?.grantType;\n if (hasOauth2GrantType) {\n const additionalParameters = getOauth2AdditionalParameters(json);\n const hasAdditionalParameters = Object.keys(additionalParameters || {}).length > 0;\n if (hasAdditionalParameters) {\n transformedJson.request.auth.oauth2.additionalParameters = additionalParameters;\n }\n }\n\n return transformedJson;\n } catch (error) {\n throw error;\n }\n};\n\nexport const jsonRequestToBru = (json: any): string => {\n try {\n let type = _.get(json, 'type');\n switch (type) {\n case 'http-request':\n type = 'http';\n break;\n case 'graphql-request':\n type = 'graphql';\n break;\n case 'grpc-request':\n type = 'grpc';\n break;\n default:\n type = 'http';\n }\n\n const sequence = _.get(json, 'seq');\n\n // Start with the common meta section\n const bruJson = {\n meta: {\n name: _.get(json, 'name'),\n type: type,\n seq: !_.isNaN(sequence) ? Number(sequence) : 1,\n tags: _.get(json, 'tags', [])\n }\n } as any;\n\n // For HTTP and GraphQL requests, maintain the current structure\n if (type === 'http' || type === 'graphql') {\n bruJson.http = {\n method: _.lowerCase(_.get(json, 'request.method')),\n url: _.get(json, 'request.url'),\n auth: _.get(json, 'request.auth.mode', 'none'),\n body: _.get(json, 'request.body.mode', 'none')\n };\n bruJson.params = _.get(json, 'request.params', []);\n bruJson.body = _.get(json, 'request.body', {\n mode: 'json',\n json: '{}'\n });\n } // For gRPC, add gRPC-specific structure but maintain field names\n else if (type === 'grpc') {\n bruJson.grpc = {\n url: _.get(json, 'request.url'),\n auth: _.get(json, 'request.auth.mode', 'none'),\n body: _.get(json, 'request.body.mode', 'grpc')\n };\n // Only add method if it exists\n const method = _.get(json, 'request.method');\n const methodType = _.get(json, 'request.methodType');\n const protoPath = _.get(json, 'request.protoPath');\n if (method) bruJson.grpc.method = method;\n if (methodType) bruJson.grpc.methodType = methodType;\n if (protoPath) bruJson.grpc.protoPath = protoPath;\n bruJson.body = _.get(json, 'request.body', {\n mode: 'grpc',\n grpc: _.get(json, 'request.body.grpc', [\n {\n name: 'message 1',\n content: '{}'\n }\n ])\n });\n }\n\n // Common fields for all request types\n if (type === 'grpc') {\n bruJson.metadata = _.get(json, 'request.headers', []); // Use metadata for gRPC\n } else {\n bruJson.headers = _.get(json, 'request.headers', []); // Use headers for HTTP/GraphQL\n }\n bruJson.auth = _.get(json, 'request.auth', {});\n bruJson.script = _.get(json, 'request.script', {});\n bruJson.vars = {\n req: _.get(json, 'request.vars.req', []),\n res: _.get(json, 'request.vars.res', [])\n };\n // should we add assertions and tests for grpc requests?\n bruJson.assertions = _.get(json, 'request.assertions', []);\n bruJson.tests = _.get(json, 'request.tests', '');\n bruJson.settings = _.get(json, 'settings', {});\n bruJson.docs = _.get(json, 'request.docs', '');\n\n const bru = jsonToBruV2(bruJson);\n return bru;\n } catch (error) {\n throw error;\n }\n};\n\nexport const bruCollectionToJson = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : _collectionBruToJson(data);\n\n const transformedJson: any = {\n request: {\n headers: _.get(json, 'headers', []),\n auth: _.get(json, 'auth', {}),\n script: _.get(json, 'script', {}),\n vars: _.get(json, 'vars', {}),\n tests: _.get(json, 'tests', '')\n },\n settings: _.get(json, 'settings', {}),\n docs: _.get(json, 'docs', '')\n };\n\n // add meta if it exists\n // this is only for folder bru file\n if (json.meta) {\n transformedJson.meta = {\n name: json.meta.name\n };\n\n // Include seq if it exists\n if (json.meta.seq !== undefined) {\n const sequence = json.meta.seq;\n transformedJson.meta.seq = !isNaN(sequence) ? Number(sequence) : 1;\n }\n }\n\n // add oauth2 additional parameters if they exist\n const hasOauth2GrantType = json?.auth?.oauth2?.grantType;\n if (hasOauth2GrantType) {\n const additionalParameters = getOauth2AdditionalParameters(json);\n const hasAdditionalParameters = Object.keys(additionalParameters).length > 0;\n if (hasAdditionalParameters) {\n transformedJson.request.auth.oauth2.additionalParameters = additionalParameters;\n }\n }\n\n return transformedJson;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const jsonCollectionToBru = (json: any, isFolder?: boolean): string => {\n try {\n const collectionBruJson: any = {\n headers: _.get(json, 'request.headers', []),\n script: {\n req: _.get(json, 'request.script.req', ''),\n res: _.get(json, 'request.script.res', '')\n },\n vars: {\n req: _.get(json, 'request.vars.req', []),\n res: _.get(json, 'request.vars.res', [])\n },\n tests: _.get(json, 'request.tests', ''),\n auth: _.get(json, 'request.auth', {}),\n docs: _.get(json, 'docs', '')\n };\n\n // add meta if it exists\n // this is only for folder bru file\n if (json?.meta) {\n collectionBruJson.meta = {\n name: json.meta.name\n };\n\n // Include seq if it exists\n if (json.meta.seq !== undefined) {\n const sequence = json.meta.seq;\n collectionBruJson.meta.seq = !isNaN(sequence) ? Number(sequence) : 1;\n }\n }\n\n if (!isFolder) {\n collectionBruJson.auth = _.get(json, 'request.auth', {});\n }\n\n return _jsonToCollectionBru(collectionBruJson);\n } catch (error) {\n throw error;\n }\n};\n\nexport const bruEnvironmentToJson = (bru: string): any => {\n try {\n const json = bruToEnvJsonV2(bru);\n\n // the app env format requires each variable to have a type\n // this need to be evaluated and safely removed\n // i don't see it being used in schema validation\n if (json && json.variables && json.variables.length) {\n _.each(json.variables, (v: any) => (v.type = 'text'));\n }\n\n return json;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const jsonEnvironmentToBru = (json: any): string => {\n try {\n const bru = envJsonToBruV2(json);\n return bru;\n } catch (error) {\n throw error;\n }\n};\n","import { parentPort } from 'node:worker_threads';\nimport { bruRequestToJson, jsonRequestToBru } from '../formats/bru';\n\ninterface WorkerMessage {\n taskType: 'parse' | 'stringify';\n data: any;\n}\n\nparentPort?.on('message', async (message: WorkerMessage) => {\n try {\n const { taskType, data } = message;\n let result: any;\n\n if (taskType === 'parse') {\n result = bruRequestToJson(data);\n } else if (taskType === 'stringify') {\n result = jsonRequestToBru(data);\n } else {\n throw new Error(`Unknown task type: ${taskType}`);\n }\n\n parentPort?.postMessage(result);\n } catch (error: any) {\n console.error('Worker error:', error);\n parentPort?.postMessage({ error: error?.message });\n }\n});"],"names":["PARAMETER_MAPPINGS","type","sendIn","source","mapParametersFromSource","sourceParams","length","map","param","collectParametersForType","json","grantType","shouldIncludeParameterType","relevantMappings","filter","mapping","allParams","mappedParams","push","bruRequestToJson","data","parsed","bruToJsonV2","requestType","_","get","sequence","transformedJson","name","seq","isNaN","Number","settings","tags","request","method","upperCase","url","headers","auth","body","script","vars","assertions","tests","docs","selectedMethodType","methodType","protoPath","mode","grpc","content","params","hasOauth2GrantType","oauth2","additionalParameters","parameterTypes","error","console","getOauth2AdditionalParameters","Object","keys","parentPort","on","async","message","taskType","result","Error","bruJson","meta","http","lowerCase","metadata","req","res","jsonToBruV2","jsonRequestToBru","postMessage"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usebruno/filestore",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"rollup": "3.29.5"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@usebruno/lang": "0.
|
|
44
|
+
"@usebruno/lang": "0.28.0",
|
|
45
45
|
"lodash": "^4.17.21"
|
|
46
46
|
}
|
|
47
47
|
}
|
package/src/formats/bru/index.ts
CHANGED
|
@@ -7,18 +7,25 @@ import {
|
|
|
7
7
|
collectionBruToJson as _collectionBruToJson,
|
|
8
8
|
jsonToCollectionBru as _jsonToCollectionBru
|
|
9
9
|
} from '@usebruno/lang';
|
|
10
|
+
import { getOauth2AdditionalParameters } from './utils/oauth2-additional-params';
|
|
10
11
|
|
|
11
12
|
export const bruRequestToJson = (data: string | any, parsed: boolean = false): any => {
|
|
12
13
|
try {
|
|
13
14
|
const json = parsed ? data : bruToJsonV2(data);
|
|
14
15
|
|
|
15
16
|
let requestType = _.get(json, 'meta.type');
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
switch (requestType) {
|
|
18
|
+
case 'http':
|
|
19
|
+
requestType = 'http-request';
|
|
20
|
+
break;
|
|
21
|
+
case 'graphql':
|
|
22
|
+
requestType = 'graphql-request';
|
|
23
|
+
break;
|
|
24
|
+
case 'grpc':
|
|
25
|
+
requestType = 'grpc-request';
|
|
26
|
+
break;
|
|
27
|
+
default:
|
|
28
|
+
requestType = 'http-request';
|
|
22
29
|
}
|
|
23
30
|
|
|
24
31
|
const sequence = _.get(json, 'meta.seq');
|
|
@@ -29,10 +36,10 @@ export const bruRequestToJson = (data: string | any, parsed: boolean = false): a
|
|
|
29
36
|
settings: _.get(json, 'settings', {}),
|
|
30
37
|
tags: _.get(json, 'meta.tags', []),
|
|
31
38
|
request: {
|
|
32
|
-
method:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
headers: _.get(json, 'headers', []),
|
|
39
|
+
method:
|
|
40
|
+
requestType === 'grpc-request' ? _.get(json, 'grpc.method', '') : _.upperCase(_.get(json, 'http.method')),
|
|
41
|
+
url: _.get(json, requestType === 'grpc-request' ? 'grpc.url' : 'http.url'),
|
|
42
|
+
headers: requestType === 'grpc-request' ? _.get(json, 'metadata', []) : _.get(json, 'headers', []),
|
|
36
43
|
auth: _.get(json, 'auth', {}),
|
|
37
44
|
body: _.get(json, 'body', {}),
|
|
38
45
|
script: _.get(json, 'script', {}),
|
|
@@ -43,54 +50,129 @@ export const bruRequestToJson = (data: string | any, parsed: boolean = false): a
|
|
|
43
50
|
}
|
|
44
51
|
};
|
|
45
52
|
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
// Add request type specific fields
|
|
54
|
+
if (requestType === 'grpc-request') {
|
|
55
|
+
const selectedMethodType = _.get(json, 'grpc.methodType');
|
|
56
|
+
selectedMethodType && ((transformedJson.request as any).methodType = selectedMethodType);
|
|
57
|
+
const protoPath = _.get(json, 'grpc.protoPath');
|
|
58
|
+
protoPath && ((transformedJson.request as any).protoPath = protoPath);
|
|
59
|
+
transformedJson.request.auth.mode = _.get(json, 'grpc.auth', 'none');
|
|
60
|
+
transformedJson.request.body = _.get(json, 'body', {
|
|
61
|
+
mode: 'grpc',
|
|
62
|
+
grpc: _.get(json, 'body.grpc', [
|
|
63
|
+
{
|
|
64
|
+
name: 'message 1',
|
|
65
|
+
content: '{}'
|
|
66
|
+
}
|
|
67
|
+
])
|
|
68
|
+
});
|
|
69
|
+
} else {
|
|
70
|
+
// For HTTP and GraphQL
|
|
71
|
+
(transformedJson.request as any).params = _.get(json, 'params', []);
|
|
72
|
+
transformedJson.request.auth.mode = _.get(json, 'http.auth', 'none');
|
|
73
|
+
transformedJson.request.body.mode = _.get(json, 'http.body', 'none');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// add oauth2 additional parameters if they exist
|
|
77
|
+
const hasOauth2GrantType = json?.auth?.oauth2?.grantType;
|
|
78
|
+
if (hasOauth2GrantType) {
|
|
79
|
+
const additionalParameters = getOauth2AdditionalParameters(json);
|
|
80
|
+
const hasAdditionalParameters = Object.keys(additionalParameters || {}).length > 0;
|
|
81
|
+
if (hasAdditionalParameters) {
|
|
82
|
+
transformedJson.request.auth.oauth2.additionalParameters = additionalParameters;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
48
85
|
|
|
49
86
|
return transformedJson;
|
|
50
|
-
} catch (
|
|
51
|
-
|
|
87
|
+
} catch (error) {
|
|
88
|
+
throw error;
|
|
52
89
|
}
|
|
53
90
|
};
|
|
54
91
|
|
|
55
92
|
export const jsonRequestToBru = (json: any): string => {
|
|
56
93
|
try {
|
|
57
94
|
let type = _.get(json, 'type');
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
95
|
+
switch (type) {
|
|
96
|
+
case 'http-request':
|
|
97
|
+
type = 'http';
|
|
98
|
+
break;
|
|
99
|
+
case 'graphql-request':
|
|
100
|
+
type = 'graphql';
|
|
101
|
+
break;
|
|
102
|
+
case 'grpc-request':
|
|
103
|
+
type = 'grpc';
|
|
104
|
+
break;
|
|
105
|
+
default:
|
|
106
|
+
type = 'http';
|
|
64
107
|
}
|
|
65
108
|
|
|
66
109
|
const sequence = _.get(json, 'seq');
|
|
110
|
+
|
|
111
|
+
// Start with the common meta section
|
|
67
112
|
const bruJson = {
|
|
68
113
|
meta: {
|
|
69
114
|
name: _.get(json, 'name'),
|
|
70
115
|
type: type,
|
|
71
116
|
seq: !_.isNaN(sequence) ? Number(sequence) : 1,
|
|
72
|
-
tags: _.get(json, 'tags', [])
|
|
73
|
-
}
|
|
74
|
-
|
|
117
|
+
tags: _.get(json, 'tags', [])
|
|
118
|
+
}
|
|
119
|
+
} as any;
|
|
120
|
+
|
|
121
|
+
// For HTTP and GraphQL requests, maintain the current structure
|
|
122
|
+
if (type === 'http' || type === 'graphql') {
|
|
123
|
+
bruJson.http = {
|
|
75
124
|
method: _.lowerCase(_.get(json, 'request.method')),
|
|
76
125
|
url: _.get(json, 'request.url'),
|
|
77
126
|
auth: _.get(json, 'request.auth.mode', 'none'),
|
|
78
127
|
body: _.get(json, 'request.body.mode', 'none')
|
|
79
|
-
}
|
|
80
|
-
params
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
128
|
+
};
|
|
129
|
+
bruJson.params = _.get(json, 'request.params', []);
|
|
130
|
+
bruJson.body = _.get(json, 'request.body', {
|
|
131
|
+
mode: 'json',
|
|
132
|
+
json: '{}'
|
|
133
|
+
});
|
|
134
|
+
} // For gRPC, add gRPC-specific structure but maintain field names
|
|
135
|
+
else if (type === 'grpc') {
|
|
136
|
+
bruJson.grpc = {
|
|
137
|
+
url: _.get(json, 'request.url'),
|
|
138
|
+
auth: _.get(json, 'request.auth.mode', 'none'),
|
|
139
|
+
body: _.get(json, 'request.body.mode', 'grpc')
|
|
140
|
+
};
|
|
141
|
+
// Only add method if it exists
|
|
142
|
+
const method = _.get(json, 'request.method');
|
|
143
|
+
const methodType = _.get(json, 'request.methodType');
|
|
144
|
+
const protoPath = _.get(json, 'request.protoPath');
|
|
145
|
+
if (method) bruJson.grpc.method = method;
|
|
146
|
+
if (methodType) bruJson.grpc.methodType = methodType;
|
|
147
|
+
if (protoPath) bruJson.grpc.protoPath = protoPath;
|
|
148
|
+
bruJson.body = _.get(json, 'request.body', {
|
|
149
|
+
mode: 'grpc',
|
|
150
|
+
grpc: _.get(json, 'request.body.grpc', [
|
|
151
|
+
{
|
|
152
|
+
name: 'message 1',
|
|
153
|
+
content: '{}'
|
|
154
|
+
}
|
|
155
|
+
])
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Common fields for all request types
|
|
160
|
+
if (type === 'grpc') {
|
|
161
|
+
bruJson.metadata = _.get(json, 'request.headers', []); // Use metadata for gRPC
|
|
162
|
+
} else {
|
|
163
|
+
bruJson.headers = _.get(json, 'request.headers', []); // Use headers for HTTP/GraphQL
|
|
164
|
+
}
|
|
165
|
+
bruJson.auth = _.get(json, 'request.auth', {});
|
|
166
|
+
bruJson.script = _.get(json, 'request.script', {});
|
|
167
|
+
bruJson.vars = {
|
|
168
|
+
req: _.get(json, 'request.vars.req', []),
|
|
169
|
+
res: _.get(json, 'request.vars.res', [])
|
|
93
170
|
};
|
|
171
|
+
// should we add assertions and tests for grpc requests?
|
|
172
|
+
bruJson.assertions = _.get(json, 'request.assertions', []);
|
|
173
|
+
bruJson.tests = _.get(json, 'request.tests', '');
|
|
174
|
+
bruJson.settings = _.get(json, 'settings', {});
|
|
175
|
+
bruJson.docs = _.get(json, 'request.docs', '');
|
|
94
176
|
|
|
95
177
|
const bru = jsonToBruV2(bruJson);
|
|
96
178
|
return bru;
|
|
@@ -121,7 +203,7 @@ export const bruCollectionToJson = (data: string | any, parsed: boolean = false)
|
|
|
121
203
|
transformedJson.meta = {
|
|
122
204
|
name: json.meta.name
|
|
123
205
|
};
|
|
124
|
-
|
|
206
|
+
|
|
125
207
|
// Include seq if it exists
|
|
126
208
|
if (json.meta.seq !== undefined) {
|
|
127
209
|
const sequence = json.meta.seq;
|
|
@@ -129,6 +211,16 @@ export const bruCollectionToJson = (data: string | any, parsed: boolean = false)
|
|
|
129
211
|
}
|
|
130
212
|
}
|
|
131
213
|
|
|
214
|
+
// add oauth2 additional parameters if they exist
|
|
215
|
+
const hasOauth2GrantType = json?.auth?.oauth2?.grantType;
|
|
216
|
+
if (hasOauth2GrantType) {
|
|
217
|
+
const additionalParameters = getOauth2AdditionalParameters(json);
|
|
218
|
+
const hasAdditionalParameters = Object.keys(additionalParameters).length > 0;
|
|
219
|
+
if (hasAdditionalParameters) {
|
|
220
|
+
transformedJson.request.auth.oauth2.additionalParameters = additionalParameters;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
132
224
|
return transformedJson;
|
|
133
225
|
} catch (error) {
|
|
134
226
|
return Promise.reject(error);
|
|
@@ -158,7 +250,7 @@ export const jsonCollectionToBru = (json: any, isFolder?: boolean): string => {
|
|
|
158
250
|
collectionBruJson.meta = {
|
|
159
251
|
name: json.meta.name
|
|
160
252
|
};
|
|
161
|
-
|
|
253
|
+
|
|
162
254
|
// Include seq if it exists
|
|
163
255
|
if (json.meta.seq !== undefined) {
|
|
164
256
|
const sequence = json.meta.seq;
|
|
@@ -200,4 +292,4 @@ export const jsonEnvironmentToBru = (json: any): string => {
|
|
|
200
292
|
} catch (error) {
|
|
201
293
|
throw error;
|
|
202
294
|
}
|
|
203
|
-
};
|
|
295
|
+
};
|