Skip to content

Commit

Permalink
refactor(lib)!: refactored validator stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
YannicEl committed Aug 12, 2023
1 parent df20082 commit dbba958
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 91 deletions.
8 changes: 8 additions & 0 deletions packages/docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@

<<< @/node_modules/@vuetils/form/dist/plugins/index.d.ts

## Validator

<<< ../lib/src/validators/utils.ts#Validator

## AsyncValidator

<<< ../lib/src/validators/utils.ts#AsyncValidator

## More

Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata).
91 changes: 0 additions & 91 deletions packages/lib/src/validators.ts

This file was deleted.

2 changes: 2 additions & 0 deletions packages/lib/src/validators/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './utils';
export * from './validators';
43 changes: 43 additions & 0 deletions packages/lib/src/validators/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// #region Validator
export type Validator = {
name: string;
validate: (value: unknown) => boolean;
};
// #endregion Validator

// #region AsyncValidator
export type AsyncValidator = {
name: string;
validate: (value: unknown) => Promise<boolean>;
};
// #endregion AsyncValidator

export function defineValidator<TReturn extends boolean | Promise<boolean>>(
name: string,
validate: (value: unknown) => TReturn
): TReturn extends boolean ? Validator : AsyncValidator {
return {
name,
validate,
} as any;
}

export function defineValidatorWithArgs<Targs, TReturn extends boolean | Promise<boolean>>(
name: string,
validate: (value: unknown, args: Targs) => TReturn
): TReturn extends boolean ? (args: Targs) => Validator : (args: Targs) => AsyncValidator {
return (args: Targs) => {
return {
name,
validate: (value: unknown) => validate(value, args),
} as any;
};
}

export function isString(value: unknown): value is string {
return typeof value === 'string';
}

export function isNumber(value: unknown): value is number {
return typeof value === 'number';
}
45 changes: 45 additions & 0 deletions packages/lib/src/validators/validators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { defineValidator, defineValidatorWithArgs, isNumber, isString } from './utils';

export const required = defineValidator('required', (value) => !!value);

export const maxLength = defineValidatorWithArgs(
'maxLength',
(value, maxLength: number) => isString(value) && value?.length <= maxLength
);

export const minLength = defineValidatorWithArgs(
'minLength',
(value, minLength: number) => isString(value) && value?.length >= minLength
);

export const min = defineValidatorWithArgs(
'min',
(value, min: number) => isNumber(value) && value >= min
);

export const max = defineValidatorWithArgs(
'max',
(value, max: number) => isNumber(value) && value <= max
);

export const startsWith = defineValidatorWithArgs(
'startsWith',
(value, startsWith: string) =>
isString(value) && value.toLocaleLowerCase().startsWith(startsWith.toLocaleLowerCase())
);

export const regex = defineValidatorWithArgs(
'regex',
(value, regex: RegExp) => isString(value) && regex.test(value)
);

// https://github.com/colinhacks/zod
const emailRegex =
/^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@((?!-)([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{1,})[^-<>()[\].,;:\s@"]$/i;

export const email = defineValidator('email', (value) => regex(emailRegex).validate(value));

// https://github.com/colinhacks/zod
const emojiRegex = /^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u;

export const emoji = defineValidator('emoji', (value) => regex(emojiRegex).validate(value));

0 comments on commit dbba958

Please sign in to comment.