@readme/oas-to-har 31.0.12 → 31.0.14
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/index.cjs +55 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +55 -5
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -219,22 +219,72 @@ function getParameterContentSchema(param, contentType) {
|
|
|
219
219
|
}
|
|
220
220
|
return null;
|
|
221
221
|
}
|
|
222
|
-
function
|
|
222
|
+
function parseJSONStrings(obj) {
|
|
223
223
|
if (typeof obj === "string") {
|
|
224
224
|
try {
|
|
225
225
|
const p = JSON.parse(obj);
|
|
226
|
-
return typeof p === "object" && p !== null ?
|
|
226
|
+
return typeof p === "object" && p !== null ? parseJSONStrings(p) : p;
|
|
227
227
|
} catch (e2) {
|
|
228
228
|
return obj;
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
if (Array.isArray(obj)) {
|
|
232
|
-
return obj.map(
|
|
232
|
+
return obj.map(parseJSONStrings);
|
|
233
233
|
}
|
|
234
234
|
if (obj !== null && typeof obj === "object") {
|
|
235
235
|
const out = {};
|
|
236
236
|
for (const [k, v] of Object.entries(obj)) {
|
|
237
|
-
out[k] =
|
|
237
|
+
out[k] = parseJSONStrings(v);
|
|
238
|
+
}
|
|
239
|
+
return out;
|
|
240
|
+
}
|
|
241
|
+
return obj;
|
|
242
|
+
}
|
|
243
|
+
function parseJSONStringsInBodyWithSchema(obj, schema, api, seenRefs = /* @__PURE__ */ new Set()) {
|
|
244
|
+
if (schema === void 0) return parseJSONStrings(obj);
|
|
245
|
+
let resolved = schema;
|
|
246
|
+
if (_types.isRef.call(void 0, schema)) {
|
|
247
|
+
if (seenRefs.has(schema.$ref)) {
|
|
248
|
+
return parseJSONStrings(obj);
|
|
249
|
+
}
|
|
250
|
+
seenRefs.add(schema.$ref);
|
|
251
|
+
const deref = _utils.dereferenceRef.call(void 0, schema, api);
|
|
252
|
+
if (!deref || _types.isRef.call(void 0, deref)) {
|
|
253
|
+
return parseJSONStrings(obj);
|
|
254
|
+
}
|
|
255
|
+
resolved = deref;
|
|
256
|
+
}
|
|
257
|
+
const safe = getSafeRequestBody(resolved);
|
|
258
|
+
if (_types.isRef.call(void 0, safe)) {
|
|
259
|
+
return parseJSONStringsInBodyWithSchema(obj, safe, api, seenRefs);
|
|
260
|
+
}
|
|
261
|
+
resolved = safe;
|
|
262
|
+
if (typeof obj === "string") {
|
|
263
|
+
if (hasSchemaType(resolved, "string") && resolved.format !== "json") {
|
|
264
|
+
return obj;
|
|
265
|
+
}
|
|
266
|
+
return parseJSONStrings(obj);
|
|
267
|
+
}
|
|
268
|
+
if (Array.isArray(obj)) {
|
|
269
|
+
let items = resolved.items;
|
|
270
|
+
if (items && typeof items === "object" && _types.isRef.call(void 0, items)) {
|
|
271
|
+
if (seenRefs.has(items.$ref)) {
|
|
272
|
+
return obj.map((item) => parseJSONStrings(item));
|
|
273
|
+
}
|
|
274
|
+
seenRefs.add(items.$ref);
|
|
275
|
+
const derefItems = _utils.dereferenceRef.call(void 0, items, api);
|
|
276
|
+
items = derefItems && !_types.isRef.call(void 0, derefItems) ? derefItems : void 0;
|
|
277
|
+
}
|
|
278
|
+
return obj.map((item) => parseJSONStringsInBodyWithSchema(item, items, api, new Set(seenRefs)));
|
|
279
|
+
}
|
|
280
|
+
if (obj !== null && typeof obj === "object") {
|
|
281
|
+
if (!resolved.properties || typeof resolved.properties !== "object") {
|
|
282
|
+
return parseJSONStrings(obj);
|
|
283
|
+
}
|
|
284
|
+
const out = {};
|
|
285
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
286
|
+
const propSchema = resolved.properties[k];
|
|
287
|
+
out[k] = parseJSONStringsInBodyWithSchema(v, propSchema, api, new Set(seenRefs));
|
|
238
288
|
}
|
|
239
289
|
return out;
|
|
240
290
|
}
|
|
@@ -1010,7 +1060,7 @@ function oasToHar(oas, operationSchema, values = {}, auth = {}, opts = { proxyUr
|
|
|
1010
1060
|
}
|
|
1011
1061
|
} else {
|
|
1012
1062
|
try {
|
|
1013
|
-
const parsed =
|
|
1063
|
+
const parsed = parseJSONStringsInBodyWithSchema(cleanBody, requestBodySchema, operation.api);
|
|
1014
1064
|
if (typeof _optionalChain([parsed, 'optionalAccess', _31 => _31.RAW_BODY]) !== "undefined") {
|
|
1015
1065
|
har.postData.text = isPrimitive(parsed.RAW_BODY) ? String(parsed.RAW_BODY) : stringify(parsed.RAW_BODY);
|
|
1016
1066
|
} else {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-to-har/dist/index.cjs","../src/index.ts","../src/lib/lodash.ts","../src/lib/style-formatting/index.ts","../src/lib/utils.ts","../src/lib/style-formatting/style-serializer.ts"],"names":["isRef"],"mappings":"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","file":"/Users/erunion/code/readme/oas/packages/oas-to-har/dist/index.cjs","sourcesContent":[null,"import type { PostData, PostDataParams, Request } from 'har-format';\nimport type { Extensions } from 'oas/extensions';\nimport type {\n HttpMethods,\n JSONSchema,\n MediaTypeObject,\n OASDocument,\n OperationObject,\n ParameterObject,\n SchemaObject,\n SchemaWrapper,\n ServerVariable,\n} from 'oas/types';\nimport type { AuthForHAR, DataForHAR, oasToHarOptions } from './lib/types.js';\n\nimport { parse as parseDataUrl } from '@readme/data-urls';\nimport Oas from 'oas';\nimport { HEADERS, PROXY_ENABLED } from 'oas/extensions';\nimport { Operation } from 'oas/operation';\nimport { isRef } from 'oas/types';\nimport { jsonSchemaTypes, matchesMimeType } from 'oas/utils';\nimport removeUndefinedObjects from 'remove-undefined-objects';\n\nimport configureSecurity from './lib/configure-security.js';\nimport { get, set } from './lib/lodash.js';\nimport { formatStyle } from './lib/style-formatting/index.js';\nimport {\n getParameterContentSchema,\n getParameterContentType,\n getSafeRequestBody,\n getTypedFormatsInSchema,\n hasSchemaType,\n parseJsonStringsInBody,\n} from './lib/utils.js';\n\nfunction formatter(\n values: DataForHAR,\n param: ParameterObject,\n type: 'body' | 'cookie' | 'header' | 'path' | 'query',\n onlyIfExists = false,\n) {\n if (param.style) {\n const value = values[type][param.name];\n // Note: Technically we could send everything through the format style and choose the proper\n // default for each `in` type (e.g. query defaults to form).\n return formatStyle(value, param);\n }\n\n let value: string | number | boolean | undefined;\n\n // Handle missing values\n if (typeof values[type][param.name] !== 'undefined') {\n value = values[type][param.name];\n } else if (onlyIfExists && !param.required) {\n value = undefined;\n } else if (param.required && param.schema && !isRef(param.schema) && param.schema.default) {\n value = param.schema.default;\n } else if (param.required && param.content) {\n const contentType = getParameterContentType(param);\n const schema = contentType ? getParameterContentSchema(param, contentType) : null;\n value = schema?.default;\n } else if (type === 'path') {\n // If we don't have any values for the path parameter, just use the name of the parameter as the\n // value so we don't try try to build a URL to something like `https://example.com/undefined`.\n return param.name;\n }\n\n // Handle file uploads. Specifically arrays of file uploads which need to be formatted very\n // specifically.\n if (\n param.schema &&\n !isRef(param.schema) &&\n param.schema.type === 'array' &&\n param.schema.items &&\n !isRef(param.schema.items) &&\n param.schema.items.format === 'binary'\n ) {\n if (Array.isArray(value)) {\n // If this is array of binary data then we shouldn't do anything because we'll prepare them\n // separately in the HAR in order to preserve `fileName` and `contentType` data within\n // `postData.params`. If we don't then the HAR we generate for this data will be invalid.\n return value;\n }\n\n return JSON.stringify(value);\n }\n\n if (value !== undefined) {\n // Query params should always be formatted, even if they don't have a `style` serialization\n // configured. Content-based header params also need formatting to properly serialize values\n // (e.g. JSON.stringify objects) instead of passing raw objects through. However, schema-based\n // header params should NOT be formatted as this would incorrectly URL-encode their values.\n if (type === 'query' || (type === 'header' && param.content)) {\n return formatStyle(value, param);\n }\n\n return value;\n }\n\n return undefined;\n}\n\nfunction multipartBodyToFormatterParams(payload: unknown, oasMediaTypeObject: MediaTypeObject, schema: SchemaObject) {\n const encoding = oasMediaTypeObject.encoding;\n\n if (typeof payload === 'object' && payload !== null) {\n return Object.keys(payload)\n .map(key => {\n // If we have an incoming parameter, but it's not in the schema ignore it.\n if (!schema.properties?.[key]) {\n return false;\n }\n\n const paramEncoding = encoding ? encoding[key] : undefined;\n\n return {\n name: key,\n // If the style isn't defined, use the default\n style: paramEncoding ? paramEncoding.style : undefined,\n // If explode isn't defined, use the default\n explode: paramEncoding ? paramEncoding.explode : undefined,\n required:\n (schema.required && typeof schema.required === 'boolean' && Boolean(schema.required)) ||\n (Array.isArray(schema.required) && schema.required.includes(key)),\n schema: schema.properties[key],\n in: 'body',\n };\n })\n .filter(Boolean) as ParameterObject[];\n }\n\n // Pretty sure that we'll never have anything but an object for multipart bodies, so returning\n // empty array if we get anything else.\n return [];\n}\n\nconst defaultFormDataTypes = Object.keys(jsonSchemaTypes).reduce((prev, curr) => {\n return Object.assign(prev, { [curr]: {} });\n}, {});\n\nfunction getResponseContentType(content: MediaTypeObject) {\n const types = Object.keys(content) || [];\n\n // If this response content has multiple types available we should always prefer the one that's\n // JSON-compatible. If they don't have one that is we'll return the first available, otherwise\n // if they don't have **any** repsonse content types present we'll assume it's JSON.\n if (types?.length) {\n const jsonType = types.find(t => matchesMimeType.json(t));\n if (jsonType) {\n return jsonType;\n }\n\n return types[0];\n }\n\n return 'application/json';\n}\n\nfunction isPrimitive(val: unknown) {\n return typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean';\n}\n\nfunction stringify(json: Record<string | 'RAW_BODY', unknown>) {\n return JSON.stringify(\n removeUndefinedObjects(typeof json.RAW_BODY !== 'undefined' ? json.RAW_BODY : json, {\n preserveNullishArrays: true,\n }),\n );\n}\n\nfunction stringifyParameter(param: any): string {\n if (param === null || isPrimitive(param)) {\n return String(param);\n } else if (Array.isArray(param) && param.every(isPrimitive)) {\n return String(param);\n }\n\n return JSON.stringify(param);\n}\n\nfunction appendHarValue(\n harParam: PostDataParams['params'] | Request['cookies'] | Request['headers'] | Request['queryString'],\n name: string,\n value: any,\n addtlData: {\n contentType?: string;\n fileName?: string;\n } = {},\n) {\n if (typeof value === 'undefined') return;\n\n if (Array.isArray(value)) {\n // If the formatter gives us an array, we're expected to add each array value as a new\n // parameter item with the same parameter name\n value.forEach(singleValue => {\n appendHarValue(harParam, name, singleValue);\n });\n } else if (typeof value === 'object' && value !== null) {\n // If the formatter gives us an object, we're expected to add each property value as a new\n // parameter item, each with the name of the property\n Object.keys(value).forEach(key => {\n appendHarValue(harParam, key, value[key]);\n });\n } else {\n // If the formatter gives us a non-array, non-object, we add it as is\n harParam.push({\n ...addtlData,\n name,\n value: String(value),\n });\n }\n}\n\nfunction encodeBodyForHAR(body: any) {\n if (isPrimitive(body)) {\n return body;\n } else if (\n typeof body === 'object' &&\n body !== null &&\n !Array.isArray(body) &&\n typeof body.RAW_BODY !== 'undefined'\n ) {\n // `RAW_BODY` is a ReadMe-specific thing where we'll interpret the entire payload as a\n // raw string. https://docs.readme.com/docs/raw-body-content\n if (isPrimitive(body.RAW_BODY)) {\n return body.RAW_BODY;\n }\n\n return stringify(body.RAW_BODY);\n }\n\n return stringify(body);\n}\n\n// biome-ignore lint/style/noDefaultExport: This is fine for now.\nexport default function oasToHar(\n oas: Oas,\n operationSchema?: Operation,\n values: DataForHAR = {},\n auth: AuthForHAR = {},\n opts: oasToHarOptions = { proxyUrl: '' },\n): {\n log: {\n entries: readonly [\n {\n readonly request: Request;\n },\n ];\n };\n} {\n let operation: Operation;\n if (!operationSchema || typeof operationSchema.getParameters !== 'function') {\n /**\n * If `operationSchema` was supplied as a plain object instead of an instance of `Operation`\n * then we should create a new instance of it. We're doing it with a check on `getParameters`\n * instead of checking `instanceof Operation` because JS is very weird when it comes to\n * checking `instanceof` against classes. One instance of `Operation` may not always match up\n * with another if they're being loaded between two different libraries.\n *\n * It's weird. This is easier.\n */\n const currentOas = Oas.init(oas as unknown as OASDocument);\n operation = new Operation(\n currentOas,\n operationSchema?.path || '',\n operationSchema?.method || ('' as HttpMethods),\n (operationSchema as unknown as OperationObject) || { path: '', method: '' },\n );\n } else {\n operation = operationSchema;\n }\n\n const apiDefinition = oas.getDefinition();\n\n const formData: DataForHAR = {\n ...defaultFormDataTypes,\n ...values,\n };\n\n if (!formData.server) {\n formData.server = {\n selected: 0,\n variables: oas.defaultVariables(0),\n };\n }\n\n // If the incoming `server.variables` is missing variables let's pad it out with defaults.\n formData.server.variables = {\n ...oas.defaultVariables(formData.server.selected),\n ...(formData.server.variables ? formData.server.variables : {}),\n };\n\n const har: Request = {\n cookies: [],\n headers: [],\n headersSize: 0,\n queryString: [],\n // @ts-expect-error This is fine because we're fleshing `postData` out further down.\n postData: {},\n bodySize: 0,\n method: operation.method.toUpperCase(),\n url: `${oas.url(formData.server.selected, formData.server.variables as ServerVariable)}${operation.path}`.replace(\n /\\s/g,\n '%20',\n ),\n httpVersion: 'HTTP/1.1',\n };\n\n if (opts.proxyUrl) {\n if (oas.getExtension(PROXY_ENABLED, operation)) {\n har.url = `${opts.proxyUrl}/${har.url}`;\n }\n }\n\n const parameters = operation.getParameters();\n\n har.url = har.url.replace(/{([-_a-zA-Z0-9[\\]]+)}/g, (full, key) => {\n if (!operation || !parameters) return key; // No path params at all\n\n // Find the path parameter or set a default value if it does not exist\n const parameter = parameters.find(param => param.name === key) || ({ name: key } as ParameterObject);\n\n // The library that handles our style processing already encodes uri elements. For everything\n // else we need to handle it here.\n if (!('style' in parameter) || !parameter.style) {\n return encodeURIComponent(formatter(formData, parameter, 'path'));\n }\n\n return formatter(formData, parameter, 'path');\n });\n\n const queryStrings = parameters?.filter(param => param.in === 'query');\n if (queryStrings?.length) {\n queryStrings.forEach(queryString => {\n const value = formatter(formData, queryString, 'query', true);\n appendHarValue(har.queryString, queryString.name, value);\n });\n }\n\n // Do we have any `cookie` parameters on the operation?\n const cookies = parameters?.filter(param => param.in === 'cookie');\n if (cookies?.length) {\n cookies.forEach(cookie => {\n const value = formatter(formData, cookie, 'cookie', true);\n appendHarValue(har.cookies, cookie.name, value);\n });\n }\n\n // Does this response have any documented content types?\n if (operation.schema.responses) {\n Object.keys(operation.schema.responses).some(statusCode => {\n // `getResponseByStatusCode` will lazily dereference the response if it's a `$ref` pointer.\n const response = operation.getResponseByStatusCode(statusCode);\n if (!response) return false;\n\n const content = response.content;\n if (!content) return false;\n\n // If there's no `accept` header present we should add one so their eventual code snippet\n // follows best practices.\n if (Object.keys(formData.header || {}).find(h => h.toLowerCase() === 'accept')) return true;\n\n har.headers.push({\n name: 'accept',\n value: getResponseContentType(content),\n });\n\n return true;\n });\n }\n\n // Do we have any `header` parameters on the operation?\n let hasContentType = false;\n let contentType = operation.getContentType();\n const headers = parameters?.filter(param => param.in === 'header');\n if (headers?.length) {\n headers.forEach(header => {\n const value = formatter(formData, header, 'header', true);\n if (typeof value === 'undefined') return;\n\n if (header.name.toLowerCase() === 'content-type') {\n hasContentType = true;\n contentType = String(value);\n }\n\n appendHarValue(har.headers, header.name, value);\n });\n }\n\n // Are there `x-headers` static headers configured for this OAS?\n const userDefinedHeaders = oas.getExtension(HEADERS, operation) as Extensions['headers'];\n if (userDefinedHeaders) {\n userDefinedHeaders.forEach(header => {\n if (typeof header.key === 'string' && header.key.toLowerCase() === 'content-type') {\n hasContentType = true;\n contentType = String(header.value);\n }\n\n har.headers.push({\n name: String(header.key),\n value: String(header.value),\n });\n });\n }\n\n if (formData.header) {\n // Do we have an `accept` header set up in the form data, but it hasn't been added yet?\n const acceptHeader = Object.keys(formData.header).find(h => h.toLowerCase() === 'accept');\n if (acceptHeader && !har.headers.find(hdr => hdr.name.toLowerCase() === 'accept')) {\n har.headers.push({\n name: 'accept',\n value: String(formData.header[acceptHeader]),\n });\n }\n\n // Do we have a manually-defined `authorization` header set up in the form data?\n const authorizationHeader = Object.keys(formData.header).find(h => h.toLowerCase() === 'authorization');\n if (authorizationHeader && !har.headers.find(hdr => hdr.name.toLowerCase() === 'authorization')) {\n har.headers.push({\n name: 'authorization',\n value: String(formData.header[authorizationHeader]),\n });\n }\n }\n\n let requestBody: SchemaWrapper | undefined;\n if (operation.hasRequestBody()) {\n requestBody = operation.getParametersAsJSONSchema()?.find(payload => {\n // `formData` is used in our API Explorer for `application/x-www-form-urlencoded` endpoints\n // and if you have an operation with that, it will only ever have a `formData`. `body` is\n // used for all other payload shapes.\n return payload.type === (operation.isFormUrlEncoded() ? 'formData' : 'body');\n });\n }\n\n if (requestBody?.schema && Object.keys(requestBody.schema).length) {\n const requestBodySchema = requestBody.schema;\n\n if (operation.isFormUrlEncoded()) {\n if (Object.keys(formData.formData || {}).length) {\n const cleanFormData = removeUndefinedObjects(formData.formData, { preserveNullishArrays: true });\n\n if (cleanFormData !== undefined) {\n const postData: PostData = { params: [], mimeType: 'application/x-www-form-urlencoded' };\n\n Object.keys(cleanFormData).forEach(name => {\n postData.params.push({\n name,\n value: stringifyParameter(cleanFormData[name]),\n });\n });\n\n har.postData = postData;\n }\n }\n } else if (\n 'body' in formData &&\n formData.body !== undefined &&\n (isPrimitive(formData.body) || Object.keys(formData.body).length)\n ) {\n const isMultipart = operation.isMultipart();\n const isJSON = operation.isJson();\n\n if (isMultipart || isJSON) {\n try {\n let cleanBody = removeUndefinedObjects(formData.body, { preserveNullishArrays: true });\n\n if (isMultipart) {\n har.postData = { params: [], mimeType: 'multipart/form-data' };\n\n // Because some request body schema shapes might not always be a top-level `properties`,\n // instead nesting it in an `oneOf` or `anyOf` we need to extract the first usable\n // schema that we have in order to process this multipart payload.\n const safeBodySchema = getSafeRequestBody(requestBodySchema);\n\n /**\n * Discover all `{ type: string, format: binary }` properties, or arrays containing the\n * same, within the request body. If there are any, then that means that we're dealing\n * with a `multipart/form-data` request and need to treat the payload as\n * `postData.params` and supply filenames and content types for the files (if they're\n * available).\n *\n * @todo It'd be nice to replace this with `getTypedFormatsInSchema` instead.\n * @example `{ type: string, format: binary }`\n * @example `{ type: array, items: { type: string, format: binary } }`\n */\n const binaryTypes = Object.keys(safeBodySchema.properties).filter(key => {\n const propData: JSONSchema = safeBodySchema.properties[key];\n if (propData.format === 'binary') {\n return true;\n } else if (\n propData.type === 'array' &&\n propData.items &&\n typeof propData.items === 'object' &&\n propData.items !== null &&\n (propData.items as JSONSchema).format === 'binary'\n ) {\n return true;\n }\n\n return false;\n });\n\n if (cleanBody !== undefined) {\n let multipartParams: ParameterObject[] = [];\n\n const multipartContent = operation.getRequestBody('multipart/form-data');\n if (\n typeof multipartContent === 'object' &&\n multipartContent !== null &&\n // `getRequestBody()` will return an array if there are multiple content types that\n // match the one we're looking for but because we're looking for an exact\n // `multipart/form-data` match `getRequestBody()` will only ever return a single\n // object back for us.\n !Array.isArray(multipartContent)\n ) {\n multipartParams = multipartBodyToFormatterParams(formData.body, multipartContent, safeBodySchema);\n }\n\n if (multipartParams.length) {\n Object.keys(cleanBody).forEach(name => {\n const param = multipartParams.find(multipartParam => multipartParam.name === name);\n\n if (param) {\n // If we're dealing with a binary type, and the value is a valid data URL we should\n // parse out any available filename and content type to send along with the\n // parameter to interpreters like `fetch-har` can make sense of it and send a usable\n // payload.\n const addtlData: { contentType?: string; fileName?: string } = {};\n\n let value = formatter(formData, param, 'body', true);\n if (!Array.isArray(value)) {\n value = [value];\n }\n\n value.forEach((val: string) => {\n if (binaryTypes.includes(name)) {\n const parsed = parseDataUrl(val);\n if (parsed) {\n addtlData.fileName = 'name' in parsed ? parsed.name : 'unknown';\n if ('contentType' in parsed) {\n addtlData.contentType = parsed.contentType;\n }\n }\n }\n\n appendHarValue(har.postData?.params || [], name, val, addtlData);\n });\n }\n });\n }\n }\n } else {\n har.postData = { mimeType: contentType, text: '' };\n\n if (\n hasSchemaType(requestBody.schema, 'string') ||\n hasSchemaType(requestBody.schema, 'integer') ||\n hasSchemaType(requestBody.schema, 'number') ||\n hasSchemaType(requestBody.schema, 'boolean')\n ) {\n har.postData.text = JSON.stringify(JSON.parse(cleanBody));\n } else {\n /**\n * Handle formatted JSON objects that have properties that accept arbitrary JSON.\n *\n * Find all `{ type: string, format: json }` properties in the schema because we need\n * to manually `JSON.parse` them before submit, otherwise they'll be escaped instead\n * of actual objects. We also only want values that the user has entered, so we drop\n * any `undefined` `cleanBody` keys.\n */\n const jsonTypes = getTypedFormatsInSchema('json', requestBodySchema, operation.api, {\n payload: cleanBody,\n });\n\n if (Array.isArray(jsonTypes) && jsonTypes.length) {\n try {\n jsonTypes.forEach((prop: boolean | string) => {\n try {\n set(cleanBody, String(prop), JSON.parse(get(cleanBody, String(prop))));\n } catch {\n // leave the prop as a string value\n }\n });\n\n // `RAW_BODY` is a ReadMe-specific thing where we'll interpret the entire payload\n // as a raw string. https://docs.readme.com/docs/raw-body-content\n if (typeof cleanBody.RAW_BODY !== 'undefined') {\n cleanBody = cleanBody.RAW_BODY;\n }\n\n har.postData.text = JSON.stringify(cleanBody);\n } catch {\n har.postData.text = stringify(formData.body);\n }\n } else {\n // If no `format: json` paths are found then we should recursively parse any string\n // values that are valid JSON so `format: json` is still resolved for our\n // `application/json` payload.\n try {\n const parsed = parseJsonStringsInBody(cleanBody) as Record<string, unknown>;\n if (typeof parsed?.RAW_BODY !== 'undefined') {\n har.postData.text = isPrimitive(parsed.RAW_BODY)\n ? String(parsed.RAW_BODY)\n : stringify(parsed.RAW_BODY as Record<string | 'RAW_BODY', unknown>);\n } else {\n har.postData.text = JSON.stringify(parsed);\n }\n } catch {\n har.postData.text = encodeBodyForHAR(formData.body);\n }\n }\n }\n }\n } catch {\n // If anything above fails for whatever reason, assume that whatever we had is invalid\n // JSON and just treat it as raw text.\n har.postData = { mimeType: contentType, text: stringify(formData.body) };\n }\n } else {\n har.postData = { mimeType: contentType, text: encodeBodyForHAR(formData.body) };\n }\n }\n }\n\n // Add a `content-type` header if there are any body values setup above or if there is a schema\n // defined, but only do so if we don't already have a `content-type` present as it's impossible\n // for a request to have multiple.\n if ((har.postData?.text || (requestBody?.schema && Object.keys(requestBody.schema).length)) && !hasContentType) {\n har.headers.push({\n name: 'content-type',\n value: contentType,\n });\n }\n\n const securityRequirements = operation.getSecurity();\n\n if (securityRequirements?.length) {\n // TODO pass these values through the formatter?\n securityRequirements.forEach(schemes => {\n Object.keys(schemes).forEach(security => {\n const securityValue = configureSecurity(apiDefinition, auth, security);\n if (!securityValue) {\n return;\n }\n\n // If this is an `authorization` header and we've already added one (maybe one was manually\n // specified), then we shouldn't add another.\n if (securityValue.value.name === 'authorization') {\n if (har[securityValue.type].find(v => v.name === securityValue.value.name)) {\n return;\n }\n }\n\n // If we've already added this **specific** security value then don't add it again.\n if (\n har[securityValue.type].find(\n v => v.name === securityValue.value.name && v.value === securityValue.value.value,\n )\n ) {\n return;\n }\n\n har[securityValue.type].push(securityValue.value);\n });\n });\n }\n\n // If we didn't end up filling the `postData` object then we don't need it.\n if (Object.keys(har.postData || {}).length === 0) {\n delete har.postData;\n }\n\n return {\n log: {\n entries: [\n {\n request: har,\n },\n ] as const,\n },\n };\n}\n","type Many<T> = T | readonly T[];\ntype PropertyName = number | string | symbol;\ntype PropertyPath = Many<PropertyName>;\n\n/**\n * A janky, poorly typed replacement for `lodash.get`.\n *\n * @see {@link https://youmightnotneed.com/lodash#get}\n */\nexport function get(object: unknown, path?: string): any {\n // If path is not defined or it has false value\n if (!path) return undefined;\n // Check if path is string or array. Regex : ensure that we do not have '.' and brackets.\n // Regex explained: https://regexr.com/58j0k\n const pathArray = String(path).match(/([^[.\\]])+/g);\n // Find value\n // @ts-expect-error idk man\n const result = pathArray?.reduce((prevObj, key) => prevObj?.[key], object);\n // If found value is undefined return default value; otherwise return the value\n return result;\n}\n\n/**\n * A janky, poorly typed replacement for `lodash.set`.\n *\n * @see {@link https://youmightnotneed.com/lodash#set}\n */\nexport function set<TResult>(object: object, path: PropertyPath, value: any): TResult {\n // Regex explained: https://regexr.com/58j0k\n const pathArray: PropertyPath | RegExpMatchArray | null = Array.isArray(path)\n ? path\n : String(path).match(/([^[.\\]])+/g);\n\n // @ts-expect-error idk man\n return pathArray?.reduce((acc, key, i) => {\n // @ts-expect-error idk man\n if (acc[key] === undefined) {\n // @ts-expect-error idk man\n acc[key] = {};\n }\n if (i === pathArray.length - 1) {\n // @ts-expect-error idk man\n acc[key] = value;\n }\n // @ts-expect-error idk man\n return acc[key];\n }, object);\n}\n","import type { ParameterObject, SchemaObject } from 'oas/types';\nimport type { StylizerConfig } from './style-serializer.js';\n\nimport { matchesMimeType } from 'oas/utils';\nimport qs from 'qs';\n\nimport { getParameterContentType } from '../utils.js';\nimport { stylize } from './style-serializer.js';\n\n// Certain styles don't support empty values.\nfunction shouldNotStyleEmptyValues(parameter: ParameterObject) {\n return ['simple', 'spaceDelimited', 'pipeDelimited', 'deepObject'].includes(parameter.style || '');\n}\n\nfunction shouldNotStyleReservedHeader(parameter: ParameterObject) {\n return ['accept', 'authorization', 'content-type'].includes(parameter.name.toLowerCase());\n}\n\n/**\n * Note: This isn't necessarily part of the spec. Behavior for the value 'undefined' is, well,\n * undefined. This code makes our system look better. If we wanted to be more accurate, we might\n * want to remove this, restore the un-fixed behavior for undefined and have our UI pass in empty\n * string instead of undefined.\n */\nfunction removeUndefinedForPath(value: any) {\n let finalValue = value;\n\n if (typeof finalValue === 'undefined') {\n return '';\n }\n\n if (Array.isArray(finalValue)) {\n finalValue = finalValue.filter(val => (val === undefined ? '' : val));\n\n if (finalValue.length === 0) {\n finalValue = '';\n }\n }\n\n if (typeof finalValue === 'object') {\n Object.keys(finalValue).forEach(key => {\n finalValue[key] = finalValue[key] === undefined ? '' : finalValue[key];\n });\n }\n\n return finalValue;\n}\n\nfunction stylizeValue(value: unknown, parameter: ParameterObject) {\n let finalValue = value;\n\n // Some styles don't work with empty values. We catch those there\n if (shouldNotStyleEmptyValues(parameter) && (typeof finalValue === 'undefined' || finalValue === '')) {\n // Paths need return an unstyled empty string instead of undefined so it's ignored in the final\n // path string.\n if (parameter.in === 'path') {\n return '';\n }\n\n // Everything but path should return undefined when unstyled so it's ignored in the final\n // parameter array.\n return undefined;\n }\n\n // Every style that adds their style to empty values should use emptystring for path parameters\n // instead of undefined to avoid the string `undefined`.\n if (parameter.in === 'path') {\n finalValue = removeUndefinedForPath(finalValue);\n }\n\n /**\n * Eventhough `accept`, `authorization`, and `content-type` headers can be defined as parameters,\n * they should be completely ignored when it comes to serialization.\n *\n * > If `in` is \"header\" and the `name` field is \"Accept\", \"Content-Type\" or \"Authorization\", the\n * > parameter definition SHALL be ignored.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#fixed-fields-10}\n */\n if (parameter.in === 'header' && shouldNotStyleReservedHeader(parameter)) {\n return value;\n }\n\n /**\n * If content is present, we should use the content type to format the value. We also ignore the style and explode settings.\n *\n * @see {@link https://swagger.io/docs/specification/v3_0/describing-parameters/#schema-vs-content}\n */\n if (parameter.content && (parameter.in === 'query' || parameter.in === 'header')) {\n const contentType = getParameterContentType(parameter);\n if (!contentType) {\n return undefined;\n }\n\n /**\n * @todo Handle other content types\n */\n let serialized: string;\n if (matchesMimeType.json(contentType)) {\n serialized = JSON.stringify(value);\n } else {\n serialized = String(value);\n }\n\n return parameter.in === 'query' ? encodeURIComponent(serialized) : serialized;\n }\n\n /**\n * All parameter types have a default `style` format so if they don't have one prescribed we\n * should still conform to what the spec defines.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-parameterstyle}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#user-content-parameterstyle}\n */\n let style = parameter.style;\n if (!style) {\n if (parameter.in === 'query') {\n style = 'form';\n } else if (parameter.in === 'path') {\n style = 'simple';\n } else if (parameter.in === 'header') {\n style = 'simple';\n } else if (parameter.in === 'cookie') {\n style = 'form';\n }\n }\n\n let explode = parameter.explode;\n if (explode === undefined && style === 'form') {\n /**\n * Per the spec if no `explode` is present but `style` is `form` then `explode` should default to `true`.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-parameterexplode}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#user-content-parameterexplode}\n */\n explode = true;\n }\n\n return stylize({\n location: parameter.in as StylizerConfig['location'],\n value: finalValue,\n key: parameter.name,\n style: style as StylizerConfig['style'],\n explode,\n /**\n * @todo this parameter is optional to stylize. It defaults to false, and can accept falsy, truthy, or \"unsafe\".\n * I do not know if it is correct for query to use this. See style-serializer for more info\n */\n escape: true,\n ...(parameter.in === 'query' ? { isAllowedReserved: parameter.allowReserved || false } : {}),\n });\n}\n\nfunction handleDeepObject(value: any, parameter: ParameterObject) {\n return qs\n .stringify(value, {\n encoder(str, defaultEncoder, charset, type) {\n if (type === 'key') {\n // `str` will be here as `dog[treats][0]` but because the `qs` library doesn't have any\n // awareness of our OpenAPI parameters we need to rewrite it to slap the `parameter.name`\n // to the top, like `pets[dog][treats][0]`.\n const prefixedKey = str\n .split(/[[\\]]/g)\n .filter(Boolean)\n .map((k: string) => `[${k}]`)\n .join('');\n\n return `${parameter.name}${prefixedKey}`;\n } else if (type === 'value') {\n return stylizeValue(str, parameter);\n }\n },\n })\n .split('&')\n .map(item => {\n const split = item.split('=');\n return {\n label: split[0],\n // `qs` will coerce null values into being `undefined` string but we want to preserve them.\n value: split[1] === 'undefined' ? null : split[1],\n };\n });\n}\n\n// Explode is handled on its own, because style-serializer doesn't return what we expect for proper\n// HAR output.\nfunction handleExplode(value: any, parameter: ParameterObject) {\n // This is to handle the case of arrays of objects in the querystring\n // which is something that's not technically in the spec but since we're\n // using the `qs` module already, it's fairly easy for us to add support\n // for this use case.\n //\n // An example URL would be something like this:\n // https://example.com/?line_items[0][a_string]=abc&line_items[0][quantity]=1&line_items[1][a_string]=def&line_items[1][quantity]=2\n //\n // Some open issues discussing this here:\n // https://github.com/OAI/OpenAPI-Specification/issues/1706\n // https://github.com/OAI/OpenAPI-Specification/issues/1006\n //\n // Link to the spec for this:\n // https://github.com/OAI/OpenAPI-Specification/blob/36a3a67264cc1c4f1eff110cea3ebfe679435108/versions/3.1.0.md#style-examples\n if (\n Array.isArray(value) &&\n (parameter.schema as SchemaObject)?.type === 'array' &&\n parameter.style === 'deepObject'\n ) {\n const newObj: Record<string, unknown> = {};\n const deepObjs = handleDeepObject(value, parameter);\n deepObjs.forEach(obj => {\n newObj[obj.label] = obj.value;\n });\n return newObj;\n }\n\n if (Array.isArray(value)) {\n return value.map(val => {\n return stylizeValue(val, parameter);\n });\n }\n\n if (typeof value === 'object' && value !== null) {\n const newObj: Record<string, unknown> = {};\n\n Object.keys(value).forEach(key => {\n if (parameter.style === 'deepObject') {\n const deepObjs = handleDeepObject(value, parameter);\n deepObjs.forEach(obj => {\n newObj[obj.label] = obj.value;\n });\n } else {\n newObj[key] = stylizeValue(value[key], parameter);\n }\n });\n\n return newObj;\n }\n\n return stylizeValue(value, parameter);\n}\n\nfunction shouldExplode(parameter: ParameterObject) {\n return (\n (parameter.explode ||\n (parameter.explode !== false && parameter.style === 'form') ||\n // style: deepObject && explode: false doesn't exist so explode it always\n // https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples\n parameter.style === 'deepObject') &&\n // header and path doesn't explode into separate parameters like query and cookie do\n parameter.in !== 'header' &&\n parameter.in !== 'path' &&\n !parameter.content\n );\n}\n\nexport function formatStyle(value: unknown, parameter: ParameterObject): any {\n // Deep object style only works on objects and arrays, and only works with explode=true.\n if (\n !parameter.content &&\n parameter.style === 'deepObject' &&\n (!value || typeof value !== 'object' || parameter.explode === false)\n ) {\n return undefined;\n }\n\n // This custom explode logic allows us to bubble up arrays and objects to be handled differently\n // by our HAR transformer. We need this because the `stylizeValue` function assumes we're building\n // strings, not richer data types.\n //\n // The first part of this conditional checks if `explode` is enabled. Explode is disabled for\n // everything by default except for forms.\n //\n // The second part of this conditional bypasses the custom explode logic for headers, because they\n // work differently, and `stylizeValue` is accurate.\n if (shouldExplode(parameter)) {\n return handleExplode(value, parameter);\n }\n\n return stylizeValue(value, parameter);\n}\n","import type { OASDocument, ParameterObject, SchemaObject } from 'oas/types';\n\nimport { isRef } from 'oas/types';\nimport { dereferenceRef, getParameterContentType as getParameterContentTypeUtil } from 'oas/utils';\n\nimport { get } from './lodash.js';\n\n/**\n * Determine if a schema `type` is, or contains, a specific discriminator.\n *\n */\nexport function hasSchemaType(\n schema: SchemaObject,\n discriminator: 'array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string',\n): boolean {\n if (Array.isArray(schema.type)) {\n return schema.type.includes(discriminator);\n }\n\n return schema.type === discriminator;\n}\n\n/**\n * Because some request body schema shapes might not always be a top-level `properties`, instead\n * nesting it in an `oneOf` or `anyOf` we need to extract the first usable schema that we have. If\n * we don't do this then these non-conventional request body schema payloads may not be properly\n * represented in the HAR that we generate.\n *\n */\nexport function getSafeRequestBody(obj: any): any {\n if ('oneOf' in obj) {\n return getSafeRequestBody(obj.oneOf[0]);\n } else if ('anyOf' in obj) {\n return getSafeRequestBody(obj.anyOf[0]);\n }\n\n return obj;\n}\n\ninterface Options {\n parentIsArray?: boolean;\n parentKey?: string;\n payload: unknown;\n}\n\ninterface SubschemaEntry {\n key: string;\n schema: SchemaObject;\n parentIsArray?: boolean;\n}\n\nfunction getSubschemas(\n schema: SchemaObject,\n api: OASDocument,\n opts: Options,\n seenRefs: Set<string> = new Set(),\n): SubschemaEntry[] | false {\n let subSchemaDataSize = 0;\n if (opts.parentIsArray) {\n // If we don't have data for this parent schema in our body payload then we\n // shouldn't bother spidering further into the schema looking for more `format`s\n // for data that definitely doesn't exist.\n const parentData = get(opts.payload, opts.parentKey || '');\n if (parentData === undefined || !Array.isArray(parentData)) {\n return false;\n }\n\n subSchemaDataSize = parentData.length;\n }\n\n let subschemas: SubschemaEntry[] = [];\n if (subSchemaDataSize > 0) {\n for (let idx = 0; idx < subSchemaDataSize; idx += 1) {\n const foundSubschemas = getSubschemas(\n schema,\n api,\n {\n ...opts,\n parentIsArray: false,\n parentKey: opts.parentKey ? [opts.parentKey, idx].join('.') : String(idx),\n },\n seenRefs,\n );\n\n if (foundSubschemas) {\n subschemas = subschemas.concat(foundSubschemas);\n }\n }\n } else {\n let resolvedSchema = schema;\n if (schema && isRef(schema)) {\n // Skip $refs we've already visited to prevent infinite recursion on circular references\n if (seenRefs.has(schema.$ref)) {\n return subschemas;\n }\n seenRefs.add(schema.$ref);\n\n resolvedSchema = dereferenceRef(schema, api);\n if (!resolvedSchema || isRef(resolvedSchema)) {\n return subschemas;\n }\n }\n\n const baseKey = opts.parentKey ?? '';\n\n // Collect subschemas from this objects `properties`, dereferencing `$ref` pointers and\n // building up a collection of dot-notation keys for each schema.\n if (resolvedSchema.properties && typeof resolvedSchema.properties === 'object') {\n for (const [propName, propSchema] of Object.entries(resolvedSchema.properties)) {\n if (propSchema && typeof propSchema === 'object') {\n let resolved: SchemaObject | undefined;\n if (isRef(propSchema)) {\n if (seenRefs.has(propSchema.$ref)) {\n continue;\n }\n seenRefs.add(propSchema.$ref);\n resolved = dereferenceRef(propSchema, api);\n } else {\n resolved = propSchema;\n }\n\n if (resolved && !isRef(resolved)) {\n subschemas.push({\n key: baseKey ? [baseKey, propName].join('.') : propName,\n schema: resolved,\n });\n }\n }\n }\n }\n\n // When the schema has no formal `properties` we need to enumerate through each of its available\n // property keys, collecting subschemas and dot-notation keysfrom each value. Generally we'll\n // hit this block when processing data like OpenAPI Media Type objects.\n if (\n !('properties' in resolvedSchema) &&\n typeof resolvedSchema === 'object' &&\n !('type' in resolvedSchema && resolvedSchema.type !== 'object')\n ) {\n for (const [propName, propSchema] of Object.entries(resolvedSchema)) {\n if (propSchema && (Array.isArray(propSchema) || (typeof propSchema === 'object' && propSchema !== null))) {\n const raw = getSafeRequestBody(propSchema);\n const resolved = isRef(raw) ? dereferenceRef(raw, api) : raw;\n const toPush = resolved && !isRef(resolved) ? resolved : raw;\n if (toPush && typeof toPush === 'object') {\n subschemas.push({\n key: baseKey ? [baseKey, propName].join('.') : propName,\n schema: toPush,\n });\n }\n }\n }\n }\n\n if ('items' in resolvedSchema && resolvedSchema.items !== undefined && resolvedSchema.items !== true) {\n const itemsSchema = resolvedSchema.items as SchemaObject;\n let resolved: SchemaObject | undefined;\n if (isRef(itemsSchema)) {\n if (!seenRefs.has(itemsSchema.$ref)) {\n seenRefs.add(itemsSchema.$ref);\n resolved = dereferenceRef(itemsSchema, api);\n }\n } else {\n resolved = itemsSchema;\n }\n\n if (resolved && !isRef(resolved)) {\n subschemas.push({\n key: baseKey,\n schema: resolved,\n parentIsArray: true,\n });\n }\n }\n }\n\n return subschemas;\n}\n\n/**\n * With a supplied JSON Schema object, spider through it for any schemas that may contain specific\n * kind of `format` that also happen to be within the current `requestBody` payload that we're\n * creating a HAR representation for.\n *\n */\nexport function getTypedFormatsInSchema(\n format: 'binary' | 'json',\n schema: SchemaObject,\n api: OASDocument,\n opts: Options,\n seenRefs: Set<string> = new Set(),\n): (boolean | string)[] | boolean | string {\n try {\n if (schema?.format === format) {\n if (opts.parentIsArray) {\n const parentData = get(opts.payload, opts.parentKey || '');\n if (parentData !== undefined && Array.isArray(parentData)) {\n return Object.keys(parentData)\n .map(pdk => {\n const currentKey = [opts.parentKey, pdk].join('.');\n if (get(opts.payload, currentKey) !== undefined) {\n return currentKey;\n }\n\n return false;\n })\n .filter(Boolean);\n }\n } else if (opts.parentKey && get(opts.payload, opts.parentKey) !== undefined) {\n return opts.parentKey;\n } else if (!opts.parentKey && opts.payload !== undefined) {\n // If this payload is present and we're looking for a specific format then we should assume\n // that the **root** schema of the request body is that format, and we aren't trafficking in\n // a nested object or array schema.\n return true;\n }\n\n return false;\n }\n\n const subschemas = getSubschemas(schema, api, opts, seenRefs);\n if (!subschemas) {\n return false;\n }\n\n return subschemas\n .flatMap(({ key, schema: subschema, parentIsArray: entryIsArray }) => {\n if (isRef(subschema)) {\n const resolved = dereferenceRef(subschema, api);\n if (resolved && !isRef(resolved)) {\n return resolved;\n }\n\n return false;\n }\n\n return getTypedFormatsInSchema(\n format,\n subschema,\n api,\n {\n payload: opts.payload,\n parentKey: key,\n parentIsArray: entryIsArray,\n },\n seenRefs,\n );\n })\n .filter(Boolean);\n } catch {\n // If this fails for whatever reason then we should act as if we didn't find any `format`'d\n // schemas.\n return [];\n }\n}\n\n/**\n * Extract content type from a parameter's `content` field.\n * According to OAS spec, when `content` is present, `style` and `explode` are ignored.\n * We prioritize `application/json` and other JSON-like content types over other content types.\n * Note: this is just a safe guard. In OAS parser, we enforce that there is exactly one content type.\n *\n * @param param - The parameter object\n * @returns The content type, or `null` if no content is present\n */\nexport function getParameterContentType(param: ParameterObject): string | null {\n if (!('content' in param) || typeof param.content !== 'object' || !param.content) {\n return null;\n }\n\n const contentKeys = Object.keys(param.content);\n if (contentKeys.length < 1) {\n return null;\n }\n\n return getParameterContentTypeUtil(contentKeys) || null;\n}\n\n/**\n * Extract schema from a parameter's `content` field.\n *\n * @param param - The parameter object\n * @param contentType - The content type\n * @returns The schema, or `null` if no schema is present\n */\nexport function getParameterContentSchema(param: ParameterObject, contentType: string): SchemaObject | null {\n if (!('content' in param) || typeof param.content !== 'object' || !param.content) {\n return null;\n }\n\n const mediaTypeObject = param.content[contentType];\n if (typeof mediaTypeObject === 'object' && mediaTypeObject && 'schema' in mediaTypeObject && mediaTypeObject.schema) {\n return isRef(mediaTypeObject.schema) ? null : (mediaTypeObject.schema as SchemaObject);\n }\n\n return null;\n}\n\n/**\n * Recursively parse string values that are valid JSON.\n *\n * This is used when we're dealing with objects that have nested `format: json` descriptors.\n */\nexport function parseJsonStringsInBody(obj: unknown): unknown {\n if (typeof obj === 'string') {\n try {\n const p = JSON.parse(obj);\n return typeof p === 'object' && p !== null ? parseJsonStringsInBody(p) : p;\n } catch {\n return obj;\n }\n }\n\n if (Array.isArray(obj)) {\n return obj.map(parseJsonStringsInBody);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = parseJsonStringsInBody(v);\n }\n\n return out;\n }\n\n return obj;\n}\n","/**\n * This file has been extracted and modified from `swagger-client`.\n *\n * @license Apache 2.0\n * @link https://npm.im/swagger-client\n * @link https://github.com/swagger-api/swagger-js/blob/master/src/execute/oas3/style-serializer.js\n */\n\nconst isRfc3986Reserved = (char: string) => \":/?#[]@!$&'()*+,;=\".indexOf(char) > -1;\nconst isRfc3986Unreserved = (char: string) => /^[a-z0-9\\-._~]+$/i.test(char);\n\nfunction isURIEncoded(value: string) {\n try {\n return decodeURIComponent(value) !== value;\n } catch {\n // `decodeURIComponent` will throw an exception if a string that has an un-encoded percent sign\n // in it (like 20%), o if it's throwing we can just assume that the value hasn't been encoded.\n return false;\n }\n}\n\nfunction isObject(value: unknown) {\n return typeof value === 'object' && value !== null;\n}\n\nfunction encodeDisallowedCharacters(\n str: string,\n {\n escape,\n returnIfEncoded = false,\n isAllowedReserved,\n }: {\n escape?: boolean | 'unsafe';\n isAllowedReserved?: boolean;\n returnIfEncoded?: boolean;\n } = {},\n parse?: boolean,\n): any {\n if (typeof str === 'number') {\n // biome-ignore lint/style/noParameterAssign: It is what it is.\n str = (str as number).toString();\n }\n\n if (returnIfEncoded) {\n if (isURIEncoded(str)) {\n return str;\n }\n }\n\n if (typeof str !== 'string' || !str.length) {\n return str;\n }\n\n if (!escape) {\n return str;\n }\n\n if (parse) {\n return JSON.parse(str);\n }\n\n // In ES6 you can do this quite easily by using the new ... spread operator. This causes the\n // string iterator (another new ES6 feature) to be used internally, and because that iterator is\n // designed to deal with code points rather than UCS-2/UTF-16 code units.\n return [...str]\n .map(char => {\n if (isRfc3986Unreserved(char)) {\n return char;\n }\n\n if (isRfc3986Reserved(char) && (escape === 'unsafe' || isAllowedReserved)) {\n return char;\n }\n\n const encoder = new TextEncoder();\n const encoded = Array.from(encoder.encode(char))\n .map(byte => `0${byte.toString(16).toUpperCase()}`.slice(-2))\n .map(encodedByte => `%${encodedByte}`)\n .join('');\n\n return encoded;\n })\n .join('');\n}\n\nexport interface StylizerConfig {\n escape: boolean | 'unsafe';\n explode?: boolean;\n isAllowedReserved?: boolean;\n key: string;\n location: 'body' | 'query';\n style: 'deepObject' | 'form' | 'label' | 'matrix' | 'pipeDelimited' | 'simple' | 'spaceDelimited';\n value: any;\n}\n\nexport function stylize(config: StylizerConfig): any {\n const { value } = config;\n\n if (Array.isArray(value)) {\n return encodeArray(config);\n }\n\n if (isObject(value)) {\n return encodeObject(config);\n }\n\n return encodePrimitive(config);\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodeArray({\n location,\n key,\n value,\n style,\n explode,\n escape,\n isAllowedReserved = false,\n}: Omit<StylizerConfig, 'value'> & { value: string[] }) {\n const valueEncoder = (str: string) => {\n // Handle null values explicitly to prevent join() from converting to empty string\n if (str === null) {\n return 'null';\n }\n\n const result = encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query',\n isAllowedReserved,\n });\n\n return result;\n };\n\n switch (style) {\n /**\n * @example <caption>`style: simple`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue,black,brown`\n */\n case 'simple':\n return value.map(val => valueEncoder(val)).join(',');\n\n /**\n * @example <caption>`style: label`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `.blue.black.brown`\n */\n case 'label':\n return `.${value.map(val => valueEncoder(val)).join('.')}`;\n\n /**\n * @example <caption>`style: matrix` + `explode: true`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `;color=blue;color=black;color=brown`\n *\n * @example <caption>`style: matrix` + `explode: false` (the default behavior)</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `;color=blue,black,brown\t`\n */\n case 'matrix':\n return value\n .map(val => valueEncoder(val))\n .reduce((prev, curr) => {\n if (!prev || explode) {\n return `${prev || ''};${key}=${curr}`;\n }\n return `${prev},${curr}`;\n }, '');\n\n /**\n * @example <caption>`style: form` + `explode: true`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `color=blue&color=black&color=brown`\n *\n * @example <caption>`style: form` + `explode: false` (the default behavior)</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `color=blue,black,brown`\n */\n case 'form':\n return value.map(val => valueEncoder(val)).join(explode ? `&${key}=` : ',');\n\n /**\n * @example <caption>`style: spaceDelimited`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue%20black%20brown`\n */\n case 'spaceDelimited':\n return value.map(val => valueEncoder(val)).join(` ${explode ? `${key}=` : ''}`);\n\n /**\n * @example <caption>`style: pipeDelimited`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue|black|brown`\n */\n case 'pipeDelimited':\n return value.map(val => valueEncoder(val)).join(`|${explode ? `${key}=` : ''}`);\n\n default:\n return undefined;\n }\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodeObject({ location, key, value, style, explode, escape, isAllowedReserved = false }: StylizerConfig) {\n const valueEncoder = (str: string) =>\n encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query',\n isAllowedReserved,\n });\n\n const valueKeys = Object.keys(value);\n\n switch (style) {\n /**\n * @example <caption>`style: simple` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R=100,G=200,B=150`\n *\n * @example <caption>`style: simple` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R,100,G,200,B,150`\n */\n case 'simple':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const middleChar = explode ? '=' : ',';\n const prefix = prev ? `${prev},` : '';\n\n return `${prefix}${curr}${middleChar}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: label` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `.R=100.G=200.B=150`\n *\n * @example <caption>`style: label` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `.R.100.G.200.B.150`\n */\n case 'label':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const middleChar = explode ? '=' : '.';\n const prefix = prev ? `${prev}.` : '.';\n\n return `${prefix}${curr}${middleChar}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: matrix` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `;R=100;G=200;B=150`\n *\n * @example <caption>`style: matrix` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `;color=R,100,G,200,B,150`\n */\n case 'matrix':\n if (explode) {\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev};` : ';';\n\n return `${prefix}${curr}=${val}`;\n }, '');\n }\n\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev},` : `;${key}=`;\n\n return `${prefix}${curr},${val}`;\n }, '');\n\n /**\n * @example <caption>`style: form` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R=100&G=200&B=150`\n *\n * @example <caption>`style: form` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `color=R,100,G,200,B,150`\n */\n case 'form':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev}${explode ? '&' : ','}` : '';\n const separator = explode ? '=' : ',';\n\n return `${prefix}${curr}${separator}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: spaceDelimited`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R%20100%20G%20200%20B%20150`\n */\n case 'spaceDelimited':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev} ` : '';\n\n return `${prefix}${curr} ${val}`;\n }, '');\n\n /**\n * @example <caption>`style: pipeDelimited`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R|100|G|200|B|150`\n */\n case 'pipeDelimited':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev}|` : '';\n\n return `${prefix}${curr}|${val}`;\n }, '');\n\n /**\n * @example <caption>`style: deepObject`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `color[R]=100&color[G]=200&color[B]=150`\n */\n case 'deepObject':\n return valueKeys.reduce(curr => {\n const val = valueEncoder(value[curr]);\n return `${val}`;\n }, '');\n\n default:\n return undefined;\n }\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodePrimitive({ location, key, value, style, escape, isAllowedReserved = false }: StylizerConfig) {\n const valueEncoder = (str: string) =>\n encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query' || location === 'body',\n isAllowedReserved,\n });\n\n switch (style) {\n /**\n * @example <caption>`style: simple`</caption>\n * `blue` → `blue`\n */\n case 'simple':\n return valueEncoder(value);\n\n /**\n * @example <caption>`style: label`</caption>\n * `blue` → `.blue`\n */\n case 'label':\n return `.${valueEncoder(value)}`;\n\n /**\n * @example <caption>`style: matrix`</caption>\n * `blue` → `;color=blue`\n */\n case 'matrix':\n if (value === '') {\n return `;${key}`;\n }\n\n return `;${key}=${valueEncoder(value)}`;\n\n /**\n * @example <caption>`style: form`</caption>\n * `blue` → `color=blue`\n */\n case 'form':\n return valueEncoder(value);\n\n /**\n * @example <caption>`style: deepObject`</caption>\n * `blue` → n/a\n */\n case 'deepObject':\n return valueEncoder(value);\n\n default:\n return undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-to-har/dist/index.cjs","../src/index.ts","../src/lib/lodash.ts","../src/lib/style-formatting/index.ts","../src/lib/utils.ts","../src/lib/style-formatting/style-serializer.ts"],"names":["isRef"],"mappings":"AAAA;AACE;AACF,wDAAA;AACA;AACA;ACWA,6CAAsC;AACtC,oEAAgB;AAChB,4CAAuC;AACvC,0CAA0B;AAC1B,kCAAsB;AACtB,kCAAiD;AACjD,kJAAmC;ADTnC;AACA;AEJO,SAAS,GAAA,CAAI,MAAA,EAAiB,IAAA,EAAoB;AAEvD,EAAA,GAAA,CAAI,CAAC,IAAA,EAAM,OAAO,KAAA,CAAA;AAGlB,EAAA,MAAM,UAAA,EAAY,MAAA,CAAO,IAAI,CAAA,CAAE,KAAA,CAAM,aAAa,CAAA;AAGlD,EAAA,MAAM,OAAA,kBAAS,SAAA,2BAAW,MAAA,mBAAO,CAAC,OAAA,EAAS,GAAA,EAAA,mBAAQ,OAAA,4BAAA,CAAU,GAAG,GAAA,EAAG,MAAM,GAAA;AAEzE,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,GAAA,CAAa,MAAA,EAAgB,IAAA,EAAoB,KAAA,EAAqB;AAEpF,EAAA,MAAM,UAAA,EAAoD,KAAA,CAAM,OAAA,CAAQ,IAAI,EAAA,EACxE,KAAA,EACA,MAAA,CAAO,IAAI,CAAA,CAAE,KAAA,CAAM,aAAa,CAAA;AAGpC,EAAA,uBAAO,SAAA,6BAAW,MAAA,mBAAO,CAAC,GAAA,EAAK,GAAA,EAAK,CAAA,EAAA,GAAM;AAExC,IAAA,GAAA,CAAI,GAAA,CAAI,GAAG,EAAA,IAAM,KAAA,CAAA,EAAW;AAE1B,MAAA,GAAA,CAAI,GAAG,EAAA,EAAI,CAAC,CAAA;AAAA,IACd;AACA,IAAA,GAAA,CAAI,EAAA,IAAM,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG;AAE9B,MAAA,GAAA,CAAI,GAAG,EAAA,EAAI,KAAA;AAAA,IACb;AAEA,IAAA,OAAO,GAAA,CAAI,GAAG,CAAA;AAAA,EAChB,CAAA,EAAG,MAAM,GAAA;AACX;AFfA;AACA;AG9BA;AACA,gEAAe;AHgCf;AACA;AInCA;AACA;AAQO,SAAS,aAAA,CACd,MAAA,EACA,aAAA,EACS;AACT,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA,IAAS,aAAA;AACzB;AASO,SAAS,kBAAA,CAAmB,GAAA,EAAe;AAChD,EAAA,GAAA,CAAI,QAAA,GAAW,GAAA,EAAK;AAClB,IAAA,OAAO,kBAAA,CAAmB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC,EAAA,KAAA,GAAA,CAAW,QAAA,GAAW,GAAA,EAAK;AACzB,IAAA,OAAO,kBAAA,CAAmB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,GAAA;AACT;AAcA,SAAS,aAAA,CACP,MAAA,EACA,GAAA,EACA,IAAA,EACA,SAAA,kBAAwB,IAAI,GAAA,CAAI,CAAA,EACN;AAC1B,EAAA,IAAI,kBAAA,EAAoB,CAAA;AACxB,EAAA,GAAA,CAAI,IAAA,CAAK,aAAA,EAAe;AAItB,IAAA,MAAM,WAAA,EAAa,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,UAAA,GAAa,EAAE,CAAA;AACzD,IAAA,GAAA,CAAI,WAAA,IAAe,KAAA,EAAA,GAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC1D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,kBAAA,EAAoB,UAAA,CAAW,MAAA;AAAA,EACjC;AAEA,EAAA,IAAI,WAAA,EAA+B,CAAC,CAAA;AACpC,EAAA,GAAA,CAAI,kBAAA,EAAoB,CAAA,EAAG;AACzB,IAAA,IAAA,CAAA,IAAS,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,iBAAA,EAAmB,IAAA,GAAO,CAAA,EAAG;AACnD,MAAA,MAAM,gBAAA,EAAkB,aAAA;AAAA,QACtB,MAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,UACE,GAAG,IAAA;AAAA,UACH,aAAA,EAAe,KAAA;AAAA,UACf,SAAA,EAAW,IAAA,CAAK,UAAA,EAAY,CAAC,IAAA,CAAK,SAAA,EAAW,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,EAAA,EAAI,MAAA,CAAO,GAAG;AAAA,QAC1E,CAAA;AAAA,QACA;AAAA,MACF,CAAA;AAEA,MAAA,GAAA,CAAI,eAAA,EAAiB;AACnB,QAAA,WAAA,EAAa,UAAA,CAAW,MAAA,CAAO,eAAe,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF,EAAA,KAAO;AACL,IAAA,IAAI,eAAA,EAAiB,MAAA;AACrB,IAAA,GAAA,CAAI,OAAA,GAAU,0BAAA,MAAY,CAAA,EAAG;AAE3B,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC7B,QAAA,OAAO,UAAA;AAAA,MACT;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAExB,MAAA,eAAA,EAAiB,mCAAA,MAAe,EAAQ,GAAG,CAAA;AAC3C,MAAA,GAAA,CAAI,CAAC,eAAA,GAAkB,0BAAA,cAAoB,CAAA,EAAG;AAC5C,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,mBAAU,IAAA,CAAK,SAAA,UAAa,IAAA;AAIlC,IAAA,GAAA,CAAI,cAAA,CAAe,WAAA,GAAc,OAAO,cAAA,CAAe,WAAA,IAAe,QAAA,EAAU;AAC9E,MAAA,IAAA,CAAA,MAAW,CAAC,QAAA,EAAU,UAAU,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA,EAAG;AAC9E,QAAA,GAAA,CAAI,WAAA,GAAc,OAAO,WAAA,IAAe,QAAA,EAAU;AAChD,UAAA,IAAI,QAAA;AACJ,UAAA,GAAA,CAAI,0BAAA,UAAgB,CAAA,EAAG;AACrB,YAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACjC,cAAA,QAAA;AAAA,YACF;AACA,YAAA,QAAA,CAAS,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAC5B,YAAA,SAAA,EAAW,mCAAA,UAAe,EAAY,GAAG,CAAA;AAAA,UAC3C,EAAA,KAAO;AACL,YAAA,SAAA,EAAW,UAAA;AAAA,UACb;AAEA,UAAA,GAAA,CAAI,SAAA,GAAY,CAAC,0BAAA,QAAc,CAAA,EAAG;AAChC,YAAA,UAAA,CAAW,IAAA,CAAK;AAAA,cACd,GAAA,EAAK,QAAA,EAAU,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,IAAA,CAAK,GAAG,EAAA,EAAI,QAAA;AAAA,cAC/C,MAAA,EAAQ;AAAA,YACV,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAKA,IAAA,GAAA,CACE,CAAA,CAAE,aAAA,GAAgB,cAAA,EAAA,GAClB,OAAO,eAAA,IAAmB,SAAA,GAC1B,CAAA,CAAE,OAAA,GAAU,eAAA,GAAkB,cAAA,CAAe,KAAA,IAAS,QAAA,CAAA,EACtD;AACA,MAAA,IAAA,CAAA,MAAW,CAAC,QAAA,EAAU,UAAU,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AACnE,QAAA,GAAA,CAAI,WAAA,GAAA,CAAe,KAAA,CAAM,OAAA,CAAQ,UAAU,EAAA,GAAM,OAAO,WAAA,IAAe,SAAA,GAAY,WAAA,IAAe,IAAA,CAAA,EAAQ;AACxG,UAAA,MAAM,IAAA,EAAM,kBAAA,CAAmB,UAAU,CAAA;AACzC,UAAA,MAAM,SAAA,EAAW,0BAAA,GAAS,EAAA,EAAI,mCAAA,GAAe,EAAK,GAAG,EAAA,EAAI,GAAA;AACzD,UAAA,MAAM,OAAA,EAAS,SAAA,GAAY,CAAC,0BAAA,QAAc,EAAA,EAAI,SAAA,EAAW,GAAA;AACzD,UAAA,GAAA,CAAI,OAAA,GAAU,OAAO,OAAA,IAAW,QAAA,EAAU;AACxC,YAAA,UAAA,CAAW,IAAA,CAAK;AAAA,cACd,GAAA,EAAK,QAAA,EAAU,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,IAAA,CAAK,GAAG,EAAA,EAAI,QAAA;AAAA,cAC/C,MAAA,EAAQ;AAAA,YACV,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,QAAA,GAAW,eAAA,GAAkB,cAAA,CAAe,MAAA,IAAU,KAAA,EAAA,GAAa,cAAA,CAAe,MAAA,IAAU,IAAA,EAAM;AACpG,MAAA,MAAM,YAAA,EAAc,cAAA,CAAe,KAAA;AACnC,MAAA,IAAI,QAAA;AACJ,MAAA,GAAA,CAAI,0BAAA,WAAiB,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,CAAC,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,EAAG;AACnC,UAAA,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA;AAC7B,UAAA,SAAA,EAAW,mCAAA,WAAe,EAAa,GAAG,CAAA;AAAA,QAC5C;AAAA,MACF,EAAA,KAAO;AACL,QAAA,SAAA,EAAW,WAAA;AAAA,MACb;AAEA,MAAA,GAAA,CAAI,SAAA,GAAY,CAAC,0BAAA,QAAc,CAAA,EAAG;AAChC,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,GAAA,EAAK,OAAA;AAAA,UACL,MAAA,EAAQ,QAAA;AAAA,UACR,aAAA,EAAe;AAAA,QACjB,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAQO,SAAS,uBAAA,CACd,MAAA,EACA,MAAA,EACA,GAAA,EACA,IAAA,EACA,SAAA,kBAAwB,IAAI,GAAA,CAAI,CAAA,EACS;AACzC,EAAA,IAAI;AACF,IAAA,GAAA,iBAAI,MAAA,6BAAQ,SAAA,IAAW,MAAA,EAAQ;AAC7B,MAAA,GAAA,CAAI,IAAA,CAAK,aAAA,EAAe;AACtB,QAAA,MAAM,WAAA,EAAa,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,UAAA,GAAa,EAAE,CAAA;AACzD,QAAA,GAAA,CAAI,WAAA,IAAe,KAAA,EAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AACzD,UAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAC1B,GAAA,CAAI,CAAA,GAAA,EAAA,GAAO;AACV,YAAA,MAAM,WAAA,EAAa,CAAC,IAAA,CAAK,SAAA,EAAW,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACjD,YAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,UAAU,EAAA,IAAM,KAAA,CAAA,EAAW;AAC/C,cAAA,OAAO,UAAA;AAAA,YACT;AAEA,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AAAA,QACnB;AAAA,MACF,EAAA,KAAA,GAAA,CAAW,IAAA,CAAK,UAAA,GAAa,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,EAAA,IAAM,KAAA,CAAA,EAAW;AAC5E,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACd,EAAA,KAAA,GAAA,CAAW,CAAC,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,QAAA,IAAY,KAAA,CAAA,EAAW;AAIxD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,EAAa,aAAA,CAAc,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA;AAC5D,IAAA,GAAA,CAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,UAAA,CACJ,OAAA,CAAQ,CAAC,EAAE,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,aAAA,EAAe,aAAa,CAAA,EAAA,GAAM;AACpE,MAAA,GAAA,CAAI,0BAAA,SAAe,CAAA,EAAG;AACpB,QAAA,MAAM,SAAA,EAAW,mCAAA,SAAe,EAAW,GAAG,CAAA;AAC9C,QAAA,GAAA,CAAI,SAAA,GAAY,CAAC,0BAAA,QAAc,CAAA,EAAG;AAChC,UAAA,OAAO,QAAA;AAAA,QACT;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,uBAAA;AAAA,QACL,MAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,UACE,OAAA,EAAS,IAAA,CAAK,OAAA;AAAA,UACd,SAAA,EAAW,GAAA;AAAA,UACX,aAAA,EAAe;AAAA,QACjB,CAAA;AAAA,QACA;AAAA,MACF,CAAA;AAAA,IACF,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB,EAAA,UAAQ;AAGN,IAAA,OAAO,CAAC,CAAA;AAAA,EACV;AACF;AAWO,SAAS,uBAAA,CAAwB,KAAA,EAAuC;AAC7E,EAAA,GAAA,CAAI,CAAA,CAAE,UAAA,GAAa,KAAA,EAAA,GAAU,OAAO,KAAA,CAAM,QAAA,IAAY,SAAA,GAAY,CAAC,KAAA,CAAM,OAAA,EAAS;AAChF,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC7C,EAAA,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS,CAAA,EAAG;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,4CAAA,WAAuC,EAAA,GAAK,IAAA;AACrD;AASO,SAAS,yBAAA,CAA0B,KAAA,EAAwB,WAAA,EAA0C;AAC1G,EAAA,GAAA,CAAI,CAAA,CAAE,UAAA,GAAa,KAAA,EAAA,GAAU,OAAO,KAAA,CAAM,QAAA,IAAY,SAAA,GAAY,CAAC,KAAA,CAAM,OAAA,EAAS;AAChF,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAA,EAAkB,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AACjD,EAAA,GAAA,CAAI,OAAO,gBAAA,IAAoB,SAAA,GAAY,gBAAA,GAAmB,SAAA,GAAY,gBAAA,GAAmB,eAAA,CAAgB,MAAA,EAAQ;AACnH,IAAA,OAAO,0BAAA,eAAM,CAAgB,MAAM,EAAA,EAAI,KAAA,EAAQ,eAAA,CAAgB,MAAA;AAAA,EACjE;AAEA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,gBAAA,CAAiB,GAAA,EAAuB;AACtD,EAAA,GAAA,CAAI,OAAO,IAAA,IAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACxB,MAAA,OAAO,OAAO,EAAA,IAAM,SAAA,GAAY,EAAA,IAAM,KAAA,EAAO,gBAAA,CAAiB,CAAC,EAAA,EAAI,CAAA;AAAA,IACrE,EAAA,WAAQ;AACN,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,GAAA,CAAI,GAAA,CAAI,gBAAgB,CAAA;AAAA,EACjC;AAEA,EAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,GAAQ,OAAO,IAAA,IAAQ,QAAA,EAAU;AAC3C,IAAA,MAAM,IAAA,EAA+B,CAAC,CAAA;AACtC,IAAA,IAAA,CAAA,MAAW,CAAC,CAAA,EAAG,CAAC,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,MAAA,GAAA,CAAI,CAAC,EAAA,EAAI,gBAAA,CAAiB,CAAC,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,gCAAA,CACd,GAAA,EACA,MAAA,EACA,GAAA,EACA,SAAA,kBAAwB,IAAI,GAAA,CAAI,CAAA,EACvB;AAET,EAAA,GAAA,CAAI,OAAA,IAAW,KAAA,CAAA,EAAW,OAAO,gBAAA,CAAiB,GAAG,CAAA;AAErD,EAAA,IAAI,SAAA,EAAyB,MAAA;AAC7B,EAAA,GAAA,CAAI,0BAAA,MAAY,CAAA,EAAG;AAGjB,IAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC7B,MAAA,OAAO,gBAAA,CAAiB,GAAG,CAAA;AAAA,IAC7B;AAEA,IAAA,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AACxB,IAAA,MAAM,MAAA,EAAQ,mCAAA,MAAe,EAAQ,GAAG,CAAA;AACxC,IAAA,GAAA,CAAI,CAAC,MAAA,GAAS,0BAAA,KAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,gBAAA,CAAiB,GAAG,CAAA;AAAA,IAC7B;AAEA,IAAA,SAAA,EAAW,KAAA;AAAA,EACb;AAKA,EAAA,MAAM,KAAA,EAAO,kBAAA,CAAmB,QAAQ,CAAA;AACxC,EAAA,GAAA,CAAI,0BAAA,IAAU,CAAA,EAAG;AACf,IAAA,OAAO,gCAAA,CAAiC,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,QAAQ,CAAA;AAAA,EAClE;AAEA,EAAA,SAAA,EAAW,IAAA;AAEX,EAAA,GAAA,CAAI,OAAO,IAAA,IAAQ,QAAA,EAAU;AAE3B,IAAA,GAAA,CAAI,aAAA,CAAc,QAAA,EAAU,QAAQ,EAAA,GAAK,QAAA,CAAS,OAAA,IAAW,MAAA,EAAQ;AACnE,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO,gBAAA,CAAiB,GAAG,CAAA;AAAA,EAC7B;AAEA,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAEtB,IAAA,IAAI,MAAA,EAAQ,QAAA,CAAS,KAAA;AACrB,IAAA,GAAA,CAAI,MAAA,GAAS,OAAO,MAAA,IAAU,SAAA,GAAY,0BAAA,KAAW,CAAA,EAAG;AAItD,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAC5B,QAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAA,IAAA,EAAA,GAAQ,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,MAC/C;AAEA,MAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AACvB,MAAA,MAAM,WAAA,EAAa,mCAAA,KAAe,EAAO,GAAG,CAAA;AAC5C,MAAA,MAAA,EAAQ,WAAA,GAAc,CAAC,0BAAA,UAAgB,EAAA,EAAI,WAAA,EAAa,KAAA,CAAA;AAAA,IAC1D;AAEA,IAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAA,IAAA,EAAA,GAAQ,gCAAA,CAAiC,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,IAAI,GAAA,CAAI,QAAQ,CAAC,CAAC,CAAA;AAAA,EAC9F;AAEA,EAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,GAAQ,OAAO,IAAA,IAAQ,QAAA,EAAU;AAG3C,IAAA,GAAA,CAAI,CAAC,QAAA,CAAS,WAAA,GAAc,OAAO,QAAA,CAAS,WAAA,IAAe,QAAA,EAAU;AACnE,MAAA,OAAO,gBAAA,CAAiB,GAAG,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,IAAA,EAA+B,CAAC,CAAA;AACtC,IAAA,IAAA,CAAA,MAAW,CAAC,CAAA,EAAG,CAAC,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,MAAA,MAAM,WAAA,EAAa,QAAA,CAAS,UAAA,CAAW,CAAC,CAAA;AACxC,MAAA,GAAA,CAAI,CAAC,EAAA,EAAI,gCAAA,CAAiC,CAAA,EAAG,UAAA,EAAY,GAAA,EAAK,IAAI,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,IACjF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,GAAA;AACT;AJ5HA;AACA;AK7RA,IAAM,kBAAA,EAAoB,CAAC,IAAA,EAAA,GAAiB,oBAAA,CAAqB,OAAA,CAAQ,IAAI,EAAA,EAAI,CAAA,CAAA;AACjF,IAAM,oBAAA,EAAsB,CAAC,IAAA,EAAA,GAAiB,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAE3E,SAAS,YAAA,CAAa,KAAA,EAAe;AACnC,EAAA,IAAI;AACF,IAAA,OAAO,kBAAA,CAAmB,KAAK,EAAA,IAAM,KAAA;AAAA,EACvC,EAAA,WAAQ;AAGN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,QAAA,CAAS,KAAA,EAAgB;AAChC,EAAA,OAAO,OAAO,MAAA,IAAU,SAAA,GAAY,MAAA,IAAU,IAAA;AAChD;AAEA,SAAS,0BAAA,CACP,GAAA,EACA;AAAA,EACE,MAAA;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,EAClB;AACF,EAAA,EAII,CAAC,CAAA,EACL,KAAA,EACK;AACL,EAAA,GAAA,CAAI,OAAO,IAAA,IAAQ,QAAA,EAAU;AAE3B,IAAA,IAAA,EAAO,GAAA,CAAe,QAAA,CAAS,CAAA;AAAA,EACjC;AAEA,EAAA,GAAA,CAAI,eAAA,EAAiB;AACnB,IAAA,GAAA,CAAI,YAAA,CAAa,GAAG,CAAA,EAAG;AACrB,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,OAAO,IAAA,IAAQ,SAAA,GAAY,CAAC,GAAA,CAAI,MAAA,EAAQ;AAC1C,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,GAAA,CAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,GAAA,CAAI,KAAA,EAAO;AACT,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACvB;AAKA,EAAA,OAAO,CAAC,GAAG,GAAG,CAAA,CACX,GAAA,CAAI,CAAA,IAAA,EAAA,GAAQ;AACX,IAAA,GAAA,CAAI,mBAAA,CAAoB,IAAI,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,GAAA,CAAI,iBAAA,CAAkB,IAAI,EAAA,GAAA,CAAM,OAAA,IAAW,SAAA,GAAY,iBAAA,CAAA,EAAoB;AACzE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,EAAU,IAAI,WAAA,CAAY,CAAA;AAChC,IAAA,MAAM,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAC,CAAA,CAC5C,GAAA,CAAI,CAAA,IAAA,EAAA,GAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAE,WAAA,CAAY,CAAC,CAAA,CAAA;AAI3C,IAAA;AAED,EAAA;AACZ;AAYqD;AACjC,EAAA;AAEQ,EAAA;AACC,IAAA;AAC3B,EAAA;AAEqB,EAAA;AACO,IAAA;AAC5B,EAAA;AAE6B,EAAA;AAC/B;AAKqB;AACnB,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACoB,EAAA;AACkC;AAChB,EAAA;AAElB,IAAA;AACT,MAAA;AACT,IAAA;AAE+C,IAAA;AAC7C,MAAA;AAC8B,MAAA;AAC9B,MAAA;AACD,IAAA;AAEM,IAAA;AACT,EAAA;AAEe,EAAA;AAAA;AAAA;AAAA;AAAA;AAKR,IAAA;AACgD,MAAA;AAAA;AAAA;AAAA;AAAA;AAMhD,IAAA;AACqD,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASrD,IAAA;AAGuB,MAAA;AACA,QAAA;AACe,UAAA;AACrC,QAAA;AACsB,QAAA;AACnB,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASJ,IAAA;AACuE,MAAA;AAAA;AAAA;AAAA;AAAA;AAMvE,IAAA;AAC2E,MAAA;AAAA;AAAA;AAAA;AAAA;AAM3E,IAAA;AAC2E,MAAA;AAEhF,IAAA;AACS,MAAA;AACX,EAAA;AACF;AAKmH;AAE/E,EAAA;AAC9B,IAAA;AAC8B,IAAA;AAC9B,IAAA;AACD,EAAA;AAEgC,EAAA;AAEpB,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQR,IAAA;AACqC,MAAA;AACF,QAAA;AACD,QAAA;AACA,QAAA;AAEO,QAAA;AACvC,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASF,IAAA;AACqC,MAAA;AACF,QAAA;AACD,QAAA;AACA,QAAA;AAEO,QAAA;AACvC,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASF,IAAA;AACU,MAAA;AAC6B,QAAA;AACF,UAAA;AACD,UAAA;AAEL,UAAA;AAC3B,QAAA;AACP,MAAA;AAEwC,MAAA;AACF,QAAA;AACM,QAAA;AAEZ,QAAA;AAC3B,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASF,IAAA;AACqC,MAAA;AACF,QAAA;AACoB,QAAA;AACtB,QAAA;AAEO,QAAA;AACtC,MAAA;AAAA;AAAA;AAAA;AAAA;AAMF,IAAA;AACqC,MAAA;AACF,QAAA;AACD,QAAA;AAEL,QAAA;AAC3B,MAAA;AAAA;AAAA;AAAA;AAAA;AAMF,IAAA;AACqC,MAAA;AACF,QAAA;AACD,QAAA;AAEL,QAAA;AAC3B,MAAA;AAAA;AAAA;AAAA;AAAA;AAMF,IAAA;AAC6B,MAAA;AACM,QAAA;AACvB,QAAA;AACV,MAAA;AAEP,IAAA;AACS,MAAA;AACX,EAAA;AACF;AAK6G;AAEzE,EAAA;AAC9B,IAAA;AACsD,IAAA;AACtD,IAAA;AACD,EAAA;AAEY,EAAA;AAAA;AAAA;AAAA;AAAA;AAKR,IAAA;AACsB,MAAA;AAAA;AAAA;AAAA;AAAA;AAMtB,IAAA;AAC2B,MAAA;AAAA;AAAA;AAAA;AAAA;AAM3B,IAAA;AACe,MAAA;AACF,QAAA;AAChB,MAAA;AAEqC,MAAA;AAAA;AAAA;AAAA;AAAA;AAMlC,IAAA;AACsB,MAAA;AAAA;AAAA;AAAA;AAAA;AAMtB,IAAA;AACsB,MAAA;AAE3B,IAAA;AACS,MAAA;AACX,EAAA;AACF;ALiMuG;AACA;AGhjBxC;AACoC,EAAA;AACnG;AAEkE;AACwB,EAAA;AAC1F;AAQ4C;AACzB,EAAA;AAEsB,EAAA;AAC9B,IAAA;AACT,EAAA;AAE+B,EAAA;AACuC,IAAA;AAEvC,IAAA;AACd,MAAA;AACf,IAAA;AACF,EAAA;AAEoC,EAAA;AACK,IAAA;AACgC,MAAA;AACtE,IAAA;AACH,EAAA;AAEO,EAAA;AACT;AAEkE;AAC/C,EAAA;AAGgF,EAAA;AAGlE,IAAA;AACpB,MAAA;AACT,IAAA;AAIO,IAAA;AACT,EAAA;AAI6B,EAAA;AACmB,IAAA;AAChD,EAAA;AAW0E,EAAA;AACjE,IAAA;AACT,EAAA;AAOkF,EAAA;AAC3B,IAAA;AACnC,IAAA;AACT,MAAA;AACT,IAAA;AAKI,IAAA;AACmC,IAAA;AACJ,MAAA;AAC5B,IAAA;AACoB,MAAA;AAC3B,IAAA;AAEmE,IAAA;AACrE,EAAA;AASsB,EAAA;AACV,EAAA;AACoB,IAAA;AACpB,MAAA;AAC0B,IAAA;AAC1B,MAAA;AAC4B,IAAA;AAC5B,MAAA;AAC4B,IAAA;AAC5B,MAAA;AACV,IAAA;AACF,EAAA;AAEwB,EAAA;AACuB,EAAA;AAOnC,IAAA;AACZ,EAAA;AAEe,EAAA;AACO,IAAA;AACb,IAAA;AACQ,IAAA;AACf,IAAA;AACA,IAAA;AAAA;AAAA;AAAA;AAAA;AAKQ,IAAA;AACkF,IAAA;AAC3F,EAAA;AACH;AAEkE;AAE5C,EAAA;AAC4B,IAAA;AACtB,MAAA;AAQR,QAAA;AAE4B,QAAA;AACX,MAAA;AACO,QAAA;AACpC,MAAA;AACF,IAAA;AAGW,EAAA;AACiB,IAAA;AACrB,IAAA;AACS,MAAA;AAAA;AAEkC,MAAA;AAClD,IAAA;AACD,EAAA;AACL;AAI+D;AAmB3D,EAAA;AACyC,IAAA;AACS,IAAA;AAC1B,IAAA;AACE,MAAA;AACzB,IAAA;AACM,IAAA;AACT,EAAA;AAE0B,EAAA;AACA,IAAA;AACY,MAAA;AACnC,IAAA;AACH,EAAA;AAEiD,EAAA;AACN,IAAA;AAEP,IAAA;AACM,MAAA;AACc,QAAA;AAC1B,QAAA;AACE,UAAA;AACzB,QAAA;AACI,MAAA;AAC2C,QAAA;AAClD,MAAA;AACD,IAAA;AAEM,IAAA;AACT,EAAA;AAEoC,EAAA;AACtC;AAEmD;AAGO,EAAA;AAAA;AAGhC,EAAA;AAIX,EAAA;AAEf;AAE6E;AAK7C,EAAA;AAErB,IAAA;AACT,EAAA;AAW8B,EAAA;AACS,IAAA;AACvC,EAAA;AAEoC,EAAA;AACtC;AHsbuG;AACA;ACrqBrG;AACiB,EAAA;AACsB,IAAA;AAGN,IAAA;AACjC,EAAA;AAEI,EAAA;AAGiD,EAAA;AACpB,IAAA;AACW,EAAA;AAClC,IAAA;AACiF,EAAA;AACpE,IAAA;AACqB,EAAA;AACO,IAAA;AAC4B,IAAA;AAC7D,IAAA;AACU,EAAA;AAGb,IAAA;AACf,EAAA;AASGA,EAAAA;AAGyB,IAAA;AAIjB,MAAA;AACT,IAAA;AAE2B,IAAA;AAC7B,EAAA;AAEyB,EAAA;AAKuC,IAAA;AAC7B,MAAA;AACjC,IAAA;AAEO,IAAA;AACT,EAAA;AAEO,EAAA;AACT;AAEqH;AAC/E,EAAA;AAEiB,EAAA;AAErC,IAAA;AAEqB,MAAA;AACtB,QAAA;AACT,MAAA;AAEiD,MAAA;AAE1C,MAAA;AACC,QAAA;AAAA;AAEuC,QAAA;AAAA;AAEI,QAAA;AAEoC,QAAA;AAExD,QAAA;AACzB,QAAA;AACN,MAAA;AAEa,IAAA;AACnB,EAAA;AAIQ,EAAA;AACV;AAEiF;AACtC,EAAA;AACtC;AAEqD;AACjB,EAAA;AAKpB,EAAA;AACuC,IAAA;AAC1C,IAAA;AACL,MAAA;AACT,IAAA;AAEc,IAAA;AAChB,EAAA;AAEO,EAAA;AACT;AAEmC;AAC2C,EAAA;AAC9E;AAE+D;AACjD,EAAA;AAC0E,IAAA;AAC3D,MAAA;AACxB,IAAA;AACH,EAAA;AACF;AAEgD;AACJ,EAAA;AACrB,IAAA;AACwC,EAAA;AACxC,IAAA;AACrB,EAAA;AAE2B,EAAA;AAC7B;AAUE;AACkC,EAAA;AAER,EAAA;AAGK,IAAA;AACe,MAAA;AAC3C,IAAA;AACqD,EAAA;AAGpB,IAAA;AACQ,MAAA;AACzC,IAAA;AACI,EAAA;AAES,IAAA;AACT,MAAA;AACH,MAAA;AACmB,MAAA;AACpB,IAAA;AACH,EAAA;AACF;AAEqC;AACZ,EAAA;AACd,IAAA;AAKK,EAAA;AAIoB,IAAA;AAClB,MAAA;AACd,IAAA;AAE8B,IAAA;AAChC,EAAA;AAEqB,EAAA;AACvB;AAiBE;AACI,EAAA;AACyE,EAAA;AAUlB,IAAA;AACzC,IAAA;AACd,MAAA;AACyB,sBAAA;AACG,sBAAA;AAC8C,MAAA;AAC5E,IAAA;AACK,EAAA;AACO,IAAA;AACd,EAAA;AAEwC,EAAA;AAEX,EAAA;AACxB,IAAA;AACA,IAAA;AACL,EAAA;AAEsB,EAAA;AACF,IAAA;AACN,MAAA;AACuB,MAAA;AACnC,IAAA;AACF,EAAA;AAG4B,EAAA;AACsB,IAAA;AACa,IAAA;AAC/D,EAAA;AAEqB,EAAA;AACT,IAAA;AACA,IAAA;AACG,IAAA;AACC,IAAA;AAAA;AAEH,IAAA;AACD,IAAA;AAC2B,IAAA;AACqE,IAAA;AACxG,MAAA;AACA,MAAA;AACF,IAAA;AACa,IAAA;AACf,EAAA;AAEmB,EAAA;AAC+B,IAAA;AACT,MAAA;AACvC,IAAA;AACF,EAAA;AAE2C,EAAA;AAEwB,EAAA;AAC3B,IAAA;AAGyC,IAAA;AAI9B,IAAA;AACiB,MAAA;AAClE,IAAA;AAE4C,IAAA;AAC7C,EAAA;AAEoE,EAAA;AAC3C,EAAA;AACY,IAAA;AAC0B,MAAA;AACL,MAAA;AACxD,IAAA;AACH,EAAA;AAGiE,EAAA;AAC5C,EAAA;AACO,IAAA;AACgC,MAAA;AACV,MAAA;AAC/C,IAAA;AACH,EAAA;AAGgC,EAAA;AAC6B,IAAA;AAEI,MAAA;AACvC,MAAA;AAEG,MAAA;AACJ,MAAA;AAIkE,MAAA;AAEtE,MAAA;AACT,QAAA;AAC+B,QAAA;AACtC,MAAA;AAEM,MAAA;AACR,IAAA;AACH,EAAA;AAGqB,EAAA;AACsB,EAAA;AACsB,EAAA;AAC5C,EAAA;AACO,IAAA;AACgC,MAAA;AACtB,MAAA;AAEgB,MAAA;AAC/B,QAAA;AACS,QAAA;AAC5B,MAAA;AAE8C,MAAA;AAC/C,IAAA;AACH,EAAA;AAG8D,EAAA;AACtC,EAAA;AACe,IAAA;AACgD,MAAA;AAChE,QAAA;AACgB,QAAA;AACnC,MAAA;AAEiB,MAAA;AACQ,QAAA;AACG,QAAA;AAC3B,MAAA;AACF,IAAA;AACH,EAAA;AAEqB,EAAA;AAEqE,IAAA;AACL,IAAA;AAChE,MAAA;AACT,QAAA;AACqC,QAAA;AAC5C,MAAA;AACH,IAAA;AAGuF,IAAA;AACU,IAAA;AAC9E,MAAA;AACT,QAAA;AAC4C,QAAA;AACnD,MAAA;AACH,IAAA;AACF,EAAA;AAEI,EAAA;AAC4B,EAAA;AACuC,IAAA;AAIE,MAAA;AACtE,IAAA;AACH,EAAA;AAEmE,EAAA;AAC3B,IAAA;AAEJ,IAAA;AACiB,MAAA;AACgD,QAAA;AAE9D,QAAA;AACwD,UAAA;AAE5C,UAAA;AACpB,YAAA;AACnB,cAAA;AAC6C,cAAA;AAC9C,YAAA;AACF,UAAA;AAEc,UAAA;AACjB,QAAA;AACF,MAAA;AAIsC,IAAA;AAEI,MAAA;AACV,MAAA;AAEL,MAAA;AACrB,QAAA;AACmF,UAAA;AAEpE,UAAA;AAC8C,YAAA;AAKF,YAAA;AAac,YAAA;AACb,cAAA;AACxB,cAAA;AACzB,gBAAA;AAImB,cAAA;AAInB,gBAAA;AACT,cAAA;AAEO,cAAA;AACR,YAAA;AAE4B,YAAA;AACe,cAAA;AAE6B,cAAA;AAGhD,cAAA;AAAA;AAAA;AAAA;AAMrB,cAAA;AACkF,gBAAA;AACpF,cAAA;AAE4B,cAAA;AACa,gBAAA;AAC4C,kBAAA;AAEtE,kBAAA;AAKuD,oBAAA;AAEb,oBAAA;AACxB,oBAAA;AACX,sBAAA;AAChB,oBAAA;AAE+B,oBAAA;AACG,sBAAA;AACC,wBAAA;AACnB,wBAAA;AAC4C,0BAAA;AACzB,0BAAA;AACI,4BAAA;AACjC,0BAAA;AACF,wBAAA;AACF,sBAAA;AAE+D,sBAAA;AAChE,oBAAA;AACH,kBAAA;AACD,gBAAA;AACH,cAAA;AACF,YAAA;AACK,UAAA;AAC4C,YAAA;AAIb,YAAA;AAIsB,cAAA;AACnD,YAAA;AAS+E,cAAA;AACzE,gBAAA;AACV,cAAA;AAEiD,cAAA;AAC5C,gBAAA;AAC4C,kBAAA;AACxC,oBAAA;AACmE,sBAAA;AAC/D,oBAAA;AAER,oBAAA;AACD,kBAAA;AAI8C,kBAAA;AACvB,oBAAA;AACxB,kBAAA;AAE4C,kBAAA;AACtC,gBAAA;AACqC,kBAAA;AAC7C,gBAAA;AACK,cAAA;AAID,gBAAA;AACiF,kBAAA;AACtC,kBAAA;AAGvC,oBAAA;AACC,kBAAA;AACoC,oBAAA;AAC3C,kBAAA;AACM,gBAAA;AAC4C,kBAAA;AACpD,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACM,QAAA;AAGiE,UAAA;AACzE,QAAA;AACK,MAAA;AACyE,QAAA;AAChF,MAAA;AACF,IAAA;AACF,EAAA;AAKgG,EAAA;AAC7E,IAAA;AACT,MAAA;AACC,MAAA;AACR,IAAA;AACH,EAAA;AAEmD,EAAA;AAEjB,EAAA;AAEQ,IAAA;AACG,MAAA;AAC8B,QAAA;AACjD,QAAA;AAClB,UAAA;AACF,QAAA;AAIkD,QAAA;AAC4B,UAAA;AAC1E,YAAA;AACF,UAAA;AACF,QAAA;AAI0B,QAAA;AACsD,UAAA;AAE9E,QAAA;AACA,UAAA;AACF,QAAA;AAEgD,QAAA;AACjD,MAAA;AACF,IAAA;AACH,EAAA;AAGkD,EAAA;AACrC,IAAA;AACb,EAAA;AAEO,EAAA;AACA,IAAA;AACM,MAAA;AACP,QAAA;AACW,UAAA;AACX,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;ADybuG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/erunion/code/readme/oas/packages/oas-to-har/dist/index.cjs","sourcesContent":[null,"import type { PostData, PostDataParams, Request } from 'har-format';\nimport type { Extensions } from 'oas/extensions';\nimport type {\n HttpMethods,\n JSONSchema,\n MediaTypeObject,\n OASDocument,\n OperationObject,\n ParameterObject,\n SchemaObject,\n SchemaWrapper,\n ServerVariable,\n} from 'oas/types';\nimport type { AuthForHAR, DataForHAR, oasToHarOptions } from './lib/types.js';\n\nimport { parse as parseDataUrl } from '@readme/data-urls';\nimport Oas from 'oas';\nimport { HEADERS, PROXY_ENABLED } from 'oas/extensions';\nimport { Operation } from 'oas/operation';\nimport { isRef } from 'oas/types';\nimport { jsonSchemaTypes, matchesMimeType } from 'oas/utils';\nimport removeUndefinedObjects from 'remove-undefined-objects';\n\nimport configureSecurity from './lib/configure-security.js';\nimport { get, set } from './lib/lodash.js';\nimport { formatStyle } from './lib/style-formatting/index.js';\nimport {\n getParameterContentSchema,\n getParameterContentType,\n getSafeRequestBody,\n getTypedFormatsInSchema,\n hasSchemaType,\n parseJSONStringsInBodyWithSchema,\n} from './lib/utils.js';\n\nfunction formatter(\n values: DataForHAR,\n param: ParameterObject,\n type: 'body' | 'cookie' | 'header' | 'path' | 'query',\n onlyIfExists = false,\n) {\n if (param.style) {\n const value = values[type][param.name];\n // Note: Technically we could send everything through the format style and choose the proper\n // default for each `in` type (e.g. query defaults to form).\n return formatStyle(value, param);\n }\n\n let value: string | number | boolean | undefined;\n\n // Handle missing values\n if (typeof values[type][param.name] !== 'undefined') {\n value = values[type][param.name];\n } else if (onlyIfExists && !param.required) {\n value = undefined;\n } else if (param.required && param.schema && !isRef(param.schema) && param.schema.default) {\n value = param.schema.default;\n } else if (param.required && param.content) {\n const contentType = getParameterContentType(param);\n const schema = contentType ? getParameterContentSchema(param, contentType) : null;\n value = schema?.default;\n } else if (type === 'path') {\n // If we don't have any values for the path parameter, just use the name of the parameter as the\n // value so we don't try try to build a URL to something like `https://example.com/undefined`.\n return param.name;\n }\n\n // Handle file uploads. Specifically arrays of file uploads which need to be formatted very\n // specifically.\n if (\n param.schema &&\n !isRef(param.schema) &&\n param.schema.type === 'array' &&\n param.schema.items &&\n !isRef(param.schema.items) &&\n param.schema.items.format === 'binary'\n ) {\n if (Array.isArray(value)) {\n // If this is array of binary data then we shouldn't do anything because we'll prepare them\n // separately in the HAR in order to preserve `fileName` and `contentType` data within\n // `postData.params`. If we don't then the HAR we generate for this data will be invalid.\n return value;\n }\n\n return JSON.stringify(value);\n }\n\n if (value !== undefined) {\n // Query params should always be formatted, even if they don't have a `style` serialization\n // configured. Content-based header params also need formatting to properly serialize values\n // (e.g. JSON.stringify objects) instead of passing raw objects through. However, schema-based\n // header params should NOT be formatted as this would incorrectly URL-encode their values.\n if (type === 'query' || (type === 'header' && param.content)) {\n return formatStyle(value, param);\n }\n\n return value;\n }\n\n return undefined;\n}\n\nfunction multipartBodyToFormatterParams(payload: unknown, oasMediaTypeObject: MediaTypeObject, schema: SchemaObject) {\n const encoding = oasMediaTypeObject.encoding;\n\n if (typeof payload === 'object' && payload !== null) {\n return Object.keys(payload)\n .map(key => {\n // If we have an incoming parameter, but it's not in the schema ignore it.\n if (!schema.properties?.[key]) {\n return false;\n }\n\n const paramEncoding = encoding ? encoding[key] : undefined;\n\n return {\n name: key,\n // If the style isn't defined, use the default\n style: paramEncoding ? paramEncoding.style : undefined,\n // If explode isn't defined, use the default\n explode: paramEncoding ? paramEncoding.explode : undefined,\n required:\n (schema.required && typeof schema.required === 'boolean' && Boolean(schema.required)) ||\n (Array.isArray(schema.required) && schema.required.includes(key)),\n schema: schema.properties[key],\n in: 'body',\n };\n })\n .filter(Boolean) as ParameterObject[];\n }\n\n // Pretty sure that we'll never have anything but an object for multipart bodies, so returning\n // empty array if we get anything else.\n return [];\n}\n\nconst defaultFormDataTypes = Object.keys(jsonSchemaTypes).reduce((prev, curr) => {\n return Object.assign(prev, { [curr]: {} });\n}, {});\n\nfunction getResponseContentType(content: MediaTypeObject) {\n const types = Object.keys(content) || [];\n\n // If this response content has multiple types available we should always prefer the one that's\n // JSON-compatible. If they don't have one that is we'll return the first available, otherwise\n // if they don't have **any** repsonse content types present we'll assume it's JSON.\n if (types?.length) {\n const jsonType = types.find(t => matchesMimeType.json(t));\n if (jsonType) {\n return jsonType;\n }\n\n return types[0];\n }\n\n return 'application/json';\n}\n\nfunction isPrimitive(val: unknown) {\n return typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean';\n}\n\nfunction stringify(json: Record<string | 'RAW_BODY', unknown>) {\n return JSON.stringify(\n removeUndefinedObjects(typeof json.RAW_BODY !== 'undefined' ? json.RAW_BODY : json, {\n preserveNullishArrays: true,\n }),\n );\n}\n\nfunction stringifyParameter(param: any): string {\n if (param === null || isPrimitive(param)) {\n return String(param);\n } else if (Array.isArray(param) && param.every(isPrimitive)) {\n return String(param);\n }\n\n return JSON.stringify(param);\n}\n\nfunction appendHarValue(\n harParam: PostDataParams['params'] | Request['cookies'] | Request['headers'] | Request['queryString'],\n name: string,\n value: any,\n addtlData: {\n contentType?: string;\n fileName?: string;\n } = {},\n) {\n if (typeof value === 'undefined') return;\n\n if (Array.isArray(value)) {\n // If the formatter gives us an array, we're expected to add each array value as a new\n // parameter item with the same parameter name\n value.forEach(singleValue => {\n appendHarValue(harParam, name, singleValue);\n });\n } else if (typeof value === 'object' && value !== null) {\n // If the formatter gives us an object, we're expected to add each property value as a new\n // parameter item, each with the name of the property\n Object.keys(value).forEach(key => {\n appendHarValue(harParam, key, value[key]);\n });\n } else {\n // If the formatter gives us a non-array, non-object, we add it as is\n harParam.push({\n ...addtlData,\n name,\n value: String(value),\n });\n }\n}\n\nfunction encodeBodyForHAR(body: any) {\n if (isPrimitive(body)) {\n return body;\n } else if (\n typeof body === 'object' &&\n body !== null &&\n !Array.isArray(body) &&\n typeof body.RAW_BODY !== 'undefined'\n ) {\n // `RAW_BODY` is a ReadMe-specific thing where we'll interpret the entire payload as a\n // raw string. https://docs.readme.com/docs/raw-body-content\n if (isPrimitive(body.RAW_BODY)) {\n return body.RAW_BODY;\n }\n\n return stringify(body.RAW_BODY);\n }\n\n return stringify(body);\n}\n\n// biome-ignore lint/style/noDefaultExport: This is fine for now.\nexport default function oasToHar(\n oas: Oas,\n operationSchema?: Operation,\n values: DataForHAR = {},\n auth: AuthForHAR = {},\n opts: oasToHarOptions = { proxyUrl: '' },\n): {\n log: {\n entries: readonly [\n {\n readonly request: Request;\n },\n ];\n };\n} {\n let operation: Operation;\n if (!operationSchema || typeof operationSchema.getParameters !== 'function') {\n /**\n * If `operationSchema` was supplied as a plain object instead of an instance of `Operation`\n * then we should create a new instance of it. We're doing it with a check on `getParameters`\n * instead of checking `instanceof Operation` because JS is very weird when it comes to\n * checking `instanceof` against classes. One instance of `Operation` may not always match up\n * with another if they're being loaded between two different libraries.\n *\n * It's weird. This is easier.\n */\n const currentOas = Oas.init(oas as unknown as OASDocument);\n operation = new Operation(\n currentOas,\n operationSchema?.path || '',\n operationSchema?.method || ('' as HttpMethods),\n (operationSchema as unknown as OperationObject) || { path: '', method: '' },\n );\n } else {\n operation = operationSchema;\n }\n\n const apiDefinition = oas.getDefinition();\n\n const formData: DataForHAR = {\n ...defaultFormDataTypes,\n ...values,\n };\n\n if (!formData.server) {\n formData.server = {\n selected: 0,\n variables: oas.defaultVariables(0),\n };\n }\n\n // If the incoming `server.variables` is missing variables let's pad it out with defaults.\n formData.server.variables = {\n ...oas.defaultVariables(formData.server.selected),\n ...(formData.server.variables ? formData.server.variables : {}),\n };\n\n const har: Request = {\n cookies: [],\n headers: [],\n headersSize: 0,\n queryString: [],\n // @ts-expect-error This is fine because we're fleshing `postData` out further down.\n postData: {},\n bodySize: 0,\n method: operation.method.toUpperCase(),\n url: `${oas.url(formData.server.selected, formData.server.variables as ServerVariable)}${operation.path}`.replace(\n /\\s/g,\n '%20',\n ),\n httpVersion: 'HTTP/1.1',\n };\n\n if (opts.proxyUrl) {\n if (oas.getExtension(PROXY_ENABLED, operation)) {\n har.url = `${opts.proxyUrl}/${har.url}`;\n }\n }\n\n const parameters = operation.getParameters();\n\n har.url = har.url.replace(/{([-_a-zA-Z0-9[\\]]+)}/g, (full, key) => {\n if (!operation || !parameters) return key; // No path params at all\n\n // Find the path parameter or set a default value if it does not exist\n const parameter = parameters.find(param => param.name === key) || ({ name: key } as ParameterObject);\n\n // The library that handles our style processing already encodes uri elements. For everything\n // else we need to handle it here.\n if (!('style' in parameter) || !parameter.style) {\n return encodeURIComponent(formatter(formData, parameter, 'path'));\n }\n\n return formatter(formData, parameter, 'path');\n });\n\n const queryStrings = parameters?.filter(param => param.in === 'query');\n if (queryStrings?.length) {\n queryStrings.forEach(queryString => {\n const value = formatter(formData, queryString, 'query', true);\n appendHarValue(har.queryString, queryString.name, value);\n });\n }\n\n // Do we have any `cookie` parameters on the operation?\n const cookies = parameters?.filter(param => param.in === 'cookie');\n if (cookies?.length) {\n cookies.forEach(cookie => {\n const value = formatter(formData, cookie, 'cookie', true);\n appendHarValue(har.cookies, cookie.name, value);\n });\n }\n\n // Does this response have any documented content types?\n if (operation.schema.responses) {\n Object.keys(operation.schema.responses).some(statusCode => {\n // `getResponseByStatusCode` will lazily dereference the response if it's a `$ref` pointer.\n const response = operation.getResponseByStatusCode(statusCode);\n if (!response) return false;\n\n const content = response.content;\n if (!content) return false;\n\n // If there's no `accept` header present we should add one so their eventual code snippet\n // follows best practices.\n if (Object.keys(formData.header || {}).find(h => h.toLowerCase() === 'accept')) return true;\n\n har.headers.push({\n name: 'accept',\n value: getResponseContentType(content),\n });\n\n return true;\n });\n }\n\n // Do we have any `header` parameters on the operation?\n let hasContentType = false;\n let contentType = operation.getContentType();\n const headers = parameters?.filter(param => param.in === 'header');\n if (headers?.length) {\n headers.forEach(header => {\n const value = formatter(formData, header, 'header', true);\n if (typeof value === 'undefined') return;\n\n if (header.name.toLowerCase() === 'content-type') {\n hasContentType = true;\n contentType = String(value);\n }\n\n appendHarValue(har.headers, header.name, value);\n });\n }\n\n // Are there `x-headers` static headers configured for this OAS?\n const userDefinedHeaders = oas.getExtension(HEADERS, operation) as Extensions['headers'];\n if (userDefinedHeaders) {\n userDefinedHeaders.forEach(header => {\n if (typeof header.key === 'string' && header.key.toLowerCase() === 'content-type') {\n hasContentType = true;\n contentType = String(header.value);\n }\n\n har.headers.push({\n name: String(header.key),\n value: String(header.value),\n });\n });\n }\n\n if (formData.header) {\n // Do we have an `accept` header set up in the form data, but it hasn't been added yet?\n const acceptHeader = Object.keys(formData.header).find(h => h.toLowerCase() === 'accept');\n if (acceptHeader && !har.headers.find(hdr => hdr.name.toLowerCase() === 'accept')) {\n har.headers.push({\n name: 'accept',\n value: String(formData.header[acceptHeader]),\n });\n }\n\n // Do we have a manually-defined `authorization` header set up in the form data?\n const authorizationHeader = Object.keys(formData.header).find(h => h.toLowerCase() === 'authorization');\n if (authorizationHeader && !har.headers.find(hdr => hdr.name.toLowerCase() === 'authorization')) {\n har.headers.push({\n name: 'authorization',\n value: String(formData.header[authorizationHeader]),\n });\n }\n }\n\n let requestBody: SchemaWrapper | undefined;\n if (operation.hasRequestBody()) {\n requestBody = operation.getParametersAsJSONSchema()?.find(payload => {\n // `formData` is used in our API Explorer for `application/x-www-form-urlencoded` endpoints\n // and if you have an operation with that, it will only ever have a `formData`. `body` is\n // used for all other payload shapes.\n return payload.type === (operation.isFormUrlEncoded() ? 'formData' : 'body');\n });\n }\n\n if (requestBody?.schema && Object.keys(requestBody.schema).length) {\n const requestBodySchema = requestBody.schema;\n\n if (operation.isFormUrlEncoded()) {\n if (Object.keys(formData.formData || {}).length) {\n const cleanFormData = removeUndefinedObjects(formData.formData, { preserveNullishArrays: true });\n\n if (cleanFormData !== undefined) {\n const postData: PostData = { params: [], mimeType: 'application/x-www-form-urlencoded' };\n\n Object.keys(cleanFormData).forEach(name => {\n postData.params.push({\n name,\n value: stringifyParameter(cleanFormData[name]),\n });\n });\n\n har.postData = postData;\n }\n }\n } else if (\n 'body' in formData &&\n formData.body !== undefined &&\n (isPrimitive(formData.body) || Object.keys(formData.body).length)\n ) {\n const isMultipart = operation.isMultipart();\n const isJSON = operation.isJson();\n\n if (isMultipart || isJSON) {\n try {\n let cleanBody = removeUndefinedObjects(formData.body, { preserveNullishArrays: true });\n\n if (isMultipart) {\n har.postData = { params: [], mimeType: 'multipart/form-data' };\n\n // Because some request body schema shapes might not always be a top-level `properties`,\n // instead nesting it in an `oneOf` or `anyOf` we need to extract the first usable\n // schema that we have in order to process this multipart payload.\n const safeBodySchema = getSafeRequestBody(requestBodySchema);\n\n /**\n * Discover all `{ type: string, format: binary }` properties, or arrays containing the\n * same, within the request body. If there are any, then that means that we're dealing\n * with a `multipart/form-data` request and need to treat the payload as\n * `postData.params` and supply filenames and content types for the files (if they're\n * available).\n *\n * @todo It'd be nice to replace this with `getTypedFormatsInSchema` instead.\n * @example `{ type: string, format: binary }`\n * @example `{ type: array, items: { type: string, format: binary } }`\n */\n const binaryTypes = Object.keys(safeBodySchema.properties).filter(key => {\n const propData: JSONSchema = safeBodySchema.properties[key];\n if (propData.format === 'binary') {\n return true;\n } else if (\n propData.type === 'array' &&\n propData.items &&\n typeof propData.items === 'object' &&\n propData.items !== null &&\n (propData.items as JSONSchema).format === 'binary'\n ) {\n return true;\n }\n\n return false;\n });\n\n if (cleanBody !== undefined) {\n let multipartParams: ParameterObject[] = [];\n\n const multipartContent = operation.getRequestBody('multipart/form-data');\n if (\n typeof multipartContent === 'object' &&\n multipartContent !== null &&\n // `getRequestBody()` will return an array if there are multiple content types that\n // match the one we're looking for but because we're looking for an exact\n // `multipart/form-data` match `getRequestBody()` will only ever return a single\n // object back for us.\n !Array.isArray(multipartContent)\n ) {\n multipartParams = multipartBodyToFormatterParams(formData.body, multipartContent, safeBodySchema);\n }\n\n if (multipartParams.length) {\n Object.keys(cleanBody).forEach(name => {\n const param = multipartParams.find(multipartParam => multipartParam.name === name);\n\n if (param) {\n // If we're dealing with a binary type, and the value is a valid data URL we should\n // parse out any available filename and content type to send along with the\n // parameter to interpreters like `fetch-har` can make sense of it and send a usable\n // payload.\n const addtlData: { contentType?: string; fileName?: string } = {};\n\n let value = formatter(formData, param, 'body', true);\n if (!Array.isArray(value)) {\n value = [value];\n }\n\n value.forEach((val: string) => {\n if (binaryTypes.includes(name)) {\n const parsed = parseDataUrl(val);\n if (parsed) {\n addtlData.fileName = 'name' in parsed ? parsed.name : 'unknown';\n if ('contentType' in parsed) {\n addtlData.contentType = parsed.contentType;\n }\n }\n }\n\n appendHarValue(har.postData?.params || [], name, val, addtlData);\n });\n }\n });\n }\n }\n } else {\n har.postData = { mimeType: contentType, text: '' };\n\n if (\n hasSchemaType(requestBody.schema, 'string') ||\n hasSchemaType(requestBody.schema, 'integer') ||\n hasSchemaType(requestBody.schema, 'number') ||\n hasSchemaType(requestBody.schema, 'boolean')\n ) {\n har.postData.text = JSON.stringify(JSON.parse(cleanBody));\n } else {\n /**\n * Handle formatted JSON objects that have properties that accept arbitrary JSON.\n *\n * Find all `{ type: string, format: json }` properties in the schema because we need\n * to manually `JSON.parse` them before submit, otherwise they'll be escaped instead\n * of actual objects. We also only want values that the user has entered, so we drop\n * any `undefined` `cleanBody` keys.\n */\n const jsonTypes = getTypedFormatsInSchema('json', requestBodySchema, operation.api, {\n payload: cleanBody,\n });\n\n if (Array.isArray(jsonTypes) && jsonTypes.length) {\n try {\n jsonTypes.forEach((prop: boolean | string) => {\n try {\n set(cleanBody, String(prop), JSON.parse(get(cleanBody, String(prop))));\n } catch {\n // leave the prop as a string value\n }\n });\n\n // `RAW_BODY` is a ReadMe-specific thing where we'll interpret the entire payload\n // as a raw string. https://docs.readme.com/docs/raw-body-content\n if (typeof cleanBody.RAW_BODY !== 'undefined') {\n cleanBody = cleanBody.RAW_BODY;\n }\n\n har.postData.text = JSON.stringify(cleanBody);\n } catch {\n har.postData.text = stringify(formData.body);\n }\n } else {\n // If no `format: json` paths are found then we should recursively parse any string\n // values that are valid JSON so `format: json` is still resolved for our\n // `application/json` payload.\n try {\n const parsed: any = parseJSONStringsInBodyWithSchema(cleanBody, requestBodySchema, operation.api);\n if (typeof parsed?.RAW_BODY !== 'undefined') {\n har.postData.text = isPrimitive(parsed.RAW_BODY)\n ? String(parsed.RAW_BODY)\n : stringify(parsed.RAW_BODY as Record<string | 'RAW_BODY', unknown>);\n } else {\n har.postData.text = JSON.stringify(parsed);\n }\n } catch {\n har.postData.text = encodeBodyForHAR(formData.body);\n }\n }\n }\n }\n } catch {\n // If anything above fails for whatever reason, assume that whatever we had is invalid\n // JSON and just treat it as raw text.\n har.postData = { mimeType: contentType, text: stringify(formData.body) };\n }\n } else {\n har.postData = { mimeType: contentType, text: encodeBodyForHAR(formData.body) };\n }\n }\n }\n\n // Add a `content-type` header if there are any body values setup above or if there is a schema\n // defined, but only do so if we don't already have a `content-type` present as it's impossible\n // for a request to have multiple.\n if ((har.postData?.text || (requestBody?.schema && Object.keys(requestBody.schema).length)) && !hasContentType) {\n har.headers.push({\n name: 'content-type',\n value: contentType,\n });\n }\n\n const securityRequirements = operation.getSecurity();\n\n if (securityRequirements?.length) {\n // TODO pass these values through the formatter?\n securityRequirements.forEach(schemes => {\n Object.keys(schemes).forEach(security => {\n const securityValue = configureSecurity(apiDefinition, auth, security);\n if (!securityValue) {\n return;\n }\n\n // If this is an `authorization` header and we've already added one (maybe one was manually\n // specified), then we shouldn't add another.\n if (securityValue.value.name === 'authorization') {\n if (har[securityValue.type].find(v => v.name === securityValue.value.name)) {\n return;\n }\n }\n\n // If we've already added this **specific** security value then don't add it again.\n if (\n har[securityValue.type].find(\n v => v.name === securityValue.value.name && v.value === securityValue.value.value,\n )\n ) {\n return;\n }\n\n har[securityValue.type].push(securityValue.value);\n });\n });\n }\n\n // If we didn't end up filling the `postData` object then we don't need it.\n if (Object.keys(har.postData || {}).length === 0) {\n delete har.postData;\n }\n\n return {\n log: {\n entries: [\n {\n request: har,\n },\n ] as const,\n },\n };\n}\n","type Many<T> = T | readonly T[];\ntype PropertyName = number | string | symbol;\ntype PropertyPath = Many<PropertyName>;\n\n/**\n * A janky, poorly typed replacement for `lodash.get`.\n *\n * @see {@link https://youmightnotneed.com/lodash#get}\n */\nexport function get(object: unknown, path?: string): any {\n // If path is not defined or it has false value\n if (!path) return undefined;\n // Check if path is string or array. Regex : ensure that we do not have '.' and brackets.\n // Regex explained: https://regexr.com/58j0k\n const pathArray = String(path).match(/([^[.\\]])+/g);\n // Find value\n // @ts-expect-error idk man\n const result = pathArray?.reduce((prevObj, key) => prevObj?.[key], object);\n // If found value is undefined return default value; otherwise return the value\n return result;\n}\n\n/**\n * A janky, poorly typed replacement for `lodash.set`.\n *\n * @see {@link https://youmightnotneed.com/lodash#set}\n */\nexport function set<TResult>(object: object, path: PropertyPath, value: any): TResult {\n // Regex explained: https://regexr.com/58j0k\n const pathArray: PropertyPath | RegExpMatchArray | null = Array.isArray(path)\n ? path\n : String(path).match(/([^[.\\]])+/g);\n\n // @ts-expect-error idk man\n return pathArray?.reduce((acc, key, i) => {\n // @ts-expect-error idk man\n if (acc[key] === undefined) {\n // @ts-expect-error idk man\n acc[key] = {};\n }\n if (i === pathArray.length - 1) {\n // @ts-expect-error idk man\n acc[key] = value;\n }\n // @ts-expect-error idk man\n return acc[key];\n }, object);\n}\n","import type { ParameterObject, SchemaObject } from 'oas/types';\nimport type { StylizerConfig } from './style-serializer.js';\n\nimport { matchesMimeType } from 'oas/utils';\nimport qs from 'qs';\n\nimport { getParameterContentType } from '../utils.js';\nimport { stylize } from './style-serializer.js';\n\n// Certain styles don't support empty values.\nfunction shouldNotStyleEmptyValues(parameter: ParameterObject) {\n return ['simple', 'spaceDelimited', 'pipeDelimited', 'deepObject'].includes(parameter.style || '');\n}\n\nfunction shouldNotStyleReservedHeader(parameter: ParameterObject) {\n return ['accept', 'authorization', 'content-type'].includes(parameter.name.toLowerCase());\n}\n\n/**\n * Note: This isn't necessarily part of the spec. Behavior for the value 'undefined' is, well,\n * undefined. This code makes our system look better. If we wanted to be more accurate, we might\n * want to remove this, restore the un-fixed behavior for undefined and have our UI pass in empty\n * string instead of undefined.\n */\nfunction removeUndefinedForPath(value: any) {\n let finalValue = value;\n\n if (typeof finalValue === 'undefined') {\n return '';\n }\n\n if (Array.isArray(finalValue)) {\n finalValue = finalValue.filter(val => (val === undefined ? '' : val));\n\n if (finalValue.length === 0) {\n finalValue = '';\n }\n }\n\n if (typeof finalValue === 'object') {\n Object.keys(finalValue).forEach(key => {\n finalValue[key] = finalValue[key] === undefined ? '' : finalValue[key];\n });\n }\n\n return finalValue;\n}\n\nfunction stylizeValue(value: unknown, parameter: ParameterObject) {\n let finalValue = value;\n\n // Some styles don't work with empty values. We catch those there\n if (shouldNotStyleEmptyValues(parameter) && (typeof finalValue === 'undefined' || finalValue === '')) {\n // Paths need return an unstyled empty string instead of undefined so it's ignored in the final\n // path string.\n if (parameter.in === 'path') {\n return '';\n }\n\n // Everything but path should return undefined when unstyled so it's ignored in the final\n // parameter array.\n return undefined;\n }\n\n // Every style that adds their style to empty values should use emptystring for path parameters\n // instead of undefined to avoid the string `undefined`.\n if (parameter.in === 'path') {\n finalValue = removeUndefinedForPath(finalValue);\n }\n\n /**\n * Eventhough `accept`, `authorization`, and `content-type` headers can be defined as parameters,\n * they should be completely ignored when it comes to serialization.\n *\n * > If `in` is \"header\" and the `name` field is \"Accept\", \"Content-Type\" or \"Authorization\", the\n * > parameter definition SHALL be ignored.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#fixed-fields-10}\n */\n if (parameter.in === 'header' && shouldNotStyleReservedHeader(parameter)) {\n return value;\n }\n\n /**\n * If content is present, we should use the content type to format the value. We also ignore the style and explode settings.\n *\n * @see {@link https://swagger.io/docs/specification/v3_0/describing-parameters/#schema-vs-content}\n */\n if (parameter.content && (parameter.in === 'query' || parameter.in === 'header')) {\n const contentType = getParameterContentType(parameter);\n if (!contentType) {\n return undefined;\n }\n\n /**\n * @todo Handle other content types\n */\n let serialized: string;\n if (matchesMimeType.json(contentType)) {\n serialized = JSON.stringify(value);\n } else {\n serialized = String(value);\n }\n\n return parameter.in === 'query' ? encodeURIComponent(serialized) : serialized;\n }\n\n /**\n * All parameter types have a default `style` format so if they don't have one prescribed we\n * should still conform to what the spec defines.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-parameterstyle}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#user-content-parameterstyle}\n */\n let style = parameter.style;\n if (!style) {\n if (parameter.in === 'query') {\n style = 'form';\n } else if (parameter.in === 'path') {\n style = 'simple';\n } else if (parameter.in === 'header') {\n style = 'simple';\n } else if (parameter.in === 'cookie') {\n style = 'form';\n }\n }\n\n let explode = parameter.explode;\n if (explode === undefined && style === 'form') {\n /**\n * Per the spec if no `explode` is present but `style` is `form` then `explode` should default to `true`.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-parameterexplode}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#user-content-parameterexplode}\n */\n explode = true;\n }\n\n return stylize({\n location: parameter.in as StylizerConfig['location'],\n value: finalValue,\n key: parameter.name,\n style: style as StylizerConfig['style'],\n explode,\n /**\n * @todo this parameter is optional to stylize. It defaults to false, and can accept falsy, truthy, or \"unsafe\".\n * I do not know if it is correct for query to use this. See style-serializer for more info\n */\n escape: true,\n ...(parameter.in === 'query' ? { isAllowedReserved: parameter.allowReserved || false } : {}),\n });\n}\n\nfunction handleDeepObject(value: any, parameter: ParameterObject) {\n return qs\n .stringify(value, {\n encoder(str, defaultEncoder, charset, type) {\n if (type === 'key') {\n // `str` will be here as `dog[treats][0]` but because the `qs` library doesn't have any\n // awareness of our OpenAPI parameters we need to rewrite it to slap the `parameter.name`\n // to the top, like `pets[dog][treats][0]`.\n const prefixedKey = str\n .split(/[[\\]]/g)\n .filter(Boolean)\n .map((k: string) => `[${k}]`)\n .join('');\n\n return `${parameter.name}${prefixedKey}`;\n } else if (type === 'value') {\n return stylizeValue(str, parameter);\n }\n },\n })\n .split('&')\n .map(item => {\n const split = item.split('=');\n return {\n label: split[0],\n // `qs` will coerce null values into being `undefined` string but we want to preserve them.\n value: split[1] === 'undefined' ? null : split[1],\n };\n });\n}\n\n// Explode is handled on its own, because style-serializer doesn't return what we expect for proper\n// HAR output.\nfunction handleExplode(value: any, parameter: ParameterObject) {\n // This is to handle the case of arrays of objects in the querystring\n // which is something that's not technically in the spec but since we're\n // using the `qs` module already, it's fairly easy for us to add support\n // for this use case.\n //\n // An example URL would be something like this:\n // https://example.com/?line_items[0][a_string]=abc&line_items[0][quantity]=1&line_items[1][a_string]=def&line_items[1][quantity]=2\n //\n // Some open issues discussing this here:\n // https://github.com/OAI/OpenAPI-Specification/issues/1706\n // https://github.com/OAI/OpenAPI-Specification/issues/1006\n //\n // Link to the spec for this:\n // https://github.com/OAI/OpenAPI-Specification/blob/36a3a67264cc1c4f1eff110cea3ebfe679435108/versions/3.1.0.md#style-examples\n if (\n Array.isArray(value) &&\n (parameter.schema as SchemaObject)?.type === 'array' &&\n parameter.style === 'deepObject'\n ) {\n const newObj: Record<string, unknown> = {};\n const deepObjs = handleDeepObject(value, parameter);\n deepObjs.forEach(obj => {\n newObj[obj.label] = obj.value;\n });\n return newObj;\n }\n\n if (Array.isArray(value)) {\n return value.map(val => {\n return stylizeValue(val, parameter);\n });\n }\n\n if (typeof value === 'object' && value !== null) {\n const newObj: Record<string, unknown> = {};\n\n Object.keys(value).forEach(key => {\n if (parameter.style === 'deepObject') {\n const deepObjs = handleDeepObject(value, parameter);\n deepObjs.forEach(obj => {\n newObj[obj.label] = obj.value;\n });\n } else {\n newObj[key] = stylizeValue(value[key], parameter);\n }\n });\n\n return newObj;\n }\n\n return stylizeValue(value, parameter);\n}\n\nfunction shouldExplode(parameter: ParameterObject) {\n return (\n (parameter.explode ||\n (parameter.explode !== false && parameter.style === 'form') ||\n // style: deepObject && explode: false doesn't exist so explode it always\n // https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples\n parameter.style === 'deepObject') &&\n // header and path doesn't explode into separate parameters like query and cookie do\n parameter.in !== 'header' &&\n parameter.in !== 'path' &&\n !parameter.content\n );\n}\n\nexport function formatStyle(value: unknown, parameter: ParameterObject): any {\n // Deep object style only works on objects and arrays, and only works with explode=true.\n if (\n !parameter.content &&\n parameter.style === 'deepObject' &&\n (!value || typeof value !== 'object' || parameter.explode === false)\n ) {\n return undefined;\n }\n\n // This custom explode logic allows us to bubble up arrays and objects to be handled differently\n // by our HAR transformer. We need this because the `stylizeValue` function assumes we're building\n // strings, not richer data types.\n //\n // The first part of this conditional checks if `explode` is enabled. Explode is disabled for\n // everything by default except for forms.\n //\n // The second part of this conditional bypasses the custom explode logic for headers, because they\n // work differently, and `stylizeValue` is accurate.\n if (shouldExplode(parameter)) {\n return handleExplode(value, parameter);\n }\n\n return stylizeValue(value, parameter);\n}\n","import type { OASDocument, ParameterObject, SchemaObject } from 'oas/types';\n\nimport { isRef } from 'oas/types';\nimport { dereferenceRef, getParameterContentType as getParameterContentTypeUtil } from 'oas/utils';\n\nimport { get } from './lodash.js';\n\n/**\n * Determine if a schema `type` is, or contains, a specific discriminator.\n *\n */\nexport function hasSchemaType(\n schema: SchemaObject,\n discriminator: 'array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string',\n): boolean {\n if (Array.isArray(schema.type)) {\n return schema.type.includes(discriminator);\n }\n\n return schema.type === discriminator;\n}\n\n/**\n * Because some request body schema shapes might not always be a top-level `properties`, instead\n * nesting it in an `oneOf` or `anyOf` we need to extract the first usable schema that we have. If\n * we don't do this then these non-conventional request body schema payloads may not be properly\n * represented in the HAR that we generate.\n *\n */\nexport function getSafeRequestBody(obj: any): any {\n if ('oneOf' in obj) {\n return getSafeRequestBody(obj.oneOf[0]);\n } else if ('anyOf' in obj) {\n return getSafeRequestBody(obj.anyOf[0]);\n }\n\n return obj;\n}\n\ninterface Options {\n parentIsArray?: boolean;\n parentKey?: string;\n payload: unknown;\n}\n\ninterface SubschemaEntry {\n key: string;\n schema: SchemaObject;\n parentIsArray?: boolean;\n}\n\nfunction getSubschemas(\n schema: SchemaObject,\n api: OASDocument,\n opts: Options,\n seenRefs: Set<string> = new Set(),\n): SubschemaEntry[] | false {\n let subSchemaDataSize = 0;\n if (opts.parentIsArray) {\n // If we don't have data for this parent schema in our body payload then we\n // shouldn't bother spidering further into the schema looking for more `format`s\n // for data that definitely doesn't exist.\n const parentData = get(opts.payload, opts.parentKey || '');\n if (parentData === undefined || !Array.isArray(parentData)) {\n return false;\n }\n\n subSchemaDataSize = parentData.length;\n }\n\n let subschemas: SubschemaEntry[] = [];\n if (subSchemaDataSize > 0) {\n for (let idx = 0; idx < subSchemaDataSize; idx += 1) {\n const foundSubschemas = getSubschemas(\n schema,\n api,\n {\n ...opts,\n parentIsArray: false,\n parentKey: opts.parentKey ? [opts.parentKey, idx].join('.') : String(idx),\n },\n seenRefs,\n );\n\n if (foundSubschemas) {\n subschemas = subschemas.concat(foundSubschemas);\n }\n }\n } else {\n let resolvedSchema = schema;\n if (schema && isRef(schema)) {\n // Skip $refs we've already visited to prevent infinite recursion on circular references\n if (seenRefs.has(schema.$ref)) {\n return subschemas;\n }\n seenRefs.add(schema.$ref);\n\n resolvedSchema = dereferenceRef(schema, api);\n if (!resolvedSchema || isRef(resolvedSchema)) {\n return subschemas;\n }\n }\n\n const baseKey = opts.parentKey ?? '';\n\n // Collect subschemas from this objects `properties`, dereferencing `$ref` pointers and\n // building up a collection of dot-notation keys for each schema.\n if (resolvedSchema.properties && typeof resolvedSchema.properties === 'object') {\n for (const [propName, propSchema] of Object.entries(resolvedSchema.properties)) {\n if (propSchema && typeof propSchema === 'object') {\n let resolved: SchemaObject | undefined;\n if (isRef(propSchema)) {\n if (seenRefs.has(propSchema.$ref)) {\n continue;\n }\n seenRefs.add(propSchema.$ref);\n resolved = dereferenceRef(propSchema, api);\n } else {\n resolved = propSchema;\n }\n\n if (resolved && !isRef(resolved)) {\n subschemas.push({\n key: baseKey ? [baseKey, propName].join('.') : propName,\n schema: resolved,\n });\n }\n }\n }\n }\n\n // When the schema has no formal `properties` we need to enumerate through each of its available\n // property keys, collecting subschemas and dot-notation keysfrom each value. Generally we'll\n // hit this block when processing data like OpenAPI Media Type objects.\n if (\n !('properties' in resolvedSchema) &&\n typeof resolvedSchema === 'object' &&\n !('type' in resolvedSchema && resolvedSchema.type !== 'object')\n ) {\n for (const [propName, propSchema] of Object.entries(resolvedSchema)) {\n if (propSchema && (Array.isArray(propSchema) || (typeof propSchema === 'object' && propSchema !== null))) {\n const raw = getSafeRequestBody(propSchema);\n const resolved = isRef(raw) ? dereferenceRef(raw, api) : raw;\n const toPush = resolved && !isRef(resolved) ? resolved : raw;\n if (toPush && typeof toPush === 'object') {\n subschemas.push({\n key: baseKey ? [baseKey, propName].join('.') : propName,\n schema: toPush,\n });\n }\n }\n }\n }\n\n if ('items' in resolvedSchema && resolvedSchema.items !== undefined && resolvedSchema.items !== true) {\n const itemsSchema = resolvedSchema.items as SchemaObject;\n let resolved: SchemaObject | undefined;\n if (isRef(itemsSchema)) {\n if (!seenRefs.has(itemsSchema.$ref)) {\n seenRefs.add(itemsSchema.$ref);\n resolved = dereferenceRef(itemsSchema, api);\n }\n } else {\n resolved = itemsSchema;\n }\n\n if (resolved && !isRef(resolved)) {\n subschemas.push({\n key: baseKey,\n schema: resolved,\n parentIsArray: true,\n });\n }\n }\n }\n\n return subschemas;\n}\n\n/**\n * With a supplied JSON Schema object, spider through it for any schemas that may contain specific\n * kind of `format` that also happen to be within the current `requestBody` payload that we're\n * creating a HAR representation for.\n *\n */\nexport function getTypedFormatsInSchema(\n format: 'binary' | 'json',\n schema: SchemaObject,\n api: OASDocument,\n opts: Options,\n seenRefs: Set<string> = new Set(),\n): (boolean | string)[] | boolean | string {\n try {\n if (schema?.format === format) {\n if (opts.parentIsArray) {\n const parentData = get(opts.payload, opts.parentKey || '');\n if (parentData !== undefined && Array.isArray(parentData)) {\n return Object.keys(parentData)\n .map(pdk => {\n const currentKey = [opts.parentKey, pdk].join('.');\n if (get(opts.payload, currentKey) !== undefined) {\n return currentKey;\n }\n\n return false;\n })\n .filter(Boolean);\n }\n } else if (opts.parentKey && get(opts.payload, opts.parentKey) !== undefined) {\n return opts.parentKey;\n } else if (!opts.parentKey && opts.payload !== undefined) {\n // If this payload is present and we're looking for a specific format then we should assume\n // that the **root** schema of the request body is that format, and we aren't trafficking in\n // a nested object or array schema.\n return true;\n }\n\n return false;\n }\n\n const subschemas = getSubschemas(schema, api, opts, seenRefs);\n if (!subschemas) {\n return false;\n }\n\n return subschemas\n .flatMap(({ key, schema: subschema, parentIsArray: entryIsArray }) => {\n if (isRef(subschema)) {\n const resolved = dereferenceRef(subschema, api);\n if (resolved && !isRef(resolved)) {\n return resolved;\n }\n\n return false;\n }\n\n return getTypedFormatsInSchema(\n format,\n subschema,\n api,\n {\n payload: opts.payload,\n parentKey: key,\n parentIsArray: entryIsArray,\n },\n seenRefs,\n );\n })\n .filter(Boolean);\n } catch {\n // If this fails for whatever reason then we should act as if we didn't find any `format`'d\n // schemas.\n return [];\n }\n}\n\n/**\n * Extract content type from a parameter's `content` field.\n * According to OAS spec, when `content` is present, `style` and `explode` are ignored.\n * We prioritize `application/json` and other JSON-like content types over other content types.\n * Note: this is just a safe guard. In OAS parser, we enforce that there is exactly one content type.\n *\n * @param param - The parameter object\n * @returns The content type, or `null` if no content is present\n */\nexport function getParameterContentType(param: ParameterObject): string | null {\n if (!('content' in param) || typeof param.content !== 'object' || !param.content) {\n return null;\n }\n\n const contentKeys = Object.keys(param.content);\n if (contentKeys.length < 1) {\n return null;\n }\n\n return getParameterContentTypeUtil(contentKeys) || null;\n}\n\n/**\n * Extract schema from a parameter's `content` field.\n *\n * @param param - The parameter object\n * @param contentType - The content type\n * @returns The schema, or `null` if no schema is present\n */\nexport function getParameterContentSchema(param: ParameterObject, contentType: string): SchemaObject | null {\n if (!('content' in param) || typeof param.content !== 'object' || !param.content) {\n return null;\n }\n\n const mediaTypeObject = param.content[contentType];\n if (typeof mediaTypeObject === 'object' && mediaTypeObject && 'schema' in mediaTypeObject && mediaTypeObject.schema) {\n return isRef(mediaTypeObject.schema) ? null : (mediaTypeObject.schema as SchemaObject);\n }\n\n return null;\n}\n\n/**\n * Recursively parse string values that are valid JSON.\n *\n * This is used when we're dealing with objects that have nested `format: json` descriptors.\n */\nexport function parseJSONStrings(obj: unknown): unknown {\n if (typeof obj === 'string') {\n try {\n const p = JSON.parse(obj);\n return typeof p === 'object' && p !== null ? parseJSONStrings(p) : p;\n } catch {\n return obj;\n }\n }\n\n if (Array.isArray(obj)) {\n return obj.map(parseJSONStrings);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = parseJSONStrings(v);\n }\n\n return out;\n }\n\n return obj;\n}\n\n/**\n * Recursively runs through a schema, parsing any values that have `format: json` attached and\n * deserializing them into their JSON representations.\n *\n * @see {@link parseJSONStrings}\n */\nexport function parseJSONStringsInBodyWithSchema(\n obj: unknown,\n schema: SchemaObject | undefined,\n api: OASDocument,\n seenRefs: Set<string> = new Set(),\n): unknown {\n // If there's no schema then we should parse any strings that look like JSON.\n if (schema === undefined) return parseJSONStrings(obj);\n\n let resolved: SchemaObject = schema;\n if (isRef(schema)) {\n // If we have already processed this `$ref` before then we should stop all schema-guiding\n // parsing behaviors so we don't infinitely recurse.\n if (seenRefs.has(schema.$ref)) {\n return parseJSONStrings(obj);\n }\n\n seenRefs.add(schema.$ref);\n const deref = dereferenceRef(schema, api);\n if (!deref || isRef(deref)) {\n return parseJSONStrings(obj);\n }\n\n resolved = deref;\n }\n\n // If our resovled schema is a polymorphic `oneOf` or `anyOf` schema then we should use the first\n // branch of the schema to guide our parsing behavior. If the schema is _not_ polymorphic then\n // we'll use that schema as-is.\n const safe = getSafeRequestBody(resolved);\n if (isRef(safe)) {\n return parseJSONStringsInBodyWithSchema(obj, safe, api, seenRefs);\n }\n\n resolved = safe;\n\n if (typeof obj === 'string') {\n // If the schema is a string but does **not** have `format: json` then it should be left alone.\n if (hasSchemaType(resolved, 'string') && resolved.format !== 'json') {\n return obj;\n }\n\n return parseJSONStrings(obj);\n }\n\n if (Array.isArray(obj)) {\n // @ts-expect-error -- `items` exists in schema objects, just the typing on `SchemaObject` is very messy.\n let items = resolved.items as SchemaObject | undefined;\n if (items && typeof items === 'object' && isRef(items)) {\n // If we've already processed this `$ref` before then we should stop all schema-guided\n // parsing behaviors so we don't infinitely recurse, instead treating what we have as it is\n // and parsing anything that looks like JSON.\n if (seenRefs.has(items.$ref)) {\n return obj.map(item => parseJSONStrings(item));\n }\n\n seenRefs.add(items.$ref);\n const derefItems = dereferenceRef(items, api);\n items = derefItems && !isRef(derefItems) ? derefItems : undefined;\n }\n\n return obj.map(item => parseJSONStringsInBodyWithSchema(item, items, api, new Set(seenRefs)));\n }\n\n if (obj !== null && typeof obj === 'object') {\n // If we have an object schema that doesn't have any `properties` then we should just parse\n // anything that looks like JSON within whatever we _do_ have here.\n if (!resolved.properties || typeof resolved.properties !== 'object') {\n return parseJSONStrings(obj);\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const propSchema = resolved.properties[k] as SchemaObject | undefined;\n out[k] = parseJSONStringsInBodyWithSchema(v, propSchema, api, new Set(seenRefs));\n }\n\n return out;\n }\n\n return obj;\n}\n","/**\n * This file has been extracted and modified from `swagger-client`.\n *\n * @license Apache 2.0\n * @link https://npm.im/swagger-client\n * @link https://github.com/swagger-api/swagger-js/blob/master/src/execute/oas3/style-serializer.js\n */\n\nconst isRfc3986Reserved = (char: string) => \":/?#[]@!$&'()*+,;=\".indexOf(char) > -1;\nconst isRfc3986Unreserved = (char: string) => /^[a-z0-9\\-._~]+$/i.test(char);\n\nfunction isURIEncoded(value: string) {\n try {\n return decodeURIComponent(value) !== value;\n } catch {\n // `decodeURIComponent` will throw an exception if a string that has an un-encoded percent sign\n // in it (like 20%), o if it's throwing we can just assume that the value hasn't been encoded.\n return false;\n }\n}\n\nfunction isObject(value: unknown) {\n return typeof value === 'object' && value !== null;\n}\n\nfunction encodeDisallowedCharacters(\n str: string,\n {\n escape,\n returnIfEncoded = false,\n isAllowedReserved,\n }: {\n escape?: boolean | 'unsafe';\n isAllowedReserved?: boolean;\n returnIfEncoded?: boolean;\n } = {},\n parse?: boolean,\n): any {\n if (typeof str === 'number') {\n // biome-ignore lint/style/noParameterAssign: It is what it is.\n str = (str as number).toString();\n }\n\n if (returnIfEncoded) {\n if (isURIEncoded(str)) {\n return str;\n }\n }\n\n if (typeof str !== 'string' || !str.length) {\n return str;\n }\n\n if (!escape) {\n return str;\n }\n\n if (parse) {\n return JSON.parse(str);\n }\n\n // In ES6 you can do this quite easily by using the new ... spread operator. This causes the\n // string iterator (another new ES6 feature) to be used internally, and because that iterator is\n // designed to deal with code points rather than UCS-2/UTF-16 code units.\n return [...str]\n .map(char => {\n if (isRfc3986Unreserved(char)) {\n return char;\n }\n\n if (isRfc3986Reserved(char) && (escape === 'unsafe' || isAllowedReserved)) {\n return char;\n }\n\n const encoder = new TextEncoder();\n const encoded = Array.from(encoder.encode(char))\n .map(byte => `0${byte.toString(16).toUpperCase()}`.slice(-2))\n .map(encodedByte => `%${encodedByte}`)\n .join('');\n\n return encoded;\n })\n .join('');\n}\n\nexport interface StylizerConfig {\n escape: boolean | 'unsafe';\n explode?: boolean;\n isAllowedReserved?: boolean;\n key: string;\n location: 'body' | 'query';\n style: 'deepObject' | 'form' | 'label' | 'matrix' | 'pipeDelimited' | 'simple' | 'spaceDelimited';\n value: any;\n}\n\nexport function stylize(config: StylizerConfig): any {\n const { value } = config;\n\n if (Array.isArray(value)) {\n return encodeArray(config);\n }\n\n if (isObject(value)) {\n return encodeObject(config);\n }\n\n return encodePrimitive(config);\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodeArray({\n location,\n key,\n value,\n style,\n explode,\n escape,\n isAllowedReserved = false,\n}: Omit<StylizerConfig, 'value'> & { value: string[] }) {\n const valueEncoder = (str: string) => {\n // Handle null values explicitly to prevent join() from converting to empty string\n if (str === null) {\n return 'null';\n }\n\n const result = encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query',\n isAllowedReserved,\n });\n\n return result;\n };\n\n switch (style) {\n /**\n * @example <caption>`style: simple`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue,black,brown`\n */\n case 'simple':\n return value.map(val => valueEncoder(val)).join(',');\n\n /**\n * @example <caption>`style: label`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `.blue.black.brown`\n */\n case 'label':\n return `.${value.map(val => valueEncoder(val)).join('.')}`;\n\n /**\n * @example <caption>`style: matrix` + `explode: true`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `;color=blue;color=black;color=brown`\n *\n * @example <caption>`style: matrix` + `explode: false` (the default behavior)</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `;color=blue,black,brown\t`\n */\n case 'matrix':\n return value\n .map(val => valueEncoder(val))\n .reduce((prev, curr) => {\n if (!prev || explode) {\n return `${prev || ''};${key}=${curr}`;\n }\n return `${prev},${curr}`;\n }, '');\n\n /**\n * @example <caption>`style: form` + `explode: true`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `color=blue&color=black&color=brown`\n *\n * @example <caption>`style: form` + `explode: false` (the default behavior)</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `color=blue,black,brown`\n */\n case 'form':\n return value.map(val => valueEncoder(val)).join(explode ? `&${key}=` : ',');\n\n /**\n * @example <caption>`style: spaceDelimited`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue%20black%20brown`\n */\n case 'spaceDelimited':\n return value.map(val => valueEncoder(val)).join(` ${explode ? `${key}=` : ''}`);\n\n /**\n * @example <caption>`style: pipeDelimited`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue|black|brown`\n */\n case 'pipeDelimited':\n return value.map(val => valueEncoder(val)).join(`|${explode ? `${key}=` : ''}`);\n\n default:\n return undefined;\n }\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodeObject({ location, key, value, style, explode, escape, isAllowedReserved = false }: StylizerConfig) {\n const valueEncoder = (str: string) =>\n encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query',\n isAllowedReserved,\n });\n\n const valueKeys = Object.keys(value);\n\n switch (style) {\n /**\n * @example <caption>`style: simple` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R=100,G=200,B=150`\n *\n * @example <caption>`style: simple` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R,100,G,200,B,150`\n */\n case 'simple':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const middleChar = explode ? '=' : ',';\n const prefix = prev ? `${prev},` : '';\n\n return `${prefix}${curr}${middleChar}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: label` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `.R=100.G=200.B=150`\n *\n * @example <caption>`style: label` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `.R.100.G.200.B.150`\n */\n case 'label':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const middleChar = explode ? '=' : '.';\n const prefix = prev ? `${prev}.` : '.';\n\n return `${prefix}${curr}${middleChar}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: matrix` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `;R=100;G=200;B=150`\n *\n * @example <caption>`style: matrix` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `;color=R,100,G,200,B,150`\n */\n case 'matrix':\n if (explode) {\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev};` : ';';\n\n return `${prefix}${curr}=${val}`;\n }, '');\n }\n\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev},` : `;${key}=`;\n\n return `${prefix}${curr},${val}`;\n }, '');\n\n /**\n * @example <caption>`style: form` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R=100&G=200&B=150`\n *\n * @example <caption>`style: form` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `color=R,100,G,200,B,150`\n */\n case 'form':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev}${explode ? '&' : ','}` : '';\n const separator = explode ? '=' : ',';\n\n return `${prefix}${curr}${separator}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: spaceDelimited`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R%20100%20G%20200%20B%20150`\n */\n case 'spaceDelimited':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev} ` : '';\n\n return `${prefix}${curr} ${val}`;\n }, '');\n\n /**\n * @example <caption>`style: pipeDelimited`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R|100|G|200|B|150`\n */\n case 'pipeDelimited':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev}|` : '';\n\n return `${prefix}${curr}|${val}`;\n }, '');\n\n /**\n * @example <caption>`style: deepObject`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `color[R]=100&color[G]=200&color[B]=150`\n */\n case 'deepObject':\n return valueKeys.reduce(curr => {\n const val = valueEncoder(value[curr]);\n return `${val}`;\n }, '');\n\n default:\n return undefined;\n }\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodePrimitive({ location, key, value, style, escape, isAllowedReserved = false }: StylizerConfig) {\n const valueEncoder = (str: string) =>\n encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query' || location === 'body',\n isAllowedReserved,\n });\n\n switch (style) {\n /**\n * @example <caption>`style: simple`</caption>\n * `blue` → `blue`\n */\n case 'simple':\n return valueEncoder(value);\n\n /**\n * @example <caption>`style: label`</caption>\n * `blue` → `.blue`\n */\n case 'label':\n return `.${valueEncoder(value)}`;\n\n /**\n * @example <caption>`style: matrix`</caption>\n * `blue` → `;color=blue`\n */\n case 'matrix':\n if (value === '') {\n return `;${key}`;\n }\n\n return `;${key}=${valueEncoder(value)}`;\n\n /**\n * @example <caption>`style: form`</caption>\n * `blue` → `color=blue`\n */\n case 'form':\n return valueEncoder(value);\n\n /**\n * @example <caption>`style: deepObject`</caption>\n * `blue` → n/a\n */\n case 'deepObject':\n return valueEncoder(value);\n\n default:\n return undefined;\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -219,22 +219,72 @@ function getParameterContentSchema(param, contentType) {
|
|
|
219
219
|
}
|
|
220
220
|
return null;
|
|
221
221
|
}
|
|
222
|
-
function
|
|
222
|
+
function parseJSONStrings(obj) {
|
|
223
223
|
if (typeof obj === "string") {
|
|
224
224
|
try {
|
|
225
225
|
const p = JSON.parse(obj);
|
|
226
|
-
return typeof p === "object" && p !== null ?
|
|
226
|
+
return typeof p === "object" && p !== null ? parseJSONStrings(p) : p;
|
|
227
227
|
} catch {
|
|
228
228
|
return obj;
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
if (Array.isArray(obj)) {
|
|
232
|
-
return obj.map(
|
|
232
|
+
return obj.map(parseJSONStrings);
|
|
233
233
|
}
|
|
234
234
|
if (obj !== null && typeof obj === "object") {
|
|
235
235
|
const out = {};
|
|
236
236
|
for (const [k, v] of Object.entries(obj)) {
|
|
237
|
-
out[k] =
|
|
237
|
+
out[k] = parseJSONStrings(v);
|
|
238
|
+
}
|
|
239
|
+
return out;
|
|
240
|
+
}
|
|
241
|
+
return obj;
|
|
242
|
+
}
|
|
243
|
+
function parseJSONStringsInBodyWithSchema(obj, schema, api, seenRefs = /* @__PURE__ */ new Set()) {
|
|
244
|
+
if (schema === void 0) return parseJSONStrings(obj);
|
|
245
|
+
let resolved = schema;
|
|
246
|
+
if (isRef(schema)) {
|
|
247
|
+
if (seenRefs.has(schema.$ref)) {
|
|
248
|
+
return parseJSONStrings(obj);
|
|
249
|
+
}
|
|
250
|
+
seenRefs.add(schema.$ref);
|
|
251
|
+
const deref = dereferenceRef(schema, api);
|
|
252
|
+
if (!deref || isRef(deref)) {
|
|
253
|
+
return parseJSONStrings(obj);
|
|
254
|
+
}
|
|
255
|
+
resolved = deref;
|
|
256
|
+
}
|
|
257
|
+
const safe = getSafeRequestBody(resolved);
|
|
258
|
+
if (isRef(safe)) {
|
|
259
|
+
return parseJSONStringsInBodyWithSchema(obj, safe, api, seenRefs);
|
|
260
|
+
}
|
|
261
|
+
resolved = safe;
|
|
262
|
+
if (typeof obj === "string") {
|
|
263
|
+
if (hasSchemaType(resolved, "string") && resolved.format !== "json") {
|
|
264
|
+
return obj;
|
|
265
|
+
}
|
|
266
|
+
return parseJSONStrings(obj);
|
|
267
|
+
}
|
|
268
|
+
if (Array.isArray(obj)) {
|
|
269
|
+
let items = resolved.items;
|
|
270
|
+
if (items && typeof items === "object" && isRef(items)) {
|
|
271
|
+
if (seenRefs.has(items.$ref)) {
|
|
272
|
+
return obj.map((item) => parseJSONStrings(item));
|
|
273
|
+
}
|
|
274
|
+
seenRefs.add(items.$ref);
|
|
275
|
+
const derefItems = dereferenceRef(items, api);
|
|
276
|
+
items = derefItems && !isRef(derefItems) ? derefItems : void 0;
|
|
277
|
+
}
|
|
278
|
+
return obj.map((item) => parseJSONStringsInBodyWithSchema(item, items, api, new Set(seenRefs)));
|
|
279
|
+
}
|
|
280
|
+
if (obj !== null && typeof obj === "object") {
|
|
281
|
+
if (!resolved.properties || typeof resolved.properties !== "object") {
|
|
282
|
+
return parseJSONStrings(obj);
|
|
283
|
+
}
|
|
284
|
+
const out = {};
|
|
285
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
286
|
+
const propSchema = resolved.properties[k];
|
|
287
|
+
out[k] = parseJSONStringsInBodyWithSchema(v, propSchema, api, new Set(seenRefs));
|
|
238
288
|
}
|
|
239
289
|
return out;
|
|
240
290
|
}
|
|
@@ -1010,7 +1060,7 @@ function oasToHar(oas, operationSchema, values = {}, auth = {}, opts = { proxyUr
|
|
|
1010
1060
|
}
|
|
1011
1061
|
} else {
|
|
1012
1062
|
try {
|
|
1013
|
-
const parsed =
|
|
1063
|
+
const parsed = parseJSONStringsInBodyWithSchema(cleanBody, requestBodySchema, operation.api);
|
|
1014
1064
|
if (typeof parsed?.RAW_BODY !== "undefined") {
|
|
1015
1065
|
har.postData.text = isPrimitive(parsed.RAW_BODY) ? String(parsed.RAW_BODY) : stringify(parsed.RAW_BODY);
|
|
1016
1066
|
} else {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/lodash.ts","../src/lib/style-formatting/index.ts","../src/lib/utils.ts","../src/lib/style-formatting/style-serializer.ts"],"sourcesContent":["import type { PostData, PostDataParams, Request } from 'har-format';\nimport type { Extensions } from 'oas/extensions';\nimport type {\n HttpMethods,\n JSONSchema,\n MediaTypeObject,\n OASDocument,\n OperationObject,\n ParameterObject,\n SchemaObject,\n SchemaWrapper,\n ServerVariable,\n} from 'oas/types';\nimport type { AuthForHAR, DataForHAR, oasToHarOptions } from './lib/types.js';\n\nimport { parse as parseDataUrl } from '@readme/data-urls';\nimport Oas from 'oas';\nimport { HEADERS, PROXY_ENABLED } from 'oas/extensions';\nimport { Operation } from 'oas/operation';\nimport { isRef } from 'oas/types';\nimport { jsonSchemaTypes, matchesMimeType } from 'oas/utils';\nimport removeUndefinedObjects from 'remove-undefined-objects';\n\nimport configureSecurity from './lib/configure-security.js';\nimport { get, set } from './lib/lodash.js';\nimport { formatStyle } from './lib/style-formatting/index.js';\nimport {\n getParameterContentSchema,\n getParameterContentType,\n getSafeRequestBody,\n getTypedFormatsInSchema,\n hasSchemaType,\n parseJsonStringsInBody,\n} from './lib/utils.js';\n\nfunction formatter(\n values: DataForHAR,\n param: ParameterObject,\n type: 'body' | 'cookie' | 'header' | 'path' | 'query',\n onlyIfExists = false,\n) {\n if (param.style) {\n const value = values[type][param.name];\n // Note: Technically we could send everything through the format style and choose the proper\n // default for each `in` type (e.g. query defaults to form).\n return formatStyle(value, param);\n }\n\n let value: string | number | boolean | undefined;\n\n // Handle missing values\n if (typeof values[type][param.name] !== 'undefined') {\n value = values[type][param.name];\n } else if (onlyIfExists && !param.required) {\n value = undefined;\n } else if (param.required && param.schema && !isRef(param.schema) && param.schema.default) {\n value = param.schema.default;\n } else if (param.required && param.content) {\n const contentType = getParameterContentType(param);\n const schema = contentType ? getParameterContentSchema(param, contentType) : null;\n value = schema?.default;\n } else if (type === 'path') {\n // If we don't have any values for the path parameter, just use the name of the parameter as the\n // value so we don't try try to build a URL to something like `https://example.com/undefined`.\n return param.name;\n }\n\n // Handle file uploads. Specifically arrays of file uploads which need to be formatted very\n // specifically.\n if (\n param.schema &&\n !isRef(param.schema) &&\n param.schema.type === 'array' &&\n param.schema.items &&\n !isRef(param.schema.items) &&\n param.schema.items.format === 'binary'\n ) {\n if (Array.isArray(value)) {\n // If this is array of binary data then we shouldn't do anything because we'll prepare them\n // separately in the HAR in order to preserve `fileName` and `contentType` data within\n // `postData.params`. If we don't then the HAR we generate for this data will be invalid.\n return value;\n }\n\n return JSON.stringify(value);\n }\n\n if (value !== undefined) {\n // Query params should always be formatted, even if they don't have a `style` serialization\n // configured. Content-based header params also need formatting to properly serialize values\n // (e.g. JSON.stringify objects) instead of passing raw objects through. However, schema-based\n // header params should NOT be formatted as this would incorrectly URL-encode their values.\n if (type === 'query' || (type === 'header' && param.content)) {\n return formatStyle(value, param);\n }\n\n return value;\n }\n\n return undefined;\n}\n\nfunction multipartBodyToFormatterParams(payload: unknown, oasMediaTypeObject: MediaTypeObject, schema: SchemaObject) {\n const encoding = oasMediaTypeObject.encoding;\n\n if (typeof payload === 'object' && payload !== null) {\n return Object.keys(payload)\n .map(key => {\n // If we have an incoming parameter, but it's not in the schema ignore it.\n if (!schema.properties?.[key]) {\n return false;\n }\n\n const paramEncoding = encoding ? encoding[key] : undefined;\n\n return {\n name: key,\n // If the style isn't defined, use the default\n style: paramEncoding ? paramEncoding.style : undefined,\n // If explode isn't defined, use the default\n explode: paramEncoding ? paramEncoding.explode : undefined,\n required:\n (schema.required && typeof schema.required === 'boolean' && Boolean(schema.required)) ||\n (Array.isArray(schema.required) && schema.required.includes(key)),\n schema: schema.properties[key],\n in: 'body',\n };\n })\n .filter(Boolean) as ParameterObject[];\n }\n\n // Pretty sure that we'll never have anything but an object for multipart bodies, so returning\n // empty array if we get anything else.\n return [];\n}\n\nconst defaultFormDataTypes = Object.keys(jsonSchemaTypes).reduce((prev, curr) => {\n return Object.assign(prev, { [curr]: {} });\n}, {});\n\nfunction getResponseContentType(content: MediaTypeObject) {\n const types = Object.keys(content) || [];\n\n // If this response content has multiple types available we should always prefer the one that's\n // JSON-compatible. If they don't have one that is we'll return the first available, otherwise\n // if they don't have **any** repsonse content types present we'll assume it's JSON.\n if (types?.length) {\n const jsonType = types.find(t => matchesMimeType.json(t));\n if (jsonType) {\n return jsonType;\n }\n\n return types[0];\n }\n\n return 'application/json';\n}\n\nfunction isPrimitive(val: unknown) {\n return typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean';\n}\n\nfunction stringify(json: Record<string | 'RAW_BODY', unknown>) {\n return JSON.stringify(\n removeUndefinedObjects(typeof json.RAW_BODY !== 'undefined' ? json.RAW_BODY : json, {\n preserveNullishArrays: true,\n }),\n );\n}\n\nfunction stringifyParameter(param: any): string {\n if (param === null || isPrimitive(param)) {\n return String(param);\n } else if (Array.isArray(param) && param.every(isPrimitive)) {\n return String(param);\n }\n\n return JSON.stringify(param);\n}\n\nfunction appendHarValue(\n harParam: PostDataParams['params'] | Request['cookies'] | Request['headers'] | Request['queryString'],\n name: string,\n value: any,\n addtlData: {\n contentType?: string;\n fileName?: string;\n } = {},\n) {\n if (typeof value === 'undefined') return;\n\n if (Array.isArray(value)) {\n // If the formatter gives us an array, we're expected to add each array value as a new\n // parameter item with the same parameter name\n value.forEach(singleValue => {\n appendHarValue(harParam, name, singleValue);\n });\n } else if (typeof value === 'object' && value !== null) {\n // If the formatter gives us an object, we're expected to add each property value as a new\n // parameter item, each with the name of the property\n Object.keys(value).forEach(key => {\n appendHarValue(harParam, key, value[key]);\n });\n } else {\n // If the formatter gives us a non-array, non-object, we add it as is\n harParam.push({\n ...addtlData,\n name,\n value: String(value),\n });\n }\n}\n\nfunction encodeBodyForHAR(body: any) {\n if (isPrimitive(body)) {\n return body;\n } else if (\n typeof body === 'object' &&\n body !== null &&\n !Array.isArray(body) &&\n typeof body.RAW_BODY !== 'undefined'\n ) {\n // `RAW_BODY` is a ReadMe-specific thing where we'll interpret the entire payload as a\n // raw string. https://docs.readme.com/docs/raw-body-content\n if (isPrimitive(body.RAW_BODY)) {\n return body.RAW_BODY;\n }\n\n return stringify(body.RAW_BODY);\n }\n\n return stringify(body);\n}\n\n// biome-ignore lint/style/noDefaultExport: This is fine for now.\nexport default function oasToHar(\n oas: Oas,\n operationSchema?: Operation,\n values: DataForHAR = {},\n auth: AuthForHAR = {},\n opts: oasToHarOptions = { proxyUrl: '' },\n): {\n log: {\n entries: readonly [\n {\n readonly request: Request;\n },\n ];\n };\n} {\n let operation: Operation;\n if (!operationSchema || typeof operationSchema.getParameters !== 'function') {\n /**\n * If `operationSchema` was supplied as a plain object instead of an instance of `Operation`\n * then we should create a new instance of it. We're doing it with a check on `getParameters`\n * instead of checking `instanceof Operation` because JS is very weird when it comes to\n * checking `instanceof` against classes. One instance of `Operation` may not always match up\n * with another if they're being loaded between two different libraries.\n *\n * It's weird. This is easier.\n */\n const currentOas = Oas.init(oas as unknown as OASDocument);\n operation = new Operation(\n currentOas,\n operationSchema?.path || '',\n operationSchema?.method || ('' as HttpMethods),\n (operationSchema as unknown as OperationObject) || { path: '', method: '' },\n );\n } else {\n operation = operationSchema;\n }\n\n const apiDefinition = oas.getDefinition();\n\n const formData: DataForHAR = {\n ...defaultFormDataTypes,\n ...values,\n };\n\n if (!formData.server) {\n formData.server = {\n selected: 0,\n variables: oas.defaultVariables(0),\n };\n }\n\n // If the incoming `server.variables` is missing variables let's pad it out with defaults.\n formData.server.variables = {\n ...oas.defaultVariables(formData.server.selected),\n ...(formData.server.variables ? formData.server.variables : {}),\n };\n\n const har: Request = {\n cookies: [],\n headers: [],\n headersSize: 0,\n queryString: [],\n // @ts-expect-error This is fine because we're fleshing `postData` out further down.\n postData: {},\n bodySize: 0,\n method: operation.method.toUpperCase(),\n url: `${oas.url(formData.server.selected, formData.server.variables as ServerVariable)}${operation.path}`.replace(\n /\\s/g,\n '%20',\n ),\n httpVersion: 'HTTP/1.1',\n };\n\n if (opts.proxyUrl) {\n if (oas.getExtension(PROXY_ENABLED, operation)) {\n har.url = `${opts.proxyUrl}/${har.url}`;\n }\n }\n\n const parameters = operation.getParameters();\n\n har.url = har.url.replace(/{([-_a-zA-Z0-9[\\]]+)}/g, (full, key) => {\n if (!operation || !parameters) return key; // No path params at all\n\n // Find the path parameter or set a default value if it does not exist\n const parameter = parameters.find(param => param.name === key) || ({ name: key } as ParameterObject);\n\n // The library that handles our style processing already encodes uri elements. For everything\n // else we need to handle it here.\n if (!('style' in parameter) || !parameter.style) {\n return encodeURIComponent(formatter(formData, parameter, 'path'));\n }\n\n return formatter(formData, parameter, 'path');\n });\n\n const queryStrings = parameters?.filter(param => param.in === 'query');\n if (queryStrings?.length) {\n queryStrings.forEach(queryString => {\n const value = formatter(formData, queryString, 'query', true);\n appendHarValue(har.queryString, queryString.name, value);\n });\n }\n\n // Do we have any `cookie` parameters on the operation?\n const cookies = parameters?.filter(param => param.in === 'cookie');\n if (cookies?.length) {\n cookies.forEach(cookie => {\n const value = formatter(formData, cookie, 'cookie', true);\n appendHarValue(har.cookies, cookie.name, value);\n });\n }\n\n // Does this response have any documented content types?\n if (operation.schema.responses) {\n Object.keys(operation.schema.responses).some(statusCode => {\n // `getResponseByStatusCode` will lazily dereference the response if it's a `$ref` pointer.\n const response = operation.getResponseByStatusCode(statusCode);\n if (!response) return false;\n\n const content = response.content;\n if (!content) return false;\n\n // If there's no `accept` header present we should add one so their eventual code snippet\n // follows best practices.\n if (Object.keys(formData.header || {}).find(h => h.toLowerCase() === 'accept')) return true;\n\n har.headers.push({\n name: 'accept',\n value: getResponseContentType(content),\n });\n\n return true;\n });\n }\n\n // Do we have any `header` parameters on the operation?\n let hasContentType = false;\n let contentType = operation.getContentType();\n const headers = parameters?.filter(param => param.in === 'header');\n if (headers?.length) {\n headers.forEach(header => {\n const value = formatter(formData, header, 'header', true);\n if (typeof value === 'undefined') return;\n\n if (header.name.toLowerCase() === 'content-type') {\n hasContentType = true;\n contentType = String(value);\n }\n\n appendHarValue(har.headers, header.name, value);\n });\n }\n\n // Are there `x-headers` static headers configured for this OAS?\n const userDefinedHeaders = oas.getExtension(HEADERS, operation) as Extensions['headers'];\n if (userDefinedHeaders) {\n userDefinedHeaders.forEach(header => {\n if (typeof header.key === 'string' && header.key.toLowerCase() === 'content-type') {\n hasContentType = true;\n contentType = String(header.value);\n }\n\n har.headers.push({\n name: String(header.key),\n value: String(header.value),\n });\n });\n }\n\n if (formData.header) {\n // Do we have an `accept` header set up in the form data, but it hasn't been added yet?\n const acceptHeader = Object.keys(formData.header).find(h => h.toLowerCase() === 'accept');\n if (acceptHeader && !har.headers.find(hdr => hdr.name.toLowerCase() === 'accept')) {\n har.headers.push({\n name: 'accept',\n value: String(formData.header[acceptHeader]),\n });\n }\n\n // Do we have a manually-defined `authorization` header set up in the form data?\n const authorizationHeader = Object.keys(formData.header).find(h => h.toLowerCase() === 'authorization');\n if (authorizationHeader && !har.headers.find(hdr => hdr.name.toLowerCase() === 'authorization')) {\n har.headers.push({\n name: 'authorization',\n value: String(formData.header[authorizationHeader]),\n });\n }\n }\n\n let requestBody: SchemaWrapper | undefined;\n if (operation.hasRequestBody()) {\n requestBody = operation.getParametersAsJSONSchema()?.find(payload => {\n // `formData` is used in our API Explorer for `application/x-www-form-urlencoded` endpoints\n // and if you have an operation with that, it will only ever have a `formData`. `body` is\n // used for all other payload shapes.\n return payload.type === (operation.isFormUrlEncoded() ? 'formData' : 'body');\n });\n }\n\n if (requestBody?.schema && Object.keys(requestBody.schema).length) {\n const requestBodySchema = requestBody.schema;\n\n if (operation.isFormUrlEncoded()) {\n if (Object.keys(formData.formData || {}).length) {\n const cleanFormData = removeUndefinedObjects(formData.formData, { preserveNullishArrays: true });\n\n if (cleanFormData !== undefined) {\n const postData: PostData = { params: [], mimeType: 'application/x-www-form-urlencoded' };\n\n Object.keys(cleanFormData).forEach(name => {\n postData.params.push({\n name,\n value: stringifyParameter(cleanFormData[name]),\n });\n });\n\n har.postData = postData;\n }\n }\n } else if (\n 'body' in formData &&\n formData.body !== undefined &&\n (isPrimitive(formData.body) || Object.keys(formData.body).length)\n ) {\n const isMultipart = operation.isMultipart();\n const isJSON = operation.isJson();\n\n if (isMultipart || isJSON) {\n try {\n let cleanBody = removeUndefinedObjects(formData.body, { preserveNullishArrays: true });\n\n if (isMultipart) {\n har.postData = { params: [], mimeType: 'multipart/form-data' };\n\n // Because some request body schema shapes might not always be a top-level `properties`,\n // instead nesting it in an `oneOf` or `anyOf` we need to extract the first usable\n // schema that we have in order to process this multipart payload.\n const safeBodySchema = getSafeRequestBody(requestBodySchema);\n\n /**\n * Discover all `{ type: string, format: binary }` properties, or arrays containing the\n * same, within the request body. If there are any, then that means that we're dealing\n * with a `multipart/form-data` request and need to treat the payload as\n * `postData.params` and supply filenames and content types for the files (if they're\n * available).\n *\n * @todo It'd be nice to replace this with `getTypedFormatsInSchema` instead.\n * @example `{ type: string, format: binary }`\n * @example `{ type: array, items: { type: string, format: binary } }`\n */\n const binaryTypes = Object.keys(safeBodySchema.properties).filter(key => {\n const propData: JSONSchema = safeBodySchema.properties[key];\n if (propData.format === 'binary') {\n return true;\n } else if (\n propData.type === 'array' &&\n propData.items &&\n typeof propData.items === 'object' &&\n propData.items !== null &&\n (propData.items as JSONSchema).format === 'binary'\n ) {\n return true;\n }\n\n return false;\n });\n\n if (cleanBody !== undefined) {\n let multipartParams: ParameterObject[] = [];\n\n const multipartContent = operation.getRequestBody('multipart/form-data');\n if (\n typeof multipartContent === 'object' &&\n multipartContent !== null &&\n // `getRequestBody()` will return an array if there are multiple content types that\n // match the one we're looking for but because we're looking for an exact\n // `multipart/form-data` match `getRequestBody()` will only ever return a single\n // object back for us.\n !Array.isArray(multipartContent)\n ) {\n multipartParams = multipartBodyToFormatterParams(formData.body, multipartContent, safeBodySchema);\n }\n\n if (multipartParams.length) {\n Object.keys(cleanBody).forEach(name => {\n const param = multipartParams.find(multipartParam => multipartParam.name === name);\n\n if (param) {\n // If we're dealing with a binary type, and the value is a valid data URL we should\n // parse out any available filename and content type to send along with the\n // parameter to interpreters like `fetch-har` can make sense of it and send a usable\n // payload.\n const addtlData: { contentType?: string; fileName?: string } = {};\n\n let value = formatter(formData, param, 'body', true);\n if (!Array.isArray(value)) {\n value = [value];\n }\n\n value.forEach((val: string) => {\n if (binaryTypes.includes(name)) {\n const parsed = parseDataUrl(val);\n if (parsed) {\n addtlData.fileName = 'name' in parsed ? parsed.name : 'unknown';\n if ('contentType' in parsed) {\n addtlData.contentType = parsed.contentType;\n }\n }\n }\n\n appendHarValue(har.postData?.params || [], name, val, addtlData);\n });\n }\n });\n }\n }\n } else {\n har.postData = { mimeType: contentType, text: '' };\n\n if (\n hasSchemaType(requestBody.schema, 'string') ||\n hasSchemaType(requestBody.schema, 'integer') ||\n hasSchemaType(requestBody.schema, 'number') ||\n hasSchemaType(requestBody.schema, 'boolean')\n ) {\n har.postData.text = JSON.stringify(JSON.parse(cleanBody));\n } else {\n /**\n * Handle formatted JSON objects that have properties that accept arbitrary JSON.\n *\n * Find all `{ type: string, format: json }` properties in the schema because we need\n * to manually `JSON.parse` them before submit, otherwise they'll be escaped instead\n * of actual objects. We also only want values that the user has entered, so we drop\n * any `undefined` `cleanBody` keys.\n */\n const jsonTypes = getTypedFormatsInSchema('json', requestBodySchema, operation.api, {\n payload: cleanBody,\n });\n\n if (Array.isArray(jsonTypes) && jsonTypes.length) {\n try {\n jsonTypes.forEach((prop: boolean | string) => {\n try {\n set(cleanBody, String(prop), JSON.parse(get(cleanBody, String(prop))));\n } catch {\n // leave the prop as a string value\n }\n });\n\n // `RAW_BODY` is a ReadMe-specific thing where we'll interpret the entire payload\n // as a raw string. https://docs.readme.com/docs/raw-body-content\n if (typeof cleanBody.RAW_BODY !== 'undefined') {\n cleanBody = cleanBody.RAW_BODY;\n }\n\n har.postData.text = JSON.stringify(cleanBody);\n } catch {\n har.postData.text = stringify(formData.body);\n }\n } else {\n // If no `format: json` paths are found then we should recursively parse any string\n // values that are valid JSON so `format: json` is still resolved for our\n // `application/json` payload.\n try {\n const parsed = parseJsonStringsInBody(cleanBody) as Record<string, unknown>;\n if (typeof parsed?.RAW_BODY !== 'undefined') {\n har.postData.text = isPrimitive(parsed.RAW_BODY)\n ? String(parsed.RAW_BODY)\n : stringify(parsed.RAW_BODY as Record<string | 'RAW_BODY', unknown>);\n } else {\n har.postData.text = JSON.stringify(parsed);\n }\n } catch {\n har.postData.text = encodeBodyForHAR(formData.body);\n }\n }\n }\n }\n } catch {\n // If anything above fails for whatever reason, assume that whatever we had is invalid\n // JSON and just treat it as raw text.\n har.postData = { mimeType: contentType, text: stringify(formData.body) };\n }\n } else {\n har.postData = { mimeType: contentType, text: encodeBodyForHAR(formData.body) };\n }\n }\n }\n\n // Add a `content-type` header if there are any body values setup above or if there is a schema\n // defined, but only do so if we don't already have a `content-type` present as it's impossible\n // for a request to have multiple.\n if ((har.postData?.text || (requestBody?.schema && Object.keys(requestBody.schema).length)) && !hasContentType) {\n har.headers.push({\n name: 'content-type',\n value: contentType,\n });\n }\n\n const securityRequirements = operation.getSecurity();\n\n if (securityRequirements?.length) {\n // TODO pass these values through the formatter?\n securityRequirements.forEach(schemes => {\n Object.keys(schemes).forEach(security => {\n const securityValue = configureSecurity(apiDefinition, auth, security);\n if (!securityValue) {\n return;\n }\n\n // If this is an `authorization` header and we've already added one (maybe one was manually\n // specified), then we shouldn't add another.\n if (securityValue.value.name === 'authorization') {\n if (har[securityValue.type].find(v => v.name === securityValue.value.name)) {\n return;\n }\n }\n\n // If we've already added this **specific** security value then don't add it again.\n if (\n har[securityValue.type].find(\n v => v.name === securityValue.value.name && v.value === securityValue.value.value,\n )\n ) {\n return;\n }\n\n har[securityValue.type].push(securityValue.value);\n });\n });\n }\n\n // If we didn't end up filling the `postData` object then we don't need it.\n if (Object.keys(har.postData || {}).length === 0) {\n delete har.postData;\n }\n\n return {\n log: {\n entries: [\n {\n request: har,\n },\n ] as const,\n },\n };\n}\n","type Many<T> = T | readonly T[];\ntype PropertyName = number | string | symbol;\ntype PropertyPath = Many<PropertyName>;\n\n/**\n * A janky, poorly typed replacement for `lodash.get`.\n *\n * @see {@link https://youmightnotneed.com/lodash#get}\n */\nexport function get(object: unknown, path?: string): any {\n // If path is not defined or it has false value\n if (!path) return undefined;\n // Check if path is string or array. Regex : ensure that we do not have '.' and brackets.\n // Regex explained: https://regexr.com/58j0k\n const pathArray = String(path).match(/([^[.\\]])+/g);\n // Find value\n // @ts-expect-error idk man\n const result = pathArray?.reduce((prevObj, key) => prevObj?.[key], object);\n // If found value is undefined return default value; otherwise return the value\n return result;\n}\n\n/**\n * A janky, poorly typed replacement for `lodash.set`.\n *\n * @see {@link https://youmightnotneed.com/lodash#set}\n */\nexport function set<TResult>(object: object, path: PropertyPath, value: any): TResult {\n // Regex explained: https://regexr.com/58j0k\n const pathArray: PropertyPath | RegExpMatchArray | null = Array.isArray(path)\n ? path\n : String(path).match(/([^[.\\]])+/g);\n\n // @ts-expect-error idk man\n return pathArray?.reduce((acc, key, i) => {\n // @ts-expect-error idk man\n if (acc[key] === undefined) {\n // @ts-expect-error idk man\n acc[key] = {};\n }\n if (i === pathArray.length - 1) {\n // @ts-expect-error idk man\n acc[key] = value;\n }\n // @ts-expect-error idk man\n return acc[key];\n }, object);\n}\n","import type { ParameterObject, SchemaObject } from 'oas/types';\nimport type { StylizerConfig } from './style-serializer.js';\n\nimport { matchesMimeType } from 'oas/utils';\nimport qs from 'qs';\n\nimport { getParameterContentType } from '../utils.js';\nimport { stylize } from './style-serializer.js';\n\n// Certain styles don't support empty values.\nfunction shouldNotStyleEmptyValues(parameter: ParameterObject) {\n return ['simple', 'spaceDelimited', 'pipeDelimited', 'deepObject'].includes(parameter.style || '');\n}\n\nfunction shouldNotStyleReservedHeader(parameter: ParameterObject) {\n return ['accept', 'authorization', 'content-type'].includes(parameter.name.toLowerCase());\n}\n\n/**\n * Note: This isn't necessarily part of the spec. Behavior for the value 'undefined' is, well,\n * undefined. This code makes our system look better. If we wanted to be more accurate, we might\n * want to remove this, restore the un-fixed behavior for undefined and have our UI pass in empty\n * string instead of undefined.\n */\nfunction removeUndefinedForPath(value: any) {\n let finalValue = value;\n\n if (typeof finalValue === 'undefined') {\n return '';\n }\n\n if (Array.isArray(finalValue)) {\n finalValue = finalValue.filter(val => (val === undefined ? '' : val));\n\n if (finalValue.length === 0) {\n finalValue = '';\n }\n }\n\n if (typeof finalValue === 'object') {\n Object.keys(finalValue).forEach(key => {\n finalValue[key] = finalValue[key] === undefined ? '' : finalValue[key];\n });\n }\n\n return finalValue;\n}\n\nfunction stylizeValue(value: unknown, parameter: ParameterObject) {\n let finalValue = value;\n\n // Some styles don't work with empty values. We catch those there\n if (shouldNotStyleEmptyValues(parameter) && (typeof finalValue === 'undefined' || finalValue === '')) {\n // Paths need return an unstyled empty string instead of undefined so it's ignored in the final\n // path string.\n if (parameter.in === 'path') {\n return '';\n }\n\n // Everything but path should return undefined when unstyled so it's ignored in the final\n // parameter array.\n return undefined;\n }\n\n // Every style that adds their style to empty values should use emptystring for path parameters\n // instead of undefined to avoid the string `undefined`.\n if (parameter.in === 'path') {\n finalValue = removeUndefinedForPath(finalValue);\n }\n\n /**\n * Eventhough `accept`, `authorization`, and `content-type` headers can be defined as parameters,\n * they should be completely ignored when it comes to serialization.\n *\n * > If `in` is \"header\" and the `name` field is \"Accept\", \"Content-Type\" or \"Authorization\", the\n * > parameter definition SHALL be ignored.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#fixed-fields-10}\n */\n if (parameter.in === 'header' && shouldNotStyleReservedHeader(parameter)) {\n return value;\n }\n\n /**\n * If content is present, we should use the content type to format the value. We also ignore the style and explode settings.\n *\n * @see {@link https://swagger.io/docs/specification/v3_0/describing-parameters/#schema-vs-content}\n */\n if (parameter.content && (parameter.in === 'query' || parameter.in === 'header')) {\n const contentType = getParameterContentType(parameter);\n if (!contentType) {\n return undefined;\n }\n\n /**\n * @todo Handle other content types\n */\n let serialized: string;\n if (matchesMimeType.json(contentType)) {\n serialized = JSON.stringify(value);\n } else {\n serialized = String(value);\n }\n\n return parameter.in === 'query' ? encodeURIComponent(serialized) : serialized;\n }\n\n /**\n * All parameter types have a default `style` format so if they don't have one prescribed we\n * should still conform to what the spec defines.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-parameterstyle}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#user-content-parameterstyle}\n */\n let style = parameter.style;\n if (!style) {\n if (parameter.in === 'query') {\n style = 'form';\n } else if (parameter.in === 'path') {\n style = 'simple';\n } else if (parameter.in === 'header') {\n style = 'simple';\n } else if (parameter.in === 'cookie') {\n style = 'form';\n }\n }\n\n let explode = parameter.explode;\n if (explode === undefined && style === 'form') {\n /**\n * Per the spec if no `explode` is present but `style` is `form` then `explode` should default to `true`.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-parameterexplode}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#user-content-parameterexplode}\n */\n explode = true;\n }\n\n return stylize({\n location: parameter.in as StylizerConfig['location'],\n value: finalValue,\n key: parameter.name,\n style: style as StylizerConfig['style'],\n explode,\n /**\n * @todo this parameter is optional to stylize. It defaults to false, and can accept falsy, truthy, or \"unsafe\".\n * I do not know if it is correct for query to use this. See style-serializer for more info\n */\n escape: true,\n ...(parameter.in === 'query' ? { isAllowedReserved: parameter.allowReserved || false } : {}),\n });\n}\n\nfunction handleDeepObject(value: any, parameter: ParameterObject) {\n return qs\n .stringify(value, {\n encoder(str, defaultEncoder, charset, type) {\n if (type === 'key') {\n // `str` will be here as `dog[treats][0]` but because the `qs` library doesn't have any\n // awareness of our OpenAPI parameters we need to rewrite it to slap the `parameter.name`\n // to the top, like `pets[dog][treats][0]`.\n const prefixedKey = str\n .split(/[[\\]]/g)\n .filter(Boolean)\n .map((k: string) => `[${k}]`)\n .join('');\n\n return `${parameter.name}${prefixedKey}`;\n } else if (type === 'value') {\n return stylizeValue(str, parameter);\n }\n },\n })\n .split('&')\n .map(item => {\n const split = item.split('=');\n return {\n label: split[0],\n // `qs` will coerce null values into being `undefined` string but we want to preserve them.\n value: split[1] === 'undefined' ? null : split[1],\n };\n });\n}\n\n// Explode is handled on its own, because style-serializer doesn't return what we expect for proper\n// HAR output.\nfunction handleExplode(value: any, parameter: ParameterObject) {\n // This is to handle the case of arrays of objects in the querystring\n // which is something that's not technically in the spec but since we're\n // using the `qs` module already, it's fairly easy for us to add support\n // for this use case.\n //\n // An example URL would be something like this:\n // https://example.com/?line_items[0][a_string]=abc&line_items[0][quantity]=1&line_items[1][a_string]=def&line_items[1][quantity]=2\n //\n // Some open issues discussing this here:\n // https://github.com/OAI/OpenAPI-Specification/issues/1706\n // https://github.com/OAI/OpenAPI-Specification/issues/1006\n //\n // Link to the spec for this:\n // https://github.com/OAI/OpenAPI-Specification/blob/36a3a67264cc1c4f1eff110cea3ebfe679435108/versions/3.1.0.md#style-examples\n if (\n Array.isArray(value) &&\n (parameter.schema as SchemaObject)?.type === 'array' &&\n parameter.style === 'deepObject'\n ) {\n const newObj: Record<string, unknown> = {};\n const deepObjs = handleDeepObject(value, parameter);\n deepObjs.forEach(obj => {\n newObj[obj.label] = obj.value;\n });\n return newObj;\n }\n\n if (Array.isArray(value)) {\n return value.map(val => {\n return stylizeValue(val, parameter);\n });\n }\n\n if (typeof value === 'object' && value !== null) {\n const newObj: Record<string, unknown> = {};\n\n Object.keys(value).forEach(key => {\n if (parameter.style === 'deepObject') {\n const deepObjs = handleDeepObject(value, parameter);\n deepObjs.forEach(obj => {\n newObj[obj.label] = obj.value;\n });\n } else {\n newObj[key] = stylizeValue(value[key], parameter);\n }\n });\n\n return newObj;\n }\n\n return stylizeValue(value, parameter);\n}\n\nfunction shouldExplode(parameter: ParameterObject) {\n return (\n (parameter.explode ||\n (parameter.explode !== false && parameter.style === 'form') ||\n // style: deepObject && explode: false doesn't exist so explode it always\n // https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples\n parameter.style === 'deepObject') &&\n // header and path doesn't explode into separate parameters like query and cookie do\n parameter.in !== 'header' &&\n parameter.in !== 'path' &&\n !parameter.content\n );\n}\n\nexport function formatStyle(value: unknown, parameter: ParameterObject): any {\n // Deep object style only works on objects and arrays, and only works with explode=true.\n if (\n !parameter.content &&\n parameter.style === 'deepObject' &&\n (!value || typeof value !== 'object' || parameter.explode === false)\n ) {\n return undefined;\n }\n\n // This custom explode logic allows us to bubble up arrays and objects to be handled differently\n // by our HAR transformer. We need this because the `stylizeValue` function assumes we're building\n // strings, not richer data types.\n //\n // The first part of this conditional checks if `explode` is enabled. Explode is disabled for\n // everything by default except for forms.\n //\n // The second part of this conditional bypasses the custom explode logic for headers, because they\n // work differently, and `stylizeValue` is accurate.\n if (shouldExplode(parameter)) {\n return handleExplode(value, parameter);\n }\n\n return stylizeValue(value, parameter);\n}\n","import type { OASDocument, ParameterObject, SchemaObject } from 'oas/types';\n\nimport { isRef } from 'oas/types';\nimport { dereferenceRef, getParameterContentType as getParameterContentTypeUtil } from 'oas/utils';\n\nimport { get } from './lodash.js';\n\n/**\n * Determine if a schema `type` is, or contains, a specific discriminator.\n *\n */\nexport function hasSchemaType(\n schema: SchemaObject,\n discriminator: 'array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string',\n): boolean {\n if (Array.isArray(schema.type)) {\n return schema.type.includes(discriminator);\n }\n\n return schema.type === discriminator;\n}\n\n/**\n * Because some request body schema shapes might not always be a top-level `properties`, instead\n * nesting it in an `oneOf` or `anyOf` we need to extract the first usable schema that we have. If\n * we don't do this then these non-conventional request body schema payloads may not be properly\n * represented in the HAR that we generate.\n *\n */\nexport function getSafeRequestBody(obj: any): any {\n if ('oneOf' in obj) {\n return getSafeRequestBody(obj.oneOf[0]);\n } else if ('anyOf' in obj) {\n return getSafeRequestBody(obj.anyOf[0]);\n }\n\n return obj;\n}\n\ninterface Options {\n parentIsArray?: boolean;\n parentKey?: string;\n payload: unknown;\n}\n\ninterface SubschemaEntry {\n key: string;\n schema: SchemaObject;\n parentIsArray?: boolean;\n}\n\nfunction getSubschemas(\n schema: SchemaObject,\n api: OASDocument,\n opts: Options,\n seenRefs: Set<string> = new Set(),\n): SubschemaEntry[] | false {\n let subSchemaDataSize = 0;\n if (opts.parentIsArray) {\n // If we don't have data for this parent schema in our body payload then we\n // shouldn't bother spidering further into the schema looking for more `format`s\n // for data that definitely doesn't exist.\n const parentData = get(opts.payload, opts.parentKey || '');\n if (parentData === undefined || !Array.isArray(parentData)) {\n return false;\n }\n\n subSchemaDataSize = parentData.length;\n }\n\n let subschemas: SubschemaEntry[] = [];\n if (subSchemaDataSize > 0) {\n for (let idx = 0; idx < subSchemaDataSize; idx += 1) {\n const foundSubschemas = getSubschemas(\n schema,\n api,\n {\n ...opts,\n parentIsArray: false,\n parentKey: opts.parentKey ? [opts.parentKey, idx].join('.') : String(idx),\n },\n seenRefs,\n );\n\n if (foundSubschemas) {\n subschemas = subschemas.concat(foundSubschemas);\n }\n }\n } else {\n let resolvedSchema = schema;\n if (schema && isRef(schema)) {\n // Skip $refs we've already visited to prevent infinite recursion on circular references\n if (seenRefs.has(schema.$ref)) {\n return subschemas;\n }\n seenRefs.add(schema.$ref);\n\n resolvedSchema = dereferenceRef(schema, api);\n if (!resolvedSchema || isRef(resolvedSchema)) {\n return subschemas;\n }\n }\n\n const baseKey = opts.parentKey ?? '';\n\n // Collect subschemas from this objects `properties`, dereferencing `$ref` pointers and\n // building up a collection of dot-notation keys for each schema.\n if (resolvedSchema.properties && typeof resolvedSchema.properties === 'object') {\n for (const [propName, propSchema] of Object.entries(resolvedSchema.properties)) {\n if (propSchema && typeof propSchema === 'object') {\n let resolved: SchemaObject | undefined;\n if (isRef(propSchema)) {\n if (seenRefs.has(propSchema.$ref)) {\n continue;\n }\n seenRefs.add(propSchema.$ref);\n resolved = dereferenceRef(propSchema, api);\n } else {\n resolved = propSchema;\n }\n\n if (resolved && !isRef(resolved)) {\n subschemas.push({\n key: baseKey ? [baseKey, propName].join('.') : propName,\n schema: resolved,\n });\n }\n }\n }\n }\n\n // When the schema has no formal `properties` we need to enumerate through each of its available\n // property keys, collecting subschemas and dot-notation keysfrom each value. Generally we'll\n // hit this block when processing data like OpenAPI Media Type objects.\n if (\n !('properties' in resolvedSchema) &&\n typeof resolvedSchema === 'object' &&\n !('type' in resolvedSchema && resolvedSchema.type !== 'object')\n ) {\n for (const [propName, propSchema] of Object.entries(resolvedSchema)) {\n if (propSchema && (Array.isArray(propSchema) || (typeof propSchema === 'object' && propSchema !== null))) {\n const raw = getSafeRequestBody(propSchema);\n const resolved = isRef(raw) ? dereferenceRef(raw, api) : raw;\n const toPush = resolved && !isRef(resolved) ? resolved : raw;\n if (toPush && typeof toPush === 'object') {\n subschemas.push({\n key: baseKey ? [baseKey, propName].join('.') : propName,\n schema: toPush,\n });\n }\n }\n }\n }\n\n if ('items' in resolvedSchema && resolvedSchema.items !== undefined && resolvedSchema.items !== true) {\n const itemsSchema = resolvedSchema.items as SchemaObject;\n let resolved: SchemaObject | undefined;\n if (isRef(itemsSchema)) {\n if (!seenRefs.has(itemsSchema.$ref)) {\n seenRefs.add(itemsSchema.$ref);\n resolved = dereferenceRef(itemsSchema, api);\n }\n } else {\n resolved = itemsSchema;\n }\n\n if (resolved && !isRef(resolved)) {\n subschemas.push({\n key: baseKey,\n schema: resolved,\n parentIsArray: true,\n });\n }\n }\n }\n\n return subschemas;\n}\n\n/**\n * With a supplied JSON Schema object, spider through it for any schemas that may contain specific\n * kind of `format` that also happen to be within the current `requestBody` payload that we're\n * creating a HAR representation for.\n *\n */\nexport function getTypedFormatsInSchema(\n format: 'binary' | 'json',\n schema: SchemaObject,\n api: OASDocument,\n opts: Options,\n seenRefs: Set<string> = new Set(),\n): (boolean | string)[] | boolean | string {\n try {\n if (schema?.format === format) {\n if (opts.parentIsArray) {\n const parentData = get(opts.payload, opts.parentKey || '');\n if (parentData !== undefined && Array.isArray(parentData)) {\n return Object.keys(parentData)\n .map(pdk => {\n const currentKey = [opts.parentKey, pdk].join('.');\n if (get(opts.payload, currentKey) !== undefined) {\n return currentKey;\n }\n\n return false;\n })\n .filter(Boolean);\n }\n } else if (opts.parentKey && get(opts.payload, opts.parentKey) !== undefined) {\n return opts.parentKey;\n } else if (!opts.parentKey && opts.payload !== undefined) {\n // If this payload is present and we're looking for a specific format then we should assume\n // that the **root** schema of the request body is that format, and we aren't trafficking in\n // a nested object or array schema.\n return true;\n }\n\n return false;\n }\n\n const subschemas = getSubschemas(schema, api, opts, seenRefs);\n if (!subschemas) {\n return false;\n }\n\n return subschemas\n .flatMap(({ key, schema: subschema, parentIsArray: entryIsArray }) => {\n if (isRef(subschema)) {\n const resolved = dereferenceRef(subschema, api);\n if (resolved && !isRef(resolved)) {\n return resolved;\n }\n\n return false;\n }\n\n return getTypedFormatsInSchema(\n format,\n subschema,\n api,\n {\n payload: opts.payload,\n parentKey: key,\n parentIsArray: entryIsArray,\n },\n seenRefs,\n );\n })\n .filter(Boolean);\n } catch {\n // If this fails for whatever reason then we should act as if we didn't find any `format`'d\n // schemas.\n return [];\n }\n}\n\n/**\n * Extract content type from a parameter's `content` field.\n * According to OAS spec, when `content` is present, `style` and `explode` are ignored.\n * We prioritize `application/json` and other JSON-like content types over other content types.\n * Note: this is just a safe guard. In OAS parser, we enforce that there is exactly one content type.\n *\n * @param param - The parameter object\n * @returns The content type, or `null` if no content is present\n */\nexport function getParameterContentType(param: ParameterObject): string | null {\n if (!('content' in param) || typeof param.content !== 'object' || !param.content) {\n return null;\n }\n\n const contentKeys = Object.keys(param.content);\n if (contentKeys.length < 1) {\n return null;\n }\n\n return getParameterContentTypeUtil(contentKeys) || null;\n}\n\n/**\n * Extract schema from a parameter's `content` field.\n *\n * @param param - The parameter object\n * @param contentType - The content type\n * @returns The schema, or `null` if no schema is present\n */\nexport function getParameterContentSchema(param: ParameterObject, contentType: string): SchemaObject | null {\n if (!('content' in param) || typeof param.content !== 'object' || !param.content) {\n return null;\n }\n\n const mediaTypeObject = param.content[contentType];\n if (typeof mediaTypeObject === 'object' && mediaTypeObject && 'schema' in mediaTypeObject && mediaTypeObject.schema) {\n return isRef(mediaTypeObject.schema) ? null : (mediaTypeObject.schema as SchemaObject);\n }\n\n return null;\n}\n\n/**\n * Recursively parse string values that are valid JSON.\n *\n * This is used when we're dealing with objects that have nested `format: json` descriptors.\n */\nexport function parseJsonStringsInBody(obj: unknown): unknown {\n if (typeof obj === 'string') {\n try {\n const p = JSON.parse(obj);\n return typeof p === 'object' && p !== null ? parseJsonStringsInBody(p) : p;\n } catch {\n return obj;\n }\n }\n\n if (Array.isArray(obj)) {\n return obj.map(parseJsonStringsInBody);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = parseJsonStringsInBody(v);\n }\n\n return out;\n }\n\n return obj;\n}\n","/**\n * This file has been extracted and modified from `swagger-client`.\n *\n * @license Apache 2.0\n * @link https://npm.im/swagger-client\n * @link https://github.com/swagger-api/swagger-js/blob/master/src/execute/oas3/style-serializer.js\n */\n\nconst isRfc3986Reserved = (char: string) => \":/?#[]@!$&'()*+,;=\".indexOf(char) > -1;\nconst isRfc3986Unreserved = (char: string) => /^[a-z0-9\\-._~]+$/i.test(char);\n\nfunction isURIEncoded(value: string) {\n try {\n return decodeURIComponent(value) !== value;\n } catch {\n // `decodeURIComponent` will throw an exception if a string that has an un-encoded percent sign\n // in it (like 20%), o if it's throwing we can just assume that the value hasn't been encoded.\n return false;\n }\n}\n\nfunction isObject(value: unknown) {\n return typeof value === 'object' && value !== null;\n}\n\nfunction encodeDisallowedCharacters(\n str: string,\n {\n escape,\n returnIfEncoded = false,\n isAllowedReserved,\n }: {\n escape?: boolean | 'unsafe';\n isAllowedReserved?: boolean;\n returnIfEncoded?: boolean;\n } = {},\n parse?: boolean,\n): any {\n if (typeof str === 'number') {\n // biome-ignore lint/style/noParameterAssign: It is what it is.\n str = (str as number).toString();\n }\n\n if (returnIfEncoded) {\n if (isURIEncoded(str)) {\n return str;\n }\n }\n\n if (typeof str !== 'string' || !str.length) {\n return str;\n }\n\n if (!escape) {\n return str;\n }\n\n if (parse) {\n return JSON.parse(str);\n }\n\n // In ES6 you can do this quite easily by using the new ... spread operator. This causes the\n // string iterator (another new ES6 feature) to be used internally, and because that iterator is\n // designed to deal with code points rather than UCS-2/UTF-16 code units.\n return [...str]\n .map(char => {\n if (isRfc3986Unreserved(char)) {\n return char;\n }\n\n if (isRfc3986Reserved(char) && (escape === 'unsafe' || isAllowedReserved)) {\n return char;\n }\n\n const encoder = new TextEncoder();\n const encoded = Array.from(encoder.encode(char))\n .map(byte => `0${byte.toString(16).toUpperCase()}`.slice(-2))\n .map(encodedByte => `%${encodedByte}`)\n .join('');\n\n return encoded;\n })\n .join('');\n}\n\nexport interface StylizerConfig {\n escape: boolean | 'unsafe';\n explode?: boolean;\n isAllowedReserved?: boolean;\n key: string;\n location: 'body' | 'query';\n style: 'deepObject' | 'form' | 'label' | 'matrix' | 'pipeDelimited' | 'simple' | 'spaceDelimited';\n value: any;\n}\n\nexport function stylize(config: StylizerConfig): any {\n const { value } = config;\n\n if (Array.isArray(value)) {\n return encodeArray(config);\n }\n\n if (isObject(value)) {\n return encodeObject(config);\n }\n\n return encodePrimitive(config);\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodeArray({\n location,\n key,\n value,\n style,\n explode,\n escape,\n isAllowedReserved = false,\n}: Omit<StylizerConfig, 'value'> & { value: string[] }) {\n const valueEncoder = (str: string) => {\n // Handle null values explicitly to prevent join() from converting to empty string\n if (str === null) {\n return 'null';\n }\n\n const result = encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query',\n isAllowedReserved,\n });\n\n return result;\n };\n\n switch (style) {\n /**\n * @example <caption>`style: simple`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue,black,brown`\n */\n case 'simple':\n return value.map(val => valueEncoder(val)).join(',');\n\n /**\n * @example <caption>`style: label`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `.blue.black.brown`\n */\n case 'label':\n return `.${value.map(val => valueEncoder(val)).join('.')}`;\n\n /**\n * @example <caption>`style: matrix` + `explode: true`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `;color=blue;color=black;color=brown`\n *\n * @example <caption>`style: matrix` + `explode: false` (the default behavior)</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `;color=blue,black,brown\t`\n */\n case 'matrix':\n return value\n .map(val => valueEncoder(val))\n .reduce((prev, curr) => {\n if (!prev || explode) {\n return `${prev || ''};${key}=${curr}`;\n }\n return `${prev},${curr}`;\n }, '');\n\n /**\n * @example <caption>`style: form` + `explode: true`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `color=blue&color=black&color=brown`\n *\n * @example <caption>`style: form` + `explode: false` (the default behavior)</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `color=blue,black,brown`\n */\n case 'form':\n return value.map(val => valueEncoder(val)).join(explode ? `&${key}=` : ',');\n\n /**\n * @example <caption>`style: spaceDelimited`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue%20black%20brown`\n */\n case 'spaceDelimited':\n return value.map(val => valueEncoder(val)).join(` ${explode ? `${key}=` : ''}`);\n\n /**\n * @example <caption>`style: pipeDelimited`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue|black|brown`\n */\n case 'pipeDelimited':\n return value.map(val => valueEncoder(val)).join(`|${explode ? `${key}=` : ''}`);\n\n default:\n return undefined;\n }\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodeObject({ location, key, value, style, explode, escape, isAllowedReserved = false }: StylizerConfig) {\n const valueEncoder = (str: string) =>\n encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query',\n isAllowedReserved,\n });\n\n const valueKeys = Object.keys(value);\n\n switch (style) {\n /**\n * @example <caption>`style: simple` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R=100,G=200,B=150`\n *\n * @example <caption>`style: simple` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R,100,G,200,B,150`\n */\n case 'simple':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const middleChar = explode ? '=' : ',';\n const prefix = prev ? `${prev},` : '';\n\n return `${prefix}${curr}${middleChar}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: label` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `.R=100.G=200.B=150`\n *\n * @example <caption>`style: label` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `.R.100.G.200.B.150`\n */\n case 'label':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const middleChar = explode ? '=' : '.';\n const prefix = prev ? `${prev}.` : '.';\n\n return `${prefix}${curr}${middleChar}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: matrix` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `;R=100;G=200;B=150`\n *\n * @example <caption>`style: matrix` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `;color=R,100,G,200,B,150`\n */\n case 'matrix':\n if (explode) {\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev};` : ';';\n\n return `${prefix}${curr}=${val}`;\n }, '');\n }\n\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev},` : `;${key}=`;\n\n return `${prefix}${curr},${val}`;\n }, '');\n\n /**\n * @example <caption>`style: form` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R=100&G=200&B=150`\n *\n * @example <caption>`style: form` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `color=R,100,G,200,B,150`\n */\n case 'form':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev}${explode ? '&' : ','}` : '';\n const separator = explode ? '=' : ',';\n\n return `${prefix}${curr}${separator}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: spaceDelimited`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R%20100%20G%20200%20B%20150`\n */\n case 'spaceDelimited':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev} ` : '';\n\n return `${prefix}${curr} ${val}`;\n }, '');\n\n /**\n * @example <caption>`style: pipeDelimited`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R|100|G|200|B|150`\n */\n case 'pipeDelimited':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev}|` : '';\n\n return `${prefix}${curr}|${val}`;\n }, '');\n\n /**\n * @example <caption>`style: deepObject`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `color[R]=100&color[G]=200&color[B]=150`\n */\n case 'deepObject':\n return valueKeys.reduce(curr => {\n const val = valueEncoder(value[curr]);\n return `${val}`;\n }, '');\n\n default:\n return undefined;\n }\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodePrimitive({ location, key, value, style, escape, isAllowedReserved = false }: StylizerConfig) {\n const valueEncoder = (str: string) =>\n encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query' || location === 'body',\n isAllowedReserved,\n });\n\n switch (style) {\n /**\n * @example <caption>`style: simple`</caption>\n * `blue` → `blue`\n */\n case 'simple':\n return valueEncoder(value);\n\n /**\n * @example <caption>`style: label`</caption>\n * `blue` → `.blue`\n */\n case 'label':\n return `.${valueEncoder(value)}`;\n\n /**\n * @example <caption>`style: matrix`</caption>\n * `blue` → `;color=blue`\n */\n case 'matrix':\n if (value === '') {\n return `;${key}`;\n }\n\n return `;${key}=${valueEncoder(value)}`;\n\n /**\n * @example <caption>`style: form`</caption>\n * `blue` → `color=blue`\n */\n case 'form':\n return valueEncoder(value);\n\n /**\n * @example <caption>`style: deepObject`</caption>\n * `blue` → n/a\n */\n case 'deepObject':\n return valueEncoder(value);\n\n default:\n return undefined;\n }\n}\n"],"mappings":"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","names":["isRef","matchesMimeType","value","isRef","matchesMimeType"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/lodash.ts","../src/lib/style-formatting/index.ts","../src/lib/utils.ts","../src/lib/style-formatting/style-serializer.ts"],"sourcesContent":["import type { PostData, PostDataParams, Request } from 'har-format';\nimport type { Extensions } from 'oas/extensions';\nimport type {\n HttpMethods,\n JSONSchema,\n MediaTypeObject,\n OASDocument,\n OperationObject,\n ParameterObject,\n SchemaObject,\n SchemaWrapper,\n ServerVariable,\n} from 'oas/types';\nimport type { AuthForHAR, DataForHAR, oasToHarOptions } from './lib/types.js';\n\nimport { parse as parseDataUrl } from '@readme/data-urls';\nimport Oas from 'oas';\nimport { HEADERS, PROXY_ENABLED } from 'oas/extensions';\nimport { Operation } from 'oas/operation';\nimport { isRef } from 'oas/types';\nimport { jsonSchemaTypes, matchesMimeType } from 'oas/utils';\nimport removeUndefinedObjects from 'remove-undefined-objects';\n\nimport configureSecurity from './lib/configure-security.js';\nimport { get, set } from './lib/lodash.js';\nimport { formatStyle } from './lib/style-formatting/index.js';\nimport {\n getParameterContentSchema,\n getParameterContentType,\n getSafeRequestBody,\n getTypedFormatsInSchema,\n hasSchemaType,\n parseJSONStringsInBodyWithSchema,\n} from './lib/utils.js';\n\nfunction formatter(\n values: DataForHAR,\n param: ParameterObject,\n type: 'body' | 'cookie' | 'header' | 'path' | 'query',\n onlyIfExists = false,\n) {\n if (param.style) {\n const value = values[type][param.name];\n // Note: Technically we could send everything through the format style and choose the proper\n // default for each `in` type (e.g. query defaults to form).\n return formatStyle(value, param);\n }\n\n let value: string | number | boolean | undefined;\n\n // Handle missing values\n if (typeof values[type][param.name] !== 'undefined') {\n value = values[type][param.name];\n } else if (onlyIfExists && !param.required) {\n value = undefined;\n } else if (param.required && param.schema && !isRef(param.schema) && param.schema.default) {\n value = param.schema.default;\n } else if (param.required && param.content) {\n const contentType = getParameterContentType(param);\n const schema = contentType ? getParameterContentSchema(param, contentType) : null;\n value = schema?.default;\n } else if (type === 'path') {\n // If we don't have any values for the path parameter, just use the name of the parameter as the\n // value so we don't try try to build a URL to something like `https://example.com/undefined`.\n return param.name;\n }\n\n // Handle file uploads. Specifically arrays of file uploads which need to be formatted very\n // specifically.\n if (\n param.schema &&\n !isRef(param.schema) &&\n param.schema.type === 'array' &&\n param.schema.items &&\n !isRef(param.schema.items) &&\n param.schema.items.format === 'binary'\n ) {\n if (Array.isArray(value)) {\n // If this is array of binary data then we shouldn't do anything because we'll prepare them\n // separately in the HAR in order to preserve `fileName` and `contentType` data within\n // `postData.params`. If we don't then the HAR we generate for this data will be invalid.\n return value;\n }\n\n return JSON.stringify(value);\n }\n\n if (value !== undefined) {\n // Query params should always be formatted, even if they don't have a `style` serialization\n // configured. Content-based header params also need formatting to properly serialize values\n // (e.g. JSON.stringify objects) instead of passing raw objects through. However, schema-based\n // header params should NOT be formatted as this would incorrectly URL-encode their values.\n if (type === 'query' || (type === 'header' && param.content)) {\n return formatStyle(value, param);\n }\n\n return value;\n }\n\n return undefined;\n}\n\nfunction multipartBodyToFormatterParams(payload: unknown, oasMediaTypeObject: MediaTypeObject, schema: SchemaObject) {\n const encoding = oasMediaTypeObject.encoding;\n\n if (typeof payload === 'object' && payload !== null) {\n return Object.keys(payload)\n .map(key => {\n // If we have an incoming parameter, but it's not in the schema ignore it.\n if (!schema.properties?.[key]) {\n return false;\n }\n\n const paramEncoding = encoding ? encoding[key] : undefined;\n\n return {\n name: key,\n // If the style isn't defined, use the default\n style: paramEncoding ? paramEncoding.style : undefined,\n // If explode isn't defined, use the default\n explode: paramEncoding ? paramEncoding.explode : undefined,\n required:\n (schema.required && typeof schema.required === 'boolean' && Boolean(schema.required)) ||\n (Array.isArray(schema.required) && schema.required.includes(key)),\n schema: schema.properties[key],\n in: 'body',\n };\n })\n .filter(Boolean) as ParameterObject[];\n }\n\n // Pretty sure that we'll never have anything but an object for multipart bodies, so returning\n // empty array if we get anything else.\n return [];\n}\n\nconst defaultFormDataTypes = Object.keys(jsonSchemaTypes).reduce((prev, curr) => {\n return Object.assign(prev, { [curr]: {} });\n}, {});\n\nfunction getResponseContentType(content: MediaTypeObject) {\n const types = Object.keys(content) || [];\n\n // If this response content has multiple types available we should always prefer the one that's\n // JSON-compatible. If they don't have one that is we'll return the first available, otherwise\n // if they don't have **any** repsonse content types present we'll assume it's JSON.\n if (types?.length) {\n const jsonType = types.find(t => matchesMimeType.json(t));\n if (jsonType) {\n return jsonType;\n }\n\n return types[0];\n }\n\n return 'application/json';\n}\n\nfunction isPrimitive(val: unknown) {\n return typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean';\n}\n\nfunction stringify(json: Record<string | 'RAW_BODY', unknown>) {\n return JSON.stringify(\n removeUndefinedObjects(typeof json.RAW_BODY !== 'undefined' ? json.RAW_BODY : json, {\n preserveNullishArrays: true,\n }),\n );\n}\n\nfunction stringifyParameter(param: any): string {\n if (param === null || isPrimitive(param)) {\n return String(param);\n } else if (Array.isArray(param) && param.every(isPrimitive)) {\n return String(param);\n }\n\n return JSON.stringify(param);\n}\n\nfunction appendHarValue(\n harParam: PostDataParams['params'] | Request['cookies'] | Request['headers'] | Request['queryString'],\n name: string,\n value: any,\n addtlData: {\n contentType?: string;\n fileName?: string;\n } = {},\n) {\n if (typeof value === 'undefined') return;\n\n if (Array.isArray(value)) {\n // If the formatter gives us an array, we're expected to add each array value as a new\n // parameter item with the same parameter name\n value.forEach(singleValue => {\n appendHarValue(harParam, name, singleValue);\n });\n } else if (typeof value === 'object' && value !== null) {\n // If the formatter gives us an object, we're expected to add each property value as a new\n // parameter item, each with the name of the property\n Object.keys(value).forEach(key => {\n appendHarValue(harParam, key, value[key]);\n });\n } else {\n // If the formatter gives us a non-array, non-object, we add it as is\n harParam.push({\n ...addtlData,\n name,\n value: String(value),\n });\n }\n}\n\nfunction encodeBodyForHAR(body: any) {\n if (isPrimitive(body)) {\n return body;\n } else if (\n typeof body === 'object' &&\n body !== null &&\n !Array.isArray(body) &&\n typeof body.RAW_BODY !== 'undefined'\n ) {\n // `RAW_BODY` is a ReadMe-specific thing where we'll interpret the entire payload as a\n // raw string. https://docs.readme.com/docs/raw-body-content\n if (isPrimitive(body.RAW_BODY)) {\n return body.RAW_BODY;\n }\n\n return stringify(body.RAW_BODY);\n }\n\n return stringify(body);\n}\n\n// biome-ignore lint/style/noDefaultExport: This is fine for now.\nexport default function oasToHar(\n oas: Oas,\n operationSchema?: Operation,\n values: DataForHAR = {},\n auth: AuthForHAR = {},\n opts: oasToHarOptions = { proxyUrl: '' },\n): {\n log: {\n entries: readonly [\n {\n readonly request: Request;\n },\n ];\n };\n} {\n let operation: Operation;\n if (!operationSchema || typeof operationSchema.getParameters !== 'function') {\n /**\n * If `operationSchema` was supplied as a plain object instead of an instance of `Operation`\n * then we should create a new instance of it. We're doing it with a check on `getParameters`\n * instead of checking `instanceof Operation` because JS is very weird when it comes to\n * checking `instanceof` against classes. One instance of `Operation` may not always match up\n * with another if they're being loaded between two different libraries.\n *\n * It's weird. This is easier.\n */\n const currentOas = Oas.init(oas as unknown as OASDocument);\n operation = new Operation(\n currentOas,\n operationSchema?.path || '',\n operationSchema?.method || ('' as HttpMethods),\n (operationSchema as unknown as OperationObject) || { path: '', method: '' },\n );\n } else {\n operation = operationSchema;\n }\n\n const apiDefinition = oas.getDefinition();\n\n const formData: DataForHAR = {\n ...defaultFormDataTypes,\n ...values,\n };\n\n if (!formData.server) {\n formData.server = {\n selected: 0,\n variables: oas.defaultVariables(0),\n };\n }\n\n // If the incoming `server.variables` is missing variables let's pad it out with defaults.\n formData.server.variables = {\n ...oas.defaultVariables(formData.server.selected),\n ...(formData.server.variables ? formData.server.variables : {}),\n };\n\n const har: Request = {\n cookies: [],\n headers: [],\n headersSize: 0,\n queryString: [],\n // @ts-expect-error This is fine because we're fleshing `postData` out further down.\n postData: {},\n bodySize: 0,\n method: operation.method.toUpperCase(),\n url: `${oas.url(formData.server.selected, formData.server.variables as ServerVariable)}${operation.path}`.replace(\n /\\s/g,\n '%20',\n ),\n httpVersion: 'HTTP/1.1',\n };\n\n if (opts.proxyUrl) {\n if (oas.getExtension(PROXY_ENABLED, operation)) {\n har.url = `${opts.proxyUrl}/${har.url}`;\n }\n }\n\n const parameters = operation.getParameters();\n\n har.url = har.url.replace(/{([-_a-zA-Z0-9[\\]]+)}/g, (full, key) => {\n if (!operation || !parameters) return key; // No path params at all\n\n // Find the path parameter or set a default value if it does not exist\n const parameter = parameters.find(param => param.name === key) || ({ name: key } as ParameterObject);\n\n // The library that handles our style processing already encodes uri elements. For everything\n // else we need to handle it here.\n if (!('style' in parameter) || !parameter.style) {\n return encodeURIComponent(formatter(formData, parameter, 'path'));\n }\n\n return formatter(formData, parameter, 'path');\n });\n\n const queryStrings = parameters?.filter(param => param.in === 'query');\n if (queryStrings?.length) {\n queryStrings.forEach(queryString => {\n const value = formatter(formData, queryString, 'query', true);\n appendHarValue(har.queryString, queryString.name, value);\n });\n }\n\n // Do we have any `cookie` parameters on the operation?\n const cookies = parameters?.filter(param => param.in === 'cookie');\n if (cookies?.length) {\n cookies.forEach(cookie => {\n const value = formatter(formData, cookie, 'cookie', true);\n appendHarValue(har.cookies, cookie.name, value);\n });\n }\n\n // Does this response have any documented content types?\n if (operation.schema.responses) {\n Object.keys(operation.schema.responses).some(statusCode => {\n // `getResponseByStatusCode` will lazily dereference the response if it's a `$ref` pointer.\n const response = operation.getResponseByStatusCode(statusCode);\n if (!response) return false;\n\n const content = response.content;\n if (!content) return false;\n\n // If there's no `accept` header present we should add one so their eventual code snippet\n // follows best practices.\n if (Object.keys(formData.header || {}).find(h => h.toLowerCase() === 'accept')) return true;\n\n har.headers.push({\n name: 'accept',\n value: getResponseContentType(content),\n });\n\n return true;\n });\n }\n\n // Do we have any `header` parameters on the operation?\n let hasContentType = false;\n let contentType = operation.getContentType();\n const headers = parameters?.filter(param => param.in === 'header');\n if (headers?.length) {\n headers.forEach(header => {\n const value = formatter(formData, header, 'header', true);\n if (typeof value === 'undefined') return;\n\n if (header.name.toLowerCase() === 'content-type') {\n hasContentType = true;\n contentType = String(value);\n }\n\n appendHarValue(har.headers, header.name, value);\n });\n }\n\n // Are there `x-headers` static headers configured for this OAS?\n const userDefinedHeaders = oas.getExtension(HEADERS, operation) as Extensions['headers'];\n if (userDefinedHeaders) {\n userDefinedHeaders.forEach(header => {\n if (typeof header.key === 'string' && header.key.toLowerCase() === 'content-type') {\n hasContentType = true;\n contentType = String(header.value);\n }\n\n har.headers.push({\n name: String(header.key),\n value: String(header.value),\n });\n });\n }\n\n if (formData.header) {\n // Do we have an `accept` header set up in the form data, but it hasn't been added yet?\n const acceptHeader = Object.keys(formData.header).find(h => h.toLowerCase() === 'accept');\n if (acceptHeader && !har.headers.find(hdr => hdr.name.toLowerCase() === 'accept')) {\n har.headers.push({\n name: 'accept',\n value: String(formData.header[acceptHeader]),\n });\n }\n\n // Do we have a manually-defined `authorization` header set up in the form data?\n const authorizationHeader = Object.keys(formData.header).find(h => h.toLowerCase() === 'authorization');\n if (authorizationHeader && !har.headers.find(hdr => hdr.name.toLowerCase() === 'authorization')) {\n har.headers.push({\n name: 'authorization',\n value: String(formData.header[authorizationHeader]),\n });\n }\n }\n\n let requestBody: SchemaWrapper | undefined;\n if (operation.hasRequestBody()) {\n requestBody = operation.getParametersAsJSONSchema()?.find(payload => {\n // `formData` is used in our API Explorer for `application/x-www-form-urlencoded` endpoints\n // and if you have an operation with that, it will only ever have a `formData`. `body` is\n // used for all other payload shapes.\n return payload.type === (operation.isFormUrlEncoded() ? 'formData' : 'body');\n });\n }\n\n if (requestBody?.schema && Object.keys(requestBody.schema).length) {\n const requestBodySchema = requestBody.schema;\n\n if (operation.isFormUrlEncoded()) {\n if (Object.keys(formData.formData || {}).length) {\n const cleanFormData = removeUndefinedObjects(formData.formData, { preserveNullishArrays: true });\n\n if (cleanFormData !== undefined) {\n const postData: PostData = { params: [], mimeType: 'application/x-www-form-urlencoded' };\n\n Object.keys(cleanFormData).forEach(name => {\n postData.params.push({\n name,\n value: stringifyParameter(cleanFormData[name]),\n });\n });\n\n har.postData = postData;\n }\n }\n } else if (\n 'body' in formData &&\n formData.body !== undefined &&\n (isPrimitive(formData.body) || Object.keys(formData.body).length)\n ) {\n const isMultipart = operation.isMultipart();\n const isJSON = operation.isJson();\n\n if (isMultipart || isJSON) {\n try {\n let cleanBody = removeUndefinedObjects(formData.body, { preserveNullishArrays: true });\n\n if (isMultipart) {\n har.postData = { params: [], mimeType: 'multipart/form-data' };\n\n // Because some request body schema shapes might not always be a top-level `properties`,\n // instead nesting it in an `oneOf` or `anyOf` we need to extract the first usable\n // schema that we have in order to process this multipart payload.\n const safeBodySchema = getSafeRequestBody(requestBodySchema);\n\n /**\n * Discover all `{ type: string, format: binary }` properties, or arrays containing the\n * same, within the request body. If there are any, then that means that we're dealing\n * with a `multipart/form-data` request and need to treat the payload as\n * `postData.params` and supply filenames and content types for the files (if they're\n * available).\n *\n * @todo It'd be nice to replace this with `getTypedFormatsInSchema` instead.\n * @example `{ type: string, format: binary }`\n * @example `{ type: array, items: { type: string, format: binary } }`\n */\n const binaryTypes = Object.keys(safeBodySchema.properties).filter(key => {\n const propData: JSONSchema = safeBodySchema.properties[key];\n if (propData.format === 'binary') {\n return true;\n } else if (\n propData.type === 'array' &&\n propData.items &&\n typeof propData.items === 'object' &&\n propData.items !== null &&\n (propData.items as JSONSchema).format === 'binary'\n ) {\n return true;\n }\n\n return false;\n });\n\n if (cleanBody !== undefined) {\n let multipartParams: ParameterObject[] = [];\n\n const multipartContent = operation.getRequestBody('multipart/form-data');\n if (\n typeof multipartContent === 'object' &&\n multipartContent !== null &&\n // `getRequestBody()` will return an array if there are multiple content types that\n // match the one we're looking for but because we're looking for an exact\n // `multipart/form-data` match `getRequestBody()` will only ever return a single\n // object back for us.\n !Array.isArray(multipartContent)\n ) {\n multipartParams = multipartBodyToFormatterParams(formData.body, multipartContent, safeBodySchema);\n }\n\n if (multipartParams.length) {\n Object.keys(cleanBody).forEach(name => {\n const param = multipartParams.find(multipartParam => multipartParam.name === name);\n\n if (param) {\n // If we're dealing with a binary type, and the value is a valid data URL we should\n // parse out any available filename and content type to send along with the\n // parameter to interpreters like `fetch-har` can make sense of it and send a usable\n // payload.\n const addtlData: { contentType?: string; fileName?: string } = {};\n\n let value = formatter(formData, param, 'body', true);\n if (!Array.isArray(value)) {\n value = [value];\n }\n\n value.forEach((val: string) => {\n if (binaryTypes.includes(name)) {\n const parsed = parseDataUrl(val);\n if (parsed) {\n addtlData.fileName = 'name' in parsed ? parsed.name : 'unknown';\n if ('contentType' in parsed) {\n addtlData.contentType = parsed.contentType;\n }\n }\n }\n\n appendHarValue(har.postData?.params || [], name, val, addtlData);\n });\n }\n });\n }\n }\n } else {\n har.postData = { mimeType: contentType, text: '' };\n\n if (\n hasSchemaType(requestBody.schema, 'string') ||\n hasSchemaType(requestBody.schema, 'integer') ||\n hasSchemaType(requestBody.schema, 'number') ||\n hasSchemaType(requestBody.schema, 'boolean')\n ) {\n har.postData.text = JSON.stringify(JSON.parse(cleanBody));\n } else {\n /**\n * Handle formatted JSON objects that have properties that accept arbitrary JSON.\n *\n * Find all `{ type: string, format: json }` properties in the schema because we need\n * to manually `JSON.parse` them before submit, otherwise they'll be escaped instead\n * of actual objects. We also only want values that the user has entered, so we drop\n * any `undefined` `cleanBody` keys.\n */\n const jsonTypes = getTypedFormatsInSchema('json', requestBodySchema, operation.api, {\n payload: cleanBody,\n });\n\n if (Array.isArray(jsonTypes) && jsonTypes.length) {\n try {\n jsonTypes.forEach((prop: boolean | string) => {\n try {\n set(cleanBody, String(prop), JSON.parse(get(cleanBody, String(prop))));\n } catch {\n // leave the prop as a string value\n }\n });\n\n // `RAW_BODY` is a ReadMe-specific thing where we'll interpret the entire payload\n // as a raw string. https://docs.readme.com/docs/raw-body-content\n if (typeof cleanBody.RAW_BODY !== 'undefined') {\n cleanBody = cleanBody.RAW_BODY;\n }\n\n har.postData.text = JSON.stringify(cleanBody);\n } catch {\n har.postData.text = stringify(formData.body);\n }\n } else {\n // If no `format: json` paths are found then we should recursively parse any string\n // values that are valid JSON so `format: json` is still resolved for our\n // `application/json` payload.\n try {\n const parsed: any = parseJSONStringsInBodyWithSchema(cleanBody, requestBodySchema, operation.api);\n if (typeof parsed?.RAW_BODY !== 'undefined') {\n har.postData.text = isPrimitive(parsed.RAW_BODY)\n ? String(parsed.RAW_BODY)\n : stringify(parsed.RAW_BODY as Record<string | 'RAW_BODY', unknown>);\n } else {\n har.postData.text = JSON.stringify(parsed);\n }\n } catch {\n har.postData.text = encodeBodyForHAR(formData.body);\n }\n }\n }\n }\n } catch {\n // If anything above fails for whatever reason, assume that whatever we had is invalid\n // JSON and just treat it as raw text.\n har.postData = { mimeType: contentType, text: stringify(formData.body) };\n }\n } else {\n har.postData = { mimeType: contentType, text: encodeBodyForHAR(formData.body) };\n }\n }\n }\n\n // Add a `content-type` header if there are any body values setup above or if there is a schema\n // defined, but only do so if we don't already have a `content-type` present as it's impossible\n // for a request to have multiple.\n if ((har.postData?.text || (requestBody?.schema && Object.keys(requestBody.schema).length)) && !hasContentType) {\n har.headers.push({\n name: 'content-type',\n value: contentType,\n });\n }\n\n const securityRequirements = operation.getSecurity();\n\n if (securityRequirements?.length) {\n // TODO pass these values through the formatter?\n securityRequirements.forEach(schemes => {\n Object.keys(schemes).forEach(security => {\n const securityValue = configureSecurity(apiDefinition, auth, security);\n if (!securityValue) {\n return;\n }\n\n // If this is an `authorization` header and we've already added one (maybe one was manually\n // specified), then we shouldn't add another.\n if (securityValue.value.name === 'authorization') {\n if (har[securityValue.type].find(v => v.name === securityValue.value.name)) {\n return;\n }\n }\n\n // If we've already added this **specific** security value then don't add it again.\n if (\n har[securityValue.type].find(\n v => v.name === securityValue.value.name && v.value === securityValue.value.value,\n )\n ) {\n return;\n }\n\n har[securityValue.type].push(securityValue.value);\n });\n });\n }\n\n // If we didn't end up filling the `postData` object then we don't need it.\n if (Object.keys(har.postData || {}).length === 0) {\n delete har.postData;\n }\n\n return {\n log: {\n entries: [\n {\n request: har,\n },\n ] as const,\n },\n };\n}\n","type Many<T> = T | readonly T[];\ntype PropertyName = number | string | symbol;\ntype PropertyPath = Many<PropertyName>;\n\n/**\n * A janky, poorly typed replacement for `lodash.get`.\n *\n * @see {@link https://youmightnotneed.com/lodash#get}\n */\nexport function get(object: unknown, path?: string): any {\n // If path is not defined or it has false value\n if (!path) return undefined;\n // Check if path is string or array. Regex : ensure that we do not have '.' and brackets.\n // Regex explained: https://regexr.com/58j0k\n const pathArray = String(path).match(/([^[.\\]])+/g);\n // Find value\n // @ts-expect-error idk man\n const result = pathArray?.reduce((prevObj, key) => prevObj?.[key], object);\n // If found value is undefined return default value; otherwise return the value\n return result;\n}\n\n/**\n * A janky, poorly typed replacement for `lodash.set`.\n *\n * @see {@link https://youmightnotneed.com/lodash#set}\n */\nexport function set<TResult>(object: object, path: PropertyPath, value: any): TResult {\n // Regex explained: https://regexr.com/58j0k\n const pathArray: PropertyPath | RegExpMatchArray | null = Array.isArray(path)\n ? path\n : String(path).match(/([^[.\\]])+/g);\n\n // @ts-expect-error idk man\n return pathArray?.reduce((acc, key, i) => {\n // @ts-expect-error idk man\n if (acc[key] === undefined) {\n // @ts-expect-error idk man\n acc[key] = {};\n }\n if (i === pathArray.length - 1) {\n // @ts-expect-error idk man\n acc[key] = value;\n }\n // @ts-expect-error idk man\n return acc[key];\n }, object);\n}\n","import type { ParameterObject, SchemaObject } from 'oas/types';\nimport type { StylizerConfig } from './style-serializer.js';\n\nimport { matchesMimeType } from 'oas/utils';\nimport qs from 'qs';\n\nimport { getParameterContentType } from '../utils.js';\nimport { stylize } from './style-serializer.js';\n\n// Certain styles don't support empty values.\nfunction shouldNotStyleEmptyValues(parameter: ParameterObject) {\n return ['simple', 'spaceDelimited', 'pipeDelimited', 'deepObject'].includes(parameter.style || '');\n}\n\nfunction shouldNotStyleReservedHeader(parameter: ParameterObject) {\n return ['accept', 'authorization', 'content-type'].includes(parameter.name.toLowerCase());\n}\n\n/**\n * Note: This isn't necessarily part of the spec. Behavior for the value 'undefined' is, well,\n * undefined. This code makes our system look better. If we wanted to be more accurate, we might\n * want to remove this, restore the un-fixed behavior for undefined and have our UI pass in empty\n * string instead of undefined.\n */\nfunction removeUndefinedForPath(value: any) {\n let finalValue = value;\n\n if (typeof finalValue === 'undefined') {\n return '';\n }\n\n if (Array.isArray(finalValue)) {\n finalValue = finalValue.filter(val => (val === undefined ? '' : val));\n\n if (finalValue.length === 0) {\n finalValue = '';\n }\n }\n\n if (typeof finalValue === 'object') {\n Object.keys(finalValue).forEach(key => {\n finalValue[key] = finalValue[key] === undefined ? '' : finalValue[key];\n });\n }\n\n return finalValue;\n}\n\nfunction stylizeValue(value: unknown, parameter: ParameterObject) {\n let finalValue = value;\n\n // Some styles don't work with empty values. We catch those there\n if (shouldNotStyleEmptyValues(parameter) && (typeof finalValue === 'undefined' || finalValue === '')) {\n // Paths need return an unstyled empty string instead of undefined so it's ignored in the final\n // path string.\n if (parameter.in === 'path') {\n return '';\n }\n\n // Everything but path should return undefined when unstyled so it's ignored in the final\n // parameter array.\n return undefined;\n }\n\n // Every style that adds their style to empty values should use emptystring for path parameters\n // instead of undefined to avoid the string `undefined`.\n if (parameter.in === 'path') {\n finalValue = removeUndefinedForPath(finalValue);\n }\n\n /**\n * Eventhough `accept`, `authorization`, and `content-type` headers can be defined as parameters,\n * they should be completely ignored when it comes to serialization.\n *\n * > If `in` is \"header\" and the `name` field is \"Accept\", \"Content-Type\" or \"Authorization\", the\n * > parameter definition SHALL be ignored.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#fixed-fields-10}\n */\n if (parameter.in === 'header' && shouldNotStyleReservedHeader(parameter)) {\n return value;\n }\n\n /**\n * If content is present, we should use the content type to format the value. We also ignore the style and explode settings.\n *\n * @see {@link https://swagger.io/docs/specification/v3_0/describing-parameters/#schema-vs-content}\n */\n if (parameter.content && (parameter.in === 'query' || parameter.in === 'header')) {\n const contentType = getParameterContentType(parameter);\n if (!contentType) {\n return undefined;\n }\n\n /**\n * @todo Handle other content types\n */\n let serialized: string;\n if (matchesMimeType.json(contentType)) {\n serialized = JSON.stringify(value);\n } else {\n serialized = String(value);\n }\n\n return parameter.in === 'query' ? encodeURIComponent(serialized) : serialized;\n }\n\n /**\n * All parameter types have a default `style` format so if they don't have one prescribed we\n * should still conform to what the spec defines.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-parameterstyle}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#user-content-parameterstyle}\n */\n let style = parameter.style;\n if (!style) {\n if (parameter.in === 'query') {\n style = 'form';\n } else if (parameter.in === 'path') {\n style = 'simple';\n } else if (parameter.in === 'header') {\n style = 'simple';\n } else if (parameter.in === 'cookie') {\n style = 'form';\n }\n }\n\n let explode = parameter.explode;\n if (explode === undefined && style === 'form') {\n /**\n * Per the spec if no `explode` is present but `style` is `form` then `explode` should default to `true`.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-parameterexplode}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#user-content-parameterexplode}\n */\n explode = true;\n }\n\n return stylize({\n location: parameter.in as StylizerConfig['location'],\n value: finalValue,\n key: parameter.name,\n style: style as StylizerConfig['style'],\n explode,\n /**\n * @todo this parameter is optional to stylize. It defaults to false, and can accept falsy, truthy, or \"unsafe\".\n * I do not know if it is correct for query to use this. See style-serializer for more info\n */\n escape: true,\n ...(parameter.in === 'query' ? { isAllowedReserved: parameter.allowReserved || false } : {}),\n });\n}\n\nfunction handleDeepObject(value: any, parameter: ParameterObject) {\n return qs\n .stringify(value, {\n encoder(str, defaultEncoder, charset, type) {\n if (type === 'key') {\n // `str` will be here as `dog[treats][0]` but because the `qs` library doesn't have any\n // awareness of our OpenAPI parameters we need to rewrite it to slap the `parameter.name`\n // to the top, like `pets[dog][treats][0]`.\n const prefixedKey = str\n .split(/[[\\]]/g)\n .filter(Boolean)\n .map((k: string) => `[${k}]`)\n .join('');\n\n return `${parameter.name}${prefixedKey}`;\n } else if (type === 'value') {\n return stylizeValue(str, parameter);\n }\n },\n })\n .split('&')\n .map(item => {\n const split = item.split('=');\n return {\n label: split[0],\n // `qs` will coerce null values into being `undefined` string but we want to preserve them.\n value: split[1] === 'undefined' ? null : split[1],\n };\n });\n}\n\n// Explode is handled on its own, because style-serializer doesn't return what we expect for proper\n// HAR output.\nfunction handleExplode(value: any, parameter: ParameterObject) {\n // This is to handle the case of arrays of objects in the querystring\n // which is something that's not technically in the spec but since we're\n // using the `qs` module already, it's fairly easy for us to add support\n // for this use case.\n //\n // An example URL would be something like this:\n // https://example.com/?line_items[0][a_string]=abc&line_items[0][quantity]=1&line_items[1][a_string]=def&line_items[1][quantity]=2\n //\n // Some open issues discussing this here:\n // https://github.com/OAI/OpenAPI-Specification/issues/1706\n // https://github.com/OAI/OpenAPI-Specification/issues/1006\n //\n // Link to the spec for this:\n // https://github.com/OAI/OpenAPI-Specification/blob/36a3a67264cc1c4f1eff110cea3ebfe679435108/versions/3.1.0.md#style-examples\n if (\n Array.isArray(value) &&\n (parameter.schema as SchemaObject)?.type === 'array' &&\n parameter.style === 'deepObject'\n ) {\n const newObj: Record<string, unknown> = {};\n const deepObjs = handleDeepObject(value, parameter);\n deepObjs.forEach(obj => {\n newObj[obj.label] = obj.value;\n });\n return newObj;\n }\n\n if (Array.isArray(value)) {\n return value.map(val => {\n return stylizeValue(val, parameter);\n });\n }\n\n if (typeof value === 'object' && value !== null) {\n const newObj: Record<string, unknown> = {};\n\n Object.keys(value).forEach(key => {\n if (parameter.style === 'deepObject') {\n const deepObjs = handleDeepObject(value, parameter);\n deepObjs.forEach(obj => {\n newObj[obj.label] = obj.value;\n });\n } else {\n newObj[key] = stylizeValue(value[key], parameter);\n }\n });\n\n return newObj;\n }\n\n return stylizeValue(value, parameter);\n}\n\nfunction shouldExplode(parameter: ParameterObject) {\n return (\n (parameter.explode ||\n (parameter.explode !== false && parameter.style === 'form') ||\n // style: deepObject && explode: false doesn't exist so explode it always\n // https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples\n parameter.style === 'deepObject') &&\n // header and path doesn't explode into separate parameters like query and cookie do\n parameter.in !== 'header' &&\n parameter.in !== 'path' &&\n !parameter.content\n );\n}\n\nexport function formatStyle(value: unknown, parameter: ParameterObject): any {\n // Deep object style only works on objects and arrays, and only works with explode=true.\n if (\n !parameter.content &&\n parameter.style === 'deepObject' &&\n (!value || typeof value !== 'object' || parameter.explode === false)\n ) {\n return undefined;\n }\n\n // This custom explode logic allows us to bubble up arrays and objects to be handled differently\n // by our HAR transformer. We need this because the `stylizeValue` function assumes we're building\n // strings, not richer data types.\n //\n // The first part of this conditional checks if `explode` is enabled. Explode is disabled for\n // everything by default except for forms.\n //\n // The second part of this conditional bypasses the custom explode logic for headers, because they\n // work differently, and `stylizeValue` is accurate.\n if (shouldExplode(parameter)) {\n return handleExplode(value, parameter);\n }\n\n return stylizeValue(value, parameter);\n}\n","import type { OASDocument, ParameterObject, SchemaObject } from 'oas/types';\n\nimport { isRef } from 'oas/types';\nimport { dereferenceRef, getParameterContentType as getParameterContentTypeUtil } from 'oas/utils';\n\nimport { get } from './lodash.js';\n\n/**\n * Determine if a schema `type` is, or contains, a specific discriminator.\n *\n */\nexport function hasSchemaType(\n schema: SchemaObject,\n discriminator: 'array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string',\n): boolean {\n if (Array.isArray(schema.type)) {\n return schema.type.includes(discriminator);\n }\n\n return schema.type === discriminator;\n}\n\n/**\n * Because some request body schema shapes might not always be a top-level `properties`, instead\n * nesting it in an `oneOf` or `anyOf` we need to extract the first usable schema that we have. If\n * we don't do this then these non-conventional request body schema payloads may not be properly\n * represented in the HAR that we generate.\n *\n */\nexport function getSafeRequestBody(obj: any): any {\n if ('oneOf' in obj) {\n return getSafeRequestBody(obj.oneOf[0]);\n } else if ('anyOf' in obj) {\n return getSafeRequestBody(obj.anyOf[0]);\n }\n\n return obj;\n}\n\ninterface Options {\n parentIsArray?: boolean;\n parentKey?: string;\n payload: unknown;\n}\n\ninterface SubschemaEntry {\n key: string;\n schema: SchemaObject;\n parentIsArray?: boolean;\n}\n\nfunction getSubschemas(\n schema: SchemaObject,\n api: OASDocument,\n opts: Options,\n seenRefs: Set<string> = new Set(),\n): SubschemaEntry[] | false {\n let subSchemaDataSize = 0;\n if (opts.parentIsArray) {\n // If we don't have data for this parent schema in our body payload then we\n // shouldn't bother spidering further into the schema looking for more `format`s\n // for data that definitely doesn't exist.\n const parentData = get(opts.payload, opts.parentKey || '');\n if (parentData === undefined || !Array.isArray(parentData)) {\n return false;\n }\n\n subSchemaDataSize = parentData.length;\n }\n\n let subschemas: SubschemaEntry[] = [];\n if (subSchemaDataSize > 0) {\n for (let idx = 0; idx < subSchemaDataSize; idx += 1) {\n const foundSubschemas = getSubschemas(\n schema,\n api,\n {\n ...opts,\n parentIsArray: false,\n parentKey: opts.parentKey ? [opts.parentKey, idx].join('.') : String(idx),\n },\n seenRefs,\n );\n\n if (foundSubschemas) {\n subschemas = subschemas.concat(foundSubschemas);\n }\n }\n } else {\n let resolvedSchema = schema;\n if (schema && isRef(schema)) {\n // Skip $refs we've already visited to prevent infinite recursion on circular references\n if (seenRefs.has(schema.$ref)) {\n return subschemas;\n }\n seenRefs.add(schema.$ref);\n\n resolvedSchema = dereferenceRef(schema, api);\n if (!resolvedSchema || isRef(resolvedSchema)) {\n return subschemas;\n }\n }\n\n const baseKey = opts.parentKey ?? '';\n\n // Collect subschemas from this objects `properties`, dereferencing `$ref` pointers and\n // building up a collection of dot-notation keys for each schema.\n if (resolvedSchema.properties && typeof resolvedSchema.properties === 'object') {\n for (const [propName, propSchema] of Object.entries(resolvedSchema.properties)) {\n if (propSchema && typeof propSchema === 'object') {\n let resolved: SchemaObject | undefined;\n if (isRef(propSchema)) {\n if (seenRefs.has(propSchema.$ref)) {\n continue;\n }\n seenRefs.add(propSchema.$ref);\n resolved = dereferenceRef(propSchema, api);\n } else {\n resolved = propSchema;\n }\n\n if (resolved && !isRef(resolved)) {\n subschemas.push({\n key: baseKey ? [baseKey, propName].join('.') : propName,\n schema: resolved,\n });\n }\n }\n }\n }\n\n // When the schema has no formal `properties` we need to enumerate through each of its available\n // property keys, collecting subschemas and dot-notation keysfrom each value. Generally we'll\n // hit this block when processing data like OpenAPI Media Type objects.\n if (\n !('properties' in resolvedSchema) &&\n typeof resolvedSchema === 'object' &&\n !('type' in resolvedSchema && resolvedSchema.type !== 'object')\n ) {\n for (const [propName, propSchema] of Object.entries(resolvedSchema)) {\n if (propSchema && (Array.isArray(propSchema) || (typeof propSchema === 'object' && propSchema !== null))) {\n const raw = getSafeRequestBody(propSchema);\n const resolved = isRef(raw) ? dereferenceRef(raw, api) : raw;\n const toPush = resolved && !isRef(resolved) ? resolved : raw;\n if (toPush && typeof toPush === 'object') {\n subschemas.push({\n key: baseKey ? [baseKey, propName].join('.') : propName,\n schema: toPush,\n });\n }\n }\n }\n }\n\n if ('items' in resolvedSchema && resolvedSchema.items !== undefined && resolvedSchema.items !== true) {\n const itemsSchema = resolvedSchema.items as SchemaObject;\n let resolved: SchemaObject | undefined;\n if (isRef(itemsSchema)) {\n if (!seenRefs.has(itemsSchema.$ref)) {\n seenRefs.add(itemsSchema.$ref);\n resolved = dereferenceRef(itemsSchema, api);\n }\n } else {\n resolved = itemsSchema;\n }\n\n if (resolved && !isRef(resolved)) {\n subschemas.push({\n key: baseKey,\n schema: resolved,\n parentIsArray: true,\n });\n }\n }\n }\n\n return subschemas;\n}\n\n/**\n * With a supplied JSON Schema object, spider through it for any schemas that may contain specific\n * kind of `format` that also happen to be within the current `requestBody` payload that we're\n * creating a HAR representation for.\n *\n */\nexport function getTypedFormatsInSchema(\n format: 'binary' | 'json',\n schema: SchemaObject,\n api: OASDocument,\n opts: Options,\n seenRefs: Set<string> = new Set(),\n): (boolean | string)[] | boolean | string {\n try {\n if (schema?.format === format) {\n if (opts.parentIsArray) {\n const parentData = get(opts.payload, opts.parentKey || '');\n if (parentData !== undefined && Array.isArray(parentData)) {\n return Object.keys(parentData)\n .map(pdk => {\n const currentKey = [opts.parentKey, pdk].join('.');\n if (get(opts.payload, currentKey) !== undefined) {\n return currentKey;\n }\n\n return false;\n })\n .filter(Boolean);\n }\n } else if (opts.parentKey && get(opts.payload, opts.parentKey) !== undefined) {\n return opts.parentKey;\n } else if (!opts.parentKey && opts.payload !== undefined) {\n // If this payload is present and we're looking for a specific format then we should assume\n // that the **root** schema of the request body is that format, and we aren't trafficking in\n // a nested object or array schema.\n return true;\n }\n\n return false;\n }\n\n const subschemas = getSubschemas(schema, api, opts, seenRefs);\n if (!subschemas) {\n return false;\n }\n\n return subschemas\n .flatMap(({ key, schema: subschema, parentIsArray: entryIsArray }) => {\n if (isRef(subschema)) {\n const resolved = dereferenceRef(subschema, api);\n if (resolved && !isRef(resolved)) {\n return resolved;\n }\n\n return false;\n }\n\n return getTypedFormatsInSchema(\n format,\n subschema,\n api,\n {\n payload: opts.payload,\n parentKey: key,\n parentIsArray: entryIsArray,\n },\n seenRefs,\n );\n })\n .filter(Boolean);\n } catch {\n // If this fails for whatever reason then we should act as if we didn't find any `format`'d\n // schemas.\n return [];\n }\n}\n\n/**\n * Extract content type from a parameter's `content` field.\n * According to OAS spec, when `content` is present, `style` and `explode` are ignored.\n * We prioritize `application/json` and other JSON-like content types over other content types.\n * Note: this is just a safe guard. In OAS parser, we enforce that there is exactly one content type.\n *\n * @param param - The parameter object\n * @returns The content type, or `null` if no content is present\n */\nexport function getParameterContentType(param: ParameterObject): string | null {\n if (!('content' in param) || typeof param.content !== 'object' || !param.content) {\n return null;\n }\n\n const contentKeys = Object.keys(param.content);\n if (contentKeys.length < 1) {\n return null;\n }\n\n return getParameterContentTypeUtil(contentKeys) || null;\n}\n\n/**\n * Extract schema from a parameter's `content` field.\n *\n * @param param - The parameter object\n * @param contentType - The content type\n * @returns The schema, or `null` if no schema is present\n */\nexport function getParameterContentSchema(param: ParameterObject, contentType: string): SchemaObject | null {\n if (!('content' in param) || typeof param.content !== 'object' || !param.content) {\n return null;\n }\n\n const mediaTypeObject = param.content[contentType];\n if (typeof mediaTypeObject === 'object' && mediaTypeObject && 'schema' in mediaTypeObject && mediaTypeObject.schema) {\n return isRef(mediaTypeObject.schema) ? null : (mediaTypeObject.schema as SchemaObject);\n }\n\n return null;\n}\n\n/**\n * Recursively parse string values that are valid JSON.\n *\n * This is used when we're dealing with objects that have nested `format: json` descriptors.\n */\nexport function parseJSONStrings(obj: unknown): unknown {\n if (typeof obj === 'string') {\n try {\n const p = JSON.parse(obj);\n return typeof p === 'object' && p !== null ? parseJSONStrings(p) : p;\n } catch {\n return obj;\n }\n }\n\n if (Array.isArray(obj)) {\n return obj.map(parseJSONStrings);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = parseJSONStrings(v);\n }\n\n return out;\n }\n\n return obj;\n}\n\n/**\n * Recursively runs through a schema, parsing any values that have `format: json` attached and\n * deserializing them into their JSON representations.\n *\n * @see {@link parseJSONStrings}\n */\nexport function parseJSONStringsInBodyWithSchema(\n obj: unknown,\n schema: SchemaObject | undefined,\n api: OASDocument,\n seenRefs: Set<string> = new Set(),\n): unknown {\n // If there's no schema then we should parse any strings that look like JSON.\n if (schema === undefined) return parseJSONStrings(obj);\n\n let resolved: SchemaObject = schema;\n if (isRef(schema)) {\n // If we have already processed this `$ref` before then we should stop all schema-guiding\n // parsing behaviors so we don't infinitely recurse.\n if (seenRefs.has(schema.$ref)) {\n return parseJSONStrings(obj);\n }\n\n seenRefs.add(schema.$ref);\n const deref = dereferenceRef(schema, api);\n if (!deref || isRef(deref)) {\n return parseJSONStrings(obj);\n }\n\n resolved = deref;\n }\n\n // If our resovled schema is a polymorphic `oneOf` or `anyOf` schema then we should use the first\n // branch of the schema to guide our parsing behavior. If the schema is _not_ polymorphic then\n // we'll use that schema as-is.\n const safe = getSafeRequestBody(resolved);\n if (isRef(safe)) {\n return parseJSONStringsInBodyWithSchema(obj, safe, api, seenRefs);\n }\n\n resolved = safe;\n\n if (typeof obj === 'string') {\n // If the schema is a string but does **not** have `format: json` then it should be left alone.\n if (hasSchemaType(resolved, 'string') && resolved.format !== 'json') {\n return obj;\n }\n\n return parseJSONStrings(obj);\n }\n\n if (Array.isArray(obj)) {\n // @ts-expect-error -- `items` exists in schema objects, just the typing on `SchemaObject` is very messy.\n let items = resolved.items as SchemaObject | undefined;\n if (items && typeof items === 'object' && isRef(items)) {\n // If we've already processed this `$ref` before then we should stop all schema-guided\n // parsing behaviors so we don't infinitely recurse, instead treating what we have as it is\n // and parsing anything that looks like JSON.\n if (seenRefs.has(items.$ref)) {\n return obj.map(item => parseJSONStrings(item));\n }\n\n seenRefs.add(items.$ref);\n const derefItems = dereferenceRef(items, api);\n items = derefItems && !isRef(derefItems) ? derefItems : undefined;\n }\n\n return obj.map(item => parseJSONStringsInBodyWithSchema(item, items, api, new Set(seenRefs)));\n }\n\n if (obj !== null && typeof obj === 'object') {\n // If we have an object schema that doesn't have any `properties` then we should just parse\n // anything that looks like JSON within whatever we _do_ have here.\n if (!resolved.properties || typeof resolved.properties !== 'object') {\n return parseJSONStrings(obj);\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const propSchema = resolved.properties[k] as SchemaObject | undefined;\n out[k] = parseJSONStringsInBodyWithSchema(v, propSchema, api, new Set(seenRefs));\n }\n\n return out;\n }\n\n return obj;\n}\n","/**\n * This file has been extracted and modified from `swagger-client`.\n *\n * @license Apache 2.0\n * @link https://npm.im/swagger-client\n * @link https://github.com/swagger-api/swagger-js/blob/master/src/execute/oas3/style-serializer.js\n */\n\nconst isRfc3986Reserved = (char: string) => \":/?#[]@!$&'()*+,;=\".indexOf(char) > -1;\nconst isRfc3986Unreserved = (char: string) => /^[a-z0-9\\-._~]+$/i.test(char);\n\nfunction isURIEncoded(value: string) {\n try {\n return decodeURIComponent(value) !== value;\n } catch {\n // `decodeURIComponent` will throw an exception if a string that has an un-encoded percent sign\n // in it (like 20%), o if it's throwing we can just assume that the value hasn't been encoded.\n return false;\n }\n}\n\nfunction isObject(value: unknown) {\n return typeof value === 'object' && value !== null;\n}\n\nfunction encodeDisallowedCharacters(\n str: string,\n {\n escape,\n returnIfEncoded = false,\n isAllowedReserved,\n }: {\n escape?: boolean | 'unsafe';\n isAllowedReserved?: boolean;\n returnIfEncoded?: boolean;\n } = {},\n parse?: boolean,\n): any {\n if (typeof str === 'number') {\n // biome-ignore lint/style/noParameterAssign: It is what it is.\n str = (str as number).toString();\n }\n\n if (returnIfEncoded) {\n if (isURIEncoded(str)) {\n return str;\n }\n }\n\n if (typeof str !== 'string' || !str.length) {\n return str;\n }\n\n if (!escape) {\n return str;\n }\n\n if (parse) {\n return JSON.parse(str);\n }\n\n // In ES6 you can do this quite easily by using the new ... spread operator. This causes the\n // string iterator (another new ES6 feature) to be used internally, and because that iterator is\n // designed to deal with code points rather than UCS-2/UTF-16 code units.\n return [...str]\n .map(char => {\n if (isRfc3986Unreserved(char)) {\n return char;\n }\n\n if (isRfc3986Reserved(char) && (escape === 'unsafe' || isAllowedReserved)) {\n return char;\n }\n\n const encoder = new TextEncoder();\n const encoded = Array.from(encoder.encode(char))\n .map(byte => `0${byte.toString(16).toUpperCase()}`.slice(-2))\n .map(encodedByte => `%${encodedByte}`)\n .join('');\n\n return encoded;\n })\n .join('');\n}\n\nexport interface StylizerConfig {\n escape: boolean | 'unsafe';\n explode?: boolean;\n isAllowedReserved?: boolean;\n key: string;\n location: 'body' | 'query';\n style: 'deepObject' | 'form' | 'label' | 'matrix' | 'pipeDelimited' | 'simple' | 'spaceDelimited';\n value: any;\n}\n\nexport function stylize(config: StylizerConfig): any {\n const { value } = config;\n\n if (Array.isArray(value)) {\n return encodeArray(config);\n }\n\n if (isObject(value)) {\n return encodeObject(config);\n }\n\n return encodePrimitive(config);\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodeArray({\n location,\n key,\n value,\n style,\n explode,\n escape,\n isAllowedReserved = false,\n}: Omit<StylizerConfig, 'value'> & { value: string[] }) {\n const valueEncoder = (str: string) => {\n // Handle null values explicitly to prevent join() from converting to empty string\n if (str === null) {\n return 'null';\n }\n\n const result = encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query',\n isAllowedReserved,\n });\n\n return result;\n };\n\n switch (style) {\n /**\n * @example <caption>`style: simple`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue,black,brown`\n */\n case 'simple':\n return value.map(val => valueEncoder(val)).join(',');\n\n /**\n * @example <caption>`style: label`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `.blue.black.brown`\n */\n case 'label':\n return `.${value.map(val => valueEncoder(val)).join('.')}`;\n\n /**\n * @example <caption>`style: matrix` + `explode: true`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `;color=blue;color=black;color=brown`\n *\n * @example <caption>`style: matrix` + `explode: false` (the default behavior)</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `;color=blue,black,brown\t`\n */\n case 'matrix':\n return value\n .map(val => valueEncoder(val))\n .reduce((prev, curr) => {\n if (!prev || explode) {\n return `${prev || ''};${key}=${curr}`;\n }\n return `${prev},${curr}`;\n }, '');\n\n /**\n * @example <caption>`style: form` + `explode: true`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `color=blue&color=black&color=brown`\n *\n * @example <caption>`style: form` + `explode: false` (the default behavior)</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `color=blue,black,brown`\n */\n case 'form':\n return value.map(val => valueEncoder(val)).join(explode ? `&${key}=` : ',');\n\n /**\n * @example <caption>`style: spaceDelimited`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue%20black%20brown`\n */\n case 'spaceDelimited':\n return value.map(val => valueEncoder(val)).join(` ${explode ? `${key}=` : ''}`);\n\n /**\n * @example <caption>`style: pipeDelimited`</caption>\n * `[\"blue\",\"black\",\"brown\"]` → `blue|black|brown`\n */\n case 'pipeDelimited':\n return value.map(val => valueEncoder(val)).join(`|${explode ? `${key}=` : ''}`);\n\n default:\n return undefined;\n }\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodeObject({ location, key, value, style, explode, escape, isAllowedReserved = false }: StylizerConfig) {\n const valueEncoder = (str: string) =>\n encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query',\n isAllowedReserved,\n });\n\n const valueKeys = Object.keys(value);\n\n switch (style) {\n /**\n * @example <caption>`style: simple` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R=100,G=200,B=150`\n *\n * @example <caption>`style: simple` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R,100,G,200,B,150`\n */\n case 'simple':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const middleChar = explode ? '=' : ',';\n const prefix = prev ? `${prev},` : '';\n\n return `${prefix}${curr}${middleChar}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: label` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `.R=100.G=200.B=150`\n *\n * @example <caption>`style: label` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `.R.100.G.200.B.150`\n */\n case 'label':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const middleChar = explode ? '=' : '.';\n const prefix = prev ? `${prev}.` : '.';\n\n return `${prefix}${curr}${middleChar}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: matrix` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `;R=100;G=200;B=150`\n *\n * @example <caption>`style: matrix` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `;color=R,100,G,200,B,150`\n */\n case 'matrix':\n if (explode) {\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev};` : ';';\n\n return `${prefix}${curr}=${val}`;\n }, '');\n }\n\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev},` : `;${key}=`;\n\n return `${prefix}${curr},${val}`;\n }, '');\n\n /**\n * @example <caption>`style: form` + `explode: true`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R=100&G=200&B=150`\n *\n * @example <caption>`style: form` + `explode: false` (the default behavior)</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `color=R,100,G,200,B,150`\n */\n case 'form':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev}${explode ? '&' : ','}` : '';\n const separator = explode ? '=' : ',';\n\n return `${prefix}${curr}${separator}${val}`;\n }, '');\n\n /**\n * @example <caption>`style: spaceDelimited`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R%20100%20G%20200%20B%20150`\n */\n case 'spaceDelimited':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev} ` : '';\n\n return `${prefix}${curr} ${val}`;\n }, '');\n\n /**\n * @example <caption>`style: pipeDelimited`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `R|100|G|200|B|150`\n */\n case 'pipeDelimited':\n return valueKeys.reduce((prev, curr) => {\n const val = valueEncoder(value[curr]);\n const prefix = prev ? `${prev}|` : '';\n\n return `${prefix}${curr}|${val}`;\n }, '');\n\n /**\n * @example <caption>`style: deepObject`</caption>\n * `{ \"R\": 100, \"G\": 200, \"B\": 150 }` → `color[R]=100&color[G]=200&color[B]=150`\n */\n case 'deepObject':\n return valueKeys.reduce(curr => {\n const val = valueEncoder(value[curr]);\n return `${val}`;\n }, '');\n\n default:\n return undefined;\n }\n}\n\n/**\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-examples}\n */\nfunction encodePrimitive({ location, key, value, style, escape, isAllowedReserved = false }: StylizerConfig) {\n const valueEncoder = (str: string) =>\n encodeDisallowedCharacters(str, {\n escape,\n returnIfEncoded: location === 'query' || location === 'body',\n isAllowedReserved,\n });\n\n switch (style) {\n /**\n * @example <caption>`style: simple`</caption>\n * `blue` → `blue`\n */\n case 'simple':\n return valueEncoder(value);\n\n /**\n * @example <caption>`style: label`</caption>\n * `blue` → `.blue`\n */\n case 'label':\n return `.${valueEncoder(value)}`;\n\n /**\n * @example <caption>`style: matrix`</caption>\n * `blue` → `;color=blue`\n */\n case 'matrix':\n if (value === '') {\n return `;${key}`;\n }\n\n return `;${key}=${valueEncoder(value)}`;\n\n /**\n * @example <caption>`style: form`</caption>\n * `blue` → `color=blue`\n */\n case 'form':\n return valueEncoder(value);\n\n /**\n * @example <caption>`style: deepObject`</caption>\n * `blue` → n/a\n */\n case 'deepObject':\n return valueEncoder(value);\n\n default:\n return undefined;\n }\n}\n"],"mappings":"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","names":["isRef","matchesMimeType","value","isRef","matchesMimeType"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@readme/oas-to-har",
|
|
3
3
|
"description": "Utility to transform an OAS operation into a HAR representation",
|
|
4
|
-
"version": "31.0.
|
|
4
|
+
"version": "31.0.14",
|
|
5
5
|
"author": "Jon Ursenbach <jon@ursenba.ch>",
|
|
6
6
|
"license": "ISC",
|
|
7
7
|
"sideEffects": false,
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@readme/data-urls": "^4.0.2",
|
|
52
|
-
"oas": "^32.1.
|
|
52
|
+
"oas": "^32.1.11",
|
|
53
53
|
"qs": "^6.12.0",
|
|
54
54
|
"remove-undefined-objects": "^7.0.0"
|
|
55
55
|
},
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"vitest": "^4.0.8"
|
|
64
64
|
},
|
|
65
65
|
"prettier": "@readme/standards/prettier",
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "c6614f66e1404b08f71ec510fa92bb150391b537"
|
|
67
67
|
}
|