New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

use-state-validate

Package Overview
Dependencies
Maintainers
1
Versions
59
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

use-state-validate - npm Package Compare versions

Comparing version 3.0.0-alpha.1 to 3.0.0-alpha.3

62

lib/index.d.ts

@@ -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,

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc