@@ -5,11 +5,26 @@ import { readCompressedJsonFileFallback } from '@/frame/lib/read-json-file'
55import { getAutomatedPageMiniTocItems } from '@/frame/lib/get-mini-toc-items'
66import { allVersions , getOpenApiVersion } from '@/versions/lib/all-versions'
77import languages from '@/languages/lib/languages'
8+ import type { Context } from '@/types'
9+ import type { Operation } from '@/rest/components/types'
810
911export const REST_DATA_DIR = 'src/rest/data'
1012export const REST_SCHEMA_FILENAME = 'schema.json'
1113const REST_CONTENT_DIR = 'content/rest'
1214
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+
1328/*
1429 Loads the schemas from the static/decorated folder into a single
1530 object organized by version. Not all products are calendar date
@@ -38,87 +53,107 @@ const REST_CONTENT_DIR = 'content/rest'
3853 }
3954*/
4055const 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 > > ( )
4361
44- Object . keys ( languages ) . forEach ( ( language ) => {
62+ Object . keys ( languages ) . forEach ( ( language : string ) => {
4563 restOperationData . set ( language , new Map ( ) )
46- Object . keys ( allVersions ) . forEach ( ( version ) => {
64+ Object . keys ( allVersions ) . forEach ( ( version : string ) => {
4765 // setting to undefined will allow us to perform checks
4866 // more easily later on
49- restOperationData . get ( language ) . set ( version , new Map ( ) )
67+ restOperationData . get ( language ) ! . set ( version , new Map ( ) )
5068 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 ( ) )
5371 } )
5472 } else {
5573 // 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 ( ) )
5775 }
5876 } )
5977} )
6078
61- export const categoriesWithoutSubcategories = fs
79+ export const categoriesWithoutSubcategories : string [ ] = fs
6280 . readdirSync ( REST_CONTENT_DIR )
63- . filter ( ( file ) => {
81+ . filter ( ( file : string ) => {
6482 return file . endsWith ( '.md' ) && ! file . includes ( 'index.md' ) && ! file . includes ( 'README.md' )
6583 } )
66- . map ( ( filteredFile ) => filteredFile . replace ( '.md' , '' ) )
84+ . map ( ( filteredFile : string ) => filteredFile . replace ( '.md' , '' ) )
6785
6886// version: plan + release e.g. For ghes-3.5, ghes is the plan and 3.5 is the release
6987// apiVersion (not all versions have apiVersions): REST API Calendar Dates
7088// openApiVersion (below, every version has an openApiVersion mapping): There's a mapping between our Docs versions
7189// 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 > {
7395 const openApiVersion = getOpenApiVersion ( version )
7496 const openapiSchemaName = apiVersion ? `${ openApiVersion } -${ apiVersion } ` : `${ openApiVersion } `
7597 const apiDate = apiVersion || NOT_API_VERSIONED
7698 const fileName = path . join ( REST_DATA_DIR , openapiSchemaName , REST_SCHEMA_FILENAME )
99+
77100 if ( ! restOperations . has ( openApiVersion ) ) {
78101 restOperations . set ( openApiVersion , new Map ( ) )
79- restOperations . get ( openApiVersion ) . set ( apiDate , new Map ( ) )
80102 // The `readCompressedJsonFileFallback()` function
81103 // 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 ) ) {
85108 // The `readCompressedJsonFileFallback()` function
86109 // 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 )
95113 }
114+
115+ return restOperations . get ( openApiVersion ) ! . get ( apiDate ) !
96116}
97117
98118// Generates the miniToc for a rest reference page.
99119export 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 > {
108128 const apiDate = apiVersion || NOT_API_VERSIONED
109129
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 ( ) )
112147 }
113148
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 )
117152 const restOperationsMiniTocItems = await getAutomatedPageMiniTocItems ( titles , context , 3 )
118- languageTree . get ( version ) . get ( apiDate ) . get ( category ) . set ( subCategory , {
153+ categoryData . set ( subCategory , {
119154 restOperationsMiniTocItems,
120155 } )
121- restOperationData . set ( restOperationData , languageTree )
122156 }
123- return restOperationData . get ( language ) . get ( version ) . get ( apiDate ) . get ( category ) . get ( subCategory )
157+
158+ return categoryData . get ( subCategory ) !
124159}
0 commit comments