@@ -317,18 +317,19 @@ export const byPersonQualifier = (data: unknown): PersonQualifier => {
317
317
throw new InvalidArgumentError ( `Missing or empty required fields [${ JSON . stringify ( qualifier ) } ].` ) ;
318
318
}
319
319
320
+ // cannot use checkFieldLineageAndThrowError as parent is required in `person`
320
321
if ( ! isNormalizedParent ( qualifier . parent ) ) {
321
322
throw new InvalidArgumentError ( `Missing required fields in the parent hierarchy [${ JSON . stringify ( qualifier ) } ].` ) ;
322
323
}
323
324
324
- if ( ! hasValidContactType ( qualifier ) && ! hasValidLegacyContactType ( qualifier , 'person' ) ) {
325
- throw new InvalidArgumentError ( 'Invalid type for contacts.' ) ;
326
- }
327
-
328
325
if ( hasBloatedLineage ( qualifier ) ) {
329
326
throw new InvalidArgumentError ( `Additional fields found in the parent lineage [${ JSON . stringify ( qualifier ) } ].` ) ;
330
327
}
331
328
329
+ if ( ! hasValidContactType ( qualifier ) && ! hasValidLegacyContactType ( qualifier , 'person' ) ) {
330
+ throw new InvalidArgumentError ( 'Invalid type for contacts.' ) ;
331
+ }
332
+
332
333
return qualifier as unknown as PersonQualifier ;
333
334
} ;
334
335
@@ -402,24 +403,8 @@ export type PlaceQualifier = ContactQualifier & Readonly<{
402
403
*/
403
404
export const byPlaceQualifier = ( data :unknown ) : PlaceQualifier => {
404
405
const qualifier = byContactQualifierNonAssertive ( data ) ;
405
- if ( 'parent' in qualifier ) {
406
- if ( ! isNormalizedParent ( qualifier . parent ) ) {
407
- throw new InvalidArgumentError ( `Missing required fields in the parent hierarchy [${ JSON . stringify ( qualifier ) } ].` ) ;
408
- }
409
- if ( hasBloatedLineage ( qualifier ) ) {
410
- throw new InvalidArgumentError ( `Additional fields found in the parent lineage [${ JSON . stringify ( qualifier ) } ].` ) ;
411
- }
412
- }
413
-
414
- if ( hasField ( qualifier , { name : 'contact' , type : 'object' } ) ) {
415
- if ( ! isNormalizedParent ( qualifier . contact ) ) {
416
- // eslint-disable-next-line max-len
417
- throw new InvalidArgumentError ( `Missing required fields in the contact hierarchy [${ JSON . stringify ( qualifier ) } ].` ) ;
418
- }
419
- if ( hasBloatedLineage ( qualifier . contact ) ) {
420
- throw new InvalidArgumentError ( `Additional fields found in the contact lineage [${ JSON . stringify ( qualifier ) } ].` ) ;
421
- }
422
- }
406
+ checkFieldLineageAndThrowError ( qualifier ) ;
407
+ checkFieldLineageAndThrowError ( qualifier , 'contact' ) ;
423
408
424
409
if ( ! hasValidContactType ( qualifier ) && ! hasValidLegacyContactType ( qualifier , 'place' ) ) {
425
410
throw new InvalidArgumentError ( 'Invalid type for contacts.' ) ;
@@ -428,6 +413,31 @@ export const byPlaceQualifier = (data:unknown): PlaceQualifier => {
428
413
return qualifier as PlaceQualifier ;
429
414
} ;
430
415
416
+ /** @internal */
417
+ const checkFieldLineageAndThrowError = ( data : Record < string , unknown > , field ?:string ) => {
418
+ let hierarchyRoot = data ;
419
+ let normalized_parent = data . parent ;
420
+
421
+ if ( field && hasField ( data , { name : field , type : 'object' } ) ) {
422
+ hierarchyRoot = data [ field ] as unknown as Record < string , unknown > ;
423
+ normalized_parent = data [ field ] ;
424
+ }
425
+
426
+ if ( ! hasField ( hierarchyRoot , { type : 'object' , name : 'parent' } ) ) {
427
+ return ;
428
+ }
429
+
430
+ if ( ! isNormalizedParent ( normalized_parent ) ) {
431
+ // eslint-disable-next-line max-len
432
+ throw new InvalidArgumentError ( `Missing required fields in the ${ field ?? 'parent' } hierarchy [${ JSON . stringify ( data ) } ].` ) ;
433
+ }
434
+ if ( hasBloatedLineage ( hierarchyRoot ) ) {
435
+ // eslint-disable-next-line max-len
436
+ throw new InvalidArgumentError ( `Additional fields found in the ${ field ?? 'parent' } lineage [${ JSON . stringify ( data ) } ].` ) ;
437
+ }
438
+ } ;
439
+
440
+
431
441
/** @internal */
432
442
export const isPlaceQualifier = ( data :unknown ) : data is PlaceQualifier => {
433
443
if ( ! checkContactQualifierFields ( data ) ) {
0 commit comments