Relevant source files
The following files were used as context for generating this wiki page:
- packages/openapi/src/requests/generators/all.ts
- packages/openapi/src/requests/generators/curl.ts
- packages/openapi/src/requests/generators/csharp.ts
- packages/openapi/src/ui/operation/usage-tabs.tsx
- packages/openapi/src/requests/generators/python.ts
- packages/openapi/src/requests/generators/go.ts
- packages/api-docs/src/schema/sample.ts
- packages/openapi/src/ui/operation/index.tsx
- packages/openapi/src/ui/base.tsx
- packages/openapi/src/requests/generators/index.ts
- packages/openapi/src/requests/generators/javascript.ts
- packages/openapi/src/requests/media/adapter.ts
- packages/api-docs/src/codegen.ts
- packages/openapi/src/ui/operation/response-tabs.tsx
- packages/openapi/src/requests/generators/java.ts
- packages/openapi/src/utils/get-example-requests.ts
- packages/openapi/src/server/index.tsx
- packages/openapi/src/ui/operation/request-tabs.tsx
- packages/asyncapi/src/server/index.tsx
- packages/openapi/src/scalar/client.tsx
- packages/asyncapi/src/ui/operation/message-examples.tsx
- packages/openapi/src/generate-file.ts
- packages/openapi/src/utils/pages/to-text.ts
- packages/asyncapi/src/utils/get-example-messages.ts
- packages/openapi/src/index.ts
- packages/cli/src/commands/export-epub.ts
- packages/asyncapi/src/utils/pages/to-text.ts
- packages/create-app/scripts/sync.ts
- packages/openapi/src/utils/schema.ts
- packages/doc-gen/src/remark-docgen.ts
Overview
Code sample generators translate normalized API request data, headers, cookies, and payloads into executable client code snippets across multiple programming languages and scripting environments. By transforming parsed OpenAPI operation objects and media adapters into formatted target syntax, the generator suite powers interactive API documentation tabs and dynamic code preview widgets.
Sources: packages/openapi/src/requests/generators/all.ts:9-16, packages/openapi/src/ui/operation/usage-tabs.tsx:137-181
Code Generator Registry
Registry Interface and Types
The registry relies on types imported from @fumadocs/api-docs/codegen, instantiating them with specific type arguments for OpenAPI request payloads. CodeUsageGeneratorRegistry is defined as a registry mapping language identifiers to generator functions that accept RequestData & { url: string } and a context containing mediaAdapters (a record of string keys to MediaAdapter objects) and a custom configuration property.
export type CodeUsageGeneratorRegistry = Shared.CodeUsageGeneratorRegistry<
RequestData & { url: string },
{ mediaAdapters: Record<string, MediaAdapter>; custom: unknown }
>;Sources: packages/openapi/src/requests/generators/index.ts:35-38
CodeUsageGenerator and InlineCodeUsageGenerator represent single generator functions for specified programming languages, where the inline variant permits generic customization typing for the custom context field.
export type CodeUsageGenerator = Shared.CodeUsageGenerator<
RequestData & { url: string },
{ mediaAdapters: Record<string, MediaAdapter>; custom: unknown }
>;
export type InlineCodeUsageGenerator<T = unknown> = Shared.InlineCodeUsageGenerator<
RequestData & { url: string },
{ mediaAdapters: Record<string, MediaAdapter>; custom: T }
>;Sources: packages/openapi/src/requests/generators/index.ts:43-54
createCodeUsageGeneratorRegistry wraps the shared factory function to produce new registry instances, optionally accepting an inherited registry parameter for scoping or fallback behaviors.
export function createCodeUsageGeneratorRegistry(
inherit?: CodeUsageGeneratorRegistry,
): CodeUsageGeneratorRegistry {
return Shared.createCodeUsageGeneratorRegistry(inherit);
}Sources: packages/openapi/src/requests/generators/index.ts:56-60
Note
CodeUsageGeneratorFn explicitly types generator callbacks as functions taking RequestData & { url: string } and a context record, returning a generated string snippet.
Sources: packages/openapi/src/requests/generators/index.ts:62-65
Default Generator Registration
The registerDefault function populates a CodeUsageGeneratorRegistry instance by binding default language generator modules to specific string keys. It registers six built-in target generators before returning the modified registry instance.
| Language Key | Generator Module | Target Output |
|---|---|---|
curl | curl | cURL CLI command snippet |
js | javascript | JavaScript fetch or client code |
go | go | Go HTTP request snippet |
python | python | Python requests snippet |
java | java | Java HTTP client snippet |
csharp | csharp | C# HTTP client snippet |
Sources: packages/openapi/src/requests/generators/all.ts:2-16
export function registerDefault(registry: CodeUsageGeneratorRegistry) {
registry.add('curl', curl);
registry.add('js', javascript);
registry.add('go', go);
registry.add('python', python);
registry.add('java', java);
registry.add('csharp', csharp);
return registry;
}Sources: packages/openapi/src/requests/generators/all.ts:9-16
Tip
When building custom documentation pipelines alongside OpenAPI Document Generation, pass an existing registry to createCodeUsageGeneratorRegistry as an inheritance argument to extend default language generators with domain-specific targets.
Sources: packages/openapi/src/requests/generators/index.ts:56-60
Request Data Extraction
Example Resolution and Parameter Locations
Extracting and preparing request information for code sample generation involves resolving parameters across operations and path items, picking schema examples, and sampling body contents. The process starts by gathering parameters from both operation.parameters and pathItem.parameters, and identifying the preferred request media type via getPreferredType.
Sources: packages/openapi/src/utils/get-example-requests.ts:36-39
export function getPreferredType(body: Record<string, unknown>): string | undefined {
if ('application/json' in body) return 'application/json';
return Object.keys(body)[0];
}Sources: packages/openapi/src/utils/schema.ts:8-12
When constructing example requests through getExampleRequests, the utility checks whether explicit body examples are defined under bodyOfType.examples. If present, each entry generates a distinct ExampleRequestItem containing its assigned identifier, summary or key name, optional description, raw request data, and encoded request data produced by encodeRequestData. If no named examples exist, a default example item is created using schema sampling or fallback heuristics.
Sources: packages/openapi/src/utils/get-example-requests.ts:41-76
Parameters are iterated and assigned to distinct transport containers in getRequestData based on their in property value.
Sources: packages/openapi/src/utils/get-example-requests.ts:99-130
Parameter Location (param.in) | Target Container Object | Source Lines |
|---|---|---|
cookie | result.cookie[param.name!] | packages/openapi/src/utils/get-example-requests.ts:118-120 |
header | result.header[param.name!] | packages/openapi/src/utils/get-example-requests.ts:121-123 |
query | result.query[param.name!] | packages/openapi/src/utils/get-example-requests.ts:124-126 |
| default (path) | result.path[param.name!] | packages/openapi/src/utils/get-example-requests.ts:127-129 |
Sources: packages/openapi/src/utils/get-example-requests.ts:117-130
Warning
If a parameter value is undefined but marked as required, getRequestData attempts to generate a mock value using @fumadocs/api-docs/schema/sample. If neither a schema nor content definition exists for a required parameter, an explicit Error is thrown detailing the missing parameter name and media type.
Sources: packages/openapi/src/utils/get-example-requests.ts:102-114
Example Extraction Helpers
The helper function pickExample inspects input schemas and media objects for static examples or nested content objects, prioritizing explicit example definitions over mapped examples or sampled media types.
Sources: packages/openapi/src/utils/schema.ts:32-51
export function pickExample(value: ExampleLike): unknown | undefined {
if (value.example !== undefined) {
return value.example;
}
if (value.content) {
const type = getPreferredType(value.content);
const content = type ? value.content[type] : undefined;
if (type && content) {
const out = value.examples?.[type].value ?? pickExample(content);
if (out !== undefined) return out;
}
}
if (value.examples) {
const examples = Object.values(value.examples);
if (examples.length > 0) return examples[0].value;
}
}Sources: packages/openapi/src/utils/schema.ts:32-51
Note
When sampling request bodies, read-only properties are skipped when the HTTP method is not get, whereas write-only properties are skipped specifically when the method is get. Non-required properties are skipped by default during sampling.
Sources: packages/openapi/src/utils/get-example-requests.ts:143-147
Media Type Adapters
Encoding Handlers and Supported Formats
Fumadocs OpenAPI uses media type adapters to encode request body payloads into standard BodyInit objects for runtime requests and to translate body structures into language-specific initialization snippets. Each adapter implements the MediaAdapter interface, which mandates an encode function and a generateExample function receiving a MediaContext object.
Sources: packages/openapi/src/requests/media/adapter.ts:33-58
The defaultAdapters record supports five standard media types as well as raw octet streams.
Sources: packages/openapi/src/requests/media/adapter.ts:60-219
| Media Type | Encoding Behavior | Example Generation Behavior | Source Lines |
|---|---|---|---|
application/json | Serializes body via JSON.stringify(data.body) | Delegates to str(data.body, 'application/json', ctx) | packages/openapi/src/requests/media/adapter.ts:61-68 |
application/xml | Converts object via js2xml with compact formatting and 2-space indentation | Delegates to str(data.body, 'application/xml', ctx) | packages/openapi/src/requests/media/adapter.ts:69-79 |
application/x-ndjson | Maps array items to newline-delimited JSON strings or single stringify | Delegates to str(data.body, 'application/x-ndjson', ctx) | packages/openapi/src/requests/media/adapter.ts:80-91 |
application/x-www-form-urlencoded | Constructs URLSearchParams from object entries | Returns URLSearchParams JS instantiation or delegates to str | packages/openapi/src/requests/media/adapter.ts:92-111 |
multipart/form-data | Appends or sets File, Blob, array items, or stringified objects into FormData | Builds language-specific multipart builders for JS, Go, Java, C#, and Python | packages/openapi/src/requests/media/adapter.ts:112-209 |
application/octet-stream | Casts data.body directly as BodyInit | Returns undefined (not supported) | packages/openapi/src/requests/media/adapter.ts:210-218 |
Sources: packages/openapi/src/requests/media/adapter.ts:60-219
Caution
The application/x-www-form-urlencoded encoder validates that data.body is an object type, throwing an explicit Error if non-object inputs are passed. Similarly, the multipart/form-data encoder checks for valid non-null object structures before iterating over properties.
Sources: packages/openapi/src/requests/media/adapter.ts:94-95, packages/openapi/src/requests/media/adapter.ts:117-119
Language Code Generation and Contexts
The str helper formats string-serializable bodies across target programming languages by inspecting ctx.lang. Supported context interfaces include GoContext, JavaScriptContext, JavaContext, and CSharpContext, which provide addImport utilities to inject required packages.
Sources: packages/openapi/src/requests/media/adapter.ts:13-38, packages/openapi/src/requests/media/adapter.ts:221-258
if (ctx.lang === 'js') {
if (mediaType === 'application/json') {
return `const body = JSON.stringify(${JSON.stringify(init, null, 2)})`;
}
return `const body = ${backtickQuote(inputToString(init, mediaType))}`;
}
if (ctx.lang === 'python') {
return `body = ${tripleDoubleQuote(inputToString(init, mediaType))}`;
}
if (ctx.lang === 'go') {
const { addImport } = ctx as GoContext;
addImport('strings');
return `body := strings.NewReader(${backtickQuote(inputToString(init, mediaType))})`;
}
if (ctx.lang === 'java') {
const { addImport } = ctx as JavaContext;
addImport('java.net.http.HttpRequest.BodyPublishers');
return `var body = BodyPublishers.ofString(${tripleDoubleQuote(inputToString(init, mediaType))});`;
}
if (ctx.lang === 'csharp') {
const input = `\n${inputToString(init, mediaType)}\n`;
return `var body = new StringContent(${tripleDoubleQuote(input)}, Encoding.UTF8, "${mediaType}");`;
}Sources: packages/openapi/src/requests/media/adapter.ts:230-257
Tip
When generating Go examples for multipart/form-data, the adapter automatically invokes addImport('mime/multipart') and addImport('bytes') to register necessary buffer and multipart writer dependencies in the output scope.
Sources: packages/openapi/src/requests/media/adapter.ts:179-183
Warning
Null, undefined, and NaN properties within multipart/form-data request objects are explicitly skipped during FormData iteration, preventing invalid literal conversions.
Sources: packages/openapi/src/requests/media/adapter.ts:124
Shell and Scripting Generators
cURL Invocation Generation
The curl code usage generator builds standard POSIX shell commands by assembling HTTP methods, target URLs, request headers, cookies, and payload arguments. The generator initializes the command array with the upper-case HTTP method and target URL, iterates over header entries to append -H flags, and serializes cookie parameters with --cookie flags using double quotes.
Sources: packages/openapi/src/requests/generators/curl.ts:4-22
if (data.body && data.bodyMediaType === 'multipart/form-data') {
if (typeof data.body !== 'object') throw new Error('[CURL] request body must be an object.');
for (const [key, value] of Object.entries(data.body)) {
s.push(`-F ${key}=${doubleQuote(inputToString(value))}`);
}
} else if (data.body && data.bodyMediaType) {
const escaped = singleQuote(
inputToString(
data.body,
// @ts-expect-error -- assume the body media type is supported
data.bodyMediaType,
),
);
s.push(`-H "Content-Type: ${data.bodyMediaType}"`);
s.push(`-d ${escaped}`);
}
return s.flatMap((v, i) => indent(v, i > 0 ? 1 : 0)).join(' \\\n');
},Sources: packages/openapi/src/requests/generators/curl.ts:23-43
Caution
When processing multipart/form-data request bodies, the cURL generator verifies that data.body is an object type and throws an explicit [CURL] request body must be an object. error if non-object inputs are passed.
Sources: packages/openapi/src/requests/generators/curl.ts:23-25
JavaScript Fetch Generation
The javascript code usage generator constructs browser-compatible fetch() API snippets, managing request configuration options, headers, cookies, and media type adaptations. It collects configuration properties in an internal Map and populates a header record with content types, custom headers, and combined cookie strings separated by semicolons.
Sources: packages/openapi/src/requests/generators/javascript.ts:5-26
if (Object.keys(headers).length > 0) {
options.set('headers', JSON.stringify(headers, null, 2));
}
let body: string | undefined;
if (data.body && data.bodyMediaType) {
const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);
body = adapter?.generateExample(data as { body: unknown }, {
lang: 'js',
addImport(from, name) {
s.unshift(`import { ${name} } from "${from}"`);
},
});
}
if (body) {
s.push(body);
options.set('body', 'body');
}
const params = [doubleQuote(data.url)];
if (options.size > 0) {
const str = Array.from(options.entries())
.map(([k, v]) => indent(k === v ? k : `${k}: ${v}`))
.join(',\n');
params.push(`{\n${str}\n}`);
}
s.push(`fetch(${params.join(', ')})`);
return s.join('\n\n');
},Sources: packages/openapi/src/requests/generators/javascript.ts:27-59
Tip
The JavaScript generator resolves media adapters for request bodies when data.bodyMediaType is present, supporting dynamic import injection into the snippet scope (such as module imports for form data or specialized binary parsers) via the addImport callback.
Sources: packages/openapi/src/requests/generators/javascript.ts:31-40
Compiled Language Generators
Go, C#, and Java Client Snippets
The compiled language generators construct strongly typed HTTP client snippets for Go, C#, and Java, mapping request configurations, headers, cookies, and media type adapters into native execution patterns. The Go generator populates an imports array with fmt, net/http, and io/ioutil, maps custom headers and cookie strings into a req.Header collection, and builds the request using http.NewRequest with http.DefaultClient.Do.
Sources: packages/openapi/src/requests/generators/go.ts:5-62
| Generator | Language Tag | Default Imports / Namespaces | Core Client Class |
|---|---|---|---|
| Go | go | fmt, net/http, io/ioutil | http.DefaultClient |
| C# | csharp | System, System.Net.Http, System.Text | HttpClient |
| Java | java | java.net.URI, java.net.http.HttpClient, java.net.http.HttpRequest, java.net.http.HttpResponse, java.net.http.HttpResponse.BodyHandlers, java.time.Duration | HttpClient |
Sources: packages/openapi/src/requests/generators/go.ts:9, packages/openapi/src/requests/generators/csharp.ts:10, packages/openapi/src/requests/generators/java.ts:11-18
Note
The C# generator transforms incoming HTTP methods by capitalizing the first character, lowercasing the remainder, and appending Async (e.g., GetAsync, PostAsync) to match HttpClient method signatures.
Sources: packages/openapi/src/requests/generators/csharp.ts:57-63
Request Body and Media Adaptation
When a request body and bodyMediaType are present, each compiled generator resolves a media adapter to output payload examples and inject language-specific package imports into the snippet scope via the addImport callback. The Java generator configures an HttpClient builder with a 10-second connect timeout using Duration.ofSeconds(10), constructs an HttpRequest via HttpRequest.newBuilder(), appends headers and cookie strings, and invokes the dynamic HTTP method builder.
Sources: packages/openapi/src/requests/generators/java.ts:21-72
// Add response handling
s.push('try {');
s.push(
indent(
'HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString());',
),
);
s.push(indent('System.out.println("Status code: " + response.statusCode());'));
s.push(indent('System.out.println("Response body: " + response.body());'));
s.push('} catch (Exception e) {');
s.push(indent('e.printStackTrace();'));
s.push('}');
Sources: packages/openapi/src/requests/generators/java.ts:74-86
Warning
The Java generator wraps client execution inside a try-catch block that catches general Exception instances and outputs stack traces via e.printStackTrace(); during response handling.
Sources: packages/openapi/src/requests/generators/java.ts:75-86
Python Requests Generation
Constructing Python Requests Syntax
The Python requests generator builds executable HTTP request snippets using the requests library, incorporating dynamic method calls, URL strings, and dictionary literals for headers and cookies. The generator initializes an imports set with requests, evaluates any request body and media type adapter, and appends keyword arguments to a params array containing the uppercase HTTP method and target URL.
Sources: packages/openapi/src/requests/generators/python.ts:5-27
| Parameter / Component | Data Structure | Python Output Format | Source Package Import Added |
|---|---|---|---|
| Method & URL | data.method, data.url | ["GET", url] | requests |
| Request Body | data.body, bodyMediaType | data = body | None (handled by adapter) |
| Headers | Record<string, string> | headers = { ... } | None |
| Cookies | Record<string, string> | cookies = { ... } | None |
| Date Field | Date instance | datetime.datetime(...) | datetime |
Sources: packages/openapi/src/requests/generators/python.ts:9-46, packages/openapi/src/requests/generators/python.ts:72-74
Note
When request headers or cookies contain entries, the generator serializes them into indented dictionary literals via generatePythonObject before appending them to the requests.request parameter list.
Sources: packages/openapi/src/requests/generators/python.ts:29-46
Object Serialization and Type Mapping
The generatePythonObject utility recursively converts arbitrary JavaScript values into valid Python syntax literals, managing null, boolean, numeric, string, array, date, and object types.
Sources: packages/openapi/src/requests/generators/python.ts:60-82
if (v === null) {
return 'None';
} else if (typeof v === 'boolean') {
return v ? 'True' : 'False';
} else if (typeof v === 'string') {
return doubleQuote(v);
} else if (typeof v === 'number') {
return v.toString();
} else if (Array.isArray(v)) {
const items = v.map((item) => generatePythonObject(item, imports));
return `[${items.join(', ')}]`;
} else if (v instanceof Date) {
imports.add('datetime');
return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;
} else if (typeof v === 'object') {
const entries = Object.entries(v).map(
([key, value]) => ` ${doubleQuote(key)}: ${generatePythonObject(value, imports)}`,
);
return `{\n${entries.join(', \n')}\n}`;
} else {
throw new Error(`Unsupported type: ${typeof v}`);
}Sources: packages/openapi/src/requests/generators/python.ts:61-82
Warning
Encountering an unsupported JavaScript type during object serialization throws an immediate error with the message Unsupported type: ${typeof v}, halting snippet generation.
Sources: packages/openapi/src/requests/generators/python.ts:80-82
Related
On This Page
OverviewCode Generator RegistryRegistry Interface and TypesDefault Generator RegistrationRequest Data ExtractionExample Resolution and Parameter LocationsExample Extraction HelpersMedia Type AdaptersEncoding Handlers and Supported FormatsLanguage Code Generation and ContextsShell and Scripting GeneratorscURL Invocation GenerationJavaScript Fetch GenerationCompiled Language GeneratorsGo, C#, and Java Client SnippetsRequest Body and Media AdaptationPython Requests GenerationConstructing Python Requests SyntaxObject Serialization and Type MappingRelated