@usebruno/filestore 0.12.0 → 0.13.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/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/workers/worker-script.js +1 -1
- package/dist/cjs/workers/worker-script.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/workers/worker-script.js +1 -1
- package/dist/esm/workers/worker-script.js.map +1 -1
- package/dist/formats/bru/utils/redact-large-text-blocks.d.ts.map +1 -1
- package/dist/formats/yml/common/omit-headers.d.ts +3 -0
- package/dist/formats/yml/common/omit-headers.d.ts.map +1 -0
- package/dist/formats/yml/common/scripts.d.ts +3 -5
- package/dist/formats/yml/common/scripts.d.ts.map +1 -1
- package/dist/formats/yml/items/parseGrpcRequest.d.ts.map +1 -1
- package/dist/formats/yml/items/parseHttpRequest.d.ts.map +1 -1
- package/dist/formats/yml/items/stringifyGraphQLRequest.d.ts.map +1 -1
- package/dist/formats/yml/items/stringifyGrpcRequest.d.ts.map +1 -1
- package/dist/formats/yml/items/stringifyHttpRequest.d.ts.map +1 -1
- package/dist/formats/yml/items/stringifyWebsocketRequest.d.ts.map +1 -1
- package/dist/formats/yml/parseCollection.d.ts.map +1 -1
- package/dist/formats/yml/parseEnvironment.d.ts.map +1 -1
- package/dist/formats/yml/stringifyCollection.d.ts.map +1 -1
- package/dist/formats/yml/stringifyEnvironment.d.ts.map +1 -1
- package/dist/formats/yml/stringifyFolder.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/formats/bru/tests/redact-large-text-blocks.spec.js +60 -0
- package/src/formats/bru/utils/redact-large-text-blocks.ts +4 -0
- package/src/formats/yml/common/omit-headers.spec.ts +16 -0
- package/src/formats/yml/common/omit-headers.ts +12 -0
- package/src/formats/yml/common/scripts.spec.ts +155 -0
- package/src/formats/yml/common/scripts.ts +55 -29
- package/src/formats/yml/grpc-round-trip.spec.ts +110 -0
- package/src/formats/yml/items/parseGraphQLRequest.ts +2 -2
- package/src/formats/yml/items/parseGrpcRequest.ts +14 -6
- package/src/formats/yml/items/parseHttpRequest.ts +8 -2
- package/src/formats/yml/items/stringifyGraphQLRequest.ts +5 -9
- package/src/formats/yml/items/stringifyGrpcRequest.ts +2 -1
- package/src/formats/yml/items/stringifyHttpRequest.ts +11 -9
- package/src/formats/yml/items/stringifyWebsocketRequest.ts +3 -1
- package/src/formats/yml/parseCollection.ts +5 -9
- package/src/formats/yml/parseEnvironment.spec.ts +49 -0
- package/src/formats/yml/parseEnvironment.ts +6 -0
- package/src/formats/yml/script.spec.ts +159 -0
- package/src/formats/yml/stringifyCollection.ts +7 -10
- package/src/formats/yml/stringifyEnvironment.spec.ts +58 -0
- package/src/formats/yml/stringifyEnvironment.ts +6 -0
- package/src/formats/yml/stringifyFolder.ts +3 -1
- package/src/maxRedirects.spec.ts +144 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-script.js","sources":["../../../src/formats/bru/utils/oauth2-additional-params.ts","../../../src/utils/index.ts","../../../src/formats/bru/index.ts","../../../src/formats/yml/utils.ts","../../../src/formats/yml/common/auth-oauth2.ts","../../../src/formats/yml/common/auth.ts","../../../src/formats/yml/common/headers.ts","../../../src/formats/yml/common/params.ts","../../../src/formats/yml/common/body.ts","../../../src/formats/yml/common/datatype.ts","../../../src/formats/yml/common/variables.ts","../../../src/formats/yml/common/actions.ts","../../../src/formats/yml/common/scripts.ts","../../../src/formats/yml/common/assertions.ts","../../../src/formats/yml/items/parseHttpRequest.ts","../../../src/formats/yml/items/parseGraphQLRequest.ts","../../../src/formats/yml/items/parseGrpcRequest.ts","../../../src/formats/yml/parseItem.ts","../../../src/formats/yml/common/app.ts","../../../src/formats/yml/items/parseWebsocketRequest.ts","../../../src/formats/yml/items/parseScript.ts","../../../src/formats/yml/items/parseApp.ts","../../../src/constants.ts","../../../src/formats/yml/parseEnvironment.ts","../../../src/formats/yml/stringifyItem.ts","../../../src/formats/yml/items/stringifyHttpRequest.ts","../../../src/formats/yml/items/stringifyGraphQLRequest.ts","../../../src/formats/yml/items/stringifyGrpcRequest.ts","../../../src/formats/yml/items/stringifyWebsocketRequest.ts","../../../src/formats/yml/items/stringifyScript.ts","../../../src/formats/yml/items/stringifyApp.ts","../../../src/formats/yml/stringifyFolder.ts","../../../src/formats/yml/stringifyEnvironment.ts","../../../src/workers/worker-script.ts","../../../src/formats/yml/parseFolder.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 } catch (error) {\n console.error(error);\n console.error('Error while getting the oauth2 additional parameters!');\n }\n\n return additionalParameters;\n};\n","const { customAlphabet } = require('nanoid');\n\nexport const isString = (value: unknown): value is string => typeof value === 'string';\n\nexport const isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const isNonEmptyString = (value: unknown): value is string => isString(value) && value.trim().length > 0;\n\nexport const ensureString = (value: unknown, fallback: string = ''): string => {\n if (value === null || value === undefined) {\n return fallback;\n }\n if (typeof value === 'string') {\n return value;\n }\n return String(value);\n};\n\nexport const uuid = () => {\n // https://github.com/ai/nanoid/blob/main/url-alphabet/index.js\n const urlAlphabet = 'useandom26T198340PX75pxJACKVERYMINDBUSHWOLFGQZbfghjklqvwyzrict';\n const customNanoId = customAlphabet(urlAlphabet, 21);\n\n return customNanoId();\n};\n","import * as _ from 'lodash';\nimport {\n bruToJsonV2,\n jsonToBruV2,\n bruToEnvJsonV2,\n envJsonToBruV2,\n collectionBruToJson as _collectionBruToJson,\n jsonToCollectionBru as _jsonToCollectionBru\n} from '@usebruno/lang';\nimport { getOauth2AdditionalParameters } from './utils/oauth2-additional-params';\nimport { uuid } from '../../utils';\n\nexport const parseBruRequest = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : bruToJsonV2(data);\n\n if (_.get(json, 'meta.type') === 'app') {\n const seq = _.get(json, 'meta.seq');\n const tags = _.get(json, 'meta.tags', []);\n return {\n type: 'app',\n name: _.get(json, 'meta.name'),\n seq: !_.isNaN(seq) ? Number(seq) : 1,\n tags: Array.isArray(tags) ? tags : [],\n settings: _.get(json, 'settings', {}),\n app: { code: _.get(json, 'app.code', null) },\n request: null\n };\n }\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 tags = _.get(json, 'meta.tags', []);\n const urlPath: Record<typeof requestType, string> = {\n 'grpc-request': 'grpc.url',\n 'ws-request': 'ws.url',\n 'default': 'http.url'\n };\n\n const appData = _.get(json, 'app');\n const app = appData\n ? { code: _.get(appData, 'code', null), enabled: _.get(appData, 'enabled', false) === true }\n : null;\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 app,\n tags: Array.isArray(tags) ? 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('parseBruRequest error', error);\n throw error;\n }\n};\n\nexport const stringifyBruRequest = (json: any): string => {\n try {\n // Standalone app item — emit only meta + the app code block.\n if (_.get(json, 'type') === 'app') {\n const seq = _.get(json, 'seq');\n const bruJson: any = {\n meta: {\n name: _.get(json, 'name'),\n type: 'app',\n seq: !_.isNaN(seq) ? Number(seq) : 1,\n tags: _.get(json, 'tags', [])\n },\n settings: _.get(json, 'settings', {}),\n app: { code: _.get(json, 'app.code', '') }\n };\n return jsonToBruV2(bruJson);\n }\n\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 } else if (type === 'grpc') {\n // For gRPC, add gRPC-specific structure but maintain field names\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 app = _.get(json, 'app');\n if (app && (app.enabled === true || (app.code && app.code.length))) {\n bruJson.app = { code: app.code || null, enabled: app.enabled === true };\n }\n\n const bru = jsonToBruV2(bruJson);\n return bru;\n } catch (error) {\n throw error;\n }\n};\n\nexport const parseBruCollection = (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 stringifyBruCollection = (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 parseBruEnvironment = (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 // bruToEnvJsonV2 emits the nested `externalSecrets: { type, variables: [{ name,\n // <identifier>, enabled }] }`. The app/schema additionally expect a `uid` per variable.\n if (json?.externalSecrets && Array.isArray(json.externalSecrets.variables)) {\n json.externalSecrets.variables = json.externalSecrets.variables.map((v: any) => ({\n uid: uuid(),\n ...v\n }));\n }\n\n return json;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const stringifyBruEnvironment = (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 /**\n * Backward compatibility (pre-v3.0.2 - v3.2.0): Postman imports before PR #6876 stored status/statusText swapped\n * (code: \"OK\", text: \"202\" instead of code: 202, text: \"OK\"). Detect and swap back.\n * TODO(Sid / Shubh): Remove after v5 — all collections should be migrated by then.\n */\n let status = _.get(json, 'response.status', '200');\n let statusText = _.get(json, 'response.statusText', 'OK');\n if (isNaN(Number(status)) && !isNaN(Number(statusText))) {\n [status, statusText] = [statusText, status];\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: Number(status) || 200,\n statusText: 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 * as YAML from 'yaml';\n\n// Top-level keys that should have a blank line before them\nconst BLOCK_KEYS = ['info', 'http', 'graphql', 'grpc', 'websocket', 'mock', 'routes', 'runtime', 'settings', 'examples', 'docs', 'items', 'request'];\n\nexport const stringifyYml = (obj: any): string => {\n const yamlStr = YAML.stringify(obj, {\n lineWidth: 0,\n indent: 2,\n minContentWidth: 0,\n defaultStringType: 'PLAIN'\n });\n\n // Add blank lines before major blocks (only at the top level, not indented)\n const lines = yamlStr.split('\\n');\n const result: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Check if this is a top-level key (no leading whitespace) that should have a blank line\n if (i > 0 && !line.startsWith(' ') && !line.startsWith('\\t')) {\n const key = line.split(':')[0];\n if (BLOCK_KEYS.includes(key)) {\n // Add blank line before this block (if previous line isn't already blank)\n if (result.length > 0 && result[result.length - 1].trim() !== '') {\n result.push('');\n }\n }\n }\n result.push(line);\n }\n\n return result.join('\\n');\n};\n\nexport const parseYml = (ymlString: string): any => {\n return YAML.parse(ymlString);\n};\n","import type {\n AuthOAuth2,\n OAuth2AdditionalParameter,\n OAuth2AuthorizationCodeFlow,\n OAuth2ClientCredentials,\n OAuth2ClientCredentialsFlow,\n OAuth2ImplicitFlow,\n OAuth2PKCE,\n OAuth2ResourceOwner,\n OAuth2ResourceOwnerPasswordFlow,\n OAuth2Settings,\n OAuth2TokenConfig\n} from '@opencollection/types/common/auth';\nimport type {\n OAuth2 as BrunoOAuth2,\n OAuthAdditionalParameter as BrunoOAuthAdditionalParameter\n} from '@usebruno/schema-types/common/auth';\nimport { isString, isNonEmptyString } from '../../../utils';\n\nconst normalizeBoolean = (value?: boolean | null): boolean | undefined =>\n typeof value === 'boolean' ? value : undefined;\n\nconst mapSendIn = (sendIn?: string | null): OAuth2AdditionalParameter['placement'] | undefined => {\n if (!isString(sendIn)) {\n return undefined;\n }\n\n switch (sendIn.trim().toLowerCase()) {\n case 'headers':\n return 'header';\n case 'queryparams':\n return 'query';\n case 'body':\n return 'body';\n default:\n return undefined;\n }\n};\n\nconst mapAdditionalParameters = (params?: BrunoOAuthAdditionalParameter[] | null): OAuth2AdditionalParameter[] | undefined => {\n if (!Array.isArray(params) || params.length === 0) {\n return undefined;\n }\n\n const mapped = params\n .filter((param) => param && isNonEmptyString(param.name))\n .map((param) => {\n const placement = mapSendIn(param!.sendIn);\n if (!placement) {\n return undefined;\n }\n\n const mappedParam: OAuth2AdditionalParameter = {\n name: param!.name!.trim(),\n placement\n };\n\n isNonEmptyString(param!.value) && (mappedParam.value = param.value);\n\n return mappedParam;\n })\n .filter((param): param is OAuth2AdditionalParameter => Boolean(param));\n\n return mapped.length > 0 ? mapped : undefined;\n};\n\nconst buildClientCredentials = (oauth: BrunoOAuth2): OAuth2ClientCredentials | undefined => {\n const credentials: OAuth2ClientCredentials = {};\n\n isNonEmptyString(oauth.clientId) && (credentials.clientId = oauth.clientId);\n isNonEmptyString(oauth.clientSecret) && (credentials.clientSecret = oauth.clientSecret);\n isNonEmptyString(oauth.credentialsPlacement) && (credentials.placement = oauth.credentialsPlacement);\n\n return Object.keys(credentials).length > 0 ? credentials : undefined;\n};\n\nconst buildResourceOwner = (oauth: BrunoOAuth2): OAuth2ResourceOwner | undefined => {\n const resourceOwner: OAuth2ResourceOwner = {};\n\n isNonEmptyString(oauth.username) && (resourceOwner.username = oauth.username);\n isNonEmptyString(oauth.password) && (resourceOwner.password = oauth.password);\n\n return Object.keys(resourceOwner).length > 0 ? resourceOwner : undefined;\n};\n\nconst buildPkce = (pkce?: boolean | null): OAuth2PKCE | undefined => {\n if (pkce === null || pkce === undefined) {\n return undefined;\n }\n\n // If pkce is false, set disabled: true; if true, return empty object (enabled by default)\n return pkce ? {} : { disabled: true };\n};\n\nconst buildTokenConfig = (oauth: BrunoOAuth2): OAuth2TokenConfig | undefined => {\n const tokenConfig: OAuth2TokenConfig = {};\n\n isNonEmptyString(oauth.credentialsId) && (tokenConfig.id = oauth.credentialsId);\n\n if (!isNonEmptyString(oauth.tokenPlacement)) {\n // default to header\n tokenConfig.placement = { header: '' };\n }\n\n if (oauth.tokenPlacement === 'header') {\n tokenConfig.placement = {\n header: oauth.tokenHeaderPrefix as string\n };\n }\n\n if (oauth.tokenPlacement === 'url') {\n tokenConfig.placement = {\n query: oauth.tokenQueryKey as string\n };\n }\n\n tokenConfig.source = oauth.tokenSource || 'access_token';\n\n return Object.keys(tokenConfig).length > 0 ? tokenConfig : undefined;\n};\n\nconst buildSettings = (oauth: BrunoOAuth2): OAuth2Settings | undefined => {\n const autoFetchToken = normalizeBoolean(oauth.autoFetchToken);\n const autoRefreshToken = normalizeBoolean(oauth.autoRefreshToken);\n\n const settings: OAuth2Settings = {};\n if (autoFetchToken !== undefined) settings.autoFetchToken = autoFetchToken;\n if (autoRefreshToken !== undefined) settings.autoRefreshToken = autoRefreshToken;\n\n return Object.keys(settings).length > 0 ? settings : undefined;\n};\n\nconst buildClientCredentialsFlow = (oauth: BrunoOAuth2): OAuth2ClientCredentialsFlow => {\n const flow: OAuth2ClientCredentialsFlow = {\n type: 'oauth2',\n flow: 'client_credentials'\n };\n\n isNonEmptyString(oauth.accessTokenUrl) && (flow.accessTokenUrl = oauth.accessTokenUrl);\n isNonEmptyString(oauth.refreshTokenUrl) && (flow.refreshTokenUrl = oauth.refreshTokenUrl);\n\n const credentials = buildClientCredentials(oauth);\n if (credentials) flow.credentials = credentials;\n\n isNonEmptyString(oauth.scope) && (flow.scope = oauth.scope);\n\n const accessTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.token);\n const refreshTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.refresh);\n\n if (accessTokenRequest || refreshTokenRequest) {\n flow.additionalParameters = {};\n if (accessTokenRequest) {\n flow.additionalParameters.accessTokenRequest = accessTokenRequest;\n }\n if (refreshTokenRequest) {\n flow.additionalParameters.refreshTokenRequest = refreshTokenRequest;\n }\n }\n\n const tokenConfig = buildTokenConfig(oauth);\n if (tokenConfig) flow.tokenConfig = tokenConfig;\n\n const settings = buildSettings(oauth);\n if (settings) flow.settings = settings;\n\n return flow;\n};\n\nconst buildResourceOwnerPasswordFlow = (oauth: BrunoOAuth2): OAuth2ResourceOwnerPasswordFlow => {\n const flow: OAuth2ResourceOwnerPasswordFlow = {\n type: 'oauth2',\n flow: 'resource_owner_password_credentials'\n };\n\n isNonEmptyString(oauth.accessTokenUrl) && (flow.accessTokenUrl = oauth.accessTokenUrl);\n isNonEmptyString(oauth.refreshTokenUrl) && (flow.refreshTokenUrl = oauth.refreshTokenUrl);\n\n const credentials = buildClientCredentials(oauth);\n if (credentials) flow.credentials = credentials;\n\n const resourceOwner = buildResourceOwner(oauth);\n if (resourceOwner) flow.resourceOwner = resourceOwner;\n\n isNonEmptyString(oauth.scope) && (flow.scope = oauth.scope);\n\n const accessTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.token);\n const refreshTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.refresh);\n\n if (accessTokenRequest || refreshTokenRequest) {\n flow.additionalParameters = {};\n if (accessTokenRequest) {\n flow.additionalParameters.accessTokenRequest = accessTokenRequest;\n }\n if (refreshTokenRequest) {\n flow.additionalParameters.refreshTokenRequest = refreshTokenRequest;\n }\n }\n\n const tokenConfig = buildTokenConfig(oauth);\n if (tokenConfig) flow.tokenConfig = tokenConfig;\n\n const settings = buildSettings(oauth);\n if (settings) flow.settings = settings;\n\n return flow;\n};\n\nconst buildAuthorizationCodeFlow = (oauth: BrunoOAuth2): OAuth2AuthorizationCodeFlow => {\n const flow: OAuth2AuthorizationCodeFlow = {\n type: 'oauth2',\n flow: 'authorization_code'\n };\n\n isNonEmptyString(oauth.authorizationUrl) && (flow.authorizationUrl = oauth.authorizationUrl);\n isNonEmptyString(oauth.accessTokenUrl) && (flow.accessTokenUrl = oauth.accessTokenUrl);\n isNonEmptyString(oauth.refreshTokenUrl) && (flow.refreshTokenUrl = oauth.refreshTokenUrl);\n isNonEmptyString(oauth.callbackUrl) && (flow.callbackUrl = oauth.callbackUrl);\n\n const credentials = buildClientCredentials(oauth);\n if (credentials) flow.credentials = credentials;\n\n const authorizationRequest = mapAdditionalParameters(oauth.additionalParameters?.authorization);\n const accessTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.token);\n const refreshTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.refresh);\n\n if (authorizationRequest || accessTokenRequest || refreshTokenRequest) {\n flow.additionalParameters = {};\n if (authorizationRequest) {\n flow.additionalParameters.authorizationRequest = authorizationRequest;\n }\n if (accessTokenRequest) {\n flow.additionalParameters.accessTokenRequest = accessTokenRequest;\n }\n if (refreshTokenRequest) {\n flow.additionalParameters.refreshTokenRequest = refreshTokenRequest;\n }\n }\n\n isNonEmptyString(oauth.scope) && (flow.scope = oauth.scope);\n isNonEmptyString(oauth.state) && (flow.state = oauth.state);\n\n const pkce = buildPkce(oauth.pkce);\n if (pkce) flow.pkce = pkce;\n\n const tokenConfig = buildTokenConfig(oauth);\n if (tokenConfig) flow.tokenConfig = tokenConfig;\n\n const settings = buildSettings(oauth);\n if (settings) flow.settings = settings;\n\n return flow;\n};\n\nconst buildImplicitFlow = (oauth: BrunoOAuth2): OAuth2ImplicitFlow => {\n const flow: OAuth2ImplicitFlow = {\n type: 'oauth2',\n flow: 'implicit'\n };\n\n isNonEmptyString(oauth.authorizationUrl) && (flow.authorizationUrl = oauth.authorizationUrl);\n isNonEmptyString(oauth.callbackUrl) && (flow.callbackUrl = oauth.callbackUrl);\n isNonEmptyString(oauth.clientId) && (flow.credentials = { clientId: oauth.clientId });\n isNonEmptyString(oauth.scope) && (flow.scope = oauth.scope);\n isNonEmptyString(oauth.state) && (flow.state = oauth.state);\n\n const authorizationRequest = mapAdditionalParameters(oauth.additionalParameters?.authorization);\n if (authorizationRequest) {\n flow.additionalParameters = { authorizationRequest };\n }\n\n const tokenConfig = buildTokenConfig(oauth);\n if (tokenConfig) flow.tokenConfig = tokenConfig;\n\n const settings = buildSettings(oauth);\n if (settings) flow.settings = settings;\n\n return flow;\n};\n\nexport const toOpenCollectionOAuth2 = (oauth?: BrunoOAuth2 | null): AuthOAuth2 | undefined => {\n if (!oauth) {\n return undefined;\n }\n\n switch (oauth.grantType) {\n case 'client_credentials':\n return buildClientCredentialsFlow(oauth);\n case 'password':\n return buildResourceOwnerPasswordFlow(oauth);\n case 'authorization_code':\n return buildAuthorizationCodeFlow(oauth);\n case 'implicit':\n return buildImplicitFlow(oauth);\n default:\n console.warn(`toOpenCollectionOAuth2: Unsupported OAuth2 grant type \"${oauth.grantType}\".`);\n return undefined;\n }\n};\n\nconst reversePlacementMapping = (placement?: OAuth2AdditionalParameter['placement']): 'headers' | 'queryparams' | 'body' | null => {\n if (!placement) {\n return null;\n }\n\n switch (placement) {\n case 'header':\n return 'headers';\n case 'query':\n return 'queryparams';\n case 'body':\n return 'body';\n default:\n return null;\n }\n};\n\nconst reverseAdditionalParameters = (params?: OAuth2AdditionalParameter[]): BrunoOAuthAdditionalParameter[] | null => {\n if (!Array.isArray(params) || params.length === 0) {\n return null;\n }\n\n const mapped = params.map((param): BrunoOAuthAdditionalParameter => {\n const sendIn = reversePlacementMapping(param.placement);\n\n return {\n name: param.name || null,\n value: param.value || null,\n sendIn: sendIn || 'headers',\n enabled: true\n };\n });\n\n return mapped.length > 0 ? mapped : null;\n};\n\nexport const toBrunoOAuth2 = (oauth: AuthOAuth2 | null | undefined): BrunoOAuth2 | null => {\n if (!oauth) {\n return null;\n }\n\n const brunoOAuth: BrunoOAuth2 = {\n grantType: 'authorization_code',\n username: null,\n password: null,\n callbackUrl: null,\n authorizationUrl: null,\n accessTokenUrl: null,\n clientId: null,\n clientSecret: null,\n scope: null,\n state: null,\n pkce: false, // Default to false for all grant types\n credentialsPlacement: null,\n credentialsId: null,\n tokenPlacement: null,\n tokenHeaderPrefix: null,\n tokenQueryKey: null,\n tokenSource: 'access_token',\n refreshTokenUrl: null,\n autoRefreshToken: false, // Default to false\n autoFetchToken: true, // Default to true\n additionalParameters: null\n };\n\n switch (oauth.flow) {\n case 'client_credentials':\n brunoOAuth.grantType = 'client_credentials';\n if (oauth.accessTokenUrl) brunoOAuth.accessTokenUrl = oauth.accessTokenUrl;\n if (oauth.refreshTokenUrl) brunoOAuth.refreshTokenUrl = oauth.refreshTokenUrl;\n if (oauth.credentials?.clientId) brunoOAuth.clientId = oauth.credentials.clientId;\n if (oauth.credentials?.clientSecret) brunoOAuth.clientSecret = oauth.credentials.clientSecret;\n if (oauth.credentials?.placement) brunoOAuth.credentialsPlacement = oauth.credentials.placement;\n if (oauth.scope) brunoOAuth.scope = oauth.scope;\n\n // token config\n if (oauth.tokenConfig?.id) brunoOAuth.credentialsId = oauth.tokenConfig.id;\n if (oauth.tokenConfig?.source) brunoOAuth.tokenSource = oauth.tokenConfig.source || 'access_token';\n if (oauth.tokenConfig?.placement) {\n if ('header' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'header';\n brunoOAuth.tokenHeaderPrefix = oauth.tokenConfig.placement.header || '';\n } else if ('query' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'url';\n brunoOAuth.tokenQueryKey = oauth.tokenConfig.placement.query || '';\n }\n }\n\n // additional parameters\n if (oauth.additionalParameters) {\n const tempParams: Record<string, any> = {};\n if (oauth.additionalParameters.accessTokenRequest) {\n const tokenParams = reverseAdditionalParameters(oauth.additionalParameters.accessTokenRequest);\n if (tokenParams) {\n tempParams.token = tokenParams;\n }\n }\n if (oauth.additionalParameters.refreshTokenRequest) {\n const refreshParams = reverseAdditionalParameters(oauth.additionalParameters.refreshTokenRequest);\n if (refreshParams) {\n tempParams.refresh = refreshParams;\n }\n }\n // Only set additionalParameters if there are actual parameters\n if (Object.keys(tempParams).length > 0) {\n brunoOAuth.additionalParameters = tempParams;\n }\n }\n break;\n\n case 'resource_owner_password_credentials':\n brunoOAuth.grantType = 'password';\n if (oauth.accessTokenUrl) brunoOAuth.accessTokenUrl = oauth.accessTokenUrl;\n if (oauth.refreshTokenUrl) brunoOAuth.refreshTokenUrl = oauth.refreshTokenUrl;\n if (oauth.credentials?.clientId) brunoOAuth.clientId = oauth.credentials.clientId;\n if (oauth.credentials?.clientSecret) brunoOAuth.clientSecret = oauth.credentials.clientSecret;\n if (oauth.credentials?.placement) brunoOAuth.credentialsPlacement = oauth.credentials.placement;\n if (oauth.resourceOwner?.username) brunoOAuth.username = oauth.resourceOwner.username;\n if (oauth.resourceOwner?.password) brunoOAuth.password = oauth.resourceOwner.password;\n if (oauth.scope) brunoOAuth.scope = oauth.scope;\n\n // token config\n if (oauth.tokenConfig?.id) brunoOAuth.credentialsId = oauth.tokenConfig.id;\n if (oauth.tokenConfig?.source) brunoOAuth.tokenSource = oauth.tokenConfig.source || 'access_token';\n if (oauth.tokenConfig?.placement) {\n if ('header' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'header';\n brunoOAuth.tokenHeaderPrefix = oauth.tokenConfig.placement.header || '';\n } else if ('query' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'url';\n brunoOAuth.tokenQueryKey = oauth.tokenConfig.placement.query || '';\n }\n }\n\n // additional parameters\n if (oauth.additionalParameters) {\n const tempParams: Record<string, any> = {};\n if (oauth.additionalParameters.accessTokenRequest) {\n const tokenParams = reverseAdditionalParameters(oauth.additionalParameters.accessTokenRequest);\n if (tokenParams) {\n tempParams.token = tokenParams;\n }\n }\n if (oauth.additionalParameters.refreshTokenRequest) {\n const refreshParams = reverseAdditionalParameters(oauth.additionalParameters.refreshTokenRequest);\n if (refreshParams) {\n tempParams.refresh = refreshParams;\n }\n }\n // Only set additionalParameters if there are actual parameters\n if (Object.keys(tempParams).length > 0) {\n brunoOAuth.additionalParameters = tempParams;\n }\n }\n break;\n\n case 'authorization_code':\n brunoOAuth.grantType = 'authorization_code';\n if (oauth.authorizationUrl) brunoOAuth.authorizationUrl = oauth.authorizationUrl;\n if (oauth.accessTokenUrl) brunoOAuth.accessTokenUrl = oauth.accessTokenUrl;\n if (oauth.refreshTokenUrl) brunoOAuth.refreshTokenUrl = oauth.refreshTokenUrl;\n if (oauth.callbackUrl) brunoOAuth.callbackUrl = oauth.callbackUrl;\n if (oauth.credentials?.clientId) brunoOAuth.clientId = oauth.credentials.clientId;\n if (oauth.credentials?.clientSecret) brunoOAuth.clientSecret = oauth.credentials.clientSecret;\n if (oauth.credentials?.placement) brunoOAuth.credentialsPlacement = oauth.credentials.placement;\n if (oauth.scope) brunoOAuth.scope = oauth.scope;\n if (oauth.state) brunoOAuth.state = oauth.state;\n\n // token config\n if (oauth.tokenConfig?.id) brunoOAuth.credentialsId = oauth.tokenConfig.id;\n if (oauth.tokenConfig?.source) brunoOAuth.tokenSource = oauth.tokenConfig.source || 'access_token';\n if (oauth.tokenConfig?.placement) {\n if ('header' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'header';\n brunoOAuth.tokenHeaderPrefix = oauth.tokenConfig.placement.header || '';\n } else if ('query' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'url';\n brunoOAuth.tokenQueryKey = oauth.tokenConfig.placement.query || '';\n }\n }\n\n // additional parameters\n if (oauth.additionalParameters) {\n const tempParams: Record<string, any> = {};\n if (oauth.additionalParameters.authorizationRequest) {\n const authParams = reverseAdditionalParameters(oauth.additionalParameters.authorizationRequest);\n if (authParams) {\n tempParams.authorization = authParams;\n }\n }\n if (oauth.additionalParameters.accessTokenRequest) {\n const tokenParams = reverseAdditionalParameters(oauth.additionalParameters.accessTokenRequest);\n if (tokenParams) {\n tempParams.token = tokenParams;\n }\n }\n if (oauth.additionalParameters.refreshTokenRequest) {\n const refreshParams = reverseAdditionalParameters(oauth.additionalParameters.refreshTokenRequest);\n if (refreshParams) {\n tempParams.refresh = refreshParams;\n }\n }\n // Only set additionalParameters if there are actual parameters\n if (Object.keys(tempParams).length > 0) {\n brunoOAuth.additionalParameters = tempParams;\n }\n }\n break;\n\n case 'implicit':\n brunoOAuth.grantType = 'implicit';\n if (oauth.authorizationUrl) brunoOAuth.authorizationUrl = oauth.authorizationUrl;\n if (oauth.callbackUrl) brunoOAuth.callbackUrl = oauth.callbackUrl;\n if (oauth.credentials?.clientId) brunoOAuth.clientId = oauth.credentials.clientId;\n if (oauth.scope) brunoOAuth.scope = oauth.scope;\n if (oauth.state) brunoOAuth.state = oauth.state;\n\n // token config\n if (oauth.tokenConfig?.id) brunoOAuth.credentialsId = oauth.tokenConfig.id;\n if (oauth.tokenConfig?.source) brunoOAuth.tokenSource = oauth.tokenConfig.source || 'access_token';\n if (oauth.tokenConfig?.placement) {\n if ('header' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'header';\n brunoOAuth.tokenHeaderPrefix = oauth.tokenConfig.placement.header || '';\n } else if ('query' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'url';\n brunoOAuth.tokenQueryKey = oauth.tokenConfig.placement.query || '';\n }\n }\n\n // additional parameters\n if (oauth.additionalParameters) {\n const tempParams: Record<string, any> = {};\n if (oauth.additionalParameters.authorizationRequest) {\n const authParams = reverseAdditionalParameters(oauth.additionalParameters.authorizationRequest);\n if (authParams) {\n tempParams.authorization = authParams;\n }\n }\n // Only set additionalParameters if there are actual parameters\n if (Object.keys(tempParams).length > 0) {\n brunoOAuth.additionalParameters = tempParams;\n }\n }\n break;\n\n default:\n return null;\n }\n\n if (oauth.settings?.autoFetchToken !== undefined) {\n brunoOAuth.autoFetchToken = oauth.settings.autoFetchToken;\n }\n if (oauth.settings?.autoRefreshToken !== undefined) {\n brunoOAuth.autoRefreshToken = oauth.settings.autoRefreshToken;\n }\n\n if (brunoOAuth.grantType === 'authorization_code' && oauth.flow === 'authorization_code') {\n const authCodeFlow = oauth as OAuth2AuthorizationCodeFlow;\n if (authCodeFlow.pkce !== undefined) {\n // If pkce.disabled is true, set pkce to false; otherwise set to true\n brunoOAuth.pkce = !authCodeFlow.pkce.disabled;\n }\n }\n\n if (brunoOAuth.additionalParameters === null) {\n delete brunoOAuth.additionalParameters;\n }\n\n return brunoOAuth;\n};\n","import type {\n Auth,\n AuthApiKey,\n AuthAwsV4,\n AuthBasic,\n AuthBearer,\n AuthDigest,\n AuthNTLM,\n AuthOAuth1,\n AuthWsse\n} from '@opencollection/types/common/auth';\nimport type { Auth as BrunoAuth, AuthOauth1 as BrunoAuthOauth1 } from '@usebruno/schema-types/common/auth';\nimport { isString } from '../../../utils';\nimport { toOpenCollectionOAuth2, toBrunoOAuth2 } from './auth-oauth2';\n\n// EdgeGrid is a Bruno-specific auth mode that is not part of the OpenCollection spec,\n// so its shape is defined locally and serialized using the same field names as Bruno.\ninterface AkamaiEdgeGridAuthValues {\n type: 'akamai-edgegrid';\n accessToken?: string;\n clientToken?: string;\n clientSecret?: string;\n baseURL?: string | null;\n nonce?: string | null;\n timestamp?: string | null;\n headersToSign?: string | null;\n maxBodySize?: number | null;\n}\n\nconst buildAwsV4Auth = (config?: BrunoAuth['awsv4']): AuthAwsV4 => {\n const auth: AuthAwsV4 = { type: 'awsv4' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.accessKeyId)) auth.accessKeyId = config.accessKeyId;\n if (isString(config.secretAccessKey)) auth.secretAccessKey = config.secretAccessKey;\n if (isString(config.sessionToken)) auth.sessionToken = config.sessionToken;\n if (isString(config.service)) auth.service = config.service;\n if (isString(config.region)) auth.region = config.region;\n if (isString(config.profileName)) auth.profileName = config.profileName;\n\n return auth;\n};\n\nconst buildBasicAuth = (config?: BrunoAuth['basic']): AuthBasic => {\n const auth: AuthBasic = { type: 'basic' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.username)) auth.username = config.username;\n if (isString(config.password)) auth.password = config.password;\n\n return auth;\n};\n\nconst buildBearerAuth = (config?: BrunoAuth['bearer']): AuthBearer => {\n const auth: AuthBearer = { type: 'bearer' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.token)) auth.token = config.token;\n\n return auth;\n};\n\nconst buildDigestAuth = (config?: BrunoAuth['digest']): AuthDigest => {\n const auth: AuthDigest = { type: 'digest' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.username)) auth.username = config.username;\n if (isString(config.password)) auth.password = config.password;\n\n return auth;\n};\n\nconst buildNtlmAuth = (config?: BrunoAuth['ntlm']): AuthNTLM => {\n const auth: AuthNTLM = { type: 'ntlm' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.username)) auth.username = config.username;\n if (isString(config.password)) auth.password = config.password;\n if (isString(config.domain)) auth.domain = config.domain;\n\n return auth;\n};\n\nconst buildWsseAuth = (config?: BrunoAuth['wsse']): AuthWsse => {\n const auth: AuthWsse = { type: 'wsse' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.username)) auth.username = config.username;\n if (isString(config.password)) auth.password = config.password;\n\n return auth;\n};\n\nconst buildApiKeyAuth = (config?: BrunoAuth['apikey']): AuthApiKey => {\n const auth: AuthApiKey = { type: 'apikey' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.key)) auth.key = config.key;\n if (isString(config.value)) auth.value = config.value;\n\n if (isString(config.placement)) {\n if (config.placement === 'header') {\n auth.placement = 'header';\n } else if (config.placement === 'queryparams') {\n auth.placement = 'query';\n }\n }\n\n return auth;\n};\n\nconst buildEdgeGridAuth = (config?: BrunoAuth['akamaiEdgegrid']): AkamaiEdgeGridAuthValues => {\n const auth: AkamaiEdgeGridAuthValues = { type: 'akamai-edgegrid' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.accessToken)) auth.accessToken = config.accessToken;\n if (isString(config.clientToken)) auth.clientToken = config.clientToken;\n if (isString(config.clientSecret)) auth.clientSecret = config.clientSecret;\n if (isString(config.nonce)) auth.nonce = config.nonce;\n if (isString(config.timestamp)) auth.timestamp = config.timestamp;\n if (isString(config.baseURL)) auth.baseURL = config.baseURL;\n if (isString(config.headersToSign)) auth.headersToSign = config.headersToSign;\n if (typeof config.maxBodySize === 'number') auth.maxBodySize = config.maxBodySize;\n\n return auth;\n};\n\nconst buildOAuth1Auth = (config?: BrunoAuth['oauth1']): AuthOAuth1 => {\n const auth: AuthOAuth1 = { type: 'oauth1' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.consumerKey)) auth.consumerKey = config.consumerKey;\n if (isString(config.consumerSecret)) auth.consumerSecret = config.consumerSecret;\n if (isString(config.accessToken)) auth.accessToken = config.accessToken;\n if (isString(config.accessTokenSecret)) auth.accessTokenSecret = config.accessTokenSecret;\n if (isString(config.callbackUrl)) auth.callbackUrl = config.callbackUrl;\n if (isString(config.verifier)) auth.verifier = config.verifier;\n if (isString(config.signatureMethod)) auth.signatureMethod = config.signatureMethod;\n if (isString(config.privateKey)) {\n auth.privateKey = config.privateKeyType === 'file'\n ? { type: 'file' as const, value: config.privateKey }\n : { type: 'text' as const, value: config.privateKey };\n }\n if (isString(config.timestamp)) auth.timestamp = config.timestamp;\n if (isString(config.nonce)) auth.nonce = config.nonce;\n if (isString(config.version)) auth.version = config.version;\n if (isString(config.realm)) auth.realm = config.realm;\n if (isString(config.placement)) auth.placement = config.placement as AuthOAuth1['placement'];\n if (typeof config.includeBodyHash === 'boolean') auth.includeBodyHash = config.includeBodyHash;\n\n return auth;\n};\n\nexport const toOpenCollectionAuth = (auth?: BrunoAuth | null): Auth | undefined => {\n if (!auth || auth.mode === 'none') {\n return undefined;\n }\n\n if (auth.mode === 'inherit') {\n return 'inherit';\n }\n\n switch (auth.mode) {\n case 'awsv4':\n return buildAwsV4Auth(auth.awsv4);\n case 'basic':\n return buildBasicAuth(auth.basic);\n case 'bearer':\n return buildBearerAuth(auth.bearer);\n case 'digest':\n return buildDigestAuth(auth.digest);\n case 'ntlm':\n return buildNtlmAuth(auth.ntlm);\n case 'wsse':\n return buildWsseAuth(auth.wsse);\n case 'apikey':\n return buildApiKeyAuth(auth.apikey);\n case 'oauth1':\n return buildOAuth1Auth(auth.oauth1);\n case 'oauth2':\n return toOpenCollectionOAuth2(auth.oauth2);\n case 'akamai-edgegrid':\n return buildEdgeGridAuth(auth.akamaiEdgegrid) as unknown as Auth;\n default:\n console.warn(`toOpenCollectionAuth failed: Unsupported auth mode \"${auth.mode}\".`);\n return undefined;\n }\n};\n\nexport const toBrunoAuth = (auth: Auth | null | undefined): BrunoAuth | null => {\n const brunoAuth: BrunoAuth = {\n mode: 'none',\n awsv4: null,\n basic: null,\n bearer: null,\n digest: null,\n ntlm: null,\n oauth2: null,\n wsse: null,\n apikey: null,\n akamaiEdgegrid: null\n };\n\n if (!auth) {\n return brunoAuth;\n }\n\n if (auth === 'inherit') {\n brunoAuth.mode = 'inherit';\n return brunoAuth;\n }\n\n if ((auth as unknown as AkamaiEdgeGridAuthValues).type === 'akamai-edgegrid') {\n const edgegrid = auth as unknown as AkamaiEdgeGridAuthValues;\n brunoAuth.mode = 'akamai-edgegrid';\n brunoAuth.akamaiEdgegrid = {\n accessToken: edgegrid.accessToken || '',\n clientToken: edgegrid.clientToken || '',\n clientSecret: edgegrid.clientSecret || '',\n nonce: edgegrid.nonce || '',\n timestamp: edgegrid.timestamp || '',\n baseURL: edgegrid.baseURL || '',\n headersToSign: edgegrid.headersToSign || '',\n maxBodySize: typeof edgegrid.maxBodySize === 'number' ? edgegrid.maxBodySize : null\n };\n return brunoAuth;\n }\n\n switch (auth.type) {\n case 'awsv4':\n brunoAuth.mode = 'awsv4';\n brunoAuth.awsv4 = {\n accessKeyId: auth.accessKeyId || null,\n secretAccessKey: auth.secretAccessKey || null,\n sessionToken: auth.sessionToken || null,\n service: auth.service || null,\n region: auth.region || null,\n profileName: auth.profileName || null\n };\n break;\n\n case 'basic':\n brunoAuth.mode = 'basic';\n brunoAuth.basic = {\n username: auth.username || null,\n password: auth.password || null\n };\n break;\n\n case 'bearer':\n brunoAuth.mode = 'bearer';\n brunoAuth.bearer = {\n token: auth.token || ''\n };\n break;\n\n case 'digest':\n brunoAuth.mode = 'digest';\n brunoAuth.digest = {\n username: auth.username || null,\n password: auth.password || null\n };\n break;\n\n case 'ntlm':\n brunoAuth.mode = 'ntlm';\n brunoAuth.ntlm = {\n username: auth.username || null,\n password: auth.password || null,\n domain: auth.domain || null\n };\n break;\n\n case 'wsse':\n brunoAuth.mode = 'wsse';\n brunoAuth.wsse = {\n username: auth.username || null,\n password: auth.password || null\n };\n break;\n\n case 'apikey':\n brunoAuth.mode = 'apikey';\n brunoAuth.apikey = {\n key: auth.key || null,\n value: auth.value || null,\n placement: auth.placement === 'query' ? 'queryparams' : (auth.placement === 'header' ? 'header' : null)\n };\n break;\n\n case 'oauth1':\n brunoAuth.mode = 'oauth1';\n brunoAuth.oauth1 = {\n consumerKey: auth.consumerKey || null,\n consumerSecret: auth.consumerSecret || null,\n accessToken: auth.accessToken || null,\n accessTokenSecret: auth.accessTokenSecret || null,\n callbackUrl: auth.callbackUrl || null,\n verifier: auth.verifier || null,\n signatureMethod: (auth.signatureMethod as BrunoAuthOauth1['signatureMethod']) || 'HMAC-SHA1',\n privateKey: (typeof auth.privateKey === 'object' && auth.privateKey ? auth.privateKey.value : auth.privateKey) || null,\n privateKeyType: (typeof auth.privateKey === 'object' && auth.privateKey ? auth.privateKey.type : 'text') as BrunoAuthOauth1['privateKeyType'],\n timestamp: auth.timestamp || null,\n nonce: auth.nonce || null,\n version: auth.version || '1.0',\n realm: auth.realm || null,\n placement: (auth.placement as BrunoAuthOauth1['placement']) || 'header',\n includeBodyHash: auth.includeBodyHash || false\n };\n break;\n\n case 'oauth2':\n brunoAuth.mode = 'oauth2';\n brunoAuth.oauth2 = toBrunoOAuth2(auth);\n break;\n\n default:\n console.warn('toBrunoAuth failed: Unsupported auth type');\n break;\n }\n\n return brunoAuth;\n};\n","import type { FolderRequest as BrunoFolderRequest } from '@usebruno/schema-types/collection/folder';\nimport type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport type { HttpRequestHeader, HttpResponseHeader } from '@opencollection/types/requests/http';\nimport { uuid, ensureString } from '../../../utils';\n\nexport const toOpenCollectionHttpHeaders = (headers: BrunoFolderRequest['headers']): HttpRequestHeader[] | undefined => {\n if (!headers?.length) {\n return undefined;\n }\n\n const ocHeaders = headers.map((header: BrunoKeyValue): HttpRequestHeader => {\n const httpHeader: HttpRequestHeader = {\n name: header.name || '',\n value: header.value || ''\n };\n if (header?.description?.trim().length) {\n httpHeader.description = header.description;\n }\n if (header.enabled === false) {\n httpHeader.disabled = true;\n }\n return httpHeader;\n });\n\n return ocHeaders.length ? ocHeaders : undefined;\n};\n\nexport const toOpenCollectionResponseHeaders = (headers: BrunoFolderRequest['headers']): HttpResponseHeader[] | undefined => {\n if (!headers?.length) {\n return undefined;\n }\n\n const ocHeaders = headers.map((header: BrunoKeyValue): HttpResponseHeader => ({\n name: header.name || '',\n value: header.value || ''\n }));\n\n return ocHeaders.length ? ocHeaders : undefined;\n};\n\nexport const toBrunoHttpHeaders = (headers: HttpRequestHeader[] | HttpResponseHeader[] | null | undefined): BrunoKeyValue[] | undefined => {\n if (!headers?.length) {\n return undefined;\n }\n\n const brunoHeaders = headers.map((header): BrunoKeyValue => {\n const brunoHeader: BrunoKeyValue = {\n uid: uuid(),\n name: ensureString(header.name),\n value: ensureString(header.value),\n enabled: ('disabled' in header) ? header.disabled !== true : true\n };\n\n if ('description' in header && header.description) {\n brunoHeader.description = typeof header.description === 'string' ? header.description : (header.description as any)?.content || '';\n }\n\n return brunoHeader;\n });\n\n return brunoHeaders.length ? brunoHeaders : undefined;\n};\n","import type { HttpRequestParam as BrunoHttpRequestParam } from '@usebruno/schema-types/requests/http';\nimport type { HttpRequestParam } from '@opencollection/types/requests/http';\nimport { uuid, ensureString } from '../../../utils';\n\nexport const toOpenCollectionParams = (params: BrunoHttpRequestParam[] | null | undefined): HttpRequestParam[] | undefined => {\n if (!params?.length) {\n return undefined;\n }\n\n const ocParams = params.map((param: BrunoHttpRequestParam): HttpRequestParam => {\n const ocParam: HttpRequestParam = {\n name: param.name || '',\n value: param.value || '',\n type: param.type\n };\n\n if (param?.description?.trim().length) {\n ocParam.description = param.description;\n }\n\n if (param.enabled === false) {\n ocParam.disabled = true;\n }\n\n return ocParam;\n });\n\n return ocParams.length ? ocParams : undefined;\n};\n\nexport const toBrunoParams = (params: HttpRequestParam[] | null | undefined): BrunoHttpRequestParam[] | undefined => {\n if (!params?.length) {\n return undefined;\n }\n\n const brunoParams = params.map((param: HttpRequestParam): BrunoHttpRequestParam => {\n const brunoParam: BrunoHttpRequestParam = {\n uid: uuid(),\n name: ensureString(param.name),\n value: ensureString(param.value),\n type: param.type,\n enabled: param.disabled !== true\n };\n\n if (param.description) {\n if (typeof param.description === 'string' && param.description.trim().length) {\n brunoParam.description = param.description;\n } else if (typeof param.description === 'object' && param.description.content?.trim().length) {\n brunoParam.description = param.description.content;\n }\n }\n\n return brunoParam;\n });\n\n return brunoParams.length ? brunoParams : undefined;\n};\n","import type { HttpRequestBody as BrunoHttpRequestBody } from '@usebruno/schema-types/requests/http';\nimport type {\n HttpRequestBody,\n RawBody,\n FormUrlEncodedBody,\n FormUrlEncodedEntry,\n MultipartFormBody,\n MultipartFormEntry,\n FileBody,\n FileBodyVariant\n} from '@opencollection/types/requests/http';\nimport type { FileEntry as BrunoFileEntry } from '@usebruno/schema-types/common/file';\n\nimport type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport { uuid, ensureString } from '../../../utils';\n\nexport const toOpenCollectionBody = (body: BrunoHttpRequestBody | null | undefined): HttpRequestBody | undefined => {\n if (!body) {\n return undefined;\n }\n\n switch (body.mode) {\n case 'none':\n return undefined;\n\n case 'json':\n const rawBody: RawBody = {\n type: 'json',\n data: body.json || ''\n };\n return rawBody;\n\n case 'text':\n const textBody: RawBody = {\n type: 'text',\n data: body.text || ''\n };\n return textBody;\n\n case 'xml':\n const xmlBody: RawBody = {\n type: 'xml',\n data: body.xml || ''\n };\n return xmlBody;\n\n case 'sparql':\n const sparqlBody: RawBody = {\n type: 'sparql',\n data: body.sparql || ''\n };\n return sparqlBody;\n\n case 'formUrlEncoded':\n const formEntries: FormUrlEncodedEntry[] = body.formUrlEncoded?.map((entry: BrunoKeyValue): FormUrlEncodedEntry => {\n const formEntry: FormUrlEncodedEntry = {\n name: entry.name || '',\n value: entry.value || ''\n };\n\n if (entry?.description?.trim().length) {\n formEntry.description = entry.description;\n }\n\n if (entry.enabled === false) {\n formEntry.disabled = true;\n }\n\n return formEntry;\n }) || [];\n\n const formBody: FormUrlEncodedBody = {\n type: 'form-urlencoded',\n ...(formEntries.length > 0 && { data: formEntries })\n } as FormUrlEncodedBody;\n return formBody;\n\n case 'multipartForm':\n const multipartEntries: MultipartFormEntry[] = body.multipartForm?.map((entry): MultipartFormEntry => {\n const multipartEntry: MultipartFormEntry = {\n name: entry.name || '',\n type: entry.type,\n value: entry.value || (entry.type === 'file' ? [] : '')\n };\n\n if (entry?.contentType?.trim().length) {\n multipartEntry.contentType = entry.contentType;\n }\n\n if (entry?.description?.trim().length) {\n multipartEntry.description = entry.description;\n }\n\n if (entry.enabled === false) {\n multipartEntry.disabled = true;\n }\n\n return multipartEntry;\n }) || [];\n\n const multipartBody: MultipartFormBody = {\n type: 'multipart-form',\n ...(multipartEntries.length > 0 && { data: multipartEntries })\n } as MultipartFormBody;\n return multipartBody;\n\n case 'file':\n const fileEntries: FileBodyVariant[] = body.file?.map((file): FileBodyVariant => {\n const fileEntry: FileBodyVariant = {\n filePath: file.filePath || '',\n contentType: file.contentType || '',\n selected: file.selected ?? false\n };\n\n if (file?.description?.trim().length) {\n fileEntry.description = file.description;\n }\n\n return fileEntry;\n }) || [];\n\n const fileBody: FileBody = {\n type: 'file',\n ...(fileEntries.length > 0 && { data: fileEntries })\n } as FileBody;\n return fileBody;\n\n case 'graphql':\n // GraphQL body is handled separately in GraphQL request stringify\n return undefined;\n\n default:\n return undefined;\n }\n};\n\nexport const toBrunoBody = (body: HttpRequestBody | null | undefined): BrunoHttpRequestBody | undefined => {\n if (!body) {\n return {\n mode: 'none',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: [],\n multipartForm: [],\n graphql: null,\n file: []\n };\n }\n\n const brunoBody: BrunoHttpRequestBody = {\n mode: 'none',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: [],\n multipartForm: [],\n graphql: null,\n file: []\n };\n\n switch (body.type) {\n case 'json':\n brunoBody.mode = 'json';\n brunoBody.json = body.data || '';\n break;\n\n case 'text':\n brunoBody.mode = 'text';\n brunoBody.text = body.data || '';\n break;\n\n case 'xml':\n brunoBody.mode = 'xml';\n brunoBody.xml = body.data || '';\n break;\n\n case 'sparql':\n brunoBody.mode = 'sparql';\n brunoBody.sparql = body.data || '';\n break;\n\n case 'form-urlencoded':\n brunoBody.mode = 'formUrlEncoded';\n brunoBody.formUrlEncoded = body.data?.map((entry): BrunoKeyValue => {\n const formEntry: BrunoKeyValue = {\n uid: uuid(),\n name: ensureString(entry.name),\n value: ensureString(entry.value),\n enabled: entry.disabled !== true\n };\n\n if (entry.description) {\n if (typeof entry.description === 'string' && entry.description.trim().length) {\n formEntry.description = entry.description;\n } else if (typeof entry.description === 'object' && entry.description.content?.trim().length) {\n formEntry.description = entry.description.content;\n }\n }\n\n return formEntry;\n }) || [];\n break;\n\n case 'multipart-form':\n brunoBody.mode = 'multipartForm';\n brunoBody.multipartForm = body.data?.map((entry): any => {\n const multipartEntry: any = {\n uid: uuid(),\n type: entry.type,\n name: ensureString(entry.name),\n value: entry.type === 'file' ? (entry.value || []) : ensureString(entry.value),\n contentType: entry.contentType || null,\n enabled: entry.disabled !== true\n };\n\n if (entry.description) {\n if (typeof entry.description === 'string' && entry.description.trim().length) {\n multipartEntry.description = entry.description;\n } else if (typeof entry.description === 'object' && entry.description.content?.trim().length) {\n multipartEntry.description = entry.description.content;\n }\n }\n\n return multipartEntry;\n }) || [];\n break;\n\n case 'file':\n brunoBody.mode = 'file';\n brunoBody.file = body.data?.map((file): BrunoFileEntry => {\n const fileEntry: BrunoFileEntry = {\n uid: uuid(),\n filePath: file.filePath || '',\n contentType: file.contentType || '',\n selected: file.selected ?? false\n };\n\n const fileWithDescription = file as FileBodyVariant;\n const desc = typeof fileWithDescription.description === 'string'\n ? fileWithDescription.description\n : (fileWithDescription.description as { content?: string } | undefined)?.content;\n if (desc && desc.trim().length) fileEntry.description = desc;\n\n return fileEntry;\n }) || [];\n break;\n\n default:\n break;\n }\n\n return brunoBody;\n};\n","import type { VariableTypedValue } from '@opencollection/types/common/variables';\nimport {\n parseValueByDataType,\n BrunoVariableDataType,\n isBrunoVariableDataType,\n valueToString\n} from '@usebruno/common/utils';\n\nexport { BrunoVariableDataType, isBrunoVariableDataType };\n\nexport const serializeVariableValue = (value: unknown): string => {\n if (value !== null && typeof value === 'object') {\n return JSON.stringify(value, null, 2);\n }\n return valueToString(value);\n};\n\nexport const isTypedValue = (value: unknown): value is VariableTypedValue => {\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && 'type' in value\n && 'data' in value;\n};\n\nexport interface TypedVariableFields {\n dataType?: BrunoVariableDataType;\n}\n\nexport const hasTypedMetadata = (v: TypedVariableFields): boolean => {\n return !!v.dataType && v.dataType !== 'string';\n};\n\nexport const toOpenCollectionTypedValue = (\n v: TypedVariableFields,\n dataStr: string\n): VariableTypedValue => {\n return {\n type: (v.dataType || 'string') as VariableTypedValue['type'],\n data: dataStr\n };\n};\n\n// `'string'` is the implicit default — omitted from the result.\nexport const fromOpenCollectionTypedValue = (\n typed: VariableTypedValue\n): { value: any } & TypedVariableFields => {\n const dataStr = typeof typed.data === 'string' ? typed.data : String(typed.data ?? '');\n const dataType: BrunoVariableDataType = isBrunoVariableDataType(typed.type) ? typed.type : 'string';\n const result: { value: any } & TypedVariableFields = {\n value: parseValueByDataType(dataStr, dataType)\n };\n if (dataType !== 'string') {\n result.dataType = dataType;\n }\n return result;\n};\n","import { Variable, VariableTypedValue } from '@opencollection/types/common/variables';\nimport { FolderRequest as BrunoFolderRequest } from '@usebruno/schema-types/collection/folder';\nimport { Variable as BrunoVariable, Variables as BrunoVariables } from '@usebruno/schema-types/common/variables';\nimport { uuid, ensureString } from '../../../utils';\nimport {\n isTypedValue,\n hasTypedMetadata,\n toOpenCollectionTypedValue,\n fromOpenCollectionTypedValue,\n serializeVariableValue\n} from './datatype';\n\n/**\n * Convert Bruno pre-request variables to OpenCollection variables format.\n * Note: Post-response variables are now converted to actions (see actions.ts).\n */\nexport const toOpenCollectionVariables = (variables: BrunoFolderRequest['vars'] | BrunoVariables | null | undefined): Variable[] | undefined => {\n // Handle folder variables (has req/res structure) - only use req vars\n const hasReqRes = variables && 'req' in variables;\n const reqVars = hasReqRes ? variables.req : variables as BrunoVariables;\n\n const reqVarsArray = Array.isArray(reqVars) ? reqVars : [];\n\n if (!reqVarsArray.length) {\n return undefined;\n }\n\n const ocVariables: Variable[] = reqVarsArray.map((v: BrunoVariable): Variable => {\n const valueStr = serializeVariableValue(v.value);\n const variable: Variable = {\n name: v.name || '',\n value: hasTypedMetadata(v) ? toOpenCollectionTypedValue(v, valueStr) : valueStr\n };\n\n if (v?.description?.trim().length) {\n variable.description = v.description;\n }\n\n if (v.enabled === false) {\n variable.disabled = true;\n }\n return variable;\n });\n\n return ocVariables.length > 0 ? ocVariables : undefined;\n};\n\n/**\n * Convert OpenCollection variables to Bruno pre-request variables format.\n * Note: Post-response variables come from actions (see actions.ts).\n */\nexport const toBrunoVariables = (variables: Variable[] | null | undefined): { req: BrunoVariables; res: BrunoVariables } => {\n if (!variables?.length) {\n return { req: [], res: [] };\n }\n\n const reqVars: BrunoVariables = [];\n\n variables.forEach((v: Variable) => {\n const base: BrunoVariable = {\n uid: uuid(),\n name: ensureString(v.name),\n value: '',\n enabled: v.disabled !== true,\n local: false\n };\n\n if (isTypedValue(v.value)) {\n Object.assign(base, fromOpenCollectionTypedValue(v.value));\n } else {\n base.value = ensureString(v.value);\n }\n\n if (v.description) {\n base.description = typeof v.description === 'string' ? v.description : (v.description as any)?.content || '';\n }\n\n reqVars.push(base);\n });\n\n return { req: reqVars, res: [] };\n};\n","import type { Action, ActionSetVariable, ActionVariableScope } from '@opencollection/types/common/actions';\nimport type { Variable as BrunoVariable, Variables as BrunoVariables } from '@usebruno/schema-types/common/variables';\nimport { uuid, ensureString } from '../../../utils';\n\n/**\n * Convert Bruno post-response variables to OpenCollection actions.\n * Post-response variables in Bruno are converted to 'set-variable' actions\n * with phase 'after-response'.\n */\nexport const toOpenCollectionActions = (resVariables: BrunoVariables | null | undefined): Action[] | undefined => {\n if (!resVariables?.length) {\n return undefined;\n }\n\n const actions: Action[] = resVariables.map((v: BrunoVariable): ActionSetVariable => {\n const action: ActionSetVariable = {\n type: 'set-variable',\n phase: 'after-response',\n selector: {\n expression: ensureString(v.value),\n method: 'jsonq'\n },\n variable: {\n name: v.name || '',\n scope: v.local ? 'request' : 'runtime' as ActionVariableScope\n }\n };\n\n if (v.description?.trim().length) {\n action.description = v.description;\n }\n\n if (v.enabled === false) {\n action.disabled = true;\n }\n\n return action;\n });\n\n return actions.length > 0 ? actions : undefined;\n};\n\n/**\n * Convert OpenCollection actions to Bruno post-response variables.\n * Only 'set-variable' actions with phase 'after-response' are converted.\n */\nexport const toBrunoPostResponseVariables = (actions: Action[] | null | undefined): BrunoVariables => {\n if (!actions?.length) {\n return [];\n }\n\n const resVars: BrunoVariables = [];\n\n actions.forEach((action: Action) => {\n // Only process 'set-variable' actions with 'after-response' phase\n if (action.type === 'set-variable' && action.phase === 'after-response') {\n const setVarAction = action as ActionSetVariable;\n\n const variable: BrunoVariable = {\n uid: uuid(),\n name: ensureString(setVarAction.variable?.name),\n value: ensureString(setVarAction.selector?.expression),\n enabled: setVarAction.disabled !== true,\n local: false\n };\n\n if (setVarAction.description) {\n variable.description = typeof setVarAction.description === 'string'\n ? setVarAction.description\n : (setVarAction.description as any)?.content || '';\n }\n\n resVars.push(variable);\n }\n });\n\n return resVars;\n};\n","import type { Scripts, Script } from '@opencollection/types/common/scripts';\nimport type { FolderRequest as BrunoFolderRequest } from '@usebruno/schema-types/collection/folder';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { WebSocketRequest as BrunoWebSocketRequest } from '@usebruno/schema-types/requests/websocket';\nimport type { GrpcRequest as BrunoGrpcRequest } from '@usebruno/schema-types/requests/grpc';\n\nexport const toOpenCollectionScripts = (request: BrunoFolderRequest | BrunoHttpRequest | BrunoWebSocketRequest | BrunoGrpcRequest | null | undefined): Scripts | undefined => {\n const ocScripts: Scripts = [];\n\n if (request?.script?.req?.trim().length) {\n ocScripts.push({\n type: 'before-request',\n code: request.script.req.trim()\n });\n }\n if (request?.script?.res?.trim().length) {\n ocScripts.push({\n type: 'after-response',\n code: request.script.res.trim()\n });\n }\n if (request?.tests?.trim().length) {\n ocScripts.push({\n type: 'tests',\n code: request.tests.trim()\n });\n }\n\n return ocScripts.length > 0 ? ocScripts : undefined;\n};\n\nexport const toBrunoScripts = (scripts: Scripts | null | undefined): {\n script?: { req?: string; res?: string };\n tests?: string;\n} | undefined => {\n if (!scripts || !Array.isArray(scripts) || scripts.length === 0) {\n return undefined;\n }\n\n const brunoScripts: {\n script?: { req?: string; res?: string };\n tests?: string;\n } = {};\n\n for (const script of scripts) {\n if (script.type === 'before-request' && script.code) {\n if (!brunoScripts.script) {\n brunoScripts.script = {};\n }\n brunoScripts.script.req = script.code;\n }\n if (script.type === 'after-response' && script.code) {\n if (!brunoScripts.script) {\n brunoScripts.script = {};\n }\n brunoScripts.script.res = script.code;\n }\n if (script.type === 'tests' && script.code) {\n brunoScripts.tests = script.code;\n }\n }\n\n return Object.keys(brunoScripts).length > 0 ? brunoScripts : undefined;\n};\n","import type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport type { Assertion } from '@opencollection/types/common/assertions';\nimport { uuid, ensureString } from '../../../utils';\n\nconst OPERATORS = [\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'in',\n 'notIn',\n 'contains',\n 'notContains',\n 'length',\n 'matches',\n 'notMatches',\n 'startsWith',\n 'endsWith',\n 'between',\n 'isEmpty',\n 'isNotEmpty',\n 'isNull',\n 'isUndefined',\n 'isDefined',\n 'isTruthy',\n 'isFalsy',\n 'isJson',\n 'isNumber',\n 'isString',\n 'isBoolean',\n 'isArray'\n] as const;\n\nconst UNARY_OPERATORS = [\n 'isEmpty',\n 'isNotEmpty',\n 'isNull',\n 'isUndefined',\n 'isDefined',\n 'isTruthy',\n 'isFalsy',\n 'isJson',\n 'isNumber',\n 'isString',\n 'isBoolean',\n 'isArray'\n] as const;\n\ntype Operator = typeof OPERATORS[number];\n\nconst parseAssertionOperator = (str: string = ''): { operator: Operator; value: string | undefined } => {\n if (!str || typeof str !== 'string' || !str.length) {\n return {\n operator: 'eq',\n value: str\n };\n }\n\n const [firstWord, ...rest] = str.trim().split(' ');\n const remainingValue = rest.join(' ');\n\n // Check if first word is a unary operator\n if (UNARY_OPERATORS.includes(firstWord as any)) {\n return {\n operator: firstWord as Operator,\n value: undefined\n };\n }\n\n // Check if first word is any recognized operator\n if (OPERATORS.includes(firstWord as any)) {\n return {\n operator: firstWord as Operator,\n value: remainingValue\n };\n }\n\n // If not a recognized operator, treat the whole string as value with 'eq' operator\n return {\n operator: 'eq',\n value: str\n };\n};\n\nexport const toOpenCollectionAssertions = (assertions: BrunoKeyValue[] | null | undefined): Assertion[] | undefined => {\n if (!assertions?.length) {\n return undefined;\n }\n\n const ocAssertions: Assertion[] = assertions.map((assertion: BrunoKeyValue): Assertion => {\n const { operator, value } = parseAssertionOperator(assertion.value || '');\n\n const ocAssertion: Assertion = {\n expression: assertion.name || '',\n operator,\n ...(value !== undefined && { value })\n };\n\n if (assertion?.description?.trim().length) {\n ocAssertion.description = assertion.description;\n }\n\n if (assertion.enabled === false) {\n ocAssertion.disabled = true;\n }\n\n return ocAssertion;\n });\n\n return ocAssertions.length > 0 ? ocAssertions : undefined;\n};\n\nexport const toBrunoAssertions = (assertions: Assertion[] | null | undefined): BrunoKeyValue[] | undefined => {\n if (!assertions?.length) {\n return undefined;\n }\n\n const brunoAssertions: BrunoKeyValue[] = assertions.map((assertion: Assertion): BrunoKeyValue => {\n // Reconstruct the \"operator value\" format that Bruno uses\n let valueString = ensureString(assertion.operator);\n if (assertion.value !== undefined && assertion.value !== null) {\n valueString = `${assertion.operator} ${ensureString(assertion.value)}`;\n }\n\n const brunoAssertion: BrunoKeyValue = {\n uid: uuid(),\n name: ensureString(assertion.expression),\n value: valueString,\n enabled: assertion.disabled !== true\n };\n\n if (assertion.description) {\n if (typeof assertion.description === 'string' && assertion.description.trim().length) {\n brunoAssertion.description = assertion.description;\n } else if (typeof assertion.description === 'object' && assertion.description.content?.trim().length) {\n brunoAssertion.description = assertion.description.content;\n }\n }\n\n return brunoAssertion;\n });\n\n return brunoAssertions.length > 0 ? brunoAssertions : undefined;\n};\n","import type { Item as BrunoItem, HttpItemSettings as BrunoHttpItemSettings } from '@usebruno/schema-types/collection/item';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { HttpRequest, HttpRequestBody } from '@opencollection/types/requests/http';\nimport { toBrunoAuth } from '../common/auth';\nimport { toBrunoHttpHeaders } from '../common/headers';\nimport { toBrunoParams } from '../common/params';\nimport { toBrunoBody } from '../common/body';\nimport { toBrunoVariables } from '../common/variables';\nimport { toBrunoPostResponseVariables } from '../common/actions';\nimport { toBrunoScripts } from '../common/scripts';\nimport { toBrunoAssertions } from '../common/assertions';\nimport { toBrunoApp } from '../common/app';\nimport { uuid, ensureString } from '../../../utils';\nimport { utils } from '@usebruno/common';\nconst { toBool, toNumber } = utils;\n\nconst parseHttpRequest = (ocRequest: HttpRequest): BrunoItem => {\n const info = ocRequest.info;\n const http = ocRequest.http;\n const runtime = ocRequest.runtime;\n\n const brunoRequest: BrunoHttpRequest = {\n url: ensureString(http?.url),\n method: ensureString(http?.method, 'GET'),\n headers: toBrunoHttpHeaders(http?.headers) || [],\n params: toBrunoParams(http?.params) || [],\n auth: toBrunoAuth(http?.auth),\n body: toBrunoBody(http?.body as HttpRequestBody) || {\n mode: 'none',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: [],\n multipartForm: [],\n graphql: null,\n file: []\n },\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n assertions: [],\n tests: null,\n docs: null\n };\n\n // scripts\n const scripts = toBrunoScripts(runtime?.scripts);\n if (scripts?.script && brunoRequest.script) {\n if (scripts.script.req) {\n brunoRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n brunoRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n brunoRequest.tests = scripts.tests;\n }\n\n // variables (pre-request from variables, post-response from actions)\n const variables = toBrunoVariables(runtime?.variables);\n const postResponseVars = toBrunoPostResponseVariables(runtime?.actions);\n brunoRequest.vars = {\n req: variables.req,\n res: postResponseVars\n };\n\n // assertions\n const assertions = toBrunoAssertions(runtime?.assertions);\n if (assertions) {\n brunoRequest.assertions = assertions;\n }\n\n // docs\n if (ocRequest.docs) {\n brunoRequest.docs = ocRequest.docs;\n }\n\n // app\n const app = toBrunoApp((ocRequest as any).app);\n\n // bruno item\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'http-request',\n seq: info?.seq || 1,\n name: ensureString(info?.name, 'Untitled Request'),\n tags: info?.tags || [],\n request: brunoRequest,\n settings: null,\n app,\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n // description\n if (info?.description) {\n const desc = typeof info.description === 'string' ? info.description : (info.description as any)?.content || '';\n if (desc.trim().length) {\n brunoItem.description = desc;\n }\n }\n\n // settings\n if (ocRequest.settings) {\n const settings: BrunoHttpItemSettings = {};\n\n settings.encodeUrl = toBool(ocRequest.settings.encodeUrl, true);\n\n if (typeof ocRequest.settings.timeout === 'number') {\n settings.timeout = ocRequest.settings.timeout;\n } else if (ocRequest.settings.timeout === 'inherit') {\n settings.timeout = 'inherit';\n } else {\n settings.timeout = 0;\n }\n\n settings.followRedirects = toBool(ocRequest.settings.followRedirects, true);\n settings.maxRedirects = toNumber(ocRequest.settings.maxRedirects, 5);\n settings.forwardAuthorizationHeader = toBool(ocRequest.settings.forwardAuthorizationHeader, true);\n\n brunoItem.settings = settings;\n }\n\n // examples\n if (ocRequest.examples?.length) {\n brunoItem.examples = ocRequest.examples.map((example) => {\n const brunoExample: any = {\n uid: uuid(),\n itemUid: uuid(),\n name: ensureString(example.name, 'Untitled Example'),\n type: 'http-request',\n request: null,\n response: null\n };\n\n if (example.description) {\n if (typeof example.description === 'string' && example.description.trim().length) {\n brunoExample.description = example.description;\n } else if (typeof example.description === 'object' && example.description.content?.trim().length) {\n brunoExample.description = example.description.content;\n }\n }\n\n if (example.request) {\n brunoExample.request = {\n url: ensureString(example.request.url),\n method: ensureString(example.request.method, 'GET'),\n headers: toBrunoHttpHeaders(example.request.headers) || [],\n params: toBrunoParams(example.request.params) || [],\n body: toBrunoBody(example.request.body) || {\n mode: 'none',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: null,\n multipartForm: null,\n graphql: null,\n file: null\n }\n };\n }\n\n if (example.response) {\n brunoExample.response = {\n status: typeof example.response.status === 'number' ? example.response.status\n : example.response.status !== undefined ? Number(example.response.status) : null,\n statusText: example.response.statusText || null,\n headers: toBrunoHttpHeaders(example.response.headers) || [],\n body: null\n };\n\n if (example.response.body) {\n brunoExample.response.body = {\n type: example.response.body.type || 'text',\n content: example.response.body.data || ''\n };\n }\n }\n\n return brunoExample;\n });\n }\n\n return brunoItem;\n};\n\nexport default parseHttpRequest;\n","import type { Item as BrunoItem, HttpItemSettings as BrunoHttpItemSettings } from '@usebruno/schema-types/collection/item';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { GraphQLRequest, GraphQLRequestSettings, GraphQLBody } from '@opencollection/types/requests/graphql';\nimport { toBrunoAuth } from '../common/auth';\nimport { toBrunoHttpHeaders } from '../common/headers';\nimport { toBrunoParams } from '../common/params';\nimport { toBrunoVariables } from '../common/variables';\nimport { toBrunoPostResponseVariables } from '../common/actions';\nimport { toBrunoScripts } from '../common/scripts';\nimport { toBrunoAssertions } from '../common/assertions';\nimport { uuid, ensureString } from '../../../utils';\nimport { utils } from '@usebruno/common';\nconst { toBool, toNumber } = utils;\n\nconst parseGraphQLRequest = (ocRequest: GraphQLRequest): BrunoItem => {\n const info = ocRequest.info;\n const graphql = ocRequest.graphql;\n const runtime = ocRequest.runtime;\n\n const brunoRequest: BrunoHttpRequest = {\n url: ensureString(graphql?.url),\n method: ensureString(graphql?.method, 'POST'),\n headers: toBrunoHttpHeaders(graphql?.headers) || [],\n params: toBrunoParams(graphql?.params) || [],\n auth: toBrunoAuth(graphql?.auth),\n body: {\n mode: 'graphql',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: [],\n multipartForm: [],\n graphql: {\n query: (graphql?.body as GraphQLBody)?.query || '',\n variables: (graphql?.body as GraphQLBody)?.variables || ''\n },\n file: []\n },\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n assertions: [],\n tests: null,\n docs: null\n };\n\n // scripts\n const scripts = toBrunoScripts(runtime?.scripts);\n if (scripts?.script && brunoRequest.script) {\n if (scripts.script.req) {\n brunoRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n brunoRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n brunoRequest.tests = scripts.tests;\n }\n\n // variables (pre-request from variables, post-response from actions)\n const variables = toBrunoVariables(runtime?.variables);\n const postResponseVars = toBrunoPostResponseVariables(runtime?.actions);\n brunoRequest.vars = {\n req: variables.req,\n res: postResponseVars\n };\n\n // assertions\n const assertions = toBrunoAssertions(runtime?.assertions);\n if (assertions) {\n brunoRequest.assertions = assertions;\n }\n\n // docs\n if (ocRequest.docs) {\n brunoRequest.docs = ocRequest.docs;\n }\n\n // bruno item\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'graphql-request',\n seq: info?.seq || 1,\n name: ensureString(info?.name, 'Untitled Request'),\n tags: info?.tags || [],\n request: brunoRequest,\n settings: null,\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n // description\n if (info?.description) {\n const desc = typeof info.description === 'string' ? info.description : (info.description as any)?.content || '';\n if (desc.trim().length) {\n brunoItem.description = desc;\n }\n }\n\n // settings\n if (ocRequest.settings) {\n const settings: BrunoHttpItemSettings = {};\n\n settings.encodeUrl = toBool(ocRequest.settings.encodeUrl, true);\n\n if (typeof ocRequest.settings.timeout === 'number') {\n settings.timeout = ocRequest.settings.timeout;\n } else if (ocRequest.settings.timeout === 'inherit') {\n settings.timeout = 'inherit';\n } else {\n settings.timeout = 0;\n }\n\n settings.followRedirects = toBool(ocRequest.settings.followRedirects, true);\n settings.maxRedirects = toNumber(ocRequest.settings.maxRedirects, 5);\n settings.forwardAuthorizationHeader = toBool(ocRequest.settings.forwardAuthorizationHeader, true);\n\n brunoItem.settings = settings;\n }\n\n return brunoItem;\n};\n\nexport default parseGraphQLRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { GrpcRequest as BrunoGrpcRequest } from '@usebruno/schema-types/requests/grpc';\nimport type { GrpcRequest, GrpcMetadata, GrpcMessageVariant } from '@opencollection/types/requests/grpc';\nimport type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport { toBrunoAuth } from '../common/auth';\nimport { toBrunoVariables } from '../common/variables';\nimport { toBrunoScripts } from '../common/scripts';\nimport { toBrunoAssertions } from '../common/assertions';\nimport { isNonEmptyString, uuid, ensureString } from '../../../utils';\n\nconst toBrunoGrpcMetadata = (metadata: GrpcMetadata[] | null | undefined): BrunoKeyValue[] | undefined => {\n if (!metadata?.length) {\n return undefined;\n }\n\n const brunoMetadata = metadata.map((meta: GrpcMetadata): BrunoKeyValue => {\n const brunoMeta: BrunoKeyValue = {\n uid: uuid(),\n name: ensureString(meta.name),\n value: ensureString(meta.value),\n enabled: meta.disabled !== true\n };\n\n if (meta.description) {\n const desc = typeof meta.description === 'string' ? meta.description : (meta.description as any)?.content || '';\n if (desc.trim().length) {\n brunoMeta.description = desc;\n }\n }\n\n return brunoMeta;\n });\n\n return brunoMetadata.length ? brunoMetadata : undefined;\n};\n\nconst parseGrpcRequest = (ocRequest: GrpcRequest): BrunoItem => {\n const info = ocRequest.info;\n const grpc = ocRequest.grpc;\n const runtime = ocRequest.runtime;\n\n const brunoRequest: BrunoGrpcRequest = {\n url: ensureString(grpc?.url),\n method: ensureString(grpc?.method),\n methodType: grpc?.methodType || '',\n protoPath: grpc?.protoFilePath || null,\n headers: toBrunoGrpcMetadata(grpc?.metadata) || [],\n auth: toBrunoAuth(grpc?.auth),\n body: {\n mode: 'grpc',\n grpc: []\n },\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n assertions: [],\n tests: null,\n docs: null\n };\n\n // message\n const rawMessage = grpc?.message;\n if (Array.isArray(rawMessage)) {\n brunoRequest.body.grpc = (rawMessage as GrpcMessageVariant[]).map(({ title, message }, index) => ({\n name: title || `message ${index + 1}`,\n content: ensureString(message)\n }));\n } else if (isNonEmptyString(rawMessage)) {\n brunoRequest.body.grpc = [{\n name: '',\n content: rawMessage as string\n }];\n }\n\n // scripts\n const scripts = toBrunoScripts(runtime?.scripts);\n if (scripts?.script && brunoRequest.script) {\n if (scripts.script.req) {\n brunoRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n brunoRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n brunoRequest.tests = scripts.tests;\n }\n\n // variables\n const variables = toBrunoVariables(runtime?.variables);\n brunoRequest.vars = variables;\n\n // assertions\n const assertions = toBrunoAssertions(runtime?.assertions);\n if (assertions) {\n brunoRequest.assertions = assertions;\n }\n\n // docs\n if (ocRequest.docs) {\n brunoRequest.docs = ocRequest.docs;\n }\n\n // bruno item\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'grpc-request',\n seq: info?.seq || 1,\n name: ensureString(info?.name, 'Untitled Request'),\n tags: info?.tags || [],\n request: brunoRequest,\n settings: {},\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n // description\n if (info?.description) {\n const desc = typeof info.description === 'string' ? info.description : (info.description as any)?.content || '';\n if (desc.trim().length) {\n brunoItem.description = desc;\n }\n }\n\n return brunoItem;\n};\n\nexport default parseGrpcRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { Item, ScriptFile } from '@opencollection/types/collection/item';\nimport type { HttpRequest } from '@opencollection/types/requests/http';\nimport type { GraphQLRequest } from '@opencollection/types/requests/graphql';\nimport type { GrpcRequest } from '@opencollection/types/requests/grpc';\nimport type { WebSocketRequest } from '@opencollection/types/requests/websocket';\nimport { parseYml } from './utils';\nimport parseHttpRequest from './items/parseHttpRequest';\nimport parseGraphQLRequest from './items/parseGraphQLRequest';\nimport parseGrpcRequest from './items/parseGrpcRequest';\nimport parseWebsocketRequest from './items/parseWebsocketRequest';\nimport parseScript from './items/parseScript';\nimport parseApp, { type AppFile } from './items/parseApp';\n\n// Helper to get the type from an item (now in info block)\nconst getItemType = (item: Item): string | undefined => {\n if ('info' in item && item.info && 'type' in item.info) {\n return item.info.type;\n }\n // For ScriptFile which still has type at root\n if ('type' in item) {\n return (item as ScriptFile).type;\n }\n return undefined;\n};\n\n/**\n * In v3.0.0-rc1 release auth was present under runtime property for all requests\n * This has now been moved to the respective request properties\n * This backward compatibility has been put in place for folks who tried out our early preview\n * Should be safe to remove this in 3 months. Delete after 5 Apr 2026\n */\nconst ensureAuthV3Rc1BackwardsCompatibility = (parsedItemYml: any): any => {\n const itemType = parsedItemYml?.info?.type;\n\n switch (itemType) {\n case 'http':\n if (parsedItemYml.runtime?.auth && !parsedItemYml.http?.auth) {\n parsedItemYml.http.auth = parsedItemYml.runtime.auth;\n }\n break;\n case 'graphql':\n if (parsedItemYml.runtime?.auth && !parsedItemYml.graphql?.auth) {\n parsedItemYml.graphql.auth = parsedItemYml.runtime.auth;\n }\n break;\n case 'grpc':\n if (parsedItemYml.runtime?.auth && !parsedItemYml.grpc?.auth) {\n parsedItemYml.grpc.auth = parsedItemYml.runtime.auth;\n }\n break;\n case 'websocket':\n if (parsedItemYml.runtime?.auth && !parsedItemYml.websocket?.auth) {\n parsedItemYml.websocket.auth = parsedItemYml.runtime.auth;\n }\n break;\n default:\n break;\n }\n\n return parsedItemYml;\n};\n\nconst parseItem = (ymlString: string): BrunoItem => {\n try {\n const parsedYml = parseYml(ymlString);\n\n const ocItem: Item = ensureAuthV3Rc1BackwardsCompatibility(parsedYml);\n const itemType = getItemType(ocItem);\n\n if (!ocItem || !itemType) {\n throw new Error('Invalid item: missing type');\n }\n\n switch (itemType) {\n case 'http':\n return parseHttpRequest(ocItem as HttpRequest);\n\n case 'graphql':\n return parseGraphQLRequest(ocItem as GraphQLRequest);\n\n case 'grpc':\n return parseGrpcRequest(ocItem as GrpcRequest);\n\n case 'websocket':\n return parseWebsocketRequest(ocItem as WebSocketRequest);\n\n case 'script':\n return parseScript(ocItem as ScriptFile);\n\n case 'app':\n return parseApp(ocItem as unknown as AppFile);\n\n case 'folder':\n throw new Error('Folder items should be handled separately using parseFolder');\n\n default:\n throw new Error(`Unsupported item type: ${itemType}`);\n }\n } catch (error) {\n console.error('Error parsing item:', error);\n throw error;\n }\n};\n\nexport default parseItem;\n","import type { App as BrunoApp } from '@usebruno/schema-types/collection/item';\n\nexport interface OpenCollectionApp {\n enabled?: boolean;\n code?: string;\n}\n\nexport const toOpenCollectionApp = (app: BrunoApp | null | undefined): OpenCollectionApp | undefined => {\n // The app block persists when enabled even before any code is written.\n if (!app || (!app.code && app.enabled !== true)) return undefined;\n const ocApp: OpenCollectionApp = {};\n if (app.enabled === true) {\n ocApp.enabled = true;\n }\n if (app.code) {\n ocApp.code = app.code;\n }\n return ocApp;\n};\n\nexport const toBrunoApp = (app: OpenCollectionApp | null | undefined): BrunoApp | null => {\n if (!app) return null;\n return {\n enabled: app.enabled === true,\n code: app.code || null\n };\n};\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { WebSocketRequest as BrunoWebSocketRequest } from '@usebruno/schema-types/requests/websocket';\nimport type { WebSocketRequest, WebSocketMessage, WebSocketMessageVariant } from '@opencollection/types/requests/websocket';\nimport { toBrunoAuth } from '../common/auth';\nimport { toBrunoHttpHeaders } from '../common/headers';\nimport { toBrunoVariables } from '../common/variables';\nimport { toBrunoScripts } from '../common/scripts';\nimport { uuid, ensureString } from '../../../utils';\n\nconst parseWebsocketRequest = (ocRequest: WebSocketRequest): BrunoItem => {\n const info = ocRequest.info;\n const websocket = ocRequest.websocket;\n const runtime = ocRequest.runtime;\n\n const brunoRequest: BrunoWebSocketRequest = {\n url: ensureString(websocket?.url),\n headers: toBrunoHttpHeaders(websocket?.headers) || [],\n auth: toBrunoAuth(websocket?.auth),\n body: {\n mode: 'ws',\n ws: []\n },\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n assertions: [],\n tests: null,\n docs: null\n };\n\n // message\n if (websocket?.message) {\n if (Array.isArray(websocket.message)) {\n // multiple messages: WebSocketMessageVariant[]\n const variants = websocket.message as WebSocketMessageVariant[];\n brunoRequest.body.ws = variants.map((variant, index) => ({\n name: variant.title || `message ${index + 1}`,\n type: variant.message?.type || 'text',\n content: ensureString(variant.message?.data),\n selected: variant.selected || false\n }));\n } else {\n // single message uses flat WebSocketMessage\n const message = websocket.message as WebSocketMessage;\n const messageData = ensureString(message.data);\n if (messageData.trim().length) {\n brunoRequest.body.ws = [{\n name: '',\n type: message.type || 'text',\n content: messageData\n }];\n }\n }\n }\n\n // scripts\n const scripts = toBrunoScripts(runtime?.scripts);\n if (scripts?.script && brunoRequest.script) {\n if (scripts.script.req) {\n brunoRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n brunoRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n brunoRequest.tests = scripts.tests;\n }\n\n // variables\n const variables = toBrunoVariables(runtime?.variables);\n brunoRequest.vars = variables;\n\n // docs\n if (ocRequest.docs) {\n brunoRequest.docs = ocRequest.docs;\n }\n\n // settings\n const wsSettings: Record<string, number> = {\n timeout: 0,\n keepAliveInterval: 0\n };\n\n if (ocRequest.settings) {\n if (typeof ocRequest.settings.timeout === 'number') {\n wsSettings.timeout = ocRequest.settings.timeout;\n }\n if (typeof ocRequest.settings.keepAliveInterval === 'number') {\n wsSettings.keepAliveInterval = ocRequest.settings.keepAliveInterval;\n }\n }\n\n // bruno item\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'ws-request',\n seq: info?.seq || 1,\n name: ensureString(info?.name, 'Untitled Request'),\n tags: info?.tags || [],\n request: brunoRequest,\n settings: wsSettings as any,\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n // description\n if (info?.description) {\n const desc = typeof info.description === 'string' ? info.description : (info.description as any)?.content || '';\n if (desc.trim().length) {\n brunoItem.description = desc;\n }\n }\n\n return brunoItem;\n};\n\nexport default parseWebsocketRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { ScriptFile } from '@opencollection/types/collection/item';\nimport { uuid } from '../../../utils';\n\nconst parseScript = (ocScript: ScriptFile): BrunoItem => {\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'js',\n seq: 1,\n name: 'Script',\n tags: [],\n request: null,\n settings: null,\n fileContent: ocScript.script || '',\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n return brunoItem;\n};\n\nexport default parseScript;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport { uuid } from '../../../utils';\n\nexport interface AppFile {\n info: {\n name?: string;\n type: 'app';\n seq?: number;\n tags?: string[];\n };\n code?: string;\n}\n\nconst parseApp = (ocApp: AppFile): BrunoItem => {\n const info = ocApp.info || ({} as AppFile['info']);\n\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'app',\n seq: typeof info.seq === 'number' ? info.seq : 1,\n name: info.name || 'App',\n tags: Array.isArray(info.tags) ? info.tags : [],\n request: null,\n settings: null,\n app: { code: ocApp.code || '' },\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n return brunoItem;\n};\n\nexport default parseApp;\n","import type { CollectionFormat } from './types';\nimport type { ExternalSecretProviderType } from '@usebruno/schema-types/collection/environment';\n\nexport const DEFAULT_COLLECTION_FORMAT: CollectionFormat = 'yml';\n\n// Each provider type stores its secret reference under a different key.\nexport const SECRET_PROVIDER_IDENTIFIER_FIELDS: Record<\n ExternalSecretProviderType,\n 'path' | 'secretName' | 'vaultName' | 'projectId'\n> = {\n 'aws-secrets-manager': 'secretName',\n 'azure-key-vault': 'vaultName',\n 'gcp-secrets-manager': 'projectId',\n 'hashicorp-vault-cloud': 'path',\n 'hashicorp-vault-server': 'path'\n};\n","import type {\n Environment as BrunoEnvironment,\n EnvironmentVariable as BrunoEnvironmentVariable,\n SecretEnvironmentVariable as BrunoSecretEnvironmentVariable,\n ExternalSecretProviderType as BrunoExternalSecretProviderType\n} from '@usebruno/schema-types/collection/environment';\nimport type { Environment } from '@opencollection/types/config/environments';\nimport type { Variable, SecretVariable } from '@opencollection/types/common/variables';\nimport { parseYml } from './utils';\nimport { uuid, ensureString } from '../../utils';\nimport { SECRET_PROVIDER_IDENTIFIER_FIELDS } from '../../constants';\nimport { isTypedValue, fromOpenCollectionTypedValue } from './common/datatype';\n\nconst isSecretVariable = (v: Variable | SecretVariable): v is SecretVariable => {\n return 'secret' in v && v.secret === true;\n};\n\nexport const toBrunoEnvironmentVariables = (variables: (Variable | SecretVariable)[] | null | undefined): (BrunoEnvironmentVariable | BrunoSecretEnvironmentVariable)[] => {\n if (!variables?.length) {\n return [];\n }\n\n return variables.map((v): (BrunoEnvironmentVariable | BrunoSecretEnvironmentVariable) => {\n if (isSecretVariable(v)) {\n const variable: BrunoEnvironmentVariable = {\n uid: uuid(),\n name: ensureString(v.name),\n value: '',\n type: 'text',\n enabled: v.disabled !== true,\n secret: true\n };\n\n if (v.type && v.type !== 'string' && v.type !== 'null') {\n variable.dataType = v.type;\n }\n\n if (v.description) {\n variable.description = typeof v.description === 'string' ? v.description : (v.description as any)?.content || '';\n }\n\n return variable;\n }\n\n const variable: BrunoEnvironmentVariable = {\n uid: uuid(),\n name: ensureString(v.name),\n value: '',\n type: 'text',\n enabled: v.disabled !== true,\n secret: false\n };\n\n if (isTypedValue(v.value)) {\n Object.assign(variable, fromOpenCollectionTypedValue(v.value));\n } else {\n variable.value = ensureString(v.value);\n }\n\n if (v.description) {\n variable.description = typeof v.description === 'string' ? v.description : (v.description as any)?.content || '';\n }\n\n return variable;\n });\n};\n\n// Parses the yml `externalSecrets: { type, variables: [{ name, path|secretName|vaultName }] }`\n// block into the runtime shape. `uid` and `enabled` are added here; the fetched `value`,\n// `providerConfig` and `lastSyncedAt` are runtime-only and never present in the file.\nconst toBrunoExternalSecrets = (externalSecrets: any): BrunoEnvironment['externalSecrets'] | undefined => {\n if (!externalSecrets || typeof externalSecrets !== 'object') {\n return undefined;\n }\n\n const type = ensureString(externalSecrets.type) as BrunoExternalSecretProviderType;\n const identifierField = SECRET_PROVIDER_IDENTIFIER_FIELDS[type];\n if (!identifierField) {\n return undefined;\n }\n\n // Keep any named entry, even one with an empty identifier — a half-filled secret row is the user's\n // data; dropping it here would silently delete it on the next save.\n const variables = Array.isArray(externalSecrets.variables)\n ? externalSecrets.variables\n .filter((v: any) => v && v.name)\n .map((v: any) => ({\n uid: uuid(),\n name: ensureString(v.name),\n enabled: v.disabled !== true,\n [identifierField]: ensureString(v[identifierField])\n }))\n : [];\n\n return { type, variables } as BrunoEnvironment['externalSecrets'];\n};\n\nconst parseEnvironment = (ymlString: string): BrunoEnvironment => {\n try {\n const ocEnvironment: Environment = parseYml(ymlString);\n\n const brunoEnvironment: BrunoEnvironment = {\n uid: uuid(),\n name: ensureString(ocEnvironment.name, 'Untitled Environment'),\n variables: toBrunoEnvironmentVariables(ocEnvironment.variables),\n color: ocEnvironment.color || null\n };\n\n const externalSecrets = toBrunoExternalSecrets((ocEnvironment as any).externalSecrets);\n if (externalSecrets) {\n brunoEnvironment.externalSecrets = externalSecrets;\n }\n\n return brunoEnvironment;\n } catch (error) {\n console.error('Error parsing environment:', error);\n throw error;\n }\n};\n\nexport default parseEnvironment;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport stringifyHttpRequest from './items/stringifyHttpRequest';\nimport stringifyGraphqlRequest from './items/stringifyGraphQLRequest';\nimport stringifyGrpcRequest from './items/stringifyGrpcRequest';\nimport stringifyWebsocketRequest from './items/stringifyWebsocketRequest';\nimport stringifyScript from './items/stringifyScript';\nimport stringifyApp from './items/stringifyApp';\n\nconst stringifyItem = (item: BrunoItem): string => {\n try {\n switch (item.type) {\n case 'http-request':\n return stringifyHttpRequest(item);\n\n case 'graphql-request':\n return stringifyGraphqlRequest(item);\n\n case 'grpc-request':\n return stringifyGrpcRequest(item);\n\n case 'ws-request':\n return stringifyWebsocketRequest(item);\n\n case 'js':\n return stringifyScript(item);\n\n case 'app':\n return stringifyApp(item);\n\n case 'folder':\n throw new Error('Folder items should be handled separately using stringifyFolder');\n\n default:\n throw new Error(`Unsupported item type: ${item.type}`);\n }\n } catch (error) {\n console.error('Error stringifying item:', error);\n throw error;\n }\n};\nexport default stringifyItem;\n","import type { Item as BrunoItem, HttpItemSettings as BrunoHttpItemSettings } from '@usebruno/schema-types/collection/item';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { HttpRequest, HttpRequestSettings, HttpRequestExample, HttpRequestInfo, HttpRequestDetails, HttpRequestRuntime, HttpRequestHeader } from '@opencollection/types/requests/http';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { Assertion } from '@opencollection/types/common/assertions';\nimport type { Action } from '@opencollection/types/common/actions';\nimport type { HttpRequestParam, HttpRequestBody } from '@opencollection/types/requests/http';\nimport { stringifyYml } from '../utils';\nimport { toOpenCollectionApp, OpenCollectionApp } from '../common/app';\nimport { toOpenCollectionAuth } from '../common/auth';\nimport { toOpenCollectionHttpHeaders, toOpenCollectionResponseHeaders } from '../common/headers';\nimport { toOpenCollectionParams } from '../common/params';\nimport { toOpenCollectionBody } from '../common/body';\nimport { toOpenCollectionVariables } from '../common/variables';\nimport { toOpenCollectionActions } from '../common/actions';\nimport { toOpenCollectionScripts } from '../common/scripts';\nimport { toOpenCollectionAssertions } from '../common/assertions';\nimport { isNumber, isNonEmptyString } from '../../../utils';\nimport { resolveTimeoutSetting } from '@usebruno/common/utils';\n\nconst stringifyHttpRequest = (item: BrunoItem): string => {\n try {\n const ocRequest: HttpRequest = {};\n const brunoRequest = item.request as BrunoHttpRequest;\n\n // info block\n const info: HttpRequestInfo = {\n name: isNonEmptyString(item.name) ? item.name : 'Untitled Request',\n type: 'http'\n };\n if (item.seq) {\n info.seq = item.seq;\n }\n if (item.tags?.length) {\n info.tags = item.tags;\n }\n if (isNonEmptyString(item.description)) {\n info.description = item.description;\n }\n ocRequest.info = info;\n\n // http block\n const http: HttpRequestDetails = {\n method: isNonEmptyString(brunoRequest.method) ? brunoRequest.method : 'GET',\n url: isNonEmptyString(brunoRequest.url) ? brunoRequest.url : ''\n };\n\n // headers\n const headers: HttpRequestHeader[] | undefined = toOpenCollectionHttpHeaders(brunoRequest.headers);\n if (headers) {\n http.headers = headers;\n }\n\n // params\n const params: HttpRequestParam[] | undefined = toOpenCollectionParams(brunoRequest.params);\n if (params) {\n http.params = params;\n }\n\n // body\n const body: HttpRequestBody | undefined = toOpenCollectionBody(brunoRequest.body);\n if (body) {\n http.body = body;\n }\n\n // auth\n const auth: Auth | undefined = toOpenCollectionAuth(brunoRequest.auth);\n if (auth) {\n http.auth = auth;\n }\n\n ocRequest.http = http;\n\n // runtime block\n const runtime: HttpRequestRuntime = {};\n let hasRuntime = false;\n\n // variables\n const variables: Variable[] | undefined = toOpenCollectionVariables(brunoRequest.vars);\n if (variables) {\n runtime.variables = variables;\n hasRuntime = true;\n }\n\n // scripts\n const scripts: Scripts | undefined = toOpenCollectionScripts(brunoRequest);\n if (scripts) {\n runtime.scripts = scripts;\n hasRuntime = true;\n }\n\n // assertions\n const assertions: Assertion[] | undefined = toOpenCollectionAssertions(brunoRequest.assertions);\n if (assertions) {\n runtime.assertions = assertions;\n hasRuntime = true;\n }\n\n // actions (from post-response variables)\n const resVars = brunoRequest.vars?.res;\n const actions: Action[] | undefined = toOpenCollectionActions(resVars);\n if (actions) {\n runtime.actions = actions;\n hasRuntime = true;\n }\n\n if (hasRuntime) {\n ocRequest.runtime = runtime;\n }\n\n // settings\n const httpSettings = item.settings as BrunoHttpItemSettings | undefined;\n const settings: HttpRequestSettings = {};\n if (httpSettings?.encodeUrl === true) {\n settings.encodeUrl = true;\n } else if (httpSettings?.encodeUrl === false) {\n settings.encodeUrl = false;\n } else {\n settings.encodeUrl = true;\n }\n\n settings.timeout = resolveTimeoutSetting(httpSettings?.timeout);\n\n if (httpSettings?.followRedirects === true) {\n settings.followRedirects = true;\n } else if (httpSettings?.followRedirects === false) {\n settings.followRedirects = false;\n } else {\n settings.followRedirects = true;\n }\n\n const maxRedirects = httpSettings?.maxRedirects;\n if (isNumber(maxRedirects)) {\n settings.maxRedirects = maxRedirects;\n } else {\n settings.maxRedirects = 5;\n }\n\n settings.forwardAuthorizationHeader = httpSettings?.forwardAuthorizationHeader ?? true;\n\n ocRequest.settings = settings;\n\n // examples\n if (item.examples?.length) {\n const examples: HttpRequestExample[] = item.examples.map((example) => {\n const ocExample: HttpRequestExample = {};\n ocExample.name = example?.name || 'Untitled Example';\n\n if (isNonEmptyString(example.description)) {\n ocExample.description = example.description;\n }\n\n if (example.request) {\n ocExample.request = {};\n ocExample.request.url = example.request.url || '';\n ocExample.request.method = example.request.method || 'GET';\n\n const exampleHeaders = toOpenCollectionHttpHeaders(example.request.headers);\n if (exampleHeaders) {\n ocExample.request.headers = exampleHeaders;\n }\n\n const exampleParams = toOpenCollectionParams(example.request.params);\n if (exampleParams) {\n ocExample.request.params = exampleParams;\n }\n\n const exampleBody = toOpenCollectionBody(example.request.body);\n if (exampleBody !== undefined) {\n ocExample.request.body = exampleBody;\n }\n }\n\n if (example.response) {\n ocExample.response = {};\n\n const statusNum = Number(example.response.status);\n if (Number.isInteger(statusNum) && statusNum > 0) {\n ocExample.response.status = statusNum;\n }\n\n if (isNonEmptyString(example.response.statusText)) {\n ocExample.response.statusText = example.response.statusText;\n }\n\n const responseHeaders = toOpenCollectionResponseHeaders(example.response.headers);\n if (responseHeaders) {\n ocExample.response.headers = responseHeaders;\n }\n\n if (example.response.body && example.response.body.type && example.response.body.content !== undefined) {\n const content = example.response.body.content;\n const contentString = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n ocExample.response.body = {\n type: example.response.body.type as 'json' | 'text' | 'xml' | 'html' | 'binary',\n data: contentString\n };\n }\n }\n\n return ocExample;\n });\n\n if (examples?.length) {\n ocRequest.examples = examples;\n }\n }\n\n // docs\n if (isNonEmptyString(brunoRequest.docs)) {\n ocRequest.docs = brunoRequest.docs;\n }\n\n // app\n const app: OpenCollectionApp | undefined = toOpenCollectionApp(item.app);\n if (app) {\n (ocRequest as any).app = app;\n }\n\n return stringifyYml(ocRequest);\n } catch (error) {\n console.error('Error stringifying HTTP request:', error);\n throw error;\n }\n};\n\nexport default stringifyHttpRequest;\n","import type { Item as BrunoItem, HttpItemSettings as BrunoHttpItemSettings } from '@usebruno/schema-types/collection/item';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { GraphQLRequest, GraphQLRequestSettings, GraphQLBody, GraphQLRequestInfo, GraphQLRequestDetails, GraphQLRequestRuntime } from '@opencollection/types/requests/graphql';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { Assertion } from '@opencollection/types/common/assertions';\nimport type { Action } from '@opencollection/types/common/actions';\nimport type { HttpRequestParam, HttpRequestHeader } from '@opencollection/types/requests/http';\nimport { stringifyYml } from '../utils';\nimport { isNonEmptyString, isNumber } from '../../../utils';\nimport { toOpenCollectionAuth } from '../common/auth';\nimport { toOpenCollectionHttpHeaders } from '../common/headers';\nimport { toOpenCollectionParams } from '../common/params';\nimport { toOpenCollectionVariables } from '../common/variables';\nimport { toOpenCollectionActions } from '../common/actions';\nimport { toOpenCollectionScripts } from '../common/scripts';\nimport { toOpenCollectionAssertions } from '../common/assertions';\nimport { resolveTimeoutSetting } from '@usebruno/common/utils';\n\nconst stringifyGraphQLRequest = (item: BrunoItem): string => {\n try {\n const ocRequest: GraphQLRequest = {};\n const brunoRequest = item.request as BrunoHttpRequest;\n\n // info block\n const info: GraphQLRequestInfo = {\n name: isNonEmptyString(item.name) ? item.name : 'Untitled Request',\n type: 'graphql'\n };\n if (item.seq) {\n info.seq = item.seq;\n }\n if (item.tags?.length) {\n info.tags = item.tags;\n }\n if (isNonEmptyString(item.description)) {\n info.description = item.description;\n }\n ocRequest.info = info;\n\n // graphql block\n const graphql: GraphQLRequestDetails = {\n method: isNonEmptyString(brunoRequest.method) ? brunoRequest.method : 'POST',\n url: isNonEmptyString(brunoRequest.url) ? brunoRequest.url : ''\n };\n\n // headers\n const headers: HttpRequestHeader[] | undefined = toOpenCollectionHttpHeaders(brunoRequest.headers);\n if (headers) {\n graphql.headers = headers;\n }\n\n // params\n const params: HttpRequestParam[] | undefined = toOpenCollectionParams(brunoRequest.params);\n if (params) {\n graphql.params = params;\n }\n\n // body\n if (brunoRequest.body?.mode === 'graphql' && brunoRequest.body.graphql) {\n const graphqlBody: GraphQLBody = {};\n let hasBody = false;\n\n if (isNonEmptyString(brunoRequest.body.graphql.query)) {\n graphqlBody.query = brunoRequest.body.graphql.query;\n hasBody = true;\n }\n\n if (isNonEmptyString(brunoRequest.body.graphql.variables)) {\n graphqlBody.variables = brunoRequest.body.graphql.variables;\n hasBody = true;\n }\n\n if (hasBody) {\n graphql.body = graphqlBody;\n }\n }\n\n // auth (in graphql block, not runtime)\n const auth: Auth | undefined = toOpenCollectionAuth(brunoRequest.auth);\n if (auth) {\n graphql.auth = auth;\n }\n\n ocRequest.graphql = graphql;\n\n // runtime block\n const runtime: GraphQLRequestRuntime = {};\n let hasRuntime = false;\n\n // variables\n const variables: Variable[] | undefined = toOpenCollectionVariables(brunoRequest.vars);\n if (variables) {\n runtime.variables = variables;\n hasRuntime = true;\n }\n\n // scripts\n const scripts: Scripts | undefined = toOpenCollectionScripts(brunoRequest);\n if (scripts) {\n runtime.scripts = scripts;\n hasRuntime = true;\n }\n\n // assertions\n const assertions: Assertion[] | undefined = toOpenCollectionAssertions(brunoRequest.assertions);\n if (assertions) {\n runtime.assertions = assertions;\n hasRuntime = true;\n }\n\n // actions (from post-response variables)\n const resVars = brunoRequest.vars?.res;\n const actions: Action[] | undefined = toOpenCollectionActions(resVars);\n if (actions) {\n runtime.actions = actions;\n hasRuntime = true;\n }\n\n if (hasRuntime) {\n ocRequest.runtime = runtime;\n }\n\n // settings\n const httpSettings = item.settings as BrunoHttpItemSettings | undefined;\n const settings: GraphQLRequestSettings = {};\n if (httpSettings?.encodeUrl === true) {\n settings.encodeUrl = true;\n } else if (httpSettings?.encodeUrl === false) {\n settings.encodeUrl = false;\n } else {\n settings.encodeUrl = true;\n }\n\n settings.timeout = resolveTimeoutSetting(httpSettings?.timeout);\n\n if (httpSettings?.followRedirects === true) {\n settings.followRedirects = true;\n } else if (httpSettings?.followRedirects === false) {\n settings.followRedirects = false;\n } else {\n settings.followRedirects = true;\n }\n\n const maxRedirects = httpSettings?.maxRedirects;\n if (isNumber(maxRedirects)) {\n settings.maxRedirects = maxRedirects;\n } else {\n settings.maxRedirects = 5;\n }\n\n settings.forwardAuthorizationHeader = httpSettings?.forwardAuthorizationHeader ?? true;\n\n ocRequest.settings = settings;\n\n // docs\n if (isNonEmptyString(brunoRequest.docs)) {\n ocRequest.docs = brunoRequest.docs;\n }\n\n return stringifyYml(ocRequest);\n } catch (error) {\n console.error('Error stringifying GraphQL request:', error);\n throw error;\n }\n};\n\nexport default stringifyGraphQLRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport type { GrpcRequest as BrunoGrpcRequest } from '@usebruno/schema-types/requests/grpc';\nimport type { GrpcRequest, GrpcMetadata, GrpcMessageVariant, GrpcMessage, GrpcRequestInfo, GrpcRequestDetails, GrpcRequestRuntime } from '@opencollection/types/requests/grpc';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { Assertion } from '@opencollection/types/common/assertions';\nimport { stringifyYml } from '../utils';\nimport { isNonEmptyString } from '../../../utils';\nimport { toOpenCollectionAuth } from '../common/auth';\nimport { toOpenCollectionVariables } from '../common/variables';\nimport { toOpenCollectionScripts } from '../common/scripts';\nimport { toOpenCollectionAssertions } from '../common/assertions';\n\nconst stringifyGrpcRequest = (item: BrunoItem): string => {\n try {\n const ocRequest: GrpcRequest = {};\n const brunoRequest = item.request as BrunoGrpcRequest;\n\n // info block\n const info: GrpcRequestInfo = {\n name: isNonEmptyString(item.name) ? item.name : 'Untitled Request',\n type: 'grpc'\n };\n if (item.seq) {\n info.seq = item.seq;\n }\n if (item.tags?.length) {\n info.tags = item.tags;\n }\n if (isNonEmptyString(item.description)) {\n info.description = item.description;\n }\n ocRequest.info = info;\n\n // grpc block\n const grpc: GrpcRequestDetails = {\n url: isNonEmptyString(brunoRequest.url) ? brunoRequest.url : '',\n method: isNonEmptyString(brunoRequest.method) ? brunoRequest.method : ''\n };\n\n // method type\n if (brunoRequest.methodType) {\n grpc.methodType = brunoRequest.methodType;\n }\n\n // proto file path\n if (isNonEmptyString(brunoRequest.protoPath)) {\n grpc.protoFilePath = brunoRequest.protoPath;\n }\n\n // metadata\n if (brunoRequest.headers?.length) {\n const metadata: GrpcMetadata[] = brunoRequest.headers.map((header: BrunoKeyValue) => {\n const metadataItem: GrpcMetadata = {\n name: header.name || '',\n value: header.value || ''\n };\n\n if (header?.description?.trim().length) {\n metadataItem.description = header.description;\n }\n\n if (header.enabled === false) {\n metadataItem.disabled = true;\n }\n\n return metadataItem;\n });\n\n if (metadata.length) {\n grpc.metadata = metadata;\n }\n }\n\n // message\n if (brunoRequest.body?.mode === 'grpc' && brunoRequest.body.grpc?.length) {\n const messages: GrpcMessageVariant[] = brunoRequest.body.grpc.map(({ name, content }, index) => ({\n title: name || `message ${index + 1}`,\n message: content || ''\n }));\n grpc.message = messages;\n }\n\n // auth\n const auth: Auth | undefined = toOpenCollectionAuth(brunoRequest.auth);\n if (auth) {\n grpc.auth = auth;\n }\n\n ocRequest.grpc = grpc;\n\n // runtime block\n const runtime: GrpcRequestRuntime = {};\n let hasRuntime = false;\n\n // variables\n const variables: Variable[] | undefined = toOpenCollectionVariables(brunoRequest.vars);\n if (variables) {\n runtime.variables = variables;\n hasRuntime = true;\n }\n\n // scripts\n const scripts: Scripts | undefined = toOpenCollectionScripts(brunoRequest);\n if (scripts) {\n runtime.scripts = scripts;\n hasRuntime = true;\n }\n\n // assertions\n const assertions: Assertion[] | undefined = toOpenCollectionAssertions(brunoRequest.assertions);\n if (assertions) {\n runtime.assertions = assertions;\n hasRuntime = true;\n }\n\n if (hasRuntime) {\n ocRequest.runtime = runtime;\n }\n\n // docs\n if (isNonEmptyString(brunoRequest.docs)) {\n ocRequest.docs = brunoRequest.docs;\n }\n\n return stringifyYml(ocRequest);\n } catch (error) {\n console.error('Error stringifying gRPC request:', error);\n throw error;\n }\n};\n\nexport default stringifyGrpcRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { WebSocketRequest as BrunoWebSocketRequest } from '@usebruno/schema-types/requests/websocket';\nimport type { WebSocketRequest, WebSocketRequestInfo, WebSocketRequestDetails, WebSocketRequestRuntime, WebSocketMessage, WebSocketMessageVariant } from '@opencollection/types/requests/websocket';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { HttpRequestHeader } from '@opencollection/types/requests/http';\nimport { stringifyYml } from '../utils';\nimport { isNonEmptyString } from '../../../utils';\nimport { toOpenCollectionAuth } from '../common/auth';\nimport { toOpenCollectionHttpHeaders } from '../common/headers';\nimport { toOpenCollectionVariables } from '../common/variables';\nimport { toOpenCollectionScripts } from '../common/scripts';\n\nconst stringifyWebsocketRequest = (item: BrunoItem): string => {\n try {\n const ocRequest: WebSocketRequest = {};\n const brunoRequest = item.request as BrunoWebSocketRequest;\n\n // info block\n const info: WebSocketRequestInfo = {\n name: isNonEmptyString(item.name) ? item.name : 'Untitled Request',\n type: 'websocket'\n };\n if (item.seq) {\n info.seq = item.seq;\n }\n if (item.tags?.length) {\n info.tags = item.tags;\n }\n if (isNonEmptyString(item.description)) {\n info.description = item.description;\n }\n ocRequest.info = info;\n\n // websocket block\n const websocket: WebSocketRequestDetails = {\n url: isNonEmptyString(brunoRequest.url) ? brunoRequest.url : ''\n };\n\n // headers\n const headers: HttpRequestHeader[] | undefined = toOpenCollectionHttpHeaders(brunoRequest.headers);\n if (headers) {\n websocket.headers = headers;\n }\n\n // message: single message without a custom name uses flat WebSocketMessage (backward compatible),\n // otherwise uses WebSocketMessageVariant[] to preserve names\n if (brunoRequest.body?.mode === 'ws' && brunoRequest.body.ws?.length) {\n const messages = brunoRequest.body.ws;\n const hasCustomName = messages.length === 1 && messages[0].name && messages[0].name.trim().length > 0;\n\n const hasContent = messages.length === 1 && (messages[0].content || '').trim().length > 0;\n\n if (messages.length === 1 && !hasCustomName && hasContent) {\n const msg = messages[0];\n const message: WebSocketMessage = {\n type: (msg.type as WebSocketMessage['type']) || 'text',\n data: msg.content || ''\n };\n websocket.message = message;\n } else {\n const variants: WebSocketMessageVariant[] = messages.map((msg, index) => ({\n title: msg.name || `message ${index + 1}`,\n selected: msg.selected || false,\n message: {\n type: (msg.type as WebSocketMessage['type']) || 'text',\n data: msg.content || ''\n }\n }));\n websocket.message = variants;\n }\n }\n\n // auth\n const auth: Auth | undefined = toOpenCollectionAuth(brunoRequest.auth);\n if (auth) {\n websocket.auth = auth;\n }\n\n ocRequest.websocket = websocket;\n\n // runtime block\n const runtime: WebSocketRequestRuntime = {};\n let hasRuntime = false;\n\n // variables\n const variables: Variable[] | undefined = toOpenCollectionVariables(brunoRequest.vars);\n if (variables) {\n runtime.variables = variables;\n hasRuntime = true;\n }\n\n // scripts\n const scripts: Scripts | undefined = toOpenCollectionScripts(brunoRequest);\n if (scripts) {\n runtime.scripts = scripts;\n hasRuntime = true;\n }\n\n if (hasRuntime) {\n ocRequest.runtime = runtime;\n }\n\n // settings\n const wsSettings = item.settings as Record<string, number | string | undefined> | undefined;\n if (wsSettings) {\n ocRequest.settings = {};\n const timeout = Number(wsSettings.timeout);\n ocRequest.settings.timeout = !isNaN(timeout) ? timeout : 0;\n const keepAliveInterval = Number(wsSettings.keepAliveInterval);\n ocRequest.settings.keepAliveInterval = !isNaN(keepAliveInterval) ? keepAliveInterval : 0;\n }\n\n // docs\n if (isNonEmptyString(brunoRequest.docs)) {\n ocRequest.docs = brunoRequest.docs;\n }\n\n return stringifyYml(ocRequest);\n } catch (error) {\n console.error('Error stringifying WebSocket request:', error);\n throw error;\n }\n};\n\nexport default stringifyWebsocketRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { ScriptFile } from '@opencollection/types/collection/item';\nimport { stringifyYml } from '../utils';\n\nconst stringifyScript = (item: BrunoItem): string => {\n try {\n const ocScript: ScriptFile = {\n type: 'script'\n };\n\n if (item.fileContent?.trim().length) {\n ocScript.script = item.fileContent;\n }\n\n return stringifyYml(ocScript);\n } catch (error) {\n console.error('Error stringifying script:', error);\n throw error;\n }\n};\n\nexport default stringifyScript;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport { stringifyYml } from '../utils';\n\ninterface AppFileInfo {\n name: string;\n type: 'app';\n seq?: number;\n tags?: string[];\n}\n\ninterface AppFile {\n info: AppFileInfo;\n code?: string;\n}\n\n// Mirror the request shape (info.name/type/seq/tags + body) so apps round-trip\n// the same fields and can be reordered via seq like every other item.\nconst stringifyApp = (item: BrunoItem): string => {\n try {\n const info: AppFileInfo = {\n name: item.name && item.name.trim().length ? item.name : 'App',\n type: 'app'\n };\n if (typeof item.seq === 'number') {\n info.seq = item.seq;\n }\n if (Array.isArray(item.tags) && item.tags.length) {\n info.tags = item.tags;\n }\n\n const ocApp: AppFile = { info };\n\n const code = item.app?.code;\n if (code && code.trim().length) {\n ocApp.code = code;\n }\n\n return stringifyYml(ocApp);\n } catch (error) {\n console.error('Error stringifying app:', error);\n throw error;\n }\n};\n\nexport default stringifyApp;\n","import type { FolderRoot } from '@usebruno/schema-types/collection/folder';\nimport type { Folder, FolderInfo } from '@opencollection/types/collection/item';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { Action } from '@opencollection/types/common/actions';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { HttpRequestHeader } from '@opencollection/types/requests/http';\nimport type { RequestDefaults } from '@opencollection/types/common/request-defaults';\nimport { toOpenCollectionAuth } from './common/auth';\nimport { toOpenCollectionHttpHeaders } from './common/headers';\nimport { toOpenCollectionVariables } from './common/variables';\nimport { toOpenCollectionActions } from './common/actions';\nimport { toOpenCollectionScripts } from './common/scripts';\nimport { stringifyYml } from './utils';\n\nconst hasRequestDefaults = (folderRoot: FolderRoot): boolean => {\n const requestDefaults = folderRoot?.request;\n\n return Boolean((requestDefaults?.headers?.length)\n || (requestDefaults?.vars?.req?.length)\n || (requestDefaults?.vars?.res?.length)\n || hasRequestScripts(folderRoot)\n || hasRequestAuth(folderRoot));\n};\n\nconst hasRequestAuth = (folderRoot: FolderRoot): boolean => {\n return Boolean((folderRoot.request?.auth?.mode !== 'none'));\n};\n\nconst hasRequestScripts = (folderRoot: FolderRoot): boolean => {\n return Boolean((folderRoot.request?.script?.req)\n || (folderRoot.request?.script?.res)\n || (folderRoot.request?.tests));\n};\n\nconst stringifyFolder = (folderRoot: FolderRoot): string => {\n try {\n const ocFolder: Folder = {};\n\n // info block\n const info: FolderInfo = {\n name: folderRoot.meta?.name || 'Untitled Folder',\n type: 'folder'\n };\n // Only write seq when the folder actually has a numeric one. Defaulting to 1 would\n // force every seq-less folder into position 1 on disk and break alphabetical fallback.\n const seq = folderRoot.meta?.seq;\n if (typeof seq === 'number' && Number.isFinite(seq)) {\n info.seq = seq;\n }\n ocFolder.info = info;\n\n // request defaults\n if (hasRequestDefaults(folderRoot)) {\n ocFolder.request = {} as RequestDefaults;\n\n // headers\n if (folderRoot.request?.headers?.length) {\n const ocHeaders: HttpRequestHeader[] | undefined = toOpenCollectionHttpHeaders(folderRoot.request?.headers);\n if (ocHeaders) {\n ocFolder.request.headers = ocHeaders;\n }\n }\n\n // auth\n if (hasRequestAuth(folderRoot)) {\n const ocAuth: Auth | undefined = toOpenCollectionAuth(folderRoot.request?.auth);\n if (ocAuth) {\n ocFolder.request.auth = ocAuth;\n }\n }\n\n // variables\n if (folderRoot.request?.vars?.req?.length) {\n const ocVariables: Variable[] | undefined = toOpenCollectionVariables(folderRoot.request?.vars);\n if (ocVariables) {\n ocFolder.request.variables = ocVariables;\n }\n }\n\n // actions (post-response variables)\n if (folderRoot.request?.vars?.res?.length) {\n const ocActions: Action[] | undefined = toOpenCollectionActions(folderRoot.request?.vars?.res);\n if (ocActions) {\n (ocFolder.request as any).actions = ocActions;\n }\n }\n\n // scripts\n if (hasRequestScripts(folderRoot)) {\n const ocScripts: Scripts | undefined = toOpenCollectionScripts(folderRoot?.request);\n if (ocScripts) {\n ocFolder.request.scripts = ocScripts;\n }\n }\n }\n\n // docs\n if (folderRoot.docs?.trim().length) {\n ocFolder.docs = {\n content: folderRoot.docs,\n type: 'text/markdown'\n };\n }\n\n return stringifyYml(ocFolder);\n } catch (error) {\n console.error('Error stringifying folder.yml:', error);\n throw error;\n }\n};\nexport default stringifyFolder;\n","import type {\n Environment as BrunoEnvironment,\n EnvironmentVariable as BrunoEnvironmentVariable,\n SecretEnvironmentVariable as BrunoSecretEnvironmentVariable,\n ExternalSecretProviderType as BrunoExternalSecretProviderType\n} from '@usebruno/schema-types/collection/environment';\nimport type { Environment } from '@opencollection/types/config/environments';\nimport type { Variable, SecretVariable } from '@opencollection/types/common/variables';\nimport { stringifyYml } from './utils';\nimport { ensureString } from '../../utils';\nimport { SECRET_PROVIDER_IDENTIFIER_FIELDS } from '../../constants';\nimport { hasTypedMetadata, toOpenCollectionTypedValue, serializeVariableValue } from './common/datatype';\n\nexport const toOpenCollectionEnvironmentVariables = (variables: (BrunoEnvironmentVariable | BrunoSecretEnvironmentVariable)[]): (Variable | SecretVariable)[] | undefined => {\n if (!variables?.length) {\n return undefined;\n }\n\n const ocVariables: (Variable | SecretVariable)[] = variables\n .map((v): Variable | SecretVariable => {\n if ('secret' in v && v.secret === true) {\n const secretVar: SecretVariable = {\n secret: true,\n name: v.name || ''\n };\n if (hasTypedMetadata(v)) {\n secretVar.type = v.dataType;\n }\n if (v.enabled === false) {\n secretVar.disabled = true;\n }\n if (v.description !== undefined) {\n secretVar.description = v.description;\n }\n return secretVar;\n }\n\n const valueStr = serializeVariableValue(v.value);\n\n const variable: Variable = {\n name: v.name || '',\n value: hasTypedMetadata(v) ? toOpenCollectionTypedValue(v, valueStr) : valueStr\n };\n\n if (v.enabled === false) {\n variable.disabled = true;\n }\n\n if (v.description !== undefined) {\n variable.description = v.description;\n }\n\n return variable;\n });\n\n return ocVariables.length > 0 ? ocVariables : undefined;\n};\n\n// Serializes the runtime externalSecrets block to yml `{ type, variables: [{ name,\n// path|secretName|vaultName, disabled? }] }`. Runtime-only fields (uid, value,\n// providerConfig, lastSyncedAt) are never written.\nconst toOpenCollectionExternalSecrets = (externalSecrets: BrunoEnvironment['externalSecrets']): { type: string; variables: Record<string, string | boolean>[] } | undefined => {\n const type = externalSecrets?.type as BrunoExternalSecretProviderType | undefined;\n const identifierField = type && SECRET_PROVIDER_IDENTIFIER_FIELDS[type];\n if (!type || !identifierField) {\n return undefined;\n }\n\n // Keep any named entry, even one with an empty identifier — a half-filled secret row is the user's\n // data; dropping it here would silently delete it on the next save.\n const variables = (externalSecrets?.variables || [])\n .filter((v: any) => v && v.name)\n .map((v: any) => {\n const secret: Record<string, string | boolean> = {\n name: v.name,\n [identifierField]: ensureString(v[identifierField])\n };\n if (v.enabled === false) {\n secret.disabled = true;\n }\n return secret;\n });\n\n return { type, variables };\n};\n\nconst stringifyEnvironment = (environment: BrunoEnvironment): string => {\n try {\n const ocEnvironment: Environment = {\n name: environment.name\n };\n\n if (environment.color) {\n ocEnvironment.color = environment.color;\n }\n\n if (environment.variables?.length) {\n const ocVariables = toOpenCollectionEnvironmentVariables(environment.variables);\n if (ocVariables) {\n ocEnvironment.variables = ocVariables;\n }\n }\n\n const ocExternalSecrets = toOpenCollectionExternalSecrets(environment.externalSecrets);\n if (ocExternalSecrets) {\n (ocEnvironment as any).externalSecrets = ocExternalSecrets;\n }\n\n return stringifyYml(ocEnvironment);\n } catch (error) {\n console.error('Error stringifying environment:', error);\n throw error;\n }\n};\n\nexport default stringifyEnvironment;\n","import { parentPort } from 'node:worker_threads';\nimport {\n parseBruRequest,\n parseBruCollection,\n parseBruEnvironment,\n stringifyBruRequest,\n stringifyBruCollection,\n stringifyBruEnvironment\n} from '../formats/bru';\nimport {\n parseYmlItem,\n parseYmlFolder,\n parseYmlEnvironment,\n stringifyYmlItem,\n stringifyYmlFolder,\n stringifyYmlEnvironment\n} from '../formats/yml';\nimport { CollectionFormat } from '../types';\nimport { DEFAULT_COLLECTION_FORMAT } from '../constants';\n\ntype TaskType\n = | 'parse'\n | 'stringify'\n | 'parseFolder'\n | 'stringifyFolder'\n | 'parseEnvironment'\n | 'stringifyEnvironment';\n\ninterface WorkerMessage {\n taskType: TaskType;\n data: {\n data: any;\n format?: CollectionFormat;\n };\n}\n\nconst runTask = (taskType: TaskType, data: any, format: CollectionFormat): any => {\n switch (taskType) {\n case 'parse':\n return format === 'yml' ? parseYmlItem(data) : parseBruRequest(data);\n case 'stringify':\n return format === 'yml' ? stringifyYmlItem(data) : stringifyBruRequest(data);\n case 'parseFolder':\n return format === 'yml' ? parseYmlFolder(data) : parseBruCollection(data);\n case 'stringifyFolder':\n return format === 'yml' ? stringifyYmlFolder(data) : stringifyBruCollection(data, true);\n case 'parseEnvironment':\n return format === 'yml' ? parseYmlEnvironment(data) : parseBruEnvironment(data);\n case 'stringifyEnvironment':\n return format === 'yml' ? stringifyYmlEnvironment(data) : stringifyBruEnvironment(data);\n default:\n throw new Error(`Unknown task type: ${taskType}`);\n }\n};\n\nparentPort?.on('message', async (message: WorkerMessage) => {\n try {\n const { taskType, data: messageData } = message;\n const { data, format = DEFAULT_COLLECTION_FORMAT } = messageData;\n const result = runTask(taskType, data, format);\n parentPort?.postMessage(result);\n } catch (error: any) {\n console.error('Worker error:', error);\n parentPort?.postMessage({ error: error?.message });\n }\n});\n","import type { FolderRoot } from '@usebruno/schema-types/collection/folder';\nimport type { Folder } from '@opencollection/types/collection/item';\nimport { parseYml } from './utils';\nimport { toBrunoAuth } from './common/auth';\nimport { toBrunoHttpHeaders } from './common/headers';\nimport { toBrunoVariables } from './common/variables';\nimport { toBrunoPostResponseVariables } from './common/actions';\nimport { toBrunoScripts } from './common/scripts';\nimport { ensureString } from '../../utils';\n\nconst parseFolder = (ymlString: string): FolderRoot => {\n try {\n const ocFolder: Folder = parseYml(ymlString);\n\n const info = ocFolder.info;\n const seq = info?.seq;\n\n const folderRoot: FolderRoot = {\n meta: {\n name: ensureString(info?.name, 'Untitled Folder'),\n // Only set seq when the source has a numeric value. Missing seq must stay absent:\n // defaulting to 1 makes every seq-less folder look \"ordered at position 1\" to\n // sortByNameThenSequence, pinning them all to slot 1 instead of alphabetical sort.\n ...(typeof seq === 'number' && Number.isFinite(seq) ? { seq } : {})\n },\n request: {\n headers: [],\n auth: toBrunoAuth(ocFolder.request?.auth),\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n tests: null\n },\n docs: null\n };\n\n if (ocFolder.request) {\n const folderRequest = folderRoot.request!;\n\n // headers\n const headers = toBrunoHttpHeaders(ocFolder.request.headers);\n if (headers) {\n folderRequest.headers = headers;\n }\n\n // variables\n const variables = toBrunoVariables(ocFolder.request.variables);\n const postResponseVars = toBrunoPostResponseVariables((ocFolder.request as any).actions);\n folderRequest.vars = {\n req: variables.req,\n res: postResponseVars\n };\n\n // scripts\n const scripts = toBrunoScripts(ocFolder.request.scripts);\n if (scripts?.script && folderRequest.script) {\n if (scripts.script.req) {\n folderRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n folderRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n folderRequest.tests = scripts.tests;\n }\n }\n\n // docs (now at root level)\n if (ocFolder.docs) {\n if (typeof ocFolder.docs === 'string' && ocFolder.docs.trim().length) {\n folderRoot.docs = ocFolder.docs;\n } else if (typeof ocFolder.docs === 'object' && ocFolder.docs.content?.trim().length) {\n folderRoot.docs = ocFolder.docs.content;\n }\n }\n\n return folderRoot;\n } catch (error) {\n console.error('Error parsing folder:', error);\n throw error;\n }\n};\n\nexport default parseFolder;\n"],"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","customAlphabet","require","isString","value","isNumber","isNonEmptyString","trim","ensureString","fallback","String","uuid","customNanoId","bruExampleToJson","data","parsed","parentType","parentMethod","bruToJsonV2","requestType","_","get","requestMethod","transformedType","status","statusText","isNaN","Number","name","description","request","method","url","headers","body","mode","response","header","content","log","jsonExampleToBru","BLOCK_KEYS","stringifyYml","obj","lines","YAML","stringify","lineWidth","indent","minContentWidth","defaultStringType","split","result","i","line","startsWith","key","includes","join","parseYml","ymlString","parse","normalizeBoolean","undefined","mapAdditionalParameters","Array","isArray","mapped","placement","toLowerCase","mapSendIn","mappedParam","Boolean","buildClientCredentials","oauth","credentials","clientId","clientSecret","credentialsPlacement","Object","keys","buildTokenConfig","tokenConfig","credentialsId","id","tokenPlacement","tokenHeaderPrefix","query","tokenQueryKey","tokenSource","buildSettings","autoFetchToken","autoRefreshToken","settings","buildResourceOwnerPasswordFlow","flow","accessTokenUrl","refreshTokenUrl","resourceOwner","username","password","buildResourceOwner","scope","accessTokenRequest","token","refreshTokenRequest","refresh","toOpenCollectionOAuth2","buildClientCredentialsFlow","authorizationUrl","callbackUrl","authorizationRequest","authorization","state","pkce","disabled","buildPkce","buildAuthorizationCodeFlow","buildImplicitFlow","warn","reverseAdditionalParameters","reversePlacementMapping","enabled","toOpenCollectionAuth","config","accessKeyId","secretAccessKey","sessionToken","service","region","profileName","buildAwsV4Auth","awsv4","buildBasicAuth","basic","buildBearerAuth","bearer","buildDigestAuth","digest","domain","buildNtlmAuth","ntlm","buildWsseAuth","wsse","buildApiKeyAuth","apikey","consumerKey","consumerSecret","accessToken","accessTokenSecret","verifier","signatureMethod","privateKey","privateKeyType","timestamp","nonce","version","realm","includeBodyHash","buildOAuth1Auth","oauth1","clientToken","baseURL","headersToSign","maxBodySize","buildEdgeGridAuth","akamaiEdgegrid","toBrunoAuth","brunoAuth","edgegrid","brunoOAuth","tempParams","tokenParams","refreshParams","authParams","authCodeFlow","toBrunoOAuth2","toOpenCollectionHttpHeaders","ocHeaders","httpHeader","toBrunoHttpHeaders","brunoHeaders","brunoHeader","uid","toOpenCollectionParams","ocParams","ocParam","toBrunoParams","brunoParams","brunoParam","toOpenCollectionBody","text","xml","sparql","formEntries","formUrlEncoded","entry","formEntry","multipartEntries","multipartForm","multipartEntry","contentType","fileEntries","file","fileEntry","filePath","selected","toBrunoBody","graphql","brunoBody","fileWithDescription","desc","serializeVariableValue","JSON","valueToString","isTypedValue","hasTypedMetadata","v","dataType","toOpenCollectionTypedValue","dataStr","fromOpenCollectionTypedValue","typed","isBrunoVariableDataType","parseValueByDataType","toOpenCollectionVariables","variables","reqVars","req","reqVarsArray","ocVariables","valueStr","variable","toBrunoVariables","res","forEach","base","local","assign","toOpenCollectionActions","resVariables","actions","action","phase","selector","expression","toBrunoPostResponseVariables","resVars","setVarAction","toOpenCollectionScripts","ocScripts","script","code","tests","toBrunoScripts","scripts","brunoScripts","OPERATORS","UNARY_OPERATORS","toOpenCollectionAssertions","assertions","ocAssertions","assertion","operator","str","firstWord","rest","remainingValue","parseAssertionOperator","ocAssertion","toBrunoAssertions","brunoAssertions","valueString","brunoAssertion","toBool","toNumber","utils","toBrunoGrpcMetadata","metadata","brunoMetadata","meta","brunoMeta","parseItem","ocItem","parsedItemYml","itemType","info","runtime","http","grpc","websocket","ensureAuthV3Rc1BackwardsCompatibility","item","Error","ocRequest","brunoRequest","vars","docs","postResponseVars","app","toBrunoApp","brunoItem","seq","tags","fileContent","root","items","examples","filename","pathname","encodeUrl","timeout","followRedirects","maxRedirects","forwardAuthorizationHeader","example","brunoExample","itemUid","parseHttpRequest","parseGraphQLRequest","methodType","protoPath","protoFilePath","rawMessage","message","title","index","parseGrpcRequest","ws","variants","variant","messageData","wsSettings","keepAliveInterval","parseWebsocketRequest","ocScript","ocApp","parseApp","DEFAULT_COLLECTION_FORMAT","SECRET_PROVIDER_IDENTIFIER_FIELDS","parseEnvironment","ocEnvironment","brunoEnvironment","secret","isSecretVariable","color","externalSecrets","identifierField","toBrunoExternalSecrets","stringifyItem","hasRuntime","httpSettings","resolveTimeoutSetting","ocExample","exampleHeaders","exampleParams","exampleBody","statusNum","isInteger","responseHeaders","toOpenCollectionResponseHeaders","contentString","toOpenCollectionApp","stringifyHttpRequest","graphqlBody","hasBody","stringifyGraphqlRequest","metadataItem","messages","stringifyGrpcRequest","hasCustomName","hasContent","msg","stringifyWebsocketRequest","stringifyScript","stringifyApp","hasRequestAuth","folderRoot","hasRequestScripts","stringifyFolder","ocFolder","isFinite","requestDefaults","hasRequestDefaults","ocAuth","ocActions","stringifyEnvironment","environment","secretVar","toOpenCollectionEnvironmentVariables","ocExternalSecrets","toOpenCollectionExternalSecrets","runTask","taskType","format","parseYmlItem","sequence","urlPath","default","appData","transformedJson","toUpperCase","e","selectedMethodType","hasOauth2GrantType","parseBruRequest","stringifyYmlItem","bruJson","jsonToBruV2","stringifyBruRequest","folderRequest","parseYmlFolder","_collectionBruToJson","collectionBruToJson","Promise","reject","parseBruCollection","stringifyYmlFolder","isFolder","collectionBruJson","_jsonToCollectionBru","stringifyBruCollection","parseYmlEnvironment","bru","bruToEnvJsonV2","each","parseBruEnvironment","stringifyYmlEnvironment","envJsonToBruV2","stringifyBruEnvironment","parentPort","on","async","postMessage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"worker-script.js","sources":["../../../src/formats/bru/utils/oauth2-additional-params.ts","../../../src/utils/index.ts","../../../src/formats/bru/index.ts","../../../src/formats/yml/utils.ts","../../../src/formats/yml/common/auth-oauth2.ts","../../../src/formats/yml/common/auth.ts","../../../src/formats/yml/common/headers.ts","../../../src/formats/yml/common/params.ts","../../../src/formats/yml/common/body.ts","../../../src/formats/yml/common/datatype.ts","../../../src/formats/yml/common/variables.ts","../../../src/formats/yml/common/actions.ts","../../../src/formats/yml/common/scripts.ts","../../../src/formats/yml/common/assertions.ts","../../../src/formats/yml/common/omit-headers.ts","../../../src/formats/yml/items/parseHttpRequest.ts","../../../src/formats/yml/items/parseGraphQLRequest.ts","../../../src/formats/yml/items/parseGrpcRequest.ts","../../../src/formats/yml/parseItem.ts","../../../src/formats/yml/common/app.ts","../../../src/formats/yml/items/parseWebsocketRequest.ts","../../../src/formats/yml/items/parseScript.ts","../../../src/formats/yml/items/parseApp.ts","../../../src/constants.ts","../../../src/formats/yml/parseEnvironment.ts","../../../src/formats/yml/stringifyItem.ts","../../../src/formats/yml/items/stringifyHttpRequest.ts","../../../src/formats/yml/items/stringifyGraphQLRequest.ts","../../../src/formats/yml/items/stringifyGrpcRequest.ts","../../../src/formats/yml/items/stringifyWebsocketRequest.ts","../../../src/formats/yml/items/stringifyScript.ts","../../../src/formats/yml/items/stringifyApp.ts","../../../src/formats/yml/stringifyFolder.ts","../../../src/formats/yml/stringifyEnvironment.ts","../../../src/workers/worker-script.ts","../../../src/formats/yml/parseFolder.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 } catch (error) {\n console.error(error);\n console.error('Error while getting the oauth2 additional parameters!');\n }\n\n return additionalParameters;\n};\n","const { customAlphabet } = require('nanoid');\n\nexport const isString = (value: unknown): value is string => typeof value === 'string';\n\nexport const isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const isNonEmptyString = (value: unknown): value is string => isString(value) && value.trim().length > 0;\n\nexport const ensureString = (value: unknown, fallback: string = ''): string => {\n if (value === null || value === undefined) {\n return fallback;\n }\n if (typeof value === 'string') {\n return value;\n }\n return String(value);\n};\n\nexport const uuid = () => {\n // https://github.com/ai/nanoid/blob/main/url-alphabet/index.js\n const urlAlphabet = 'useandom26T198340PX75pxJACKVERYMINDBUSHWOLFGQZbfghjklqvwyzrict';\n const customNanoId = customAlphabet(urlAlphabet, 21);\n\n return customNanoId();\n};\n","import * as _ from 'lodash';\nimport {\n bruToJsonV2,\n jsonToBruV2,\n bruToEnvJsonV2,\n envJsonToBruV2,\n collectionBruToJson as _collectionBruToJson,\n jsonToCollectionBru as _jsonToCollectionBru\n} from '@usebruno/lang';\nimport { getOauth2AdditionalParameters } from './utils/oauth2-additional-params';\nimport { uuid } from '../../utils';\n\nexport const parseBruRequest = (data: string | any, parsed: boolean = false): any => {\n try {\n const json = parsed ? data : bruToJsonV2(data);\n\n if (_.get(json, 'meta.type') === 'app') {\n const seq = _.get(json, 'meta.seq');\n const tags = _.get(json, 'meta.tags', []);\n return {\n type: 'app',\n name: _.get(json, 'meta.name'),\n seq: !_.isNaN(seq) ? Number(seq) : 1,\n tags: Array.isArray(tags) ? tags : [],\n settings: _.get(json, 'settings', {}),\n app: { code: _.get(json, 'app.code', null) },\n request: null\n };\n }\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 tags = _.get(json, 'meta.tags', []);\n const urlPath: Record<typeof requestType, string> = {\n 'grpc-request': 'grpc.url',\n 'ws-request': 'ws.url',\n 'default': 'http.url'\n };\n\n const appData = _.get(json, 'app');\n const app = appData\n ? { code: _.get(appData, 'code', null), enabled: _.get(appData, 'enabled', false) === true }\n : null;\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 app,\n tags: Array.isArray(tags) ? 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('parseBruRequest error', error);\n throw error;\n }\n};\n\nexport const stringifyBruRequest = (json: any): string => {\n try {\n // Standalone app item — emit only meta + the app code block.\n if (_.get(json, 'type') === 'app') {\n const seq = _.get(json, 'seq');\n const bruJson: any = {\n meta: {\n name: _.get(json, 'name'),\n type: 'app',\n seq: !_.isNaN(seq) ? Number(seq) : 1,\n tags: _.get(json, 'tags', [])\n },\n settings: _.get(json, 'settings', {}),\n app: { code: _.get(json, 'app.code', '') }\n };\n return jsonToBruV2(bruJson);\n }\n\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 } else if (type === 'grpc') {\n // For gRPC, add gRPC-specific structure but maintain field names\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 app = _.get(json, 'app');\n if (app && (app.enabled === true || (app.code && app.code.length))) {\n bruJson.app = { code: app.code || null, enabled: app.enabled === true };\n }\n\n const bru = jsonToBruV2(bruJson);\n return bru;\n } catch (error) {\n throw error;\n }\n};\n\nexport const parseBruCollection = (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 stringifyBruCollection = (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 parseBruEnvironment = (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 // bruToEnvJsonV2 emits the nested `externalSecrets: { type, variables: [{ name,\n // <identifier>, enabled }] }`. The app/schema additionally expect a `uid` per variable.\n if (json?.externalSecrets && Array.isArray(json.externalSecrets.variables)) {\n json.externalSecrets.variables = json.externalSecrets.variables.map((v: any) => ({\n uid: uuid(),\n ...v\n }));\n }\n\n return json;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const stringifyBruEnvironment = (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 /**\n * Backward compatibility (pre-v3.0.2 - v3.2.0): Postman imports before PR #6876 stored status/statusText swapped\n * (code: \"OK\", text: \"202\" instead of code: 202, text: \"OK\"). Detect and swap back.\n * TODO(Sid / Shubh): Remove after v5 — all collections should be migrated by then.\n */\n let status = _.get(json, 'response.status', '200');\n let statusText = _.get(json, 'response.statusText', 'OK');\n if (isNaN(Number(status)) && !isNaN(Number(statusText))) {\n [status, statusText] = [statusText, status];\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: Number(status) || 200,\n statusText: 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 * as YAML from 'yaml';\n\n// Top-level keys that should have a blank line before them\nconst BLOCK_KEYS = ['info', 'http', 'graphql', 'grpc', 'websocket', 'mock', 'routes', 'runtime', 'settings', 'examples', 'docs', 'items', 'request'];\n\nexport const stringifyYml = (obj: any): string => {\n const yamlStr = YAML.stringify(obj, {\n lineWidth: 0,\n indent: 2,\n minContentWidth: 0,\n defaultStringType: 'PLAIN'\n });\n\n // Add blank lines before major blocks (only at the top level, not indented)\n const lines = yamlStr.split('\\n');\n const result: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Check if this is a top-level key (no leading whitespace) that should have a blank line\n if (i > 0 && !line.startsWith(' ') && !line.startsWith('\\t')) {\n const key = line.split(':')[0];\n if (BLOCK_KEYS.includes(key)) {\n // Add blank line before this block (if previous line isn't already blank)\n if (result.length > 0 && result[result.length - 1].trim() !== '') {\n result.push('');\n }\n }\n }\n result.push(line);\n }\n\n return result.join('\\n');\n};\n\nexport const parseYml = (ymlString: string): any => {\n return YAML.parse(ymlString);\n};\n","import type {\n AuthOAuth2,\n OAuth2AdditionalParameter,\n OAuth2AuthorizationCodeFlow,\n OAuth2ClientCredentials,\n OAuth2ClientCredentialsFlow,\n OAuth2ImplicitFlow,\n OAuth2PKCE,\n OAuth2ResourceOwner,\n OAuth2ResourceOwnerPasswordFlow,\n OAuth2Settings,\n OAuth2TokenConfig\n} from '@opencollection/types/common/auth';\nimport type {\n OAuth2 as BrunoOAuth2,\n OAuthAdditionalParameter as BrunoOAuthAdditionalParameter\n} from '@usebruno/schema-types/common/auth';\nimport { isString, isNonEmptyString } from '../../../utils';\n\nconst normalizeBoolean = (value?: boolean | null): boolean | undefined =>\n typeof value === 'boolean' ? value : undefined;\n\nconst mapSendIn = (sendIn?: string | null): OAuth2AdditionalParameter['placement'] | undefined => {\n if (!isString(sendIn)) {\n return undefined;\n }\n\n switch (sendIn.trim().toLowerCase()) {\n case 'headers':\n return 'header';\n case 'queryparams':\n return 'query';\n case 'body':\n return 'body';\n default:\n return undefined;\n }\n};\n\nconst mapAdditionalParameters = (params?: BrunoOAuthAdditionalParameter[] | null): OAuth2AdditionalParameter[] | undefined => {\n if (!Array.isArray(params) || params.length === 0) {\n return undefined;\n }\n\n const mapped = params\n .filter((param) => param && isNonEmptyString(param.name))\n .map((param) => {\n const placement = mapSendIn(param!.sendIn);\n if (!placement) {\n return undefined;\n }\n\n const mappedParam: OAuth2AdditionalParameter = {\n name: param!.name!.trim(),\n placement\n };\n\n isNonEmptyString(param!.value) && (mappedParam.value = param.value);\n\n return mappedParam;\n })\n .filter((param): param is OAuth2AdditionalParameter => Boolean(param));\n\n return mapped.length > 0 ? mapped : undefined;\n};\n\nconst buildClientCredentials = (oauth: BrunoOAuth2): OAuth2ClientCredentials | undefined => {\n const credentials: OAuth2ClientCredentials = {};\n\n isNonEmptyString(oauth.clientId) && (credentials.clientId = oauth.clientId);\n isNonEmptyString(oauth.clientSecret) && (credentials.clientSecret = oauth.clientSecret);\n isNonEmptyString(oauth.credentialsPlacement) && (credentials.placement = oauth.credentialsPlacement);\n\n return Object.keys(credentials).length > 0 ? credentials : undefined;\n};\n\nconst buildResourceOwner = (oauth: BrunoOAuth2): OAuth2ResourceOwner | undefined => {\n const resourceOwner: OAuth2ResourceOwner = {};\n\n isNonEmptyString(oauth.username) && (resourceOwner.username = oauth.username);\n isNonEmptyString(oauth.password) && (resourceOwner.password = oauth.password);\n\n return Object.keys(resourceOwner).length > 0 ? resourceOwner : undefined;\n};\n\nconst buildPkce = (pkce?: boolean | null): OAuth2PKCE | undefined => {\n if (pkce === null || pkce === undefined) {\n return undefined;\n }\n\n // If pkce is false, set disabled: true; if true, return empty object (enabled by default)\n return pkce ? {} : { disabled: true };\n};\n\nconst buildTokenConfig = (oauth: BrunoOAuth2): OAuth2TokenConfig | undefined => {\n const tokenConfig: OAuth2TokenConfig = {};\n\n isNonEmptyString(oauth.credentialsId) && (tokenConfig.id = oauth.credentialsId);\n\n if (!isNonEmptyString(oauth.tokenPlacement)) {\n // default to header\n tokenConfig.placement = { header: '' };\n }\n\n if (oauth.tokenPlacement === 'header') {\n tokenConfig.placement = {\n header: oauth.tokenHeaderPrefix as string\n };\n }\n\n if (oauth.tokenPlacement === 'url') {\n tokenConfig.placement = {\n query: oauth.tokenQueryKey as string\n };\n }\n\n tokenConfig.source = oauth.tokenSource || 'access_token';\n\n return Object.keys(tokenConfig).length > 0 ? tokenConfig : undefined;\n};\n\nconst buildSettings = (oauth: BrunoOAuth2): OAuth2Settings | undefined => {\n const autoFetchToken = normalizeBoolean(oauth.autoFetchToken);\n const autoRefreshToken = normalizeBoolean(oauth.autoRefreshToken);\n\n const settings: OAuth2Settings = {};\n if (autoFetchToken !== undefined) settings.autoFetchToken = autoFetchToken;\n if (autoRefreshToken !== undefined) settings.autoRefreshToken = autoRefreshToken;\n\n return Object.keys(settings).length > 0 ? settings : undefined;\n};\n\nconst buildClientCredentialsFlow = (oauth: BrunoOAuth2): OAuth2ClientCredentialsFlow => {\n const flow: OAuth2ClientCredentialsFlow = {\n type: 'oauth2',\n flow: 'client_credentials'\n };\n\n isNonEmptyString(oauth.accessTokenUrl) && (flow.accessTokenUrl = oauth.accessTokenUrl);\n isNonEmptyString(oauth.refreshTokenUrl) && (flow.refreshTokenUrl = oauth.refreshTokenUrl);\n\n const credentials = buildClientCredentials(oauth);\n if (credentials) flow.credentials = credentials;\n\n isNonEmptyString(oauth.scope) && (flow.scope = oauth.scope);\n\n const accessTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.token);\n const refreshTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.refresh);\n\n if (accessTokenRequest || refreshTokenRequest) {\n flow.additionalParameters = {};\n if (accessTokenRequest) {\n flow.additionalParameters.accessTokenRequest = accessTokenRequest;\n }\n if (refreshTokenRequest) {\n flow.additionalParameters.refreshTokenRequest = refreshTokenRequest;\n }\n }\n\n const tokenConfig = buildTokenConfig(oauth);\n if (tokenConfig) flow.tokenConfig = tokenConfig;\n\n const settings = buildSettings(oauth);\n if (settings) flow.settings = settings;\n\n return flow;\n};\n\nconst buildResourceOwnerPasswordFlow = (oauth: BrunoOAuth2): OAuth2ResourceOwnerPasswordFlow => {\n const flow: OAuth2ResourceOwnerPasswordFlow = {\n type: 'oauth2',\n flow: 'resource_owner_password_credentials'\n };\n\n isNonEmptyString(oauth.accessTokenUrl) && (flow.accessTokenUrl = oauth.accessTokenUrl);\n isNonEmptyString(oauth.refreshTokenUrl) && (flow.refreshTokenUrl = oauth.refreshTokenUrl);\n\n const credentials = buildClientCredentials(oauth);\n if (credentials) flow.credentials = credentials;\n\n const resourceOwner = buildResourceOwner(oauth);\n if (resourceOwner) flow.resourceOwner = resourceOwner;\n\n isNonEmptyString(oauth.scope) && (flow.scope = oauth.scope);\n\n const accessTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.token);\n const refreshTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.refresh);\n\n if (accessTokenRequest || refreshTokenRequest) {\n flow.additionalParameters = {};\n if (accessTokenRequest) {\n flow.additionalParameters.accessTokenRequest = accessTokenRequest;\n }\n if (refreshTokenRequest) {\n flow.additionalParameters.refreshTokenRequest = refreshTokenRequest;\n }\n }\n\n const tokenConfig = buildTokenConfig(oauth);\n if (tokenConfig) flow.tokenConfig = tokenConfig;\n\n const settings = buildSettings(oauth);\n if (settings) flow.settings = settings;\n\n return flow;\n};\n\nconst buildAuthorizationCodeFlow = (oauth: BrunoOAuth2): OAuth2AuthorizationCodeFlow => {\n const flow: OAuth2AuthorizationCodeFlow = {\n type: 'oauth2',\n flow: 'authorization_code'\n };\n\n isNonEmptyString(oauth.authorizationUrl) && (flow.authorizationUrl = oauth.authorizationUrl);\n isNonEmptyString(oauth.accessTokenUrl) && (flow.accessTokenUrl = oauth.accessTokenUrl);\n isNonEmptyString(oauth.refreshTokenUrl) && (flow.refreshTokenUrl = oauth.refreshTokenUrl);\n isNonEmptyString(oauth.callbackUrl) && (flow.callbackUrl = oauth.callbackUrl);\n\n const credentials = buildClientCredentials(oauth);\n if (credentials) flow.credentials = credentials;\n\n const authorizationRequest = mapAdditionalParameters(oauth.additionalParameters?.authorization);\n const accessTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.token);\n const refreshTokenRequest = mapAdditionalParameters(oauth.additionalParameters?.refresh);\n\n if (authorizationRequest || accessTokenRequest || refreshTokenRequest) {\n flow.additionalParameters = {};\n if (authorizationRequest) {\n flow.additionalParameters.authorizationRequest = authorizationRequest;\n }\n if (accessTokenRequest) {\n flow.additionalParameters.accessTokenRequest = accessTokenRequest;\n }\n if (refreshTokenRequest) {\n flow.additionalParameters.refreshTokenRequest = refreshTokenRequest;\n }\n }\n\n isNonEmptyString(oauth.scope) && (flow.scope = oauth.scope);\n isNonEmptyString(oauth.state) && (flow.state = oauth.state);\n\n const pkce = buildPkce(oauth.pkce);\n if (pkce) flow.pkce = pkce;\n\n const tokenConfig = buildTokenConfig(oauth);\n if (tokenConfig) flow.tokenConfig = tokenConfig;\n\n const settings = buildSettings(oauth);\n if (settings) flow.settings = settings;\n\n return flow;\n};\n\nconst buildImplicitFlow = (oauth: BrunoOAuth2): OAuth2ImplicitFlow => {\n const flow: OAuth2ImplicitFlow = {\n type: 'oauth2',\n flow: 'implicit'\n };\n\n isNonEmptyString(oauth.authorizationUrl) && (flow.authorizationUrl = oauth.authorizationUrl);\n isNonEmptyString(oauth.callbackUrl) && (flow.callbackUrl = oauth.callbackUrl);\n isNonEmptyString(oauth.clientId) && (flow.credentials = { clientId: oauth.clientId });\n isNonEmptyString(oauth.scope) && (flow.scope = oauth.scope);\n isNonEmptyString(oauth.state) && (flow.state = oauth.state);\n\n const authorizationRequest = mapAdditionalParameters(oauth.additionalParameters?.authorization);\n if (authorizationRequest) {\n flow.additionalParameters = { authorizationRequest };\n }\n\n const tokenConfig = buildTokenConfig(oauth);\n if (tokenConfig) flow.tokenConfig = tokenConfig;\n\n const settings = buildSettings(oauth);\n if (settings) flow.settings = settings;\n\n return flow;\n};\n\nexport const toOpenCollectionOAuth2 = (oauth?: BrunoOAuth2 | null): AuthOAuth2 | undefined => {\n if (!oauth) {\n return undefined;\n }\n\n switch (oauth.grantType) {\n case 'client_credentials':\n return buildClientCredentialsFlow(oauth);\n case 'password':\n return buildResourceOwnerPasswordFlow(oauth);\n case 'authorization_code':\n return buildAuthorizationCodeFlow(oauth);\n case 'implicit':\n return buildImplicitFlow(oauth);\n default:\n console.warn(`toOpenCollectionOAuth2: Unsupported OAuth2 grant type \"${oauth.grantType}\".`);\n return undefined;\n }\n};\n\nconst reversePlacementMapping = (placement?: OAuth2AdditionalParameter['placement']): 'headers' | 'queryparams' | 'body' | null => {\n if (!placement) {\n return null;\n }\n\n switch (placement) {\n case 'header':\n return 'headers';\n case 'query':\n return 'queryparams';\n case 'body':\n return 'body';\n default:\n return null;\n }\n};\n\nconst reverseAdditionalParameters = (params?: OAuth2AdditionalParameter[]): BrunoOAuthAdditionalParameter[] | null => {\n if (!Array.isArray(params) || params.length === 0) {\n return null;\n }\n\n const mapped = params.map((param): BrunoOAuthAdditionalParameter => {\n const sendIn = reversePlacementMapping(param.placement);\n\n return {\n name: param.name || null,\n value: param.value || null,\n sendIn: sendIn || 'headers',\n enabled: true\n };\n });\n\n return mapped.length > 0 ? mapped : null;\n};\n\nexport const toBrunoOAuth2 = (oauth: AuthOAuth2 | null | undefined): BrunoOAuth2 | null => {\n if (!oauth) {\n return null;\n }\n\n const brunoOAuth: BrunoOAuth2 = {\n grantType: 'authorization_code',\n username: null,\n password: null,\n callbackUrl: null,\n authorizationUrl: null,\n accessTokenUrl: null,\n clientId: null,\n clientSecret: null,\n scope: null,\n state: null,\n pkce: false, // Default to false for all grant types\n credentialsPlacement: null,\n credentialsId: null,\n tokenPlacement: null,\n tokenHeaderPrefix: null,\n tokenQueryKey: null,\n tokenSource: 'access_token',\n refreshTokenUrl: null,\n autoRefreshToken: false, // Default to false\n autoFetchToken: true, // Default to true\n additionalParameters: null\n };\n\n switch (oauth.flow) {\n case 'client_credentials':\n brunoOAuth.grantType = 'client_credentials';\n if (oauth.accessTokenUrl) brunoOAuth.accessTokenUrl = oauth.accessTokenUrl;\n if (oauth.refreshTokenUrl) brunoOAuth.refreshTokenUrl = oauth.refreshTokenUrl;\n if (oauth.credentials?.clientId) brunoOAuth.clientId = oauth.credentials.clientId;\n if (oauth.credentials?.clientSecret) brunoOAuth.clientSecret = oauth.credentials.clientSecret;\n if (oauth.credentials?.placement) brunoOAuth.credentialsPlacement = oauth.credentials.placement;\n if (oauth.scope) brunoOAuth.scope = oauth.scope;\n\n // token config\n if (oauth.tokenConfig?.id) brunoOAuth.credentialsId = oauth.tokenConfig.id;\n if (oauth.tokenConfig?.source) brunoOAuth.tokenSource = oauth.tokenConfig.source || 'access_token';\n if (oauth.tokenConfig?.placement) {\n if ('header' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'header';\n brunoOAuth.tokenHeaderPrefix = oauth.tokenConfig.placement.header || '';\n } else if ('query' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'url';\n brunoOAuth.tokenQueryKey = oauth.tokenConfig.placement.query || '';\n }\n }\n\n // additional parameters\n if (oauth.additionalParameters) {\n const tempParams: Record<string, any> = {};\n if (oauth.additionalParameters.accessTokenRequest) {\n const tokenParams = reverseAdditionalParameters(oauth.additionalParameters.accessTokenRequest);\n if (tokenParams) {\n tempParams.token = tokenParams;\n }\n }\n if (oauth.additionalParameters.refreshTokenRequest) {\n const refreshParams = reverseAdditionalParameters(oauth.additionalParameters.refreshTokenRequest);\n if (refreshParams) {\n tempParams.refresh = refreshParams;\n }\n }\n // Only set additionalParameters if there are actual parameters\n if (Object.keys(tempParams).length > 0) {\n brunoOAuth.additionalParameters = tempParams;\n }\n }\n break;\n\n case 'resource_owner_password_credentials':\n brunoOAuth.grantType = 'password';\n if (oauth.accessTokenUrl) brunoOAuth.accessTokenUrl = oauth.accessTokenUrl;\n if (oauth.refreshTokenUrl) brunoOAuth.refreshTokenUrl = oauth.refreshTokenUrl;\n if (oauth.credentials?.clientId) brunoOAuth.clientId = oauth.credentials.clientId;\n if (oauth.credentials?.clientSecret) brunoOAuth.clientSecret = oauth.credentials.clientSecret;\n if (oauth.credentials?.placement) brunoOAuth.credentialsPlacement = oauth.credentials.placement;\n if (oauth.resourceOwner?.username) brunoOAuth.username = oauth.resourceOwner.username;\n if (oauth.resourceOwner?.password) brunoOAuth.password = oauth.resourceOwner.password;\n if (oauth.scope) brunoOAuth.scope = oauth.scope;\n\n // token config\n if (oauth.tokenConfig?.id) brunoOAuth.credentialsId = oauth.tokenConfig.id;\n if (oauth.tokenConfig?.source) brunoOAuth.tokenSource = oauth.tokenConfig.source || 'access_token';\n if (oauth.tokenConfig?.placement) {\n if ('header' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'header';\n brunoOAuth.tokenHeaderPrefix = oauth.tokenConfig.placement.header || '';\n } else if ('query' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'url';\n brunoOAuth.tokenQueryKey = oauth.tokenConfig.placement.query || '';\n }\n }\n\n // additional parameters\n if (oauth.additionalParameters) {\n const tempParams: Record<string, any> = {};\n if (oauth.additionalParameters.accessTokenRequest) {\n const tokenParams = reverseAdditionalParameters(oauth.additionalParameters.accessTokenRequest);\n if (tokenParams) {\n tempParams.token = tokenParams;\n }\n }\n if (oauth.additionalParameters.refreshTokenRequest) {\n const refreshParams = reverseAdditionalParameters(oauth.additionalParameters.refreshTokenRequest);\n if (refreshParams) {\n tempParams.refresh = refreshParams;\n }\n }\n // Only set additionalParameters if there are actual parameters\n if (Object.keys(tempParams).length > 0) {\n brunoOAuth.additionalParameters = tempParams;\n }\n }\n break;\n\n case 'authorization_code':\n brunoOAuth.grantType = 'authorization_code';\n if (oauth.authorizationUrl) brunoOAuth.authorizationUrl = oauth.authorizationUrl;\n if (oauth.accessTokenUrl) brunoOAuth.accessTokenUrl = oauth.accessTokenUrl;\n if (oauth.refreshTokenUrl) brunoOAuth.refreshTokenUrl = oauth.refreshTokenUrl;\n if (oauth.callbackUrl) brunoOAuth.callbackUrl = oauth.callbackUrl;\n if (oauth.credentials?.clientId) brunoOAuth.clientId = oauth.credentials.clientId;\n if (oauth.credentials?.clientSecret) brunoOAuth.clientSecret = oauth.credentials.clientSecret;\n if (oauth.credentials?.placement) brunoOAuth.credentialsPlacement = oauth.credentials.placement;\n if (oauth.scope) brunoOAuth.scope = oauth.scope;\n if (oauth.state) brunoOAuth.state = oauth.state;\n\n // token config\n if (oauth.tokenConfig?.id) brunoOAuth.credentialsId = oauth.tokenConfig.id;\n if (oauth.tokenConfig?.source) brunoOAuth.tokenSource = oauth.tokenConfig.source || 'access_token';\n if (oauth.tokenConfig?.placement) {\n if ('header' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'header';\n brunoOAuth.tokenHeaderPrefix = oauth.tokenConfig.placement.header || '';\n } else if ('query' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'url';\n brunoOAuth.tokenQueryKey = oauth.tokenConfig.placement.query || '';\n }\n }\n\n // additional parameters\n if (oauth.additionalParameters) {\n const tempParams: Record<string, any> = {};\n if (oauth.additionalParameters.authorizationRequest) {\n const authParams = reverseAdditionalParameters(oauth.additionalParameters.authorizationRequest);\n if (authParams) {\n tempParams.authorization = authParams;\n }\n }\n if (oauth.additionalParameters.accessTokenRequest) {\n const tokenParams = reverseAdditionalParameters(oauth.additionalParameters.accessTokenRequest);\n if (tokenParams) {\n tempParams.token = tokenParams;\n }\n }\n if (oauth.additionalParameters.refreshTokenRequest) {\n const refreshParams = reverseAdditionalParameters(oauth.additionalParameters.refreshTokenRequest);\n if (refreshParams) {\n tempParams.refresh = refreshParams;\n }\n }\n // Only set additionalParameters if there are actual parameters\n if (Object.keys(tempParams).length > 0) {\n brunoOAuth.additionalParameters = tempParams;\n }\n }\n break;\n\n case 'implicit':\n brunoOAuth.grantType = 'implicit';\n if (oauth.authorizationUrl) brunoOAuth.authorizationUrl = oauth.authorizationUrl;\n if (oauth.callbackUrl) brunoOAuth.callbackUrl = oauth.callbackUrl;\n if (oauth.credentials?.clientId) brunoOAuth.clientId = oauth.credentials.clientId;\n if (oauth.scope) brunoOAuth.scope = oauth.scope;\n if (oauth.state) brunoOAuth.state = oauth.state;\n\n // token config\n if (oauth.tokenConfig?.id) brunoOAuth.credentialsId = oauth.tokenConfig.id;\n if (oauth.tokenConfig?.source) brunoOAuth.tokenSource = oauth.tokenConfig.source || 'access_token';\n if (oauth.tokenConfig?.placement) {\n if ('header' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'header';\n brunoOAuth.tokenHeaderPrefix = oauth.tokenConfig.placement.header || '';\n } else if ('query' in oauth.tokenConfig.placement) {\n brunoOAuth.tokenPlacement = 'url';\n brunoOAuth.tokenQueryKey = oauth.tokenConfig.placement.query || '';\n }\n }\n\n // additional parameters\n if (oauth.additionalParameters) {\n const tempParams: Record<string, any> = {};\n if (oauth.additionalParameters.authorizationRequest) {\n const authParams = reverseAdditionalParameters(oauth.additionalParameters.authorizationRequest);\n if (authParams) {\n tempParams.authorization = authParams;\n }\n }\n // Only set additionalParameters if there are actual parameters\n if (Object.keys(tempParams).length > 0) {\n brunoOAuth.additionalParameters = tempParams;\n }\n }\n break;\n\n default:\n return null;\n }\n\n if (oauth.settings?.autoFetchToken !== undefined) {\n brunoOAuth.autoFetchToken = oauth.settings.autoFetchToken;\n }\n if (oauth.settings?.autoRefreshToken !== undefined) {\n brunoOAuth.autoRefreshToken = oauth.settings.autoRefreshToken;\n }\n\n if (brunoOAuth.grantType === 'authorization_code' && oauth.flow === 'authorization_code') {\n const authCodeFlow = oauth as OAuth2AuthorizationCodeFlow;\n if (authCodeFlow.pkce !== undefined) {\n // If pkce.disabled is true, set pkce to false; otherwise set to true\n brunoOAuth.pkce = !authCodeFlow.pkce.disabled;\n }\n }\n\n if (brunoOAuth.additionalParameters === null) {\n delete brunoOAuth.additionalParameters;\n }\n\n return brunoOAuth;\n};\n","import type {\n Auth,\n AuthApiKey,\n AuthAwsV4,\n AuthBasic,\n AuthBearer,\n AuthDigest,\n AuthNTLM,\n AuthOAuth1,\n AuthWsse\n} from '@opencollection/types/common/auth';\nimport type { Auth as BrunoAuth, AuthOauth1 as BrunoAuthOauth1 } from '@usebruno/schema-types/common/auth';\nimport { isString } from '../../../utils';\nimport { toOpenCollectionOAuth2, toBrunoOAuth2 } from './auth-oauth2';\n\n// EdgeGrid is a Bruno-specific auth mode that is not part of the OpenCollection spec,\n// so its shape is defined locally and serialized using the same field names as Bruno.\ninterface AkamaiEdgeGridAuthValues {\n type: 'akamai-edgegrid';\n accessToken?: string;\n clientToken?: string;\n clientSecret?: string;\n baseURL?: string | null;\n nonce?: string | null;\n timestamp?: string | null;\n headersToSign?: string | null;\n maxBodySize?: number | null;\n}\n\nconst buildAwsV4Auth = (config?: BrunoAuth['awsv4']): AuthAwsV4 => {\n const auth: AuthAwsV4 = { type: 'awsv4' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.accessKeyId)) auth.accessKeyId = config.accessKeyId;\n if (isString(config.secretAccessKey)) auth.secretAccessKey = config.secretAccessKey;\n if (isString(config.sessionToken)) auth.sessionToken = config.sessionToken;\n if (isString(config.service)) auth.service = config.service;\n if (isString(config.region)) auth.region = config.region;\n if (isString(config.profileName)) auth.profileName = config.profileName;\n\n return auth;\n};\n\nconst buildBasicAuth = (config?: BrunoAuth['basic']): AuthBasic => {\n const auth: AuthBasic = { type: 'basic' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.username)) auth.username = config.username;\n if (isString(config.password)) auth.password = config.password;\n\n return auth;\n};\n\nconst buildBearerAuth = (config?: BrunoAuth['bearer']): AuthBearer => {\n const auth: AuthBearer = { type: 'bearer' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.token)) auth.token = config.token;\n\n return auth;\n};\n\nconst buildDigestAuth = (config?: BrunoAuth['digest']): AuthDigest => {\n const auth: AuthDigest = { type: 'digest' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.username)) auth.username = config.username;\n if (isString(config.password)) auth.password = config.password;\n\n return auth;\n};\n\nconst buildNtlmAuth = (config?: BrunoAuth['ntlm']): AuthNTLM => {\n const auth: AuthNTLM = { type: 'ntlm' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.username)) auth.username = config.username;\n if (isString(config.password)) auth.password = config.password;\n if (isString(config.domain)) auth.domain = config.domain;\n\n return auth;\n};\n\nconst buildWsseAuth = (config?: BrunoAuth['wsse']): AuthWsse => {\n const auth: AuthWsse = { type: 'wsse' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.username)) auth.username = config.username;\n if (isString(config.password)) auth.password = config.password;\n\n return auth;\n};\n\nconst buildApiKeyAuth = (config?: BrunoAuth['apikey']): AuthApiKey => {\n const auth: AuthApiKey = { type: 'apikey' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.key)) auth.key = config.key;\n if (isString(config.value)) auth.value = config.value;\n\n if (isString(config.placement)) {\n if (config.placement === 'header') {\n auth.placement = 'header';\n } else if (config.placement === 'queryparams') {\n auth.placement = 'query';\n }\n }\n\n return auth;\n};\n\nconst buildEdgeGridAuth = (config?: BrunoAuth['akamaiEdgegrid']): AkamaiEdgeGridAuthValues => {\n const auth: AkamaiEdgeGridAuthValues = { type: 'akamai-edgegrid' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.accessToken)) auth.accessToken = config.accessToken;\n if (isString(config.clientToken)) auth.clientToken = config.clientToken;\n if (isString(config.clientSecret)) auth.clientSecret = config.clientSecret;\n if (isString(config.nonce)) auth.nonce = config.nonce;\n if (isString(config.timestamp)) auth.timestamp = config.timestamp;\n if (isString(config.baseURL)) auth.baseURL = config.baseURL;\n if (isString(config.headersToSign)) auth.headersToSign = config.headersToSign;\n if (typeof config.maxBodySize === 'number') auth.maxBodySize = config.maxBodySize;\n\n return auth;\n};\n\nconst buildOAuth1Auth = (config?: BrunoAuth['oauth1']): AuthOAuth1 => {\n const auth: AuthOAuth1 = { type: 'oauth1' };\n\n if (!config) {\n return auth;\n }\n\n if (isString(config.consumerKey)) auth.consumerKey = config.consumerKey;\n if (isString(config.consumerSecret)) auth.consumerSecret = config.consumerSecret;\n if (isString(config.accessToken)) auth.accessToken = config.accessToken;\n if (isString(config.accessTokenSecret)) auth.accessTokenSecret = config.accessTokenSecret;\n if (isString(config.callbackUrl)) auth.callbackUrl = config.callbackUrl;\n if (isString(config.verifier)) auth.verifier = config.verifier;\n if (isString(config.signatureMethod)) auth.signatureMethod = config.signatureMethod;\n if (isString(config.privateKey)) {\n auth.privateKey = config.privateKeyType === 'file'\n ? { type: 'file' as const, value: config.privateKey }\n : { type: 'text' as const, value: config.privateKey };\n }\n if (isString(config.timestamp)) auth.timestamp = config.timestamp;\n if (isString(config.nonce)) auth.nonce = config.nonce;\n if (isString(config.version)) auth.version = config.version;\n if (isString(config.realm)) auth.realm = config.realm;\n if (isString(config.placement)) auth.placement = config.placement as AuthOAuth1['placement'];\n if (typeof config.includeBodyHash === 'boolean') auth.includeBodyHash = config.includeBodyHash;\n\n return auth;\n};\n\nexport const toOpenCollectionAuth = (auth?: BrunoAuth | null): Auth | undefined => {\n if (!auth || auth.mode === 'none') {\n return undefined;\n }\n\n if (auth.mode === 'inherit') {\n return 'inherit';\n }\n\n switch (auth.mode) {\n case 'awsv4':\n return buildAwsV4Auth(auth.awsv4);\n case 'basic':\n return buildBasicAuth(auth.basic);\n case 'bearer':\n return buildBearerAuth(auth.bearer);\n case 'digest':\n return buildDigestAuth(auth.digest);\n case 'ntlm':\n return buildNtlmAuth(auth.ntlm);\n case 'wsse':\n return buildWsseAuth(auth.wsse);\n case 'apikey':\n return buildApiKeyAuth(auth.apikey);\n case 'oauth1':\n return buildOAuth1Auth(auth.oauth1);\n case 'oauth2':\n return toOpenCollectionOAuth2(auth.oauth2);\n case 'akamai-edgegrid':\n return buildEdgeGridAuth(auth.akamaiEdgegrid) as unknown as Auth;\n default:\n console.warn(`toOpenCollectionAuth failed: Unsupported auth mode \"${auth.mode}\".`);\n return undefined;\n }\n};\n\nexport const toBrunoAuth = (auth: Auth | null | undefined): BrunoAuth | null => {\n const brunoAuth: BrunoAuth = {\n mode: 'none',\n awsv4: null,\n basic: null,\n bearer: null,\n digest: null,\n ntlm: null,\n oauth2: null,\n wsse: null,\n apikey: null,\n akamaiEdgegrid: null\n };\n\n if (!auth) {\n return brunoAuth;\n }\n\n if (auth === 'inherit') {\n brunoAuth.mode = 'inherit';\n return brunoAuth;\n }\n\n if ((auth as unknown as AkamaiEdgeGridAuthValues).type === 'akamai-edgegrid') {\n const edgegrid = auth as unknown as AkamaiEdgeGridAuthValues;\n brunoAuth.mode = 'akamai-edgegrid';\n brunoAuth.akamaiEdgegrid = {\n accessToken: edgegrid.accessToken || '',\n clientToken: edgegrid.clientToken || '',\n clientSecret: edgegrid.clientSecret || '',\n nonce: edgegrid.nonce || '',\n timestamp: edgegrid.timestamp || '',\n baseURL: edgegrid.baseURL || '',\n headersToSign: edgegrid.headersToSign || '',\n maxBodySize: typeof edgegrid.maxBodySize === 'number' ? edgegrid.maxBodySize : null\n };\n return brunoAuth;\n }\n\n switch (auth.type) {\n case 'awsv4':\n brunoAuth.mode = 'awsv4';\n brunoAuth.awsv4 = {\n accessKeyId: auth.accessKeyId || null,\n secretAccessKey: auth.secretAccessKey || null,\n sessionToken: auth.sessionToken || null,\n service: auth.service || null,\n region: auth.region || null,\n profileName: auth.profileName || null\n };\n break;\n\n case 'basic':\n brunoAuth.mode = 'basic';\n brunoAuth.basic = {\n username: auth.username || null,\n password: auth.password || null\n };\n break;\n\n case 'bearer':\n brunoAuth.mode = 'bearer';\n brunoAuth.bearer = {\n token: auth.token || ''\n };\n break;\n\n case 'digest':\n brunoAuth.mode = 'digest';\n brunoAuth.digest = {\n username: auth.username || null,\n password: auth.password || null\n };\n break;\n\n case 'ntlm':\n brunoAuth.mode = 'ntlm';\n brunoAuth.ntlm = {\n username: auth.username || null,\n password: auth.password || null,\n domain: auth.domain || null\n };\n break;\n\n case 'wsse':\n brunoAuth.mode = 'wsse';\n brunoAuth.wsse = {\n username: auth.username || null,\n password: auth.password || null\n };\n break;\n\n case 'apikey':\n brunoAuth.mode = 'apikey';\n brunoAuth.apikey = {\n key: auth.key || null,\n value: auth.value || null,\n placement: auth.placement === 'query' ? 'queryparams' : (auth.placement === 'header' ? 'header' : null)\n };\n break;\n\n case 'oauth1':\n brunoAuth.mode = 'oauth1';\n brunoAuth.oauth1 = {\n consumerKey: auth.consumerKey || null,\n consumerSecret: auth.consumerSecret || null,\n accessToken: auth.accessToken || null,\n accessTokenSecret: auth.accessTokenSecret || null,\n callbackUrl: auth.callbackUrl || null,\n verifier: auth.verifier || null,\n signatureMethod: (auth.signatureMethod as BrunoAuthOauth1['signatureMethod']) || 'HMAC-SHA1',\n privateKey: (typeof auth.privateKey === 'object' && auth.privateKey ? auth.privateKey.value : auth.privateKey) || null,\n privateKeyType: (typeof auth.privateKey === 'object' && auth.privateKey ? auth.privateKey.type : 'text') as BrunoAuthOauth1['privateKeyType'],\n timestamp: auth.timestamp || null,\n nonce: auth.nonce || null,\n version: auth.version || '1.0',\n realm: auth.realm || null,\n placement: (auth.placement as BrunoAuthOauth1['placement']) || 'header',\n includeBodyHash: auth.includeBodyHash || false\n };\n break;\n\n case 'oauth2':\n brunoAuth.mode = 'oauth2';\n brunoAuth.oauth2 = toBrunoOAuth2(auth);\n break;\n\n default:\n console.warn('toBrunoAuth failed: Unsupported auth type');\n break;\n }\n\n return brunoAuth;\n};\n","import type { FolderRequest as BrunoFolderRequest } from '@usebruno/schema-types/collection/folder';\nimport type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport type { HttpRequestHeader, HttpResponseHeader } from '@opencollection/types/requests/http';\nimport { uuid, ensureString } from '../../../utils';\n\nexport const toOpenCollectionHttpHeaders = (headers: BrunoFolderRequest['headers']): HttpRequestHeader[] | undefined => {\n if (!headers?.length) {\n return undefined;\n }\n\n const ocHeaders = headers.map((header: BrunoKeyValue): HttpRequestHeader => {\n const httpHeader: HttpRequestHeader = {\n name: header.name || '',\n value: header.value || ''\n };\n if (header?.description?.trim().length) {\n httpHeader.description = header.description;\n }\n if (header.enabled === false) {\n httpHeader.disabled = true;\n }\n return httpHeader;\n });\n\n return ocHeaders.length ? ocHeaders : undefined;\n};\n\nexport const toOpenCollectionResponseHeaders = (headers: BrunoFolderRequest['headers']): HttpResponseHeader[] | undefined => {\n if (!headers?.length) {\n return undefined;\n }\n\n const ocHeaders = headers.map((header: BrunoKeyValue): HttpResponseHeader => ({\n name: header.name || '',\n value: header.value || ''\n }));\n\n return ocHeaders.length ? ocHeaders : undefined;\n};\n\nexport const toBrunoHttpHeaders = (headers: HttpRequestHeader[] | HttpResponseHeader[] | null | undefined): BrunoKeyValue[] | undefined => {\n if (!headers?.length) {\n return undefined;\n }\n\n const brunoHeaders = headers.map((header): BrunoKeyValue => {\n const brunoHeader: BrunoKeyValue = {\n uid: uuid(),\n name: ensureString(header.name),\n value: ensureString(header.value),\n enabled: ('disabled' in header) ? header.disabled !== true : true\n };\n\n if ('description' in header && header.description) {\n brunoHeader.description = typeof header.description === 'string' ? header.description : (header.description as any)?.content || '';\n }\n\n return brunoHeader;\n });\n\n return brunoHeaders.length ? brunoHeaders : undefined;\n};\n","import type { HttpRequestParam as BrunoHttpRequestParam } from '@usebruno/schema-types/requests/http';\nimport type { HttpRequestParam } from '@opencollection/types/requests/http';\nimport { uuid, ensureString } from '../../../utils';\n\nexport const toOpenCollectionParams = (params: BrunoHttpRequestParam[] | null | undefined): HttpRequestParam[] | undefined => {\n if (!params?.length) {\n return undefined;\n }\n\n const ocParams = params.map((param: BrunoHttpRequestParam): HttpRequestParam => {\n const ocParam: HttpRequestParam = {\n name: param.name || '',\n value: param.value || '',\n type: param.type\n };\n\n if (param?.description?.trim().length) {\n ocParam.description = param.description;\n }\n\n if (param.enabled === false) {\n ocParam.disabled = true;\n }\n\n return ocParam;\n });\n\n return ocParams.length ? ocParams : undefined;\n};\n\nexport const toBrunoParams = (params: HttpRequestParam[] | null | undefined): BrunoHttpRequestParam[] | undefined => {\n if (!params?.length) {\n return undefined;\n }\n\n const brunoParams = params.map((param: HttpRequestParam): BrunoHttpRequestParam => {\n const brunoParam: BrunoHttpRequestParam = {\n uid: uuid(),\n name: ensureString(param.name),\n value: ensureString(param.value),\n type: param.type,\n enabled: param.disabled !== true\n };\n\n if (param.description) {\n if (typeof param.description === 'string' && param.description.trim().length) {\n brunoParam.description = param.description;\n } else if (typeof param.description === 'object' && param.description.content?.trim().length) {\n brunoParam.description = param.description.content;\n }\n }\n\n return brunoParam;\n });\n\n return brunoParams.length ? brunoParams : undefined;\n};\n","import type { HttpRequestBody as BrunoHttpRequestBody } from '@usebruno/schema-types/requests/http';\nimport type {\n HttpRequestBody,\n RawBody,\n FormUrlEncodedBody,\n FormUrlEncodedEntry,\n MultipartFormBody,\n MultipartFormEntry,\n FileBody,\n FileBodyVariant\n} from '@opencollection/types/requests/http';\nimport type { FileEntry as BrunoFileEntry } from '@usebruno/schema-types/common/file';\n\nimport type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport { uuid, ensureString } from '../../../utils';\n\nexport const toOpenCollectionBody = (body: BrunoHttpRequestBody | null | undefined): HttpRequestBody | undefined => {\n if (!body) {\n return undefined;\n }\n\n switch (body.mode) {\n case 'none':\n return undefined;\n\n case 'json':\n const rawBody: RawBody = {\n type: 'json',\n data: body.json || ''\n };\n return rawBody;\n\n case 'text':\n const textBody: RawBody = {\n type: 'text',\n data: body.text || ''\n };\n return textBody;\n\n case 'xml':\n const xmlBody: RawBody = {\n type: 'xml',\n data: body.xml || ''\n };\n return xmlBody;\n\n case 'sparql':\n const sparqlBody: RawBody = {\n type: 'sparql',\n data: body.sparql || ''\n };\n return sparqlBody;\n\n case 'formUrlEncoded':\n const formEntries: FormUrlEncodedEntry[] = body.formUrlEncoded?.map((entry: BrunoKeyValue): FormUrlEncodedEntry => {\n const formEntry: FormUrlEncodedEntry = {\n name: entry.name || '',\n value: entry.value || ''\n };\n\n if (entry?.description?.trim().length) {\n formEntry.description = entry.description;\n }\n\n if (entry.enabled === false) {\n formEntry.disabled = true;\n }\n\n return formEntry;\n }) || [];\n\n const formBody: FormUrlEncodedBody = {\n type: 'form-urlencoded',\n ...(formEntries.length > 0 && { data: formEntries })\n } as FormUrlEncodedBody;\n return formBody;\n\n case 'multipartForm':\n const multipartEntries: MultipartFormEntry[] = body.multipartForm?.map((entry): MultipartFormEntry => {\n const multipartEntry: MultipartFormEntry = {\n name: entry.name || '',\n type: entry.type,\n value: entry.value || (entry.type === 'file' ? [] : '')\n };\n\n if (entry?.contentType?.trim().length) {\n multipartEntry.contentType = entry.contentType;\n }\n\n if (entry?.description?.trim().length) {\n multipartEntry.description = entry.description;\n }\n\n if (entry.enabled === false) {\n multipartEntry.disabled = true;\n }\n\n return multipartEntry;\n }) || [];\n\n const multipartBody: MultipartFormBody = {\n type: 'multipart-form',\n ...(multipartEntries.length > 0 && { data: multipartEntries })\n } as MultipartFormBody;\n return multipartBody;\n\n case 'file':\n const fileEntries: FileBodyVariant[] = body.file?.map((file): FileBodyVariant => {\n const fileEntry: FileBodyVariant = {\n filePath: file.filePath || '',\n contentType: file.contentType || '',\n selected: file.selected ?? false\n };\n\n if (file?.description?.trim().length) {\n fileEntry.description = file.description;\n }\n\n return fileEntry;\n }) || [];\n\n const fileBody: FileBody = {\n type: 'file',\n ...(fileEntries.length > 0 && { data: fileEntries })\n } as FileBody;\n return fileBody;\n\n case 'graphql':\n // GraphQL body is handled separately in GraphQL request stringify\n return undefined;\n\n default:\n return undefined;\n }\n};\n\nexport const toBrunoBody = (body: HttpRequestBody | null | undefined): BrunoHttpRequestBody | undefined => {\n if (!body) {\n return {\n mode: 'none',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: [],\n multipartForm: [],\n graphql: null,\n file: []\n };\n }\n\n const brunoBody: BrunoHttpRequestBody = {\n mode: 'none',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: [],\n multipartForm: [],\n graphql: null,\n file: []\n };\n\n switch (body.type) {\n case 'json':\n brunoBody.mode = 'json';\n brunoBody.json = body.data || '';\n break;\n\n case 'text':\n brunoBody.mode = 'text';\n brunoBody.text = body.data || '';\n break;\n\n case 'xml':\n brunoBody.mode = 'xml';\n brunoBody.xml = body.data || '';\n break;\n\n case 'sparql':\n brunoBody.mode = 'sparql';\n brunoBody.sparql = body.data || '';\n break;\n\n case 'form-urlencoded':\n brunoBody.mode = 'formUrlEncoded';\n brunoBody.formUrlEncoded = body.data?.map((entry): BrunoKeyValue => {\n const formEntry: BrunoKeyValue = {\n uid: uuid(),\n name: ensureString(entry.name),\n value: ensureString(entry.value),\n enabled: entry.disabled !== true\n };\n\n if (entry.description) {\n if (typeof entry.description === 'string' && entry.description.trim().length) {\n formEntry.description = entry.description;\n } else if (typeof entry.description === 'object' && entry.description.content?.trim().length) {\n formEntry.description = entry.description.content;\n }\n }\n\n return formEntry;\n }) || [];\n break;\n\n case 'multipart-form':\n brunoBody.mode = 'multipartForm';\n brunoBody.multipartForm = body.data?.map((entry): any => {\n const multipartEntry: any = {\n uid: uuid(),\n type: entry.type,\n name: ensureString(entry.name),\n value: entry.type === 'file' ? (entry.value || []) : ensureString(entry.value),\n contentType: entry.contentType || null,\n enabled: entry.disabled !== true\n };\n\n if (entry.description) {\n if (typeof entry.description === 'string' && entry.description.trim().length) {\n multipartEntry.description = entry.description;\n } else if (typeof entry.description === 'object' && entry.description.content?.trim().length) {\n multipartEntry.description = entry.description.content;\n }\n }\n\n return multipartEntry;\n }) || [];\n break;\n\n case 'file':\n brunoBody.mode = 'file';\n brunoBody.file = body.data?.map((file): BrunoFileEntry => {\n const fileEntry: BrunoFileEntry = {\n uid: uuid(),\n filePath: file.filePath || '',\n contentType: file.contentType || '',\n selected: file.selected ?? false\n };\n\n const fileWithDescription = file as FileBodyVariant;\n const desc = typeof fileWithDescription.description === 'string'\n ? fileWithDescription.description\n : (fileWithDescription.description as { content?: string } | undefined)?.content;\n if (desc && desc.trim().length) fileEntry.description = desc;\n\n return fileEntry;\n }) || [];\n break;\n\n default:\n break;\n }\n\n return brunoBody;\n};\n","import type { VariableTypedValue } from '@opencollection/types/common/variables';\nimport {\n parseValueByDataType,\n BrunoVariableDataType,\n isBrunoVariableDataType,\n valueToString\n} from '@usebruno/common/utils';\n\nexport { BrunoVariableDataType, isBrunoVariableDataType };\n\nexport const serializeVariableValue = (value: unknown): string => {\n if (value !== null && typeof value === 'object') {\n return JSON.stringify(value, null, 2);\n }\n return valueToString(value);\n};\n\nexport const isTypedValue = (value: unknown): value is VariableTypedValue => {\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && 'type' in value\n && 'data' in value;\n};\n\nexport interface TypedVariableFields {\n dataType?: BrunoVariableDataType;\n}\n\nexport const hasTypedMetadata = (v: TypedVariableFields): boolean => {\n return !!v.dataType && v.dataType !== 'string';\n};\n\nexport const toOpenCollectionTypedValue = (\n v: TypedVariableFields,\n dataStr: string\n): VariableTypedValue => {\n return {\n type: (v.dataType || 'string') as VariableTypedValue['type'],\n data: dataStr\n };\n};\n\n// `'string'` is the implicit default — omitted from the result.\nexport const fromOpenCollectionTypedValue = (\n typed: VariableTypedValue\n): { value: any } & TypedVariableFields => {\n const dataStr = typeof typed.data === 'string' ? typed.data : String(typed.data ?? '');\n const dataType: BrunoVariableDataType = isBrunoVariableDataType(typed.type) ? typed.type : 'string';\n const result: { value: any } & TypedVariableFields = {\n value: parseValueByDataType(dataStr, dataType)\n };\n if (dataType !== 'string') {\n result.dataType = dataType;\n }\n return result;\n};\n","import { Variable, VariableTypedValue } from '@opencollection/types/common/variables';\nimport { FolderRequest as BrunoFolderRequest } from '@usebruno/schema-types/collection/folder';\nimport { Variable as BrunoVariable, Variables as BrunoVariables } from '@usebruno/schema-types/common/variables';\nimport { uuid, ensureString } from '../../../utils';\nimport {\n isTypedValue,\n hasTypedMetadata,\n toOpenCollectionTypedValue,\n fromOpenCollectionTypedValue,\n serializeVariableValue\n} from './datatype';\n\n/**\n * Convert Bruno pre-request variables to OpenCollection variables format.\n * Note: Post-response variables are now converted to actions (see actions.ts).\n */\nexport const toOpenCollectionVariables = (variables: BrunoFolderRequest['vars'] | BrunoVariables | null | undefined): Variable[] | undefined => {\n // Handle folder variables (has req/res structure) - only use req vars\n const hasReqRes = variables && 'req' in variables;\n const reqVars = hasReqRes ? variables.req : variables as BrunoVariables;\n\n const reqVarsArray = Array.isArray(reqVars) ? reqVars : [];\n\n if (!reqVarsArray.length) {\n return undefined;\n }\n\n const ocVariables: Variable[] = reqVarsArray.map((v: BrunoVariable): Variable => {\n const valueStr = serializeVariableValue(v.value);\n const variable: Variable = {\n name: v.name || '',\n value: hasTypedMetadata(v) ? toOpenCollectionTypedValue(v, valueStr) : valueStr\n };\n\n if (v?.description?.trim().length) {\n variable.description = v.description;\n }\n\n if (v.enabled === false) {\n variable.disabled = true;\n }\n return variable;\n });\n\n return ocVariables.length > 0 ? ocVariables : undefined;\n};\n\n/**\n * Convert OpenCollection variables to Bruno pre-request variables format.\n * Note: Post-response variables come from actions (see actions.ts).\n */\nexport const toBrunoVariables = (variables: Variable[] | null | undefined): { req: BrunoVariables; res: BrunoVariables } => {\n if (!variables?.length) {\n return { req: [], res: [] };\n }\n\n const reqVars: BrunoVariables = [];\n\n variables.forEach((v: Variable) => {\n const base: BrunoVariable = {\n uid: uuid(),\n name: ensureString(v.name),\n value: '',\n enabled: v.disabled !== true,\n local: false\n };\n\n if (isTypedValue(v.value)) {\n Object.assign(base, fromOpenCollectionTypedValue(v.value));\n } else {\n base.value = ensureString(v.value);\n }\n\n if (v.description) {\n base.description = typeof v.description === 'string' ? v.description : (v.description as any)?.content || '';\n }\n\n reqVars.push(base);\n });\n\n return { req: reqVars, res: [] };\n};\n","import type { Action, ActionSetVariable, ActionVariableScope } from '@opencollection/types/common/actions';\nimport type { Variable as BrunoVariable, Variables as BrunoVariables } from '@usebruno/schema-types/common/variables';\nimport { uuid, ensureString } from '../../../utils';\n\n/**\n * Convert Bruno post-response variables to OpenCollection actions.\n * Post-response variables in Bruno are converted to 'set-variable' actions\n * with phase 'after-response'.\n */\nexport const toOpenCollectionActions = (resVariables: BrunoVariables | null | undefined): Action[] | undefined => {\n if (!resVariables?.length) {\n return undefined;\n }\n\n const actions: Action[] = resVariables.map((v: BrunoVariable): ActionSetVariable => {\n const action: ActionSetVariable = {\n type: 'set-variable',\n phase: 'after-response',\n selector: {\n expression: ensureString(v.value),\n method: 'jsonq'\n },\n variable: {\n name: v.name || '',\n scope: v.local ? 'request' : 'runtime' as ActionVariableScope\n }\n };\n\n if (v.description?.trim().length) {\n action.description = v.description;\n }\n\n if (v.enabled === false) {\n action.disabled = true;\n }\n\n return action;\n });\n\n return actions.length > 0 ? actions : undefined;\n};\n\n/**\n * Convert OpenCollection actions to Bruno post-response variables.\n * Only 'set-variable' actions with phase 'after-response' are converted.\n */\nexport const toBrunoPostResponseVariables = (actions: Action[] | null | undefined): BrunoVariables => {\n if (!actions?.length) {\n return [];\n }\n\n const resVars: BrunoVariables = [];\n\n actions.forEach((action: Action) => {\n // Only process 'set-variable' actions with 'after-response' phase\n if (action.type === 'set-variable' && action.phase === 'after-response') {\n const setVarAction = action as ActionSetVariable;\n\n const variable: BrunoVariable = {\n uid: uuid(),\n name: ensureString(setVarAction.variable?.name),\n value: ensureString(setVarAction.selector?.expression),\n enabled: setVarAction.disabled !== true,\n local: false\n };\n\n if (setVarAction.description) {\n variable.description = typeof setVarAction.description === 'string'\n ? setVarAction.description\n : (setVarAction.description as any)?.content || '';\n }\n\n resVars.push(variable);\n }\n });\n\n return resVars;\n};\n","import type { Script as OpenCollectionScript, Scripts } from '@opencollection/types/common/scripts';\nimport type { FolderRequest as BrunoFolderRequest } from '@usebruno/schema-types/collection/folder';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { WebSocketRequest as BrunoWebSocketRequest } from '@usebruno/schema-types/requests/websocket';\nimport type { GrpcRequest as BrunoGrpcRequest } from '@usebruno/schema-types/requests/grpc';\nimport type { Script as BrunoScript } from '@usebruno/schema-types/common/scripts';\n\nexport const toOpenCollectionScripts = (request: BrunoFolderRequest | BrunoHttpRequest | BrunoWebSocketRequest | BrunoGrpcRequest | null | undefined, allowedKeys: string[]): Scripts | undefined => {\n const ocScripts: Scripts = [];\n const script = request?.script as BrunoScript | null | undefined;\n\n const pushScript = (key: keyof BrunoScript, type: OpenCollectionScript['type'], code: string | null | undefined) => {\n if (!allowedKeys.includes(key)) {\n return;\n }\n if (!code?.trim().length) {\n return;\n }\n ocScripts.push({ type, code: code.trim() });\n };\n\n pushScript('req', 'before-request', script?.req);\n pushScript('res', 'after-response', script?.res);\n pushScript('beforeCallStart', 'grpc:before-call-start', script?.beforeCallStart);\n pushScript('beforeMessageSend', 'grpc:before-message-send', script?.beforeMessageSend);\n pushScript('afterMessageReceive', 'grpc:after-message-receive', script?.afterMessageReceive);\n pushScript('afterCallEnd', 'grpc:after-call-end', script?.afterCallEnd);\n\n if (request?.tests?.trim().length) {\n ocScripts.push({\n type: 'tests',\n code: request.tests.trim()\n });\n }\n\n return ocScripts.length > 0 ? ocScripts : undefined;\n};\n\nexport const toBrunoScripts = (scripts: Scripts | null | undefined): {\n script?: BrunoScript;\n tests?: string;\n} | undefined => {\n if (!scripts || !Array.isArray(scripts) || scripts.length === 0) {\n return undefined;\n }\n\n const brunoScripts: {\n script?: BrunoScript;\n tests?: string;\n } = {};\n\n const setScript = (key: keyof BrunoScript, code: string) => {\n if (!brunoScripts.script) {\n brunoScripts.script = {};\n }\n brunoScripts.script[key] = code;\n };\n\n for (const script of scripts) {\n if (!script.code) {\n continue;\n }\n\n switch (script.type) {\n case 'before-request':\n setScript('req', script.code);\n break;\n case 'after-response':\n setScript('res', script.code);\n break;\n case 'grpc:before-call-start':\n setScript('beforeCallStart', script.code);\n break;\n case 'grpc:before-message-send':\n setScript('beforeMessageSend', script.code);\n break;\n case 'grpc:after-message-receive':\n setScript('afterMessageReceive', script.code);\n break;\n case 'grpc:after-call-end':\n setScript('afterCallEnd', script.code);\n break;\n case 'tests':\n brunoScripts.tests = script.code;\n break;\n }\n }\n\n return Object.keys(brunoScripts).length > 0 ? brunoScripts : undefined;\n};\n","import type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport type { Assertion } from '@opencollection/types/common/assertions';\nimport { uuid, ensureString } from '../../../utils';\n\nconst OPERATORS = [\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'in',\n 'notIn',\n 'contains',\n 'notContains',\n 'length',\n 'matches',\n 'notMatches',\n 'startsWith',\n 'endsWith',\n 'between',\n 'isEmpty',\n 'isNotEmpty',\n 'isNull',\n 'isUndefined',\n 'isDefined',\n 'isTruthy',\n 'isFalsy',\n 'isJson',\n 'isNumber',\n 'isString',\n 'isBoolean',\n 'isArray'\n] as const;\n\nconst UNARY_OPERATORS = [\n 'isEmpty',\n 'isNotEmpty',\n 'isNull',\n 'isUndefined',\n 'isDefined',\n 'isTruthy',\n 'isFalsy',\n 'isJson',\n 'isNumber',\n 'isString',\n 'isBoolean',\n 'isArray'\n] as const;\n\ntype Operator = typeof OPERATORS[number];\n\nconst parseAssertionOperator = (str: string = ''): { operator: Operator; value: string | undefined } => {\n if (!str || typeof str !== 'string' || !str.length) {\n return {\n operator: 'eq',\n value: str\n };\n }\n\n const [firstWord, ...rest] = str.trim().split(' ');\n const remainingValue = rest.join(' ');\n\n // Check if first word is a unary operator\n if (UNARY_OPERATORS.includes(firstWord as any)) {\n return {\n operator: firstWord as Operator,\n value: undefined\n };\n }\n\n // Check if first word is any recognized operator\n if (OPERATORS.includes(firstWord as any)) {\n return {\n operator: firstWord as Operator,\n value: remainingValue\n };\n }\n\n // If not a recognized operator, treat the whole string as value with 'eq' operator\n return {\n operator: 'eq',\n value: str\n };\n};\n\nexport const toOpenCollectionAssertions = (assertions: BrunoKeyValue[] | null | undefined): Assertion[] | undefined => {\n if (!assertions?.length) {\n return undefined;\n }\n\n const ocAssertions: Assertion[] = assertions.map((assertion: BrunoKeyValue): Assertion => {\n const { operator, value } = parseAssertionOperator(assertion.value || '');\n\n const ocAssertion: Assertion = {\n expression: assertion.name || '',\n operator,\n ...(value !== undefined && { value })\n };\n\n if (assertion?.description?.trim().length) {\n ocAssertion.description = assertion.description;\n }\n\n if (assertion.enabled === false) {\n ocAssertion.disabled = true;\n }\n\n return ocAssertion;\n });\n\n return ocAssertions.length > 0 ? ocAssertions : undefined;\n};\n\nexport const toBrunoAssertions = (assertions: Assertion[] | null | undefined): BrunoKeyValue[] | undefined => {\n if (!assertions?.length) {\n return undefined;\n }\n\n const brunoAssertions: BrunoKeyValue[] = assertions.map((assertion: Assertion): BrunoKeyValue => {\n // Reconstruct the \"operator value\" format that Bruno uses\n let valueString = ensureString(assertion.operator);\n if (assertion.value !== undefined && assertion.value !== null) {\n valueString = `${assertion.operator} ${ensureString(assertion.value)}`;\n }\n\n const brunoAssertion: BrunoKeyValue = {\n uid: uuid(),\n name: ensureString(assertion.expression),\n value: valueString,\n enabled: assertion.disabled !== true\n };\n\n if (assertion.description) {\n if (typeof assertion.description === 'string' && assertion.description.trim().length) {\n brunoAssertion.description = assertion.description;\n } else if (typeof assertion.description === 'object' && assertion.description.content?.trim().length) {\n brunoAssertion.description = assertion.description.content;\n }\n }\n\n return brunoAssertion;\n });\n\n return brunoAssertions.length > 0 ? brunoAssertions : undefined;\n};\n","/** Trim omitHeaders; return undefined when there is nothing to save. */\nexport const normalizeOmitHeaders = (omitHeaders: unknown): string[] | undefined => {\n if (!Array.isArray(omitHeaders) || !omitHeaders.length) {\n return undefined;\n }\n\n const names = omitHeaders\n .map((name) => (typeof name === 'string' ? name.trim() : ''))\n .filter((name) => name.length > 0);\n\n return names.length ? names : undefined;\n};\n","import type { Item as BrunoItem, HttpItemSettings as BrunoHttpItemSettings } from '@usebruno/schema-types/collection/item';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { HttpRequest, HttpRequestBody } from '@opencollection/types/requests/http';\nimport { toBrunoAuth } from '../common/auth';\nimport { toBrunoHttpHeaders } from '../common/headers';\nimport { toBrunoParams } from '../common/params';\nimport { toBrunoBody } from '../common/body';\nimport { toBrunoVariables } from '../common/variables';\nimport { toBrunoPostResponseVariables } from '../common/actions';\nimport { toBrunoScripts } from '../common/scripts';\nimport { toBrunoAssertions } from '../common/assertions';\nimport { toBrunoApp } from '../common/app';\nimport { normalizeOmitHeaders } from '../common/omit-headers';\nimport { uuid, ensureString } from '../../../utils';\nimport { utils } from '@usebruno/common';\nconst { toBool, toMaxRedirects } = utils;\n\nconst parseHttpRequest = (ocRequest: HttpRequest): BrunoItem => {\n const info = ocRequest.info;\n const http = ocRequest.http;\n const runtime = ocRequest.runtime;\n\n const brunoRequest: BrunoHttpRequest = {\n url: ensureString(http?.url),\n method: ensureString(http?.method, 'GET'),\n headers: toBrunoHttpHeaders(http?.headers) || [],\n params: toBrunoParams(http?.params) || [],\n auth: toBrunoAuth(http?.auth),\n body: toBrunoBody(http?.body as HttpRequestBody) || {\n mode: 'none',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: [],\n multipartForm: [],\n graphql: null,\n file: []\n },\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n assertions: [],\n tests: null,\n docs: null\n };\n\n // scripts\n const scripts = toBrunoScripts(runtime?.scripts);\n if (scripts?.script && brunoRequest.script) {\n if (scripts.script.req) {\n brunoRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n brunoRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n brunoRequest.tests = scripts.tests;\n }\n\n // variables (pre-request from variables, post-response from actions)\n const variables = toBrunoVariables(runtime?.variables);\n const postResponseVars = toBrunoPostResponseVariables(runtime?.actions);\n brunoRequest.vars = {\n req: variables.req,\n res: postResponseVars\n };\n\n // assertions\n const assertions = toBrunoAssertions(runtime?.assertions);\n if (assertions) {\n brunoRequest.assertions = assertions;\n }\n\n // docs\n if (ocRequest.docs) {\n brunoRequest.docs = ocRequest.docs;\n }\n\n // app\n const app = toBrunoApp((ocRequest as any).app);\n\n // bruno item\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'http-request',\n seq: info?.seq || 1,\n name: ensureString(info?.name, 'Untitled Request'),\n tags: info?.tags || [],\n request: brunoRequest,\n settings: null,\n app,\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n // description\n if (info?.description) {\n const desc = typeof info.description === 'string' ? info.description : (info.description as any)?.content || '';\n if (desc.trim().length) {\n brunoItem.description = desc;\n }\n }\n\n // settings\n if (ocRequest.settings) {\n const settings: BrunoHttpItemSettings = {};\n\n settings.encodeUrl = toBool(ocRequest.settings.encodeUrl, true);\n\n if (typeof ocRequest.settings.timeout === 'number') {\n settings.timeout = ocRequest.settings.timeout;\n } else if (ocRequest.settings.timeout === 'inherit') {\n settings.timeout = 'inherit';\n } else {\n settings.timeout = 0;\n }\n\n settings.followRedirects = toBool(ocRequest.settings.followRedirects, true);\n settings.maxRedirects = toMaxRedirects(ocRequest.settings.maxRedirects);\n settings.forwardAuthorizationHeader = toBool(ocRequest.settings.forwardAuthorizationHeader, true);\n\n const omitHeaders = normalizeOmitHeaders(ocRequest.settings.omitHeaders);\n if (omitHeaders) {\n settings.omitHeaders = omitHeaders;\n }\n\n brunoItem.settings = settings;\n }\n\n // examples\n if (ocRequest.examples?.length) {\n brunoItem.examples = ocRequest.examples.map((example) => {\n const brunoExample: any = {\n uid: uuid(),\n itemUid: uuid(),\n name: ensureString(example.name, 'Untitled Example'),\n type: 'http-request',\n request: null,\n response: null\n };\n\n if (example.description) {\n if (typeof example.description === 'string' && example.description.trim().length) {\n brunoExample.description = example.description;\n } else if (typeof example.description === 'object' && example.description.content?.trim().length) {\n brunoExample.description = example.description.content;\n }\n }\n\n if (example.request) {\n brunoExample.request = {\n url: ensureString(example.request.url),\n method: ensureString(example.request.method, 'GET'),\n headers: toBrunoHttpHeaders(example.request.headers) || [],\n params: toBrunoParams(example.request.params) || [],\n body: toBrunoBody(example.request.body) || {\n mode: 'none',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: null,\n multipartForm: null,\n graphql: null,\n file: null\n }\n };\n }\n\n if (example.response) {\n brunoExample.response = {\n status: typeof example.response.status === 'number' ? example.response.status\n : example.response.status !== undefined ? Number(example.response.status) : null,\n statusText: example.response.statusText || null,\n headers: toBrunoHttpHeaders(example.response.headers) || [],\n body: null\n };\n\n if (example.response.body) {\n brunoExample.response.body = {\n type: example.response.body.type || 'text',\n content: example.response.body.data || ''\n };\n }\n }\n\n return brunoExample;\n });\n }\n\n return brunoItem;\n};\n\nexport default parseHttpRequest;\n","import type { Item as BrunoItem, HttpItemSettings as BrunoHttpItemSettings } from '@usebruno/schema-types/collection/item';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { GraphQLRequest, GraphQLRequestSettings, GraphQLBody } from '@opencollection/types/requests/graphql';\nimport { toBrunoAuth } from '../common/auth';\nimport { toBrunoHttpHeaders } from '../common/headers';\nimport { toBrunoParams } from '../common/params';\nimport { toBrunoVariables } from '../common/variables';\nimport { toBrunoPostResponseVariables } from '../common/actions';\nimport { toBrunoScripts } from '../common/scripts';\nimport { toBrunoAssertions } from '../common/assertions';\nimport { uuid, ensureString } from '../../../utils';\nimport { utils } from '@usebruno/common';\nconst { toBool, toMaxRedirects } = utils;\n\nconst parseGraphQLRequest = (ocRequest: GraphQLRequest): BrunoItem => {\n const info = ocRequest.info;\n const graphql = ocRequest.graphql;\n const runtime = ocRequest.runtime;\n\n const brunoRequest: BrunoHttpRequest = {\n url: ensureString(graphql?.url),\n method: ensureString(graphql?.method, 'POST'),\n headers: toBrunoHttpHeaders(graphql?.headers) || [],\n params: toBrunoParams(graphql?.params) || [],\n auth: toBrunoAuth(graphql?.auth),\n body: {\n mode: 'graphql',\n json: null,\n text: null,\n xml: null,\n sparql: null,\n formUrlEncoded: [],\n multipartForm: [],\n graphql: {\n query: (graphql?.body as GraphQLBody)?.query || '',\n variables: (graphql?.body as GraphQLBody)?.variables || ''\n },\n file: []\n },\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n assertions: [],\n tests: null,\n docs: null\n };\n\n // scripts\n const scripts = toBrunoScripts(runtime?.scripts);\n if (scripts?.script && brunoRequest.script) {\n if (scripts.script.req) {\n brunoRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n brunoRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n brunoRequest.tests = scripts.tests;\n }\n\n // variables (pre-request from variables, post-response from actions)\n const variables = toBrunoVariables(runtime?.variables);\n const postResponseVars = toBrunoPostResponseVariables(runtime?.actions);\n brunoRequest.vars = {\n req: variables.req,\n res: postResponseVars\n };\n\n // assertions\n const assertions = toBrunoAssertions(runtime?.assertions);\n if (assertions) {\n brunoRequest.assertions = assertions;\n }\n\n // docs\n if (ocRequest.docs) {\n brunoRequest.docs = ocRequest.docs;\n }\n\n // bruno item\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'graphql-request',\n seq: info?.seq || 1,\n name: ensureString(info?.name, 'Untitled Request'),\n tags: info?.tags || [],\n request: brunoRequest,\n settings: null,\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n // description\n if (info?.description) {\n const desc = typeof info.description === 'string' ? info.description : (info.description as any)?.content || '';\n if (desc.trim().length) {\n brunoItem.description = desc;\n }\n }\n\n // settings\n if (ocRequest.settings) {\n const settings: BrunoHttpItemSettings = {};\n\n settings.encodeUrl = toBool(ocRequest.settings.encodeUrl, true);\n\n if (typeof ocRequest.settings.timeout === 'number') {\n settings.timeout = ocRequest.settings.timeout;\n } else if (ocRequest.settings.timeout === 'inherit') {\n settings.timeout = 'inherit';\n } else {\n settings.timeout = 0;\n }\n\n settings.followRedirects = toBool(ocRequest.settings.followRedirects, true);\n settings.maxRedirects = toMaxRedirects(ocRequest.settings.maxRedirects);\n settings.forwardAuthorizationHeader = toBool(ocRequest.settings.forwardAuthorizationHeader, true);\n\n brunoItem.settings = settings;\n }\n\n return brunoItem;\n};\n\nexport default parseGraphQLRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { GrpcRequest as BrunoGrpcRequest } from '@usebruno/schema-types/requests/grpc';\nimport type { GrpcRequest, GrpcMetadata, GrpcMessageVariant } from '@opencollection/types/requests/grpc';\nimport type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport { toBrunoAuth } from '../common/auth';\nimport { toBrunoVariables } from '../common/variables';\nimport { toBrunoScripts } from '../common/scripts';\nimport { toBrunoAssertions } from '../common/assertions';\nimport { isNonEmptyString, uuid, ensureString } from '../../../utils';\n\nconst toBrunoGrpcMetadata = (metadata: GrpcMetadata[] | null | undefined): BrunoKeyValue[] | undefined => {\n if (!metadata?.length) {\n return undefined;\n }\n\n const brunoMetadata = metadata.map((meta: GrpcMetadata): BrunoKeyValue => {\n const brunoMeta: BrunoKeyValue = {\n uid: uuid(),\n name: ensureString(meta.name),\n value: ensureString(meta.value),\n enabled: meta.disabled !== true\n };\n\n if (meta.description) {\n const desc = typeof meta.description === 'string' ? meta.description : (meta.description as any)?.content || '';\n if (desc.trim().length) {\n brunoMeta.description = desc;\n }\n }\n\n return brunoMeta;\n });\n\n return brunoMetadata.length ? brunoMetadata : undefined;\n};\n\nconst parseGrpcRequest = (ocRequest: GrpcRequest): BrunoItem => {\n const info = ocRequest.info;\n const grpc = ocRequest.grpc;\n const runtime = ocRequest.runtime;\n\n const brunoRequest: BrunoGrpcRequest = {\n url: ensureString(grpc?.url),\n method: ensureString(grpc?.method),\n methodType: grpc?.methodType || '',\n protoPath: grpc?.protoFilePath || null,\n headers: toBrunoGrpcMetadata(grpc?.metadata) || [],\n auth: toBrunoAuth(grpc?.auth),\n body: {\n mode: 'grpc',\n grpc: []\n },\n script: {\n beforeCallStart: null,\n beforeMessageSend: null,\n afterMessageReceive: null,\n afterCallEnd: null\n },\n vars: {\n req: [],\n res: []\n },\n assertions: [],\n tests: null,\n docs: null\n };\n\n // message\n const rawMessage = grpc?.message;\n if (Array.isArray(rawMessage)) {\n brunoRequest.body.grpc = (rawMessage as GrpcMessageVariant[]).map(({ title, message }, index) => ({\n name: title || `message ${index + 1}`,\n content: ensureString(message)\n }));\n } else if (isNonEmptyString(rawMessage)) {\n brunoRequest.body.grpc = [{\n name: '',\n content: rawMessage as string\n }];\n }\n\n // scripts\n const scripts = toBrunoScripts(runtime?.scripts);\n if (scripts?.script && brunoRequest.script) {\n if (scripts.script.beforeCallStart) {\n brunoRequest.script.beforeCallStart = scripts.script.beforeCallStart;\n }\n if (scripts.script.beforeMessageSend) {\n brunoRequest.script.beforeMessageSend = scripts.script.beforeMessageSend;\n }\n if (scripts.script.afterMessageReceive) {\n brunoRequest.script.afterMessageReceive = scripts.script.afterMessageReceive;\n }\n if (scripts.script.afterCallEnd) {\n brunoRequest.script.afterCallEnd = scripts.script.afterCallEnd;\n }\n }\n if (scripts?.tests) {\n brunoRequest.tests = scripts.tests;\n }\n\n // variables\n const variables = toBrunoVariables(runtime?.variables);\n brunoRequest.vars = variables;\n\n // assertions\n const assertions = toBrunoAssertions(runtime?.assertions);\n if (assertions) {\n brunoRequest.assertions = assertions;\n }\n\n // docs\n if (ocRequest.docs) {\n brunoRequest.docs = ocRequest.docs;\n }\n\n // bruno item\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'grpc-request',\n seq: info?.seq || 1,\n name: ensureString(info?.name, 'Untitled Request'),\n tags: info?.tags || [],\n request: brunoRequest,\n settings: {},\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n // description\n if (info?.description) {\n const desc = typeof info.description === 'string' ? info.description : (info.description as any)?.content || '';\n if (desc.trim().length) {\n brunoItem.description = desc;\n }\n }\n\n return brunoItem;\n};\n\nexport default parseGrpcRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { Item, ScriptFile } from '@opencollection/types/collection/item';\nimport type { HttpRequest } from '@opencollection/types/requests/http';\nimport type { GraphQLRequest } from '@opencollection/types/requests/graphql';\nimport type { GrpcRequest } from '@opencollection/types/requests/grpc';\nimport type { WebSocketRequest } from '@opencollection/types/requests/websocket';\nimport { parseYml } from './utils';\nimport parseHttpRequest from './items/parseHttpRequest';\nimport parseGraphQLRequest from './items/parseGraphQLRequest';\nimport parseGrpcRequest from './items/parseGrpcRequest';\nimport parseWebsocketRequest from './items/parseWebsocketRequest';\nimport parseScript from './items/parseScript';\nimport parseApp, { type AppFile } from './items/parseApp';\n\n// Helper to get the type from an item (now in info block)\nconst getItemType = (item: Item): string | undefined => {\n if ('info' in item && item.info && 'type' in item.info) {\n return item.info.type;\n }\n // For ScriptFile which still has type at root\n if ('type' in item) {\n return (item as ScriptFile).type;\n }\n return undefined;\n};\n\n/**\n * In v3.0.0-rc1 release auth was present under runtime property for all requests\n * This has now been moved to the respective request properties\n * This backward compatibility has been put in place for folks who tried out our early preview\n * Should be safe to remove this in 3 months. Delete after 5 Apr 2026\n */\nconst ensureAuthV3Rc1BackwardsCompatibility = (parsedItemYml: any): any => {\n const itemType = parsedItemYml?.info?.type;\n\n switch (itemType) {\n case 'http':\n if (parsedItemYml.runtime?.auth && !parsedItemYml.http?.auth) {\n parsedItemYml.http.auth = parsedItemYml.runtime.auth;\n }\n break;\n case 'graphql':\n if (parsedItemYml.runtime?.auth && !parsedItemYml.graphql?.auth) {\n parsedItemYml.graphql.auth = parsedItemYml.runtime.auth;\n }\n break;\n case 'grpc':\n if (parsedItemYml.runtime?.auth && !parsedItemYml.grpc?.auth) {\n parsedItemYml.grpc.auth = parsedItemYml.runtime.auth;\n }\n break;\n case 'websocket':\n if (parsedItemYml.runtime?.auth && !parsedItemYml.websocket?.auth) {\n parsedItemYml.websocket.auth = parsedItemYml.runtime.auth;\n }\n break;\n default:\n break;\n }\n\n return parsedItemYml;\n};\n\nconst parseItem = (ymlString: string): BrunoItem => {\n try {\n const parsedYml = parseYml(ymlString);\n\n const ocItem: Item = ensureAuthV3Rc1BackwardsCompatibility(parsedYml);\n const itemType = getItemType(ocItem);\n\n if (!ocItem || !itemType) {\n throw new Error('Invalid item: missing type');\n }\n\n switch (itemType) {\n case 'http':\n return parseHttpRequest(ocItem as HttpRequest);\n\n case 'graphql':\n return parseGraphQLRequest(ocItem as GraphQLRequest);\n\n case 'grpc':\n return parseGrpcRequest(ocItem as GrpcRequest);\n\n case 'websocket':\n return parseWebsocketRequest(ocItem as WebSocketRequest);\n\n case 'script':\n return parseScript(ocItem as ScriptFile);\n\n case 'app':\n return parseApp(ocItem as unknown as AppFile);\n\n case 'folder':\n throw new Error('Folder items should be handled separately using parseFolder');\n\n default:\n throw new Error(`Unsupported item type: ${itemType}`);\n }\n } catch (error) {\n console.error('Error parsing item:', error);\n throw error;\n }\n};\n\nexport default parseItem;\n","import type { App as BrunoApp } from '@usebruno/schema-types/collection/item';\n\nexport interface OpenCollectionApp {\n enabled?: boolean;\n code?: string;\n}\n\nexport const toOpenCollectionApp = (app: BrunoApp | null | undefined): OpenCollectionApp | undefined => {\n // The app block persists when enabled even before any code is written.\n if (!app || (!app.code && app.enabled !== true)) return undefined;\n const ocApp: OpenCollectionApp = {};\n if (app.enabled === true) {\n ocApp.enabled = true;\n }\n if (app.code) {\n ocApp.code = app.code;\n }\n return ocApp;\n};\n\nexport const toBrunoApp = (app: OpenCollectionApp | null | undefined): BrunoApp | null => {\n if (!app) return null;\n return {\n enabled: app.enabled === true,\n code: app.code || null\n };\n};\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { WebSocketRequest as BrunoWebSocketRequest } from '@usebruno/schema-types/requests/websocket';\nimport type { WebSocketRequest, WebSocketMessage, WebSocketMessageVariant } from '@opencollection/types/requests/websocket';\nimport { toBrunoAuth } from '../common/auth';\nimport { toBrunoHttpHeaders } from '../common/headers';\nimport { toBrunoVariables } from '../common/variables';\nimport { toBrunoScripts } from '../common/scripts';\nimport { uuid, ensureString } from '../../../utils';\n\nconst parseWebsocketRequest = (ocRequest: WebSocketRequest): BrunoItem => {\n const info = ocRequest.info;\n const websocket = ocRequest.websocket;\n const runtime = ocRequest.runtime;\n\n const brunoRequest: BrunoWebSocketRequest = {\n url: ensureString(websocket?.url),\n headers: toBrunoHttpHeaders(websocket?.headers) || [],\n auth: toBrunoAuth(websocket?.auth),\n body: {\n mode: 'ws',\n ws: []\n },\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n assertions: [],\n tests: null,\n docs: null\n };\n\n // message\n if (websocket?.message) {\n if (Array.isArray(websocket.message)) {\n // multiple messages: WebSocketMessageVariant[]\n const variants = websocket.message as WebSocketMessageVariant[];\n brunoRequest.body.ws = variants.map((variant, index) => ({\n name: variant.title || `message ${index + 1}`,\n type: variant.message?.type || 'text',\n content: ensureString(variant.message?.data),\n selected: variant.selected || false\n }));\n } else {\n // single message uses flat WebSocketMessage\n const message = websocket.message as WebSocketMessage;\n const messageData = ensureString(message.data);\n if (messageData.trim().length) {\n brunoRequest.body.ws = [{\n name: '',\n type: message.type || 'text',\n content: messageData\n }];\n }\n }\n }\n\n // scripts\n const scripts = toBrunoScripts(runtime?.scripts);\n if (scripts?.script && brunoRequest.script) {\n if (scripts.script.req) {\n brunoRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n brunoRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n brunoRequest.tests = scripts.tests;\n }\n\n // variables\n const variables = toBrunoVariables(runtime?.variables);\n brunoRequest.vars = variables;\n\n // docs\n if (ocRequest.docs) {\n brunoRequest.docs = ocRequest.docs;\n }\n\n // settings\n const wsSettings: Record<string, number> = {\n timeout: 0,\n keepAliveInterval: 0\n };\n\n if (ocRequest.settings) {\n if (typeof ocRequest.settings.timeout === 'number') {\n wsSettings.timeout = ocRequest.settings.timeout;\n }\n if (typeof ocRequest.settings.keepAliveInterval === 'number') {\n wsSettings.keepAliveInterval = ocRequest.settings.keepAliveInterval;\n }\n }\n\n // bruno item\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'ws-request',\n seq: info?.seq || 1,\n name: ensureString(info?.name, 'Untitled Request'),\n tags: info?.tags || [],\n request: brunoRequest,\n settings: wsSettings as any,\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n // description\n if (info?.description) {\n const desc = typeof info.description === 'string' ? info.description : (info.description as any)?.content || '';\n if (desc.trim().length) {\n brunoItem.description = desc;\n }\n }\n\n return brunoItem;\n};\n\nexport default parseWebsocketRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { ScriptFile } from '@opencollection/types/collection/item';\nimport { uuid } from '../../../utils';\n\nconst parseScript = (ocScript: ScriptFile): BrunoItem => {\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'js',\n seq: 1,\n name: 'Script',\n tags: [],\n request: null,\n settings: null,\n fileContent: ocScript.script || '',\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n return brunoItem;\n};\n\nexport default parseScript;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport { uuid } from '../../../utils';\n\nexport interface AppFile {\n info: {\n name?: string;\n type: 'app';\n seq?: number;\n tags?: string[];\n };\n code?: string;\n}\n\nconst parseApp = (ocApp: AppFile): BrunoItem => {\n const info = ocApp.info || ({} as AppFile['info']);\n\n const brunoItem: BrunoItem = {\n uid: uuid(),\n type: 'app',\n seq: typeof info.seq === 'number' ? info.seq : 1,\n name: info.name || 'App',\n tags: Array.isArray(info.tags) ? info.tags : [],\n request: null,\n settings: null,\n app: { code: ocApp.code || '' },\n fileContent: null,\n root: null,\n items: [],\n examples: [],\n filename: null,\n pathname: null\n };\n\n return brunoItem;\n};\n\nexport default parseApp;\n","import type { CollectionFormat } from './types';\nimport type { ExternalSecretProviderType } from '@usebruno/schema-types/collection/environment';\n\nexport const DEFAULT_COLLECTION_FORMAT: CollectionFormat = 'yml';\n\n// Each provider type stores its secret reference under a different key.\nexport const SECRET_PROVIDER_IDENTIFIER_FIELDS: Record<\n ExternalSecretProviderType,\n 'path' | 'secretName' | 'vaultName' | 'projectId'\n> = {\n 'aws-secrets-manager': 'secretName',\n 'azure-key-vault': 'vaultName',\n 'gcp-secrets-manager': 'projectId',\n 'hashicorp-vault-cloud': 'path',\n 'hashicorp-vault-server': 'path'\n};\n","import type {\n Environment as BrunoEnvironment,\n EnvironmentVariable as BrunoEnvironmentVariable,\n SecretEnvironmentVariable as BrunoSecretEnvironmentVariable,\n ExternalSecretProviderType as BrunoExternalSecretProviderType\n} from '@usebruno/schema-types/collection/environment';\nimport type { Environment } from '@opencollection/types/config/environments';\nimport type { Variable, SecretVariable } from '@opencollection/types/common/variables';\nimport { parseYml } from './utils';\nimport { uuid, ensureString } from '../../utils';\nimport { SECRET_PROVIDER_IDENTIFIER_FIELDS } from '../../constants';\nimport { isTypedValue, fromOpenCollectionTypedValue } from './common/datatype';\nimport { validatedEnvironmentExtendsFrom } from '@usebruno/common/utils';\n\nconst isSecretVariable = (v: Variable | SecretVariable): v is SecretVariable => {\n return 'secret' in v && v.secret === true;\n};\n\nexport const toBrunoEnvironmentVariables = (variables: (Variable | SecretVariable)[] | null | undefined): (BrunoEnvironmentVariable | BrunoSecretEnvironmentVariable)[] => {\n if (!variables?.length) {\n return [];\n }\n\n return variables.map((v): (BrunoEnvironmentVariable | BrunoSecretEnvironmentVariable) => {\n if (isSecretVariable(v)) {\n const variable: BrunoEnvironmentVariable = {\n uid: uuid(),\n name: ensureString(v.name),\n value: '',\n type: 'text',\n enabled: v.disabled !== true,\n secret: true\n };\n\n if (v.type && v.type !== 'string' && v.type !== 'null') {\n variable.dataType = v.type;\n }\n\n if (v.description) {\n variable.description = typeof v.description === 'string' ? v.description : (v.description as any)?.content || '';\n }\n\n return variable;\n }\n\n const variable: BrunoEnvironmentVariable = {\n uid: uuid(),\n name: ensureString(v.name),\n value: '',\n type: 'text',\n enabled: v.disabled !== true,\n secret: false\n };\n\n if (isTypedValue(v.value)) {\n Object.assign(variable, fromOpenCollectionTypedValue(v.value));\n } else {\n variable.value = ensureString(v.value);\n }\n\n if (v.description) {\n variable.description = typeof v.description === 'string' ? v.description : (v.description as any)?.content || '';\n }\n\n return variable;\n });\n};\n\n// Parses the yml `externalSecrets: { type, variables: [{ name, path|secretName|vaultName }] }`\n// block into the runtime shape. `uid` and `enabled` are added here; the fetched `value`,\n// `providerConfig` and `lastSyncedAt` are runtime-only and never present in the file.\nconst toBrunoExternalSecrets = (externalSecrets: any): BrunoEnvironment['externalSecrets'] | undefined => {\n if (!externalSecrets || typeof externalSecrets !== 'object') {\n return undefined;\n }\n\n const type = ensureString(externalSecrets.type) as BrunoExternalSecretProviderType;\n const identifierField = SECRET_PROVIDER_IDENTIFIER_FIELDS[type];\n if (!identifierField) {\n return undefined;\n }\n\n // Keep any named entry, even one with an empty identifier — a half-filled secret row is the user's\n // data; dropping it here would silently delete it on the next save.\n const variables = Array.isArray(externalSecrets.variables)\n ? externalSecrets.variables\n .filter((v: any) => v && v.name)\n .map((v: any) => ({\n uid: uuid(),\n name: ensureString(v.name),\n enabled: v.disabled !== true,\n [identifierField]: ensureString(v[identifierField])\n }))\n : [];\n\n return { type, variables } as BrunoEnvironment['externalSecrets'];\n};\n\nconst parseEnvironment = (ymlString: string): BrunoEnvironment => {\n try {\n const ocEnvironment: Environment = parseYml(ymlString);\n\n const brunoEnvironment: BrunoEnvironment = {\n uid: uuid(),\n name: ensureString(ocEnvironment.name, 'Untitled Environment'),\n variables: toBrunoEnvironmentVariables(ocEnvironment.variables),\n color: ocEnvironment.color || null\n };\n\n const ocEnvironmentExtendsFrom = validatedEnvironmentExtendsFrom(ocEnvironment.extends);\n if (ocEnvironmentExtendsFrom) {\n brunoEnvironment.extends = ocEnvironmentExtendsFrom;\n }\n\n const externalSecrets = toBrunoExternalSecrets((ocEnvironment as any).externalSecrets);\n if (externalSecrets) {\n brunoEnvironment.externalSecrets = externalSecrets;\n }\n\n return brunoEnvironment;\n } catch (error) {\n console.error('Error parsing environment:', error);\n throw error;\n }\n};\n\nexport default parseEnvironment;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport stringifyHttpRequest from './items/stringifyHttpRequest';\nimport stringifyGraphqlRequest from './items/stringifyGraphQLRequest';\nimport stringifyGrpcRequest from './items/stringifyGrpcRequest';\nimport stringifyWebsocketRequest from './items/stringifyWebsocketRequest';\nimport stringifyScript from './items/stringifyScript';\nimport stringifyApp from './items/stringifyApp';\n\nconst stringifyItem = (item: BrunoItem): string => {\n try {\n switch (item.type) {\n case 'http-request':\n return stringifyHttpRequest(item);\n\n case 'graphql-request':\n return stringifyGraphqlRequest(item);\n\n case 'grpc-request':\n return stringifyGrpcRequest(item);\n\n case 'ws-request':\n return stringifyWebsocketRequest(item);\n\n case 'js':\n return stringifyScript(item);\n\n case 'app':\n return stringifyApp(item);\n\n case 'folder':\n throw new Error('Folder items should be handled separately using stringifyFolder');\n\n default:\n throw new Error(`Unsupported item type: ${item.type}`);\n }\n } catch (error) {\n console.error('Error stringifying item:', error);\n throw error;\n }\n};\nexport default stringifyItem;\n","import type { Item as BrunoItem, HttpItemSettings as BrunoHttpItemSettings } from '@usebruno/schema-types/collection/item';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { HttpRequest, HttpRequestSettings, HttpRequestExample, HttpRequestInfo, HttpRequestDetails, HttpRequestRuntime, HttpRequestHeader } from '@opencollection/types/requests/http';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { Assertion } from '@opencollection/types/common/assertions';\nimport type { Action } from '@opencollection/types/common/actions';\nimport type { HttpRequestParam, HttpRequestBody } from '@opencollection/types/requests/http';\nimport { stringifyYml } from '../utils';\nimport { toOpenCollectionApp, OpenCollectionApp } from '../common/app';\nimport { toOpenCollectionAuth } from '../common/auth';\nimport { toOpenCollectionHttpHeaders, toOpenCollectionResponseHeaders } from '../common/headers';\nimport { toOpenCollectionParams } from '../common/params';\nimport { toOpenCollectionBody } from '../common/body';\nimport { toOpenCollectionVariables } from '../common/variables';\nimport { toOpenCollectionActions } from '../common/actions';\nimport { toOpenCollectionScripts } from '../common/scripts';\nimport { toOpenCollectionAssertions } from '../common/assertions';\nimport { normalizeOmitHeaders } from '../common/omit-headers';\nimport { isNonEmptyString } from '../../../utils';\nimport { resolveTimeoutSetting, toMaxRedirects } from '@usebruno/common/utils';\nimport { HTTP_SCRIPT_KEYS } from '@usebruno/common';\n\nconst stringifyHttpRequest = (item: BrunoItem): string => {\n try {\n const ocRequest: HttpRequest = {};\n const brunoRequest = item.request as BrunoHttpRequest;\n\n // info block\n const info: HttpRequestInfo = {\n name: isNonEmptyString(item.name) ? item.name : 'Untitled Request',\n type: 'http'\n };\n if (item.seq) {\n info.seq = item.seq;\n }\n if (item.tags?.length) {\n info.tags = item.tags;\n }\n if (isNonEmptyString(item.description)) {\n info.description = item.description;\n }\n ocRequest.info = info;\n\n // http block\n const http: HttpRequestDetails = {\n method: isNonEmptyString(brunoRequest.method) ? brunoRequest.method : 'GET',\n url: isNonEmptyString(brunoRequest.url) ? brunoRequest.url : ''\n };\n\n // headers\n const headers: HttpRequestHeader[] | undefined = toOpenCollectionHttpHeaders(brunoRequest.headers);\n if (headers) {\n http.headers = headers;\n }\n\n // params\n const params: HttpRequestParam[] | undefined = toOpenCollectionParams(brunoRequest.params);\n if (params) {\n http.params = params;\n }\n\n // body\n const body: HttpRequestBody | undefined = toOpenCollectionBody(brunoRequest.body);\n if (body) {\n http.body = body;\n }\n\n // auth\n const auth: Auth | undefined = toOpenCollectionAuth(brunoRequest.auth);\n if (auth) {\n http.auth = auth;\n }\n\n ocRequest.http = http;\n\n // runtime block\n const runtime: HttpRequestRuntime = {};\n let hasRuntime = false;\n\n // variables\n const variables: Variable[] | undefined = toOpenCollectionVariables(brunoRequest.vars);\n if (variables) {\n runtime.variables = variables;\n hasRuntime = true;\n }\n\n // scripts\n const scripts: Scripts | undefined = toOpenCollectionScripts(brunoRequest, HTTP_SCRIPT_KEYS);\n if (scripts) {\n runtime.scripts = scripts;\n hasRuntime = true;\n }\n\n // assertions\n const assertions: Assertion[] | undefined = toOpenCollectionAssertions(brunoRequest.assertions);\n if (assertions) {\n runtime.assertions = assertions;\n hasRuntime = true;\n }\n\n // actions (from post-response variables)\n const resVars = brunoRequest.vars?.res;\n const actions: Action[] | undefined = toOpenCollectionActions(resVars);\n if (actions) {\n runtime.actions = actions;\n hasRuntime = true;\n }\n\n if (hasRuntime) {\n ocRequest.runtime = runtime;\n }\n\n // settings\n const httpSettings = item.settings as BrunoHttpItemSettings | undefined;\n const settings: HttpRequestSettings = {};\n if (httpSettings?.encodeUrl === true) {\n settings.encodeUrl = true;\n } else if (httpSettings?.encodeUrl === false) {\n settings.encodeUrl = false;\n } else {\n settings.encodeUrl = true;\n }\n\n settings.timeout = resolveTimeoutSetting(httpSettings?.timeout);\n\n if (httpSettings?.followRedirects === true) {\n settings.followRedirects = true;\n } else if (httpSettings?.followRedirects === false) {\n settings.followRedirects = false;\n } else {\n settings.followRedirects = true;\n }\n\n settings.maxRedirects = toMaxRedirects(httpSettings?.maxRedirects);\n\n settings.forwardAuthorizationHeader = httpSettings?.forwardAuthorizationHeader ?? true;\n\n const omitHeaders = normalizeOmitHeaders(httpSettings?.omitHeaders);\n if (omitHeaders) {\n settings.omitHeaders = omitHeaders;\n }\n\n ocRequest.settings = settings;\n\n // examples\n if (item.examples?.length) {\n const examples: HttpRequestExample[] = item.examples.map((example) => {\n const ocExample: HttpRequestExample = {};\n ocExample.name = example?.name || 'Untitled Example';\n\n if (isNonEmptyString(example.description)) {\n ocExample.description = example.description;\n }\n\n if (example.request) {\n ocExample.request = {};\n ocExample.request.url = example.request.url || '';\n ocExample.request.method = example.request.method || 'GET';\n\n const exampleHeaders = toOpenCollectionHttpHeaders(example.request.headers);\n if (exampleHeaders) {\n ocExample.request.headers = exampleHeaders;\n }\n\n const exampleParams = toOpenCollectionParams(example.request.params);\n if (exampleParams) {\n ocExample.request.params = exampleParams;\n }\n\n const exampleBody = toOpenCollectionBody(example.request.body);\n if (exampleBody !== undefined) {\n ocExample.request.body = exampleBody;\n }\n }\n\n if (example.response) {\n ocExample.response = {};\n\n const statusNum = Number(example.response.status);\n if (Number.isInteger(statusNum) && statusNum > 0) {\n ocExample.response.status = statusNum;\n }\n\n if (isNonEmptyString(example.response.statusText)) {\n ocExample.response.statusText = example.response.statusText;\n }\n\n const responseHeaders = toOpenCollectionResponseHeaders(example.response.headers);\n if (responseHeaders) {\n ocExample.response.headers = responseHeaders;\n }\n\n if (example.response.body && example.response.body.type && example.response.body.content !== undefined) {\n const content = example.response.body.content;\n const contentString = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n ocExample.response.body = {\n type: example.response.body.type as 'json' | 'text' | 'xml' | 'html' | 'binary',\n data: contentString\n };\n }\n }\n\n return ocExample;\n });\n\n if (examples?.length) {\n ocRequest.examples = examples;\n }\n }\n\n // docs\n if (isNonEmptyString(brunoRequest.docs)) {\n ocRequest.docs = brunoRequest.docs;\n }\n\n // app\n const app: OpenCollectionApp | undefined = toOpenCollectionApp(item.app);\n if (app) {\n (ocRequest as any).app = app;\n }\n\n return stringifyYml(ocRequest);\n } catch (error) {\n console.error('Error stringifying HTTP request:', error);\n throw error;\n }\n};\n\nexport default stringifyHttpRequest;\n","import type { Item as BrunoItem, HttpItemSettings as BrunoHttpItemSettings } from '@usebruno/schema-types/collection/item';\nimport type { HttpRequest as BrunoHttpRequest } from '@usebruno/schema-types/requests/http';\nimport type { GraphQLRequest, GraphQLRequestSettings, GraphQLBody, GraphQLRequestInfo, GraphQLRequestDetails, GraphQLRequestRuntime } from '@opencollection/types/requests/graphql';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { Assertion } from '@opencollection/types/common/assertions';\nimport type { Action } from '@opencollection/types/common/actions';\nimport type { HttpRequestParam, HttpRequestHeader } from '@opencollection/types/requests/http';\nimport { stringifyYml } from '../utils';\nimport { isNonEmptyString } from '../../../utils';\nimport { toOpenCollectionAuth } from '../common/auth';\nimport { toOpenCollectionHttpHeaders } from '../common/headers';\nimport { toOpenCollectionParams } from '../common/params';\nimport { toOpenCollectionVariables } from '../common/variables';\nimport { toOpenCollectionActions } from '../common/actions';\nimport { toOpenCollectionScripts } from '../common/scripts';\nimport { toOpenCollectionAssertions } from '../common/assertions';\nimport { resolveTimeoutSetting, toMaxRedirects } from '@usebruno/common/utils';\nimport { HTTP_SCRIPT_KEYS } from '@usebruno/common';\n\nconst stringifyGraphQLRequest = (item: BrunoItem): string => {\n try {\n const ocRequest: GraphQLRequest = {};\n const brunoRequest = item.request as BrunoHttpRequest;\n\n // info block\n const info: GraphQLRequestInfo = {\n name: isNonEmptyString(item.name) ? item.name : 'Untitled Request',\n type: 'graphql'\n };\n if (item.seq) {\n info.seq = item.seq;\n }\n if (item.tags?.length) {\n info.tags = item.tags;\n }\n if (isNonEmptyString(item.description)) {\n info.description = item.description;\n }\n ocRequest.info = info;\n\n // graphql block\n const graphql: GraphQLRequestDetails = {\n method: isNonEmptyString(brunoRequest.method) ? brunoRequest.method : 'POST',\n url: isNonEmptyString(brunoRequest.url) ? brunoRequest.url : ''\n };\n\n // headers\n const headers: HttpRequestHeader[] | undefined = toOpenCollectionHttpHeaders(brunoRequest.headers);\n if (headers) {\n graphql.headers = headers;\n }\n\n // params\n const params: HttpRequestParam[] | undefined = toOpenCollectionParams(brunoRequest.params);\n if (params) {\n graphql.params = params;\n }\n\n // body\n if (brunoRequest.body?.mode === 'graphql' && brunoRequest.body.graphql) {\n const graphqlBody: GraphQLBody = {};\n let hasBody = false;\n\n if (isNonEmptyString(brunoRequest.body.graphql.query)) {\n graphqlBody.query = brunoRequest.body.graphql.query;\n hasBody = true;\n }\n\n if (isNonEmptyString(brunoRequest.body.graphql.variables)) {\n graphqlBody.variables = brunoRequest.body.graphql.variables;\n hasBody = true;\n }\n\n if (hasBody) {\n graphql.body = graphqlBody;\n }\n }\n\n // auth (in graphql block, not runtime)\n const auth: Auth | undefined = toOpenCollectionAuth(brunoRequest.auth);\n if (auth) {\n graphql.auth = auth;\n }\n\n ocRequest.graphql = graphql;\n\n // runtime block\n const runtime: GraphQLRequestRuntime = {};\n let hasRuntime = false;\n\n // variables\n const variables: Variable[] | undefined = toOpenCollectionVariables(brunoRequest.vars);\n if (variables) {\n runtime.variables = variables;\n hasRuntime = true;\n }\n\n // scripts\n const scripts: Scripts | undefined = toOpenCollectionScripts(brunoRequest, HTTP_SCRIPT_KEYS);\n if (scripts) {\n runtime.scripts = scripts;\n hasRuntime = true;\n }\n\n // assertions\n const assertions: Assertion[] | undefined = toOpenCollectionAssertions(brunoRequest.assertions);\n if (assertions) {\n runtime.assertions = assertions;\n hasRuntime = true;\n }\n\n // actions (from post-response variables)\n const resVars = brunoRequest.vars?.res;\n const actions: Action[] | undefined = toOpenCollectionActions(resVars);\n if (actions) {\n runtime.actions = actions;\n hasRuntime = true;\n }\n\n if (hasRuntime) {\n ocRequest.runtime = runtime;\n }\n\n // settings\n const httpSettings = item.settings as BrunoHttpItemSettings | undefined;\n const settings: GraphQLRequestSettings = {};\n if (httpSettings?.encodeUrl === true) {\n settings.encodeUrl = true;\n } else if (httpSettings?.encodeUrl === false) {\n settings.encodeUrl = false;\n } else {\n settings.encodeUrl = true;\n }\n\n settings.timeout = resolveTimeoutSetting(httpSettings?.timeout);\n\n if (httpSettings?.followRedirects === true) {\n settings.followRedirects = true;\n } else if (httpSettings?.followRedirects === false) {\n settings.followRedirects = false;\n } else {\n settings.followRedirects = true;\n }\n\n settings.maxRedirects = toMaxRedirects(httpSettings?.maxRedirects);\n\n settings.forwardAuthorizationHeader = httpSettings?.forwardAuthorizationHeader ?? true;\n\n ocRequest.settings = settings;\n\n // docs\n if (isNonEmptyString(brunoRequest.docs)) {\n ocRequest.docs = brunoRequest.docs;\n }\n\n return stringifyYml(ocRequest);\n } catch (error) {\n console.error('Error stringifying GraphQL request:', error);\n throw error;\n }\n};\n\nexport default stringifyGraphQLRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { KeyValue as BrunoKeyValue } from '@usebruno/schema-types/common/key-value';\nimport type { GrpcRequest as BrunoGrpcRequest } from '@usebruno/schema-types/requests/grpc';\nimport type { GrpcRequest, GrpcMetadata, GrpcMessageVariant, GrpcMessage, GrpcRequestInfo, GrpcRequestDetails, GrpcRequestRuntime } from '@opencollection/types/requests/grpc';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { Assertion } from '@opencollection/types/common/assertions';\nimport { stringifyYml } from '../utils';\nimport { isNonEmptyString } from '../../../utils';\nimport { toOpenCollectionAuth } from '../common/auth';\nimport { toOpenCollectionVariables } from '../common/variables';\nimport { toOpenCollectionScripts } from '../common/scripts';\nimport { toOpenCollectionAssertions } from '../common/assertions';\nimport { GRPC_SCRIPT_KEYS } from '@usebruno/common';\n\nconst stringifyGrpcRequest = (item: BrunoItem): string => {\n try {\n const ocRequest: GrpcRequest = {};\n const brunoRequest = item.request as BrunoGrpcRequest;\n\n // info block\n const info: GrpcRequestInfo = {\n name: isNonEmptyString(item.name) ? item.name : 'Untitled Request',\n type: 'grpc'\n };\n if (item.seq) {\n info.seq = item.seq;\n }\n if (item.tags?.length) {\n info.tags = item.tags;\n }\n if (isNonEmptyString(item.description)) {\n info.description = item.description;\n }\n ocRequest.info = info;\n\n // grpc block\n const grpc: GrpcRequestDetails = {\n url: isNonEmptyString(brunoRequest.url) ? brunoRequest.url : '',\n method: isNonEmptyString(brunoRequest.method) ? brunoRequest.method : ''\n };\n\n // method type\n if (brunoRequest.methodType) {\n grpc.methodType = brunoRequest.methodType;\n }\n\n // proto file path\n if (isNonEmptyString(brunoRequest.protoPath)) {\n grpc.protoFilePath = brunoRequest.protoPath;\n }\n\n // metadata\n if (brunoRequest.headers?.length) {\n const metadata: GrpcMetadata[] = brunoRequest.headers.map((header: BrunoKeyValue) => {\n const metadataItem: GrpcMetadata = {\n name: header.name || '',\n value: header.value || ''\n };\n\n if (header?.description?.trim().length) {\n metadataItem.description = header.description;\n }\n\n if (header.enabled === false) {\n metadataItem.disabled = true;\n }\n\n return metadataItem;\n });\n\n if (metadata.length) {\n grpc.metadata = metadata;\n }\n }\n\n // message\n if (brunoRequest.body?.mode === 'grpc' && brunoRequest.body.grpc?.length) {\n const messages: GrpcMessageVariant[] = brunoRequest.body.grpc.map(({ name, content }, index) => ({\n title: name || `message ${index + 1}`,\n message: content || ''\n }));\n grpc.message = messages;\n }\n\n // auth\n const auth: Auth | undefined = toOpenCollectionAuth(brunoRequest.auth);\n if (auth) {\n grpc.auth = auth;\n }\n\n ocRequest.grpc = grpc;\n\n // runtime block\n const runtime: GrpcRequestRuntime = {};\n let hasRuntime = false;\n\n // variables\n const variables: Variable[] | undefined = toOpenCollectionVariables(brunoRequest.vars);\n if (variables) {\n runtime.variables = variables;\n hasRuntime = true;\n }\n\n // scripts\n const scripts: Scripts | undefined = toOpenCollectionScripts(brunoRequest, GRPC_SCRIPT_KEYS);\n if (scripts) {\n runtime.scripts = scripts;\n hasRuntime = true;\n }\n\n // assertions\n const assertions: Assertion[] | undefined = toOpenCollectionAssertions(brunoRequest.assertions);\n if (assertions) {\n runtime.assertions = assertions;\n hasRuntime = true;\n }\n\n if (hasRuntime) {\n ocRequest.runtime = runtime;\n }\n\n // docs\n if (isNonEmptyString(brunoRequest.docs)) {\n ocRequest.docs = brunoRequest.docs;\n }\n\n return stringifyYml(ocRequest);\n } catch (error) {\n console.error('Error stringifying gRPC request:', error);\n throw error;\n }\n};\n\nexport default stringifyGrpcRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { WebSocketRequest as BrunoWebSocketRequest } from '@usebruno/schema-types/requests/websocket';\nimport type { WebSocketRequest, WebSocketRequestInfo, WebSocketRequestDetails, WebSocketRequestRuntime, WebSocketMessage, WebSocketMessageVariant } from '@opencollection/types/requests/websocket';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { HttpRequestHeader } from '@opencollection/types/requests/http';\nimport { stringifyYml } from '../utils';\nimport { isNonEmptyString } from '../../../utils';\nimport { toOpenCollectionAuth } from '../common/auth';\nimport { toOpenCollectionHttpHeaders } from '../common/headers';\nimport { toOpenCollectionVariables } from '../common/variables';\nimport { toOpenCollectionScripts } from '../common/scripts';\nimport { HTTP_SCRIPT_KEYS } from '@usebruno/common';\n\nconst stringifyWebsocketRequest = (item: BrunoItem): string => {\n try {\n const ocRequest: WebSocketRequest = {};\n const brunoRequest = item.request as BrunoWebSocketRequest;\n\n // info block\n const info: WebSocketRequestInfo = {\n name: isNonEmptyString(item.name) ? item.name : 'Untitled Request',\n type: 'websocket'\n };\n if (item.seq) {\n info.seq = item.seq;\n }\n if (item.tags?.length) {\n info.tags = item.tags;\n }\n if (isNonEmptyString(item.description)) {\n info.description = item.description;\n }\n ocRequest.info = info;\n\n // websocket block\n const websocket: WebSocketRequestDetails = {\n url: isNonEmptyString(brunoRequest.url) ? brunoRequest.url : ''\n };\n\n // headers\n const headers: HttpRequestHeader[] | undefined = toOpenCollectionHttpHeaders(brunoRequest.headers);\n if (headers) {\n websocket.headers = headers;\n }\n\n // message: single message without a custom name uses flat WebSocketMessage (backward compatible),\n // otherwise uses WebSocketMessageVariant[] to preserve names\n if (brunoRequest.body?.mode === 'ws' && brunoRequest.body.ws?.length) {\n const messages = brunoRequest.body.ws;\n const hasCustomName = messages.length === 1 && messages[0].name && messages[0].name.trim().length > 0;\n\n const hasContent = messages.length === 1 && (messages[0].content || '').trim().length > 0;\n\n if (messages.length === 1 && !hasCustomName && hasContent) {\n const msg = messages[0];\n const message: WebSocketMessage = {\n type: (msg.type as WebSocketMessage['type']) || 'text',\n data: msg.content || ''\n };\n websocket.message = message;\n } else {\n const variants: WebSocketMessageVariant[] = messages.map((msg, index) => ({\n title: msg.name || `message ${index + 1}`,\n selected: msg.selected || false,\n message: {\n type: (msg.type as WebSocketMessage['type']) || 'text',\n data: msg.content || ''\n }\n }));\n websocket.message = variants;\n }\n }\n\n // auth\n const auth: Auth | undefined = toOpenCollectionAuth(brunoRequest.auth);\n if (auth) {\n websocket.auth = auth;\n }\n\n ocRequest.websocket = websocket;\n\n // runtime block\n const runtime: WebSocketRequestRuntime = {};\n let hasRuntime = false;\n\n // variables\n const variables: Variable[] | undefined = toOpenCollectionVariables(brunoRequest.vars);\n if (variables) {\n runtime.variables = variables;\n hasRuntime = true;\n }\n\n // scripts\n // TODO: Modify to WS scripts once WS scripts are implemented.\n const scripts: Scripts | undefined = toOpenCollectionScripts(brunoRequest, HTTP_SCRIPT_KEYS);\n if (scripts) {\n runtime.scripts = scripts;\n hasRuntime = true;\n }\n\n if (hasRuntime) {\n ocRequest.runtime = runtime;\n }\n\n // settings\n const wsSettings = item.settings as Record<string, number | string | undefined> | undefined;\n if (wsSettings) {\n ocRequest.settings = {};\n const timeout = Number(wsSettings.timeout);\n ocRequest.settings.timeout = !isNaN(timeout) ? timeout : 0;\n const keepAliveInterval = Number(wsSettings.keepAliveInterval);\n ocRequest.settings.keepAliveInterval = !isNaN(keepAliveInterval) ? keepAliveInterval : 0;\n }\n\n // docs\n if (isNonEmptyString(brunoRequest.docs)) {\n ocRequest.docs = brunoRequest.docs;\n }\n\n return stringifyYml(ocRequest);\n } catch (error) {\n console.error('Error stringifying WebSocket request:', error);\n throw error;\n }\n};\n\nexport default stringifyWebsocketRequest;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport type { ScriptFile } from '@opencollection/types/collection/item';\nimport { stringifyYml } from '../utils';\n\nconst stringifyScript = (item: BrunoItem): string => {\n try {\n const ocScript: ScriptFile = {\n type: 'script'\n };\n\n if (item.fileContent?.trim().length) {\n ocScript.script = item.fileContent;\n }\n\n return stringifyYml(ocScript);\n } catch (error) {\n console.error('Error stringifying script:', error);\n throw error;\n }\n};\n\nexport default stringifyScript;\n","import type { Item as BrunoItem } from '@usebruno/schema-types/collection/item';\nimport { stringifyYml } from '../utils';\n\ninterface AppFileInfo {\n name: string;\n type: 'app';\n seq?: number;\n tags?: string[];\n}\n\ninterface AppFile {\n info: AppFileInfo;\n code?: string;\n}\n\n// Mirror the request shape (info.name/type/seq/tags + body) so apps round-trip\n// the same fields and can be reordered via seq like every other item.\nconst stringifyApp = (item: BrunoItem): string => {\n try {\n const info: AppFileInfo = {\n name: item.name && item.name.trim().length ? item.name : 'App',\n type: 'app'\n };\n if (typeof item.seq === 'number') {\n info.seq = item.seq;\n }\n if (Array.isArray(item.tags) && item.tags.length) {\n info.tags = item.tags;\n }\n\n const ocApp: AppFile = { info };\n\n const code = item.app?.code;\n if (code && code.trim().length) {\n ocApp.code = code;\n }\n\n return stringifyYml(ocApp);\n } catch (error) {\n console.error('Error stringifying app:', error);\n throw error;\n }\n};\n\nexport default stringifyApp;\n","import type { FolderRoot } from '@usebruno/schema-types/collection/folder';\nimport type { Folder, FolderInfo } from '@opencollection/types/collection/item';\nimport type { Variable } from '@opencollection/types/common/variables';\nimport type { Action } from '@opencollection/types/common/actions';\nimport type { Scripts } from '@opencollection/types/common/scripts';\nimport type { Auth } from '@opencollection/types/common/auth';\nimport type { HttpRequestHeader } from '@opencollection/types/requests/http';\nimport type { RequestDefaults } from '@opencollection/types/common/request-defaults';\nimport { toOpenCollectionAuth } from './common/auth';\nimport { toOpenCollectionHttpHeaders } from './common/headers';\nimport { toOpenCollectionVariables } from './common/variables';\nimport { toOpenCollectionActions } from './common/actions';\nimport { toOpenCollectionScripts } from './common/scripts';\nimport { stringifyYml } from './utils';\nimport { HTTP_SCRIPT_KEYS } from '@usebruno/common';\n\nconst hasRequestDefaults = (folderRoot: FolderRoot): boolean => {\n const requestDefaults = folderRoot?.request;\n\n return Boolean((requestDefaults?.headers?.length)\n || (requestDefaults?.vars?.req?.length)\n || (requestDefaults?.vars?.res?.length)\n || hasRequestScripts(folderRoot)\n || hasRequestAuth(folderRoot));\n};\n\nconst hasRequestAuth = (folderRoot: FolderRoot): boolean => {\n return Boolean((folderRoot.request?.auth?.mode !== 'none'));\n};\n\nconst hasRequestScripts = (folderRoot: FolderRoot): boolean => {\n return Boolean((folderRoot.request?.script?.req)\n || (folderRoot.request?.script?.res)\n || (folderRoot.request?.tests));\n};\n\nconst stringifyFolder = (folderRoot: FolderRoot): string => {\n try {\n const ocFolder: Folder = {};\n\n // info block\n const info: FolderInfo = {\n name: folderRoot.meta?.name || 'Untitled Folder',\n type: 'folder'\n };\n // Only write seq when the folder actually has a numeric one. Defaulting to 1 would\n // force every seq-less folder into position 1 on disk and break alphabetical fallback.\n const seq = folderRoot.meta?.seq;\n if (typeof seq === 'number' && Number.isFinite(seq)) {\n info.seq = seq;\n }\n ocFolder.info = info;\n\n // request defaults\n if (hasRequestDefaults(folderRoot)) {\n ocFolder.request = {} as RequestDefaults;\n\n // headers\n if (folderRoot.request?.headers?.length) {\n const ocHeaders: HttpRequestHeader[] | undefined = toOpenCollectionHttpHeaders(folderRoot.request?.headers);\n if (ocHeaders) {\n ocFolder.request.headers = ocHeaders;\n }\n }\n\n // auth\n if (hasRequestAuth(folderRoot)) {\n const ocAuth: Auth | undefined = toOpenCollectionAuth(folderRoot.request?.auth);\n if (ocAuth) {\n ocFolder.request.auth = ocAuth;\n }\n }\n\n // variables\n if (folderRoot.request?.vars?.req?.length) {\n const ocVariables: Variable[] | undefined = toOpenCollectionVariables(folderRoot.request?.vars);\n if (ocVariables) {\n ocFolder.request.variables = ocVariables;\n }\n }\n\n // actions (post-response variables)\n if (folderRoot.request?.vars?.res?.length) {\n const ocActions: Action[] | undefined = toOpenCollectionActions(folderRoot.request?.vars?.res);\n if (ocActions) {\n (ocFolder.request as any).actions = ocActions;\n }\n }\n\n // scripts\n if (hasRequestScripts(folderRoot)) {\n // TODO: Widen scope to include GRPC scripts once Collection/Folder level inheritance is added to GRPC.\n const ocScripts: Scripts | undefined = toOpenCollectionScripts(folderRoot?.request, HTTP_SCRIPT_KEYS);\n if (ocScripts) {\n ocFolder.request.scripts = ocScripts;\n }\n }\n }\n\n // docs\n if (folderRoot.docs?.trim().length) {\n ocFolder.docs = {\n content: folderRoot.docs,\n type: 'text/markdown'\n };\n }\n\n return stringifyYml(ocFolder);\n } catch (error) {\n console.error('Error stringifying folder.yml:', error);\n throw error;\n }\n};\nexport default stringifyFolder;\n","import type {\n Environment as BrunoEnvironment,\n EnvironmentVariable as BrunoEnvironmentVariable,\n SecretEnvironmentVariable as BrunoSecretEnvironmentVariable,\n ExternalSecretProviderType as BrunoExternalSecretProviderType\n} from '@usebruno/schema-types/collection/environment';\nimport type { Environment } from '@opencollection/types/config/environments';\nimport type { Variable, SecretVariable } from '@opencollection/types/common/variables';\nimport { stringifyYml } from './utils';\nimport { ensureString } from '../../utils';\nimport { SECRET_PROVIDER_IDENTIFIER_FIELDS } from '../../constants';\nimport { hasTypedMetadata, toOpenCollectionTypedValue, serializeVariableValue } from './common/datatype';\nimport { validatedEnvironmentExtendsFrom } from '@usebruno/common/utils';\n\nexport const toOpenCollectionEnvironmentVariables = (variables: (BrunoEnvironmentVariable | BrunoSecretEnvironmentVariable)[]): (Variable | SecretVariable)[] | undefined => {\n if (!variables?.length) {\n return undefined;\n }\n\n const ocVariables: (Variable | SecretVariable)[] = variables\n .map((v): Variable | SecretVariable => {\n if ('secret' in v && v.secret === true) {\n const secretVar: SecretVariable = {\n secret: true,\n name: v.name || ''\n };\n if (hasTypedMetadata(v)) {\n secretVar.type = v.dataType;\n }\n if (v.enabled === false) {\n secretVar.disabled = true;\n }\n if (v.description !== undefined) {\n secretVar.description = v.description;\n }\n return secretVar;\n }\n\n const valueStr = serializeVariableValue(v.value);\n\n const variable: Variable = {\n name: v.name || '',\n value: hasTypedMetadata(v) ? toOpenCollectionTypedValue(v, valueStr) : valueStr\n };\n\n if (v.enabled === false) {\n variable.disabled = true;\n }\n\n if (v.description !== undefined) {\n variable.description = v.description;\n }\n\n return variable;\n });\n\n return ocVariables.length > 0 ? ocVariables : undefined;\n};\n\n// Serializes the runtime externalSecrets block to yml `{ type, variables: [{ name,\n// path|secretName|vaultName, disabled? }] }`. Runtime-only fields (uid, value,\n// providerConfig, lastSyncedAt) are never written.\nconst toOpenCollectionExternalSecrets = (externalSecrets: BrunoEnvironment['externalSecrets']): { type: string; variables: Record<string, string | boolean>[] } | undefined => {\n const type = externalSecrets?.type as BrunoExternalSecretProviderType | undefined;\n const identifierField = type && SECRET_PROVIDER_IDENTIFIER_FIELDS[type];\n if (!type || !identifierField) {\n return undefined;\n }\n\n // Keep any named entry, even one with an empty identifier — a half-filled secret row is the user's\n // data; dropping it here would silently delete it on the next save.\n const variables = (externalSecrets?.variables || [])\n .filter((v: any) => v && v.name)\n .map((v: any) => {\n const secret: Record<string, string | boolean> = {\n name: v.name,\n [identifierField]: ensureString(v[identifierField])\n };\n if (v.enabled === false) {\n secret.disabled = true;\n }\n return secret;\n });\n\n return { type, variables };\n};\n\nconst stringifyEnvironment = (environment: BrunoEnvironment): string => {\n try {\n const ocEnvironment: Environment = {\n name: environment.name\n };\n\n const environmentExtendsFrom = validatedEnvironmentExtendsFrom(environment.extends);\n if (environmentExtendsFrom) {\n (ocEnvironment as any).extends = environmentExtendsFrom;\n }\n\n if (environment.color) {\n ocEnvironment.color = environment.color;\n }\n\n if (environment.variables?.length) {\n const ocVariables = toOpenCollectionEnvironmentVariables(environment.variables);\n if (ocVariables) {\n ocEnvironment.variables = ocVariables;\n }\n }\n\n const ocExternalSecrets = toOpenCollectionExternalSecrets(environment.externalSecrets);\n if (ocExternalSecrets) {\n (ocEnvironment as any).externalSecrets = ocExternalSecrets;\n }\n\n return stringifyYml(ocEnvironment);\n } catch (error) {\n console.error('Error stringifying environment:', error);\n throw error;\n }\n};\n\nexport default stringifyEnvironment;\n","import { parentPort } from 'node:worker_threads';\nimport {\n parseBruRequest,\n parseBruCollection,\n parseBruEnvironment,\n stringifyBruRequest,\n stringifyBruCollection,\n stringifyBruEnvironment\n} from '../formats/bru';\nimport {\n parseYmlItem,\n parseYmlFolder,\n parseYmlEnvironment,\n stringifyYmlItem,\n stringifyYmlFolder,\n stringifyYmlEnvironment\n} from '../formats/yml';\nimport { CollectionFormat } from '../types';\nimport { DEFAULT_COLLECTION_FORMAT } from '../constants';\n\ntype TaskType\n = | 'parse'\n | 'stringify'\n | 'parseFolder'\n | 'stringifyFolder'\n | 'parseEnvironment'\n | 'stringifyEnvironment';\n\ninterface WorkerMessage {\n taskType: TaskType;\n data: {\n data: any;\n format?: CollectionFormat;\n };\n}\n\nconst runTask = (taskType: TaskType, data: any, format: CollectionFormat): any => {\n switch (taskType) {\n case 'parse':\n return format === 'yml' ? parseYmlItem(data) : parseBruRequest(data);\n case 'stringify':\n return format === 'yml' ? stringifyYmlItem(data) : stringifyBruRequest(data);\n case 'parseFolder':\n return format === 'yml' ? parseYmlFolder(data) : parseBruCollection(data);\n case 'stringifyFolder':\n return format === 'yml' ? stringifyYmlFolder(data) : stringifyBruCollection(data, true);\n case 'parseEnvironment':\n return format === 'yml' ? parseYmlEnvironment(data) : parseBruEnvironment(data);\n case 'stringifyEnvironment':\n return format === 'yml' ? stringifyYmlEnvironment(data) : stringifyBruEnvironment(data);\n default:\n throw new Error(`Unknown task type: ${taskType}`);\n }\n};\n\nparentPort?.on('message', async (message: WorkerMessage) => {\n try {\n const { taskType, data: messageData } = message;\n const { data, format = DEFAULT_COLLECTION_FORMAT } = messageData;\n const result = runTask(taskType, data, format);\n parentPort?.postMessage(result);\n } catch (error: any) {\n console.error('Worker error:', error);\n parentPort?.postMessage({ error: error?.message });\n }\n});\n","import type { FolderRoot } from '@usebruno/schema-types/collection/folder';\nimport type { Folder } from '@opencollection/types/collection/item';\nimport { parseYml } from './utils';\nimport { toBrunoAuth } from './common/auth';\nimport { toBrunoHttpHeaders } from './common/headers';\nimport { toBrunoVariables } from './common/variables';\nimport { toBrunoPostResponseVariables } from './common/actions';\nimport { toBrunoScripts } from './common/scripts';\nimport { ensureString } from '../../utils';\n\nconst parseFolder = (ymlString: string): FolderRoot => {\n try {\n const ocFolder: Folder = parseYml(ymlString);\n\n const info = ocFolder.info;\n const seq = info?.seq;\n\n const folderRoot: FolderRoot = {\n meta: {\n name: ensureString(info?.name, 'Untitled Folder'),\n // Only set seq when the source has a numeric value. Missing seq must stay absent:\n // defaulting to 1 makes every seq-less folder look \"ordered at position 1\" to\n // sortByNameThenSequence, pinning them all to slot 1 instead of alphabetical sort.\n ...(typeof seq === 'number' && Number.isFinite(seq) ? { seq } : {})\n },\n request: {\n headers: [],\n auth: toBrunoAuth(ocFolder.request?.auth),\n script: {\n req: null,\n res: null\n },\n vars: {\n req: [],\n res: []\n },\n tests: null\n },\n docs: null\n };\n\n if (ocFolder.request) {\n const folderRequest = folderRoot.request!;\n\n // headers\n const headers = toBrunoHttpHeaders(ocFolder.request.headers);\n if (headers) {\n folderRequest.headers = headers;\n }\n\n // variables\n const variables = toBrunoVariables(ocFolder.request.variables);\n const postResponseVars = toBrunoPostResponseVariables((ocFolder.request as any).actions);\n folderRequest.vars = {\n req: variables.req,\n res: postResponseVars\n };\n\n // scripts\n const scripts = toBrunoScripts(ocFolder.request.scripts);\n if (scripts?.script && folderRequest.script) {\n if (scripts.script.req) {\n folderRequest.script.req = scripts.script.req;\n }\n if (scripts.script.res) {\n folderRequest.script.res = scripts.script.res;\n }\n }\n if (scripts?.tests) {\n folderRequest.tests = scripts.tests;\n }\n }\n\n // docs (now at root level)\n if (ocFolder.docs) {\n if (typeof ocFolder.docs === 'string' && ocFolder.docs.trim().length) {\n folderRoot.docs = ocFolder.docs;\n } else if (typeof ocFolder.docs === 'object' && ocFolder.docs.content?.trim().length) {\n folderRoot.docs = ocFolder.docs.content;\n }\n }\n\n return folderRoot;\n } catch (error) {\n console.error('Error parsing folder:', error);\n throw error;\n }\n};\n\nexport default parseFolder;\n"],"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","customAlphabet","require","isString","value","isNonEmptyString","trim","ensureString","fallback","String","uuid","customNanoId","bruExampleToJson","data","parsed","parentType","parentMethod","bruToJsonV2","requestType","_","get","requestMethod","transformedType","status","statusText","isNaN","Number","name","description","request","method","url","headers","body","mode","response","header","content","log","jsonExampleToBru","BLOCK_KEYS","stringifyYml","obj","lines","YAML","stringify","lineWidth","indent","minContentWidth","defaultStringType","split","result","i","line","startsWith","key","includes","join","parseYml","ymlString","parse","normalizeBoolean","undefined","mapAdditionalParameters","Array","isArray","mapped","placement","toLowerCase","mapSendIn","mappedParam","Boolean","buildClientCredentials","oauth","credentials","clientId","clientSecret","credentialsPlacement","Object","keys","buildTokenConfig","tokenConfig","credentialsId","id","tokenPlacement","tokenHeaderPrefix","query","tokenQueryKey","tokenSource","buildSettings","autoFetchToken","autoRefreshToken","settings","buildResourceOwnerPasswordFlow","flow","accessTokenUrl","refreshTokenUrl","resourceOwner","username","password","buildResourceOwner","scope","accessTokenRequest","token","refreshTokenRequest","refresh","toOpenCollectionOAuth2","buildClientCredentialsFlow","authorizationUrl","callbackUrl","authorizationRequest","authorization","state","pkce","disabled","buildPkce","buildAuthorizationCodeFlow","buildImplicitFlow","warn","reverseAdditionalParameters","reversePlacementMapping","enabled","toOpenCollectionAuth","config","accessKeyId","secretAccessKey","sessionToken","service","region","profileName","buildAwsV4Auth","awsv4","buildBasicAuth","basic","buildBearerAuth","bearer","buildDigestAuth","digest","domain","buildNtlmAuth","ntlm","buildWsseAuth","wsse","buildApiKeyAuth","apikey","consumerKey","consumerSecret","accessToken","accessTokenSecret","verifier","signatureMethod","privateKey","privateKeyType","timestamp","nonce","version","realm","includeBodyHash","buildOAuth1Auth","oauth1","clientToken","baseURL","headersToSign","maxBodySize","buildEdgeGridAuth","akamaiEdgegrid","toBrunoAuth","brunoAuth","edgegrid","brunoOAuth","tempParams","tokenParams","refreshParams","authParams","authCodeFlow","toBrunoOAuth2","toOpenCollectionHttpHeaders","ocHeaders","httpHeader","toBrunoHttpHeaders","brunoHeaders","brunoHeader","uid","toOpenCollectionParams","ocParams","ocParam","toBrunoParams","brunoParams","brunoParam","toOpenCollectionBody","text","xml","sparql","formEntries","formUrlEncoded","entry","formEntry","multipartEntries","multipartForm","multipartEntry","contentType","fileEntries","file","fileEntry","filePath","selected","toBrunoBody","graphql","brunoBody","fileWithDescription","desc","serializeVariableValue","JSON","valueToString","isTypedValue","hasTypedMetadata","v","dataType","toOpenCollectionTypedValue","dataStr","fromOpenCollectionTypedValue","typed","isBrunoVariableDataType","parseValueByDataType","toOpenCollectionVariables","variables","reqVars","req","reqVarsArray","ocVariables","valueStr","variable","toBrunoVariables","res","forEach","base","local","assign","toOpenCollectionActions","resVariables","actions","action","phase","selector","expression","toBrunoPostResponseVariables","resVars","setVarAction","toOpenCollectionScripts","allowedKeys","ocScripts","script","pushScript","code","beforeCallStart","beforeMessageSend","afterMessageReceive","afterCallEnd","tests","toBrunoScripts","scripts","brunoScripts","setScript","OPERATORS","UNARY_OPERATORS","toOpenCollectionAssertions","assertions","ocAssertions","assertion","operator","str","firstWord","rest","remainingValue","parseAssertionOperator","ocAssertion","toBrunoAssertions","brunoAssertions","valueString","brunoAssertion","normalizeOmitHeaders","omitHeaders","names","toBool","toMaxRedirects","utils","toBrunoGrpcMetadata","metadata","brunoMetadata","meta","brunoMeta","parseItem","ocItem","parsedItemYml","itemType","info","runtime","http","grpc","websocket","ensureAuthV3Rc1BackwardsCompatibility","item","Error","ocRequest","brunoRequest","vars","docs","postResponseVars","app","toBrunoApp","brunoItem","seq","tags","fileContent","root","items","examples","filename","pathname","encodeUrl","timeout","followRedirects","maxRedirects","forwardAuthorizationHeader","example","brunoExample","itemUid","parseHttpRequest","parseGraphQLRequest","methodType","protoPath","protoFilePath","rawMessage","message","title","index","parseGrpcRequest","ws","variants","variant","messageData","wsSettings","keepAliveInterval","parseWebsocketRequest","ocScript","ocApp","parseApp","DEFAULT_COLLECTION_FORMAT","SECRET_PROVIDER_IDENTIFIER_FIELDS","parseEnvironment","ocEnvironment","brunoEnvironment","secret","isSecretVariable","color","ocEnvironmentExtendsFrom","validatedEnvironmentExtendsFrom","extends","externalSecrets","identifierField","toBrunoExternalSecrets","stringifyItem","hasRuntime","HTTP_SCRIPT_KEYS","httpSettings","resolveTimeoutSetting","ocExample","exampleHeaders","exampleParams","exampleBody","statusNum","isInteger","responseHeaders","toOpenCollectionResponseHeaders","contentString","toOpenCollectionApp","stringifyHttpRequest","graphqlBody","hasBody","stringifyGraphqlRequest","metadataItem","messages","GRPC_SCRIPT_KEYS","stringifyGrpcRequest","hasCustomName","hasContent","msg","stringifyWebsocketRequest","stringifyScript","stringifyApp","hasRequestAuth","folderRoot","hasRequestScripts","stringifyFolder","ocFolder","isFinite","requestDefaults","hasRequestDefaults","ocAuth","ocActions","stringifyEnvironment","environment","environmentExtendsFrom","secretVar","toOpenCollectionEnvironmentVariables","ocExternalSecrets","toOpenCollectionExternalSecrets","runTask","taskType","format","parseYmlItem","sequence","urlPath","default","appData","transformedJson","toUpperCase","e","selectedMethodType","hasOauth2GrantType","parseBruRequest","stringifyYmlItem","bruJson","jsonToBruV2","stringifyBruRequest","folderRequest","parseYmlFolder","_collectionBruToJson","collectionBruToJson","Promise","reject","parseBruCollection","stringifyYmlFolder","isFolder","collectionBruJson","_jsonToCollectionBru","stringifyBruCollection","parseYmlEnvironment","bru","bruToEnvJsonV2","each","parseBruEnvironment","stringifyYmlEnvironment","envJsonToBruV2","stringifyBruEnvironment","parentPort","on","async","postMessage"],"mappings":"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"}
|