Re-arrange OpenAPI Scopes for OAuth2 (#3799)

This commit is contained in:
Nolann B.
2025-11-12 19:40:21 +01:00
committed by GitHub
parent 9cbefa89c7
commit a512c90bda
12 changed files with 37 additions and 12 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@gitbook/react-openapi': patch
---
Re-arrange OpenAPI Scopes for OAuth2
@@ -25,12 +25,6 @@ export function OpenAPIRequiredScopes(props: {
}
const scopes = selectedSecurity.schemes.flatMap((scheme) => {
if (scheme.type === 'oauth2') {
return Object.entries(scheme.flows ?? {}).flatMap(([_, flow]) =>
Object.entries(flow.scopes ?? {})
);
}
return scheme.scopes ?? [];
});
@@ -66,16 +60,20 @@ export function OpenAPIRequiredScopes(props: {
);
}
function OpenAPISchemaScopes(props: {
export function OpenAPISchemaScopes(props: {
scopes: OpenAPISecurityScope[];
context: OpenAPIClientContext;
isOAuth2?: boolean;
}) {
const { scopes, context } = props;
const { scopes, context, isOAuth2 } = props;
return (
<div className="openapi-securities-scopes openapi-markdown">
<div className="openapi-required-scopes-description">
{t(context.translation, 'required_scopes_description')}
{t(
context.translation,
isOAuth2 ? 'available_scopes' : 'required_scopes_description'
)}
</div>
<ul>
{scopes.map((scope) => (
@@ -3,7 +3,7 @@ import { Fragment } from 'react';
import { InteractiveSection } from './InteractiveSection';
import { Markdown } from './Markdown';
import { OpenAPICopyButton } from './OpenAPICopyButton';
import { OpenAPIRequiredScopes } from './OpenAPIRequiredScopes';
import { OpenAPIRequiredScopes, OpenAPISchemaScopes } from './OpenAPIRequiredScopes';
import { OpenAPISchemaName } from './OpenAPISchemaName';
import type { OpenAPIClientContext } from './context';
import { t } from './translate';
@@ -43,7 +43,11 @@ export function OpenAPISecurities(props: {
body: (
<div className="openapi-schema">
{schemes.map((security, index) => {
const description = resolveDescription(security);
// OAuth2 description is already rendered in OpenAPISchemaOAuth2Item
const description =
security.type !== 'oauth2'
? resolveDescription(security)
: undefined;
return (
<div
key={`${key}-${index}`}
@@ -172,6 +176,10 @@ function OpenAPISchemaOAuth2Item(props: {
return null;
}
const scopes = !security.scopes?.length && flow.scopes ? Object.entries(flow.scopes) : [];
const description = resolveDescription(security);
return (
<div>
<OpenAPISchemaName
@@ -181,7 +189,9 @@ function OpenAPISchemaOAuth2Item(props: {
required={security.required}
/>
<div className="openapi-securities-oauth-content openapi-markdown">
{security.description ? <Markdown source={security.description} /> : null}
{description ? (
<Markdown source={description} className="openapi-securities-description" />
) : null}
{'authorizationUrl' in flow && flow.authorizationUrl ? (
<span>
Authorization URL:{' '}
@@ -221,6 +231,9 @@ function OpenAPISchemaOAuth2Item(props: {
</OpenAPICopyButton>
</span>
) : null}
{scopes.length ? (
<OpenAPISchemaScopes scopes={scopes} context={context} isOAuth2 />
) : null}
</div>
</div>
);
@@ -38,6 +38,7 @@ export const de = {
available_items: 'Verfügbare Elemente',
required_scopes: 'Erforderliche Scopes',
required_scopes_description: 'Dieser Endpunkt erfordert die folgenden Scopes:',
available_scopes: 'Verfügbare Scopes:',
properties: 'Eigenschaften',
or: 'oder',
and: 'und',
@@ -38,6 +38,7 @@ export const en = {
available_items: 'Available items',
required_scopes: 'Required scopes',
required_scopes_description: 'This endpoint requires the following scopes:',
available_scopes: 'Available scopes:',
possible_values: 'Possible values',
properties: 'Properties',
or: 'or',
@@ -38,6 +38,7 @@ export const es = {
available_items: 'Elementos disponibles',
required_scopes: 'Scopes requeridos',
required_scopes_description: 'Este endpoint requiere los siguientes scopes:',
available_scopes: 'Scopes disponibles:',
properties: 'Propiedades',
or: 'o',
and: 'y',
@@ -38,6 +38,7 @@ export const fr = {
available_items: 'Éléments disponibles',
required_scopes: 'Scopes requis',
required_scopes_description: 'Cet endpoint nécessite les scopes suivants:',
available_scopes: 'Scopes disponibles:',
properties: 'Propriétés',
or: 'ou',
and: 'et',
@@ -38,6 +38,7 @@ export const ja = {
available_items: '利用可能なアイテム',
required_scopes: '必須スコープ',
required_scopes_description: 'このエンドポイントには次のスコープが必要です:',
available_scopes: '利用可能なスコープ:',
properties: 'プロパティ',
or: 'または',
and: 'かつ',
@@ -38,6 +38,7 @@ export const nl = {
available_items: 'Beschikbare items',
required_scopes: 'Vereiste scopes',
required_scopes_description: 'Dit endpoint vereist de volgende scopes:',
available_scopes: 'Beschikbare scopes:',
properties: 'Eigenschappen',
or: 'of',
and: 'en',
@@ -38,6 +38,7 @@ export const no = {
available_items: 'Tilgjengelige elementer',
required_scopes: 'Påkrevde scopes',
required_scopes_description: 'Dette endepunktet krever følgende scopes:',
available_scopes: 'Tilgjengelige scopes:',
properties: 'Egenskaper',
or: 'eller',
and: 'og',
@@ -38,6 +38,7 @@ export const pt_br = {
available_items: 'Itens disponíveis',
required_scopes: 'Scopes obrigatórios',
required_scopes_description: 'Este endpoint requer os seguintes scopes:',
available_scopes: 'Scopes disponíveis:',
properties: 'Propriedades',
or: 'ou',
and: 'e',
@@ -38,6 +38,7 @@ export const zh = {
available_items: '可用项',
required_scopes: '必需范围',
required_scopes_description: '此端点需要以下范围:',
available_scopes: '可用范围:',
properties: '属性',
or: '或',
and: '和',