1- import  {  MapKeysResult ,  MappingResolver ,  NodeContext  }  from  '../types' 
2- import  { 
3-   difference , 
4-   getStringValue , 
5-   intersection , 
6-   objectKeys , 
7-   onlyExistedArrayIndexes , 
8-   removeSlashes , 
9- }  from  '../utils' 
1+ import  type  {  MapKeysResult ,  MappingResolver  }  from  '../types' 
2+ import  {  getStringValue ,  objectKeys ,  onlyExistedArrayIndexes  }  from  '../utils' 
103import  {  mapPathParams  }  from  './openapi3.utils' 
11- import  {  OpenAPIV3  }  from  'openapi-types' 
124
135export  const  singleOperationPathMappingResolver : MappingResolver < string >  =  ( before ,  after )  =>  { 
146
@@ -31,40 +23,32 @@ export const singleOperationPathMappingResolver: MappingResolver<string> = (befo
3123  return  result 
3224} 
3325
34- export  const  pathMappingResolver : MappingResolver < string >  =  ( before ,  after ,   ctx )  =>  { 
26+ export  const  pathMappingResolver : MappingResolver < string >  =  ( before ,  after )  =>  { 
3527
3628  const  result : MapKeysResult < string >  =  {  added : [ ] ,  removed : [ ] ,  mapped : { }  } 
3729
38-   const  unifyBeforePath  =  createPathUnifier ( ctx . before ) 
39-   const  unifyAfterPath  =  createPathUnifier ( ctx . after ) 
30+   const  originalBeforeKeys  =  objectKeys ( before ) 
31+   const  originalAfterKeys  =  objectKeys ( after ) 
32+   const  unifiedAfterKeys  =  originalAfterKeys . map ( hidePathParamNames ) 
4033
41-   const  unifiedBeforeKeyToKey  =  Object . fromEntries ( objectKeys ( before ) . map ( key  =>  [ unifyBeforePath ( key ) ,  key ] ) ) 
42-   const  unifiedAfterKeyToKey  =  Object . fromEntries ( objectKeys ( after ) . map ( key  =>  [ unifyAfterPath ( key ) ,  key ] ) ) 
34+   const  notMappedAfterIndices  =  new  Set ( originalAfterKeys . keys ( ) ) 
4335
44-   const  unifiedBeforeKeys  =  Object . keys ( unifiedBeforeKeyToKey ) 
45-   const  unifiedAfterKeys  =  Object . keys ( unifiedAfterKeyToKey ) 
36+   originalBeforeKeys . forEach ( beforeKey  =>  { 
37+     const  unifiedBeforePath  =  hidePathParamNames ( beforeKey ) 
38+     const  index  =  unifiedAfterKeys . indexOf ( unifiedBeforePath ) 
4639
47-   result . added  =  difference ( unifiedAfterKeys ,  unifiedBeforeKeys ) . map ( key  =>  unifiedAfterKeyToKey [ key ] ) 
48-   result . removed  =  difference ( unifiedBeforeKeys ,  unifiedAfterKeys ) . map ( key  =>  unifiedBeforeKeyToKey [ key ] ) 
49-   result . mapped  =  Object . fromEntries ( 
50-     intersection ( unifiedBeforeKeys ,  unifiedAfterKeys ) . map ( key  =>  [ unifiedBeforeKeyToKey [ key ] ,  unifiedAfterKeyToKey [ key ] ] ) , 
51-   ) 
52- 
53-   return  result 
54- } 
55- 
56- export  const  methodMappingResolver : MappingResolver < string >  =  ( before ,  after )  =>  { 
57- 
58-   const  result : MapKeysResult < string >  =  {  added : [ ] ,  removed : [ ] ,  mapped : { }  } 
59- 
60-   const  beforeKeys  =  objectKeys ( before ) 
61-   const  afterKeys  =  objectKeys ( after ) 
62- 
63-   result . added  =  difference ( afterKeys ,  beforeKeys ) 
64-   result . removed  =  difference ( beforeKeys ,  afterKeys ) 
40+     if  ( index  <  0 )  { 
41+       // removed item 
42+       result . removed . push ( beforeKey ) 
43+     }  else  { 
44+       // mapped items 
45+       result . mapped [ beforeKey ]  =  originalAfterKeys [ index ] 
46+       notMappedAfterIndices . delete ( index ) 
47+     } 
48+   } ) 
6549
66-   const   mapped   =   intersection ( beforeKeys ,   afterKeys ) 
67-   mapped . forEach ( key  =>  result . mapped [ key ]   =   key ) 
50+   // added items 
51+   notMappedAfterIndices . forEach ( ( notMappedIndex )  =>  result . added . push ( originalAfterKeys [ notMappedIndex ] ) ) 
6852
6953  return  result 
7054} 
@@ -191,31 +175,6 @@ function isWildcardCompatible(beforeType: string, afterType: string): boolean {
191175  return  true 
192176} 
193177
194- // todo copy-paste from api-processor 
195- export  const  extractOperationBasePath  =  ( servers ?: OpenAPIV3 . ServerObject [ ] ) : string  =>  { 
196-   if  ( ! Array . isArray ( servers )  ||  ! servers . length )  {  return  ''  } 
197- 
198-   try  { 
199-     const  [ firstServer ]  =  servers 
200-     let  serverUrl  =  firstServer . url 
201-     const  {  variables =  { }  }  =  firstServer 
202- 
203-     for  ( const  param  of  Object . keys ( variables ) )  { 
204-       serverUrl  =  serverUrl . replace ( new  RegExp ( `{${ param }  }` ,  'g' ) ,  variables [ param ] . default ) 
205-     } 
206- 
207-     const  {  pathname }  =  new  URL ( serverUrl ,  'https://localhost' ) 
208-     return  pathname . slice ( - 1 )  ===  '/'  ? pathname . slice ( 0 ,  - 1 )  : pathname 
209-   }  catch  ( error )  { 
210-     return  '' 
211-   } 
212- } 
213- 
214- export  function  createPathUnifier ( nodeContext : NodeContext ) : ( path : string )  =>  string  { 
215-   const  serverPrefix  =  extractOperationBasePath ( ( nodeContext . root  as  OpenAPIV3 . Document ) . servers )  // /api/v2 
216-   return  ( path )  =>  removeSlashes ( `${ serverPrefix } ${ hidePathParamNames ( path ) }  ` ) 
217- } 
218- 
219178export  function  hidePathParamNames ( path : string ) : string  { 
220179  return  path . replace ( PATH_PARAMETER_REGEXP ,  PATH_PARAM_UNIFIED_PLACEHOLDER ) 
221180} 
0 commit comments