@oaspect/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +14 -0
- package/dist/index.d.ts +358 -0
- package/dist/index.js +2585 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/refs.ts","../src/schema.ts","../src/example.ts","../src/model.ts","../src/request.ts","../src/multipart.ts","../src/snippets.ts","../src/i18n.ts","../src/markdown.ts","../src/highlight.ts","../src/security.ts","../src/convert.ts","../src/parse.ts","../src/external.ts"],"sourcesContent":["import type { OpenAPIObject } from \"./types\";\n\n// JSON Pointer helpers for local \"$ref\"s (\"#/components/schemas/Foo\").\n\nexport function resolvePointer(spec: OpenAPIObject, ref: unknown): any {\n if (typeof ref !== \"string\" || !ref.startsWith(\"#/\")) return undefined;\n\n return ref\n .slice(2)\n .split(\"/\")\n .map((part) => part.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n .reduce((node, key) => node?.[key], spec);\n}\n\nexport function refName(ref: string): string {\n return ref.split(\"/\").pop() ?? ref;\n}\n\n// Follows a (possibly chained) $ref and returns the target plus the last ref seen.\nexport function deref(spec: OpenAPIObject, node: any): { node: OpenAPIObject; ref?: string } {\n let ref: string | undefined;\n let hops = 0;\n\n while (node?.$ref && hops++ < 32) {\n ref = node.$ref;\n node = resolvePointer(spec, ref);\n }\n\n return { node: node ?? {}, ref };\n}\n","import { deref, refName } from \"./refs\";\nimport type { OpenAPIObject, ResolvedSchema, SchemaChildren } from \"./types\";\n\nfunction mergeInto(target: OpenAPIObject, source: OpenAPIObject) {\n for (const [key, value] of Object.entries(source)) {\n if (key === \"properties\") {\n target.properties = { ...target.properties, ...value };\n } else if (key === \"required\") {\n target.required = [...new Set([...(target.required ?? []), ...value])];\n } else {\n target[key] = value;\n }\n }\n}\n\n// Resolves $ref and flattens allOf so the renderer only deals with plain\n// schemas. `name` is the component name when the schema came from a $ref,\n// including the common `{ allOf: [{ $ref }], nullable: true }` wrapper.\nexport function resolveSchema(spec: OpenAPIObject, input: unknown): ResolvedSchema {\n const { node, ref } = deref(spec, input);\n let schema = node;\n let name = ref ? refName(ref) : undefined;\n\n if (Array.isArray(schema.allOf)) {\n const { allOf, ...rest } = schema;\n const merged: OpenAPIObject = {};\n\n for (const part of allOf) {\n mergeInto(merged, resolveSchema(spec, part).schema);\n }\n mergeInto(merged, rest);\n\n if (!name && allOf.length === 1 && allOf[0].$ref) {\n name = refName(allOf[0].$ref);\n }\n schema = merged;\n }\n\n return { schema, name };\n}\n\nexport function inferType(schema: OpenAPIObject): string {\n if (schema.type) return Array.isArray(schema.type) ? schema.type.join(\" | \") : schema.type;\n if (schema.properties || schema.additionalProperties) return \"object\";\n if (schema.items) return \"array\";\n if (schema.oneOf) return \"oneOf\";\n if (schema.anyOf) return \"anyOf\";\n return \"any\";\n}\n\n// Short, human readable type such as \"string<email>\" or \"array<DummyEntity>\".\nexport function typeLabel(spec: OpenAPIObject, schema: OpenAPIObject, name?: string): string {\n const type = inferType(schema);\n\n if (type === \"array\" && schema.items) {\n const item = resolveSchema(spec, schema.items);\n return `array<${item.name ?? typeLabel(spec, item.schema)}>`;\n }\n if (type === \"object\" && name) return name;\n if (schema.format) return `${type}<${schema.format}>`;\n return type;\n}\n\nexport function constraintsOf(schema: OpenAPIObject): string[] {\n const list: string[] = [];\n const add = (label: string, value: unknown) => value !== undefined && list.push(`${label} ${value}`);\n\n add(\"min length\", schema.minLength);\n add(\"max length\", schema.maxLength);\n add(schema.exclusiveMinimum === true ? \">\" : \"≥\", schema.minimum);\n add(schema.exclusiveMaximum === true ? \"<\" : \"≤\", schema.maximum);\n // OpenAPI 3.1 uses numeric exclusive bounds.\n if (typeof schema.exclusiveMinimum === \"number\") add(\">\", schema.exclusiveMinimum);\n if (typeof schema.exclusiveMaximum === \"number\") add(\"<\", schema.exclusiveMaximum);\n add(\"multiple of\", schema.multipleOf);\n add(\"min items\", schema.minItems);\n add(\"max items\", schema.maxItems);\n if (schema.uniqueItems) list.push(\"unique items\");\n\n return list;\n}\n\n// Returns child fields to render under a schema, or null when it is a leaf.\nexport function childrenOf(spec: OpenAPIObject, schema: OpenAPIObject): SchemaChildren {\n const type = inferType(schema);\n\n if (type === \"array\" && schema.items) {\n const item = resolveSchema(spec, schema.items);\n return childrenOf(spec, item.schema) ? { kind: \"items\", ...item } : null;\n }\n if (schema.oneOf || schema.anyOf) {\n const variants = (schema.oneOf ?? schema.anyOf).map((variant) => resolveSchema(spec, variant));\n return { kind: schema.oneOf ? \"oneOf\" : \"anyOf\", variants };\n }\n if (schema.properties && Object.keys(schema.properties).length > 0) {\n return { kind: \"properties\" };\n }\n if (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n const value = resolveSchema(spec, schema.additionalProperties);\n return childrenOf(spec, value.schema) ? { kind: \"map\", ...value } : null;\n }\n return null;\n}\n","import { deref } from \"./refs\";\nimport { inferType, resolveSchema } from \"./schema\";\nimport type { OpenAPIObject } from \"./types\";\n\nconst STRING_FORMATS: Record<string, string> = {\n \"date-time\": \"2026-01-01T09:00:00Z\",\n date: \"2026-01-01\",\n time: \"09:00:00\",\n email: \"user@example.com\",\n uri: \"https://example.com\",\n url: \"https://example.com\",\n uuid: \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n ipv4: \"192.168.0.1\",\n ipv6: \"::1\",\n password: \"********\",\n byte: \"U3dhZ2dlcg==\",\n};\n\n// Builds a representative value from a schema. Explicit example/default/enum\n// values win; otherwise a placeholder is generated per type.\nexport function exampleFromSchema(spec: OpenAPIObject, input: unknown, seen: Set<string> = new Set(), depth = 0): any {\n if (!input || depth > 8) return undefined;\n\n const { schema, name } = resolveSchema(spec, input);\n if (name && seen.has(name)) return {};\n const nextSeen = name ? new Set(seen).add(name) : seen;\n\n if (schema.example !== undefined) return schema.example;\n if (Array.isArray(schema.examples) && schema.examples.length) return schema.examples[0];\n if (schema.default !== undefined) return schema.default;\n if (Array.isArray(schema.enum) && schema.enum.length) return schema.enum[0];\n if (schema.const !== undefined) return schema.const;\n\n const variants = schema.oneOf ?? schema.anyOf;\n if (variants?.length) return exampleFromSchema(spec, variants[0], nextSeen, depth + 1);\n\n switch (inferType(schema)) {\n case \"object\": {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema.properties ?? {})) {\n if (resolveSchema(spec, value).schema.writeOnly) continue;\n result[key] = exampleFromSchema(spec, value, nextSeen, depth + 1);\n }\n if (!schema.properties && typeof schema.additionalProperties === \"object\") {\n result.key = exampleFromSchema(spec, schema.additionalProperties, nextSeen, depth + 1);\n }\n return result;\n }\n case \"array\":\n return schema.items ? [exampleFromSchema(spec, schema.items, nextSeen, depth + 1)] : [];\n case \"integer\":\n return schema.minimum ?? 0;\n case \"number\":\n return schema.minimum ?? 0;\n case \"boolean\":\n return true;\n case \"string\":\n return STRING_FORMATS[schema.format] ?? \"string\";\n default:\n return null;\n }\n}\n\n// Picks the example for a media type object: `example`, the first entry of\n// `examples`, or one generated from its schema.\nexport function mediaExample(spec: OpenAPIObject, media: OpenAPIObject | undefined): any {\n if (!media) return undefined;\n if (media.example !== undefined) return media.example;\n\n const named = media.examples && Object.values(media.examples)[0];\n if (named) return deref(spec, named).node.value;\n\n return exampleFromSchema(spec, media.schema);\n}\n\n// Named examples of a media type, for the example switcher.\nexport function mediaExamples(spec: OpenAPIObject, media: OpenAPIObject | undefined): { key: string; summary: string; value: unknown }[] {\n if (!media?.examples) return [];\n\n return Object.entries(media.examples).map(([key, value]) => {\n const { node } = deref(spec, value);\n return { key, summary: node.summary ?? key, value: node.value };\n });\n}\n","import { deref } from \"./refs\";\nimport type { ApiModel, CallbackInfo, HttpMethod, LinkInfo, OpenAPIDocument, OpenAPIObject, Operation, ResponseInfo, ServerObject } from \"./types\";\n\nexport const HTTP_METHODS: HttpMethod[] = [\"get\", \"put\", \"post\", \"delete\", \"options\", \"head\", \"patch\", \"trace\"];\n\nexport function slugify(value: unknown): string {\n return String(value)\n .toLowerCase()\n .replace(/[{}]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport const tagAnchor = (name: string): string => `tag/${slugify(name)}`;\nexport const modelAnchor = (name: string): string => `model/${name}`;\n\nfunction operationAnchor(method: string, path: string, operationId?: string) {\n return `operation/${operationId ? slugify(operationId) : `${method}-${slugify(path)}`}`;\n}\n\n// Path-level parameters apply to every operation unless overridden by one\n// with the same name + location.\nfunction mergeParameters(spec: OpenAPIObject, pathParams: unknown[] = [], opParams: unknown[] = []) {\n const byKey = new Map<string, OpenAPIObject>();\n\n for (const raw of [...pathParams, ...opParams]) {\n const { node } = deref(spec, raw);\n if (node.name) byKey.set(`${node.in}:${node.name}`, node);\n }\n return [...byKey.values()];\n}\n\nfunction resolveLinks(spec: OpenAPIObject, links: OpenAPIObject = {}): LinkInfo[] {\n return Object.entries(links).map(([name, raw]) => {\n const { node } = deref(spec, raw);\n return {\n name,\n operationId: node.operationId,\n operationRef: node.operationRef,\n parameters: node.parameters ?? {},\n requestBody: node.requestBody,\n description: node.description ?? \"\",\n };\n });\n}\n\nfunction resolveResponses(spec: OpenAPIObject, responses: OpenAPIObject = {}): ResponseInfo[] {\n return Object.entries(responses).map(([status, raw]) => {\n const { node } = deref(spec, raw);\n return {\n status,\n description: node.description ?? \"\",\n \"x-i18n\": node[\"x-i18n\"],\n content: node.content ?? {},\n headers: Object.fromEntries(\n Object.entries(node.headers ?? {}).map(([key, value]) => [key, deref(spec, value).node]),\n ),\n links: resolveLinks(spec, node.links),\n };\n });\n}\n\n// One operation of a path item. Webhooks and callbacks use the same shape;\n// `kind` tells them apart and `anchorPrefix` keeps their anchors unique.\nfunction buildOperation(\n spec: OpenAPIDocument,\n method: HttpMethod,\n path: string,\n pathItem: OpenAPIObject,\n op: OpenAPIObject,\n kind: Operation[\"kind\"],\n anchorPrefix: string,\n): Operation {\n const requestBody = op.requestBody ? deref(spec, op.requestBody).node : null;\n const anchor = kind === \"operation\" ? operationAnchor(method, path, op.operationId) : `${anchorPrefix}/${slugify(op.operationId ?? `${path}-${method}`)}`;\n return {\n anchor,\n kind,\n method,\n path,\n summary: op.summary ?? \"\",\n description: op.description ?? \"\",\n \"x-i18n\": op[\"x-i18n\"],\n operationId: op.operationId,\n deprecated: Boolean(op.deprecated),\n tags: op.tags?.length ? op.tags : [\"Default\"],\n parameters: mergeParameters(spec, pathItem.parameters, op.parameters),\n requestBody,\n responses: resolveResponses(spec, op.responses),\n callbacks: kind === \"callback\" ? [] : resolveCallbacks(spec, op.callbacks, anchor),\n security: op.security ?? spec.security ?? [],\n servers: op.servers ?? pathItem.servers ?? spec.servers ?? [],\n };\n}\n\nfunction operationsOf(spec: OpenAPIDocument, path: string, item: unknown, kind: Operation[\"kind\"], anchorPrefix: string): Operation[] {\n const pathItem = deref(spec, item).node;\n return HTTP_METHODS.filter((method) => pathItem[method]).map((method) =>\n buildOperation(spec, method, path, pathItem, pathItem[method], kind, anchorPrefix),\n );\n}\n\n// callbacks: { name: { \"{$request.body#/callbackUrl}\": PathItem } }\nfunction resolveCallbacks(spec: OpenAPIDocument, callbacks: OpenAPIObject = {}, parentAnchor: string): CallbackInfo[] {\n return Object.entries(callbacks).map(([name, raw]) => {\n const { node } = deref(spec, raw);\n const operations = Object.entries(node)\n .filter(([expression]) => !expression.startsWith(\"x-\"))\n .flatMap(([expression, item]) => operationsOf(spec, expression, item, \"callback\", `${parentAnchor}/callback/${slugify(name)}`));\n return { name, operations };\n });\n}\n\n// Turns a raw OpenAPI 3.x document into the structure the UI renders:\n// tag groups with fully resolved operations, webhooks and component schemas.\nexport function buildModel(spec: OpenAPIDocument): ApiModel {\n const tagMeta = new Map<string, OpenAPIObject>((spec.tags ?? []).map((tag) => [tag.name, tag]));\n const groups = new Map<string, Operation[]>([...tagMeta.keys()].map((name) => [name, []]));\n const operations: Operation[] = [];\n\n for (const [path, item] of Object.entries(spec.paths ?? {})) {\n for (const operation of operationsOf(spec, path, item, \"operation\", \"operation\")) {\n operations.push(operation);\n for (const tag of operation.tags) {\n if (!groups.has(tag)) groups.set(tag, []);\n groups.get(tag)!.push(operation);\n }\n }\n }\n\n // OpenAPI 3.1 webhooks: { name: PathItem }; the name stands in for the path.\n const webhooks = Object.entries<OpenAPIObject>(spec.webhooks ?? {}).flatMap(([name, item]) =>\n operationsOf(spec, name, item, \"webhook\", `webhook/${slugify(name)}`),\n );\n\n const tags = [...groups.entries()]\n .filter(([, list]) => list.length > 0)\n .map(([name, list]) => ({\n name,\n anchor: tagAnchor(name),\n description: tagMeta.get(name)?.description ?? \"\",\n // Display name translations go under x-i18n.<locale>.name; `name`\n // stays the grouping key operations refer to.\n \"x-i18n\": tagMeta.get(name)?.[\"x-i18n\"],\n operations: list,\n }));\n\n const schemas = Object.entries<OpenAPIObject>(spec.components?.schemas ?? {}).map(([name, schema]) => ({\n name,\n anchor: modelAnchor(name),\n schema,\n }));\n\n return {\n openapi: spec.openapi ?? spec.swagger ?? \"\",\n info: spec.info ?? {},\n servers: spec.servers?.length ? spec.servers : [{ url: \"/\" }],\n securitySchemes: spec.components?.securitySchemes ?? {},\n tags,\n operations,\n webhooks,\n schemas,\n };\n}\n\n// Replaces {variables} in a server URL with chosen values, then defaults.\nexport function serverUrl(server: ServerObject, values: Record<string, string> = {}): string {\n return server.url.replace(/\\{([^}]+)\\}/g, (match, key: string) => values[key] || server.variables?.[key]?.default || match);\n}\n\n/** Finds the operation a link points to (operationId, or a local operationRef). */\nexport function linkTarget(model: ApiModel, link: LinkInfo): Operation | undefined {\n if (link.operationId) return model.operations.find((operation) => operation.operationId === link.operationId);\n const match = /^#\\/paths\\/([^/]+)\\/(\\w+)$/.exec(link.operationRef ?? \"\");\n if (!match) return undefined;\n const path = match[1].replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n return model.operations.find((operation) => operation.path === path && operation.method === match[2]);\n}\n","import { mediaExample, exampleFromSchema } from \"./example\";\nimport { serverUrl } from \"./model\";\nimport { resolveSchema } from \"./schema\";\nimport type { FormField, HttpRequest, OpenAPIObject, Operation, ParameterValues, ServerObject } from \"./types\";\n\nexport function jsonMediaType(content: Record<string, unknown> = {}): string | undefined {\n const types = Object.keys(content);\n return types.find((type) => /json/i.test(type)) ?? types[0];\n}\n\nexport function parameterExample(spec: OpenAPIObject, param: OpenAPIObject): any {\n if (param.example !== undefined) return param.example;\n const named = param.examples && Object.values(param.examples)[0];\n if (named?.value !== undefined) return named.value;\n return exampleFromSchema(spec, param.schema);\n}\n\n// Default form values for an operation: path params get examples so the URL\n// is valid; optional query/header params start empty.\nexport function defaultValues(spec: OpenAPIObject, operation: Operation): ParameterValues {\n const values: ParameterValues = { path: {}, query: {}, header: {}, cookie: {} };\n\n for (const param of operation.parameters) {\n const example = parameterExample(spec, param);\n const include = param.in === \"path\" || param.required;\n values[param.in] ??= {};\n values[param.in][param.name] = include && example !== undefined && example !== null ? String(example) : \"\";\n }\n return values;\n}\n\nexport interface DefaultBody {\n contentType: string | null;\n /** Text body for JSON and other text media types. */\n body: string;\n /** Parts for multipart/form-data. */\n form?: FormField[];\n}\n\nexport const isMultipart = (contentType?: string | null) => /^multipart\\/form-data/i.test(contentType ?? \"\");\n\nconst isBinary = (schema: OpenAPIObject) =>\n schema.type === \"string\" && (schema.format === \"binary\" || schema.format === \"base64\" || Boolean(schema.contentMediaType));\n\n/**\n * Parts for a multipart/form-data body from its schema: binary properties\n * become file parts, everything else a text part with an example value.\n */\nexport function defaultForm(spec: OpenAPIObject, media: OpenAPIObject | undefined): FormField[] {\n const { schema } = resolveSchema(spec, media?.schema ?? {});\n const example = mediaExample(spec, media) ?? {};\n const fields: FormField[] = [];\n\n for (const [name, raw] of Object.entries<OpenAPIObject>(schema.properties ?? {})) {\n const property = resolveSchema(spec, raw).schema;\n const items = property.type === \"array\" && property.items ? resolveSchema(spec, property.items).schema : null;\n if (isBinary(property) || (items && isBinary(items))) {\n fields.push({ name, file: { name: `${name}.bin`, type: media?.encoding?.[name]?.contentType } });\n continue;\n }\n const value = (example as Record<string, unknown>)[name];\n for (const entry of Array.isArray(value) ? value : [value]) {\n if (entry === undefined || entry === null) continue;\n fields.push({ name, value: typeof entry === \"object\" ? JSON.stringify(entry) : String(entry) });\n }\n }\n return fields;\n}\n\nexport function defaultBody(spec: OpenAPIObject, operation: Operation): DefaultBody {\n const content = operation.requestBody?.content;\n const type = jsonMediaType(content);\n if (!type) return { contentType: null, body: \"\" };\n\n if (isMultipart(type)) return { contentType: type, body: \"\", form: defaultForm(spec, content[type]) };\n\n const example = mediaExample(spec, content[type]);\n if (example === undefined) return { contentType: type, body: \"\" };\n return { contentType: type, body: /x-www-form-urlencoded/i.test(type) ? formEncode(example) : JSON.stringify(example, null, 2) };\n}\n\n// application/x-www-form-urlencoded body from an example object: arrays\n// repeat the key, nested objects are sent as JSON text.\nexport function formEncode(value: unknown): string {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\";\n const params = new URLSearchParams();\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n for (const entry of Array.isArray(item) ? item : [item]) {\n if (entry === undefined || entry === null) continue;\n params.append(key, typeof entry === \"object\" ? JSON.stringify(entry) : String(entry));\n }\n }\n return params.toString();\n}\n\n// Produces a concrete request description from form values.\nexport interface BuildRequestOptions {\n server?: ServerObject;\n values: Partial<ParameterValues>;\n body?: string;\n /** multipart/form-data parts; used instead of `body` when given. */\n form?: FormField[];\n contentType?: string | null;\n headers?: Record<string, string>;\n}\n\nexport function buildRequest(\n operation: Pick<Operation, \"method\" | \"path\">,\n { server, values, body, form, contentType, headers = {} }: BuildRequestOptions,\n): HttpRequest {\n const base = (server ? serverUrl(server) : \"\").replace(/\\/+$/, \"\");\n const path = operation.path.replace(/\\{([^}]+)\\}/g, (match, key) => {\n const value = values.path?.[key];\n return value ? encodeURIComponent(value) : match;\n });\n\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(values.query ?? {})) {\n if (value !== \"\") query.append(key, value);\n }\n const search = query.toString();\n\n const allHeaders: Record<string, string> = { ...headers };\n for (const [key, value] of Object.entries(values.header ?? {})) {\n if (value !== \"\") allHeaders[key] = value;\n }\n const cookies = Object.entries(values.cookie ?? {})\n .filter(([, value]) => value !== \"\")\n .map(([key, value]) => `${key}=${value}`)\n .join(\"; \");\n if (cookies) allHeaders.Cookie = cookies;\n\n const canHaveBody = ![\"get\", \"head\"].includes(operation.method);\n const multipart = canHaveBody && Boolean(form?.length) && isMultipart(contentType);\n const hasBody = !multipart && canHaveBody && Boolean(body);\n if (hasBody && contentType) allHeaders[\"Content-Type\"] = contentType;\n\n const request: HttpRequest = {\n method: operation.method.toUpperCase(),\n url: `${base}${path}${search ? `?${search.replace(/%5B/g, \"[\").replace(/%5D/g, \"]\")}` : \"\"}`,\n headers: allHeaders,\n body: hasBody ? body : undefined,\n };\n if (multipart) request.form = form;\n return request;\n}\n","// Code samples for multipart/form-data requests (HttpRequest.form). Each\n// client uses its own multipart API; clients without one get a note that\n// points to another client of the same language instead of wrong code.\n//\n// File parts read a local file named after the part (./photo.bin); in the\n// browser they come from an <input type=\"file\">.\n\nimport type { FormField, HttpRequest } from \"./types\";\n\nconst dq = (value: unknown) => JSON.stringify(String(value));\nconst sq = (value: unknown) => `'${String(value).replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")}'`;\nconst shellQuote = (value: unknown) => `'${String(value).replace(/'/g, \"'\\\\''\")}'`;\nconst psQuote = (value: unknown) => `'${String(value).replace(/'/g, \"''\")}'`;\nconst dartQuote = (value: unknown) => sq(value).replace(/\\$/g, \"\\\\$\");\nconst kotlinQuote = (value: unknown) => dq(value).replace(/\\$/g, \"\\\\$\");\nconst indent = (text: string, prefix: string) => text.split(\"\\n\").join(`\\n${prefix}`);\nconst capitalize = (method: string) => method.charAt(0) + method.slice(1).toLowerCase();\nconst path = (field: FormField) => `./${field.file!.name}`;\nconst fileType = (field: FormField) => field.file!.type ?? \"application/octet-stream\";\nconst files = (form: FormField[]) => form.filter((field) => field.file);\nconst texts = (form: FormField[]) => form.filter((field) => !field.file);\nconst headerList = (headers: Record<string, string>) => Object.entries(headers);\nconst jsObject = (value: unknown, pad: string) => indent(JSON.stringify(value, null, 2), pad);\n\nfunction parseUrl(url: string) {\n try {\n return new URL(url);\n } catch {\n return new URL(url, \"http://localhost\");\n }\n}\n\nconst note = (comment: string, text: string) => `${comment} ${text}`;\n\n// ---------------------------------------------------------------------------\n// Shell\n\nfunction curl({ method, url, headers, form = [] }: HttpRequest) {\n const parts = [`curl --request ${method}`, `--url ${shellQuote(url)}`];\n for (const [key, value] of headerList(headers)) parts.push(`--header ${shellQuote(`${key}: ${value}`)}`);\n // --form-string sends text literally (no @file / <file interpretation).\n for (const field of form) {\n parts.push(field.file ? `--form ${shellQuote(`${field.name}=@${path(field)}`)}` : `--form-string ${shellQuote(`${field.name}=${field.value ?? \"\"}`)}`);\n }\n return parts.join(\" \\\\\\n \");\n}\n\nfunction httpie({ method, url, headers, form = [] }: HttpRequest) {\n const parts = [`http --multipart ${method} ${shellQuote(url)}`];\n for (const [key, value] of headerList(headers)) parts.push(shellQuote(`${key}:${value}`));\n for (const field of form) parts.push(shellQuote(field.file ? `${field.name}@${path(field)}` : `${field.name}=${field.value ?? \"\"}`));\n return parts.join(\" \\\\\\n \");\n}\n\n// ---------------------------------------------------------------------------\n// JavaScript / Node.js\n\nfunction formData(form: FormField[], node: boolean) {\n const lines = [\"const form = new FormData();\"];\n for (const field of form) {\n if (!field.file) lines.push(`form.append(${dq(field.name)}, ${dq(field.value ?? \"\")});`);\n else if (node) lines.push(`form.append(${dq(field.name)}, await openAsBlob(${dq(path(field))}), ${dq(field.file.name)});`);\n else lines.push(`form.append(${dq(field.name)}, fileInput.files[0]); // <input type=\"file\" id=\"fileInput\">`);\n }\n return lines;\n}\n\nconst nodeImports = (form: FormField[]) => (files(form).length ? ['import { openAsBlob } from \"node:fs\";', \"\"] : []);\n\nfunction fetchClient(node: boolean) {\n return ({ method, url, headers, form = [] }: HttpRequest) => {\n const options = [` method: ${dq(method)},`];\n if (headerList(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n options.push(\" body: form,\");\n return [\n ...(node ? nodeImports(form) : []),\n ...formData(form, node),\n \"\",\n `const response = await fetch(${dq(url)}, {`,\n ...options,\n \"});\",\n \"\",\n \"const data = await response.json();\",\n \"console.log(data);\",\n ].join(\"\\n\");\n };\n}\n\nfunction axios(node: boolean) {\n return ({ method, url, headers, form = [] }: HttpRequest) => {\n const options = [` method: ${dq(method)},`, ` url: ${dq(url)},`];\n if (headerList(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n options.push(\" data: form,\");\n return [\n 'import axios from \"axios\";',\n ...(node && files(form).length ? ['import { openAsBlob } from \"node:fs\";'] : []),\n \"\",\n ...formData(form, node),\n \"\",\n \"const { data } = await axios.request({\",\n ...options,\n \"});\",\n \"\",\n \"console.log(data);\",\n ].join(\"\\n\");\n };\n}\n\nfunction jquery({ method, url, headers, form = [] }: HttpRequest) {\n const options = [` url: ${dq(url)},`, ` method: ${dq(method)},`];\n if (headerList(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n options.push(\" data: form,\", \" processData: false,\", \" contentType: false,\");\n return [...formData(form, false), \"\", \"$.ajax({\", ...options, \"}).done((response) => {\", \" console.log(response);\", \"});\"].join(\"\\n\");\n}\n\nfunction xhr({ method, url, headers, form = [] }: HttpRequest) {\n return [\n ...formData(form, false),\n \"\",\n \"const xhr = new XMLHttpRequest();\",\n `xhr.open(${dq(method)}, ${dq(url)});`,\n ...headerList(headers).map(([key, value]) => `xhr.setRequestHeader(${dq(key)}, ${dq(value)});`),\n \"\",\n 'xhr.addEventListener(\"load\", () => {',\n \" console.log(xhr.responseText);\",\n \"});\",\n \"\",\n \"xhr.send(form);\",\n ].join(\"\\n\");\n}\n\nfunction undici({ method, url, headers, form = [] }: HttpRequest) {\n const options = [` method: ${dq(method)},`];\n if (headerList(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n options.push(\" body: form,\");\n return [\n 'import { request, FormData } from \"undici\";',\n ...(files(form).length ? ['import { openAsBlob } from \"node:fs\";'] : []),\n \"\",\n ...formData(form, true),\n \"\",\n `const { statusCode, body } = await request(${dq(url)}, {`,\n ...options,\n \"});\",\n \"\",\n \"console.log(statusCode, await body.json());\",\n ].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Python\n\nconst pyString = (value: unknown) => JSON.stringify(String(value));\n\nfunction pythonClient(library: string) {\n return ({ method, url, headers, form = [] }: HttpRequest) => {\n const lines = [`import ${library}`, \"\", `url = ${pyString(url)}`];\n const args = [pyString(method), \"url\"];\n if (headerList(headers).length) {\n lines.push(`headers = {${headerList(headers).map(([key, value]) => `${pyString(key)}: ${pyString(value)}`).join(\", \")}}`);\n args.push(\"headers=headers\");\n }\n // A dict, with a list for repeated names: httpx rejects a list of tuples\n // next to files, and requests accepts both.\n const grouped = new Map<string, string[]>();\n for (const field of texts(form)) grouped.set(field.name, [...(grouped.get(field.name) ?? []), field.value ?? \"\"]);\n if (grouped.size) {\n const entries = [...grouped].map(([name, values]) => `${pyString(name)}: ${values.length > 1 ? `[${values.map(pyString).join(\", \")}]` : pyString(values[0])}`);\n lines.push(`data = {${entries.join(\", \")}}`);\n args.push(\"data=data\");\n }\n const fileFields = files(form);\n lines.push(\n `files = [${fileFields.map((field) => `(${pyString(field.name)}, (${pyString(field.file!.name)}, open(${pyString(path(field))}, \"rb\"), ${pyString(fileType(field))}))`).join(\", \")}]`,\n );\n args.push(\"files=files\");\n lines.push(\"\", `response = ${library}.request(${args.join(\", \")})`, \"\", \"print(response.json())\");\n return lines.join(\"\\n\");\n };\n}\n\n// ---------------------------------------------------------------------------\n// PHP\n\nfunction phpCurl({ method, url, headers, form = [] }: HttpRequest) {\n const lines = [\n \"<?php\",\n \"\",\n \"$curl = curl_init();\",\n \"\",\n \"curl_setopt_array($curl, [\",\n ` CURLOPT_URL => ${sq(url)},`,\n \" CURLOPT_RETURNTRANSFER => true,\",\n ` CURLOPT_CUSTOMREQUEST => ${sq(method)},`,\n ];\n const headerLines = headerList(headers).map(([key, value]) => ` ${sq(`${key}: ${value}`)},`);\n if (headerLines.length) lines.push(\" CURLOPT_HTTPHEADER => [\", ...headerLines, \" ],\");\n const names = form.map((field) => field.name);\n if (new Set(names).size !== names.length) {\n lines.splice(1, 0, \"\", \"// PHP arrays cannot repeat a key, so repeated fields keep only their last value; use the Guzzle example for those.\");\n }\n lines.push(\n \" CURLOPT_POSTFIELDS => [\",\n ...form.map((field) =>\n field.file\n ? ` ${sq(field.name)} => new CURLFile(${sq(path(field))}, ${sq(fileType(field))}, ${sq(field.file.name)}),`\n : ` ${sq(field.name)} => ${sq(field.value ?? \"\")},`,\n ),\n \" ],\",\n \"]);\",\n \"\",\n \"$response = curl_exec($curl);\",\n \"curl_close($curl);\",\n \"\",\n \"echo $response;\",\n );\n return lines.join(\"\\n\");\n}\n\nfunction guzzle({ method, url, headers, form = [] }: HttpRequest) {\n const options: string[] = [];\n if (headerList(headers).length) {\n options.push(\" 'headers' => [\", ...headerList(headers).map(([key, value]) => ` ${sq(key)} => ${sq(value)},`), \" ],\");\n }\n options.push(\n \" 'multipart' => [\",\n ...form.map((field) =>\n field.file\n ? ` ['name' => ${sq(field.name)}, 'contents' => fopen(${sq(path(field))}, 'r'), 'filename' => ${sq(field.file.name)}],`\n : ` ['name' => ${sq(field.name)}, 'contents' => ${sq(field.value ?? \"\")}],`,\n ),\n \" ],\",\n );\n return [\n \"<?php\",\n \"\",\n \"require 'vendor/autoload.php';\",\n \"\",\n \"$client = new \\\\GuzzleHttp\\\\Client();\",\n \"\",\n `$response = $client->request(${sq(method)}, ${sq(url)}, [\\n${options.join(\"\\n\")}\\n]);`,\n \"\",\n \"echo $response->getBody();\",\n ].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Compiled / other languages\n\nfunction go({ method, url, headers, form = [] }: HttpRequest) {\n const fileFields = files(form);\n const body: string[] = [\"\\tbody := &bytes.Buffer{}\", \"\\twriter := multipart.NewWriter(body)\"];\n for (const field of form) {\n if (!field.file) {\n body.push(`\\twriter.WriteField(${dq(field.name)}, ${dq(field.value ?? \"\")})`);\n continue;\n }\n const variable = `file${body.length}`;\n body.push(\n \"\",\n `\\t${variable}, err := os.Open(${dq(path(field))})`,\n \"\\tif err != nil {\",\n \"\\t\\tpanic(err)\",\n \"\\t}\",\n `\\tdefer ${variable}.Close()`,\n `\\tpart${variable}, _ := writer.CreateFormFile(${dq(field.name)}, ${dq(field.file.name)})`,\n `\\tio.Copy(part${variable}, ${variable})`,\n );\n }\n body.push(\"\\twriter.Close()\");\n const imports = ['\"bytes\"', '\"fmt\"', '\"io\"', '\"mime/multipart\"', '\"net/http\"', ...(fileFields.length ? ['\"os\"'] : [])];\n\n return [\n \"package main\",\n \"\",\n \"import (\",\n ...imports.map((item) => `\\t${item}`),\n \")\",\n \"\",\n \"func main() {\",\n ...body,\n \"\",\n `\\treq, _ := http.NewRequest(${dq(method)}, ${dq(url)}, body)`,\n \"\\treq.Header.Set(\\\"Content-Type\\\", writer.FormDataContentType())\",\n ...headerList(headers).map(([key, value]) => `\\treq.Header.Add(${dq(key)}, ${dq(value)})`),\n \"\",\n \"\\tres, err := http.DefaultClient.Do(req)\",\n \"\\tif err != nil {\",\n \"\\t\\tpanic(err)\",\n \"\\t}\",\n \"\\tdefer res.Body.Close()\",\n \"\",\n \"\\tdata, _ := io.ReadAll(res.Body)\",\n \"\\tfmt.Println(string(data))\",\n \"}\",\n ].join(\"\\n\");\n}\n\nfunction javaOkHttp({ method, url, headers, form = [] }: HttpRequest) {\n return [\n \"OkHttpClient client = new OkHttpClient();\",\n \"\",\n \"RequestBody body = new MultipartBody.Builder()\",\n \" .setType(MultipartBody.FORM)\",\n ...form.map((field) =>\n field.file\n ? ` .addFormDataPart(${dq(field.name)}, ${dq(field.file.name)}, RequestBody.create(new File(${dq(path(field))}), MediaType.parse(${dq(fileType(field))})))`\n : ` .addFormDataPart(${dq(field.name)}, ${dq(field.value ?? \"\")})`,\n ),\n \" .build();\",\n \"Request request = new Request.Builder()\",\n ` .url(${dq(url)})`,\n ` .method(${dq(method)}, body)`,\n ...headerList(headers).map(([key, value]) => ` .addHeader(${dq(key)}, ${dq(value)})`),\n \" .build();\",\n \"\",\n \"Response response = client.newCall(request).execute();\",\n \"System.out.println(response.body().string());\",\n ].join(\"\\n\");\n}\n\nfunction kotlinOkHttp({ method, url, headers, form = [] }: HttpRequest) {\n return [\n \"val client = OkHttpClient()\",\n \"\",\n \"val body = MultipartBody.Builder()\",\n \" .setType(MultipartBody.FORM)\",\n ...form.map((field) =>\n field.file\n ? ` .addFormDataPart(${kotlinQuote(field.name)}, ${kotlinQuote(field.file.name)}, File(${kotlinQuote(path(field))}).asRequestBody(${kotlinQuote(fileType(field))}.toMediaType()))`\n : ` .addFormDataPart(${kotlinQuote(field.name)}, ${kotlinQuote(field.value ?? \"\")})`,\n ),\n \" .build()\",\n \"val request = Request.Builder()\",\n ` .url(${kotlinQuote(url)})`,\n ` .method(${kotlinQuote(method)}, body)`,\n ...headerList(headers).map(([key, value]) => ` .addHeader(${kotlinQuote(key)}, ${kotlinQuote(value)})`),\n \" .build()\",\n \"\",\n \"val response = client.newCall(request).execute()\",\n \"println(response.body?.string())\",\n ].join(\"\\n\");\n}\n\nfunction csharpHttpClient({ method, url, headers, form = [] }: HttpRequest) {\n const lines = [\"var client = new HttpClient();\", \"using var form = new MultipartFormDataContent();\"];\n for (const field of form) {\n lines.push(\n field.file\n ? `form.Add(new StreamContent(File.OpenRead(${dq(path(field))})), ${dq(field.name)}, ${dq(field.file.name)});`\n : `form.Add(new StringContent(${dq(field.value ?? \"\")}), ${dq(field.name)});`,\n );\n }\n lines.push(\"\", \"var request = new HttpRequestMessage\", \"{\", ` Method = new HttpMethod(${dq(method)}),`, ` RequestUri = new Uri(${dq(url)}),`);\n if (headerList(headers).length) {\n lines.push(\" Headers =\", \" {\", ...headerList(headers).map(([key, value]) => ` { ${dq(key)}, ${dq(value)} },`), \" },\");\n }\n lines.push(\n \" Content = form,\",\n \"};\",\n \"\",\n \"using var response = await client.SendAsync(request);\",\n \"Console.WriteLine(await response.Content.ReadAsStringAsync());\",\n );\n return lines.join(\"\\n\");\n}\n\nfunction restSharp({ method, url, headers, form = [] }: HttpRequest) {\n return [\n \"using RestSharp;\",\n \"\",\n `var client = new RestClient(${dq(url)});`,\n `var request = new RestRequest(\"\", Method.${capitalize(method)});`,\n \"request.AlwaysMultipartFormData = true;\",\n ...headerList(headers).map(([key, value]) => `request.AddHeader(${dq(key)}, ${dq(value)});`),\n ...form.map((field) =>\n field.file ? `request.AddFile(${dq(field.name)}, ${dq(path(field))});` : `request.AddParameter(${dq(field.name)}, ${dq(field.value ?? \"\")});`,\n ),\n \"\",\n \"var response = await client.ExecuteAsync(request);\",\n \"Console.WriteLine(response.Content);\",\n ].join(\"\\n\");\n}\n\nfunction ruby({ method, url, headers, form = [] }: HttpRequest) {\n const lines = ['require \"uri\"', 'require \"net/http\"', \"\", `url = URI(${sq(url)})`, \"\", \"http = Net::HTTP.new(url.host, url.port)\"];\n if (parseUrl(url).protocol === \"https:\") lines.push(\"http.use_ssl = true\");\n lines.push(\"\", `request = Net::HTTP::${capitalize(method)}.new(url)`);\n for (const [key, value] of headerList(headers)) lines.push(`request[${sq(key)}] = ${sq(value)}`);\n const parts = form.map((field) => (field.file ? `[${sq(field.name)}, File.open(${sq(path(field))})]` : `[${sq(field.name)}, ${sq(field.value ?? \"\")}]`));\n lines.push(`request.set_form([${parts.join(\", \")}], \"multipart/form-data\")`, \"\", \"response = http.request(request)\", \"puts response.read_body\");\n return lines.join(\"\\n\");\n}\n\nfunction swift({ method, url, headers, form = [] }: HttpRequest) {\n const lines = [\n \"import Foundation\",\n \"\",\n `let url = URL(string: ${dq(url)})!`,\n \"var request = URLRequest(url: url)\",\n `request.httpMethod = ${dq(method)}`,\n ];\n for (const [key, value] of headerList(headers)) lines.push(`request.setValue(${dq(value)}, forHTTPHeaderField: ${dq(key)})`);\n lines.push(\n \"\",\n 'let boundary = \"Boundary-\\\\(UUID().uuidString)\"',\n 'request.setValue(\"multipart/form-data; boundary=\\\\(boundary)\", forHTTPHeaderField: \"Content-Type\")',\n \"\",\n \"var body = Data()\",\n );\n for (const field of form) {\n const name = JSON.stringify(field.name).slice(1, -1);\n if (field.file) {\n const fileName = JSON.stringify(field.file.name).slice(1, -1);\n lines.push(\n `body.append(\"--\\\\(boundary)\\\\r\\\\nContent-Disposition: form-data; name=\\\\\"${name}\\\\\"; filename=\\\\\"${fileName}\\\\\"\\\\r\\\\nContent-Type: ${fileType(field)}\\\\r\\\\n\\\\r\\\\n\".data(using: .utf8)!)`,\n `body.append(try Data(contentsOf: URL(fileURLWithPath: ${dq(path(field))})))`,\n 'body.append(\"\\\\r\\\\n\".data(using: .utf8)!)',\n );\n } else {\n const value = JSON.stringify(field.value ?? \"\").slice(1, -1);\n lines.push(`body.append(\"--\\\\(boundary)\\\\r\\\\nContent-Disposition: form-data; name=\\\\\"${name}\\\\\"\\\\r\\\\n\\\\r\\\\n${value}\\\\r\\\\n\".data(using: .utf8)!)`);\n }\n }\n lines.push(\n 'body.append(\"--\\\\(boundary)--\\\\r\\\\n\".data(using: .utf8)!)',\n \"request.httpBody = body\",\n \"\",\n \"let (data, _) = try await URLSession.shared.data(for: request)\",\n \"print(String(decoding: data, as: UTF8.self))\",\n );\n return lines.join(\"\\n\");\n}\n\nfunction dart({ method, url, headers, form = [] }: HttpRequest) {\n const lines = [\"import 'package:http/http.dart' as http;\", \"\", \"void main() async {\"];\n lines.push(` final request = http.MultipartRequest(${dartQuote(method)}, Uri.parse(${dartQuote(url)}));`);\n if (headerList(headers).length) {\n lines.push(\" request.headers.addAll({\", ...headerList(headers).map(([key, value]) => ` ${dartQuote(key)}: ${dartQuote(value)},`), \" });\");\n }\n // `fields` is a Map, so repeated names go in as filename-less parts instead.\n const counts = new Map<string, number>();\n for (const field of texts(form)) counts.set(field.name, (counts.get(field.name) ?? 0) + 1);\n for (const field of form) {\n if (field.file) lines.push(` request.files.add(await http.MultipartFile.fromPath(${dartQuote(field.name)}, ${dartQuote(path(field))}));`);\n else if (counts.get(field.name)! > 1) lines.push(` request.files.add(http.MultipartFile.fromString(${dartQuote(field.name)}, ${dartQuote(field.value ?? \"\")}));`);\n else lines.push(` request.fields[${dartQuote(field.name)}] = ${dartQuote(field.value ?? \"\")};`);\n }\n lines.push(\"\", \" final response = await request.send();\", \" print(await response.stream.bytesToString());\", \"}\");\n return lines.join(\"\\n\");\n}\n\nfunction rust({ method, url, headers, form = [] }: HttpRequest) {\n const standard = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"HEAD\", \"OPTIONS\", \"PATCH\", \"TRACE\"];\n const methodExpr = standard.includes(method) ? `reqwest::Method::${method}` : `reqwest::Method::from_bytes(b${dq(method)})?`;\n return [\n '// reqwest with the \"multipart\" feature',\n \"#[tokio::main]\",\n \"async fn main() -> Result<(), Box<dyn std::error::Error>> {\",\n \" let client = reqwest::Client::new();\",\n \"\",\n \" let form = reqwest::multipart::Form::new()\",\n ...form.map((field) =>\n field.file\n ? ` .part(${dq(field.name)}, reqwest::multipart::Part::bytes(std::fs::read(${dq(path(field))})?).file_name(${dq(field.file.name)}))`\n : ` .text(${dq(field.name)}, ${dq(field.value ?? \"\")})`,\n ),\n \" ;\",\n \"\",\n \" let response = client\",\n ` .request(${methodExpr}, ${dq(url)})`,\n ...headerList(headers).map(([key, value]) => ` .header(${dq(key)}, ${dq(value)})`),\n \" .multipart(form)\",\n \" .send()\",\n \" .await?;\",\n \"\",\n ' println!(\"{}\", response.text().await?);',\n \" Ok(())\",\n \"}\",\n ].join(\"\\n\");\n}\n\nfunction libcurl({ method, url, headers, form = [] }: HttpRequest) {\n const lines = [\n \"#include <curl/curl.h>\",\n \"\",\n \"int main(void) {\",\n \" CURL *curl = curl_easy_init();\",\n \"\",\n ` curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, ${dq(method)});`,\n ` curl_easy_setopt(curl, CURLOPT_URL, ${dq(url)});`,\n \"\",\n \" struct curl_slist *headers = NULL;\",\n ...headerList(headers).map(([key, value]) => ` headers = curl_slist_append(headers, ${dq(`${key}: ${value}`)});`),\n \" curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\",\n \"\",\n \" curl_mime *mime = curl_mime_init(curl);\",\n \" curl_mimepart *part;\",\n ];\n for (const field of form) {\n lines.push(\" part = curl_mime_addpart(mime);\", ` curl_mime_name(part, ${dq(field.name)});`);\n lines.push(field.file ? ` curl_mime_filedata(part, ${dq(path(field))});` : ` curl_mime_data(part, ${dq(field.value ?? \"\")}, CURL_ZERO_TERMINATED);`);\n }\n lines.push(\n \" curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);\",\n \"\",\n \" CURLcode ret = curl_easy_perform(curl);\",\n \"\",\n \" curl_mime_free(mime);\",\n \" curl_slist_free_all(headers);\",\n \" curl_easy_cleanup(curl);\",\n \" return (int) ret;\",\n \"}\",\n );\n return lines.join(\"\\n\");\n}\n\nfunction powershell({ method, url, headers, form = [] }: HttpRequest) {\n const lines: string[] = [\"# PowerShell 7+ (-Form)\"];\n const args = [`-Uri ${psQuote(url)}`, `-Method ${method}`];\n if (headerList(headers).length) {\n lines.push(\"$headers = @{\", ...headerList(headers).map(([key, value]) => ` ${psQuote(key)} = ${psQuote(value)}`), \"}\");\n args.push(\"-Headers $headers\");\n }\n // Hash literals reject duplicate keys; -Form sends an array value as repeated parts.\n const grouped = new Map<string, string[]>();\n for (const field of form) {\n const value = field.file ? `(Get-Item -Path ${psQuote(path(field))})` : psQuote(field.value ?? \"\");\n grouped.set(field.name, [...(grouped.get(field.name) ?? []), value]);\n }\n lines.push(\n \"$form = @{\",\n ...[...grouped].map(([name, values]) => ` ${psQuote(name)} = ${values.length > 1 ? `@(${values.join(\", \")})` : values[0]}`),\n \"}\",\n \"\",\n );\n args.push(\"-Form $form\");\n lines.push(`$response = Invoke-RestMethod ${args.join(\" \")}`, \"$response | ConvertTo-Json -Depth 10\");\n return lines.join(\"\\n\");\n}\n\nconst BOUNDARY = \"oaspect-boundary\";\n\nfunction rawHttp({ method, url, headers, form = [] }: HttpRequest) {\n const target = parseUrl(url);\n const lines = [`${method} ${target.pathname}${target.search} HTTP/1.1`, `Host: ${target.host}`];\n for (const [key, value] of headerList(headers)) lines.push(`${key}: ${value}`);\n lines.push(`Content-Type: multipart/form-data; boundary=${BOUNDARY}`, \"\");\n for (const field of form) {\n lines.push(`--${BOUNDARY}`);\n if (field.file) {\n lines.push(`Content-Disposition: form-data; name=\"${field.name}\"; filename=\"${field.file.name}\"`, `Content-Type: ${fileType(field)}`, \"\", `(contents of ${field.file.name})`);\n } else {\n lines.push(`Content-Disposition: form-data; name=\"${field.name}\"`, \"\", field.value ?? \"\");\n }\n }\n lines.push(`--${BOUNDARY}--`);\n return lines.join(\"\\n\");\n}\n\n// \"language:client\" → multipart builder. Missing entries get a note.\nexport const MULTIPART_BUILDERS: Record<string, (request: HttpRequest) => string> = {\n \"shell:curl\": curl,\n \"shell:wget\": () => note(\"#\", \"wget cannot send multipart/form-data; use the cURL or HTTPie example.\"),\n \"shell:httpie\": httpie,\n \"javascript:fetch\": fetchClient(false),\n \"javascript:axios\": axios(false),\n \"javascript:jquery\": jquery,\n \"javascript:xhr\": xhr,\n \"node:fetch\": fetchClient(true),\n \"node:axios\": axios(true),\n \"node:undici\": undici,\n \"node:http\": () => note(\"//\", \"node:http has no multipart/form-data encoder; use the fetch or undici example.\"),\n \"python:requests\": pythonClient(\"requests\"),\n \"python:httpx\": pythonClient(\"httpx\"),\n \"python:http.client\": () => note(\"#\", \"http.client has no multipart/form-data encoder; use the requests or httpx example.\"),\n \"php:curl\": phpCurl,\n \"php:guzzle\": guzzle,\n \"go:native\": go,\n \"java:httpclient\": () => note(\"//\", \"java.net.http has no multipart/form-data encoder; use the OkHttp example.\"),\n \"java:okhttp\": javaOkHttp,\n \"kotlin:okhttp\": kotlinOkHttp,\n \"csharp:httpclient\": csharpHttpClient,\n \"csharp:restsharp\": restSharp,\n \"ruby:native\": ruby,\n \"swift:urlsession\": swift,\n \"dart:http\": dart,\n \"rust:reqwest\": rust,\n \"c:libcurl\": libcurl,\n \"powershell:restmethod\": powershell,\n \"http:raw\": rawHttp,\n};\n","import { MULTIPART_BUILDERS } from \"./multipart\";\nimport type { HttpRequest, SnippetLanguage } from \"./types\";\n\n// Code sample generators, grouped by language and client library. Each\n// client's build() takes the output of buildRequest():\n// { method, url, headers, body } where body is a string or undefined.\n\n// ---------------------------------------------------------------------------\n// String literal helpers per quoting style.\n\nconst dq = (value) => JSON.stringify(String(value));\nconst sq = (value) => `'${String(value).replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")}'`;\nconst shellQuote = (value) => `'${String(value).replace(/'/g, \"'\\\\''\")}'`;\nconst psQuote = (value) => `'${String(value).replace(/'/g, \"''\")}'`;\nconst dartQuote = (value) => sq(value).replace(/\\$/g, \"\\\\$\");\nconst kotlinQuote = (value) => dq(value).replace(/\\$/g, \"\\\\$\");\n\nconst indent = (text, prefix) => text.split(\"\\n\").join(`\\n${prefix}`);\n\nfunction parseJson(body) {\n if (body === undefined) return undefined;\n try {\n return JSON.parse(body);\n } catch {\n return undefined;\n }\n}\n\n// Single-line form of the body, for languages without multi-line literals.\nconst compact = (body) => {\n const json = parseJson(body);\n return json === undefined ? body : JSON.stringify(json);\n};\n\nconst contentTypeOf = (headers) =>\n Object.entries(headers).find(([key]) => key.toLowerCase() === \"content-type\")?.[1];\n\nconst withoutContentType = (headers) =>\n Object.fromEntries(Object.entries(headers).filter(([key]) => key.toLowerCase() !== \"content-type\"));\n\nfunction parseUrl(url) {\n try {\n return new URL(url);\n } catch {\n return new URL(url, \"http://localhost\");\n }\n}\n\nconst capitalize = (method) => method.charAt(0) + method.slice(1).toLowerCase();\n\n// Literal converters for languages whose idiomatic clients take native data.\nfunction toPython(value, pad = \"\") {\n if (value === null) return \"None\";\n if (value === true) return \"True\";\n if (value === false) return \"False\";\n if (typeof value !== \"object\") return JSON.stringify(value);\n const next = `${pad} `;\n if (Array.isArray(value)) {\n return value.length ? `[\\n${value.map((item) => next + toPython(item, next)).join(\",\\n\")},\\n${pad}]` : \"[]\";\n }\n const entries = Object.entries(value);\n return entries.length\n ? `{\\n${entries.map(([key, item]) => `${next}${JSON.stringify(key)}: ${toPython(item, next)}`).join(\",\\n\")},\\n${pad}}`\n : \"{}\";\n}\n\nfunction toPhp(value, pad = \"\") {\n if (value === null) return \"null\";\n if (typeof value === \"boolean\" || typeof value === \"number\") return String(value);\n if (typeof value === \"string\") return sq(value);\n // `[]` would encode as a JSON array, so empty objects need an explicit cast.\n if (!Array.isArray(value) && Object.keys(value).length === 0) return \"(object) []\";\n const next = `${pad} `;\n const items = Array.isArray(value)\n ? value.map((item) => next + toPhp(item, next))\n : Object.entries(value).map(([key, item]) => `${next}${sq(key)} => ${toPhp(item, next)}`);\n return items.length ? `[\\n${items.join(\",\\n\")},\\n${pad}]` : \"[]\";\n}\n\nfunction toRuby(value, pad = \"\") {\n if (value === null) return \"nil\";\n if (typeof value === \"boolean\" || typeof value === \"number\") return String(value);\n if (typeof value === \"string\") return sq(value);\n const next = `${pad} `;\n if (Array.isArray(value)) {\n return value.length ? `[\\n${value.map((item) => next + toRuby(item, next)).join(\",\\n\")}\\n${pad}]` : \"[]\";\n }\n const entries = Object.entries(value);\n return entries.length\n ? `{\\n${entries.map(([key, item]) => `${next}${sq(key)} => ${toRuby(item, next)}`).join(\",\\n\")}\\n${pad}}`\n : \"{}\";\n}\n\nconst jsObject = (value, pad) => indent(JSON.stringify(value, null, 2), pad);\n\n// JS body expression: JSON.stringify(<literal>) for JSON, a string otherwise.\nfunction jsBody(body, pad) {\n const json = parseJson(body);\n return json === undefined ? dq(body) : `JSON.stringify(${jsObject(json, pad)})`;\n}\n\n// ---------------------------------------------------------------------------\n// Shell\n\nfunction curl({ method, url, headers, body }: HttpRequest) {\n const parts = [`curl --request ${method}`, `--url ${shellQuote(url)}`];\n for (const [key, value] of Object.entries(headers)) parts.push(`--header ${shellQuote(`${key}: ${value}`)}`);\n if (body !== undefined) parts.push(`--data ${shellQuote(body)}`);\n return parts.join(\" \\\\\\n \");\n}\n\nfunction wget({ method, url, headers, body }: HttpRequest) {\n const parts = [\"wget --quiet\", `--method=${method}`];\n for (const [key, value] of Object.entries(headers)) parts.push(`--header=${shellQuote(`${key}: ${value}`)}`);\n if (body !== undefined) parts.push(`--body-data=${shellQuote(body)}`);\n parts.push(\"--output-document=-\", shellQuote(url));\n return parts.join(\" \\\\\\n \");\n}\n\nfunction httpie({ method, url, headers, body }: HttpRequest) {\n const command = `http ${method} ${shellQuote(url)}`;\n const parts = [body !== undefined ? `printf '%s' ${shellQuote(body)} | ${command}` : command];\n for (const [key, value] of Object.entries(headers)) parts.push(shellQuote(`${key}:${value}`));\n return parts.join(\" \\\\\\n \");\n}\n\n// ---------------------------------------------------------------------------\n// JavaScript / Node.js\n\nfunction fetchClient({ method, url, headers, body }: HttpRequest) {\n const options = [` method: ${dq(method)},`];\n if (Object.keys(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n if (body !== undefined) options.push(` body: ${jsBody(body, \" \")},`);\n return [`const response = await fetch(${dq(url)}, {`, ...options, \"});\", \"\", \"const data = await response.json();\", \"console.log(data);\"].join(\"\\n\");\n}\n\nfunction axios({ method, url, headers, body }: HttpRequest) {\n const options = [` method: ${dq(method)},`, ` url: ${dq(url)},`];\n if (Object.keys(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n if (body !== undefined) {\n const json = parseJson(body);\n options.push(` data: ${json === undefined ? dq(body) : jsObject(json, \" \")},`);\n }\n return ['import axios from \"axios\";', \"\", \"const { data } = await axios.request({\", ...options, \"});\", \"\", \"console.log(data);\"].join(\"\\n\");\n}\n\nfunction jquery({ method, url, headers, body }: HttpRequest) {\n const options = [` url: ${dq(url)},`, ` method: ${dq(method)},`];\n if (Object.keys(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n if (body !== undefined) options.push(` data: ${jsBody(body, \" \")},`);\n return [\"$.ajax({\", ...options, \"}).done((response) => {\", \" console.log(response);\", \"});\"].join(\"\\n\");\n}\n\nfunction xhr({ method, url, headers, body }: HttpRequest) {\n return [\n \"const xhr = new XMLHttpRequest();\",\n `xhr.open(${dq(method)}, ${dq(url)});`,\n ...Object.entries(headers).map(([key, value]) => `xhr.setRequestHeader(${dq(key)}, ${dq(value)});`),\n \"\",\n 'xhr.addEventListener(\"load\", () => {',\n \" console.log(xhr.responseText);\",\n \"});\",\n \"\",\n body !== undefined ? `xhr.send(${jsBody(body, \"\")});` : \"xhr.send();\",\n ].join(\"\\n\");\n}\n\nfunction undici({ method, url, headers, body }: HttpRequest) {\n const options = [` method: ${dq(method)},`];\n if (Object.keys(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n if (body !== undefined) options.push(` body: ${jsBody(body, \" \")},`);\n return [\n 'import { request } from \"undici\";',\n \"\",\n `const { statusCode, body } = await request(${dq(url)}, {`,\n ...options,\n \"});\",\n \"\",\n \"console.log(statusCode, await body.json());\",\n ].join(\"\\n\");\n}\n\nfunction nodeHttp({ method, url, headers, body }: HttpRequest) {\n const lib = parseUrl(url).protocol === \"https:\" ? \"https\" : \"http\";\n const options = [` method: ${dq(method)},`];\n if (Object.keys(headers).length) options.push(` headers: ${jsObject(headers, \" \")},`);\n return [\n `import ${lib} from \"node:${lib}\";`,\n \"\",\n `const req = ${lib}.request(${dq(url)}, {`,\n ...options,\n \"}, (res) => {\",\n ' let data = \"\";',\n ' res.on(\"data\", (chunk) => (data += chunk));',\n ' res.on(\"end\", () => console.log(data));',\n \"});\",\n \"\",\n ...(body !== undefined ? [`req.write(${jsBody(body, \"\")});`] : []),\n \"req.end();\",\n ].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Python\n\nfunction pythonClient(library) {\n return ({ method, url, headers, body }: HttpRequest) => {\n const json = parseJson(body);\n const lines = [`import ${library}`, \"\", `url = ${dq(url)}`];\n const args = [dq(method), \"url\"];\n\n if (Object.keys(headers).length) {\n lines.push(`headers = ${toPython(headers)}`);\n args.push(\"headers=headers\");\n }\n if (json !== undefined) {\n lines.push(`payload = ${toPython(json)}`);\n args.push(\"json=payload\");\n } else if (body !== undefined) {\n lines.push(`payload = ${dq(body)}`);\n args.push(\"data=payload\");\n }\n lines.push(\"\", `response = ${library}.request(${args.join(\", \")})`, \"\", \"print(response.json())\");\n return lines.join(\"\\n\");\n };\n}\n\nfunction pythonHttpClient({ method, url, headers, body }: HttpRequest) {\n const target = parseUrl(url);\n const connection = target.protocol === \"https:\" ? \"HTTPSConnection\" : \"HTTPConnection\";\n const json = parseJson(body);\n const lines = [\"import http.client\"];\n if (json !== undefined) lines.push(\"import json\");\n lines.push(\"\", `conn = http.client.${connection}(${dq(target.host)})`);\n\n let payload = \"None\";\n if (json !== undefined) {\n lines.push(`payload = json.dumps(${toPython(json)})`);\n payload = \"payload\";\n } else if (body !== undefined) {\n lines.push(`payload = ${dq(body)}`);\n payload = \"payload\";\n }\n lines.push(`headers = ${toPython(headers)}`);\n lines.push(\n \"\",\n `conn.request(${dq(method)}, ${dq(target.pathname + target.search)}, ${payload}, headers)`,\n \"res = conn.getresponse()\",\n \"\",\n 'print(res.read().decode(\"utf-8\"))',\n );\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// PHP\n\nfunction phpCurl({ method, url, headers, body }: HttpRequest) {\n const json = parseJson(body);\n const lines = [\n \"<?php\",\n \"\",\n \"$curl = curl_init();\",\n \"\",\n \"curl_setopt_array($curl, [\",\n ` CURLOPT_URL => ${sq(url)},`,\n \" CURLOPT_RETURNTRANSFER => true,\",\n ` CURLOPT_CUSTOMREQUEST => ${sq(method)},`,\n ];\n const headerLines = Object.entries(headers).map(([key, value]) => ` ${sq(`${key}: ${value}`)},`);\n if (headerLines.length) lines.push(\" CURLOPT_HTTPHEADER => [\", ...headerLines, \" ],\");\n if (json !== undefined) lines.push(` CURLOPT_POSTFIELDS => json_encode(${toPhp(json, \" \")}),`);\n else if (body !== undefined) lines.push(` CURLOPT_POSTFIELDS => ${sq(body)},`);\n lines.push(\"]);\", \"\", \"$response = curl_exec($curl);\", \"curl_close($curl);\", \"\", \"echo $response;\");\n return lines.join(\"\\n\");\n}\n\nfunction guzzle({ method, url, headers, body }: HttpRequest) {\n const json = parseJson(body);\n const options: string[] = [];\n const sentHeaders = json !== undefined ? withoutContentType(headers) : headers;\n if (Object.keys(sentHeaders).length) options.push(` 'headers' => ${toPhp(sentHeaders, \" \")},`);\n if (json !== undefined) options.push(` 'json' => ${toPhp(json, \" \")},`);\n else if (body !== undefined) options.push(` 'body' => ${sq(body)},`);\n\n return [\n \"<?php\",\n \"\",\n \"require 'vendor/autoload.php';\",\n \"\",\n \"$client = new \\\\GuzzleHttp\\\\Client();\",\n \"\",\n options.length\n ? `$response = $client->request(${sq(method)}, ${sq(url)}, [\\n${options.join(\"\\n\")}\\n]);`\n : `$response = $client->request(${sq(method)}, ${sq(url)});`,\n \"\",\n \"echo $response->getBody();\",\n ].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Compiled / other languages\n\nfunction go({ method, url, headers, body }: HttpRequest) {\n const hasBody = body !== undefined;\n const literal = hasBody && !body.includes(\"`\") ? `\\`${body}\\`` : hasBody ? dq(body) : \"\";\n const imports = ['\"fmt\"', '\"io\"', '\"net/http\"', ...(hasBody ? ['\"strings\"'] : [])];\n\n return [\n \"package main\",\n \"\",\n \"import (\",\n ...imports.map((item) => `\\t${item}`),\n \")\",\n \"\",\n \"func main() {\",\n ...(hasBody ? [`\\tpayload := strings.NewReader(${literal})`, \"\"] : []),\n `\\treq, _ := http.NewRequest(${dq(method)}, ${dq(url)}, ${hasBody ? \"payload\" : \"nil\"})`,\n ...(Object.keys(headers).length ? [\"\", ...Object.entries(headers).map(([key, value]) => `\\treq.Header.Add(${dq(key)}, ${dq(value)})`)] : []),\n \"\",\n \"\\tres, err := http.DefaultClient.Do(req)\",\n \"\\tif err != nil {\",\n \"\\t\\tpanic(err)\",\n \"\\t}\",\n \"\\tdefer res.Body.Close()\",\n \"\",\n \"\\tdata, _ := io.ReadAll(res.Body)\",\n \"\\tfmt.Println(string(data))\",\n \"}\",\n ].join(\"\\n\");\n}\n\n// Java/C# text blocks: body lines share the closing delimiter's indentation.\nconst textBlock = (body, pad) => `\"\"\"\\n${pad}${indent(body, pad)}\\n${pad}\"\"\"`;\n\nfunction javaHttpClient({ method, url, headers, body }: HttpRequest) {\n const publisher =\n body !== undefined\n ? `HttpRequest.BodyPublishers.ofString(${textBlock(body.replace(/\\\\/g, \"\\\\\\\\\"), \" \")})`\n : \"HttpRequest.BodyPublishers.noBody()\";\n return [\n \"import java.net.URI;\",\n \"import java.net.http.HttpClient;\",\n \"import java.net.http.HttpRequest;\",\n \"import java.net.http.HttpResponse;\",\n \"\",\n \"HttpRequest request = HttpRequest.newBuilder()\",\n ` .uri(URI.create(${dq(url)}))`,\n ...Object.entries(headers).map(([key, value]) => ` .header(${dq(key)}, ${dq(value)})`),\n ` .method(${dq(method)}, ${publisher})`,\n \" .build();\",\n \"\",\n \"HttpResponse<String> response = HttpClient.newHttpClient()\",\n \" .send(request, HttpResponse.BodyHandlers.ofString());\",\n \"\",\n \"System.out.println(response.body());\",\n ].join(\"\\n\");\n}\n\nfunction javaOkHttp({ method, url, headers, body }: HttpRequest) {\n const hasBody = body !== undefined;\n return [\n \"OkHttpClient client = new OkHttpClient();\",\n \"\",\n ...(hasBody\n ? [\n `MediaType mediaType = MediaType.parse(${dq(contentTypeOf(headers) ?? \"text/plain\")});`,\n `RequestBody body = RequestBody.create(${dq(compact(body))}, mediaType);`,\n ]\n : []),\n \"Request request = new Request.Builder()\",\n ` .url(${dq(url)})`,\n ` .method(${dq(method)}, ${hasBody ? \"body\" : \"null\"})`,\n ...Object.entries(headers).map(([key, value]) => ` .addHeader(${dq(key)}, ${dq(value)})`),\n \" .build();\",\n \"\",\n \"Response response = client.newCall(request).execute();\",\n \"System.out.println(response.body().string());\",\n ].join(\"\\n\");\n}\n\nfunction kotlinOkHttp({ method, url, headers, body }: HttpRequest) {\n const hasBody = body !== undefined;\n return [\n \"val client = OkHttpClient()\",\n \"\",\n ...(hasBody\n ? [\n `val mediaType = ${kotlinQuote(contentTypeOf(headers) ?? \"text/plain\")}.toMediaType()`,\n `val body = \"\"\"\\n${body.replace(/\\$/g, () => \"${'$'}\")}\\n\"\"\".trimIndent().toRequestBody(mediaType)`,\n ]\n : []),\n \"val request = Request.Builder()\",\n ` .url(${kotlinQuote(url)})`,\n ` .method(${kotlinQuote(method)}, ${hasBody ? \"body\" : \"null\"})`,\n ...Object.entries(headers).map(([key, value]) => ` .addHeader(${kotlinQuote(key)}, ${kotlinQuote(value)})`),\n \" .build()\",\n \"\",\n \"val response = client.newCall(request).execute()\",\n \"println(response.body?.string())\",\n ].join(\"\\n\");\n}\n\nfunction csharpHttpClient({ method, url, headers, body }: HttpRequest) {\n const requestHeaders = Object.entries(withoutContentType(headers));\n const contentType = contentTypeOf(headers);\n const lines = [\n \"using System.Net.Http.Headers;\",\n \"\",\n \"var client = new HttpClient();\",\n \"var request = new HttpRequestMessage\",\n \"{\",\n ` Method = new HttpMethod(${dq(method)}),`,\n ` RequestUri = new Uri(${dq(url)}),`,\n ];\n if (requestHeaders.length) {\n lines.push(\" Headers =\", \" {\", ...requestHeaders.map(([key, value]) => ` { ${dq(key)}, ${dq(value)} },`), \" },\");\n }\n if (body !== undefined) {\n lines.push(` Content = new StringContent(${textBlock(body, \" \")})`);\n if (contentType) {\n lines.push(\n \" {\",\n \" Headers =\",\n \" {\",\n ` ContentType = new MediaTypeHeaderValue(${dq(contentType)})`,\n \" }\",\n \" }\",\n );\n }\n }\n lines.push(\n \"};\",\n \"\",\n \"using var response = await client.SendAsync(request);\",\n \"Console.WriteLine(await response.Content.ReadAsStringAsync());\",\n );\n return lines.join(\"\\n\");\n}\n\nfunction restSharp({ method, url, headers, body }: HttpRequest) {\n const contentType = contentTypeOf(headers) ?? \"application/json\";\n return [\n \"using RestSharp;\",\n \"\",\n `var client = new RestClient(${dq(url)});`,\n `var request = new RestRequest(\"\", Method.${capitalize(method)});`,\n ...Object.entries(withoutContentType(headers)).map(([key, value]) => `request.AddHeader(${dq(key)}, ${dq(value)});`),\n ...(body !== undefined ? [`request.AddStringBody(${dq(compact(body))}, ${dq(contentType)});`] : []),\n \"\",\n \"var response = await client.ExecuteAsync(request);\",\n \"Console.WriteLine(response.Content);\",\n ].join(\"\\n\");\n}\n\nfunction ruby({ method, url, headers, body }: HttpRequest) {\n const json = parseJson(body);\n const lines = ['require \"uri\"', 'require \"net/http\"'];\n if (json !== undefined) lines.push('require \"json\"');\n lines.push(\"\", `url = URI(${sq(url)})`, \"\", \"http = Net::HTTP.new(url.host, url.port)\");\n if (parseUrl(url).protocol === \"https:\") lines.push(\"http.use_ssl = true\");\n lines.push(\"\", `request = Net::HTTP::${capitalize(method)}.new(url)`);\n for (const [key, value] of Object.entries(headers)) lines.push(`request[${sq(key)}] = ${sq(value)}`);\n if (json !== undefined) lines.push(`request.body = JSON.dump(${toRuby(json)})`);\n else if (body !== undefined) lines.push(`request.body = ${sq(body)}`);\n lines.push(\"\", \"response = http.request(request)\", \"puts response.read_body\");\n return lines.join(\"\\n\");\n}\n\nfunction swift({ method, url, headers, body }: HttpRequest) {\n const lines = [\"import Foundation\", \"\", `let url = URL(string: ${dq(url)})!`, \"var request = URLRequest(url: url)\", `request.httpMethod = ${dq(method)}`];\n const entries = Object.entries(headers);\n if (entries.length) {\n lines.push(\"request.allHTTPHeaderFields = [\", ...entries.map(([key, value]) => ` ${dq(key)}: ${dq(value)},`), \"]\");\n }\n if (body !== undefined) lines.push(`request.httpBody = \"\"\"\\n${body.replace(/\\\\/g, \"\\\\\\\\\")}\\n\"\"\".data(using: .utf8)`);\n lines.push(\"\", \"let (data, _) = try await URLSession.shared.data(for: request)\", \"print(String(decoding: data, as: UTF8.self))\");\n return lines.join(\"\\n\");\n}\n\nfunction dart({ method, url, headers, body }: HttpRequest) {\n const entries = Object.entries(headers);\n const lines = [\"import 'package:http/http.dart' as http;\", \"\", \"void main() async {\"];\n lines.push(` final request = http.Request(${dartQuote(method)}, Uri.parse(${dartQuote(url)}));`);\n if (entries.length) {\n lines.push(\" request.headers.addAll({\", ...entries.map(([key, value]) => ` ${dartQuote(key)}: ${dartQuote(value)},`), \" });\");\n }\n if (body !== undefined) lines.push(` request.body = r'''\\n${body}\\n''';`);\n lines.push(\"\", \" final response = await request.send();\", \" print(await response.stream.bytesToString());\", \"}\");\n return lines.join(\"\\n\");\n}\n\nfunction rust({ method, url, headers, body }: HttpRequest) {\n const standard = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"HEAD\", \"OPTIONS\", \"PATCH\", \"TRACE\"];\n const methodExpr = standard.includes(method)\n ? `reqwest::Method::${method}`\n : `reqwest::Method::from_bytes(b${dq(method)}).unwrap()`;\n let hashes = \"#\";\n while (body !== undefined && body.includes(`\"${hashes}`)) hashes += \"#\";\n\n return [\n \"#[tokio::main]\",\n \"async fn main() -> Result<(), reqwest::Error> {\",\n \" let client = reqwest::Client::new();\",\n \"\",\n \" let response = client\",\n ` .request(${methodExpr}, ${dq(url)})`,\n ...Object.entries(headers).map(([key, value]) => ` .header(${dq(key)}, ${dq(value)})`),\n ...(body !== undefined ? [` .body(r${hashes}\"${body}\"${hashes})`] : []),\n \" .send()\",\n \" .await?;\",\n \"\",\n ' println!(\"{}\", response.text().await?);',\n \" Ok(())\",\n \"}\",\n ].join(\"\\n\");\n}\n\nfunction libcurl({ method, url, headers, body }: HttpRequest) {\n const entries = Object.entries(headers);\n return [\n \"#include <curl/curl.h>\",\n \"\",\n \"int main(void) {\",\n \" CURL *curl = curl_easy_init();\",\n \"\",\n ` curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, ${dq(method)});`,\n ` curl_easy_setopt(curl, CURLOPT_URL, ${dq(url)});`,\n \"\",\n \" struct curl_slist *headers = NULL;\",\n ...entries.map(([key, value]) => ` headers = curl_slist_append(headers, ${dq(`${key}: ${value}`)});`),\n \" curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\",\n ...(body !== undefined ? [\"\", ` curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ${dq(compact(body))});`] : []),\n \"\",\n \" CURLcode ret = curl_easy_perform(curl);\",\n \"\",\n \" curl_slist_free_all(headers);\",\n \" curl_easy_cleanup(curl);\",\n \" return (int) ret;\",\n \"}\",\n ].join(\"\\n\");\n}\n\nfunction powershell({ method, url, headers, body }: HttpRequest) {\n const entries = Object.entries(withoutContentType(headers));\n const contentType = contentTypeOf(headers);\n const lines: string[] = [];\n const args = [`-Uri ${psQuote(url)}`, `-Method ${method}`];\n\n if (entries.length) {\n lines.push(\"$headers = @{\", ...entries.map(([key, value]) => ` ${psQuote(key)} = ${psQuote(value)}`), \"}\");\n args.push(\"-Headers $headers\");\n }\n if (contentType) args.push(`-ContentType ${psQuote(contentType)}`);\n if (body !== undefined) {\n lines.push(`$body = @'\\n${body}\\n'@`);\n args.push(\"-Body $body\");\n }\n if (lines.length) lines.push(\"\");\n lines.push(`$response = Invoke-RestMethod ${args.join(\" \")}`, \"$response | ConvertTo-Json -Depth 10\");\n return lines.join(\"\\n\");\n}\n\nfunction rawHttp({ method, url, headers, body }: HttpRequest) {\n const target = parseUrl(url);\n const lines = [`${method} ${target.pathname}${target.search} HTTP/1.1`, `Host: ${target.host}`];\n for (const [key, value] of Object.entries(headers)) lines.push(`${key}: ${value}`);\n if (body !== undefined) lines.push(`Content-Length: ${new TextEncoder().encode(body).length}`, \"\", body);\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n\n// `highlight` is the tokenizer language in src/lib/highlight.js.\nconst LANGUAGES: SnippetLanguage[] = [\n {\n key: \"shell\",\n label: \"Shell\",\n highlight: \"shell\",\n clients: [\n { key: \"curl\", label: \"cURL\", build: curl },\n { key: \"wget\", label: \"Wget\", build: wget },\n { key: \"httpie\", label: \"HTTPie\", build: httpie },\n ],\n },\n {\n key: \"javascript\",\n label: \"JavaScript\",\n highlight: \"javascript\",\n clients: [\n { key: \"fetch\", label: \"fetch\", build: fetchClient },\n { key: \"axios\", label: \"Axios\", build: axios },\n { key: \"jquery\", label: \"jQuery\", build: jquery },\n { key: \"xhr\", label: \"XHR\", build: xhr },\n ],\n },\n {\n key: \"node\",\n label: \"Node.js\",\n highlight: \"javascript\",\n clients: [\n { key: \"fetch\", label: \"fetch\", build: fetchClient },\n { key: \"axios\", label: \"Axios\", build: axios },\n { key: \"undici\", label: \"undici\", build: undici },\n { key: \"http\", label: \"http\", build: nodeHttp },\n ],\n },\n {\n key: \"python\",\n label: \"Python\",\n highlight: \"python\",\n clients: [\n { key: \"requests\", label: \"requests\", build: pythonClient(\"requests\") },\n { key: \"httpx\", label: \"httpx\", build: pythonClient(\"httpx\") },\n { key: \"http.client\", label: \"http.client\", build: pythonHttpClient },\n ],\n },\n {\n key: \"php\",\n label: \"PHP\",\n highlight: \"php\",\n clients: [\n { key: \"curl\", label: \"cURL\", build: phpCurl },\n { key: \"guzzle\", label: \"Guzzle\", build: guzzle },\n ],\n },\n { key: \"go\", label: \"Go\", highlight: \"go\", clients: [{ key: \"native\", label: \"net/http\", build: go }] },\n {\n key: \"java\",\n label: \"Java\",\n highlight: \"java\",\n clients: [\n { key: \"httpclient\", label: \"HttpClient\", build: javaHttpClient },\n { key: \"okhttp\", label: \"OkHttp\", build: javaOkHttp },\n ],\n },\n { key: \"kotlin\", label: \"Kotlin\", highlight: \"kotlin\", clients: [{ key: \"okhttp\", label: \"OkHttp\", build: kotlinOkHttp }] },\n {\n key: \"csharp\",\n label: \"C#\",\n highlight: \"csharp\",\n clients: [\n { key: \"httpclient\", label: \"HttpClient\", build: csharpHttpClient },\n { key: \"restsharp\", label: \"RestSharp\", build: restSharp },\n ],\n },\n { key: \"ruby\", label: \"Ruby\", highlight: \"ruby\", clients: [{ key: \"native\", label: \"net/http\", build: ruby }] },\n { key: \"swift\", label: \"Swift\", highlight: \"swift\", clients: [{ key: \"urlsession\", label: \"URLSession\", build: swift }] },\n { key: \"dart\", label: \"Dart\", highlight: \"dart\", clients: [{ key: \"http\", label: \"http\", build: dart }] },\n { key: \"rust\", label: \"Rust\", highlight: \"rust\", clients: [{ key: \"reqwest\", label: \"reqwest\", build: rust }] },\n { key: \"c\", label: \"C\", highlight: \"c\", clients: [{ key: \"libcurl\", label: \"libcurl\", build: libcurl }] },\n {\n key: \"powershell\",\n label: \"PowerShell\",\n highlight: \"powershell\",\n clients: [{ key: \"restmethod\", label: \"Invoke-RestMethod\", build: powershell }],\n },\n { key: \"http\", label: \"HTTP\", highlight: \"http\", clients: [{ key: \"raw\", label: \"HTTP/1.1\", build: rawHttp }] },\n];\n\n// Requests with multipart parts (HttpRequest.form) use the multipart builders.\nexport const SNIPPET_LANGUAGES: SnippetLanguage[] = LANGUAGES.map((language) => ({\n ...language,\n clients: language.clients.map((client) => {\n const multipart = MULTIPART_BUILDERS[`${language.key}:${client.key}`];\n return { ...client, build: (request: HttpRequest) => (request.form && multipart ? multipart(request) : client.build(request)) };\n }),\n}));\n\n// Selection is stored as \"language:client\" (e.g. \"python:httpx\").\nexport function resolveSnippet(selection: unknown): { language: SnippetLanguage; client: SnippetLanguage[\"clients\"][number]; selection: string } {\n const [languageKey, clientKey] = String(selection ?? \"\").split(\":\");\n const language = SNIPPET_LANGUAGES.find((item) => item.key === languageKey) ?? SNIPPET_LANGUAGES[0];\n const client = language.clients.find((item) => item.key === clientKey) ?? language.clients[0];\n return { language, client, selection: `${language.key}:${client.key}` };\n}\n","import type { OpenAPIObject } from \"./types\";\n\n// Localized text for OpenAPI objects through the \"x-i18n\" extension:\n//\n// {\n// \"summary\": \"List users\",\n// \"x-i18n\": { \"tr\": { \"summary\": \"Kullanıcıları listele\" } }\n// }\n//\n// Works on any object with human-readable fields (info, tags, operations,\n// parameters, responses, schemas): the field is looked up for the UI locale,\n// then its base language (\"pt\" for \"pt-BR\"), and finally the plain field,\n// which holds the document's authored language. Markdown fields may also use\n// \":::lang\" blocks (markdown.ts); both can be combined.\n\nexport function localize(node: OpenAPIObject | null | undefined, field: string, locale?: string): any {\n const translations = node?.[\"x-i18n\"];\n if (translations && locale) {\n const target = String(locale).toLowerCase();\n const base = target.split(\"-\")[0];\n for (const [tag, values] of Object.entries(translations)) {\n const normalized = tag.toLowerCase().replace(\"_\", \"-\");\n if ((normalized === target || normalized === base) && typeof values?.[field] === \"string\") return values[field];\n }\n }\n return node?.[field];\n}\n","// Markdown parser for OpenAPI descriptions: a GitHub Flavored Markdown subset\n// that covers what API docs use in practice.\n//\n// Blocks: paragraphs, ATX headings, fenced code, blockquotes, thematic\n// breaks, (nested) ordered/unordered/task lists, GFM tables.\n// Inline: code spans, strong, emphasis, strikethrough, links, images,\n// autolinks (<https://…> and bare URLs), hard breaks, escapes.\n//\n// Extension: language blocks. Translations of the same content sit next to\n// each other and the viewer shows the one matching the UI language:\n//\n// :::lang en\n// English text\n// :::\n//\n// :::lang tr\n// Türkçe metin\n// :::\n//\n// A block may list several locales (\":::lang tr, az\"). Content outside\n// language blocks is shared by every language. See selectLocale().\n//\n// Raw HTML is never interpreted: it stays literal text. The output is a small\n// AST that components/markdown.jsx turns into React elements.\n\nimport type { InlineNode, ListItem, MarkdownBlock } from \"./types\";\n\ntype LangBlock = Extract<MarkdownBlock, { type: \"lang\" }>;\n\nconst FENCE = /^ {0,3}(`{3,}|~{3,})\\s*([^\\s`]*)[^`]*$/;\nconst LANG_OPEN = /^ {0,3}:{3,}[ \\t]*lang[ \\t]+([A-Za-z]{2,3}(?:[-_][A-Za-z0-9]+)*(?:[ \\t]*,[ \\t]*[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]+)*)*)[ \\t]*$/;\nconst CONTAINER_OPEN = /^ {0,3}:{3,}[ \\t]*\\S/;\nconst CONTAINER_CLOSE = /^ {0,3}:{3,}[ \\t]*$/;\nconst HEADING = /^ {0,3}(#{1,6})(?:[ \\t]+(.*?))?(?:[ \\t]+#+)?[ \\t]*$/;\nconst THEMATIC_BREAK = /^ {0,3}([-*_])(?:[ \\t]*\\1){2,}[ \\t]*$/;\nconst BLOCKQUOTE = /^ {0,3}> ?/;\nconst LIST_ITEM = /^( *)([-*+]|\\d{1,9}[.)])([ \\t]+|$)(.*)$/;\nconst TABLE_DELIMITER = /^ {0,3}\\|?[ \\t]*:?-+:?[ \\t]*(\\|[ \\t]*:?-+:?[ \\t]*)*\\|?[ \\t]*$/;\n\nconst isBlank = (line) => line.trim() === \"\";\nconst indentOf = (line) => line.match(/^ */)[0].length;\nconst expandTabs = (line) => line.replace(/\\t/g, \" \");\n\n// ---------------------------------------------------------------------------\n// Tables\n\nfunction splitRow(line) {\n let row = line.trim();\n if (row.startsWith(\"|\")) row = row.slice(1);\n if (row.endsWith(\"|\") && !row.endsWith(\"\\\\|\")) row = row.slice(0, -1);\n\n const cells: string[] = [];\n let current = \"\";\n let inCode = false;\n for (let index = 0; index < row.length; index += 1) {\n const char = row[index];\n if (char === \"\\\\\" && row[index + 1] === \"|\") {\n current += \"|\";\n index += 1;\n } else if (char === \"`\") {\n inCode = !inCode;\n current += char;\n } else if (char === \"|\" && !inCode) {\n cells.push(current.trim());\n current = \"\";\n } else {\n current += char;\n }\n }\n cells.push(current.trim());\n return cells;\n}\n\nfunction isTableStart(lines, index) {\n return (\n index + 1 < lines.length &&\n lines[index].includes(\"|\") &&\n TABLE_DELIMITER.test(lines[index + 1]) &&\n splitRow(lines[index]).length === splitRow(lines[index + 1]).length\n );\n}\n\nfunction parseTable(lines, index) {\n const header = splitRow(lines[index]);\n const align = splitRow(lines[index + 1]).map((cell): \"left\" | \"right\" | \"center\" | null => {\n const left = cell.startsWith(\":\");\n const right = cell.endsWith(\":\");\n return left && right ? \"center\" : right ? \"right\" : left ? \"left\" : null;\n });\n\n const rows: InlineNode[][][] = [];\n let next = index + 2;\n while (next < lines.length && !isBlank(lines[next]) && lines[next].includes(\"|\")) {\n const cells = splitRow(lines[next]);\n rows.push(header.map((_, column) => parseInline(cells[column] ?? \"\")));\n next += 1;\n }\n\n return {\n block: { type: \"table\" as const, align, header: header.map((cell) => parseInline(cell)), rows },\n next,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Lists\n\nfunction listMarker(line) {\n const match = LIST_ITEM.exec(line);\n if (!match) return null;\n const [, indent, marker, spacing, rest] = match;\n const ordered = /\\d/.test(marker);\n // A marker followed by 5+ spaces starts indented code; treat it as one space.\n const gap = spacing.length === 0 || spacing.length > 4 ? 1 : spacing.length;\n return {\n indent: indent.length,\n ordered,\n bullet: ordered ? marker.slice(-1) : marker,\n start: ordered ? Number.parseInt(marker, 10) : null,\n contentOffset: indent.length + marker.length + gap,\n firstLine: spacing.length > 4 ? `${\" \".repeat(spacing.length - 1)}${rest}` : rest,\n };\n}\n\nfunction parseList(lines, index) {\n const first = listMarker(lines[index])!;\n const items: ListItem[] = [];\n let loose = false;\n let next = index;\n\n while (next < lines.length) {\n const marker = listMarker(lines[next]);\n if (!marker || marker.ordered !== first.ordered || marker.bullet !== first.bullet || marker.indent >= first.contentOffset) break;\n\n const content = [marker.firstLine];\n next += 1;\n let sawBlank = false;\n\n while (next < lines.length) {\n const line = lines[next];\n if (isBlank(line)) {\n sawBlank = true;\n content.push(\"\");\n next += 1;\n continue;\n }\n if (indentOf(line) >= marker.contentOffset) {\n content.push(line.slice(marker.contentOffset));\n next += 1;\n continue;\n }\n // Lazy continuation of the item's paragraph.\n if (!sawBlank && !listMarker(line) && !startsBlock(lines, next)) {\n content.push(line.trim());\n next += 1;\n continue;\n }\n break;\n }\n\n while (content.length && isBlank(content[content.length - 1])) content.pop();\n if (sawBlank && next < lines.length && listMarker(lines[next])?.bullet === first.bullet) loose = true;\n if (content.some((line, lineIndex) => isBlank(line) && lineIndex < content.length - 1)) loose = true;\n\n let checked: boolean | null = null;\n const task = /^\\[([ xX])\\][ \\t]+/.exec(content[0]);\n if (task) {\n checked = task[1] !== \" \";\n content[0] = content[0].slice(task[0].length);\n }\n\n items.push({ checked, children: parseBlocks(content) });\n\n // A blank line followed by something that is not a sibling item ends the list.\n if (sawBlank && !(next < lines.length && listMarker(lines[next]))) break;\n }\n\n return {\n block: { type: \"list\" as const, ordered: first.ordered, start: first.start, loose, items },\n next,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Blocks\n\nfunction startsBlock(lines, index) {\n const line = lines[index];\n return (\n FENCE.test(line) ||\n LANG_OPEN.test(line) ||\n HEADING.test(line) ||\n THEMATIC_BREAK.test(line) ||\n BLOCKQUOTE.test(line) ||\n isTableStart(lines, index)\n );\n}\n\n// A list interrupts a paragraph only with a bullet or \"1.\" (CommonMark rule),\n// so \"2024. was a year\" inside a sentence stays text.\nfunction interruptsParagraph(lines, index) {\n if (startsBlock(lines, index)) return true;\n const marker = listMarker(lines[index]);\n return Boolean(marker && marker.firstLine.trim() && (!marker.ordered || marker.start === 1));\n}\n\nexport function parseBlocks(lines: string[]): MarkdownBlock[] {\n const blocks: MarkdownBlock[] = [];\n let index = 0;\n\n while (index < lines.length) {\n const line = lines[index];\n\n if (isBlank(line)) {\n index += 1;\n continue;\n }\n\n const fence = FENCE.exec(line);\n if (fence) {\n const [, marker, language] = fence;\n const indent = indentOf(line);\n const code: string[] = [];\n index += 1;\n while (index < lines.length) {\n const closing = lines[index].trim();\n if (closing.startsWith(marker[0].repeat(marker.length)) && /^[`~]+$/.test(closing)) break;\n code.push(lines[index].slice(Math.min(indent, indentOf(lines[index]))));\n index += 1;\n }\n index += 1;\n blocks.push({ type: \"code\", language: language.toLowerCase(), text: code.join(\"\\n\") });\n continue;\n }\n\n const lang = LANG_OPEN.exec(line);\n if (lang) {\n const inner: string[] = [];\n let depth = 1;\n index += 1;\n let inFence: string | null = null;\n while (index < lines.length) {\n const current = lines[index];\n const fence = FENCE.exec(current);\n if (fence && (!inFence || current.trim().startsWith(inFence))) inFence = inFence ? null : fence[1];\n if (!inFence) {\n if (CONTAINER_OPEN.test(current)) depth += 1;\n else if (CONTAINER_CLOSE.test(current) && --depth === 0) break;\n }\n inner.push(current);\n index += 1;\n }\n index += 1;\n blocks.push({\n type: \"lang\",\n locales: lang[1].split(\",\").map((item) => normalizeTag(item)),\n children: parseBlocks(inner),\n });\n continue;\n }\n\n const heading = HEADING.exec(line);\n if (heading) {\n blocks.push({ type: \"heading\", level: heading[1].length, children: parseInline(heading[2] ?? \"\") });\n index += 1;\n continue;\n }\n\n if (THEMATIC_BREAK.test(line)) {\n blocks.push({ type: \"hr\" });\n index += 1;\n continue;\n }\n\n if (BLOCKQUOTE.test(line)) {\n const quoted: string[] = [];\n while (index < lines.length && !isBlank(lines[index])) {\n quoted.push(lines[index].replace(BLOCKQUOTE, \"\"));\n index += 1;\n }\n blocks.push({ type: \"blockquote\", children: parseBlocks(quoted) });\n continue;\n }\n\n if (isTableStart(lines, index)) {\n const { block, next } = parseTable(lines, index);\n blocks.push(block);\n index = next;\n continue;\n }\n\n if (listMarker(line)) {\n const { block, next } = parseList(lines, index);\n blocks.push(block);\n index = next;\n continue;\n }\n\n const paragraph = [line.trim()];\n index += 1;\n while (index < lines.length && !isBlank(lines[index]) && !interruptsParagraph(lines, index)) {\n paragraph.push(lines[index].trim());\n index += 1;\n }\n // Keep hard-break markers (two trailing spaces / backslash) for parseInline.\n const raw = paragraph.map((text, lineIndex) => {\n const original = lines[index - paragraph.length + lineIndex];\n return / {2,}$/.test(original) ? `${text} ` : text;\n });\n blocks.push({ type: \"paragraph\", children: parseInline(raw.join(\"\\n\")) });\n }\n\n return blocks;\n}\n\n// ---------------------------------------------------------------------------\n// Inline\n\nconst PUNCTUATION = /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/;\nconst BARE_URL = /^https?:\\/\\/[^\\s<]*[^\\s<.,:;\"')\\]!?*_~]/;\nconst AUTOLINK = /^<((?:https?:\\/\\/|mailto:)[^\\s<>]+)>/;\n\n// Finds the matching \"]\" for a \"[\" at `start`, honouring nesting and escapes.\nfunction closingBracket(text, start) {\n let depth = 0;\n for (let index = start; index < text.length; index += 1) {\n const char = text[index];\n if (char === \"\\\\\") index += 1;\n else if (char === \"`\") {\n const end = text.indexOf(\"`\", index + 1);\n if (end !== -1) index = end;\n } else if (char === \"[\") depth += 1;\n else if (char === \"]\" && --depth === 0) return index;\n }\n return -1;\n}\n\n// Parses \"(destination \"title\")\" at `start`; returns null when malformed.\nfunction linkTarget(text, start) {\n if (text[start] !== \"(\") return null;\n let index = start + 1;\n while (text[index] === \" \") index += 1;\n\n let href = \"\";\n if (text[index] === \"<\") {\n const end = text.indexOf(\">\", index);\n if (end === -1) return null;\n href = text.slice(index + 1, end);\n index = end + 1;\n } else {\n let depth = 0;\n while (index < text.length) {\n const char = text[index];\n if (char === \"\\\\\" && PUNCTUATION.test(text[index + 1] ?? \"\")) {\n href += text[index + 1];\n index += 2;\n continue;\n }\n if (/\\s/.test(char)) break;\n if (char === \"(\") depth += 1;\n if (char === \")\") {\n if (depth === 0) break;\n depth -= 1;\n }\n href += char;\n index += 1;\n }\n }\n\n while (text[index] === \" \") index += 1;\n let title: string | undefined;\n const quote = text[index];\n if (quote === '\"' || quote === \"'\") {\n const end = text.indexOf(quote, index + 1);\n if (end === -1) return null;\n title = text.slice(index + 1, end);\n index = end + 1;\n while (text[index] === \" \") index += 1;\n }\n\n return text[index] === \")\" ? { href, title, end: index + 1 } : null;\n}\n\n// Closing delimiter for emphasis: not preceded by whitespace, and for single\n// \"*\"/\"_\" not part of a doubled run.\nfunction closingDelimiter(text, delimiter, from) {\n let index = from;\n while ((index = text.indexOf(delimiter, index)) !== -1) {\n const before = text[index - 1];\n const after = text[index + delimiter.length];\n const doubled = delimiter.length === 1 && (after === delimiter || before === delimiter);\n const escaped = before === \"\\\\\";\n const intraword = delimiter[0] === \"_\" && /\\w/.test(after ?? \"\");\n if (index > from && !/\\s/.test(before) && !doubled && !escaped && !intraword) return index;\n index += doubled ? 2 : 1;\n }\n return -1;\n}\n\nfunction pushText(nodes, value) {\n const last = nodes[nodes.length - 1];\n if (last?.type === \"text\") last.value += value;\n else nodes.push({ type: \"text\", value });\n}\n\n// `links: false` parses a link's label: links cannot nest in HTML, so\n// nested links and autolinks there stay plain text.\nexport function parseInline(text: string, { links = true }: { links?: boolean } = {}): InlineNode[] {\n const nodes: InlineNode[] = [];\n let index = 0;\n\n while (index < text.length) {\n const char = text[index];\n const rest = text.slice(index);\n\n // Escapes\n if (char === \"\\\\\" && PUNCTUATION.test(text[index + 1] ?? \"\")) {\n pushText(nodes, text[index + 1]);\n index += 2;\n continue;\n }\n\n // Hard breaks: two trailing spaces or a backslash before a newline.\n if (char === \"\\n\") {\n const hard = /( {2,}|\\\\)$/.test(text.slice(0, index));\n if (hard && nodes[nodes.length - 1]?.type === \"text\") {\n const last = nodes[nodes.length - 1] as { type: \"text\"; value: string };\n last.value = last.value.replace(/( {2,}|\\\\)$/, \"\");\n }\n if (hard) nodes.push({ type: \"br\" });\n else pushText(nodes, \" \");\n index += 1;\n continue;\n }\n\n // Code spans: a run of N backticks closed by exactly N backticks.\n if (char === \"`\") {\n const run = /^`+/.exec(rest)![0];\n const closing = new RegExp(`(?<!\\`)${run}(?!\\`)`, \"g\");\n closing.lastIndex = index + run.length;\n const match = closing.exec(text);\n if (match) {\n let value = text.slice(index + run.length, match.index).replace(/\\n/g, \" \");\n if (/^ .* $/.test(value) && value.trim()) value = value.slice(1, -1);\n nodes.push({ type: \"code\", value });\n index = match.index + run.length;\n } else {\n pushText(nodes, run);\n index += run.length;\n }\n continue;\n }\n\n // Images and links\n if ((links && char === \"[\") || (char === \"!\" && text[index + 1] === \"[\")) {\n const image = char === \"!\";\n const open = image ? index + 1 : index;\n const close = closingBracket(text, open);\n const target = close !== -1 ? linkTarget(text, close + 1) : null;\n if (target) {\n const label = text.slice(open + 1, close);\n nodes.push(\n image\n ? { type: \"image\", src: target.href, alt: label, title: target.title }\n : { type: \"link\", href: target.href, title: target.title, children: parseInline(label, { links: false }) },\n );\n index = target.end;\n continue;\n }\n }\n\n // Autolinks\n const autolink = links && char === \"<\" ? AUTOLINK.exec(rest) : null;\n if (autolink) {\n nodes.push({ type: \"link\", href: autolink[1], children: [{ type: \"text\", value: autolink[1].replace(/^mailto:/, \"\") }] });\n index += autolink[0].length;\n continue;\n }\n if (links && char === \"h\" && !/\\w/.test(text[index - 1] ?? \"\")) {\n const url = BARE_URL.exec(rest);\n if (url) {\n nodes.push({ type: \"link\", href: url[0], children: [{ type: \"text\", value: url[0] }] });\n index += url[0].length;\n continue;\n }\n }\n\n // Strong, strikethrough, emphasis\n const delimiter = [\"**\", \"__\", \"~~\"].find((item) => rest.startsWith(item)) ?? (char === \"*\" || char === \"_\" ? char : null);\n const leftFlanking = delimiter && rest[delimiter.length] && !/\\s/.test(rest[delimiter.length]);\n const wordBefore = /\\w/.test(text[index - 1] ?? \"\");\n if (delimiter && leftFlanking && !(delimiter[0] === \"_\" && wordBefore)) {\n const end = closingDelimiter(text, delimiter, index + delimiter.length);\n if (end !== -1) {\n const type = delimiter === \"~~\" ? \"del\" : delimiter.length === 2 ? \"strong\" : \"em\";\n nodes.push({ type, children: parseInline(text.slice(index + delimiter.length, end), { links }) });\n index = end + delimiter.length;\n continue;\n }\n }\n\n pushText(nodes, delimiter && !leftFlanking ? delimiter : char);\n index += delimiter && !leftFlanking ? delimiter.length : 1;\n }\n\n return nodes;\n}\n\nfunction normalizeTag(tag) {\n return tag.trim().replace(\"_\", \"-\").toLowerCase();\n}\n\n// Does a block written for `tag` (\"pt-br\") serve the UI `locale` (\"pt\")?\nfunction matches(tag, locale) {\n return tag === locale || tag.split(\"-\")[0] === locale.split(\"-\")[0];\n}\n\n// Resolves language blocks for one locale. Consecutive lang blocks (blank\n// lines between them are fine) are alternatives of the same content: the one\n// for `locale` wins, then the first fallback locale, then the first block.\n// Returns plain blocks, each chosen group wrapped as { type: \"lang-selected\" }\n// so the renderer can set lang=\"…\" on it.\nexport function selectLocale(blocks: MarkdownBlock[], locale: string, fallbacks: string[] = [\"en\"]): MarkdownBlock[] {\n const result: MarkdownBlock[] = [];\n let index = 0;\n\n while (index < blocks.length) {\n const block = blocks[index];\n if (block.type !== \"lang\") {\n result.push(block);\n index += 1;\n continue;\n }\n\n const group: LangBlock[] = [];\n while (index < blocks.length && blocks[index].type === \"lang\") group.push(blocks[index++] as LangBlock);\n\n const target = normalizeTag(locale);\n const chosen =\n group.find((item) => item.locales.some((tag) => tag === target)) ??\n group.find((item) => item.locales.some((tag) => matches(tag, target))) ??\n fallbacks.map((fallback) => group.find((item) => item.locales.some((tag) => matches(tag, normalizeTag(fallback))))).find(Boolean) ??\n group[0];\n\n result.push({\n type: \"lang-selected\",\n locale: chosen.locales.find((tag) => matches(tag, target)) ?? chosen.locales[0],\n children: selectLocale(chosen.children, locale, fallbacks),\n });\n }\n\n return result;\n}\n\nexport function parseMarkdown(source: unknown): MarkdownBlock[] {\n if (!source) return [];\n return parseBlocks(expandTabs(String(source).replace(/\\r\\n?/g, \"\\n\")).split(\"\\n\"));\n}\n\n// Only these URL schemes become links/images; anything else (javascript:,\n// data:, vbscript:…) is rendered as plain text.\nexport function safeUrl(url: unknown, { image = false }: { image?: boolean } = {}): string | null {\n const value = String(url ?? \"\").trim();\n if (/^(https?:|\\/(?!\\/)|#|\\.{1,2}\\/)/i.test(value)) return value;\n if (!image && /^mailto:/i.test(value)) return value;\n if (!/^[a-z][a-z0-9+.-]*:/i.test(value) && !value.startsWith(\"//\")) return value;\n return null;\n}\n","import type { Token } from \"./types\";\n\ntype Rule = [string, RegExp];\n\n// Small regex tokenizer for the languages the docs render. Returns a list of\n// { type, text } tokens; `type` null means plain text. Rules are tried in\n// order at each position, so earlier rules win (e.g. comments before strings).\n\nconst STRING_DOUBLE = /\"(?:\\\\.|[^\"\\\\\\n])*\"/y;\nconst STRING_SINGLE = /'(?:\\\\.|[^'\\\\])*'/y;\nconst NUMBER = /-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/y;\n\nconst words = (list: string[]) => new RegExp(`\\\\b(?:${list.join(\"|\")})\\\\b`, \"y\");\n\nconst LANGUAGES: Record<string, Rule[]> = {\n json: [\n [\"key\", /\"(?:\\\\.|[^\"\\\\\\n])*\"(?=\\s*:)/y],\n [\"string\", STRING_DOUBLE],\n [\"number\", NUMBER],\n [\"literal\", words([\"true\", \"false\", \"null\"])],\n ],\n shell: [\n [\"comment\", /#[^\\n]*/y],\n // No escapes inside single quotes in shell; '\\'' closes the string, adds\n // an escaped quote and reopens, so the backslash escape is its own token.\n [\"string\", /\\\\./y],\n [\"string\", /'[^']*'/y],\n [\"string\", STRING_DOUBLE],\n [\"keyword\", /(?<![\\w-])(?:curl|wget|http|printf)\\b/y],\n [\"attr\", /(?<![\\w-])--?[a-zA-Z][\\w-]*/y],\n [\"variable\", /\\$\\{?\\w+\\}?/y],\n ],\n javascript: [\n [\"comment\", /\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//y],\n [\"string\", /`(?:\\\\.|[^`\\\\])*`/y],\n [\"key\", /\"(?:\\\\.|[^\"\\\\\\n])*\"(?=\\s*:)/y],\n [\"string\", STRING_DOUBLE],\n [\"string\", STRING_SINGLE],\n [\"key\", /\\b[A-Za-z_$][\\w$]*(?=\\s*:(?!:))/y],\n [\"keyword\", words([\"const\", \"let\", \"var\", \"await\", \"async\", \"function\", \"return\", \"new\", \"if\", \"else\", \"import\", \"from\", \"export\"])],\n [\"literal\", words([\"true\", \"false\", \"null\", \"undefined\"])],\n [\"function\", /\\b[A-Za-z_$][\\w$]*(?=\\s*\\()/y],\n [\"number\", NUMBER],\n ],\n php: [\n [\"comment\", /\\/\\/[^\\n]*|#[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//y],\n [\"keyword\", /<\\?php|\\?>/y],\n [\"string\", STRING_DOUBLE],\n [\"string\", STRING_SINGLE],\n [\"variable\", /\\$\\w+/y],\n [\"constant\", /\\b[A-Z][A-Z0-9_]{2,}\\b/y],\n [\"keyword\", words([\"echo\", \"return\", \"new\", \"function\", \"if\", \"else\", \"use\", \"array\"])],\n [\"literal\", words([\"true\", \"false\", \"null\"])],\n [\"function\", /\\b[A-Za-z_]\\w*(?=\\s*\\()/y],\n [\"number\", NUMBER],\n ],\n python: [\n [\"comment\", /#[^\\n]*/y],\n [\"string\", STRING_DOUBLE],\n [\"string\", STRING_SINGLE],\n [\"keyword\", words([\"import\", \"from\", \"as\", \"def\", \"return\", \"if\", \"else\", \"for\", \"in\", \"print\", \"with\"])],\n [\"literal\", words([\"True\", \"False\", \"None\"])],\n [\"attr\", /\\b[a-z_]\\w*(?==)/y],\n [\"function\", /\\b[A-Za-z_]\\w*(?=\\s*\\()/y],\n [\"number\", NUMBER],\n ],\n};\n\nconst C_COMMENT = /\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//y;\nconst TRIPLE_DOUBLE = /\"\"\"[\\s\\S]*?\"\"\"/y;\nconst TYPE = /\\b[A-Z][a-z]\\w*\\b/y;\nconst CALL = /\\b[A-Za-z_]\\w*(?=\\s*\\()/y;\n\n// Shared shape for C-family languages; `strings` go first so raw/multi-line\n// literals win over the plain double-quoted rule.\nfunction cFamily({\n keywords,\n literals = [\"true\", \"false\", \"null\"],\n strings = [],\n extra = [],\n}: {\n keywords: string[];\n literals?: string[];\n strings?: RegExp[];\n extra?: Rule[];\n}): Rule[] {\n return [\n [\"comment\", C_COMMENT],\n ...strings.map((regex): Rule => [\"string\", regex]),\n [\"string\", STRING_DOUBLE],\n [\"string\", STRING_SINGLE],\n ...extra,\n [\"keyword\", words(keywords)],\n [\"literal\", words(literals)],\n [\"function\", CALL],\n [\"type\", TYPE],\n [\"number\", NUMBER],\n ];\n}\n\nObject.assign(LANGUAGES, {\n go: cFamily({\n keywords: [\"package\", \"import\", \"func\", \"var\", \"const\", \"if\", \"else\", \"return\", \"defer\", \"for\", \"range\", \"type\", \"struct\", \"go\", \"map\", \"chan\"],\n literals: [\"true\", \"false\", \"nil\"],\n strings: [/`[^`]*`/y],\n }),\n java: cFamily({\n keywords: [\"import\", \"package\", \"new\", \"public\", \"private\", \"class\", \"static\", \"void\", \"final\", \"var\", \"return\", \"throws\", \"try\", \"catch\"],\n strings: [TRIPLE_DOUBLE],\n }),\n kotlin: cFamily({\n keywords: [\"import\", \"val\", \"var\", \"fun\", \"return\", \"if\", \"else\", \"class\", \"object\"],\n strings: [TRIPLE_DOUBLE],\n }),\n csharp: cFamily({\n keywords: [\"using\", \"var\", \"new\", \"await\", \"async\", \"return\", \"public\", \"class\", \"static\", \"void\"],\n strings: [TRIPLE_DOUBLE],\n }),\n swift: cFamily({\n keywords: [\"import\", \"let\", \"var\", \"try\", \"await\", \"func\", \"return\", \"if\", \"else\"],\n literals: [\"true\", \"false\", \"nil\"],\n strings: [TRIPLE_DOUBLE],\n }),\n dart: cFamily({\n keywords: [\"import\", \"as\", \"final\", \"var\", \"void\", \"async\", \"await\", \"return\"],\n strings: [/r?'''[\\s\\S]*?'''/y],\n }),\n rust: cFamily({\n keywords: [\"use\", \"let\", \"mut\", \"fn\", \"async\", \"await\", \"pub\", \"struct\", \"impl\", \"match\", \"return\"],\n strings: [/r(#+)\"[\\s\\S]*?\"\\1/y],\n extra: [\n [\"attr\", /#\\[[^\\]]*\\]/y],\n [\"function\", /\\b[a-z_]\\w*!/y],\n ],\n }),\n c: cFamily({\n keywords: [\"int\", \"char\", \"void\", \"struct\", \"return\", \"if\", \"else\", \"const\", \"static\"],\n literals: [\"NULL\"],\n extra: [\n [\"keyword\", /#\\w+(?:\\s+<[^>\\n]*>)?/y],\n [\"constant\", /\\b[A-Z][A-Z0-9_]{2,}\\b/y],\n ],\n }),\n ruby: [\n [\"comment\", /#[^\\n]*/y],\n [\"string\", STRING_DOUBLE],\n [\"string\", STRING_SINGLE],\n [\"literal\", /:\\w+/y],\n [\"keyword\", words([\"require\", \"def\", \"end\", \"do\", \"if\", \"else\", \"puts\", \"return\", \"new\"])],\n [\"literal\", words([\"true\", \"false\", \"nil\"])],\n [\"type\", TYPE],\n [\"number\", NUMBER],\n ],\n powershell: [\n [\"comment\", /#[^\\n]*/y],\n [\"string\", /@'[\\s\\S]*?'@|@\"[\\s\\S]*?\"@/y],\n [\"string\", /'(?:''|[^'])*'/y],\n [\"string\", STRING_DOUBLE],\n [\"literal\", /\\$(?:true|false|null)\\b/y],\n [\"variable\", /\\$\\w+/y],\n [\"function\", /\\b[A-Z][a-z]+-[A-Z][A-Za-z]+\\b/y],\n [\"attr\", /(?<![\\w-])-[A-Za-z]+/y],\n [\"number\", NUMBER],\n ],\n // Request line, header names, then JSON-ish body tokens.\n http: [\n [\"keyword\", /^[A-Z]+(?= \\S+ HTTP\\/)/my],\n [\"attr\", /HTTP\\/\\d(?:\\.\\d)?/y],\n [\"key\", /^[\\w-]+(?=:)/my],\n [\"key\", /\"(?:\\\\.|[^\"\\\\\\n])*\"(?=\\s*:)/y],\n [\"string\", STRING_DOUBLE],\n [\"literal\", words([\"true\", \"false\", \"null\"])],\n [\"number\", NUMBER],\n ],\n});\n\nLANGUAGES.curl = LANGUAGES.shell;\n\nexport function tokenize(code: string, language: string): Token[] {\n const rules = LANGUAGES[language];\n if (!rules) return [{ type: null, text: code }];\n\n const tokens: Token[] = [];\n let plain = \"\";\n let index = 0;\n\n outer: while (index < code.length) {\n for (const [type, regex] of rules) {\n regex.lastIndex = index;\n const match = regex.exec(code);\n if (match && match[0].length > 0) {\n if (plain) {\n tokens.push({ type: null, text: plain });\n plain = \"\";\n }\n tokens.push({ type, text: match[0] });\n index += match[0].length;\n continue outer;\n }\n }\n // Skip whole identifiers at once so rules never match mid-word.\n const word = /[\\w$]+|[^\\w$]/y;\n word.lastIndex = index;\n const chunk = word.exec(code)![0];\n plain += chunk;\n index += chunk.length;\n }\n if (plain) tokens.push({ type: null, text: plain });\n return tokens;\n}\n","// Applying security schemes (components.securitySchemes) to requests.\n//\n// An operation's `security` is a list of alternatives; each alternative is a\n// set of schemes that must all be present (OR of ANDs). `{}` makes auth\n// optional. Credentials are what the reader entered, per scheme name.\n\nimport type { HttpRequest, OpenAPIObject, Operation } from \"./types\";\n\nexport interface Credential {\n /** Bearer / http token, API key or OAuth2 / OpenID Connect access token. */\n token?: string;\n username?: string;\n password?: string;\n clientId?: string;\n clientSecret?: string;\n /** Space-separated OAuth2 scopes for token requests. */\n scopes?: string;\n}\n\nexport type Credentials = Record<string, Credential>;\n\nexport interface AuthParts {\n headers: Record<string, string>;\n query: Record<string, string>;\n cookies: Record<string, string>;\n}\n\nexport interface SecurityRequirement {\n /** Scheme names that must all be present. Empty: auth optional. */\n schemes: string[];\n scopes: Record<string, string[]>;\n}\n\n/** The operation's requirements (alternatives), from its own or the global `security`. */\nexport function securityRequirements(operation: Pick<Operation, \"security\">): SecurityRequirement[] {\n return (operation.security ?? []).map((requirement) => ({\n schemes: Object.keys(requirement),\n scopes: requirement as Record<string, string[]>,\n }));\n}\n\nfunction base64(text: string): string {\n let binary = \"\";\n for (const byte of new TextEncoder().encode(text)) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nexport function hasCredential(scheme: OpenAPIObject | undefined, credential: Credential | undefined): boolean {\n if (!scheme || !credential) return false;\n if (scheme.type === \"http\" && String(scheme.scheme).toLowerCase() === \"basic\") return Boolean(credential.username || credential.password);\n return Boolean(credential.token);\n}\n\nfunction applyScheme(parts: AuthParts, scheme: OpenAPIObject, credential: Credential) {\n if (scheme.type === \"http\") {\n const kind = String(scheme.scheme ?? \"\").toLowerCase();\n if (kind === \"basic\") parts.headers.Authorization = `Basic ${base64(`${credential.username ?? \"\"}:${credential.password ?? \"\"}`)}`;\n else if (kind === \"bearer\") parts.headers.Authorization = `Bearer ${credential.token}`;\n else parts.headers.Authorization = `${scheme.scheme} ${credential.token}`;\n } else if (scheme.type === \"apiKey\") {\n const target = scheme.in === \"query\" ? parts.query : scheme.in === \"cookie\" ? parts.cookies : parts.headers;\n target[scheme.name] = credential.token ?? \"\";\n } else if (scheme.type === \"oauth2\" || scheme.type === \"openIdConnect\") {\n parts.headers.Authorization = `Bearer ${credential.token}`;\n }\n}\n\n/**\n * Headers, query parameters and cookies for an operation: the first\n * requirement whose schemes all have credentials wins. Nothing is applied\n * when no requirement can be met.\n */\nexport function applySecurity(\n schemes: Record<string, OpenAPIObject>,\n requirements: SecurityRequirement[],\n credentials: Credentials,\n): AuthParts {\n const parts: AuthParts = { headers: {}, query: {}, cookies: {} };\n const usable = requirements.find(\n (requirement) => requirement.schemes.length > 0 && requirement.schemes.every((name) => hasCredential(schemes[name], credentials[name])),\n );\n for (const name of usable?.schemes ?? []) applyScheme(parts, schemes[name], credentials[name]);\n return parts;\n}\n\n/** Short description of a scheme for labels: \"Bearer\", \"API key (header: X-Key)\"… */\nexport function describeScheme(scheme: OpenAPIObject): string {\n if (scheme.type === \"http\") {\n const kind = String(scheme.scheme ?? \"\");\n return kind.toLowerCase() === \"bearer\" ? `Bearer${scheme.bearerFormat ? ` (${scheme.bearerFormat})` : \"\"}` : `HTTP ${kind}`;\n }\n if (scheme.type === \"apiKey\") return `API key (${scheme.in}: ${scheme.name})`;\n if (scheme.type === \"oauth2\") return `OAuth 2.0 (${Object.keys(scheme.flows ?? {}).join(\", \")})`;\n if (scheme.type === \"openIdConnect\") return \"OpenID Connect\";\n if (scheme.type === \"mutualTLS\") return \"Mutual TLS\";\n return String(scheme.type ?? \"\");\n}\n\n/** OAuth2 flows a viewer can complete itself (no browser redirect). */\nexport const TOKEN_FLOWS = [\"clientCredentials\", \"password\"] as const;\n\n/** Token request (RFC 6749 §4.3 / §4.4) for a clientCredentials or password flow. */\nexport function buildTokenRequest(flowName: (typeof TOKEN_FLOWS)[number], flow: OpenAPIObject, credential: Credential): HttpRequest {\n const params = new URLSearchParams({ grant_type: flowName === \"password\" ? \"password\" : \"client_credentials\" });\n if (flowName === \"password\") {\n params.set(\"username\", credential.username ?? \"\");\n params.set(\"password\", credential.password ?? \"\");\n }\n if (credential.scopes?.trim()) params.set(\"scope\", credential.scopes.trim());\n\n const headers: Record<string, string> = { \"Content-Type\": \"application/x-www-form-urlencoded\", Accept: \"application/json\" };\n if (credential.clientId) headers.Authorization = `Basic ${base64(`${credential.clientId}:${credential.clientSecret ?? \"\"}`)}`;\n\n return { method: \"POST\", url: String(flow.tokenUrl ?? \"\"), headers, body: params.toString() };\n}\n","// Swagger 2.0 → OpenAPI 3.0 conversion, so the viewer only deals with one\n// document shape. Covers what real-world 2.0 documents use: servers from\n// host/basePath/schemes, body and formData parameters → requestBody,\n// definitions/parameters/responses → components, security definitions,\n// $ref paths, collectionFormat, x-nullable and file uploads.\n\nimport type { OpenAPIDocument, OpenAPIObject } from \"./types\";\n\nconst REF_PREFIXES: [string, string][] = [\n [\"#/definitions/\", \"#/components/schemas/\"],\n [\"#/responses/\", \"#/components/responses/\"],\n];\n\nconst SCHEMA_KEYS = [\n \"format\",\n \"items\",\n \"enum\",\n \"default\",\n \"minimum\",\n \"maximum\",\n \"exclusiveMinimum\",\n \"exclusiveMaximum\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"minItems\",\n \"maxItems\",\n \"uniqueItems\",\n \"multipleOf\",\n];\n\nconst FORM_TYPES = [\"application/x-www-form-urlencoded\", \"multipart/form-data\"];\n\nfunction convertRef(ref: string, bodyParameters: Set<string>): string {\n if (ref.startsWith(\"#/parameters/\")) {\n const name = ref.slice(\"#/parameters/\".length);\n return bodyParameters.has(name) ? `#/components/requestBodies/${name}` : `#/components/parameters/${name}`;\n }\n for (const [from, to] of REF_PREFIXES) if (ref.startsWith(from)) return to + ref.slice(from.length);\n return ref;\n}\n\nexport function convertSchema(schema: any): any {\n if (!schema || typeof schema !== \"object\") return schema;\n if (Array.isArray(schema)) return schema.map(convertSchema);\n\n const result: OpenAPIObject = {};\n for (const [key, value] of Object.entries(schema)) {\n switch (key) {\n case \"$ref\":\n result.$ref = convertRef(String(value), new Set());\n break;\n case \"x-nullable\":\n if (value) result.nullable = true;\n break;\n case \"discriminator\":\n result.discriminator = typeof value === \"string\" ? { propertyName: value } : value;\n break;\n case \"properties\":\n case \"patternProperties\":\n result[key] = Object.fromEntries(Object.entries(value as object).map(([name, child]) => [name, convertSchema(child)]));\n break;\n case \"items\":\n case \"additionalProperties\":\n case \"not\":\n result[key] = typeof value === \"object\" ? convertSchema(value) : value;\n break;\n case \"allOf\":\n case \"anyOf\":\n case \"oneOf\":\n result[key] = (value as unknown[]).map(convertSchema);\n break;\n default:\n result[key] = value;\n }\n }\n if (result.type === \"file\") {\n result.type = \"string\";\n result.format = \"binary\";\n }\n return result;\n}\n\n// Non-body parameter: type/format/items… move into `schema`.\nfunction convertParameter(parameter: OpenAPIObject): OpenAPIObject {\n const { type, collectionFormat, \"x-example\": example, allowEmptyValue, ...rest } = parameter;\n const schema: OpenAPIObject = type === \"file\" ? { type: \"string\", format: \"binary\" } : { type };\n const result: OpenAPIObject = {};\n\n for (const [key, value] of Object.entries(rest)) {\n if (SCHEMA_KEYS.includes(key)) schema[key] = key === \"items\" ? convertSchema(value) : value;\n else result[key] = value;\n }\n result.schema = convertSchema(schema);\n if (example !== undefined) result.example = example;\n if (allowEmptyValue) result.allowEmptyValue = true;\n\n if (type === \"array\") {\n const format = collectionFormat ?? \"csv\";\n if (format === \"multi\") Object.assign(result, { style: \"form\", explode: true });\n else if (format === \"ssv\") Object.assign(result, { style: \"spaceDelimited\", explode: false });\n else if (format === \"pipes\") Object.assign(result, { style: \"pipeDelimited\", explode: false });\n else Object.assign(result, { style: parameter.in === \"query\" || parameter.in === \"cookie\" ? \"form\" : \"simple\", explode: false });\n }\n return result;\n}\n\nfunction bodyContent(schema: unknown, types: string[], description?: string, required?: boolean) {\n const body: OpenAPIObject = { content: Object.fromEntries(types.map((type) => [type, { schema: convertSchema(schema) }])) };\n if (description) body.description = description;\n if (required) body.required = true;\n return body;\n}\n\n// formData parameters become one object schema in a form request body.\nfunction formBody(parameters: OpenAPIObject[], consumes: string[]) {\n const types = consumes.filter((type) => FORM_TYPES.includes(type));\n const hasFile = parameters.some((parameter) => parameter.type === \"file\");\n const contentTypes = types.length ? types : [hasFile ? \"multipart/form-data\" : \"application/x-www-form-urlencoded\"];\n const schema: OpenAPIObject = { type: \"object\", properties: {} };\n const required: string[] = [];\n\n for (const parameter of parameters) {\n const { schema: propertySchema } = convertParameter({ ...parameter, in: \"query\" });\n if (parameter.description) propertySchema.description = parameter.description;\n schema.properties[parameter.name] = propertySchema;\n if (parameter.required) required.push(parameter.name);\n }\n if (required.length) schema.required = required;\n return { content: Object.fromEntries(contentTypes.map((type) => [type, { schema }])) };\n}\n\nfunction convertResponse(response: OpenAPIObject, produces: string[]): OpenAPIObject {\n if (response.$ref) return { $ref: convertRef(response.$ref, new Set()) };\n const { schema, examples, headers, ...rest } = response;\n const result: OpenAPIObject = { ...rest, description: rest.description ?? \"\" };\n\n if (headers) {\n result.headers = Object.fromEntries(\n Object.entries(headers as Record<string, OpenAPIObject>).map(([name, header]) => {\n const { schema: headerSchema, description } = convertParameter({ ...header, in: \"header\" });\n return [name, { ...(description ? { description } : {}), schema: headerSchema }];\n }),\n );\n }\n if (schema) {\n const types = produces.length ? produces : [\"application/json\"];\n result.content = Object.fromEntries(\n types.map((type) => [type, { schema: convertSchema(schema), ...(examples?.[type] !== undefined ? { example: examples[type] } : {}) }]),\n );\n }\n return result;\n}\n\nfunction convertSecurityScheme(scheme: OpenAPIObject): OpenAPIObject {\n const description = scheme.description ? { description: scheme.description } : {};\n if (scheme.type === \"basic\") return { type: \"http\", scheme: \"basic\", ...description };\n if (scheme.type === \"apiKey\") return { type: \"apiKey\", name: scheme.name, in: scheme.in, ...description };\n if (scheme.type === \"oauth2\") {\n const scopes = scheme.scopes ?? {};\n const flow =\n {\n implicit: { implicit: { authorizationUrl: scheme.authorizationUrl, scopes } },\n password: { password: { tokenUrl: scheme.tokenUrl, scopes } },\n application: { clientCredentials: { tokenUrl: scheme.tokenUrl, scopes } },\n accessCode: { authorizationCode: { authorizationUrl: scheme.authorizationUrl, tokenUrl: scheme.tokenUrl, scopes } },\n }[scheme.flow as string] ?? {};\n return { type: \"oauth2\", flows: flow, ...description };\n }\n return { ...scheme };\n}\n\nconst resolveParameter = (doc: OpenAPIObject, parameter: OpenAPIObject): OpenAPIObject =>\n parameter.$ref?.startsWith(\"#/parameters/\") ? doc.parameters?.[parameter.$ref.slice(\"#/parameters/\".length)] ?? parameter : parameter;\n\n/** Converts a Swagger 2.0 document to OpenAPI 3.0.3. */\nexport function convertSwagger2(doc: OpenAPIObject): OpenAPIDocument {\n const bodyParameters = new Set(\n Object.entries(doc.parameters ?? {})\n .filter(([, parameter]: [string, any]) => parameter.in === \"body\")\n .map(([name]) => name),\n );\n const globalConsumes: string[] = doc.consumes ?? [\"application/json\"];\n const globalProduces: string[] = doc.produces ?? [\"application/json\"];\n\n const schemes: string[] = doc.schemes?.length ? doc.schemes : [\"https\"];\n const servers = doc.host\n ? schemes.map((scheme) => ({ url: `${scheme}://${doc.host}${doc.basePath ?? \"\"}` }))\n : [{ url: doc.basePath ?? \"/\" }];\n\n const components: OpenAPIObject = {};\n if (doc.definitions) {\n components.schemas = Object.fromEntries(Object.entries(doc.definitions).map(([name, schema]) => [name, convertSchema(schema)]));\n }\n if (doc.parameters) {\n for (const [name, parameter] of Object.entries(doc.parameters as Record<string, OpenAPIObject>)) {\n if (parameter.in === \"body\") {\n (components.requestBodies ??= {})[name] = bodyContent(parameter.schema, globalConsumes, parameter.description, parameter.required);\n } else if (parameter.in !== \"formData\") {\n (components.parameters ??= {})[name] = convertParameter(parameter);\n }\n }\n }\n if (doc.responses) {\n components.responses = Object.fromEntries(\n Object.entries(doc.responses as Record<string, OpenAPIObject>).map(([name, response]) => [name, convertResponse(response, globalProduces)]),\n );\n }\n if (doc.securityDefinitions) {\n components.securitySchemes = Object.fromEntries(\n Object.entries(doc.securityDefinitions as Record<string, OpenAPIObject>).map(([name, scheme]) => [name, convertSecurityScheme(scheme)]),\n );\n }\n\n const paths: Record<string, OpenAPIObject> = {};\n for (const [path, item] of Object.entries((doc.paths ?? {}) as Record<string, OpenAPIObject>)) {\n const pathParameters: OpenAPIObject[] = item.parameters ?? [];\n const pathItem: OpenAPIObject = {};\n\n for (const [key, value] of Object.entries(item)) {\n if (key === \"parameters\" || typeof value !== \"object\" || ![\"get\", \"put\", \"post\", \"delete\", \"options\", \"head\", \"patch\"].includes(key)) {\n if (key !== \"parameters\") pathItem[key] = value;\n continue;\n }\n const operation = value as OpenAPIObject;\n const { parameters = [], consumes, produces, responses = {}, ...rest } = operation;\n const opConsumes: string[] = consumes ?? globalConsumes;\n const opProduces: string[] = produces ?? globalProduces;\n const converted: OpenAPIObject = { ...rest };\n\n // Operation parameters override path-level ones with the same name + location.\n const merged = new Map<string, OpenAPIObject>();\n for (const raw of [...pathParameters, ...parameters]) {\n const resolved = resolveParameter(doc, raw);\n merged.set(`${resolved.in}:${resolved.name}`, raw);\n }\n\n const formData: OpenAPIObject[] = [];\n const outParameters: OpenAPIObject[] = [];\n for (const raw of merged.values()) {\n const resolved = resolveParameter(doc, raw);\n if (resolved.in === \"body\") {\n converted.requestBody = raw.$ref\n ? { $ref: convertRef(raw.$ref, bodyParameters) }\n : bodyContent(resolved.schema, opConsumes.filter((type) => !FORM_TYPES.includes(type)).length ? opConsumes.filter((type) => !FORM_TYPES.includes(type)) : [\"application/json\"], resolved.description, resolved.required);\n } else if (resolved.in === \"formData\") {\n formData.push(resolved);\n } else {\n outParameters.push(raw.$ref ? { $ref: convertRef(raw.$ref, bodyParameters) } : convertParameter(raw));\n }\n }\n if (formData.length) converted.requestBody = formBody(formData, opConsumes);\n if (outParameters.length) converted.parameters = outParameters;\n\n converted.responses = Object.fromEntries(\n Object.entries(responses as Record<string, OpenAPIObject>).map(([status, response]) => [status, convertResponse(response, opProduces)]),\n );\n pathItem[key] = converted;\n }\n paths[path] = pathItem;\n }\n\n const result: OpenAPIDocument = { openapi: \"3.0.3\", info: doc.info ?? { title: \"API\", version: \"\" }, servers, paths };\n for (const key of [\"tags\", \"security\", \"externalDocs\"]) if (doc[key] !== undefined) result[key] = doc[key];\n for (const [key, value] of Object.entries(doc)) if (key.startsWith(\"x-\")) result[key] = value;\n if (Object.keys(components).length) result.components = components;\n return result;\n}\n","// Turns spec text (JSON or YAML) into an OpenAPI 3.x document the viewer can\n// render, converting Swagger 2.0 on the way.\n\nimport { parse as parseYaml } from \"yaml\";\nimport { convertSwagger2 } from \"./convert\";\nimport { resolveExternalRefs, type ExternalRefOptions } from \"./external\";\nimport type { OpenAPIDocument } from \"./types\";\n\n/** Parses JSON, falling back to YAML. Throws with a readable message. */\nexport function parseSpec(text: string): unknown {\n const trimmed = text.trimStart();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new Error(`Invalid JSON: ${(error as Error).message}`);\n }\n }\n try {\n return parseYaml(text, { maxAliasCount: 1000 });\n } catch (error) {\n throw new Error(`Invalid YAML: ${(error as Error).message}`);\n }\n}\n\nexport function isOpenApiDocument(value: unknown): value is OpenAPIDocument {\n const doc = value as OpenAPIDocument | null;\n return Boolean(doc && typeof doc === \"object\" && (doc.openapi || doc.swagger) && doc.paths);\n}\n\n/** OpenAPI 3.x documents pass through; Swagger 2.0 documents are converted. */\nexport function normalizeSpec(doc: OpenAPIDocument): OpenAPIDocument {\n return String(doc.swagger ?? \"\").startsWith(\"2\") ? convertSwagger2(doc) : doc;\n}\n\n/** parseSpec + validation + normalizeSpec. */\nexport function loadSpecText(text: string): OpenAPIDocument {\n const doc = parseSpec(text);\n if (!isOpenApiDocument(doc)) throw new Error('Not an OpenAPI document (missing \"openapi\"/\"swagger\" or \"paths\").');\n return normalizeSpec(doc);\n}\n\n/**\n * loadSpecText + external $ref resolution. Without `read`, external refs are\n * left as they are (the viewer shows them as unresolved).\n */\nexport async function loadSpec(text: string, options?: Partial<ExternalRefOptions>): Promise<OpenAPIDocument> {\n const doc = loadSpecText(text);\n if (!options?.read || !options.baseUrl) return doc;\n return resolveExternalRefs(doc, options as ExternalRefOptions);\n}\n","// Resolves external $refs (\"./schemas/pet.yaml#/Pet\", \"https://…/common.json#/x\")\n// by loading each referenced document once and hoisting every target into\n// components[\"x-oaspect-external\"], so the rest of the library only ever\n// follows local \"#/\" references.\n//\n// Inside an external document, its own \"#/…\" refs point into that document;\n// they are hoisted the same way. Cycles across files end on the already\n// hoisted key.\n\nimport { parseSpec } from \"./parse\";\nimport { resolvePointer } from \"./refs\";\nimport type { OpenAPIDocument, OpenAPIObject } from \"./types\";\n\nexport const EXTERNAL_KEY = \"x-oaspect-external\";\n\nexport interface ExternalRefOptions {\n /** URL of the document itself; relative refs resolve against it. */\n baseUrl: string;\n /** Loads a referenced document's text (fetch, fs…). */\n read: (url: string) => Promise<string>;\n /** Upper bound on loaded documents. Default 100. */\n maxDocuments?: number;\n}\n\nconst isExternal = (ref: string) => !ref.startsWith(\"#\");\n\n/** True when the document contains a $ref to another file or URL. */\nexport function hasExternalRefs(node: unknown): boolean {\n if (!node || typeof node !== \"object\") return false;\n if (Array.isArray(node)) return node.some(hasExternalRefs);\n const ref = (node as OpenAPIObject).$ref;\n if (typeof ref === \"string\" && isExternal(ref)) return true;\n return Object.values(node).some(hasExternalRefs);\n}\n\nexport async function resolveExternalRefs(doc: OpenAPIDocument, { baseUrl, read, maxDocuments = 100 }: ExternalRefOptions): Promise<OpenAPIDocument> {\n if (!hasExternalRefs(doc)) return doc;\n\n const documents = new Map<string, Promise<unknown>>();\n const hoisted = new Map<string, string>();\n const store: Record<string, unknown> = {};\n const usedKeys = new Set<string>();\n\n function load(url: string) {\n if (!documents.has(url)) {\n if (documents.size >= maxDocuments) throw new Error(`More than ${maxDocuments} external documents referenced`);\n documents.set(url, read(url).then((text) => parseSpec(text)));\n }\n return documents.get(url)!;\n }\n\n function keyFor(url: string, pointer: string) {\n const segment = pointer.split(\"/\").filter(Boolean).pop() ?? url.split(\"/\").pop()!.replace(/\\.(ya?ml|json)$/i, \"\");\n const base = decodeURIComponent(segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\")).replace(/[^\\w.-]/g, \"_\") || \"external\";\n let key = base;\n for (let index = 2; usedKeys.has(key); index += 1) key = `${base}_${index}`;\n usedKeys.add(key);\n return key;\n }\n\n async function hoist(url: string, pointer: string): Promise<string> {\n const id = `${url}#${pointer}`;\n const existing = hoisted.get(id);\n if (existing) return existing;\n const key = keyFor(url, pointer);\n hoisted.set(id, key); // before walking, so cycles end here\n\n const target = pointer ? resolvePointer((await load(url)) as OpenAPIObject, `#${pointer}`) : await load(url);\n if (target === undefined) throw new Error(`${id} not found`);\n store[key] = await walk(target, url, false);\n return key;\n }\n\n async function walk(node: unknown, base: string, isRoot: boolean): Promise<unknown> {\n if (!node || typeof node !== \"object\") return node;\n if (Array.isArray(node)) return Promise.all(node.map((item) => walk(item, base, isRoot)));\n\n const object = node as OpenAPIObject;\n if (typeof object.$ref === \"string\" && (isExternal(object.$ref) || !isRoot)) {\n const [file, pointer = \"\"] = object.$ref.split(\"#\");\n const url = file ? new URL(file, base).href : base;\n const key = await hoist(url, pointer.startsWith(\"/\") ? pointer : pointer ? `/${pointer}` : \"\");\n const { $ref: _ref, ...siblings } = object;\n return { ...((await walk(siblings, base, isRoot)) as OpenAPIObject), $ref: `#/components/${EXTERNAL_KEY}/${key}` };\n }\n\n const result: OpenAPIObject = {};\n for (const [key, value] of Object.entries(object)) result[key] = await walk(value, base, isRoot);\n return result;\n }\n\n const resolved = (await walk(doc, baseUrl, true)) as OpenAPIDocument;\n resolved.components = { ...resolved.components, [EXTERNAL_KEY]: store };\n return resolved;\n}\n"],"mappings":"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","names":["path","path","dq","sq","shellQuote","psQuote","dartQuote","kotlinQuote","indent","parseUrl","capitalize","jsObject","curl","httpie","fetchClient","axios","jquery","xhr","undici","pythonClient","phpCurl","guzzle","go","javaOkHttp","kotlinOkHttp","csharpHttpClient","restSharp","ruby","swift","dart","rust","libcurl","powershell","rawHttp","indent","fence","linkTarget","LANGUAGES","path","formData"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oaspect/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-free OpenAPI processing for documentation UIs: $ref resolution, examples, code samples, Markdown and syntax highlighting.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://oaspect.dev",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/oaspect/oaspect.git",
|
|
10
|
+
"directory": "packages/core"
|
|
11
|
+
},
|
|
12
|
+
"bugs": "https://github.com/oaspect/oaspect/issues",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"sideEffects": false,
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"README.md"
|
|
26
|
+
],
|
|
27
|
+
"keywords": [
|
|
28
|
+
"openapi",
|
|
29
|
+
"swagger",
|
|
30
|
+
"api-documentation",
|
|
31
|
+
"api-reference"
|
|
32
|
+
],
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^22.20.4",
|
|
35
|
+
"tsup": "^8.5.1",
|
|
36
|
+
"typescript": "^5.9.3",
|
|
37
|
+
"vitest": "^3.2.7"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"yaml": "^2.9.1"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsup",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"typecheck": "tsc --noEmit",
|
|
49
|
+
"lint": "tsc --noEmit"
|
|
50
|
+
}
|
|
51
|
+
}
|