validatable
Version:
A library for synchronous and asynchronous input validation.
38 lines (32 loc) • 1.13 kB
text/typescript
import { isString } from 'typeable';
const V1_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const V2_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[2][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const V3_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[3][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const V5_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
export interface StringUUIDOptions {
version?: number;
}
export function stringUUID (value: any, recipe: StringUUIDOptions = {}): boolean {
if (!isString(value)) return false;
let { version } = recipe;
switch (version) {
case 1:
return V1_REGEX.test(value);
case 2:
return V2_REGEX.test(value);
case 3:
return V3_REGEX.test(value);
case 4:
return V4_REGEX.test(value);
case 5:
return V5_REGEX.test(value);
}
return (
V1_REGEX.test(value)
|| V2_REGEX.test(value)
|| V3_REGEX.test(value)
|| V4_REGEX.test(value)
|| V5_REGEX.test(value)
);
};