From da7b369ffd6047593dd0764797f34d9bde8e8b8f Mon Sep 17 00:00:00 2001 From: "Nolann B." <100787331+nolannbiron@users.noreply.github.com> Date: Tue, 1 Apr 2025 21:57:36 +0200 Subject: [PATCH 001/136] Fix missing headers in OpenAPIResponses (#3074) --- .changeset/afraid-impalas-bow.md | 6 +++ .../react-openapi/src/OpenAPIResponse.tsx | 16 +++--- .../react-openapi/src/OpenAPIResponses.tsx | 49 ++++++++++++++----- 3 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 .changeset/afraid-impalas-bow.md diff --git a/.changeset/afraid-impalas-bow.md b/.changeset/afraid-impalas-bow.md new file mode 100644 index 000000000..2d875bbd8 --- /dev/null +++ b/.changeset/afraid-impalas-bow.md @@ -0,0 +1,6 @@ +--- +'@gitbook/react-openapi': patch +'gitbook': patch +--- + +Fix missing headers in OpenAPIResponses diff --git a/packages/react-openapi/src/OpenAPIResponse.tsx b/packages/react-openapi/src/OpenAPIResponse.tsx index 163d3eb8e..77f44d5dd 100644 --- a/packages/react-openapi/src/OpenAPIResponse.tsx +++ b/packages/react-openapi/src/OpenAPIResponse.tsx @@ -36,13 +36,15 @@ export function OpenAPIResponse(props: { /> ) : null} -
- -
+ {mediaType.schema && ( +
+ +
+ )} ); } diff --git a/packages/react-openapi/src/OpenAPIResponses.tsx b/packages/react-openapi/src/OpenAPIResponses.tsx index 4e06a781a..cc577e53d 100644 --- a/packages/react-openapi/src/OpenAPIResponses.tsx +++ b/packages/react-openapi/src/OpenAPIResponses.tsx @@ -21,7 +21,42 @@ export function OpenAPIResponses(props: { icon={context.icons.chevronRight} groups={Object.entries(responses).map( ([statusCode, response]: [string, OpenAPIV3.ResponseObject]) => { - const content = Object.entries(response.content ?? {}); + const tabs = (() => { + // If there is no content, but there are headers, we need to show the headers + if ( + (!response.content || !Object.keys(response.content).length) && + response.headers && + Object.keys(response.headers).length + ) { + return [ + { + id: 'default', + body: ( + + ), + }, + ]; + } + + return Object.entries(response.content ?? {}).map( + ([contentType, mediaType]) => ({ + id: contentType, + label: contentType, + body: ( + + ), + }) + ); + })(); + const description = response.description; return { @@ -39,17 +74,7 @@ export function OpenAPIResponses(props: { ) : null} ), - tabs: content.map(([contentType, mediaType]) => ({ - id: contentType, - label: contentType, - body: ( - - ), - })), + tabs, }; } )} From 139a8050a5096925b27bf01ad962d09a8f5d2fd3 Mon Sep 17 00:00:00 2001 From: "Nolann B." <100787331+nolannbiron@users.noreply.github.com> Date: Wed, 2 Apr 2025 10:15:19 +0200 Subject: [PATCH 002/136] Fix OpenAPI enum display (#3077) --- .changeset/spotty-brooms-itch.md | 6 ++++ .../components/DocumentView/OpenAPI/style.css | 8 ++--- packages/react-openapi/src/OpenAPISchema.tsx | 30 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) create mode 100644 .changeset/spotty-brooms-itch.md diff --git a/.changeset/spotty-brooms-itch.md b/.changeset/spotty-brooms-itch.md new file mode 100644 index 000000000..b203df1bb --- /dev/null +++ b/.changeset/spotty-brooms-itch.md @@ -0,0 +1,6 @@ +--- +'@gitbook/react-openapi': patch +'gitbook': patch +--- + +Fix OpenAPI enum display diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/style.css b/packages/gitbook/src/components/DocumentView/OpenAPI/style.css index c0bf8d13c..4f76998b1 100644 --- a/packages/gitbook/src/components/DocumentView/OpenAPI/style.css +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/style.css @@ -265,15 +265,11 @@ /* Schema Enum */ .openapi-schema-enum { - @apply flex flex-row text-sm leading-relaxed gap-2 flex-wrap text-tint; -} - -.openapi-schema-enum-list { - @apply flex flex-row gap-1.5 items-center; + @apply text-sm leading-relaxed max-w-full text-tint; } .openapi-schema-enum-value { - @apply text-sm; + @apply text-sm mr-1.5; } .openapi-schema-enum-value:first-child { diff --git a/packages/react-openapi/src/OpenAPISchema.tsx b/packages/react-openapi/src/OpenAPISchema.tsx index 3e41f6501..435a2508b 100644 --- a/packages/react-openapi/src/OpenAPISchema.tsx +++ b/packages/react-openapi/src/OpenAPISchema.tsx @@ -275,22 +275,20 @@ function OpenAPISchemaEnum(props: { } return ( -
- Available options: -
- {enumValues.map((item, index) => ( - - - {`${item.value}`} - - - ))} -
-
+ + Available options:{' '} + {enumValues.map((item, index) => ( + + + {`${item.value}`} + + + ))} + ); } From da485f5144f797498465083db91c415e9b64e27e Mon Sep 17 00:00:00 2001 From: "Nolann B." <100787331+nolannbiron@users.noreply.github.com> Date: Wed, 2 Apr 2025 13:03:51 +0200 Subject: [PATCH 003/136] Fix read-only in generateSchemaExample (#3069) --- .changeset/short-toes-accept.md | 5 + .../src/OpenAPIResponseExample.tsx | 7 +- .../src/generateSchemaExample.ts | 134 +++++++++++++----- 3 files changed, 109 insertions(+), 37 deletions(-) create mode 100644 .changeset/short-toes-accept.md diff --git a/.changeset/short-toes-accept.md b/.changeset/short-toes-accept.md new file mode 100644 index 000000000..604256e63 --- /dev/null +++ b/.changeset/short-toes-accept.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': patch +--- + +Fix read-only in generateSchemaExample diff --git a/packages/react-openapi/src/OpenAPIResponseExample.tsx b/packages/react-openapi/src/OpenAPIResponseExample.tsx index fe7f2666e..94a7399f9 100644 --- a/packages/react-openapi/src/OpenAPIResponseExample.tsx +++ b/packages/react-openapi/src/OpenAPIResponseExample.tsx @@ -268,6 +268,7 @@ function getExamplesFromMediaTypeObject(args: { value: { [root]: generateSchemaExample(mediaTypeObject.schema, { xml: mediaType === 'application/xml', + mode: 'read', }), }, }, @@ -277,7 +278,11 @@ function getExamplesFromMediaTypeObject(args: { return [ { key: 'default', - example: { value: generateSchemaExample(mediaTypeObject.schema) }, + example: { + value: generateSchemaExample(mediaTypeObject.schema, { + mode: 'read', + }), + }, }, ]; } diff --git a/packages/react-openapi/src/generateSchemaExample.ts b/packages/react-openapi/src/generateSchemaExample.ts index 01d06565c..d1153afb6 100644 --- a/packages/react-openapi/src/generateSchemaExample.ts +++ b/packages/react-openapi/src/generateSchemaExample.ts @@ -16,14 +16,10 @@ export function generateSchemaExample( schema: OpenAPIV3.SchemaObject, options?: GenerateSchemaExampleOptions ): JSONValue | undefined { - return getExampleFromSchema( - schema, - { - emptyString: 'text', - ...options, - }, - 3 // Max depth for circular references - ); + return getExampleFromSchema(schema, { + emptyString: 'text', + ...options, + }); } /** @@ -103,21 +99,6 @@ function guessFromFormat(schema: Record, fallback = '') { return genericExampleValues[schema.format] ?? fallback; } -/** Map of all the results */ -const resultCache = new WeakMap, any>(); - -/** Store result in the cache, and return the result */ -function cache(schema: Record, result: unknown) { - // Avoid unnecessary WeakMap operations for primitive values - if (typeof result !== 'object' || result === null) { - return result; - } - - resultCache.set(schema, result); - - return result; -} - /** * This function takes an OpenAPI schema and generates an example from it * Forked from : https://github.com/scalar/scalar/blob/main/packages/oas-utils/src/spec-getters/getExampleFromSchema.ts @@ -152,8 +133,20 @@ const getExampleFromSchema = ( }, level = 0, parentSchema?: Record, - name?: string + name?: string, + resultCache = new WeakMap, any>() ): any => { + // Store result in the cache, and return the result + function cache(schema: Record, result: unknown) { + // Avoid unnecessary WeakMap operations for primitive values + if (typeof result !== 'object' || result === null) { + return result; + } + + resultCache.set(schema, result); + return result; + } + // Check if the result is already cached if (resultCache.has(schema)) { return resultCache.get(schema); @@ -245,7 +238,8 @@ const getExampleFromSchema = ( options, level + 1, schema, - propertyName + propertyName, + resultCache ); if (typeof response[propertyXmlTagName ?? propertyName] === 'undefined') { @@ -269,7 +263,8 @@ const getExampleFromSchema = ( options, level + 1, schema, - exampleKey + exampleKey, + resultCache ); } } @@ -290,21 +285,51 @@ const getExampleFromSchema = ( response.ANY_ADDITIONAL_PROPERTY = getExampleFromSchema( schema.additionalProperties, options, - level + 1 + level + 1, + undefined, + undefined, + resultCache ); } } if (schema.anyOf !== undefined) { - Object.assign(response, getExampleFromSchema(schema.anyOf[0], options, level + 1)); + Object.assign( + response, + getExampleFromSchema( + schema.anyOf[0], + options, + level + 1, + undefined, + undefined, + resultCache + ) + ); } else if (schema.oneOf !== undefined) { - Object.assign(response, getExampleFromSchema(schema.oneOf[0], options, level + 1)); + Object.assign( + response, + getExampleFromSchema( + schema.oneOf[0], + options, + level + 1, + undefined, + undefined, + resultCache + ) + ); } else if (schema.allOf !== undefined) { Object.assign( response, ...schema.allOf .map((item: Record) => - getExampleFromSchema(item, options, level + 1, schema) + getExampleFromSchema( + item, + options, + level + 1, + schema, + undefined, + resultCache + ) ) .filter((item: any) => item !== undefined) ); @@ -335,7 +360,9 @@ const getExampleFromSchema = ( { type: 'object', allOf: schema.items.allOf }, options, level + 1, - schema + schema, + undefined, + resultCache ); return cache( @@ -346,7 +373,14 @@ const getExampleFromSchema = ( // For non-objects (like strings), collect all examples const examples = schema.items.allOf .map((item: Record) => - getExampleFromSchema(item, options, level + 1, schema) + getExampleFromSchema( + item, + options, + level + 1, + schema, + undefined, + resultCache + ) ) .filter((item: any) => item !== undefined); @@ -368,7 +402,14 @@ const getExampleFromSchema = ( const schemas = schema.items[rule].slice(0, 1); const exampleFromRule = schemas .map((item: Record) => - getExampleFromSchema(item, options, level + 1, schema) + getExampleFromSchema( + item, + options, + level + 1, + schema, + undefined, + resultCache + ) ) .filter((item: any) => item !== undefined); @@ -380,7 +421,14 @@ const getExampleFromSchema = ( } if (schema.items?.type) { - const exampleFromSchema = getExampleFromSchema(schema.items, options, level + 1); + const exampleFromSchema = getExampleFromSchema( + schema.items, + options, + level + 1, + undefined, + undefined, + resultCache + ); return wrapItems ? [{ [itemsXmlTagName]: exampleFromSchema }] : [exampleFromSchema]; } @@ -407,7 +455,14 @@ const getExampleFromSchema = ( const firstOneOfItem = discriminateSchema[0]; // Return an example for the first item - return getExampleFromSchema(firstOneOfItem, options, level + 1); + return getExampleFromSchema( + firstOneOfItem, + options, + level + 1, + undefined, + undefined, + resultCache + ); } // Check if schema has the `allOf` key @@ -417,7 +472,14 @@ const getExampleFromSchema = ( // Loop through all `allOf` schemas schema.allOf.forEach((allOfItem: Record) => { // Return an example from the schema - const newExample = getExampleFromSchema(allOfItem, options, level + 1); + const newExample = getExampleFromSchema( + allOfItem, + options, + level + 1, + undefined, + undefined, + resultCache + ); // Merge or overwrite the example example = From c0b339e406a6871ec5da4244aaa25987bf1a2031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Wed, 2 Apr 2025 13:36:04 +0200 Subject: [PATCH 004/136] Version Packages (#3075) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/afraid-impalas-bow.md | 6 ------ .changeset/short-toes-accept.md | 5 ----- .changeset/spotty-brooms-itch.md | 6 ------ packages/gitbook/CHANGELOG.md | 11 +++++++++++ packages/gitbook/package.json | 2 +- packages/react-openapi/CHANGELOG.md | 8 ++++++++ packages/react-openapi/package.json | 2 +- 7 files changed, 21 insertions(+), 19 deletions(-) delete mode 100644 .changeset/afraid-impalas-bow.md delete mode 100644 .changeset/short-toes-accept.md delete mode 100644 .changeset/spotty-brooms-itch.md diff --git a/.changeset/afraid-impalas-bow.md b/.changeset/afraid-impalas-bow.md deleted file mode 100644 index 2d875bbd8..000000000 --- a/.changeset/afraid-impalas-bow.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@gitbook/react-openapi': patch -'gitbook': patch ---- - -Fix missing headers in OpenAPIResponses diff --git a/.changeset/short-toes-accept.md b/.changeset/short-toes-accept.md deleted file mode 100644 index 604256e63..000000000 --- a/.changeset/short-toes-accept.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@gitbook/react-openapi': patch ---- - -Fix read-only in generateSchemaExample diff --git a/.changeset/spotty-brooms-itch.md b/.changeset/spotty-brooms-itch.md deleted file mode 100644 index b203df1bb..000000000 --- a/.changeset/spotty-brooms-itch.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@gitbook/react-openapi': patch -'gitbook': patch ---- - -Fix OpenAPI enum display diff --git a/packages/gitbook/CHANGELOG.md b/packages/gitbook/CHANGELOG.md index fbb5ed1ae..0aac44a69 100644 --- a/packages/gitbook/CHANGELOG.md +++ b/packages/gitbook/CHANGELOG.md @@ -1,5 +1,16 @@ # gitbook +## 0.9.2 + +### Patch Changes + +- da7b369: Fix missing headers in OpenAPIResponses +- 139a805: Fix OpenAPI enum display +- Updated dependencies [da7b369] +- Updated dependencies [da485f5] +- Updated dependencies [139a805] + - @gitbook/react-openapi@1.1.9 + ## 0.9.1 ### Patch Changes diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json index 58b07756a..84d2fa83c 100644 --- a/packages/gitbook/package.json +++ b/packages/gitbook/package.json @@ -1,6 +1,6 @@ { "name": "gitbook", - "version": "0.9.1", + "version": "0.9.2", "private": true, "scripts": { "dev": "env-cmd --silent -f ../../.env.local next dev", diff --git a/packages/react-openapi/CHANGELOG.md b/packages/react-openapi/CHANGELOG.md index d977f51c3..2a2ae6011 100644 --- a/packages/react-openapi/CHANGELOG.md +++ b/packages/react-openapi/CHANGELOG.md @@ -1,5 +1,13 @@ # @gitbook/react-openapi +## 1.1.9 + +### Patch Changes + +- da7b369: Fix missing headers in OpenAPIResponses +- da485f5: Fix read-only in generateSchemaExample +- 139a805: Fix OpenAPI enum display + ## 1.1.8 ### Patch Changes diff --git a/packages/react-openapi/package.json b/packages/react-openapi/package.json index d1f2b29ef..f6e6753ff 100644 --- a/packages/react-openapi/package.json +++ b/packages/react-openapi/package.json @@ -8,7 +8,7 @@ "default": "./dist/index.js" } }, - "version": "1.1.8", + "version": "1.1.9", "sideEffects": false, "dependencies": { "@gitbook/openapi-parser": "workspace:*", From 2b6c593289a8144f4523a201a0f223bd7b6461a5 Mon Sep 17 00:00:00 2001 From: "Nolann B." <100787331+nolannbiron@users.noreply.github.com> Date: Thu, 3 Apr 2025 11:33:39 +0200 Subject: [PATCH 005/136] Remove stable from x-stability (#3083) --- .changeset/old-pianos-talk.md | 7 +++++++ .../gitbook/src/components/DocumentView/OpenAPI/style.css | 4 ---- packages/openapi-parser/src/types.ts | 4 ++-- packages/react-openapi/src/OpenAPIOperation.tsx | 1 - 4 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 .changeset/old-pianos-talk.md diff --git a/.changeset/old-pianos-talk.md b/.changeset/old-pianos-talk.md new file mode 100644 index 000000000..8b69bb36a --- /dev/null +++ b/.changeset/old-pianos-talk.md @@ -0,0 +1,7 @@ +--- +'@gitbook/openapi-parser': patch +'@gitbook/react-openapi': patch +'gitbook': patch +--- + +Remove stable from x-stability diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/style.css b/packages/gitbook/src/components/DocumentView/OpenAPI/style.css index 4f76998b1..ce178f3bb 100644 --- a/packages/gitbook/src/components/DocumentView/OpenAPI/style.css +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/style.css @@ -29,10 +29,6 @@ @apply py-0.5 px-1.5 min-w-[1.625rem] font-normal w-fit justify-center items-center ring-1 ring-inset ring-tint bg-tint rounded text-sm leading-[calc(max(1.20em,1.25rem))] before:!content-none after:!content-none; } -.openapi-stability-stable { - @apply text-green-600 dark:text-green-300 bg-green-50 dark:bg-green-900/6 ring-green-500/5; -} - .openapi-stability-alpha { @apply text-amber-700 dark:text-amber-300 bg-amber-50 dark:bg-amber-900/6 ring-amber-500/5; } diff --git a/packages/openapi-parser/src/types.ts b/packages/openapi-parser/src/types.ts index 6c72c284c..fa5b6ade3 100644 --- a/packages/openapi-parser/src/types.ts +++ b/packages/openapi-parser/src/types.ts @@ -65,12 +65,12 @@ export interface OpenAPICustomOperationProperties { /** * Stability of the operation. - * @enum 'experimental' | 'alpha' | 'beta' | 'stable' + * @enum 'experimental' | 'alpha' | 'beta' */ 'x-stability'?: OpenAPIStability; } -export type OpenAPIStability = 'experimental' | 'alpha' | 'beta' | 'stable'; +export type OpenAPIStability = 'experimental' | 'alpha' | 'beta'; /** * Custom code samples that can be defined at the operation level. diff --git a/packages/react-openapi/src/OpenAPIOperation.tsx b/packages/react-openapi/src/OpenAPIOperation.tsx index e5672c631..0857c3185 100644 --- a/packages/react-openapi/src/OpenAPIOperation.tsx +++ b/packages/react-openapi/src/OpenAPIOperation.tsx @@ -108,7 +108,6 @@ const stabilityEnum = { experimental: 'Experimental', alpha: 'Alpha', beta: 'Beta', - stable: 'Stable', } as const; function OpenAPIOperationStability(props: { stability: OpenAPIStability }) { From b9c929beebd0d555dbe6ba1cf6c7bc7308a1d14c Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Thu, 3 Apr 2025 16:34:14 +0200 Subject: [PATCH 006/136] Update page breadcrumb color (for `links-accent` crumbs) (#3082) --- packages/gitbook/src/components/PageBody/PageHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/gitbook/src/components/PageBody/PageHeader.tsx b/packages/gitbook/src/components/PageBody/PageHeader.tsx index 42564c84e..a246b0475 100644 --- a/packages/gitbook/src/components/PageBody/PageHeader.tsx +++ b/packages/gitbook/src/components/PageBody/PageHeader.tsx @@ -27,7 +27,7 @@ export async function PageHeader(props: { > {ancestors.length > 0 && (