mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-21 01:53:26 +00:00
Fix internal properties appearing in OpenAPI docs. (#2774)
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
'@gitbook/react-openapi': minor
|
||||||
|
'gitbook': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Fix internal properties appearing in OpenAPI docs.
|
||||||
@@ -8,6 +8,7 @@ import { getServersURL } from './OpenAPIServerURL';
|
|||||||
import { ScalarApiButton } from './ScalarApiButton';
|
import { ScalarApiButton } from './ScalarApiButton';
|
||||||
import { OpenAPIContextProps } from './types';
|
import { OpenAPIContextProps } from './types';
|
||||||
import { noReference } from './utils';
|
import { noReference } from './utils';
|
||||||
|
import { stringifyOpenAPI } from './stringifyOpenAPI';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display code samples to execute the operation.
|
* Display code samples to execute the operation.
|
||||||
@@ -34,7 +35,7 @@ export function OpenAPICodeSample(props: {
|
|||||||
: undefined;
|
: undefined;
|
||||||
if (example !== undefined) {
|
if (example !== undefined) {
|
||||||
headersObject[param.name] =
|
headersObject[param.name] =
|
||||||
typeof example !== 'string' ? JSON.stringify(example) : example;
|
typeof example !== 'string' ? stringifyOpenAPI(example) : example;
|
||||||
}
|
}
|
||||||
} else if (param.in === 'query' && param.required) {
|
} else if (param.in === 'query' && param.required) {
|
||||||
const example = param.schema
|
const example = param.schema
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { OpenAPIOperationData } from './fetchOpenAPIOperation';
|
|||||||
import { generateSchemaExample } from './generateSchemaExample';
|
import { generateSchemaExample } from './generateSchemaExample';
|
||||||
import { OpenAPIContextProps } from './types';
|
import { OpenAPIContextProps } from './types';
|
||||||
import { createStateKey, noReference } from './utils';
|
import { createStateKey, noReference } from './utils';
|
||||||
|
import { stringifyOpenAPI } from './stringifyOpenAPI';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display an example of the response content.
|
* Display an example of the response content.
|
||||||
@@ -63,7 +64,9 @@ export function OpenAPIResponseExample(props: {
|
|||||||
body: (
|
body: (
|
||||||
<context.CodeBlock
|
<context.CodeBlock
|
||||||
code={
|
code={
|
||||||
typeof example === 'string' ? example : JSON.stringify(example, null, 2)
|
typeof example === 'string'
|
||||||
|
? example
|
||||||
|
: stringifyOpenAPI(example, null, 2)
|
||||||
}
|
}
|
||||||
syntax="json"
|
syntax="json"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { Markdown } from './Markdown';
|
|||||||
import { SYMBOL_REF_RESOLVED } from './resolveOpenAPIPath';
|
import { SYMBOL_REF_RESOLVED } from './resolveOpenAPIPath';
|
||||||
import { OpenAPIClientContext } from './types';
|
import { OpenAPIClientContext } from './types';
|
||||||
import { noReference } from './utils';
|
import { noReference } from './utils';
|
||||||
|
import { stringifyOpenAPI } from './stringifyOpenAPI';
|
||||||
|
|
||||||
type CircularRefsIds = Map<OpenAPIV3.SchemaObject, string>;
|
type CircularRefsIds = Map<OpenAPIV3.SchemaObject, string>;
|
||||||
|
|
||||||
@@ -101,7 +102,7 @@ export function OpenAPISchemaProperty(
|
|||||||
) : null}
|
) : null}
|
||||||
{shouldDisplayExample(schema) ? (
|
{shouldDisplayExample(schema) ? (
|
||||||
<span className="openapi-schema-example">
|
<span className="openapi-schema-example">
|
||||||
Example: <code>{JSON.stringify(schema.example)}</code>
|
Example: <code>{stringifyOpenAPI(schema.example)}</code>
|
||||||
</span>
|
</span>
|
||||||
) : null}
|
) : null}
|
||||||
{schema.pattern ? (
|
{schema.pattern ? (
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { stringifyOpenAPI } from './stringifyOpenAPI';
|
||||||
|
|
||||||
export interface CodeSampleInput {
|
export interface CodeSampleInput {
|
||||||
method: string;
|
method: string;
|
||||||
url: string;
|
url: string;
|
||||||
@@ -24,11 +26,11 @@ export const codeSampleGenerators: CodeSampleGenerator[] = [
|
|||||||
method: '${method.toUpperCase()}',\n`;
|
method: '${method.toUpperCase()}',\n`;
|
||||||
|
|
||||||
if (headers) {
|
if (headers) {
|
||||||
code += indent(`headers: ${JSON.stringify(headers, null, 2)},\n`, 4);
|
code += indent(`headers: ${stringifyOpenAPI(headers, null, 2)},\n`, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (body) {
|
if (body) {
|
||||||
code += indent(`body: JSON.stringify(${JSON.stringify(body, null, 2)}),\n`, 4);
|
code += indent(`body: JSON.stringify(${stringifyOpenAPI(body, null, 2)}),\n`, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
code += `});\n`;
|
code += `});\n`;
|
||||||
@@ -59,7 +61,7 @@ export const codeSampleGenerators: CodeSampleGenerator[] = [
|
|||||||
lines.push(`'${url}'`);
|
lines.push(`'${url}'`);
|
||||||
|
|
||||||
if (body) {
|
if (body) {
|
||||||
lines.push(`-d '${JSON.stringify(body)}'`);
|
lines.push(`-d '${stringifyOpenAPI(body)}'`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return lines.map((line, index) => (index > 0 ? indent(line, 2) : line)).join(separator);
|
return lines.map((line, index) => (index > 0 ? indent(line, 2) : line)).join(separator);
|
||||||
@@ -74,10 +76,10 @@ export const codeSampleGenerators: CodeSampleGenerator[] = [
|
|||||||
code += `response = requests.${method.toLowerCase()}(\n`;
|
code += `response = requests.${method.toLowerCase()}(\n`;
|
||||||
code += indent(`"${url}",\n`, 4);
|
code += indent(`"${url}",\n`, 4);
|
||||||
if (headers) {
|
if (headers) {
|
||||||
code += indent(`headers=${JSON.stringify(headers)},\n`, 4);
|
code += indent(`headers=${stringifyOpenAPI(headers)},\n`, 4);
|
||||||
}
|
}
|
||||||
if (body) {
|
if (body) {
|
||||||
code += indent(`json=${JSON.stringify(body)}\n`, 4);
|
code += indent(`json=${stringifyOpenAPI(body)}\n`, 4);
|
||||||
}
|
}
|
||||||
code += ')\n';
|
code += ')\n';
|
||||||
code += `data = response.json()`;
|
code += `data = response.json()`;
|
||||||
@@ -93,7 +95,7 @@ export const codeSampleGenerators: CodeSampleGenerator[] = [
|
|||||||
|
|
||||||
if (body) {
|
if (body) {
|
||||||
// if we had a body add a content length header
|
// if we had a body add a content length header
|
||||||
const bodyContent = body ? JSON.stringify(body) : '';
|
const bodyContent = body ? stringifyOpenAPI(body) : '';
|
||||||
// handle unicode chars with a text encoder
|
// handle unicode chars with a text encoder
|
||||||
const encoder = new TextEncoder();
|
const encoder = new TextEncoder();
|
||||||
|
|
||||||
@@ -115,7 +117,7 @@ export const codeSampleGenerators: CodeSampleGenerator[] = [
|
|||||||
.join('\n') + '\n'
|
.join('\n') + '\n'
|
||||||
: '';
|
: '';
|
||||||
|
|
||||||
const bodyString = body ? `\n${JSON.stringify(body, null, 2)}` : '';
|
const bodyString = body ? `\n${stringifyOpenAPI(body, null, 2)}` : '';
|
||||||
|
|
||||||
const httpRequest = `${method.toUpperCase()} ${decodeURI(path)} HTTP/1.1
|
const httpRequest = `${method.toUpperCase()} ${decodeURI(path)} HTTP/1.1
|
||||||
Host: ${host}
|
Host: ${host}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { OpenAPIFetcher } from './types';
|
import { OpenAPIFetcher } from './types';
|
||||||
|
|
||||||
const SYMBOL_MARKDOWN_PARSED = '__$markdownParsed';
|
export const SYMBOL_MARKDOWN_PARSED = '__$markdownParsed';
|
||||||
export const SYMBOL_REF_RESOLVED = '__$refResolved';
|
export const SYMBOL_REF_RESOLVED = '__$refResolved';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { SYMBOL_MARKDOWN_PARSED, SYMBOL_REF_RESOLVED } from './resolveOpenAPIPath';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stringify an OpenAPI object. Same API as JSON.stringify.
|
||||||
|
*/
|
||||||
|
export function stringifyOpenAPI(body: unknown, transformer?: null, indent?: number): string {
|
||||||
|
return JSON.stringify(
|
||||||
|
body,
|
||||||
|
(_key, value) => {
|
||||||
|
if (value && !Array.isArray(value) && typeof value === 'object') {
|
||||||
|
// Extract out internal keys used in parsing
|
||||||
|
const { [SYMBOL_MARKDOWN_PARSED]: _, [SYMBOL_REF_RESOLVED]: __, ...rest } = value;
|
||||||
|
return rest;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
},
|
||||||
|
indent,
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user