@@ -331,7 +331,8 @@ export const isPersonQualifier = (data: unknown): data is PersonQualifier => {
331
331
if ( ! checkContactQualifierFields ( data ) ) {
332
332
return false ;
333
333
}
334
-
334
+
335
+ // `parent` must be present for person, so cannot use `hasInvalidContactLineageForField`
335
336
if ( ! hasField ( data , { name : 'parent' , type : 'object' } ) || ! isNormalizedParent ( data . parent ) ) {
336
337
return false ;
337
338
}
@@ -430,23 +431,44 @@ const checkFieldLineageAndThrowError = (data: Record<string, unknown>, field?:st
430
431
}
431
432
} ;
432
433
434
+ /** @internal */
435
+ const hasInvalidContactLineageForField = ( data : Record < string , unknown > , field ?:string ) => {
436
+ let hierarchyRoot = data ;
437
+ let normalized_parent = data . parent ;
438
+
439
+ if ( field && hasField ( data , { name : field , type : 'object' } ) ) {
440
+ hierarchyRoot = data [ field ] as unknown as Record < string , unknown > ;
441
+ normalized_parent = data [ field ] ;
442
+ }
443
+
444
+ // `parent` is optional, so this lineage is valid
445
+ if ( ! hasField ( hierarchyRoot , { type : 'object' , name : 'parent' } ) ) {
446
+ return false ;
447
+ }
448
+
449
+ if ( ! isNormalizedParent ( normalized_parent ) ) {
450
+ // eslint-disable-next-line max-len
451
+ return true ;
452
+ }
453
+ if ( hasBloatedLineage ( hierarchyRoot ) ) {
454
+ // eslint-disable-next-line max-len
455
+ return true ;
456
+ }
457
+ } ;
458
+
433
459
434
460
/** @internal */
435
461
export const isPlaceQualifier = ( data :unknown ) : data is PlaceQualifier => {
436
462
if ( ! checkContactQualifierFields ( data ) ) {
437
463
return false ;
438
464
}
439
465
440
- if ( hasField ( data , { name : 'parent' , type : 'object' } ) ) {
441
- if ( ! isNormalizedParent ( data . parent ) || hasBloatedLineage ( data ) ) {
442
- return false ;
443
- }
466
+ if ( hasInvalidContactLineageForField ( data ) ) {
467
+ return false ;
444
468
}
445
469
446
- if ( hasField ( data , { name : 'contact' , type : 'object' } ) ) {
447
- if ( ! isNormalizedParent ( data . contact ) || hasBloatedLineage ( data . contact ) ) {
448
- return false ;
449
- }
470
+ if ( hasInvalidContactLineageForField ( data , 'contact' ) ) {
471
+ return false ;
450
472
}
451
473
452
474
return hasValidContactType ( data ) || hasValidLegacyContactType ( data , 'place' ) ;
0 commit comments