{"_id":"@a-2-c-2-anpm/distinctio-laudantium-officiis","name":"@a-2-c-2-anpm/distinctio-laudantium-officiis","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@a-2-c-2-anpm/distinctio-laudantium-officiis","version":"1.0.0","description":"<div align=\"center\">     <p align=\"center\">         <a href=\"https://react-hook-form.com\" title=\"React Hook Form - Simple React forms validation\">             <img src=\"https://raw.githubusercontent.com/bluebill1049/react-hook-form/master/docs/logo.png\" a","main":"index.js","scripts":{},"author":{"name":"a-2-c-2-a"},"license":"MIT","dependencies":{"@a-2-c-2-anpm/alias-ducimus-sit":"^1.0.0","@a-2-c-2-anpm/atque-nemo-accusantium":"^1.0.0","@a-2-c-2-anpm/distinctio-quibusdam-culpa":"^1.0.0","@a-2-c-2-anpm/eligendi-praesentium-hic":"^1.0.0","@a-2-c-2-anpm/enim-amet-voluptatem":"^1.0.0","@a-2-c-2-anpm/error-dolorem-a":"^1.0.0","@a-2-c-2-anpm/excepturi-natus-facere":"^1.0.0","@a-2-c-2-anpm/expedita-recusandae-aut":"^1.0.0","@a-2-c-2-anpm/fugit-impedit-quae":"^1.0.0","@a-2-c-2-anpm/hic-maiores-accusantium":"^1.0.0","@a-2-c-2-anpm/laborum-exercitationem-quis":"^1.0.0","@a-2-c-2-anpm/laudantium-dolor-perspiciatis":"^1.0.0","@a-2-c-2-anpm/maiores-quis-dignissimos":"^1.0.0","@a-2-c-2-anpm/nam-eaque-occaecati":"^1.0.0","@a-2-c-2-anpm/neque-culpa-culpa":"^1.0.0","@a-2-c-2-anpm/neque-iste-eum":"^1.0.0","@a-2-c-2-anpm/nobis-similique-magni":"^1.0.0","@a-2-c-2-anpm/officia-tempore-ipsa":"^1.0.0","@a-2-c-2-anpm/perferendis-qui-suscipit":"^1.0.0","@a-2-c-2-anpm/placeat-suscipit-cumque":"^1.0.0","@a-2-c-2-anpm/quo-quia-expedita":"^1.0.0","@a-2-c-2-anpm/quos-voluptates-excepturi":"^1.0.0","@a-2-c-2-anpm/saepe-praesentium-iusto":"^1.0.0","@a-2-c-2-anpm/sint-ipsa-atque":"^1.0.0","@a-2-c-2-anpm/vitae-ad-molestiae":"^1.0.0","@ajhgwdjnpm/quas-mollitia-aspernatur-reprehenderit":"^1.0.0","calculator-3rd":"^1.0.12","mi-dex-func-3":"^1.0.0","vnhat-button-component":"^1.0.0","vnhat-forminput-component":"^1.0.1"},"keywords":["folder","routing","estree","weakset","ratelimit","robust","contains","ES2023","validation","data","postcss-plugin","batch","CSS","string","ECMAScript 2020","Int16Array","move","String.prototype.trim","includes","setPrototypeOf","value","parser","functions","compiler","last","characters","trimLeft","define","espree","asserts","compare","east-asian-width","ajv","redux","typeof","workspace:*","mkdirs","make dir","Array","iterator","internal","debug","Observable","spec","setter","mkdirp","WeakSet","monorepo","queueMicrotask","take","stringifier","Object.defineProperty","weakmap","$.extend","optimist","promise","Object.keys","serializer","jsx","rfc4122","call-bind","CSSStyleDeclaration","ECMAScript 2017","telephone","has-own","watcher","install","offset","native","immutable","wordwrap","ECMAScript 2018","findLastIndex","functional","Array.prototype.findLast","visual","http","pretty","Set","fetch","metadata","trimStart","css less","higher-order","keys","spinner","pipe","path","async","art","style","cors","regular expression","invariant","linewrap","check","side","byteLength","flag","getOwnPropertyDescriptor","valid","ascii","filter","quote","bundler","channel","querystring","ie","cache","styles","prototype","swf","getintrinsic","positive","reducer","date","link","superstruct","readablestream","reduce","TypedArray","util","RxJS","readable","mime","package manager","watchFile","elb","ECMAScript 5","ebs","lesscss","properties","coercible","arraybuffer","react","hash","ECMAScript 2016","cloudtrail","datastructure","dom-testing-library","Object.values","parents","state","shim","ECMAScript 7","workflow","Object.getPrototypeOf","fast-clone","autoprefixer","es-shims","variables","tdd","description","cloudwatch","accessor","syntaxerror","enumerable","types","amazon","eslint","BigUint64Array","slot","dynamodb","__proto__","utilities","apollo","ES2021","ts","AsyncIterator","polyfill","length","StyleSheet","performant","query","directory","call","listeners","rate","String.prototype.matchAll","read","Uint32Array","streams","search","RegExp#flags","elm","phone","mapreduce","eslintconfig","jasmine","indicator","term","web","flatMap","file","rm -rf","env","tostringtag","picomatch","bootstrap css","ECMAScript 6","browserlist","which","spinners","chai","performance","random","dir","predictable","stream","key","dependencies","remove","l10n","extra","japanese","omit","throat","cloudfront","toobject","hardlinks","ec2","create","negative zero","negative","ES7","symbol","uninstall","Array.prototype.flat","callbound","findLast","Float64Array","ajax","ECMAScript 2023","censor","progress","ES2018","error","Array.prototype.includes","lazy","jsonpath","ES2016","flatten","streams2","mime-db","cloudformation","classes","config","wordbreak","deep-clone","in","tc39","fast-copy","nope","full-width","variables in css","es2015","typedarray","open","Push","xterm","look","mobile","option","sameValueZero","dayjs","configurable","ArrayBuffer","is","Symbol.toStringTag","text","yup","bind","hookform","fast","Object.entries","debugger","ES2020","guid","fastclone","node","vest","vpc","whatwg","json","route","logger","url","logging","mru","glob","aws","tester","speed","cloudsearch","classname","tap","rds","ES2019","Iterator","simpledb","testing","importexport","symlinks","classnames","writable","id","ava","dataview","console","collection","function","extend","symlink","proxy","hasOwn","scheme-validation","rgb","Stream","ESnext","fastify","validate","css nesting","wrap","route53","ES2022","location","deep-copy","terminal","shebang","width","touch","module","eslintplugin","Float32Array","up","https","Microsoft","ses","hooks","environment","packages","recursive","bundling","ecmascript","set","typesafe","ES5","i18n","URL","chromium","yaml","ES2015","fast-deep-copy","buffers","react-hooks","live"],"repository":{"type":"git","url":"git+https://github.com/a-2-c-2-anpm/distinctio-laudantium-officiis.git"},"homepage":"https://github.com/a-2-c-2-anpm/distinctio-laudantium-officiis/#readme","bugs":{"url":"https://github.com/a-2-c-2-anpm/distinctio-laudantium-officiis/issues"},"_id":"@a-2-c-2-anpm/distinctio-laudantium-officiis@1.0.0","gitHead":"133dee572a5df226decd39866d5af0a45bf90392","_nodeVersion":"20.12.2","_npmVersion":"10.5.0","dist":{"integrity":"sha512-cBF5ARDeiziJkPqREq9KR8ciLBbNcJ4H6R0GBCiwqGFjwz+Bx7mebZFWDJMxi1BJgVrY7UxxOfmaZWY3F8xsUQ==","shasum":"12c523e17f95d86027001eceec610c7b554f29aa","tarball":"https://registry.npmjs.org/@a-2-c-2-anpm/distinctio-laudantium-officiis/-/distinctio-laudantium-officiis-1.0.0.tgz","fileCount":8,"unpackedSize":28864,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC3mmJABsRrymZ3qUVlBSG/KT0olIP57AQyU5Cv2kMxqAIhAPH5SgHFADa30WrzaWt/ECKdhEUE3MwVQmh2emXVcNn/"}]},"_npmUser":{"name":"tranduc345zz","email":"tranduc345zz@gmail.com"},"directories":{},"maintainers":[{"name":"tranduc345zz","email":"tranduc345zz@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/distinctio-laudantium-officiis_1.0.0_1714843402207_0.181101071592076"},"_hasShrinkwrap":false}},"time":{"created":"2024-05-04T17:23:22.104Z","1.0.0":"2024-05-04T17:23:22.334Z","modified":"2024-05-04T17:23:22.622Z"},"maintainers":[{"name":"tranduc345zz","email":"tranduc345zz@gmail.com"}],"description":"<div align=\"center\">     <p align=\"center\">         <a href=\"https://react-hook-form.com\" title=\"React Hook Form - Simple React forms validation\">             <img src=\"https://raw.githubusercontent.com/bluebill1049/react-hook-form/master/docs/logo.png\" a","homepage":"https://github.com/a-2-c-2-anpm/distinctio-laudantium-officiis/#readme","keywords":["folder","routing","estree","weakset","ratelimit","robust","contains","ES2023","validation","data","postcss-plugin","batch","CSS","string","ECMAScript 2020","Int16Array","move","String.prototype.trim","includes","setPrototypeOf","value","parser","functions","compiler","last","characters","trimLeft","define","espree","asserts","compare","east-asian-width","ajv","redux","typeof","workspace:*","mkdirs","make dir","Array","iterator","internal","debug","Observable","spec","setter","mkdirp","WeakSet","monorepo","queueMicrotask","take","stringifier","Object.defineProperty","weakmap","$.extend","optimist","promise","Object.keys","serializer","jsx","rfc4122","call-bind","CSSStyleDeclaration","ECMAScript 2017","telephone","has-own","watcher","install","offset","native","immutable","wordwrap","ECMAScript 2018","findLastIndex","functional","Array.prototype.findLast","visual","http","pretty","Set","fetch","metadata","trimStart","css less","higher-order","keys","spinner","pipe","path","async","art","style","cors","regular expression","invariant","linewrap","check","side","byteLength","flag","getOwnPropertyDescriptor","valid","ascii","filter","quote","bundler","channel","querystring","ie","cache","styles","prototype","swf","getintrinsic","positive","reducer","date","link","superstruct","readablestream","reduce","TypedArray","util","RxJS","readable","mime","package manager","watchFile","elb","ECMAScript 5","ebs","lesscss","properties","coercible","arraybuffer","react","hash","ECMAScript 2016","cloudtrail","datastructure","dom-testing-library","Object.values","parents","state","shim","ECMAScript 7","workflow","Object.getPrototypeOf","fast-clone","autoprefixer","es-shims","variables","tdd","description","cloudwatch","accessor","syntaxerror","enumerable","types","amazon","eslint","BigUint64Array","slot","dynamodb","__proto__","utilities","apollo","ES2021","ts","AsyncIterator","polyfill","length","StyleSheet","performant","query","directory","call","listeners","rate","String.prototype.matchAll","read","Uint32Array","streams","search","RegExp#flags","elm","phone","mapreduce","eslintconfig","jasmine","indicator","term","web","flatMap","file","rm -rf","env","tostringtag","picomatch","bootstrap css","ECMAScript 6","browserlist","which","spinners","chai","performance","random","dir","predictable","stream","key","dependencies","remove","l10n","extra","japanese","omit","throat","cloudfront","toobject","hardlinks","ec2","create","negative zero","negative","ES7","symbol","uninstall","Array.prototype.flat","callbound","findLast","Float64Array","ajax","ECMAScript 2023","censor","progress","ES2018","error","Array.prototype.includes","lazy","jsonpath","ES2016","flatten","streams2","mime-db","cloudformation","classes","config","wordbreak","deep-clone","in","tc39","fast-copy","nope","full-width","variables in css","es2015","typedarray","open","Push","xterm","look","mobile","option","sameValueZero","dayjs","configurable","ArrayBuffer","is","Symbol.toStringTag","text","yup","bind","hookform","fast","Object.entries","debugger","ES2020","guid","fastclone","node","vest","vpc","whatwg","json","route","logger","url","logging","mru","glob","aws","tester","speed","cloudsearch","classname","tap","rds","ES2019","Iterator","simpledb","testing","importexport","symlinks","classnames","writable","id","ava","dataview","console","collection","function","extend","symlink","proxy","hasOwn","scheme-validation","rgb","Stream","ESnext","fastify","validate","css nesting","wrap","route53","ES2022","location","deep-copy","terminal","shebang","width","touch","module","eslintplugin","Float32Array","up","https","Microsoft","ses","hooks","environment","packages","recursive","bundling","ecmascript","set","typesafe","ES5","i18n","URL","chromium","yaml","ES2015","fast-deep-copy","buffers","react-hooks","live"],"repository":{"type":"git","url":"git+https://github.com/a-2-c-2-anpm/distinctio-laudantium-officiis.git"},"author":{"name":"a-2-c-2-a"},"bugs":{"url":"https://github.com/a-2-c-2-anpm/distinctio-laudantium-officiis/issues"},"license":"MIT","readme":"<div align=\"center\">\n    <p align=\"center\">\n        <a href=\"https://react-hook-form.com\" title=\"React Hook Form - Simple React forms validation\">\n            <img src=\"https://raw.githubusercontent.com/bluebill1049/react-hook-form/master/docs/logo.png\" alt=\"React Hook Form Logo - React hook custom hook for form validation\" />\n        </a>\n    </p>\n</div>\n\n<p align=\"center\">Performant, flexible and extensible forms with easy to use validation.</p>\n\n<div align=\"center\">\n\n[![npm downloads](https://img.shields.io/npm/dm/@hookform/resolvers.svg?style=for-the-badge)](https://www.npmjs.com/package/@hookform/resolvers)\n[![npm](https://img.shields.io/npm/dt/@hookform/resolvers.svg?style=for-the-badge)](https://www.npmjs.com/package/@hookform/resolvers)\n[![npm](https://img.shields.io/bundlephobia/minzip/@hookform/resolvers?style=for-the-badge)](https://bundlephobia.com/result?p=@hookform/resolvers)\n\n</div>\n\n## Install\n\n    npm install @hookform/resolvers\n\n## Links\n\n- [React-hook-form validation resolver documentation ](https://react-hook-form.com/api/useform/#resolver)\n\n### Supported resolvers\n\n- [Install](#install)\n- [Links](#links)\n  - [Supported resolvers](#supported-resolvers)\n- [API](#api)\n- [Quickstart](#quickstart)\n  - [Yup](#yup)\n  - [Zod](#zod)\n  - [Superstruct](#superstruct)\n  - [Joi](#joi)\n  - [Vest](#vest)\n  - [Class Validator](#class-validator)\n  - [io-ts](#io-ts)\n  - [Nope](#nope)\n  - [computed-types](#computed-types)\n  - [typanion](#typanion)\n  - [Ajv](#ajv)\n  - [TypeBox](#typebox)\n  - [ArkType](#arktype)\n  - [Valibot](#valibot)\n- [Backers](#backers)\n  - [Sponsors](#sponsors)\n- [Contributors](#contributors)\n\n## API\n\n```\ntype Options = {\n  mode: 'async' | 'sync',\n  raw?: boolean\n}\n\nresolver(schema: object, schemaOptions?: object, resolverOptions: Options)\n```\n\n|                 | type     | Required | Description                                   |\n| --------------- | -------- | -------- | --------------------------------------------- |\n| schema          | `object` | ✓        | validation schema                             |\n| schemaOptions   | `object` |          | validation library schema options             |\n| resolverOptions | `object` |          | resolver options, `async` is the default mode |\n\n## Quickstart\n\n### [Yup](https://github.com/jquense/yup)\n\nDead simple Object schema validation.\n\n[![npm](https://img.shields.io/bundlephobia/minzip/yup?style=for-the-badge)](https://bundlephobia.com/result?p=yup)\n\n```typescript jsx\nimport { useForm } from 'react-hook-form';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport * as yup from 'yup';\n\nconst schema = yup\n  .object()\n  .shape({\n    name: yup.string().required(),\n    age: yup.number().required(),\n  })\n  .required();\n\nconst App = () => {\n  const { register, handleSubmit } = useForm({\n    resolver: yupResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('name')} />\n      <input type=\"number\" {...register('age')} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [Zod](https://github.com/vriad/zod)\n\nTypeScript-first schema validation with static type inference\n\n[![npm](https://img.shields.io/bundlephobia/minzip/zod?style=for-the-badge)](https://bundlephobia.com/result?p=zod)\n\n> ⚠️ Example below uses the `valueAsNumber`, which requires `react-hook-form` v6.12.0 (released Nov 28, 2020) or later.\n\n```tsx\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as z from 'zod';\n\nconst schema = z.object({\n  name: z.string().min(1, { message: 'Required' }),\n  age: z.number().min(10),\n});\n\nconst App = () => {\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm({\n    resolver: zodResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('name')} />\n      {errors.name?.message && <p>{errors.name?.message}</p>}\n      <input type=\"number\" {...register('age', { valueAsNumber: true })} />\n      {errors.age?.message && <p>{errors.age?.message}</p>}\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [Superstruct](https://github.com/ianstormtaylor/superstruct)\n\nA simple and composable way to validate data in JavaScript (or TypeScript).\n\n[![npm](https://img.shields.io/bundlephobia/minzip/superstruct?style=for-the-badge)](https://bundlephobia.com/result?p=superstruct)\n\n```typescript jsx\nimport { useForm } from 'react-hook-form';\nimport { superstructResolver } from '@hookform/resolvers/superstruct';\nimport { object, string, number } from 'superstruct';\n\nconst schema = object({\n  name: string(),\n  age: number(),\n});\n\nconst App = () => {\n  const { register, handleSubmit } = useForm({\n    resolver: superstructResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('name')} />\n      <input type=\"number\" {...register('age', { valueAsNumber: true })} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [Joi](https://github.com/sideway/joi)\n\nThe most powerful data validation library for JS.\n\n[![npm](https://img.shields.io/bundlephobia/minzip/joi?style=for-the-badge)](https://bundlephobia.com/result?p=joi)\n\n```typescript jsx\nimport { useForm } from 'react-hook-form';\nimport { joiResolver } from '@hookform/resolvers/joi';\nimport Joi from 'joi';\n\nconst schema = Joi.object({\n  name: Joi.string().required(),\n  age: Joi.number().required(),\n});\n\nconst App = () => {\n  const { register, handleSubmit } = useForm({\n    resolver: joiResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('name')} />\n      <input type=\"number\" {...register('age')} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [Vest](https://github.com/ealush/vest)\n\nVest 🦺 Declarative Validation Testing.\n\n[![npm](https://img.shields.io/bundlephobia/minzip/vest?style=for-the-badge)](https://bundlephobia.com/result?p=vest)\n\n```typescript jsx\nimport { useForm } from 'react-hook-form';\nimport { vestResolver } from '@hookform/resolvers/vest';\nimport { create, test, enforce } from 'vest';\n\nconst validationSuite = create((data = {}) => {\n  test('username', 'Username is required', () => {\n    enforce(data.username).isNotEmpty();\n  });\n\n  test('password', 'Password is required', () => {\n    enforce(data.password).isNotEmpty();\n  });\n});\n\nconst App = () => {\n  const { register, handleSubmit, errors } = useForm({\n    resolver: vestResolver(validationSuite),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((data) => console.log(data))}>\n      <input {...register('username')} />\n      <input type=\"password\" {...register('password')} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [Class Validator](https://github.com/typestack/class-validator)\n\nDecorator-based property validation for classes.\n\n[![npm](https://img.shields.io/bundlephobia/minzip/class-validator?style=for-the-badge)](https://bundlephobia.com/result?p=class-validator)\n\n> ⚠️ Remember to add these options to your `tsconfig.json`!\n\n```\n\"strictPropertyInitialization\": false,\n\"experimentalDecorators\": true\n```\n\n```tsx\nimport { useForm } from 'react-hook-form';\nimport { classValidatorResolver } from '@hookform/resolvers/class-validator';\nimport { Length, Min, IsEmail } from 'class-validator';\n\nclass User {\n  @Length(2, 30)\n  username: string;\n\n  @IsEmail()\n  email: string;\n}\n\nconst resolver = classValidatorResolver(User);\n\nconst App = () => {\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<User>({ resolver });\n\n  return (\n    <form onSubmit={handleSubmit((data) => console.log(data))}>\n      <input type=\"text\" {...register('username')} />\n      {errors.username && <span>{errors.username.message}</span>}\n      <input type=\"text\" {...register('email')} />\n      {errors.email && <span>{errors.email.message}</span>}\n      <input type=\"submit\" value=\"Submit\" />\n    </form>\n  );\n};\n```\n\n### [io-ts](https://github.com/gcanti/io-ts)\n\nValidate your data with powerful decoders.\n\n[![npm](https://img.shields.io/bundlephobia/minzip/io-ts?style=for-the-badge)](https://bundlephobia.com/result?p=io-ts)\n\n```typescript jsx\nimport React from 'react';\nimport { useForm } from 'react-hook-form';\nimport { ioTsResolver } from '@hookform/resolvers/io-ts';\nimport t from 'io-ts';\n// you don't have to use io-ts-types, but it's very useful\nimport tt from 'io-ts-types';\n\nconst schema = t.type({\n  username: t.string,\n  age: tt.NumberFromString,\n});\n\nconst App = () => {\n  const { register, handleSubmit } = useForm({\n    resolver: ioTsResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('username')} />\n      <input type=\"number\" {...register('age')} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n\nexport default App;\n```\n\n### [Nope](https://github.com/bvego/nope-validator)\n\nA small, simple, and fast JS validator\n\n[![npm](https://img.shields.io/bundlephobia/minzip/nope-validator?style=for-the-badge)](https://bundlephobia.com/result?p=nope-validator)\n\n```typescript jsx\nimport { useForm } from 'react-hook-form';\nimport { nopeResolver } from '@hookform/resolvers/nope';\nimport Nope from 'nope-validator';\n\nconst schema = Nope.object().shape({\n  name: Nope.string().required(),\n  age: Nope.number().required(),\n});\n\nconst App = () => {\n  const { register, handleSubmit } = useForm({\n    resolver: nopeResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('name')} />\n      <input type=\"number\" {...register('age')} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [computed-types](https://github.com/neuledge/computed-types)\n\nTypeScript-first schema validation with static type inference\n\n[![npm](https://img.shields.io/bundlephobia/minzip/computed-types?style=for-the-badge)](https://bundlephobia.com/result?p=computed-types)\n\n```tsx\nimport { useForm } from 'react-hook-form';\nimport { computedTypesResolver } from '@hookform/resolvers/computed-types';\nimport Schema, { number, string } from 'computed-types';\n\nconst schema = Schema({\n  username: string.min(1).error('username field is required'),\n  age: number,\n});\n\nconst App = () => {\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm({\n    resolver: computedTypesResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('name')} />\n      {errors.name?.message && <p>{errors.name?.message}</p>}\n      <input type=\"number\" {...register('age', { valueAsNumber: true })} />\n      {errors.age?.message && <p>{errors.age?.message}</p>}\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [typanion](https://github.com/arcanis/typanion)\n\nStatic and runtime type assertion library with no dependencies\n\n[![npm](https://img.shields.io/bundlephobia/minzip/typanion?style=for-the-badge)](https://bundlephobia.com/result?p=typanion)\n\n```tsx\nimport { useForm } from 'react-hook-form';\nimport { typanionResolver } from '@hookform/resolvers/typanion';\nimport * as t from 'typanion';\n\nconst isUser = t.isObject({\n  username: t.applyCascade(t.isString(), [t.hasMinLength(1)]),\n  age: t.applyCascade(t.isNumber(), [\n    t.isInteger(),\n    t.isInInclusiveRange(1, 100),\n  ]),\n});\n\nconst App = () => {\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm({\n    resolver: typanionResolver(isUser),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('name')} />\n      {errors.name?.message && <p>{errors.name?.message}</p>}\n      <input type=\"number\" {...register('age')} />\n      {errors.age?.message && <p>{errors.age?.message}</p>}\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [Ajv](https://github.com/ajv-validator/ajv)\n\nThe fastest JSON validator for Node.js and browser\n\n[![npm](https://img.shields.io/bundlephobia/minzip/ajv?style=for-the-badge)](https://bundlephobia.com/result?p=ajv)\n\n```tsx\nimport { useForm } from 'react-hook-form';\nimport { ajvResolver } from '@hookform/resolvers/ajv';\n\n// must use `minLength: 1` to implement required field\nconst schema = {\n  type: 'object',\n  properties: {\n    username: {\n      type: 'string',\n      minLength: 1,\n      errorMessage: { minLength: 'username field is required' },\n    },\n    password: {\n      type: 'string',\n      minLength: 1,\n      errorMessage: { minLength: 'password field is required' },\n    },\n  },\n  required: ['username', 'password'],\n  additionalProperties: false,\n};\n\nconst App = () => {\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm({\n    resolver: ajvResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((data) => console.log(data))}>\n      <input {...register('username')} />\n      {errors.username && <span>{errors.username.message}</span>}\n      <input {...register('password')} />\n      {errors.password && <span>{errors.password.message}</span>}\n      <button type=\"submit\">submit</button>\n    </form>\n  );\n};\n```\n\n### [TypeBox](https://github.com/sinclairzx81/typebox)\n\nJSON Schema Type Builder with Static Type Resolution for TypeScript\n\n[![npm](https://img.shields.io/bundlephobia/minzip/@sinclair/typebox?style=for-the-badge)](https://bundlephobia.com/result?p=@sinclair/typebox)\n\n```typescript jsx\nimport { useForm } from 'react-hook-form';\nimport { typeboxResolver } from '@hookform/resolvers/typebox';\nimport { Type } from '@sinclair/typebox';\n\nconst schema = Type.Object({\n  username: Type.String({ minLength: 1 }),\n  password: Type.String({ minLength: 1 }),\n});\n\nconst App = () => {\n  const { register, handleSubmit } = useForm({\n    resolver: typeboxResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('username')} />\n      <input type=\"password\" {...register('password')} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [ArkType](https://github.com/arktypeio/arktype)\n\nTypeScript's 1:1 validator, optimized from editor to runtime\n\n[![npm](https://img.shields.io/bundlephobia/minzip/arktype?style=for-the-badge)](https://bundlephobia.com/result?p=arktype)\n\n```typescript jsx\nimport { useForm } from 'react-hook-form';\nimport { arktypeResolver } from '@hookform/resolvers/arktype';\nimport { type } from 'arktype';\n\nconst schema = type({\n  username: 'string>1',\n  password: 'string>1',\n});\n\nconst App = () => {\n  const { register, handleSubmit } = useForm({\n    resolver: arktypeResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('username')} />\n      <input type=\"password\" {...register('password')} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n### [Valibot](https://github.com/fabian-hiller/valibot)\n\nThe modular and type safe schema library for validating structural data\n\n[![npm](https://img.shields.io/bundlephobia/minzip/valibot?style=for-the-badge)](https://bundlephobia.com/result?p=valibot)\n\n```typescript jsx\nimport { useForm } from 'react-hook-form';\nimport { valibotResolver } from '@hookform/resolvers/valibot';\nimport { object, string, minLength, endsWith } from 'valibot';\n\nconst schema = object({\n  username: string('username is required', [\n    minLength(3, 'Needs to be at least 3 characters'),\n    endsWith('cool', 'Needs to end with `cool`'),\n  ]),\n  password: string('password is required'),\n});\n\nconst App = () => {\n  const { register, handleSubmit } = useForm({\n    resolver: valibotResolver(schema),\n  });\n\n  return (\n    <form onSubmit={handleSubmit((d) => console.log(d))}>\n      <input {...register('username')} />\n      <input type=\"password\" {...register('password')} />\n      <input type=\"submit\" />\n    </form>\n  );\n};\n```\n\n## Backers\n\nThanks goes to all our backers! [[Become a backer](https://opencollective.com/react-hook-form#backer)].\n\n<a href=\"https://opencollective.com/react-hook-form#backers\">\n    <img src=\"https://opencollective.com/react-hook-form/backers.svg?width=950\" />\n</a>\n\n### Sponsors\n\nThanks go to these kind and lovely sponsors!\n\n<a target=\"_blank\" href='https://wantedlyinc.com'>\n    <img width=\"94\" src=\"https://images.opencollective.com/wantedly/d94e44e/logo/256.png\" />\n</a>\n<a target=\"_blank\" href='https://toss.im'>\n    <img width=\"94\" src=\"https://images.opencollective.com/toss/3ed69b3/logo/256.png\" />\n</a>\n<a target=\"_blank\" href=\"https://graphcms.com\">\n    <img width=\"94\" src=\"https://avatars.githubusercontent.com/u/31031438\" />\n</a>\n<a target=\"_blank\" href=\"https://www.beekai.com/\">\n    <img width=\"94\" src=\"https://www.beekai.com/marketing/logo/logo.svg\" />\n</a>\n<a target=\"_blank\" href=\"https://kanamekey.com\">\n    <img width=\"94\" src=\"https://images.opencollective.com/kaname/d15fd98/logo/256.png\" />\n</a>\n<a target=\"_blank\" href=\"https://formcarry.com/\">\n    <img width=\"94\" src=\"https://images.opencollective.com/formcarry/a40a4ea/logo/256.png\" />\n</a>\n\n## Contributors\n\nThanks goes to these wonderful people! [[Become a contributor](CONTRIBUTING.md)].\n\n<a href=\"https://github.com/react-hook-form/react-hook-form/graphs/contributors\">\n    <img src=\"https://opencollective.com/react-hook-form/contributors.svg?width=950\" />\n</a>\n","readmeFilename":"README.md"}