Skip to main content
doc0blade47/fumadocsdocumentation home
Sign in

Code Sample Generators

Last updated Oct 12, 2026100% grounded
Relevant source files

The following files were used as context for generating this wiki page:

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 KeyGenerator ModuleTarget Output
curlcurlcURL CLI command snippet
jsjavascriptJavaScript fetch or client code
gogoGo HTTP request snippet
pythonpythonPython requests snippet
javajavaJava HTTP client snippet
csharpcsharpC# 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 ObjectSource Lines
cookieresult.cookie[param.name!]packages/openapi/src/utils/get-example-requests.ts:118-120
headerresult.header[param.name!]packages/openapi/src/utils/get-example-requests.ts:121-123
queryresult.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 TypeEncoding BehaviorExample Generation BehaviorSource Lines
application/jsonSerializes body via JSON.stringify(data.body)Delegates to str(data.body, 'application/json', ctx)packages/openapi/src/requests/media/adapter.ts:61-68
application/xmlConverts object via js2xml with compact formatting and 2-space indentationDelegates to str(data.body, 'application/xml', ctx)packages/openapi/src/requests/media/adapter.ts:69-79
application/x-ndjsonMaps array items to newline-delimited JSON strings or single stringifyDelegates to str(data.body, 'application/x-ndjson', ctx)packages/openapi/src/requests/media/adapter.ts:80-91
application/x-www-form-urlencodedConstructs URLSearchParams from object entriesReturns URLSearchParams JS instantiation or delegates to strpackages/openapi/src/requests/media/adapter.ts:92-111
multipart/form-dataAppends or sets File, Blob, array items, or stringified objects into FormDataBuilds language-specific multipart builders for JS, Go, Java, C#, and Pythonpackages/openapi/src/requests/media/adapter.ts:112-209
application/octet-streamCasts data.body directly as BodyInitReturns 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

GeneratorLanguage TagDefault Imports / NamespacesCore Client Class
Gogofmt, net/http, io/ioutilhttp.DefaultClient
C#csharpSystem, System.Net.Http, System.TextHttpClient
Javajavajava.net.URI, java.net.http.HttpClient, java.net.http.HttpRequest, java.net.http.HttpResponse, java.net.http.HttpResponse.BodyHandlers, java.time.DurationHttpClient

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 / ComponentData StructurePython Output FormatSource Package Import Added
Method & URLdata.method, data.url["GET", url]requests
Request Bodydata.body, bodyMediaTypedata = bodyNone (handled by adapter)
HeadersRecord<string, string>headers = { ... }None
CookiesRecord<string, string>cookies = { ... }None
Date FieldDate instancedatetime.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

Was this page helpful?