@gitbook/react-openapi 1.4.3 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/InteractiveSection.js +59 -0
  3. package/dist/Markdown.js +10 -0
  4. package/dist/OpenAPICodeSample.js +219 -0
  5. package/dist/OpenAPICodeSampleInteractive.js +66 -0
  6. package/dist/OpenAPICodeSampleSelector.js +45 -0
  7. package/dist/OpenAPICopyButton.js +39 -0
  8. package/dist/OpenAPIDisclosure.js +30 -0
  9. package/dist/OpenAPIDisclosureGroup.js +75 -0
  10. package/dist/OpenAPIExample.js +41 -0
  11. package/dist/OpenAPIMediaType.js +58 -0
  12. package/dist/OpenAPIOperation.d.ts +12 -7
  13. package/dist/OpenAPIOperation.js +30 -0
  14. package/dist/OpenAPIOperationContext.d.ts +10 -6
  15. package/dist/OpenAPIOperationContext.js +30 -0
  16. package/dist/OpenAPIPath.js +51 -0
  17. package/dist/OpenAPIPrefillContextProvider.d.ts +11 -7
  18. package/dist/OpenAPIPrefillContextProvider.js +25 -0
  19. package/dist/OpenAPIRequestBody.js +28 -0
  20. package/dist/OpenAPIRequestBodyHeaderType.js +23 -0
  21. package/dist/OpenAPIResponse.js +39 -0
  22. package/dist/OpenAPIResponseExample.js +75 -0
  23. package/dist/OpenAPIResponseExampleContent.js +61 -0
  24. package/dist/OpenAPIResponses.js +61 -0
  25. package/dist/OpenAPISchema.js +373 -0
  26. package/dist/OpenAPISchemaName.js +45 -0
  27. package/dist/OpenAPISchemaServer.js +13 -0
  28. package/dist/OpenAPISecurities.js +124 -0
  29. package/dist/OpenAPISelect.js +45 -0
  30. package/dist/OpenAPISpec.js +73 -0
  31. package/dist/OpenAPIWebhook.d.ts +12 -7
  32. package/dist/OpenAPIWebhook.js +28 -0
  33. package/dist/OpenAPIWebhookExample.js +40 -0
  34. package/dist/ScalarApiButton.js +87 -0
  35. package/dist/StaticSection.js +37 -0
  36. package/dist/code-samples.js +267 -419
  37. package/dist/common/OpenAPIColumnSpec.js +23 -0
  38. package/dist/common/OpenAPIOperationDescription.js +18 -0
  39. package/dist/common/OpenAPIStability.js +17 -0
  40. package/dist/common/OpenAPISummary.js +27 -0
  41. package/dist/contentTypeChecks.js +24 -20
  42. package/dist/context.d.ts +68 -72
  43. package/dist/context.js +25 -39
  44. package/dist/decycle.js +39 -68
  45. package/dist/dereference.js +20 -64
  46. package/dist/generateSchemaExample.js +188 -332
  47. package/dist/getDisclosureLabel.js +15 -16
  48. package/dist/getOrCreateStoreByKey.js +20 -17
  49. package/dist/index.d.ts +12 -10
  50. package/dist/index.js +11 -8
  51. package/dist/json2xml.js +10 -5
  52. package/dist/resolveOpenAPIOperation.d.ts +11 -7
  53. package/dist/resolveOpenAPIOperation.js +88 -159
  54. package/dist/resolveOpenAPIWebhook.d.ts +11 -7
  55. package/dist/resolveOpenAPIWebhook.js +41 -116
  56. package/dist/schemas/OpenAPISchemaItem.js +26 -0
  57. package/dist/schemas/OpenAPISchemas.d.ts +16 -11
  58. package/dist/schemas/OpenAPISchemas.js +57 -0
  59. package/dist/schemas/resolveOpenAPISchemas.d.ts +9 -4
  60. package/dist/schemas/resolveOpenAPISchemas.js +15 -59
  61. package/dist/stringifyOpenAPI.js +12 -13
  62. package/dist/translate.js +43 -0
  63. package/dist/translations/de.js +47 -42
  64. package/dist/translations/en.d.ts +46 -42
  65. package/dist/translations/en.js +47 -42
  66. package/dist/translations/es.js +47 -42
  67. package/dist/translations/fr.js +47 -42
  68. package/dist/translations/index.d.ts +404 -391
  69. package/dist/translations/index.js +28 -24
  70. package/dist/translations/ja.js +47 -42
  71. package/dist/translations/nl.js +47 -42
  72. package/dist/translations/no.js +47 -42
  73. package/dist/translations/pt-br.js +47 -42
  74. package/dist/translations/types.d.ts +7 -5
  75. package/dist/translations/zh.js +47 -42
  76. package/dist/types.d.ts +30 -24
  77. package/dist/util/example.js +84 -0
  78. package/dist/util/server.js +32 -38
  79. package/dist/util/tryit-prefill.js +135 -121
  80. package/dist/utils.js +135 -196
  81. package/package.json +18 -11
  82. package/dist/InteractiveSection.d.ts +0 -33
  83. package/dist/InteractiveSection.jsx +0 -61
  84. package/dist/Markdown.d.ts +0 -4
  85. package/dist/Markdown.jsx +0 -5
  86. package/dist/OpenAPICodeSample.d.ts +0 -19
  87. package/dist/OpenAPICodeSample.jsx +0 -230
  88. package/dist/OpenAPICodeSampleInteractive.d.ts +0 -14
  89. package/dist/OpenAPICodeSampleInteractive.jsx +0 -73
  90. package/dist/OpenAPICodeSampleSelector.d.ts +0 -14
  91. package/dist/OpenAPICodeSampleSelector.jsx +0 -44
  92. package/dist/OpenAPICopyButton.d.ts +0 -13
  93. package/dist/OpenAPICopyButton.jsx +0 -35
  94. package/dist/OpenAPIDisclosure.d.ts +0 -11
  95. package/dist/OpenAPIDisclosure.jsx +0 -30
  96. package/dist/OpenAPIDisclosureGroup.d.ts +0 -23
  97. package/dist/OpenAPIDisclosureGroup.jsx +0 -83
  98. package/dist/OpenAPIExample.d.ts +0 -16
  99. package/dist/OpenAPIExample.jsx +0 -36
  100. package/dist/OpenAPIMediaType.d.ts +0 -21
  101. package/dist/OpenAPIMediaType.jsx +0 -61
  102. package/dist/OpenAPIOperation.jsx +0 -25
  103. package/dist/OpenAPIOperationContext.jsx +0 -26
  104. package/dist/OpenAPIOperationDescription.d.ts +0 -9
  105. package/dist/OpenAPIOperationDescription.jsx +0 -22
  106. package/dist/OpenAPIOperationStability.d.ts +0 -9
  107. package/dist/OpenAPIOperationStability.jsx +0 -27
  108. package/dist/OpenAPIPath.d.ts +0 -18
  109. package/dist/OpenAPIPath.jsx +0 -55
  110. package/dist/OpenAPIPrefillContextProvider.jsx +0 -19
  111. package/dist/OpenAPIRequestBody.d.ts +0 -11
  112. package/dist/OpenAPIRequestBody.jsx +0 -28
  113. package/dist/OpenAPIRequestBodyHeaderType.d.ts +0 -8
  114. package/dist/OpenAPIRequestBodyHeaderType.jsx +0 -25
  115. package/dist/OpenAPIResponse.d.ts +0 -10
  116. package/dist/OpenAPIResponse.jsx +0 -57
  117. package/dist/OpenAPIResponseExample.d.ts +0 -9
  118. package/dist/OpenAPIResponseExample.jsx +0 -105
  119. package/dist/OpenAPIResponseExampleContent.d.ts +0 -22
  120. package/dist/OpenAPIResponseExampleContent.jsx +0 -60
  121. package/dist/OpenAPIResponses.d.ts +0 -9
  122. package/dist/OpenAPIResponses.jsx +0 -77
  123. package/dist/OpenAPISchema.d.ts +0 -27
  124. package/dist/OpenAPISchema.jsx +0 -400
  125. package/dist/OpenAPISchemaName.d.ts +0 -16
  126. package/dist/OpenAPISchemaName.jsx +0 -43
  127. package/dist/OpenAPISchemaServer.d.ts +0 -12
  128. package/dist/OpenAPISchemaServer.jsx +0 -8
  129. package/dist/OpenAPISecurities.d.ts +0 -9
  130. package/dist/OpenAPISecurities.jsx +0 -114
  131. package/dist/OpenAPISelect.d.ts +0 -22
  132. package/dist/OpenAPISelect.jsx +0 -44
  133. package/dist/OpenAPISpec.d.ts +0 -6
  134. package/dist/OpenAPISpec.jsx +0 -80
  135. package/dist/OpenAPITabs.d.ts +0 -26
  136. package/dist/OpenAPITabs.jsx +0 -109
  137. package/dist/OpenAPIWebhook.jsx +0 -23
  138. package/dist/OpenAPIWebhookExample.d.ts +0 -6
  139. package/dist/OpenAPIWebhookExample.jsx +0 -41
  140. package/dist/ScalarApiButton.d.ts +0 -14
  141. package/dist/ScalarApiButton.jsx +0 -81
  142. package/dist/StaticSection.d.ts +0 -13
  143. package/dist/StaticSection.jsx +0 -32
  144. package/dist/code-samples.d.ts +0 -17
  145. package/dist/common/OpenAPIColumnSpec.d.ts +0 -6
  146. package/dist/common/OpenAPIColumnSpec.jsx +0 -20
  147. package/dist/common/OpenAPIOperationDescription.d.ts +0 -6
  148. package/dist/common/OpenAPIOperationDescription.jsx +0 -19
  149. package/dist/common/OpenAPIStability.d.ts +0 -4
  150. package/dist/common/OpenAPIStability.jsx +0 -15
  151. package/dist/common/OpenAPISummary.d.ts +0 -6
  152. package/dist/common/OpenAPISummary.jsx +0 -30
  153. package/dist/contentTypeChecks.d.ts +0 -10
  154. package/dist/decycle.d.ts +0 -2
  155. package/dist/dereference.d.ts +0 -5
  156. package/dist/generateSchemaExample.d.ts +0 -45
  157. package/dist/getDisclosureLabel.d.ts +0 -7
  158. package/dist/getOrCreateStoreByKey.d.ts +0 -10
  159. package/dist/json2xml.d.ts +0 -4
  160. package/dist/schemas/OpenAPISchemaItem.d.ts +0 -7
  161. package/dist/schemas/OpenAPISchemaItem.jsx +0 -16
  162. package/dist/schemas/OpenAPISchemas.jsx +0 -59
  163. package/dist/schemas/index.d.ts +0 -2
  164. package/dist/schemas/index.js +0 -2
  165. package/dist/stringifyOpenAPI.d.ts +0 -4
  166. package/dist/translate.d.ts +0 -10
  167. package/dist/translate.jsx +0 -75
  168. package/dist/translations/de.d.ts +0 -43
  169. package/dist/translations/es.d.ts +0 -43
  170. package/dist/translations/fr.d.ts +0 -43
  171. package/dist/translations/ja.d.ts +0 -43
  172. package/dist/translations/nl.d.ts +0 -43
  173. package/dist/translations/no.d.ts +0 -43
  174. package/dist/translations/pt-br.d.ts +0 -43
  175. package/dist/translations/types.js +0 -1
  176. package/dist/translations/zh.d.ts +0 -43
  177. package/dist/tsconfig.build.tsbuildinfo +0 -1
  178. package/dist/types.js +0 -1
  179. package/dist/util/example.d.ts +0 -35
  180. package/dist/util/example.jsx +0 -103
  181. package/dist/util/server.d.ts +0 -9
  182. package/dist/util/tryit-prefill.d.ts +0 -20
  183. package/dist/utils.d.ts +0 -50
  184. package/src/InteractiveSection.tsx +0 -147
  185. package/src/Markdown.tsx +0 -12
  186. package/src/OpenAPICodeSample.tsx +0 -330
  187. package/src/OpenAPICodeSampleInteractive.tsx +0 -136
  188. package/src/OpenAPICodeSampleSelector.tsx +0 -94
  189. package/src/OpenAPICopyButton.tsx +0 -72
  190. package/src/OpenAPIDisclosure.tsx +0 -46
  191. package/src/OpenAPIDisclosureGroup.tsx +0 -158
  192. package/src/OpenAPIExample.tsx +0 -55
  193. package/src/OpenAPIMediaType.tsx +0 -139
  194. package/src/OpenAPIOperation.tsx +0 -35
  195. package/src/OpenAPIOperationContext.tsx +0 -45
  196. package/src/OpenAPIOperationDescription.tsx +0 -34
  197. package/src/OpenAPIOperationStability.tsx +0 -39
  198. package/src/OpenAPIPath.tsx +0 -90
  199. package/src/OpenAPIPrefillContextProvider.tsx +0 -40
  200. package/src/OpenAPIRequestBody.tsx +0 -54
  201. package/src/OpenAPIRequestBodyHeaderType.tsx +0 -36
  202. package/src/OpenAPIResponse.tsx +0 -82
  203. package/src/OpenAPIResponseExample.tsx +0 -151
  204. package/src/OpenAPIResponseExampleContent.tsx +0 -125
  205. package/src/OpenAPIResponses.tsx +0 -125
  206. package/src/OpenAPISchema.test.ts +0 -172
  207. package/src/OpenAPISchema.tsx +0 -654
  208. package/src/OpenAPISchemaName.tsx +0 -80
  209. package/src/OpenAPISchemaServer.tsx +0 -34
  210. package/src/OpenAPISecurities.tsx +0 -231
  211. package/src/OpenAPISelect.tsx +0 -96
  212. package/src/OpenAPISpec.tsx +0 -138
  213. package/src/OpenAPITabs.tsx +0 -147
  214. package/src/OpenAPIWebhook.tsx +0 -33
  215. package/src/OpenAPIWebhookExample.tsx +0 -60
  216. package/src/ScalarApiButton.tsx +0 -132
  217. package/src/StaticSection.tsx +0 -91
  218. package/src/__snapshots__/json2xml.test.ts.snap +0 -18
  219. package/src/code-samples.test.ts +0 -714
  220. package/src/code-samples.ts +0 -448
  221. package/src/common/OpenAPIColumnSpec.tsx +0 -31
  222. package/src/common/OpenAPIOperationDescription.tsx +0 -31
  223. package/src/common/OpenAPIStability.tsx +0 -23
  224. package/src/common/OpenAPISummary.tsx +0 -45
  225. package/src/contentTypeChecks.ts +0 -39
  226. package/src/context.ts +0 -99
  227. package/src/decycle.ts +0 -68
  228. package/src/dereference.ts +0 -29
  229. package/src/generateSchemaExample.test.ts +0 -1040
  230. package/src/generateSchemaExample.ts +0 -530
  231. package/src/getDisclosureLabel.ts +0 -25
  232. package/src/getOrCreateStoreByKey.ts +0 -33
  233. package/src/index.ts +0 -10
  234. package/src/json2xml.test.ts +0 -46
  235. package/src/json2xml.ts +0 -8
  236. package/src/resolveOpenAPIOperation.test.ts +0 -177
  237. package/src/resolveOpenAPIOperation.ts +0 -151
  238. package/src/resolveOpenAPIWebhook.ts +0 -99
  239. package/src/schemas/OpenAPISchemaItem.tsx +0 -34
  240. package/src/schemas/OpenAPISchemas.tsx +0 -98
  241. package/src/schemas/index.ts +0 -2
  242. package/src/schemas/resolveOpenAPISchemas.test.ts +0 -174
  243. package/src/schemas/resolveOpenAPISchemas.ts +0 -28
  244. package/src/stringifyOpenAPI.ts +0 -25
  245. package/src/translate.tsx +0 -80
  246. package/src/translations/de.ts +0 -43
  247. package/src/translations/en.ts +0 -43
  248. package/src/translations/es.ts +0 -43
  249. package/src/translations/fr.ts +0 -43
  250. package/src/translations/index.ts +0 -33
  251. package/src/translations/ja.ts +0 -43
  252. package/src/translations/nl.ts +0 -43
  253. package/src/translations/no.ts +0 -43
  254. package/src/translations/pt-br.ts +0 -43
  255. package/src/translations/types.ts +0 -7
  256. package/src/translations/zh.ts +0 -43
  257. package/src/types.ts +0 -46
  258. package/src/util/example.tsx +0 -129
  259. package/src/util/server.test.ts +0 -58
  260. package/src/util/server.ts +0 -47
  261. package/src/util/tryit-prefill.test.ts +0 -311
  262. package/src/util/tryit-prefill.ts +0 -160
  263. package/src/utils.ts +0 -255
@@ -1,160 +0,0 @@
1
- import { ExpressionRuntime, parseTemplate } from '@gitbook/expr';
2
- import type { OpenAPIV3 } from '@gitbook/openapi-parser';
3
- import type { ApiClientConfiguration } from '@scalar/types';
4
- import type { PrefillInputContextData } from '../OpenAPIPrefillContextProvider';
5
- import type { OpenAPIOperationData } from '../types';
6
-
7
- export interface TryItPrefillConfiguration {
8
- authentication?: ApiClientConfiguration['authentication'];
9
- servers?: ApiClientConfiguration['servers'];
10
- }
11
-
12
- /**
13
- * Resolve the Scalar API client prefill configuration for a given OpenAPI operation.
14
- */
15
- export function resolveTryItPrefillForOperation(args: {
16
- /**
17
- * The parsed OpenAPI operation.
18
- */
19
- operation: Pick<OpenAPIOperationData, 'securities' | 'servers'>;
20
- /**
21
- * Prefill input context data.
22
- */
23
- prefillInputContext: PrefillInputContextData | null;
24
- }): TryItPrefillConfiguration {
25
- const {
26
- operation: { securities, servers },
27
- prefillInputContext,
28
- } = args;
29
-
30
- if (!prefillInputContext) {
31
- return {};
32
- }
33
-
34
- const runtime = new ExpressionRuntime();
35
- const resolveTryItPrefillExpression = (expr: string) => {
36
- const parts = parseTemplate(expr);
37
- if (!parts.length) {
38
- return undefined;
39
- }
40
- return runtime.evaluateTemplate(expr, prefillInputContext);
41
- };
42
-
43
- const prefillAuth = securities
44
- ? resolveTryItPrefillAuthForOperationSecurities({
45
- securities,
46
- resolveTryItPrefillExpression,
47
- })
48
- : undefined;
49
-
50
- const prefillServers = servers
51
- ? resolveTryItPrefillServersForOperationServers({ servers, resolveTryItPrefillExpression })
52
- : [];
53
-
54
- return {
55
- ...(prefillAuth ? { authentication: prefillAuth } : {}),
56
- ...(prefillServers ? { servers: prefillServers } : {}),
57
- };
58
- }
59
-
60
- /**
61
- * Resolve prefill authentication configuration for the security schemes defined for an operation.
62
- */
63
- function resolveTryItPrefillAuthForOperationSecurities(args: {
64
- securities: OpenAPIOperationData['securities'];
65
- resolveTryItPrefillExpression: (expr: string) => string | undefined;
66
- }): ApiClientConfiguration['authentication'] | undefined {
67
- const { securities, resolveTryItPrefillExpression } = args;
68
- const prefillAuthConfig: ApiClientConfiguration['authentication']['securitySchemes'] = {};
69
-
70
- for (const [schemeName, security] of Object.values(securities)) {
71
- const tryitPrefillAuthValue = security['x-gitbook-prefill']
72
- ? resolveTryItPrefillExpression(security['x-gitbook-prefill'])
73
- : undefined;
74
-
75
- if (!tryitPrefillAuthValue) {
76
- continue;
77
- }
78
-
79
- switch (security.type) {
80
- case 'http': {
81
- if (security.scheme?.includes('bearer')) {
82
- prefillAuthConfig[schemeName] = { token: tryitPrefillAuthValue };
83
- } else if (
84
- security.scheme?.includes('basic') &&
85
- tryitPrefillAuthValue.includes(':')
86
- ) {
87
- const [username, password] = tryitPrefillAuthValue.split(':', 2);
88
- prefillAuthConfig[schemeName] = { username, password };
89
- }
90
- break;
91
- }
92
- case 'apiKey': {
93
- prefillAuthConfig[schemeName] = {
94
- name: security.name,
95
- in: security.in,
96
- value: tryitPrefillAuthValue,
97
- };
98
- break;
99
- }
100
- case 'oauth2':
101
- case 'openIdConnect': {
102
- break;
103
- }
104
- }
105
- }
106
-
107
- return Object.keys(prefillAuthConfig).length > 0
108
- ? { securitySchemes: prefillAuthConfig }
109
- : undefined;
110
- }
111
-
112
- /**
113
- * Resolve prefill server configuration for the servers defined for an operation.
114
- */
115
- function resolveTryItPrefillServersForOperationServers(args: {
116
- servers: OpenAPIOperationData['servers'];
117
- resolveTryItPrefillExpression: (expr: string) => string | undefined;
118
- }): ApiClientConfiguration['servers'] | undefined {
119
- const { servers, resolveTryItPrefillExpression } = args;
120
- const resolvedServers: ApiClientConfiguration['servers'] = [];
121
-
122
- for (const server of servers) {
123
- // Url-level prefill
124
- const tryItPrefillServerUrlExpr = server['x-gitbook-prefill'];
125
- const tryItPrefillServerUrlValue = tryItPrefillServerUrlExpr
126
- ? resolveTryItPrefillExpression(tryItPrefillServerUrlExpr)
127
- : undefined;
128
-
129
- const variables: { [variable: string]: OpenAPIV3.ServerVariableObject } = server.variables
130
- ? { ...server.variables }
131
- : {};
132
-
133
- // Variable-level prefill
134
- if (server.variables) {
135
- for (const [varName, variable] of Object.entries(server.variables)) {
136
- const { 'x-gitbook-prefill': tryItPrefillVarExpr, ...variableProps } = variable;
137
-
138
- const tryItPrefillVarValue = tryItPrefillVarExpr
139
- ? resolveTryItPrefillExpression(tryItPrefillVarExpr)
140
- : undefined;
141
- variables[varName] = {
142
- ...variableProps,
143
- ...(tryItPrefillVarValue ? { default: String(tryItPrefillVarValue) } : {}),
144
- };
145
- }
146
- }
147
-
148
- const hasServerVariables = Object.keys(variables).length > 0;
149
- if (server.url && (tryItPrefillServerUrlValue || hasServerVariables)) {
150
- const resolvedServer: OpenAPIV3.ServerObject = {
151
- url: tryItPrefillServerUrlValue ?? server.url,
152
- ...(server.description ? { description: server.description } : {}),
153
- ...(hasServerVariables ? { variables } : {}),
154
- };
155
- resolvedServers.push(resolvedServer);
156
- }
157
- }
158
-
159
- return resolvedServers.length > 0 ? resolvedServers : undefined;
160
- }
package/src/utils.ts DELETED
@@ -1,255 +0,0 @@
1
- import type { AnyObject, OpenAPIV3, OpenAPIV3_1 } from '@gitbook/openapi-parser';
2
- import type { OpenAPIUniversalContext } from './context';
3
- import { stringifyOpenAPI } from './stringifyOpenAPI';
4
- import { tString } from './translate';
5
-
6
- export function checkIsReference(input: unknown): input is OpenAPIV3.ReferenceObject {
7
- return typeof input === 'object' && !!input && '$ref' in input;
8
- }
9
-
10
- export function createStateKey(key: string, scope?: string) {
11
- return scope ? `${scope}_${key}` : key;
12
- }
13
-
14
- /**
15
- * Check if an object has a description. Either at the root level or in items.
16
- */
17
- function hasDescription(object: AnyObject) {
18
- return 'description' in object || 'x-gitbook-description-html' in object;
19
- }
20
-
21
- /**
22
- * Resolve the description of an object.
23
- */
24
- export function resolveDescription(object: OpenAPIV3.SchemaObject | AnyObject) {
25
- // Resolve description from the object first
26
- if (hasDescription(object)) {
27
- return 'x-gitbook-description-html' in object &&
28
- typeof object['x-gitbook-description-html'] === 'string'
29
- ? object['x-gitbook-description-html'].trim()
30
- : typeof object.description === 'string'
31
- ? object.description.trim()
32
- : undefined;
33
- }
34
-
35
- // If the object has no description, try to resolve it from the items
36
- if ('items' in object && typeof object.items === 'object' && hasDescription(object.items)) {
37
- return resolveDescription(object.items);
38
- }
39
-
40
- return undefined;
41
- }
42
-
43
- /**
44
- * Extract descriptions from an object.
45
- */
46
- export function extractDescriptions(object: AnyObject) {
47
- return {
48
- description: object.description,
49
- 'x-gitbook-description-html':
50
- 'x-gitbook-description-html' in object
51
- ? object['x-gitbook-description-html']
52
- : undefined,
53
- };
54
- }
55
-
56
- /**
57
- * Resolve the first example from an object.
58
- */
59
- export function resolveFirstExample(object: AnyObject): string | undefined {
60
- if ('examples' in object && typeof object.examples === 'object' && object.examples) {
61
- const keys = Object.keys(object.examples);
62
- const firstKey = keys[0];
63
- if (firstKey && object.examples[firstKey]) {
64
- return formatExample(object.examples[firstKey]);
65
- }
66
- }
67
-
68
- // Resolve top level example first
69
- if (shouldDisplayExample(object)) {
70
- return formatExample(object.example);
71
- }
72
-
73
- // Resolve example from items if it exists
74
- if (object.items && typeof object.items === 'object') {
75
- return formatExample(object.items.example);
76
- }
77
-
78
- return undefined;
79
- }
80
-
81
- /**
82
- * Resolve the schema of a parameter.
83
- * Extract the description, example and deprecated from parameter.
84
- */
85
- export function resolveParameterSchema(
86
- parameter: OpenAPIV3.ParameterBaseObject
87
- ): OpenAPIV3.SchemaObject {
88
- const schema = checkIsReference(parameter.schema) ? undefined : parameter.schema;
89
- return {
90
- // Description of the parameter is defined at the parameter level
91
- // we use display it if the schema doesn't override it
92
- ...extractDescriptions(parameter),
93
- example: resolveFirstExample(parameter),
94
- // Deprecated can be defined at the parameter level
95
- deprecated: parameter.deprecated,
96
- ...schema,
97
- };
98
- }
99
-
100
- /**
101
- * Transform a parameter object to a property object.
102
- */
103
- export function parameterToProperty(
104
- parameter: OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject
105
- ): {
106
- propertyName: string | undefined;
107
- schema: OpenAPIV3.SchemaObject;
108
- required: boolean | undefined;
109
- } {
110
- if (checkIsReference(parameter)) {
111
- return {
112
- propertyName: parameter.$ref ?? 'Unknown ref',
113
- schema: {},
114
- required: undefined,
115
- };
116
- }
117
- return {
118
- propertyName: parameter.name,
119
- schema: resolveParameterSchema(parameter),
120
- required: parameter.required,
121
- };
122
- }
123
-
124
- /**
125
- * Format the example of a schema.
126
- */
127
- function formatExample(example: unknown): string {
128
- if (typeof example === 'string') {
129
- return example
130
- .replace(/\n/g, ' ') // Replace newlines with spaces
131
- .replace(/\s+/g, ' ') // Collapse multiple spaces/newlines into a single space
132
- .replace(/([\{\}:,])\s+/g, '$1 ') // Ensure a space after {, }, :, and ,
133
- .replace(/\s+([\{\}:,])/g, ' $1') // Ensure a space before {, }, :, and ,
134
- .trim();
135
- }
136
-
137
- return stringifyOpenAPI(example);
138
- }
139
-
140
- /**
141
- * Check if an example should be displayed.
142
- */
143
- function shouldDisplayExample(schema: OpenAPIV3.SchemaObject): boolean {
144
- return (
145
- (typeof schema.example === 'string' && !!schema.example) ||
146
- typeof schema.example === 'number' ||
147
- typeof schema.example === 'boolean' ||
148
- (Array.isArray(schema.example) && schema.example.length > 0) ||
149
- (typeof schema.example === 'object' &&
150
- schema.example !== null &&
151
- Object.keys(schema.example).length > 0)
152
- );
153
- }
154
-
155
- /**
156
- * Get the class name for a status code.
157
- * 1xx: informational
158
- * 2xx: success
159
- * 3xx: redirect
160
- * 4xx, 5xx: error
161
- */
162
- export function getStatusCodeClassName(statusCode: number | string): string {
163
- const category = getStatusCodeCategory(statusCode);
164
- switch (category) {
165
- case 1:
166
- return 'informational';
167
- case 2:
168
- return 'success';
169
- case 3:
170
- return 'redirect';
171
- case 4:
172
- case 5:
173
- return 'error';
174
- default:
175
- return 'unknown';
176
- }
177
- }
178
-
179
- /**
180
- * Get a default label for a status code.
181
- * This is used when there is no label provided in the OpenAPI spec.
182
- * 1xx: Information
183
- * 2xx: Success
184
- * 3xx: Redirect
185
- * 4xx, 5xx: Error
186
- */
187
- export function getStatusCodeDefaultLabel(
188
- statusCode: number | string,
189
- context: OpenAPIUniversalContext
190
- ): string {
191
- const category = getStatusCodeCategory(statusCode);
192
- switch (category) {
193
- case 1:
194
- return tString(context.translation, 'information');
195
- case 2:
196
- return tString(context.translation, 'success');
197
- case 3:
198
- return tString(context.translation, 'redirect');
199
- case 4:
200
- case 5:
201
- return tString(context.translation, 'error');
202
- default:
203
- return '';
204
- }
205
- }
206
-
207
- function getStatusCodeCategory(statusCode: number | string): number | string {
208
- const code = typeof statusCode === 'string' ? Number.parseInt(statusCode, 10) : statusCode;
209
-
210
- if (Number.isNaN(code) || code < 100 || code >= 600) {
211
- return 'unknown';
212
- }
213
-
214
- // Determine the category of the status code based on the first digit
215
- const category = Math.floor(code / 100);
216
-
217
- return category;
218
- }
219
-
220
- export function getSchemaTitle(schema: OpenAPIV3.SchemaObject): string {
221
- // Otherwise try to infer a nice title
222
- let type = 'any';
223
-
224
- if (schema.enum || schema['x-enumDescriptions'] || schema['x-gitbook-enum']) {
225
- type = `${schema.type} · enum`;
226
- // check array AND schema.items as this is sometimes null despite what the type indicates
227
- } else if (schema.type === 'array' && !!schema.items) {
228
- type = `${getSchemaTitle(schema.items)}[]`;
229
- } else if (Array.isArray(schema.type)) {
230
- type = schema.type.join(' | ');
231
- } else if (schema.type || schema.properties) {
232
- type = schema.type ?? 'object';
233
-
234
- if (schema.format) {
235
- type += ` · ${schema.format}`;
236
- }
237
-
238
- // Only add the title if it's an object (no need for the title of a string, number, etc.)
239
- if (type === 'object' && schema.title) {
240
- type += ` · ${schema.title.replaceAll(' ', '')}`;
241
- }
242
- }
243
-
244
- if ('anyOf' in schema) {
245
- type = 'any of';
246
- } else if ('oneOf' in schema) {
247
- type = 'one of';
248
- } else if ('allOf' in schema) {
249
- type = 'all of';
250
- } else if ('not' in schema) {
251
- type = 'not';
252
- }
253
-
254
- return type;
255
- }