@@ -164,6 +164,13 @@ type ContactQualifier = Readonly<{
164
164
* Valid formats are 'YYYY-MM-DDTHH:mm:ssZ', 'YYYY-MM-DDTHH:mm:ss.SSSZ', or <unix epoch>.
165
165
*/
166
166
export const byContactQualifier = ( data : unknown ) : ContactQualifier => {
167
+ // This will throw errors if any.
168
+ byContactQualifierNonAssertive ( data ) ;
169
+ return data as ContactQualifier ;
170
+ } ;
171
+
172
+ /** @internal */
173
+ export const byContactQualifierNonAssertive = ( data : unknown ) : Record < string , unknown > => {
167
174
if ( ! isRecord ( data ) ) {
168
175
throw new InvalidArgumentError ( 'Invalid "data": expected an object.' ) ;
169
176
}
@@ -174,7 +181,7 @@ export const byContactQualifier = (data: unknown): ContactQualifier => {
174
181
`Invalid reported_date. Expected format to be 'YYYY-MM-DDTHH:mm:ssZ', 'YYYY-MM-DDTHH:mm:ss.SSSZ', or a Unix epoch.`
175
182
) ;
176
183
}
177
- if ( ! isContactQualifier ( qualifier ) ) {
184
+ if ( ! checkContactQualifierFields ( qualifier ) ) {
178
185
throw new InvalidArgumentError ( `Missing or empty required fields [${ JSON . stringify ( data ) } ].` ) ;
179
186
}
180
187
return qualifier ;
@@ -297,48 +304,42 @@ type PersonQualifier = ContactQualifier & Readonly<{
297
304
* Valid formats are 'YYYY-MM-DDTHH:mm:ssZ', 'YYYY-MM-DDTHH:mm:ss.SSSZ', or <unix epoch>.
298
305
*/
299
306
export const byPersonQualifier = ( data : unknown ) : PersonQualifier => {
300
- if ( ! isRecord ( data ) ) {
301
- throw new InvalidArgumentError ( 'Invalid "data": expected an object.' ) ;
302
- }
303
- const qualifier = { ...data } ;
304
- if ( 'reported_date' in qualifier && ! isValidReportedDate ( qualifier . reported_date ) ) {
305
- throw new InvalidArgumentError (
306
- // eslint-disable-next-line max-len
307
- `Invalid reported_date. Expected format to be 'YYYY-MM-DDTHH:mm:ssZ', 'YYYY-MM-DDTHH:mm:ss.SSSZ', or a Unix epoch.`
308
- ) ;
309
- }
310
- if ( ! isContactQualifier ( qualifier ) || ! hasField ( data , { name : 'parent' , type : 'object' } ) ) {
311
- throw new InvalidArgumentError ( `Missing or empty required fields [${ JSON . stringify ( data ) } ].` ) ;
307
+ const qualifier = byContactQualifierNonAssertive ( data ) ;
308
+
309
+ if ( ! hasField ( qualifier , { name : 'parent' , type : 'object' } ) ) {
310
+ throw new InvalidArgumentError ( `Missing or empty required fields [${ JSON . stringify ( qualifier ) } ].` ) ;
312
311
}
313
- if ( ! isNormalizedParent ( data . parent ) ) {
314
- throw new InvalidArgumentError ( `Missing required fields in the parent hierarchy [${ JSON . stringify ( data ) } ].` ) ;
312
+
313
+ if ( ! isNormalizedParent ( qualifier . parent ) ) {
314
+ throw new InvalidArgumentError ( `Missing required fields in the parent hierarchy [${ JSON . stringify ( qualifier ) } ].` ) ;
315
315
}
316
316
317
- if ( data . type === 'contact' && ! hasField ( data , { name : 'contact_type' , type : 'string' } ) ) {
318
- throw new InvalidArgumentError ( `Missing or empty required fields [${ JSON . stringify ( data ) } ].` ) ;
319
- } else if ( ! ( data . type === 'person' ) ) {
317
+ if ( qualifier . type === 'contact' && ! hasField ( qualifier , { name : 'contact_type' , type : 'string' } ) ) {
318
+ throw new InvalidArgumentError ( `Missing or empty required fields [${ JSON . stringify ( qualifier ) } ].` ) ;
319
+ } else if ( ! ( qualifier . type === 'person' ) ) {
320
320
throw new InvalidArgumentError ( 'Expected `type` to be `person`.' ) ;
321
321
}
322
322
323
323
// Ensure parent lineage doesn't have any additional properties other than `_id` and `parent`.
324
- let parent = data . parent ;
324
+ let parent = qualifier . parent ;
325
325
while ( parent ) {
326
326
if ( Object . keys ( parent ) . length > 2 ) {
327
327
// This means that the parent certainly has extra fields and is not minfied/de-hydrated as per
328
328
// our liking as `isNormalized` check ensures that it does have two keys `_id` and `parent`.
329
- throw new InvalidArgumentError ( `Additional fields found in the parent lineage [${ JSON . stringify ( data ) } ].` ) ;
329
+ throw new InvalidArgumentError ( `Additional fields found in the parent lineage [${ JSON . stringify ( qualifier ) } ].` ) ;
330
330
}
331
- parent = data . parent ;
331
+ parent = qualifier . parent ;
332
332
}
333
333
334
- return qualifier as PersonQualifier ;
334
+ return qualifier as unknown as PersonQualifier ;
335
335
} ;
336
336
337
337
/** @internal */
338
338
export const isPersonQualifier = ( data : unknown ) : data is PersonQualifier => {
339
- if ( ! isRecord ( data ) ) {
339
+ if ( ! checkContactQualifierFields ( data ) ) {
340
340
return false ;
341
341
}
342
+
342
343
if ( ! hasField ( data , { name : 'parent' , type : 'object' } ) || ! isNormalizedParent ( data . parent ) ) {
343
344
return false ;
344
345
}
@@ -354,10 +355,6 @@ export const isPersonQualifier = (data: unknown): data is PersonQualifier => {
354
355
parent = data . parent ;
355
356
}
356
357
357
- if ( ! isContactQualifier ( data ) ) {
358
- return false ;
359
- }
360
-
361
358
if ( data . type === 'contact' && ! hasField ( data , { name : 'contact_type' , type : 'string' } ) ) {
362
359
return false ;
363
360
} else if ( ! ( data . type === 'person' ) ) {
0 commit comments