@@ -17,6 +17,7 @@ import {
1717import { isNamedType , SpecExtension , type NormalizedNodeType } from './types/index.js' ;
1818import type { OasRef } from './typings/openapi.js' ;
1919import { getOwn } from './utils/get-own.js' ;
20+ import { isPlainObject } from './utils/is-plain-object.js' ;
2021import { makeRefId } from './utils/make-ref-id.js' ;
2122import { nextTick } from './utils/next-tick.js' ;
2223import { readFileFromUrl } from './utils/read-file-from-url.js' ;
@@ -193,17 +194,17 @@ export type ResolvedRefMap = Map<string, ResolvedRef>;
193194
194195type RefFrame = {
195196 prev : RefFrame | null ;
196- node : any ;
197+ node : unknown ;
197198} ;
198199
199- function pushRef ( head : RefFrame , node : any ) : RefFrame {
200+ function pushRef ( head : RefFrame , node : unknown ) : RefFrame {
200201 return {
201202 prev : head ,
202203 node,
203204 } ;
204205}
205206
206- function hasRef ( head : RefFrame | null , node : any ) : boolean {
207+ function hasRef ( head : RefFrame | null , node : unknown ) : boolean {
207208 while ( head ) {
208209 if ( head . node === node ) {
209210 return true ;
@@ -236,18 +237,18 @@ export async function resolveDocument(opts: {
236237 return resolvedRefMap ;
237238
238239 function resolveRefsInParallel (
239- rootNode : any ,
240+ rootNode : unknown ,
240241 rootNodeDocument : Document ,
241242 rootNodePointer : string ,
242- type : any
243+ type : NormalizedNodeType
243244 ) {
244245 const rootNodeDocAbsoluteRef = rootNodeDocument . source . absoluteRef ;
245- const anchorRefsMap : Map < string , any > = new Map ( ) ;
246+ const anchorRefsMap : Map < string , unknown > = new Map ( ) ;
246247
247248 walk ( rootNode , type , rootNodeDocAbsoluteRef + rootNodePointer ) ;
248249
249- function walk ( node : any , type : NormalizedNodeType , nodeAbsoluteRef : string ) {
250- if ( typeof node !== 'object' || node === null ) {
250+ function walk ( node : unknown , type : NormalizedNodeType , nodeAbsoluteRef : string ) {
251+ if ( ! isPlainObject ( node ) && ! Array . isArray ( node ) ) {
251252 return ;
252253 }
253254
@@ -258,11 +259,6 @@ export async function resolveDocument(opts: {
258259
259260 seenNodes . add ( nodeId ) ;
260261
261- const [ _ , anchor ] = Object . entries ( node ) . find ( ( [ key ] ) => key === '$anchor' ) || [ ] ;
262- if ( anchor ) {
263- anchorRefsMap . set ( `#${ anchor } ` , node ) ;
264- }
265-
266262 if ( Array . isArray ( node ) ) {
267263 const itemsType = type . items ;
268264 // we continue resolving unknown types, but stop early on known scalars
@@ -291,6 +287,11 @@ export async function resolveDocument(opts: {
291287 return ;
292288 }
293289
290+ const [ _ , anchor ] = Object . entries ( node ) . find ( ( [ key ] ) => key === '$anchor' ) || [ ] ;
291+ if ( anchor ) {
292+ anchorRefsMap . set ( `#${ anchor } ` , node ) ;
293+ }
294+
294295 for ( const propName of Object . keys ( node ) ) {
295296 let propValue = node [ propName ] ;
296297 let propType = getOwn ( type . properties , propName ) ;
@@ -342,7 +343,7 @@ export async function resolveDocument(opts: {
342343 if ( isExternalValue ( node ) ) {
343344 const promise = followRef (
344345 rootNodeDocument ,
345- { $ref : node . externalValue } ,
346+ { $ref : node . externalValue as string } ,
346347 {
347348 prev : null ,
348349 node,
@@ -352,7 +353,7 @@ export async function resolveDocument(opts: {
352353 resolveRefsInParallel (
353354 resolvedRef . node ,
354355 resolvedRef . document ,
355- resolvedRef . nodePointer ! ,
356+ resolvedRef . nodePointer ,
356357 type
357358 ) ;
358359 }
@@ -420,33 +421,42 @@ export async function resolveDocument(opts: {
420421 nodePointer : '#/' ,
421422 } ;
422423
423- let target = targetDoc . parsed as any ;
424+ let target = targetDoc . parsed ;
424425
425426 const segments = pointer ;
426427 for ( const segment of segments ) {
427- if ( typeof target !== 'object' ) {
428- target = undefined ;
429- break ;
430- } else if ( target [ segment ] !== undefined ) {
428+ if ( isPlainObject ( target ) && target [ segment ] !== undefined ) {
431429 target = target [ segment ] ;
432430 resolvedRef . nodePointer = joinPointer (
433431 resolvedRef . nodePointer ! ,
434432 escapePointerFragment ( segment )
435433 ) ;
434+ } else if ( Array . isArray ( target ) && target [ + segment ] !== undefined ) {
435+ target = target [ + segment ] ;
436+ resolvedRef . nodePointer = joinPointer (
437+ resolvedRef . nodePointer ! ,
438+ escapePointerFragment ( segment )
439+ ) ;
436440 } else if ( isRef ( target ) ) {
437441 resolvedRef = await followRef ( targetDoc , target , pushRef ( refStack , target ) ) ;
438442 targetDoc = resolvedRef . document || targetDoc ;
439443
440- if ( typeof resolvedRef . node !== 'object' ) {
444+ if ( isPlainObject ( resolvedRef . node ) ) {
445+ target = resolvedRef . node [ segment ] ;
446+ resolvedRef . nodePointer = joinPointer (
447+ resolvedRef . nodePointer ! ,
448+ escapePointerFragment ( segment )
449+ ) ;
450+ } else if ( Array . isArray ( resolvedRef . node ) ) {
451+ target = resolvedRef . node [ + segment ] ;
452+ resolvedRef . nodePointer = joinPointer (
453+ resolvedRef . nodePointer ! ,
454+ escapePointerFragment ( segment )
455+ ) ;
456+ } else {
441457 target = undefined ;
442458 break ;
443459 }
444-
445- target = resolvedRef . node [ segment ] ;
446- resolvedRef . nodePointer = joinPointer (
447- resolvedRef . nodePointer ! ,
448- escapePointerFragment ( segment )
449- ) ;
450460 } else {
451461 target = undefined ;
452462 break ;
0 commit comments