| 
1 | 1 | import { MapKeysResult, MappingResolver, NodeContext } from '../types'  | 
2 |  | -import { getStringValue, objectKeys, onlyExistedArrayIndexes } from '../utils'  | 
 | 2 | +import { difference, getStringValue, intersection, objectKeys, onlyExistedArrayIndexes } from '../utils'  | 
3 | 3 | import { mapPathParams } from './openapi3.utils'  | 
4 | 4 | import { OpenAPIV3 } from 'openapi-types'  | 
5 | 5 | 
 
  | 
@@ -28,28 +28,33 @@ export const pathMappingResolver: MappingResolver<string> = (before, after, ctx)  | 
28 | 28 | 
 
  | 
29 | 29 |   const result: MapKeysResult<string> = { added: [], removed: [], mapped: {} }  | 
30 | 30 | 
 
  | 
31 |  | -  const originalBeforeKeys = objectKeys(before)  | 
32 |  | -  const originalAfterKeys = objectKeys(after)  | 
33 |  | -  const unifiedAfterKeys = originalAfterKeys.map(unifyPath(ctx.after))  | 
 | 31 | +  const unifiedBeforeKeyToKey = Object.fromEntries(objectKeys(before).map(key => [createPathUnifier(ctx.before)(key), key]))  | 
 | 32 | +  const unifiedAfterKeyToKey = Object.fromEntries(objectKeys(after).map(key => [createPathUnifier(ctx.after)(key), key]))  | 
34 | 33 | 
 
  | 
35 |  | -  const notMappedAfterIndices = new Set(originalAfterKeys.keys())  | 
 | 34 | +  const unifiedBeforeKeys = Object.keys(unifiedBeforeKeyToKey)  | 
 | 35 | +  const unifiedAfterKeys = Object.keys(unifiedAfterKeyToKey)  | 
36 | 36 | 
 
  | 
37 |  | -  originalBeforeKeys.forEach(beforeKey => {  | 
38 |  | -    const unifiedBeforePath = unifyPath(ctx.before)(beforeKey)  | 
39 |  | -    const index = unifiedAfterKeys.indexOf(unifiedBeforePath)  | 
 | 37 | +  result.added = difference(unifiedAfterKeys, unifiedBeforeKeys).map(key => unifiedAfterKeyToKey[key])  | 
 | 38 | +  result.removed = difference(unifiedBeforeKeys, unifiedAfterKeys).map(key => unifiedBeforeKeyToKey[key])  | 
 | 39 | +  result.mapped = Object.fromEntries(  | 
 | 40 | +    intersection(unifiedBeforeKeys, unifiedAfterKeys).map(key => [unifiedBeforeKeyToKey[key], unifiedAfterKeyToKey[key]]),  | 
 | 41 | +  )  | 
40 | 42 | 
 
  | 
41 |  | -    if (index < 0) {  | 
42 |  | -      // removed item  | 
43 |  | -      result.removed.push(beforeKey)  | 
44 |  | -    } else {  | 
45 |  | -      // mapped items  | 
46 |  | -      result.mapped[beforeKey] = originalAfterKeys[index]  | 
47 |  | -      notMappedAfterIndices.delete(index)  | 
48 |  | -    }  | 
49 |  | -  })  | 
 | 43 | +  return result  | 
 | 44 | +}  | 
 | 45 | + | 
 | 46 | +export const methodMappingResolver: MappingResolver<string> = (before, after) => {  | 
 | 47 | + | 
 | 48 | +  const result: MapKeysResult<string> = { added: [], removed: [], mapped: {} }  | 
 | 49 | + | 
 | 50 | +  const beforeKeys = objectKeys(before)  | 
 | 51 | +  const afterKeys = objectKeys(after)  | 
 | 52 | + | 
 | 53 | +  result.added = difference(afterKeys, beforeKeys)  | 
 | 54 | +  result.removed = difference(beforeKeys, afterKeys)  | 
50 | 55 | 
 
  | 
51 |  | -  // added items  | 
52 |  | -  notMappedAfterIndices.forEach((notMappedIndex) => result.added.push(originalAfterKeys[notMappedIndex]))  | 
 | 56 | +  const mapped = intersection(beforeKeys, afterKeys)  | 
 | 57 | +  mapped.forEach(key => result.mapped[key] = key)  | 
53 | 58 | 
 
  | 
54 | 59 |   return result  | 
55 | 60 | }  | 
@@ -196,7 +201,7 @@ export const extractOperationBasePath = (servers?: OpenAPIV3.ServerObject[]): st  | 
196 | 201 |   }  | 
197 | 202 | }  | 
198 | 203 | 
 
  | 
199 |  | -export function unifyPath(nodeContext: NodeContext): (path: string) => string {  | 
 | 204 | +export function createPathUnifier(nodeContext: NodeContext): (path: string) => string {  | 
200 | 205 |   const serverPrefix = extractOperationBasePath((nodeContext.root as OpenAPIV3.Document).servers) // /api/v2  | 
201 | 206 |   return (path) => (  | 
202 | 207 |     serverPrefix  | 
 | 
0 commit comments