diff --git a/resources/js/helpers/validate.ts b/resources/js/helpers/validate.ts index 10b9208..db81508 100644 --- a/resources/js/helpers/validate.ts +++ b/resources/js/helpers/validate.ts @@ -166,6 +166,69 @@ export function Max( }; } +/** + * Validation Length + */ +interface ValidationLengthOptions { + length: number; + invalidMessage?: string | ((options: ValidationLengthOptions) => string); +} + +interface ValidationLengthObject extends ValidationLengthOptions { + validate: (value: string) => Promise; +} + +const defaultValidationLengthOptions: ValidationLengthOptions = { + length: 1, + invalidMessage: (options: ValidationLengthOptions) => { + return `Required to be less than ${options.length + 1} characters.`; + }, +}; + +export function Length( + lengthOrOptions: number | ValidationLengthOptions, + options?: ValidationLengthOptions +): ValidationLengthObject; +export function Length( + options: ValidationLengthOptions +): ValidationLengthObject; + +/** + * Validate field length + * + * @param lengthOrOptions string length or options data + * @param options options data + * @returns ValidationLengthObject + */ +export function Length( + lengthOrOptions: number | ValidationLengthOptions, + options?: ValidationLengthOptions +): ValidationLengthObject { + if (typeof lengthOrOptions === "number") { + options = { ...defaultValidationLengthOptions, ...(options || {}) }; + options.length = lengthOrOptions; + } else { + options = { + ...defaultValidationLengthOptions, + ...(lengthOrOptions || {}), + }; + } + + return { + ...options, + validate: function (value: string): Promise { + return Promise.resolve({ + valid: value.toString().length == this.length, + invalidMessages: [ + typeof this.invalidMessage === "string" + ? this.invalidMessage + : this.invalidMessage(this), + ], + }); + }, + }; +} + /** * PASSWORD */