diff --git a/README.md b/README.md index 717cb25..6250bb2 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Validasaur is Deno validation library slightly inspired by Laravel Validation. - [`isIPv6`](#isipv6) - [`isNumber`](#isnumber) - [`isNumeric`](#isnumeric) + - [`isAlphaNumeric`](#isAlphaNumeric) - [`isString`](#isstring) - [`lengthBetween(minLength: number, maxLength: number)`](#lengthbetweenminlength-number-maxlength-number) - [`match(regex: RegExp, trim: boolean = false)`](#matchregex-regexp-trim-boolean--false) @@ -43,6 +44,7 @@ Validasaur is Deno validation library slightly inspired by Laravel Validation. - [`notIn(disallowedValues: PrimitiveTypes[])`](#notindisallowedvalues-primitivetypes) - [`notNull`](#notnull) - [`nullable`](#nullable) + - [`nullable`](#alphaNumareric) - [`numberBetween(minValue: number, maxValue: number)`](#numberbetweenminvalue-number-maxvalue-number) - [`requiredIf(field: string, fieldValue: any)`](#requirediffield-string-fieldvalue-any) - [`requiredUnless(field: string, fieldValue: any)`](#requiredunlessfield-string-fieldvalue-any) @@ -520,6 +522,13 @@ Same as `asNumber`, but it allows numeric string. * Invalid values: `"1.0abc"`, `"x.1"`, etc. * Valid values: `1`, `1.5`, `"2"`, `"2.5"`, etc. +#### `isAlphaNumeric` + +Value must contain alpha letters and numeric characters. + +* Invalid values: `"123"`, `"abc"`, "123&$"`, `"abc#@"`, etc. +* Valid values: `abc1123`, `123ABC`, `"abcDEF123"`, etc. + #### `isString` Value under this field must be a string. diff --git a/src/messages.ts b/src/messages.ts index 323cb23..e01ca2b 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -12,6 +12,7 @@ export const defaultMessages: ValidationMessages = { isNumber: ":attr must be a number", isNumeric: ":attr must be numeric", isString: ":attr must be a string", + isAlphaNumeric: ":attr must contain alpha letters and numeric characters", lengthBetween: ":attr characters length must be between :minLength-:maxLength", match: ":attr format is incorrect", diff --git a/src/rules.ts b/src/rules.ts index e52796f..c3ee908 100644 --- a/src/rules.ts +++ b/src/rules.ts @@ -17,6 +17,7 @@ export * from "./rules/is_numeric.ts"; export * from "./rules/is_date.ts"; export * from "./rules/is_email.ts"; export * from "./rules/is_string.ts"; +export * from "./rules/is_alpha_numeric"; export * from "./rules/length_between.ts"; export * from "./rules/max_length.ts"; export * from "./rules/max_number.ts"; diff --git a/src/rules/is_alpha_numeric.ts b/src/rules/is_alpha_numeric.ts new file mode 100644 index 0000000..4c985fb --- /dev/null +++ b/src/rules/is_alpha_numeric.ts @@ -0,0 +1,9 @@ +import type { Validity } from "../types.ts"; +import { invalid } from "../utils.ts"; + +export function isAlphaNumeric(value: any): Validity { + + if (typeof value === "string" && !(value as string).match(/^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$/)) { + return invalid("isAlphaNumeric", { value }); + } +} diff --git a/tests/rules/is_alpha_numeric.test.ts b/tests/rules/is_alpha_numeric.test.ts new file mode 100644 index 0000000..2728f95 --- /dev/null +++ b/tests/rules/is_alpha_numeric.test.ts @@ -0,0 +1,36 @@ +import { isAlphaNumeric } from "../../src/rules/is_alpha_numeric"; +import { invalid } from "../../src/utils.ts"; +import { assertInvalid, assertValid } from "../utils.ts"; + +Deno.test("rules.isAlphaNumeric('') should be invalid", () => { + assertInvalid(isAlphaNumeric(""), invalid("isAlphaNumeric", { value: "" })); +}); + +Deno.test("rules.isAlphaNumeric('123') should be invalid", () => { + assertInvalid(isAlphaNumeric('123'), invalid("isAlphaNumeric", { value: '123' })); +}); + +Deno.test("rules.isInt('abc') should be invalid", () => { + assertInvalid(isAlphaNumeric('abc'), invalid("isAlphaNumeric", { value: 'abc' })); +}); + +Deno.test("rules.isInt('abcDEF') should be invalid", () => { + assertInvalid(isAlphaNumeric('abcDEF'), invalid("isAlphaNumeric", { value: 'abcDEF' })); +}); + + +Deno.test("rules.isAlphaNumeric('abc123') should be valid", () => { + assertValid(isAlphaNumeric('abc123')); +}); + + +Deno.test("rules.isAlphaNumeric('123ABC') should be valid", () => { + assertValid(isAlphaNumeric('123ABC')); +}); + + +Deno.test("rules.isAlphaNumeric('abcDEF123') should be valid", () => { + assertValid(isAlphaNumeric('abcDEF123')); +}); + +