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