@@ -196,8 +196,9 @@ async function openapiFilter(oaObj, options) {
196196 let jsonObj = JSON . parse ( JSON . stringify ( oaObj ) ) ; // Deep copy of the schema object
197197 let defaultFilter = options . defaultFilter || ( await parseFile ( __dirname + '/defaultFilter.json' ) ) ;
198198 let filterSet = Object . assign ( { } , defaultFilter , options . filterSet ) ;
199- const httpVerbs = [ 'get' , 'post' , 'put' , 'patch' , 'delete' , 'head' , 'options' , 'trace' ] ;
199+ const httpVerbs = [ 'get' , 'query' , ' post', 'put' , 'patch' , 'delete' , 'head' , 'options' , 'trace' ] ;
200200 const fixedFlags = [ 'x-openapi-format-filter' ] ;
201+ const componentTypes = [ 'schemas' , 'responses' , 'parameters' , 'examples' , 'requestBodies' , 'headers' , 'mediaTypes' ] ;
201202 options . unusedDepth = options . unusedDepth || 0 ;
202203
203204 // Merge object filters
@@ -232,26 +233,22 @@ async function openapiFilter(oaObj, options) {
232233 const inverseFilterFlagHash = inverseFilterFlagValues . map ( o => JSON . stringify ( o ) ) ;
233234
234235 // Initiate components tracking
235- const comps = {
236- schemas : { } ,
237- responses : { } ,
238- parameters : { } ,
239- examples : { } ,
240- requestBodies : { } ,
241- headers : { } ,
242- meta : { total : 0 }
243- } ;
236+ const comps = componentTypes . reduce (
237+ ( acc , type ) => {
238+ acc [ type ] = { } ;
239+ return acc ;
240+ } ,
241+ { meta : { total : 0 } }
242+ ) ;
244243
245244 // Prepare unused components
246- let unusedComp = {
247- schemas : [ ] ,
248- responses : [ ] ,
249- parameters : [ ] ,
250- examples : [ ] ,
251- requestBodies : [ ] ,
252- headers : [ ] ,
253- meta : { total : 0 }
254- } ;
245+ let unusedComp = componentTypes . reduce (
246+ ( acc , type ) => {
247+ acc [ type ] = [ ] ;
248+ return acc ;
249+ } ,
250+ { meta : { total : 0 } }
251+ ) ;
255252 // Use options.unusedComp to collect unused components during multiple recursion
256253 if ( ! options . unusedComp ) options . unusedComp = JSON . parse ( JSON . stringify ( unusedComp ) ) ;
257254
@@ -268,7 +265,7 @@ async function openapiFilter(oaObj, options) {
268265
269266 // Register components usage
270267 if ( this . key === '$ref' && typeof node === 'string' ) {
271- for ( let type of [ 'schemas' , 'responses' , 'parameters' , 'examples' , 'requestBodies' , 'headers' ] ) {
268+ for ( let type of componentTypes ) {
272269 const prefix = `#/components/${ type } /` ;
273270 if ( node . startsWith ( prefix ) ) {
274271 const name = node . slice ( prefix . length ) ;
@@ -639,14 +636,14 @@ async function openapiFilter(oaObj, options) {
639636 const optFs = get ( options , 'filterSet.unusedComponents' , [ ] ) || [ ] ;
640637
641638 // Identify components that are directly unused (not referenced anywhere)
642- unusedComp . schemas = Object . keys ( comps . schemas || { } ) . filter ( key => ! comps . schemas [ key ] . used ) ;
643- unusedComp . responses = Object . keys ( comps . responses || { } ) . filter ( key => ! comps . responses [ key ] . used ) ;
644- unusedComp . parameters = Object . keys ( comps . parameters || { } ) . filter ( key => ! comps . parameters [ key ] . used ) ;
645- unusedComp . examples = Object . keys ( comps . examples || { } ) . filter ( key => ! comps . examples [ key ] . used ) ;
646- unusedComp . requestBodies = Object . keys ( comps . requestBodies || { } ) . filter ( key => ! comps . requestBodies [ key ] . used ) ;
647- unusedComp . headers = Object . keys ( comps . headers || { } ) . filter ( key => ! comps . headers [ key ] . used ) ;
648-
649- const refGraph = { schemas : { } , responses : { } , parameters : { } , examples : { } , requestBodies : { } , headers : { } } ;
639+ componentTypes . forEach ( type => {
640+ unusedComp [ type ] = Object . keys ( comps [ type ] || { } ) . filter ( key => ! comps [ type ] [ key ] . used ) ;
641+ } ) ;
642+
643+ const refGraph = componentTypes . reduce ( ( acc , type ) => {
644+ acc [ type ] = { } ;
645+ return acc ;
646+ } , { } ) ;
650647 const rootRefs = new Set ( ) ;
651648
652649 // Traverse $ref in components
@@ -681,42 +678,28 @@ async function openapiFilter(oaObj, options) {
681678 }
682679
683680 // Mark not visited as unused
684- for ( const t of [ 'schemas' , 'responses' , 'parameters' , 'examples' , 'requestBodies' , 'headers' ] ) {
681+ for ( const t of componentTypes ) {
685682 unusedComp [ t ] = Object . keys ( comps [ t ] || { } ) . filter ( k => ! visited . has ( `${ t } :${ k } ` ) ) ;
686683 }
687684
688685 // TODO rework this logic
689686 unusedComp . meta = {
690- total :
691- unusedComp . schemas . length +
692- unusedComp . responses . length +
693- unusedComp . parameters . length +
694- unusedComp . examples . length +
695- unusedComp . requestBodies . length +
696- unusedComp . headers . length
687+ total : componentTypes . reduce ( ( acc , type ) => acc + ( unusedComp [ type ] ?. length || 0 ) , 0 )
697688 } ;
698689
699690 // Update options.unusedComp with all identified unused components
700- if ( optFs . includes ( 'schemas' ) ) options . unusedComp . schemas = [ ...options . unusedComp . schemas , ...unusedComp . schemas ] ;
701- if ( optFs . includes ( 'responses' ) )
702- options . unusedComp . responses = [ ...options . unusedComp . responses , ...unusedComp . responses ] ;
703- if ( optFs . includes ( 'parameters' ) )
704- options . unusedComp . parameters = [ ...options . unusedComp . parameters , ...unusedComp . parameters ] ;
705- if ( optFs . includes ( 'examples' ) )
706- options . unusedComp . examples = [ ...options . unusedComp . examples , ...unusedComp . examples ] ;
707- if ( optFs . includes ( 'requestBodies' ) )
708- options . unusedComp . requestBodies = [ ...options . unusedComp . requestBodies , ...unusedComp . requestBodies ] ;
709- if ( optFs . includes ( 'headers' ) ) options . unusedComp . headers = [ ...options . unusedComp . headers , ...unusedComp . headers ] ;
691+ componentTypes . forEach ( type => {
692+ if ( optFs . includes ( type ) ) {
693+ options . unusedComp [ type ] = [ ...options . unusedComp [ type ] , ...unusedComp [ type ] ] ;
694+ }
695+ } ) ;
710696
711697 // TODO rework this logic
712698 // Update unusedComp.meta.total after each recursion
713- options . unusedComp . meta . total =
714- options . unusedComp . schemas . length +
715- options . unusedComp . responses . length +
716- options . unusedComp . parameters . length +
717- options . unusedComp . examples . length +
718- options . unusedComp . requestBodies . length +
719- options . unusedComp . headers . length ;
699+ options . unusedComp . meta . total = componentTypes . reduce (
700+ ( acc , type ) => acc + ( options . unusedComp [ type ] ?. length || 0 ) ,
701+ 0
702+ ) ;
720703
721704 // Clean-up jsonObj
722705 traverse ( jsonObj ) . forEach ( function ( node ) {
@@ -806,15 +789,13 @@ async function openapiFilter(oaObj, options) {
806789 }
807790
808791 // Prepare totalComp for the final result
809- const totalComp = {
810- schemas : Object . keys ( comps . schemas ) ,
811- responses : Object . keys ( comps . responses ) ,
812- parameters : Object . keys ( comps . parameters ) ,
813- examples : Object . keys ( comps . examples ) ,
814- requestBodies : Object . keys ( comps . requestBodies ) ,
815- headers : Object . keys ( comps . headers ) ,
816- meta : { total : comps . meta . total }
817- } ;
792+ const totalComp = componentTypes . reduce (
793+ ( acc , type ) => {
794+ acc [ type ] = Object . keys ( comps [ type ] ) ;
795+ return acc ;
796+ } ,
797+ { meta : { total : comps . meta . total } }
798+ ) ;
818799
819800 // Return result object
820801 return { data : jsonObj , resultData : { unusedComp : unusedComp , totalComp : totalComp } } ;
@@ -1099,7 +1080,7 @@ async function openapiSplit(oaObj, options = {}) {
10991080
11001081/**
11011082 * OpenAPI convert version function
1102- * Convert OpenAPI from version 3.0 to 3.1
1083+ * Convert OpenAPI from version 3.0 to 3.1 or 3.2
11031084 * @param {object } oaObj OpenAPI document
11041085 * @param {object } options OpenAPI-format convert options
11051086 * @returns {object } converted OpenAPI document
0 commit comments