OpenAPI: Support to customise/disable TypeScript Response generation

This commit is contained in:
fuma-nama
2024-07-26 22:38:46 +08:00
parent c684c00a20
commit abf84bbc4e
4 changed files with 43 additions and 14 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'fumadocs-openapi': minor
---
Support to customise/disable TypeScript Response generation
+8 -8
View File
@@ -1,14 +1,17 @@
import Parser from '@apidevtools/json-schema-ref-parser';
import type { OpenAPIV3 as OpenAPI } from 'openapi-types';
import { buildRoutes } from '@/build-routes';
import type { Endpoint } from '@/endpoint';
import { generateDocument } from '@/utils/generate-document';
import { idToTitle } from '@/utils/id-to-title';
import type { RenderContext } from './types';
import { defaultRenderer, type Renderer } from './render/renderer';
import { type CodeSample, renderOperation } from './render/operation';
import { renderOperation } from './render/operation';
export interface GenerateOptions {
export interface GenerateOptions
extends Pick<
RenderContext,
'generateCodeSamples' | 'generateTypeScriptSchema'
> {
/**
* The imports of your MDX components.
*
@@ -29,11 +32,6 @@ export interface GenerateOptions {
description: string | undefined,
) => Record<string, unknown>;
/**
* Generate code samples for endpoint
*/
generateCodeSamples?: (endpoint: Endpoint) => CodeSample[];
renderer?: Partial<Renderer>;
}
@@ -146,6 +144,8 @@ function getContext(
...defaultRenderer,
...options.renderer,
},
generateTypeScriptSchema: options.generateTypeScriptSchema,
generateCodeSamples: options.generateCodeSamples,
baseUrl: document.servers?.[0].url ?? 'https://example.com',
};
}
+11 -5
View File
@@ -125,7 +125,7 @@ export async function renderOperation(
source: JS.getSampleRequest(endpoint),
lang: 'js',
},
...(ctx.generateCodeSamples?.(endpoint) ?? []),
...(ctx.generateCodeSamples ? await ctx.generateCodeSamples(endpoint) : []),
...((method as CustomProperty)['x-codeSamples'] ?? []),
]);
@@ -255,21 +255,27 @@ function getResponseTable(operation: OpenAPI.OperationObject): string {
async function getResponseTabs(
endpoint: Endpoint,
operation: OpenAPI.OperationObject,
{ renderer }: RenderContext,
{ renderer, generateTypeScriptSchema }: RenderContext,
): Promise<string> {
const items: string[] = [];
const child: string[] = [];
for (const code of Object.keys(operation.responses)) {
const example = getExampleResponse(endpoint, code);
const ts = await getTypescriptSchema(endpoint, code);
let ts: string | undefined;
if (generateTypeScriptSchema) {
ts = await generateTypeScriptSchema(endpoint, code);
} else if (generateTypeScriptSchema === undefined) {
ts = await getTypescriptSchema(endpoint, code);
}
const description =
code in endpoint.responses
? endpoint.responses[code].schema.description
: undefined;
if (example && ts) {
if (example) {
items.push(code);
child.push(
@@ -277,7 +283,7 @@ async function getResponseTabs(
p(description),
renderer.ResponseTypes([
renderer.ExampleResponse(example),
renderer.TypeScriptResponse(ts),
...(ts ? [renderer.TypeScriptResponse(ts)] : []),
]),
]),
);
+19 -1
View File
@@ -15,9 +15,27 @@ export interface MethodInformation extends OpenAPI.OperationObject {
method: string;
}
type Awaitable<T> = T | Promise<T>;
export interface RenderContext {
renderer: Renderer;
document: OpenAPI.Document;
baseUrl: string;
generateCodeSamples?: (endpoint: Endpoint) => CodeSample[];
/**
* Generate TypeScript definitions from response schema.
*
* Pass `false` to disable it.
*
* @param endpoint - the API endpoint
* @param code - status code
*/
generateTypeScriptSchema?:
| ((endpoint: Endpoint, code: string) => Awaitable<string>)
| false;
/**
* Generate code samples for endpoint.
*/
generateCodeSamples?: (endpoint: Endpoint) => Awaitable<CodeSample[]>;
}