import { Fragment } from 'react'; import type { OpenAPIV3 } from '@gitbook/openapi-parser'; import type { OpenAPIClientContext } from './context'; import { InteractiveSection } from './InteractiveSection'; import { Markdown } from './Markdown'; import { OpenAPICopyButton } from './OpenAPICopyButton'; import { OpenAPIRequiredScopes } from './OpenAPIRequiredScopes'; import { OpenAPISchemaName } from './OpenAPISchemaName'; import { t } from './translate'; import type { OpenAPICustomSecurityScheme } from './types'; import type { OpenAPIOperationData } from './types'; import { createStateKey, extractOperationSecurityInfo, resolveDescription } from './utils'; /** * Present securities authorization that can be used for this operation. */ export function OpenAPISecurities(props: { securityRequirement: OpenAPIV3.OperationObject['security']; securities: OpenAPIOperationData['securities']; context: OpenAPIClientContext; }) { const { securityRequirement, securities, context } = props; if (!securities || securities.length === 0) { return null; } const tabsData = extractOperationSecurityInfo({ securityRequirement, securities }); const stateKey = createStateKey('securities', context.blockKey); return ( <> ({ key, label, body: (
{schemes.map((security, index) => { // OAuth2 description is already rendered in OpenAPISchemaOAuth2Item const description = security.type !== 'oauth2' ? resolveDescription(security) : undefined; return (
{getLabelForType(security, context)} {description ? ( ) : null}
); })}
), }))} /> ); } function getLabelForType(security: OpenAPICustomSecurityScheme, context: OpenAPIClientContext) { switch (security.type) { case 'apiKey': return ( ); case 'http': if (security.scheme === 'basic') { return ( ); } if (security.scheme === 'bearer') { return ( <> {/** Show a default description if none is provided */} {!security.description ? ( ) : null} ); } return ( ); case 'oauth2': return ; case 'openIdConnect': return ( ); default: // @ts-ignore return security.type; } } function OpenAPISchemaOAuth2Flows(props: { context: OpenAPIClientContext; security: OpenAPICustomSecurityScheme & { flows?: OpenAPIV3.OAuth2SecurityScheme['flows'] }; }) { const { context, security } = props; const flows = security.flows ? Object.entries(security.flows) : []; return (
{flows.map(([name, flow], index) => ( {index < flows.length - 1 ?
: null}
))}
); } function OpenAPISchemaOAuth2Item(props: { flow: NonNullable[keyof NonNullable< OpenAPIV3.OAuth2SecurityScheme['flows'] >]; name: string; context: OpenAPIClientContext; security: OpenAPICustomSecurityScheme & { flows?: OpenAPIV3.OAuth2SecurityScheme['flows'] }; }) { const { flow, context, security, name } = props; if (!flow) { return null; } const description = resolveDescription(security); return (
{description ? ( ) : null} {'authorizationUrl' in flow && flow.authorizationUrl ? ( Authorization URL:{' '} {flow.authorizationUrl} ) : null} {'tokenUrl' in flow && flow.tokenUrl ? ( Token URL:{' '} {flow.tokenUrl} ) : null} {'refreshUrl' in flow && flow.refreshUrl ? ( Refresh URL:{' '} {flow.refreshUrl} ) : null}
); }