@@ -38,9 +38,30 @@ export const types = [
3838 "Agent" ,
3939] ;
4040
41- export type TraversalContext = { parent ?: any } ;
42-
43- export type Traversal < T > = ( jsonLd : T , context : TraversalContext ) => Partial < T > | any ;
41+ export type Presentation3Resource =
42+ | Collection
43+ | Manifest
44+ | Canvas
45+ | AnnotationCollection
46+ | AnnotationPage
47+ | Annotation
48+ | ContentResource
49+ | ChoiceTarget
50+ | ChoiceBody
51+ | Range
52+ | Service
53+ | ResourceProvider
54+ | SpecificResource
55+ | GeoJSON ;
56+
57+ export type TraversalContext = { parent ?: unknown } ;
58+
59+ export type Traversal < T > = ( jsonLd : T , context : TraversalContext ) => unknown ;
60+
61+ export type AllTraversal = < Resource extends Presentation3Resource > (
62+ resource : Resource ,
63+ context : TraversalContext
64+ ) => unknown ;
4465
4566export type TraversalMap = {
4667 collection ?: Array < Traversal < Collection > > ;
@@ -62,7 +83,7 @@ export type TraverseOptions = {
6283 allowUndefinedReturn : boolean ;
6384} ;
6485
65- export function identifyResource ( resource : any , typeHint ?: string ) : string {
86+ export function identifyResource ( resource : unknown , typeHint ?: string ) : string {
6687 if ( typeof resource === "undefined" || resource === null ) {
6788 throw new Error ( "Null or undefined is not a valid entity." ) ;
6889 }
@@ -76,14 +97,14 @@ export function identifyResource(resource: any, typeHint?: string): string {
7697 throw new Error ( `${ typeof resource } is not a valid entity` ) ;
7798 }
7899
79- if ( typeof resource ! . type === "string" ) {
100+ if ( "type" in resource && typeof resource . type === "string" ) {
80101 const hasType = types . indexOf ( resource . type ) ;
81102 if ( hasType !== - 1 ) {
82103 return types [ hasType ] ! ;
83104 }
84105 }
85106
86- if ( resource ! . profile ) {
107+ if ( "profile" in resource && resource . profile ) {
87108 return "Service" ;
88109 }
89110
@@ -118,7 +139,7 @@ export class Traverse {
118139 } ;
119140 }
120141
121- static all ( traversal : ( resource : any ) => any ) {
142+ static all ( traversal : AllTraversal ) {
122143 return new Traverse ( {
123144 collection : [ traversal ] ,
124145 manifest : [ traversal ] ,
@@ -136,7 +157,7 @@ export class Traverse {
136157 } ) ;
137158 }
138159
139- traverseDescriptive < T extends Partial < DescriptiveProperties > > ( resource : T ) : T {
160+ traverseDescriptive < T extends Presentation3Resource & Partial < DescriptiveProperties > > ( resource : T ) : T {
140161 if ( resource . thumbnail ) {
141162 resource . thumbnail = ensureArray ( resource . thumbnail ) . map ( ( thumbnail ) =>
142163 this . traverseType ( thumbnail , { parent : resource } , this . traversals . contentResource )
@@ -148,7 +169,7 @@ export class Traverse {
148169 return resource ;
149170 }
150171
151- traverseLinking < T extends Partial < LinkingProperties > > ( resource : T ) : T {
172+ traverseLinking < T extends Presentation3Resource & Partial < LinkingProperties > > ( resource : T ) : T {
152173 if ( resource . seeAlso ) {
153174 resource . seeAlso = ensureArray ( resource . seeAlso ) . map ( ( content ) =>
154175 this . traverseType ( content , { parent : resource } , this . traversals . contentResource )
@@ -227,6 +248,7 @@ export class Traverse {
227248 return collection ;
228249 }
229250
251+ traverseCollection ( collection : Collection , parent ?: Presentation3Resource ) : Collection ;
230252 traverseCollection ( collection : Collection , parent ?: any ) : Collection {
231253 return this . traverseType < Collection > (
232254 this . traverseDescriptive (
@@ -241,6 +263,7 @@ export class Traverse {
241263 ) ;
242264 }
243265
266+ traverseGeoJson ( geoJson : GeoJSON , parent ?: Presentation3Resource ) : GeoJSON ;
244267 traverseGeoJson ( geoJson : GeoJSON , parent ?: any ) : GeoJSON {
245268 return this . traverseType < GeoJSON > ( geoJson , { parent } , this . traversals . geoJson ) ;
246269 }
@@ -276,6 +299,7 @@ export class Traverse {
276299 this . traverseInlineAnnotationPages . bind ( this )
277300 ) ;
278301
302+ traverseManifest ( manifest : Manifest , parent ?: Presentation3Resource ) : Manifest ;
279303 traverseManifest ( manifest : Manifest , parent ?: any ) : Manifest {
280304 return this . traverseType < Manifest > ( this . _traverseManifest ( manifest ) , { parent } , this . traversals . manifest ) ;
281305 }
@@ -309,6 +333,7 @@ export class Traverse {
309333 this . traverseInlineAnnotationPages . bind ( this )
310334 ) ;
311335
336+ traverseCanvas ( canvas : Canvas , parent ?: Presentation3Resource ) : Canvas ;
312337 traverseCanvas ( canvas : Canvas , parent ?: any ) : Canvas {
313338 return this . traverseType < Canvas > ( this . _traverseCanvas ( canvas ) , { parent } , this . traversals . canvas ) ;
314339 }
@@ -328,6 +353,7 @@ export class Traverse {
328353 this . traverseDescriptive . bind ( this )
329354 ) ;
330355
356+ traverseAnnotationPage ( annotationPageJson : AnnotationPage , parent ?: Presentation3Resource ) : AnnotationPage ;
331357 traverseAnnotationPage ( annotationPageJson : AnnotationPage , parent ?: any ) : AnnotationPage {
332358 return this . traverseType < AnnotationPage > (
333359 this . _traverseAnnotationPage ( annotationPageJson ) ,
@@ -363,6 +389,7 @@ export class Traverse {
363389 }
364390
365391 // @todo traverseAnnotationSelector
392+ traverseAnnotation ( annotationJson : Annotation , parent ?: Presentation3Resource ) : Annotation ;
366393 traverseAnnotation ( annotationJson : Annotation , parent ?: any ) : Annotation {
367394 return this . traverseType < Annotation > (
368395 this . traverseLinking ( this . traverseAnnotationBody ( this . traverseDescriptive ( annotationJson as any ) ) ) ,
@@ -384,6 +411,7 @@ export class Traverse {
384411 return contentResourceJson ;
385412 }
386413
414+ traverseContentResource ( contentResourceJson : ContentResource , parent ?: Presentation3Resource ) : ContentResource ;
387415 traverseContentResource ( contentResourceJson : ContentResource , parent ?: any ) : ContentResource {
388416 if ( ( contentResourceJson as any ) . type === "Choice" ) {
389417 ( contentResourceJson as any ) . items = ( contentResourceJson as any ) . items . map ( ( choiceItem : ContentResource ) => {
@@ -407,6 +435,11 @@ export class Traverse {
407435 ) ;
408436 }
409437
438+ traverseSpecificResource (
439+ specificResource : SpecificResource ,
440+ typeHint ?: string ,
441+ parent ?: Presentation3Resource
442+ ) : SpecificResource ;
410443 traverseSpecificResource ( specificResource : SpecificResource , typeHint ?: string , parent ?: any ) : SpecificResource {
411444 let source = specificResource . source ;
412445 if ( typeof specificResource . source === "string" ) {
@@ -420,7 +453,7 @@ export class Traverse {
420453 typeHint === "Canvas" || source . type === "Canvas"
421454 ? this . traverseType ( source , { parent } , this . traversals . canvas )
422455 : typeHint === "ContentResource"
423- ? this . traverseContentResource ( source , { parent } )
456+ ? this . traverseContentResource ( source , parent )
424457 : this . traverseUnknown ( source , { parent, typeHint } ) ,
425458 } ,
426459 { parent } ,
@@ -455,10 +488,12 @@ export class Traverse {
455488 this . traverseLinkedCanvases . bind ( this )
456489 ) ;
457490
491+ traverseRange ( range : Range , parent ?: Presentation3Resource ) : Range ;
458492 traverseRange ( range : Range , parent ?: any ) : Range {
459493 return this . traverseType < Range > ( this . _traverseRange ( range ) , { parent } , this . traversals . range ) ;
460494 }
461495
496+ traverseAgent ( agent : ResourceProvider , parent ?: Presentation3Resource ) : ResourceProvider ;
462497 traverseAgent ( agent : ResourceProvider , parent ?: any ) {
463498 return this . traverseType < ResourceProvider > (
464499 this . traverseDescriptive ( this . traverseLinking ( agent ) ) ,
@@ -473,10 +508,11 @@ export class Traverse {
473508 if ( typeof returnValue === "undefined" && ! this . options . allowUndefinedReturn ) {
474509 return acc ;
475510 }
476- return returnValue ;
511+ return returnValue as T ;
477512 } , object ) ;
478513 }
479514
515+ traverseService ( service : Service , parent ?: Presentation3Resource ) : Service ;
480516 traverseService ( service : Service , parent ?: any ) : Service {
481517 const _service : any = Object . assign ( { } , service ) ;
482518 if ( _service && _service . service ) {
@@ -485,6 +521,10 @@ export class Traverse {
485521 return this . traverseType < Service > ( _service , { parent } , this . traversals . service ) ;
486522 }
487523
524+ traverseUnknown (
525+ resource : unknown ,
526+ options ?: { typeHint ?: string ; parent ?: Presentation3Resource }
527+ ) : Presentation3Resource ;
488528 traverseUnknown (
489529 resource : any ,
490530 { parent, typeHint } : { typeHint ?: string ; parent ?: any } = { }
0 commit comments