1
1
import type { DocumentBlockOpenAPI , DocumentBlockOpenAPIOperation } from '@gitbook/api' ;
2
2
import { OpenAPIParseError , parseOpenAPI } from '@gitbook/openapi-parser' ;
3
- import { type OpenAPIOperationData , resolveOpenAPIOperation } from '@gitbook/react-openapi' ;
3
+ import {
4
+ type OpenAPIModelsData ,
5
+ type OpenAPIOperationData ,
6
+ resolveOpenAPIModels ,
7
+ resolveOpenAPIOperation ,
8
+ } from '@gitbook/react-openapi' ;
4
9
import type { GitBookAnyContext } from '@v2/lib/context' ;
5
10
6
11
import { type CacheFunctionOptions , cache , noCacheFetchOptions } from '@/lib/cache' ;
@@ -12,47 +17,71 @@ import { enrichFilesystem } from './enrich';
12
17
13
18
export type AnyOpenAPIOperationBlock = DocumentBlockOpenAPI | DocumentBlockOpenAPIOperation ;
14
19
20
+ export type OpenAPIBlockType = 'operation' | 'models' ;
21
+
22
+ export type ResolveOpenAPIOperationBlockResult = {
23
+ error : undefined ;
24
+ data : OpenAPIOperationData | null ;
25
+ specUrl : string | null ;
26
+ } ;
27
+
28
+ export type ResolveOpenAPIModelsBlockResult = {
29
+ error : undefined ;
30
+ data : OpenAPIModelsData | null ;
31
+ specUrl : string | null ;
32
+ } ;
33
+
34
+ export type ResolveOpenAPIBlockResult < T extends OpenAPIBlockType = OpenAPIBlockType > =
35
+ | ( T extends 'operation' ? ResolveOpenAPIOperationBlockResult : ResolveOpenAPIModelsBlockResult )
36
+ | ResolveOpenAPIBlockError ;
37
+
38
+ type ResolveOpenAPIBlockError = { error : OpenAPIParseError ; data ?: undefined ; specUrl ?: undefined } ;
39
+
40
+ type ResolveOpenAPIBlockArgs < T extends OpenAPIBlockType = OpenAPIBlockType > = {
41
+ block : AnyOpenAPIOperationBlock ;
42
+ context : GitBookAnyContext ;
43
+ /**
44
+ * The type of the block.
45
+ * Can be either 'operation' or 'models'.
46
+ * @default 'operation'
47
+ */
48
+ type ?: T | OpenAPIBlockType ;
49
+ } ;
50
+
15
51
const weakmap = new WeakMap < AnyOpenAPIOperationBlock , Promise < ResolveOpenAPIBlockResult > > ( ) ;
16
52
17
53
/**
18
54
* Cache the result of resolving an OpenAPI block.
19
55
* It is important because the resolve is called in sections and in the block itself.
20
56
*/
21
- export function resolveOpenAPIBlock (
22
- args : ResolveOpenAPIBlockArgs
23
- ) : Promise < ResolveOpenAPIBlockResult > {
24
- if ( weakmap . has ( args . block ) ) {
25
- return weakmap . get ( args . block ) ! ;
26
- }
57
+ export function resolveOpenAPIBlock < T extends OpenAPIBlockType = 'operation' > (
58
+ args : ResolveOpenAPIBlockArgs < T >
59
+ ) : Promise < ResolveOpenAPIBlockResult < T > > {
60
+ // if (weakmap.has(args.block)) {
61
+ // return weakmap.get(args.block) as Promise<ResolveOpenAPIBlockResult<T>> ;
62
+ // }
27
63
28
64
const result = baseResolveOpenAPIBlock ( args ) ;
29
- weakmap . set ( args . block , result ) ;
65
+ weakmap . set ( args . block , result as Promise < ResolveOpenAPIBlockResult < T > > ) ;
30
66
return result ;
31
67
}
32
68
33
- type ResolveOpenAPIBlockArgs = {
34
- block : AnyOpenAPIOperationBlock ;
35
- context : GitBookAnyContext ;
36
- } ;
37
- export type ResolveOpenAPIBlockResult =
38
- | { error ?: undefined ; data : OpenAPIOperationData | null ; specUrl : string | null }
39
- | { error : OpenAPIParseError ; data ?: undefined ; specUrl ?: undefined } ;
40
69
/**
41
70
* Resolve OpenAPI block.
42
71
*/
43
- async function baseResolveOpenAPIBlock (
44
- args : ResolveOpenAPIBlockArgs
45
- ) : Promise < ResolveOpenAPIBlockResult > {
46
- const { context, block } = args ;
72
+ async function baseResolveOpenAPIBlock < T extends OpenAPIBlockType = 'operation' > (
73
+ args : ResolveOpenAPIBlockArgs < T >
74
+ ) : Promise < ResolveOpenAPIBlockResult < T > > {
75
+ const { context, block, type = 'operation' } = args ;
47
76
if ( ! block . data . path || ! block . data . method ) {
48
- return { data : null , specUrl : null } ;
77
+ return { data : null , specUrl : null } as ResolveOpenAPIBlockResult < T > ;
49
78
}
50
79
51
80
const ref = block . data . ref ;
52
81
const resolved = ref ? await resolveContentRef ( ref , context ) : null ;
53
82
54
83
if ( ! resolved ) {
55
- return { data : null , specUrl : null } ;
84
+ return { data : null , specUrl : null } as ResolveOpenAPIBlockResult < T > ;
56
85
}
57
86
58
87
try {
@@ -64,12 +93,17 @@ async function baseResolveOpenAPIBlock(
64
93
return fetchFilesystem ( resolved . href ) ;
65
94
} ) ( ) ;
66
95
96
+ if ( type === 'models' ) {
97
+ const data = await resolveOpenAPIModels ( filesystem ) ;
98
+ return { data : data , specUrl : resolved . href } as ResolveOpenAPIBlockResult < T > ;
99
+ }
100
+
67
101
const data = await resolveOpenAPIOperation ( filesystem , {
68
102
path : block . data . path ,
69
103
method : block . data . method ,
70
104
} ) ;
71
105
72
- return { data, specUrl : resolved . href } ;
106
+ return { data, specUrl : resolved . href } as ResolveOpenAPIBlockResult < T > ;
73
107
} catch ( error ) {
74
108
if ( error instanceof OpenAPIParseError ) {
75
109
return { error } ;
0 commit comments