import { OpenAPIV3 } from 'openapi-types'; import { CodeSampleInput, codeSampleGenerators } from './code-samples'; import { OpenAPIOperationData, toJSON } from './fetchOpenAPIOperation'; import { generateMediaTypeExample } from './generateSchemaExample'; import { InteractiveSection } from './InteractiveSection'; import { getServersURL } from './OpenAPIServerURL'; import { ScalarApiButton } from './ScalarApiButton'; import { OpenAPIContextProps } from './types'; import { noReference } from './utils'; /** * Display code samples to execute the operation. * It supports the Redocly custom syntax as well (https://redocly.com/docs/api-reference-docs/specification-extensions/x-code-samples/) */ export function OpenAPICodeSample(props: { data: OpenAPIOperationData; context: OpenAPIContextProps; }) { const { data, context } = props; const requestBody = noReference(data.operation.requestBody); const requestBodyContent = requestBody ? Object.entries(requestBody.content)[0] : undefined; const input: CodeSampleInput = { url: getServersURL(data.servers) + data.path, method: data.method, body: requestBodyContent ? generateMediaTypeExample(requestBodyContent[1], { onlyRequired: true }) : undefined, headers: { ...getSecurityHeaders(data.securities), ...(requestBodyContent ? { 'Content-Type': requestBodyContent[0], } : undefined), }, }; const autoCodeSamples = codeSampleGenerators.map((generator) => ({ key: `default-${generator.id}`, label: generator.label, body: , })); // Use custom samples if defined let customCodeSamples: null | Array<{ key: string; label: string; body: React.ReactNode; }> = null; (['x-custom-examples', 'x-code-samples', 'x-codeSamples'] as const).forEach((key) => { const customSamples = data.operation[key]; if (customSamples) { customCodeSamples = customSamples.map((sample) => ({ key: `redocly-${sample.lang}`, label: sample.label, body: , })); } }); const samples = customCodeSamples ?? (data['x-codeSamples'] !== false ? autoCodeSamples : []); if (samples.length === 0) { return null; } async function fetchOperationData() { 'use server'; return toJSON(data); } return ( ) } /> ); } function getSecurityHeaders(securities: OpenAPIOperationData['securities']): { [key: string]: string; } { const security = securities[0]; if (!security) { return {}; } switch (security[1].type) { case 'http': { let scheme = security[1].scheme; if (scheme === 'bearer') { scheme = 'Bearer'; } return { Authorization: scheme + ' ' + (security[1].bearerFormat ?? ''), }; } default: { return {}; } } }