diff --git a/lib/permissions/special-roles.js b/lib/permissions/special-roles.js --- a/lib/permissions/special-roles.js +++ b/lib/permissions/special-roles.js @@ -18,7 +18,7 @@ }); export type SpecialRole = $Values; -export const specialRoleValidator: TRefinement = tNumEnum( +export const specialRoleValidator: TRefinement = tNumEnum( values(specialRoles), ); diff --git a/lib/types/relationship-types.js b/lib/types/relationship-types.js --- a/lib/types/relationship-types.js +++ b/lib/types/relationship-types.js @@ -33,9 +33,8 @@ BOTH_BLOCKED: 6, }); export type UserRelationshipStatus = $Values; -export const userRelationshipStatusValidator: TRefinement = tNumEnum( - values(userRelationshipStatus), -); +export const userRelationshipStatusValidator: TRefinement = + tNumEnum(values(userRelationshipStatus)); const traditionalRelationshipActions = Object.freeze({ FRIEND: 'friend', diff --git a/lib/types/thread-types-enum.js b/lib/types/thread-types-enum.js --- a/lib/types/thread-types-enum.js +++ b/lib/types/thread-types-enum.js @@ -99,7 +99,7 @@ return threadType; } -export const thinThreadTypeValidator: TRefinement = tNumEnum( +export const thinThreadTypeValidator: TRefinement = tNumEnum( values(thinThreadTypes), ); @@ -113,7 +113,8 @@ ); return threadType; } -export const thickThreadTypeValidator: TRefinement = tNumEnum( + +export const thickThreadTypeValidator: TRefinement = tNumEnum( values(thickThreadTypes), ); @@ -153,6 +154,6 @@ return threadType; } -export const threadTypeValidator: TRefinement = tNumEnum( +export const threadTypeValidator: TRefinement = tNumEnum( values(threadTypes), ); diff --git a/lib/utils/validation-utils.js b/lib/utils/validation-utils.js --- a/lib/utils/validation-utils.js +++ b/lib/utils/validation-utils.js @@ -51,8 +51,12 @@ return t.refinement(t.String, val => regex.test(val)); } -function tNumEnum(nums: $ReadOnlyArray): TRefinement { - return t.refinement(t.Number, (input: number) => { +function tNumEnum(nums: $ReadOnlyArray): TRefinement { + const baseType: TIrreducible = t.irreducible( + 'number', + x => typeof x === 'number' && isFinite(x) && !isNaN(x), + ); + return t.refinement(baseType, (input: T) => { for (const num of nums) { if (input === num) { return true; @@ -61,6 +65,7 @@ return false; }); } + const tNull: TIrreducible = t.irreducible('null', x => x === null); const tDate: TRegex = tRegex(/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$/); const tColor: TRegex = tRegex(validHexColorRegex); // we don't include # char