@@ -5,11 +5,26 @@ import { readCompressedJsonFileFallback } from '@/frame/lib/read-json-file'
5
5
import { getAutomatedPageMiniTocItems } from '@/frame/lib/get-mini-toc-items'
6
6
import { allVersions , getOpenApiVersion } from '@/versions/lib/all-versions'
7
7
import languages from '@/languages/lib/languages'
8
+ import type { Context } from '@/types'
9
+ import type { Operation } from '@/rest/components/types'
8
10
9
11
export const REST_DATA_DIR = 'src/rest/data'
10
12
export const REST_SCHEMA_FILENAME = 'schema.json'
11
13
const REST_CONTENT_DIR = 'content/rest'
12
14
15
+ // Type definitions for REST operations
16
+ interface RestOperationCategory {
17
+ [ subcategory : string ] : Operation [ ]
18
+ }
19
+
20
+ interface RestOperationData {
21
+ [ category : string ] : RestOperationCategory
22
+ }
23
+
24
+ interface RestMiniTocData {
25
+ restOperationsMiniTocItems : any [ ]
26
+ }
27
+
13
28
/*
14
29
Loads the schemas from the static/decorated folder into a single
15
30
object organized by version. Not all products are calendar date
@@ -38,87 +53,107 @@ const REST_CONTENT_DIR = 'content/rest'
38
53
}
39
54
*/
40
55
const NOT_API_VERSIONED = 'not_api_versioned'
41
- const restOperationData = new Map ( )
42
- const restOperations = new Map ( )
56
+ const restOperationData = new Map <
57
+ string ,
58
+ Map < string , Map < string , Map < string , Map < string , RestMiniTocData > > > >
59
+ > ( )
60
+ const restOperations = new Map < string , Map < string , RestOperationData > > ( )
43
61
44
- Object . keys ( languages ) . forEach ( ( language ) => {
62
+ Object . keys ( languages ) . forEach ( ( language : string ) => {
45
63
restOperationData . set ( language , new Map ( ) )
46
- Object . keys ( allVersions ) . forEach ( ( version ) => {
64
+ Object . keys ( allVersions ) . forEach ( ( version : string ) => {
47
65
// setting to undefined will allow us to perform checks
48
66
// more easily later on
49
- restOperationData . get ( language ) . set ( version , new Map ( ) )
67
+ restOperationData . get ( language ) ! . set ( version , new Map ( ) )
50
68
if ( allVersions [ version ] . apiVersions && allVersions [ version ] . apiVersions . length > 0 ) {
51
- allVersions [ version ] . apiVersions . forEach ( ( date ) => {
52
- restOperationData . get ( language ) . get ( version ) . set ( date , new Map ( ) )
69
+ allVersions [ version ] . apiVersions . forEach ( ( date : string ) => {
70
+ restOperationData . get ( language ) ! . get ( version ) ! . set ( date , new Map ( ) )
53
71
} )
54
72
} else {
55
73
// Products that are not been calendar date versioned
56
- restOperationData . get ( language ) . get ( version ) . set ( NOT_API_VERSIONED , new Map ( ) )
74
+ restOperationData . get ( language ) ! . get ( version ) ! . set ( NOT_API_VERSIONED , new Map ( ) )
57
75
}
58
76
} )
59
77
} )
60
78
61
- export const categoriesWithoutSubcategories = fs
79
+ export const categoriesWithoutSubcategories : string [ ] = fs
62
80
. readdirSync ( REST_CONTENT_DIR )
63
- . filter ( ( file ) => {
81
+ . filter ( ( file : string ) => {
64
82
return file . endsWith ( '.md' ) && ! file . includes ( 'index.md' ) && ! file . includes ( 'README.md' )
65
83
} )
66
- . map ( ( filteredFile ) => filteredFile . replace ( '.md' , '' ) )
84
+ . map ( ( filteredFile : string ) => filteredFile . replace ( '.md' , '' ) )
67
85
68
86
// version: plan + release e.g. For ghes-3.5, ghes is the plan and 3.5 is the release
69
87
// apiVersion (not all versions have apiVersions): REST API Calendar Dates
70
88
// openApiVersion (below, every version has an openApiVersion mapping): There's a mapping between our Docs versions
71
89
// and the OpenApi Version bc it's not the same
72
- export default async function getRest ( version , apiVersion , category , subCategory ) {
90
+
91
+ export default async function getRest (
92
+ version : string ,
93
+ apiVersion ?: string ,
94
+ ) : Promise < RestOperationData > {
73
95
const openApiVersion = getOpenApiVersion ( version )
74
96
const openapiSchemaName = apiVersion ? `${ openApiVersion } -${ apiVersion } ` : `${ openApiVersion } `
75
97
const apiDate = apiVersion || NOT_API_VERSIONED
76
98
const fileName = path . join ( REST_DATA_DIR , openapiSchemaName , REST_SCHEMA_FILENAME )
99
+
77
100
if ( ! restOperations . has ( openApiVersion ) ) {
78
101
restOperations . set ( openApiVersion , new Map ( ) )
79
- restOperations . get ( openApiVersion ) . set ( apiDate , new Map ( ) )
80
102
// The `readCompressedJsonFileFallback()` function
81
103
// will check for both a .br and .json extension.
82
- restOperations . get ( openApiVersion ) . set ( apiDate , readCompressedJsonFileFallback ( fileName ) )
83
- } else if ( ! restOperations . get ( openApiVersion ) . has ( apiDate ) ) {
84
- restOperations . get ( openApiVersion ) . set ( apiDate , new Map ( ) )
104
+ restOperations
105
+ . get ( openApiVersion ) !
106
+ . set ( apiDate , readCompressedJsonFileFallback ( fileName ) as RestOperationData )
107
+ } else if ( ! restOperations . get ( openApiVersion ) ! . has ( apiDate ) ) {
85
108
// The `readCompressedJsonFileFallback()` function
86
109
// will check for both a .br and .json extension.
87
- restOperations . get ( openApiVersion ) . set ( apiDate , readCompressedJsonFileFallback ( fileName ) )
88
- }
89
- if ( subCategory ) {
90
- return restOperations . get ( openApiVersion ) . get ( apiDate ) [ category ] [ subCategory ]
91
- } else if ( category ) {
92
- return restOperations . get ( openApiVersion ) . get ( apiDate ) [ category ]
93
- } else {
94
- return restOperations . get ( openApiVersion ) . get ( apiDate )
110
+ restOperations
111
+ . get ( openApiVersion ) !
112
+ . set ( apiDate , readCompressedJsonFileFallback ( fileName ) as RestOperationData )
95
113
}
114
+
115
+ return restOperations . get ( openApiVersion ) ! . get ( apiDate ) !
96
116
}
97
117
98
118
// Generates the miniToc for a rest reference page.
99
119
export async function getRestMiniTocItems (
100
- category ,
101
- subCategory ,
102
- apiVersion ,
103
- restOperations ,
104
- language ,
105
- version ,
106
- context ,
107
- ) {
120
+ category : string ,
121
+ subCategory : string ,
122
+ apiVersion : string | undefined ,
123
+ restOperations : Operation [ ] ,
124
+ language : string ,
125
+ version : string ,
126
+ context : Context ,
127
+ ) : Promise < RestMiniTocData > {
108
128
const apiDate = apiVersion || NOT_API_VERSIONED
109
129
110
- if ( ! restOperationData . get ( language ) . get ( version ) . get ( apiDate ) . has ( category ) ) {
111
- restOperationData . get ( language ) . get ( version ) . get ( apiDate ) . set ( category , new Map ( ) )
130
+ const languageData = restOperationData . get ( language )
131
+ if ( ! languageData ) {
132
+ throw new Error ( `Language ${ language } not found in rest operation data` )
133
+ }
134
+
135
+ const versionData = languageData . get ( version )
136
+ if ( ! versionData ) {
137
+ throw new Error ( `Version ${ version } not found for language ${ language } ` )
138
+ }
139
+
140
+ const apiData = versionData . get ( apiDate )
141
+ if ( ! apiData ) {
142
+ throw new Error ( `API date ${ apiDate } not found for version ${ version } and language ${ language } ` )
143
+ }
144
+
145
+ if ( ! apiData . has ( category ) ) {
146
+ apiData . set ( category , new Map ( ) )
112
147
}
113
148
114
- if ( ! restOperationData . get ( language ) . get ( version ) . get ( apiDate ) . get ( category ) . get ( subCategory ) ) {
115
- const languageTree = restOperationData . get ( language )
116
- const titles = restOperations . map ( ( operation ) => operation . title )
149
+ const categoryData = apiData . get ( category ) !
150
+ if ( ! categoryData . get ( subCategory ) ) {
151
+ const titles = restOperations . map ( ( operation : Operation ) => operation . title )
117
152
const restOperationsMiniTocItems = await getAutomatedPageMiniTocItems ( titles , context , 3 )
118
- languageTree . get ( version ) . get ( apiDate ) . get ( category ) . set ( subCategory , {
153
+ categoryData . set ( subCategory , {
119
154
restOperationsMiniTocItems,
120
155
} )
121
- restOperationData . set ( restOperationData , languageTree )
122
156
}
123
- return restOperationData . get ( language ) . get ( version ) . get ( apiDate ) . get ( category ) . get ( subCategory )
157
+
158
+ return categoryData . get ( subCategory ) !
124
159
}
0 commit comments