From eb7227f85f90b4ac6fb6c527816deb251684e852 Mon Sep 17 00:00:00 2001 From: Leo Liang <leoliang@gmail.com> Date: Fri, 5 Jan 2024 09:50:16 +0000 Subject: [PATCH 1/2] feat: Optionally render object schema title and descriptions --- docs/config.md | 10 +- src/components/Fields/Field.tsx | 3 +- src/components/Parameters/Parameters.tsx | 12 +- src/components/Responses/ResponseDetails.tsx | 12 +- src/components/Schema/ObjectSchema.tsx | 96 ++++--- src/components/Schema/Schema.tsx | 3 +- .../SchemaDefinition/SchemaDefinition.tsx | 12 +- .../DiscriminatorDropdown.test.tsx.snap | 251 +++++++++--------- src/services/RedocNormalizedOptions.ts | 2 + 9 files changed, 242 insertions(+), 159 deletions(-) diff --git a/docs/config.md b/docs/config.md index 9a668892e1..9a9475052c 100644 --- a/docs/config.md +++ b/docs/config.md @@ -6,7 +6,7 @@ Each deployment type has documentation on how to configure options for that type **Versions: 2.x** -{% admonition type="success" name="Client-side configuration" %} +{% admonition type="success" name="Client-side configuration" %} Using Redoc as a standalone (HTML or React) tool, these options must be presented in [kebab case](https://en.wikipedia.org/wiki/Letter_case#Kebab_case). For example, `scrollYOffset` becomes `scroll-y-offset`, and `expandResponses` becomes `expand-responses`. @@ -66,6 +66,14 @@ If set to `true`, the pattern is not shown in the schema. Hides the schema title next to to the type. +### hideObjectTitle + +Hides the object title in the schema. + +### hideObjectDescription + +Hides the object description in the schema. + ### hideSecuritySection Hides the Security panel section. diff --git a/src/components/Fields/Field.tsx b/src/components/Fields/Field.tsx index d142c9a5c4..d4659dab27 100644 --- a/src/components/Fields/Field.tsx +++ b/src/components/Fields/Field.tsx @@ -104,7 +104,8 @@ export class Field extends React.Component<FieldProps> { schema={field.schema} skipReadOnly={this.props.skipReadOnly} skipWriteOnly={this.props.skipWriteOnly} - showTitle={this.props.showTitle} + hideObjectTitle={this.props.hideObjectTitle} + hideObjectDescription={this.props.hideObjectDescription} level={this.props.level} /> </InnerPropertiesWrap> diff --git a/src/components/Parameters/Parameters.tsx b/src/components/Parameters/Parameters.tsx index 5270d24097..d2b49506f2 100644 --- a/src/components/Parameters/Parameters.tsx +++ b/src/components/Parameters/Parameters.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { DropdownOrLabel, DropdownOrLabelProps } from '../DropdownOrLabel/DropdownOrLabel'; import { ParametersGroup } from './ParametersGroup'; +import { OptionsContext } from '../OptionsProvider'; import { UnderlinedHeader } from '../../common-elements'; @@ -29,6 +30,8 @@ export interface ParametersProps { const PARAM_PLACES = ['path', 'query', 'cookie', 'header']; export class Parameters extends React.PureComponent<ParametersProps> { + static contextType = OptionsContext; + orderParams(params: FieldModel[]): Record<string, FieldModel[]> { const res = {}; params.forEach(param => { @@ -38,6 +41,7 @@ export class Parameters extends React.PureComponent<ParametersProps> { } render() { + const { hideObjectTitle, hideObjectDescription } = this.context; const { body, parameters = [] } = this.props; if (body === undefined && parameters === undefined) { return null; @@ -63,6 +67,8 @@ export class Parameters extends React.PureComponent<ParametersProps> { content={bodyContent} description={bodyDescription} bodyRequired={bodyRequired} + hideObjectTitle={hideObjectTitle} + hideObjectDescription={hideObjectDescription} /> )} </> @@ -90,8 +96,10 @@ export function BodyContent(props: { content: MediaContentModel; description?: string; bodyRequired?: boolean; + hideObjectTitle?: boolean; + hideObjectDescription?: boolean; }): JSX.Element { - const { content, description, bodyRequired } = props; + const { content, description, bodyRequired, hideObjectTitle, hideObjectDescription } = props; const { isRequestType } = content; return ( <MediaTypesSwitch @@ -108,6 +116,8 @@ export function BodyContent(props: { <Schema skipReadOnly={isRequestType} skipWriteOnly={!isRequestType} + hideObjectTitle={hideObjectTitle} + hideObjectDescription={hideObjectDescription} key="schema" schema={schema} /> diff --git a/src/components/Responses/ResponseDetails.tsx b/src/components/Responses/ResponseDetails.tsx index 4800925910..adbe64241f 100644 --- a/src/components/Responses/ResponseDetails.tsx +++ b/src/components/Responses/ResponseDetails.tsx @@ -11,9 +11,13 @@ import { Extensions } from '../Fields/Extensions'; import { Markdown } from '../Markdown/Markdown'; import { ResponseHeaders } from './ResponseHeaders'; import { ConstraintsView } from '../Fields/FieldConstraints'; +import { OptionsContext } from '../OptionsProvider'; export class ResponseDetails extends React.PureComponent<{ response: ResponseModel }> { + static contextType = OptionsContext; + render() { + const { hideObjectTitle, hideObjectDescription } = this.context; const { description, extensions, headers, content } = this.props.response; return ( <> @@ -27,7 +31,13 @@ export class ResponseDetails extends React.PureComponent<{ response: ResponseMod {schema?.type === 'object' && ( <ConstraintsView constraints={schema?.constraints || []} /> )} - <Schema skipWriteOnly={true} key="schema" schema={schema} /> + <Schema + hideObjectTitle={hideObjectTitle} + hideObjectDescription={hideObjectDescription} + skipWriteOnly={true} + key="schema" + schema={schema} + /> </> ); }} diff --git a/src/components/Schema/ObjectSchema.tsx b/src/components/Schema/ObjectSchema.tsx index 145ea98d76..034e28f0b8 100644 --- a/src/components/Schema/ObjectSchema.tsx +++ b/src/components/Schema/ObjectSchema.tsx @@ -1,9 +1,13 @@ import { observer } from 'mobx-react'; import * as React from 'react'; +import styled from '../../styled-components'; +import { H3 } from '../../common-elements/headers'; +import { Markdown } from '../Markdown/Markdown'; + import { SchemaModel } from '../../services/models'; -import { PropertiesTable, PropertiesTableCaption } from '../../common-elements/fields-layout'; +import { PropertiesTable } from '../../common-elements/fields-layout'; import { Field } from '../Fields/Field'; import { DiscriminatorDropdown } from './DiscriminatorDropdown'; import { SchemaProps } from './Schema'; @@ -18,13 +22,26 @@ export interface ObjectSchemaProps extends SchemaProps { }; } +export const ObjectSchemaDetails = styled.div` + margin: 0 0 0.5em 0; +`; + +export const ObjectSchemaTitle = styled(H3)` + margin: 0.5em 0 0 0; +`; + +export const ObjectSchemaDescription = styled.div` + margin: 0.5em 0 0 0; +`; + export const ObjectSchema = observer( ({ - schema: { fields = [], title }, - showTitle, + schema: { fields = [], title, description }, discriminator, skipReadOnly, skipWriteOnly, + hideObjectTitle, + hideObjectDescription, level, }: ObjectSchemaProps) => { const { expandSingleSchemaField, showObjectSchemaExamples, schemaExpansionLevel } = @@ -48,37 +65,48 @@ export const ObjectSchema = observer( (expandSingleSchemaField && filteredFields.length === 1) || schemaExpansionLevel >= level!; return ( - <PropertiesTable> - {showTitle && <PropertiesTableCaption>{title}</PropertiesTableCaption>} - <tbody> - {mapWithLast(filteredFields, (field, isLast) => { - return ( - <Field - key={field.name} - isLast={isLast} - field={field} - expandByDefault={expandByDefault} - renderDiscriminatorSwitch={ - discriminator?.fieldName === field.name - ? () => ( - <DiscriminatorDropdown - parent={discriminator!.parentSchema} - enumValues={field.schema.enum} - /> - ) - : undefined - } - className={field.expanded ? 'expanded' : undefined} - showExamples={showObjectSchemaExamples} - skipReadOnly={skipReadOnly} - skipWriteOnly={skipWriteOnly} - showTitle={showTitle} - level={level} - /> - ); - })} - </tbody> - </PropertiesTable> + <div> + <ObjectSchemaDetails> + {!hideObjectTitle && <ObjectSchemaTitle>{title}</ObjectSchemaTitle>} + {!hideObjectDescription && ( + <ObjectSchemaDescription> + <Markdown compact={true} source={description} /> + </ObjectSchemaDescription> + )} + </ObjectSchemaDetails> + + <PropertiesTable> + <tbody> + {mapWithLast(filteredFields, (field, isLast) => { + return ( + <Field + key={field.name} + isLast={isLast} + field={field} + expandByDefault={expandByDefault} + renderDiscriminatorSwitch={ + discriminator?.fieldName === field.name + ? () => ( + <DiscriminatorDropdown + parent={discriminator!.parentSchema} + enumValues={field.schema.enum} + /> + ) + : undefined + } + className={field.expanded ? 'expanded' : undefined} + showExamples={showObjectSchemaExamples} + skipReadOnly={skipReadOnly} + skipWriteOnly={skipWriteOnly} + hideObjectTitle={hideObjectTitle} + hideObjectDescription={hideObjectDescription} + level={level} + /> + ); + })} + </tbody> + </PropertiesTable> + </div> ); }, ); diff --git a/src/components/Schema/Schema.tsx b/src/components/Schema/Schema.tsx index c0d38b1ea8..0bf72e051f 100644 --- a/src/components/Schema/Schema.tsx +++ b/src/components/Schema/Schema.tsx @@ -13,9 +13,10 @@ import { RecursiveSchema } from './RecursiveSchema'; import { isArray } from '../../utils/helpers'; export interface SchemaOptions { - showTitle?: boolean; skipReadOnly?: boolean; skipWriteOnly?: boolean; + hideObjectTitle?: boolean; + hideObjectDescription?: boolean; level?: number; } diff --git a/src/components/SchemaDefinition/SchemaDefinition.tsx b/src/components/SchemaDefinition/SchemaDefinition.tsx index b939891230..264c4d6170 100644 --- a/src/components/SchemaDefinition/SchemaDefinition.tsx +++ b/src/components/SchemaDefinition/SchemaDefinition.tsx @@ -14,6 +14,8 @@ export interface ObjectDescriptionProps { exampleRef?: string; showReadOnly?: boolean; showWriteOnly?: boolean; + showObjectTitle?: boolean; + showObjectDescription?: boolean; showExample?: boolean; parser: OpenAPIParser; options: RedocNormalizedOptions; @@ -54,7 +56,13 @@ export class SchemaDefinition extends React.PureComponent<ObjectDescriptionProps } render() { - const { showReadOnly = true, showWriteOnly = false, showExample = true } = this.props; + const { + showReadOnly = true, + showWriteOnly = false, + showExample = true, + showObjectTitle = false, + showObjectDescription = false, + } = this.props; return ( <Section> <Row> @@ -62,6 +70,8 @@ export class SchemaDefinition extends React.PureComponent<ObjectDescriptionProps <Schema skipWriteOnly={!showWriteOnly} skipReadOnly={!showReadOnly} + hideObjectTitle={!showObjectTitle} + hideObjectDescription={!showObjectDescription} schema={this.mediaModel.schema} /> </MiddlePanel> diff --git a/src/components/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap b/src/components/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap index 31e0327d9e..c3f91f952b 100644 --- a/src/components/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap +++ b/src/components/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap @@ -2865,143 +2865,156 @@ exports[`Components SchemaView discriminator should correctly render SchemaView `; exports[`Components SchemaView discriminator should correctly render discriminator dropdown 1`] = ` -<styled.table> - <tbody> - <Field - expandByDefault={false} - field={ - FieldModel { - "const": "", - "deprecated": false, - "description": "", - "example": undefined, - "expanded": undefined, - "explode": false, - "in": undefined, - "kind": "field", - "name": "packSize", - "required": false, - "schema": SchemaModel { - "activeOneOf": 0, +<div> + <styled.div> + <Styled(styled.h2)> + Dog + </Styled(styled.h2)> + <styled.div> + <Markdown + compact={true} + source="" + /> + </styled.div> + </styled.div> + <styled.table> + <tbody> + <Field + expandByDefault={false} + field={ + FieldModel { "const": "", - "constraints": Array [], - "contentEncoding": undefined, - "contentMediaType": undefined, - "default": undefined, "deprecated": false, "description": "", - "displayFormat": undefined, - "displayType": "number", - "enum": Array [], "example": undefined, - "examples": undefined, - "externalDocs": undefined, - "format": undefined, - "isCircular": false, - "isPrimitive": true, - "maxItems": undefined, - "minItems": undefined, - "options": "<<<filtered>>>", - "pattern": undefined, - "pointer": "#/components/schemas/Dog/properties/packSize", - "rawSchema": Object { - "default": undefined, - "type": "number", - }, - "readOnly": false, - "refsStack": Array [ - "#/components/schemas/Dog", - "#/components/schemas/Dog/properties/packSize", - ], - "schema": Object { + "expanded": undefined, + "explode": false, + "in": undefined, + "kind": "field", + "name": "packSize", + "required": false, + "schema": SchemaModel { + "activeOneOf": 0, + "const": "", + "constraints": Array [], + "contentEncoding": undefined, + "contentMediaType": undefined, "default": undefined, + "deprecated": false, + "description": "", + "displayFormat": undefined, + "displayType": "number", + "enum": Array [], + "example": undefined, + "examples": undefined, + "externalDocs": undefined, + "format": undefined, + "isCircular": false, + "isPrimitive": true, + "maxItems": undefined, + "minItems": undefined, + "options": "<<<filtered>>>", + "pattern": undefined, + "pointer": "#/components/schemas/Dog/properties/packSize", + "rawSchema": Object { + "default": undefined, + "type": "number", + }, + "readOnly": false, + "refsStack": Array [ + "#/components/schemas/Dog", + "#/components/schemas/Dog/properties/packSize", + ], + "schema": Object { + "default": undefined, + "type": "number", + }, + "title": "", "type": "number", + "typePrefix": "", + "writeOnly": false, }, - "title": "", - "type": "number", - "typePrefix": "", - "writeOnly": false, - }, + } } - } - isLast={false} - key="packSize" - showExamples={false} - /> - <Field - expandByDefault={false} - field={ - FieldModel { - "const": "", - "deprecated": false, - "description": "", - "example": undefined, - "expanded": undefined, - "explode": false, - "in": undefined, - "kind": "field", - "name": "type", - "required": true, - "schema": SchemaModel { - "activeOneOf": 0, + isLast={false} + key="packSize" + showExamples={false} + /> + <Field + expandByDefault={false} + field={ + FieldModel { "const": "", - "constraints": Array [], - "contentEncoding": undefined, - "contentMediaType": undefined, - "default": undefined, "deprecated": false, "description": "", - "displayFormat": undefined, - "displayType": "string", - "enum": Array [], "example": undefined, - "examples": undefined, - "externalDocs": undefined, - "format": undefined, - "isCircular": false, - "isPrimitive": true, - "maxItems": undefined, - "minItems": undefined, - "options": "<<<filtered>>>", - "pattern": undefined, - "pointer": "#/components/schemas/Dog/properties/type", - "rawSchema": Object { + "expanded": undefined, + "explode": false, + "in": undefined, + "kind": "field", + "name": "type", + "required": true, + "schema": SchemaModel { + "activeOneOf": 0, + "const": "", + "constraints": Array [], + "contentEncoding": undefined, + "contentMediaType": undefined, "default": undefined, - "type": "string", - "x-refsStack": Array [ + "deprecated": false, + "description": "", + "displayFormat": undefined, + "displayType": "string", + "enum": Array [], + "example": undefined, + "examples": undefined, + "externalDocs": undefined, + "format": undefined, + "isCircular": false, + "isPrimitive": true, + "maxItems": undefined, + "minItems": undefined, + "options": "<<<filtered>>>", + "pattern": undefined, + "pointer": "#/components/schemas/Dog/properties/type", + "rawSchema": Object { + "default": undefined, + "type": "string", + "x-refsStack": Array [ + "#/components/schemas/Dog", + "#/components/schemas/Pet", + ], + }, + "readOnly": false, + "refsStack": Array [ + "#/components/schemas/Dog", "#/components/schemas/Dog", "#/components/schemas/Pet", - ], - }, - "readOnly": false, - "refsStack": Array [ - "#/components/schemas/Dog", - "#/components/schemas/Dog", - "#/components/schemas/Pet", - "#/components/schemas/Dog", - "#/components/schemas/Pet", - "#/components/schemas/Dog/properties/type", - ], - "schema": Object { - "default": undefined, - "type": "string", - "x-refsStack": Array [ "#/components/schemas/Dog", "#/components/schemas/Pet", + "#/components/schemas/Dog/properties/type", ], + "schema": Object { + "default": undefined, + "type": "string", + "x-refsStack": Array [ + "#/components/schemas/Dog", + "#/components/schemas/Pet", + ], + }, + "title": "", + "type": "string", + "typePrefix": "", + "writeOnly": false, }, - "title": "", - "type": "string", - "typePrefix": "", - "writeOnly": false, - }, + } } - } - isLast={true} - key="type" - renderDiscriminatorSwitch={[Function]} - showExamples={false} - /> - </tbody> -</styled.table> + isLast={true} + key="type" + renderDiscriminatorSwitch={[Function]} + showExamples={false} + /> + </tbody> + </styled.table> +</div> `; diff --git a/src/services/RedocNormalizedOptions.ts b/src/services/RedocNormalizedOptions.ts index 0cdd7f9e2a..e71bcd46c8 100644 --- a/src/services/RedocNormalizedOptions.ts +++ b/src/services/RedocNormalizedOptions.ts @@ -39,6 +39,8 @@ export interface RedocRawOptions { showObjectSchemaExamples?: boolean | string; showSecuritySchemeType?: boolean; hideSecuritySection?: boolean; + hideObjectTitle?: boolean | string; + hideObjectDescription?: boolean | string; unstable_ignoreMimeParameters?: boolean; From 6338fdc51ca9b5cd2f7c613475a43f6cdc08cebe Mon Sep 17 00:00:00 2001 From: Leo Liang <leoliang@gmail.com> Date: Fri, 5 Jan 2024 10:11:25 +0000 Subject: [PATCH 2/2] Update snapshots because class names for the styles are changed --- .../__snapshots__/FieldDetails.test.tsx.snap | 2 +- .../SecurityRequirement.test.tsx.snap | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/__tests__/__snapshots__/FieldDetails.test.tsx.snap b/src/components/__tests__/__snapshots__/FieldDetails.test.tsx.snap index f98b667a4f..5e82223877 100644 --- a/src/components/__tests__/__snapshots__/FieldDetails.test.tsx.snap +++ b/src/components/__tests__/__snapshots__/FieldDetails.test.tsx.snap @@ -159,7 +159,7 @@ exports[`FieldDetailsComponent renders correctly when field items have string ty </span> </span> <span - class="sc-kpDqfm sc-dAlyuH sc-dxcDKg cGRfjn gHomYR gXntsr" + class="sc-kpDqfm sc-dAlyuH sc-knuQbY cGRfjn gHomYR fhHPsm" > [ <span diff --git a/src/components/__tests__/__snapshots__/SecurityRequirement.test.tsx.snap b/src/components/__tests__/__snapshots__/SecurityRequirement.test.tsx.snap index 1c3d7efc81..97bca590c4 100644 --- a/src/components/__tests__/__snapshots__/SecurityRequirement.test.tsx.snap +++ b/src/components/__tests__/__snapshots__/SecurityRequirement.test.tsx.snap @@ -3,21 +3,21 @@ exports[`SecurityRequirement should render SecurityDefs 1`] = ` "<div id=\\"section/Authentication/petstore_auth\\" data-section-id=\\"section/Authentication/petstore_auth\\" class=\\"sc-dcJsrY bBkGhy\\"><div class=\\"sc-kAyceB hBQWIZ\\"><div class=\\"sc-fqkvVR oJKYx\\"><h2 class=\\"sc-jXbUNg fWnwAh\\">petstore_auth</h2><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>Get access to data while protecting your account credentials. OAuth2 is also a safer and more secure way to give you access.</p> -</div><div class=\\"sc-ejfMa-d a-DjBE\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Security Scheme Type: </b><span>OAuth2</span></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Flow type: </b><code>implicit </code></div><div class=\\"sc-dkmUuB hFwAIA\\"><strong> Authorization URL: </strong><code><a target=\\"_blank\\" rel=\\"noopener noreferrer\\" href=\\"http://petstore.swagger.io/api/oauth/dialog\\">http://petstore.swagger.io/api/oauth/dialog</a></code></div><div class=\\"sc-dkmUuB hFwAIA\\"><b> Scopes: </b></div><div class=\\"sc-iEXKAA blExNw container\\" style=\\"height: 4em;\\"><ul><li><code>write:pets</code> - <div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru sc-fhzFiK hXtrri redoc-markdown\\"><p>modify pets in your account</p> +</div><div class=\\"sc-eZYNyq fYQLSg\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Security Scheme Type: </b><span>OAuth2</span></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Flow type: </b><code>implicit </code></div><div class=\\"sc-EgOXT GPHWZ\\"><strong> Authorization URL: </strong><code><a target=\\"_blank\\" rel=\\"noopener noreferrer\\" href=\\"http://petstore.swagger.io/api/oauth/dialog\\">http://petstore.swagger.io/api/oauth/dialog</a></code></div><div class=\\"sc-EgOXT GPHWZ\\"><b> Scopes: </b></div><div class=\\"sc-dlWCHZ eWGZCd container\\" style=\\"height: 4em;\\"><ul><li><code>write:pets</code> - <div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru sc-fhzFiK hXtrri redoc-markdown\\"><p>modify pets in your account</p> </div></li><li><code>read:pets</code> - <div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru sc-fhzFiK hXtrri redoc-markdown\\"><p>read your pets</p> -</div></li></ul></div><div class=\\"sc-EgOXT bNSpXO\\"></div></div></div></div></div></div><div id=\\"section/Authentication/GitLab_PersonalAccessToken\\" data-section-id=\\"section/Authentication/GitLab_PersonalAccessToken\\" class=\\"sc-dcJsrY bBkGhy\\"><div class=\\"sc-kAyceB hBQWIZ\\"><div class=\\"sc-fqkvVR oJKYx\\"><h2 class=\\"sc-jXbUNg fWnwAh\\">GitLab_PersonalAccessToken</h2><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>GitLab Personal Access Token description</p> -</div><div class=\\"sc-ejfMa-d a-DjBE\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Security Scheme Type: </b><span>API Key</span></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Header parameter name: </b><code>PRIVATE-TOKEN</code></div></div></div></div></div></div><div id=\\"section/Authentication/GitLab_OpenIdConnect\\" data-section-id=\\"section/Authentication/GitLab_OpenIdConnect\\" class=\\"sc-dcJsrY bBkGhy\\"><div class=\\"sc-kAyceB hBQWIZ\\"><div class=\\"sc-fqkvVR oJKYx\\"><h2 class=\\"sc-jXbUNg fWnwAh\\">GitLab_OpenIdConnect</h2><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>GitLab OpenIdConnect description</p> -</div><div class=\\"sc-ejfMa-d a-DjBE\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Security Scheme Type: </b><span>OpenID Connect</span></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Connect URL: </b><code><a target=\\"_blank\\" rel=\\"noopener noreferrer\\" href=\\"https://gitlab.com/.well-known/openid-configuration\\">https://gitlab.com/.well-known/openid-configuration</a></code></div></div></div></div></div></div><div id=\\"section/Authentication/basicAuth\\" data-section-id=\\"section/Authentication/basicAuth\\" class=\\"sc-dcJsrY bBkGhy\\"><div class=\\"sc-kAyceB hBQWIZ\\"><div class=\\"sc-fqkvVR oJKYx\\"><h2 class=\\"sc-jXbUNg fWnwAh\\">basicAuth</h2><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"></div><div class=\\"sc-ejfMa-d a-DjBE\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Security Scheme Type: </b><span>HTTP</span></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>HTTP Authorization Scheme: </b><code>basic</code></div><div class=\\"sc-dkmUuB hFwAIA\\"></div></div></div></div></div></div>" +</div></li></ul></div><div class=\\"sc-hHOBiw zjoZc\\"></div></div></div></div></div></div><div id=\\"section/Authentication/GitLab_PersonalAccessToken\\" data-section-id=\\"section/Authentication/GitLab_PersonalAccessToken\\" class=\\"sc-dcJsrY bBkGhy\\"><div class=\\"sc-kAyceB hBQWIZ\\"><div class=\\"sc-fqkvVR oJKYx\\"><h2 class=\\"sc-jXbUNg fWnwAh\\">GitLab_PersonalAccessToken</h2><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>GitLab Personal Access Token description</p> +</div><div class=\\"sc-eZYNyq fYQLSg\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Security Scheme Type: </b><span>API Key</span></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Header parameter name: </b><code>PRIVATE-TOKEN</code></div></div></div></div></div></div><div id=\\"section/Authentication/GitLab_OpenIdConnect\\" data-section-id=\\"section/Authentication/GitLab_OpenIdConnect\\" class=\\"sc-dcJsrY bBkGhy\\"><div class=\\"sc-kAyceB hBQWIZ\\"><div class=\\"sc-fqkvVR oJKYx\\"><h2 class=\\"sc-jXbUNg fWnwAh\\">GitLab_OpenIdConnect</h2><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>GitLab OpenIdConnect description</p> +</div><div class=\\"sc-eZYNyq fYQLSg\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Security Scheme Type: </b><span>OpenID Connect</span></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Connect URL: </b><code><a target=\\"_blank\\" rel=\\"noopener noreferrer\\" href=\\"https://gitlab.com/.well-known/openid-configuration\\">https://gitlab.com/.well-known/openid-configuration</a></code></div></div></div></div></div></div><div id=\\"section/Authentication/basicAuth\\" data-section-id=\\"section/Authentication/basicAuth\\" class=\\"sc-dcJsrY bBkGhy\\"><div class=\\"sc-kAyceB hBQWIZ\\"><div class=\\"sc-fqkvVR oJKYx\\"><h2 class=\\"sc-jXbUNg fWnwAh\\">basicAuth</h2><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"></div><div class=\\"sc-eZYNyq fYQLSg\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Security Scheme Type: </b><span>HTTP</span></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>HTTP Authorization Scheme: </b><code>basic</code></div><div class=\\"sc-EgOXT GPHWZ\\"></div></div></div></div></div></div>" `; -exports[`SecurityRequirement should render authDefinition 1`] = `"<div class=\\"sc-bDumWk iWBBny\\"><div class=\\"sc-sLsrZ hgeUJn\\"><h5 class=\\"sc-dAlyuH sc-fifgRP jbQuod kWJur\\">Authorizations:</h5><svg class=\\"sc-cwHptR iZRiKW\\" version=\\"1.1\\" viewBox=\\"0 0 24 24\\" x=\\"0\\" xmlns=\\"http://www.w3.org/2000/svg\\" y=\\"0\\" aria-hidden=\\"true\\"><polygon points=\\"17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 \\"></polygon></svg></div><div class=\\"sc-dBmzty eoFcYg\\"><span class=\\"sc-kbousE cpXQuZ\\">(<span class=\\"sc-gfoqjT kbvnry\\">API Key: <i>GitLab_PersonalAccessToken</i></span><span class=\\"sc-gfoqjT kbvnry\\">OpenID Connect: <i>GitLab_OpenIdConnect</i></span><span class=\\"sc-gfoqjT kbvnry\\">HTTP: <i>basicAuth</i></span>) </span><span class=\\"sc-kbousE cpXQuZ\\"><span class=\\"sc-gfoqjT kbvnry\\">OAuth2: <i>petstore_auth</i></span></span></div></div>,"`; +exports[`SecurityRequirement should render authDefinition 1`] = `"<div class=\\"sc-iEXKAA jcxXwP\\"><div class=\\"sc-bDumWk bGSpwN\\"><h5 class=\\"sc-dAlyuH sc-ejfMa-d jbQuod fmqXEj\\">Authorizations:</h5><svg class=\\"sc-cwHptR iZRiKW\\" version=\\"1.1\\" viewBox=\\"0 0 24 24\\" x=\\"0\\" xmlns=\\"http://www.w3.org/2000/svg\\" y=\\"0\\" aria-hidden=\\"true\\"><polygon points=\\"17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 \\"></polygon></svg></div><div class=\\"sc-dkmUuB hSVZwQ\\"><span class=\\"sc-fifgRP dCXXEI\\">(<span class=\\"sc-dBmzty lnpucz\\">API Key: <i>GitLab_PersonalAccessToken</i></span><span class=\\"sc-dBmzty lnpucz\\">OpenID Connect: <i>GitLab_OpenIdConnect</i></span><span class=\\"sc-dBmzty lnpucz\\">HTTP: <i>basicAuth</i></span>) </span><span class=\\"sc-fifgRP dCXXEI\\"><span class=\\"sc-dBmzty lnpucz\\">OAuth2: <i>petstore_auth</i></span></span></div></div>,"`; exports[`SecurityRequirement should render authDefinition 2`] = ` -"<div class=\\"sc-bDumWk gtsPcy\\"><div class=\\"sc-sLsrZ hgeUJn\\"><h5 class=\\"sc-dAlyuH sc-fifgRP jbQuod kWJur\\">Authorizations:</h5><svg class=\\"sc-cwHptR dSJqIk\\" version=\\"1.1\\" viewBox=\\"0 0 24 24\\" x=\\"0\\" xmlns=\\"http://www.w3.org/2000/svg\\" y=\\"0\\" aria-hidden=\\"true\\"><polygon points=\\"17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 \\"></polygon></svg></div><div class=\\"sc-dBmzty llvZdI\\"><span class=\\"sc-kbousE dOwJQz\\">(<span class=\\"sc-gfoqjT kbvnry\\">API Key: <i>GitLab_PersonalAccessToken</i></span><span class=\\"sc-gfoqjT kbvnry\\">OpenID Connect: <i>GitLab_OpenIdConnect</i></span><span class=\\"sc-gfoqjT kbvnry\\">HTTP: <i>basicAuth</i></span>) </span><span class=\\"sc-kbousE dOwJQz\\"><span class=\\"sc-gfoqjT kbvnry\\">OAuth2: <i>petstore_auth</i> (<code class=\\"sc-eyvILC bzHwfc\\">write:pets</code><code class=\\"sc-eyvILC bzHwfc\\">read:pets</code>) </span></span></div></div><div class=\\"sc-ejfMa-d a-DjBE\\"><h5><svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 24 24\\" width=\\"11\\" height=\\"11\\"><path fill=\\"currentColor\\" d=\\"M18 10V6A6 6 0 0 0 6 6v4H3v14h18V10h-3zM8 6c0-2.206 1.794-4 4-4s4 1.794 4 4v4H8V6zm11 16H5V12h14v10z\\"></path></svg> OAuth2: petstore_auth</h5><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>Get access to data while protecting your account credentials. +"<div class=\\"sc-iEXKAA frhMMv\\"><div class=\\"sc-bDumWk bGSpwN\\"><h5 class=\\"sc-dAlyuH sc-ejfMa-d jbQuod fmqXEj\\">Authorizations:</h5><svg class=\\"sc-cwHptR dSJqIk\\" version=\\"1.1\\" viewBox=\\"0 0 24 24\\" x=\\"0\\" xmlns=\\"http://www.w3.org/2000/svg\\" y=\\"0\\" aria-hidden=\\"true\\"><polygon points=\\"17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 \\"></polygon></svg></div><div class=\\"sc-dkmUuB kAGRNw\\"><span class=\\"sc-fifgRP tCRMq\\">(<span class=\\"sc-dBmzty lnpucz\\">API Key: <i>GitLab_PersonalAccessToken</i></span><span class=\\"sc-dBmzty lnpucz\\">OpenID Connect: <i>GitLab_OpenIdConnect</i></span><span class=\\"sc-dBmzty lnpucz\\">HTTP: <i>basicAuth</i></span>) </span><span class=\\"sc-fifgRP tCRMq\\"><span class=\\"sc-dBmzty lnpucz\\">OAuth2: <i>petstore_auth</i> (<code class=\\"sc-sLsrZ IIDgM\\">write:pets</code><code class=\\"sc-sLsrZ IIDgM\\">read:pets</code>) </span></span></div></div><div class=\\"sc-eZYNyq fYQLSg\\"><h5><svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 24 24\\" width=\\"11\\" height=\\"11\\"><path fill=\\"currentColor\\" d=\\"M18 10V6A6 6 0 0 0 6 6v4H3v14h18V10h-3zM8 6c0-2.206 1.794-4 4-4s4 1.794 4 4v4H8V6zm11 16H5V12h14v10z\\"></path></svg> OAuth2: petstore_auth</h5><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>Get access to data while protecting your account credentials. OAuth2 is also a safer and more secure way to give you access.</p> -</div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Flow type: </b><code>implicit </code></div><div class=\\"sc-dkmUuB hFwAIA\\"><strong> Authorization URL: </strong><code><a target=\\"_blank\\" rel=\\"noopener noreferrer\\" href=\\"http://petstore.swagger.io/api/oauth/dialog\\">http://petstore.swagger.io/api/oauth/dialog</a></code></div><div><b>Required scopes: </b><code>write:pets</code> <code>read:pets</code> </div><div class=\\"sc-dkmUuB hFwAIA\\"><b> Scopes: </b></div><div class=\\"sc-iEXKAA blExNw container\\" style=\\"height: 4em;\\"><ul><li><code>write:pets</code> - <div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru sc-fhzFiK hXtrri redoc-markdown\\"><p>modify pets in your account</p> +</div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Flow type: </b><code>implicit </code></div><div class=\\"sc-EgOXT GPHWZ\\"><strong> Authorization URL: </strong><code><a target=\\"_blank\\" rel=\\"noopener noreferrer\\" href=\\"http://petstore.swagger.io/api/oauth/dialog\\">http://petstore.swagger.io/api/oauth/dialog</a></code></div><div><b>Required scopes: </b><code>write:pets</code> <code>read:pets</code> </div><div class=\\"sc-EgOXT GPHWZ\\"><b> Scopes: </b></div><div class=\\"sc-dlWCHZ eWGZCd container\\" style=\\"height: 4em;\\"><ul><li><code>write:pets</code> - <div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru sc-fhzFiK hXtrri redoc-markdown\\"><p>modify pets in your account</p> </div></li><li><code>read:pets</code> - <div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru sc-fhzFiK hXtrri redoc-markdown\\"><p>read your pets</p> -</div></li></ul></div><div class=\\"sc-EgOXT bNSpXO\\"></div></div></div><div class=\\"sc-ejfMa-d a-DjBE\\"><h5><svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 24 24\\" width=\\"11\\" height=\\"11\\"><path fill=\\"currentColor\\" d=\\"M18 10V6A6 6 0 0 0 6 6v4H3v14h18V10h-3zM8 6c0-2.206 1.794-4 4-4s4 1.794 4 4v4H8V6zm11 16H5V12h14v10z\\"></path></svg> API Key: GitLab_PersonalAccessToken</h5><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>GitLab Personal Access Token description</p> -</div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Header parameter name: </b><code>PRIVATE-TOKEN</code></div></div></div><div class=\\"sc-ejfMa-d a-DjBE\\"><h5><svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 24 24\\" width=\\"11\\" height=\\"11\\"><path fill=\\"currentColor\\" d=\\"M18 10V6A6 6 0 0 0 6 6v4H3v14h18V10h-3zM8 6c0-2.206 1.794-4 4-4s4 1.794 4 4v4H8V6zm11 16H5V12h14v10z\\"></path></svg> OpenID Connect: GitLab_OpenIdConnect</h5><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>GitLab OpenIdConnect description</p> -</div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>Connect URL: </b><code><a target=\\"_blank\\" rel=\\"noopener noreferrer\\" href=\\"https://gitlab.com/.well-known/openid-configuration\\">https://gitlab.com/.well-known/openid-configuration</a></code></div></div></div><div class=\\"sc-ejfMa-d a-DjBE\\"><h5><svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 24 24\\" width=\\"11\\" height=\\"11\\"><path fill=\\"currentColor\\" d=\\"M18 10V6A6 6 0 0 0 6 6v4H3v14h18V10h-3zM8 6c0-2.206 1.794-4 4-4s4 1.794 4 4v4H8V6zm11 16H5V12h14v10z\\"></path></svg> HTTP: basicAuth</h5><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-dkmUuB hFwAIA\\"><b>HTTP Authorization Scheme: </b><code>basic</code></div><div class=\\"sc-dkmUuB hFwAIA\\"></div></div></div>," +</div></li></ul></div><div class=\\"sc-hHOBiw zjoZc\\"></div></div></div><div class=\\"sc-eZYNyq fYQLSg\\"><h5><svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 24 24\\" width=\\"11\\" height=\\"11\\"><path fill=\\"currentColor\\" d=\\"M18 10V6A6 6 0 0 0 6 6v4H3v14h18V10h-3zM8 6c0-2.206 1.794-4 4-4s4 1.794 4 4v4H8V6zm11 16H5V12h14v10z\\"></path></svg> API Key: GitLab_PersonalAccessToken</h5><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>GitLab Personal Access Token description</p> +</div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Header parameter name: </b><code>PRIVATE-TOKEN</code></div></div></div><div class=\\"sc-eZYNyq fYQLSg\\"><h5><svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 24 24\\" width=\\"11\\" height=\\"11\\"><path fill=\\"currentColor\\" d=\\"M18 10V6A6 6 0 0 0 6 6v4H3v14h18V10h-3zM8 6c0-2.206 1.794-4 4-4s4 1.794 4 4v4H8V6zm11 16H5V12h14v10z\\"></path></svg> OpenID Connect: GitLab_OpenIdConnect</h5><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><p>GitLab OpenIdConnect description</p> +</div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>Connect URL: </b><code><a target=\\"_blank\\" rel=\\"noopener noreferrer\\" href=\\"https://gitlab.com/.well-known/openid-configuration\\">https://gitlab.com/.well-known/openid-configuration</a></code></div></div></div><div class=\\"sc-eZYNyq fYQLSg\\"><h5><svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 24 24\\" width=\\"11\\" height=\\"11\\"><path fill=\\"currentColor\\" d=\\"M18 10V6A6 6 0 0 0 6 6v4H3v14h18V10h-3zM8 6c0-2.206 1.794-4 4-4s4 1.794 4 4v4H8V6zm11 16H5V12h14v10z\\"></path></svg> HTTP: basicAuth</h5><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"></div><div class=\\"sc-eeDRCY sc-eBMEME gTGgei fMmru\\"><div class=\\"sc-EgOXT GPHWZ\\"><b>HTTP Authorization Scheme: </b><code>basic</code></div><div class=\\"sc-EgOXT GPHWZ\\"></div></div></div>," `;