use-state-validate
Advanced tools
Comparing version 3.0.0-alpha.1 to 3.0.0-alpha.3
@@ -1,6 +0,8 @@ | ||
export interface IFieldValidationState<T> { | ||
import type { ReactNode } from "react"; | ||
declare type IFieldValidationCustomProps<T, P> = Pick<P, Exclude<keyof P, keyof IFieldValidationPropsBase<T>>>; | ||
interface IFieldValidationStateBase<T> { | ||
errors: string[]; | ||
cue: boolean; | ||
cueInvalid: boolean; | ||
dirty: boolean; | ||
changed: boolean; | ||
required: boolean; | ||
@@ -11,37 +13,37 @@ valid: boolean; | ||
} | ||
export interface IFieldValidation<T> extends IFieldValidationState<T> { | ||
interface IFieldValidationBase<T> extends IFieldValidationStateBase<T> { | ||
setCue: (cue: boolean) => void; | ||
setDirty: (dirty: boolean) => void; | ||
setValue: (newValue: T) => void; | ||
restore: () => void; | ||
} | ||
interface ILength { | ||
max?: number; | ||
min?: number; | ||
} | ||
interface IFieldValidationMessage { | ||
enum?: string; | ||
length?: string; | ||
required?: string; | ||
match?: string; | ||
match2?: string; | ||
match3?: string; | ||
fn?: string; | ||
fn2?: string; | ||
fn3?: string; | ||
} | ||
export interface IFieldValidationRule<T> { | ||
export declare type IFieldValidation<T, P = {}> = IFieldValidationCustomProps<T, P> & IFieldValidationBase<T>; | ||
export declare type RuleCallback<T> = (value: T) => boolean; | ||
interface IFieldValidationPropsBase<T> { | ||
label?: string; | ||
cueDelay?: number; | ||
enum?: string[]; | ||
length?: ILength; | ||
required?: boolean; | ||
match?: RegExp; | ||
match2?: RegExp; | ||
match3?: RegExp; | ||
fn?: (value: T) => boolean; | ||
fn2?: (value: T) => boolean; | ||
fn3?: (value: T) => boolean; | ||
message?: IFieldValidationMessage; | ||
requiredMessage?: string; | ||
rules?: [RuleCallback<T>, ReactNode?][]; | ||
} | ||
declare const useStateValidate: <T>(initial: T, rules: IFieldValidationRule<T>) => IFieldValidation<T>; | ||
export declare type IFieldValidationProps<T, P = {}> = P & IFieldValidationPropsBase<T>; | ||
declare const useStateValidate: <T, P extends IFieldValidationPropsBase<T> = {}>(initial: T, props: P) => IFieldValidation<T, P>; | ||
export interface IFieldBag<T, P = {}> { | ||
[key: string]: IFieldValidation<T, P>; | ||
} | ||
export declare const fieldBagIsValid: <T, P = {}>(fieldBag: IFieldBag<T, P>) => boolean; | ||
export declare const fieldBagReduceToValues: <T, P = {}>(fieldBag: IFieldBag<T, P>) => { | ||
[x: string]: T; | ||
}; | ||
export declare const fieldBagTraverse: <T, P = {}>(fieldBag: IFieldBag<T, P>, cb: (field: IFieldValidation<T, P>) => void) => void; | ||
export declare const ruleEmail: () => (value: string) => boolean; | ||
export declare const ruleEnum: (list: string[]) => (value: string) => boolean; | ||
export declare const ruleLength: ({ min, max }: { | ||
min?: number | undefined; | ||
max?: number | undefined; | ||
}) => (value: string) => boolean; | ||
export declare const ruleMatch: (pattern: RegExp) => (value: string) => boolean; | ||
export declare const rulePhone: () => (value: string) => boolean; | ||
export declare const ruleNumeric: () => (value: string) => boolean; | ||
export declare const ruleZip: () => (value: string) => boolean; | ||
export declare const defineProps: <T, P = {}>(rule: IFieldValidationProps<T, P>) => IFieldValidationProps<T, P>; | ||
export default useStateValidate; |
@@ -1,1 +0,1 @@ | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const react_1=require("react"),useStateValidate=(e,a)=>{const[t,r]=(0,react_1.useState)(deriveValidateWrapper(e,a)),i=(0,react_1.useRef)(t);let l=(0,react_1.useRef)();const n=()=>clearTimeout(l.current),u=e=>{n();var t=i.current["valid"];i.current=Object.assign(Object.assign({},i.current),{cue:e,cueInvalid:e&&!t}),r(i.current)};return(0,react_1.useEffect)(()=>n,[]),Object.assign(Object.assign({},t),{setCue:u,setDirty:e=>{r(Object.assign(Object.assign({},i.current),{dirty:e}))},setValue:e=>{n();let t=i.current["cue"];0===a.cueDelay?t=!0:a.cueDelay&&(t=!1,l.current=setTimeout(()=>{u(!0)},a.cueDelay));e=deriveValidateWrapper(e,a);i.current=Object.assign(Object.assign({},e),{cue:t,dirty:!0,cueInvalid:t&&!e.valid}),r(i.current)}})},deriveValidateWrapper=(e,t)=>{var a=validate(e,t);return{errors:a,cue:!1,valid:0===a.length,cueInvalid:!1,dirty:!1,required:!!t.required,label:t.label||"",value:e}},lengthErrorMessage=({min:e,max:t}={})=>e&&t?`between ${e}-`+t:e?"at least "+e:t?"at most "+t:"",validate=(i,l)=>Object.keys(l).map(e=>{var t=l[e],a=null==(a=null==l?void 0:l.message)?void 0:a[e],r=(null==l?void 0:l.label)||"Field";return"required"===e&&l.required&&!validateRequired(i)?a||r+" is required":"length"!==e||validateLength(i,t)?"enum"!==e||validateEnum(i,t)?/^match[23]*$/.test(e)&&!validateMatch(i,t)?a||r+" match pattern "+t:/^fn[23]*$/.test(e)&&!validateFn(i,t)?a||r+" does not pass function "+t:void 0:a||r+" must be either "+(null==(e=l.enum)?void 0:e.join(", ").replace(/\,(?=[^,]*$)/," or")):a||`${r} must be ${lengthErrorMessage(null==l?void 0:l.length)} characters`}).filter(Boolean),validateEnum=(e,t)=>-1<t.indexOf(e),validateFn=(e,t)=>t(e),validateLength=(e,t)=>(t.min||0)<=e.length&&e.length<=(t.max||Number.MIN_VALUE),validateMatch=(e,t)=>t.test(e),validateRequired=e=>0===e||!!e;exports.default=useStateValidate; | ||
var __rest=this&&this.__rest||function(e,r){var l={};for(u in e)Object.prototype.hasOwnProperty.call(e,u)&&r.indexOf(u)<0&&(l[u]=e[u]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var t=0,u=Object.getOwnPropertySymbols(e);t<u.length;t++)r.indexOf(u[t])<0&&Object.prototype.propertyIsEnumerable.call(e,u[t])&&(l[u[t]]=e[u[t]]);return l};import{useEffect,useRef,useState}from"react";const useStateValidate=(l,t)=>{const[e,r]=useState(deriveFieldObject(l,t)),u=useRef(e),a=useRef(!1);let i=useRef();const s=()=>clearTimeout(i.current),n=e=>{u.current=Object.assign(Object.assign({},u.current),e),r(u.current)},c=()=>n(deriveFieldObject(l,t)),d=e=>{s(),n({cue:e,cueInvalid:e&&!u.current.valid})};return useEffect(()=>(a.current&&c(),a.current=!0,s),[l]),Object.assign(Object.assign({},e),{restore:c,setCue:d,setValue:e=>{s();let r=u.current["cue"];0===t.cueDelay?r=!0:t.cueDelay&&(r=!1,i.current=setTimeout(()=>{d(!0)},t.cueDelay));e=deriveFieldObject(e,t);n(Object.assign(Object.assign({},e),{changed:l!==e.value,cue:r,cueInvalid:r&&!e.valid,dirty:!0}))}})},deriveFieldObject=(e,r)=>{var{label:l,required:t,requiredMessage:u,rules:a}=r,r=__rest(r,["label","cueDelay","required","requiredMessage","rules"]),u=validate(e,{label:l,required:t,requiredMessage:u,rules:a});return Object.assign({errors:u,cue:!1,valid:0===u.length,cueInvalid:!1,changed:!1,required:!!t,label:l||"",value:e},r)},validate=(l,t)=>{var e;return[[e=>!t.required||0===e||!!e,null!=(e=t.requiredMessage)?e:`${null!=(e=t.label)?e:"Field"} is required`],...null!=(e=t.rules)?e:[]].map(([e,r])=>{return!e(l)&&(null!=r?r:`${null!=(e=t.label)?e:"Field"} is invalid`)}).filter(Boolean)},fieldBagIsValid=e=>Object.values(e).every(({valid:e})=>e),fieldBagReduceToValues=e=>Object.entries(e).reduce((e,[r,l])=>(e[r]=l.value,e),{}),fieldBagTraverse=(e,r)=>Object.values(e).forEach(r),ruleEmail=()=>e=>/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(e),ruleEnum=r=>e=>-1<r.indexOf(e),ruleLength=({min:r,max:l})=>e=>(r||0)<=e.length&&e.length<=(l||Number.MIN_VALUE),ruleMatch=r=>e=>r.test(e),rulePhone=()=>ruleMatch(/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/),ruleNumeric=()=>e=>!isNaN(e),ruleZip=()=>ruleMatch(/^[0-9]{5}(?:-[0-9]{4})?$/),defineProps=e=>e;export default useStateValidate;export{fieldBagIsValid,fieldBagReduceToValues,fieldBagTraverse,ruleEmail,ruleEnum,ruleLength,ruleMatch,rulePhone,ruleNumeric,ruleZip,defineProps}; |
{ | ||
"name": "use-state-validate", | ||
"version": "3.0.0-alpha.1", | ||
"version": "3.0.0-alpha.3", | ||
"description": "Clean featherweight state validation", | ||
@@ -5,0 +5,0 @@ "sideEffects": false, |
Unpublished package
Supply chain riskPackage version was not found on the registry. It may exist on a different registry and need to be configured to pull from that registry.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
13892
48
1
1