@usebruno/filestore 0.3.1 → 0.5.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/index.d.ts +13 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/workers/formats/bru/index.d.ts +13 -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/index.d.ts +13 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/workers/formats/bru/index.d.ts +13 -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 +137 -5
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 // Preserving special characters in custom methods. Using _.upperCase strips special characters.\n method:\n requestType === 'grpc-request' ? _.get(json, 'grpc.method', '') : String(_.get(json, 'http.method') ?? '').toUpperCase(),\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 // Preserve special characters in custom request methods. Avoid _.lowerCase which strips symbols.\n method: String(_.get(json, 'request.method') ?? '').toLowerCase(),\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","String","toUpperCase","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","toLowerCase","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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"}
|
|
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 case 'ws':\n requestType = 'ws-request';\n break;\n default:\n requestType = 'http-request';\n }\n\n const sequence = _.get(json, 'meta.seq');\n const urlPath: Record<typeof requestType, string> = {\n 'grpc-request': 'grpc.url',\n 'ws-request': 'ws.url',\n 'default': 'http.url'\n };\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 // Preserving special characters in custom methods. Using _.upperCase strips special characters.\n method:\n requestType === 'grpc-request'\n ? _.get(json, 'grpc.method', '')\n : String(_.get(json, 'http.method') ?? '').toUpperCase(),\n url: _.get(json, urlPath[requestType], _.get(json, urlPath.default)),\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 examples: _.get(json, 'examples', []).map((e: any) => {\n return bruExampleToJson(e, true, requestType, _.get(json, 'http.method'));\n })\n } as any;\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 if (requestType === 'ws-request') {\n transformedJson.request.auth.mode = _.get(json, 'ws.auth', 'none');\n transformedJson.request.body = _.get(json, 'body', {\n mode: 'ws',\n ws: _.get(json, 'body.ws', [\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 return transformedJson;\n } catch (error) {\n console.log('bruRequestToJson error', 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 case 'ws-request':\n type = 'ws';\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 // Preserve special characters in custom request methods. Avoid _.lowerCase which strips symbols.\n method: String(_.get(json, 'request.method') ?? '').toLowerCase(),\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 } else if (type === 'ws') {\n bruJson.ws = {\n url: _.get(json, 'request.url'),\n auth: _.get(json, 'request.auth.mode', 'none'),\n body: _.get(json, 'request.body.mode', 'ws')\n };\n\n bruJson.body = _.get(json, 'request.body', {\n mode: 'ws',\n ws: _.get(json, 'request.body.ws', [\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 bruJson.examples = _.get(json, 'examples', []).map((e: any) => jsonExampleToBru(e));\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\n// New functions for example handling\nexport const bruExampleToJson = (data: string | any, parsed: boolean = false, parentType?: string, parentMethod?: string): any => {\n try {\n const json = parsed ? data : bruToJsonV2(data);\n\n // Use parent request's type and method if provided\n const requestType = parentType || _.get(json, 'meta.type', 'http');\n const requestMethod = parentMethod || _.get(json, 'http.method', 'GET');\n\n let transformedType = requestType;\n switch (requestType) {\n case 'http':\n transformedType = 'http-request';\n break;\n case 'graphql':\n transformedType = 'graphql-request';\n break;\n case 'grpc':\n transformedType = 'grpc-request';\n break;\n case 'ws':\n transformedType = 'ws-request';\n break;\n default:\n transformedType = 'http-request';\n }\n\n // Follow the same structure as the main request, but with missing fields for examples\n const transformedJson = {\n type: transformedType,\n name: _.get(json, 'name'),\n description: _.get(json, 'description', ''),\n // Examples don't have seq, settings, tags\n request: {\n method: _.get(json, 'request.method') || requestMethod,\n url: _.get(json, 'request.url'),\n headers: _.get(json, 'request.headers', []),\n body: _.get(json, 'request.body', {\n mode: 'none'\n }),\n // Examples don't have script, vars, assertions, tests, docs\n params: _.get(json, 'request.params', [])\n },\n response: {\n headers: _.get(json, 'response.headers', []).map((header: any) => ({\n name: header.name,\n value: header.value\n })),\n status: String(_.get(json, 'response.status', '200')),\n statusText: _.get(json, 'response.statusText', 'OK'),\n body: {\n type: _.get(json, 'response.body.type', 'json'),\n content: _.get(json, 'response.body.content', '')\n }\n }\n } as any;\n\n return transformedJson;\n } catch (error) {\n console.log('bruExampleToJson error', error);\n throw error;\n }\n};\n\nexport const jsonExampleToBru = (json: any) => {\n try {\n // Transform the JSON to match the same structure as main request, but with missing fields\n const exampleJson = {\n name: _.get(json, 'name'),\n description: _.get(json, 'description', ''),\n // Examples don't have seq, settings, tags\n request: {\n method: _.get(json, 'request.method'),\n url: _.get(json, 'request.url'),\n headers: _.get(json, 'request.headers', []),\n body: _.get(json, 'request.body', {}),\n // Examples don't have script, vars, assertions, tests, docs\n params: _.get(json, 'request.params', [])\n },\n response: _.get(json, 'response', {})\n };\n\n return exampleJson;\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","bruExampleToJson","parentType","parentMethod","bruToJsonV2","requestType","requestMethod","transformedType","description","method","url","body","mode","response","header","value","status","String","statusText","content","log","jsonExampleToBru","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","options","format","urlPath","default","tags","toUpperCase","assertions","examples","e","selectedMethodType","methodType","protoPath","grpc","ws","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","toLowerCase","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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"}
|
|
@@ -4,3 +4,16 @@ export declare const bruCollectionToJson: (data: string | any, parsed?: boolean)
|
|
|
4
4
|
export declare const jsonCollectionToBru: (json: any, isFolder?: boolean) => string;
|
|
5
5
|
export declare const bruEnvironmentToJson: (bru: string) => any;
|
|
6
6
|
export declare const jsonEnvironmentToBru: (json: any) => string;
|
|
7
|
+
export declare const bruExampleToJson: (data: string | any, parsed?: boolean, parentType?: string, parentMethod?: string) => any;
|
|
8
|
+
export declare const jsonExampleToBru: (json: any) => {
|
|
9
|
+
name: any;
|
|
10
|
+
description: any;
|
|
11
|
+
request: {
|
|
12
|
+
method: any;
|
|
13
|
+
url: any;
|
|
14
|
+
headers: any;
|
|
15
|
+
body: any;
|
|
16
|
+
params: any;
|
|
17
|
+
};
|
|
18
|
+
response: any;
|
|
19
|
+
};
|
|
@@ -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);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",""):String(a.get(s,"http.method")??"").toUpperCase(),url:a.get(s,
|
|
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";break;case"ws":o="ws-request"}const n=a.get(s,"meta.seq"),g={"grpc-request":"grpc.url","ws-request":"ws.url",default:"http.url"},d={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",""):String(a.get(s,"http.method")??"").toUpperCase(),url:a.get(s,g[o],a.get(s,g.default)),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","")},examples:a.get(s,"examples",[]).map((e=>p(e,!0,o,a.get(s,"http.method"))))};if("grpc-request"===o){const e=a.get(s,"grpc.methodType");e&&(d.request.methodType=e);const t=a.get(s,"grpc.protoPath");t&&(d.request.protoPath=t),d.request.auth.mode=a.get(s,"grpc.auth","none"),d.request.body=a.get(s,"body",{mode:"grpc",grpc:a.get(s,"body.grpc",[{name:"message 1",content:"{}"}])})}else"ws-request"===o?(d.request.auth.mode=a.get(s,"ws.auth","none"),d.request.body=a.get(s,"body",{mode:"ws",ws:a.get(s,"body.ws",[{name:"message 1",content:"{}"}])})):(d.request.params=a.get(s,"params",[]),d.request.auth.mode=a.get(s,"http.auth","none"),d.request.body.mode=a.get(s,"http.body","none"));const h=s?.auth?.oauth2?.grantType;if(h){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&&(d.request.auth.oauth2.additionalParameters=e)}return d}catch(e){throw console.log("bruRequestToJson error",e),e}},p=(e,t=!1,s,o)=>{try{const n=t?e:r.bruToJsonV2(e),u=s||a.get(n,"meta.type","http"),g=o||a.get(n,"http.method","GET");let p=u;switch(u){case"http":default:p="http-request";break;case"graphql":p="graphql-request";break;case"grpc":p="grpc-request";break;case"ws":p="ws-request"}return{type:p,name:a.get(n,"name"),description:a.get(n,"description",""),request:{method:a.get(n,"request.method")||g,url:a.get(n,"request.url"),headers:a.get(n,"request.headers",[]),body:a.get(n,"request.body",{mode:"none"}),params:a.get(n,"request.params",[])},response:{headers:a.get(n,"response.headers",[]).map((e=>({name:e.name,value:e.value}))),status:String(a.get(n,"response.status","200")),statusText:a.get(n,"response.statusText","OK"),body:{type:a.get(n,"response.body.type","json"),content:a.get(n,"response.body.content","")}}}}catch(e){throw console.log("bruExampleToJson error",e),e}},d=e=>{try{return{name:a.get(e,"name"),description:a.get(e,"description",""),request:{method:a.get(e,"request.method"),url:a.get(e,"request.url"),headers:a.get(e,"request.headers",[]),body:a.get(e,"request.body",{}),params:a.get(e,"request.params",[])},response:a.get(e,"response",{})}}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";break;case"ws-request":t="ws"}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:String(a.get(e,"request.method")??"").toLowerCase(),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:"{}"}])})}else"ws"===t&&(o.ws={url:a.get(e,"request.url"),auth:a.get(e,"request.auth.mode","none"),body:a.get(e,"request.body.mode","ws")},o.body=a.get(e,"request.body",{mode:"ws",ws:a.get(e,"request.body.ws",[{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",""),o.examples=a.get(e,"examples",[]).map((e=>d(e))),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/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 // Preserving special characters in custom methods. Using _.upperCase strips special characters.\n method:\n requestType === 'grpc-request' ? _.get(json, 'grpc.method', '') : String(_.get(json, 'http.method') ?? '').toUpperCase(),\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 // Preserve special characters in custom request methods. Avoid _.lowerCase which strips symbols.\n method: String(_.get(json, 'request.method') ?? '').toLowerCase(),\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","String","toUpperCase","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","toLowerCase","metadata","req","res","jsonToBruV2","jsonRequestToBru","postMessage"],"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 case 'ws':\n requestType = 'ws-request';\n break;\n default:\n requestType = 'http-request';\n }\n\n const sequence = _.get(json, 'meta.seq');\n const urlPath: Record<typeof requestType, string> = {\n 'grpc-request': 'grpc.url',\n 'ws-request': 'ws.url',\n 'default': 'http.url'\n };\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 // Preserving special characters in custom methods. Using _.upperCase strips special characters.\n method:\n requestType === 'grpc-request'\n ? _.get(json, 'grpc.method', '')\n : String(_.get(json, 'http.method') ?? '').toUpperCase(),\n url: _.get(json, urlPath[requestType], _.get(json, urlPath.default)),\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 examples: _.get(json, 'examples', []).map((e: any) => {\n return bruExampleToJson(e, true, requestType, _.get(json, 'http.method'));\n })\n } as any;\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 if (requestType === 'ws-request') {\n transformedJson.request.auth.mode = _.get(json, 'ws.auth', 'none');\n transformedJson.request.body = _.get(json, 'body', {\n mode: 'ws',\n ws: _.get(json, 'body.ws', [\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 return transformedJson;\n } catch (error) {\n console.log('bruRequestToJson error', 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 case 'ws-request':\n type = 'ws';\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 // Preserve special characters in custom request methods. Avoid _.lowerCase which strips symbols.\n method: String(_.get(json, 'request.method') ?? '').toLowerCase(),\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 } else if (type === 'ws') {\n bruJson.ws = {\n url: _.get(json, 'request.url'),\n auth: _.get(json, 'request.auth.mode', 'none'),\n body: _.get(json, 'request.body.mode', 'ws')\n };\n\n bruJson.body = _.get(json, 'request.body', {\n mode: 'ws',\n ws: _.get(json, 'request.body.ws', [\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 bruJson.examples = _.get(json, 'examples', []).map((e: any) => jsonExampleToBru(e));\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\n// New functions for example handling\nexport const bruExampleToJson = (data: string | any, parsed: boolean = false, parentType?: string, parentMethod?: string): any => {\n try {\n const json = parsed ? data : bruToJsonV2(data);\n\n // Use parent request's type and method if provided\n const requestType = parentType || _.get(json, 'meta.type', 'http');\n const requestMethod = parentMethod || _.get(json, 'http.method', 'GET');\n\n let transformedType = requestType;\n switch (requestType) {\n case 'http':\n transformedType = 'http-request';\n break;\n case 'graphql':\n transformedType = 'graphql-request';\n break;\n case 'grpc':\n transformedType = 'grpc-request';\n break;\n case 'ws':\n transformedType = 'ws-request';\n break;\n default:\n transformedType = 'http-request';\n }\n\n // Follow the same structure as the main request, but with missing fields for examples\n const transformedJson = {\n type: transformedType,\n name: _.get(json, 'name'),\n description: _.get(json, 'description', ''),\n // Examples don't have seq, settings, tags\n request: {\n method: _.get(json, 'request.method') || requestMethod,\n url: _.get(json, 'request.url'),\n headers: _.get(json, 'request.headers', []),\n body: _.get(json, 'request.body', {\n mode: 'none'\n }),\n // Examples don't have script, vars, assertions, tests, docs\n params: _.get(json, 'request.params', [])\n },\n response: {\n headers: _.get(json, 'response.headers', []).map((header: any) => ({\n name: header.name,\n value: header.value\n })),\n status: String(_.get(json, 'response.status', '200')),\n statusText: _.get(json, 'response.statusText', 'OK'),\n body: {\n type: _.get(json, 'response.body.type', 'json'),\n content: _.get(json, 'response.body.content', '')\n }\n }\n } as any;\n\n return transformedJson;\n } catch (error) {\n console.log('bruExampleToJson error', error);\n throw error;\n }\n};\n\nexport const jsonExampleToBru = (json: any) => {\n try {\n // Transform the JSON to match the same structure as main request, but with missing fields\n const exampleJson = {\n name: _.get(json, 'name'),\n description: _.get(json, 'description', ''),\n // Examples don't have seq, settings, tags\n request: {\n method: _.get(json, 'request.method'),\n url: _.get(json, 'request.url'),\n headers: _.get(json, 'request.headers', []),\n body: _.get(json, 'request.body', {}),\n // Examples don't have script, vars, assertions, tests, docs\n params: _.get(json, 'request.params', [])\n },\n response: _.get(json, 'response', {})\n };\n\n return exampleJson;\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","urlPath","default","transformedJson","name","seq","isNaN","Number","settings","tags","request","method","String","toUpperCase","url","headers","auth","body","script","vars","assertions","tests","docs","examples","e","bruExampleToJson","selectedMethodType","methodType","protoPath","mode","grpc","content","ws","params","hasOauth2GrantType","oauth2","additionalParameters","parameterTypes","error","console","getOauth2AdditionalParameters","Object","keys","log","parentType","parentMethod","requestMethod","transformedType","description","response","header","value","status","statusText","jsonExampleToBru","parentPort","on","async","message","taskType","result","Error","bruJson","meta","http","toLowerCase","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.5.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.31.0",
|
|
45
45
|
"lodash": "^4.17.21"
|
|
46
46
|
}
|
|
47
47
|
}
|