{"@attributes":{"version":"2.0"},"channel":{"title":"DEV Community: Pedro Pimienta M.","description":"The latest articles on DEV Community by Pedro Pimienta M. (@pterpmnta).","link":"https:\/\/dev.to\/pterpmnta","image":{"url":"https:\/\/media2.dev.to\/dynamic\/image\/width=90,height=90,fit=cover,gravity=auto,format=auto\/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F156391%2F66e5c09c-1f37-44a5-8f66-f5b627768cf1.jpg","title":"DEV Community: Pedro Pimienta M.","link":"https:\/\/dev.to\/pterpmnta"},"language":"en","item":{"title":"JSON and scehama validator libraries for Node","pubDate":"Fri, 23 Jul 2021 02:09:11 +0000","link":"https:\/\/dev.to\/pterpmnta\/json-and-scehama-validator-libraries-for-node-1nb8","guid":"https:\/\/dev.to\/pterpmnta\/json-and-scehama-validator-libraries-for-node-1nb8","description":"<p>Hi, I'm a new into the Node world, but I'm working in a project where are using a library called Joi for to validate the JSON data came from the request and other things. Then, i decided to search other library, and I found several, than I decided to choose some and create this post, my first post in this community.<\/p>\n\n<h3>\n  \n  \n  Yup\n<\/h3>\n\n\n<div class=\"ltag-github-readme-tag\">\n  <div class=\"readme-overview\">\n    <h2>\n      <img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg\" alt=\"GitHub logo\">\n      <a href=\"https:\/\/github.com\/jquense\" rel=\"noopener noreferrer\">\n        jquense\n      <\/a> \/ <a href=\"https:\/\/github.com\/jquense\/yup\" rel=\"noopener noreferrer\">\n        yup\n      <\/a>\n    <\/h2>\n    <h3>\n      Dead simple Object schema validation\n    <\/h3>\n  <\/div>\n  <div class=\"ltag-github-body\">\n    \n<div id=\"readme\" class=\"md\">\n<div class=\"markdown-heading\">\n<h1 class=\"heading-element\">Yup<\/h1>\n<\/div>\n<p>Yup is a schema builder for runtime value parsing and validation. Define a schema, transform a value to match, assert the shape of an existing value, or both. Yup schema are extremely expressive and allow modeling complex, interdependent validations, or value transformation.<\/p>\n<blockquote>\n<p><strong>You are viewing docs for the v1.0.0 of yup, pre-v1 docs are available: <a href=\"https:\/\/github.com\/jquense\/yup\/tree\/pre-v1\" rel=\"noopener noreferrer\">here<\/a><\/strong><\/p>\n<\/blockquote>\n<p><strong>Killer Features<\/strong>:<\/p>\n<ul>\n<li>Concise yet expressive schema interface, equipped to model simple to complex data models<\/li>\n<li>Powerful TypeScript support. Infer static types from schema, or ensure schema correctly implement a type<\/li>\n<li>Built-in async validation support. Model server-side and client-side validation equally well<\/li>\n<li>Extensible: add your own type-safe methods and schema<\/li>\n<li>Rich error details, make debugging a breeze<\/li>\n<\/ul>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Getting Started<\/h2>\n<\/div>\n<p>Schema are comprised of parsing actions (transforms) as well as assertions (tests) about the input value\nValidate an input value to parse it and run the configured set of assertions. Chain together methods to\u2026<\/p>\n<\/div>\n  <\/div>\n  <div class=\"gh-btn-container\"><a class=\"gh-btn\" href=\"https:\/\/github.com\/jquense\/yup\" rel=\"noopener noreferrer\">View on GitHub<\/a><\/div>\n<\/div>\n\n\n<p>Yup is a JavaScript schema builder for value parsing and validation. Define a schema, transform a value to match, validate the shape of an existing value, or both. Yup schema are extremely expressive and allow modeling complex, interdependent validations, or value transformations.<\/p>\n\n<p>Yup's API is heavily inspired by Joi, but leaner and built with client-side validation as its primary use-case. Yup separates the parsing and validating functions into separate steps. cast() transforms data while validate checks that the input is the correct shape. Each can be performed together (such as HTML form validation) or seperately (such as deserializing trusted data from<br>\nAPIs).<\/p>\n<h3>\n  \n  \n  ajv\n<\/h3>\n\n\n<div class=\"ltag-github-readme-tag\">\n  <div class=\"readme-overview\">\n    <h2>\n      <img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg\" alt=\"GitHub logo\">\n      <a href=\"https:\/\/github.com\/ajv-validator\" rel=\"noopener noreferrer\">\n        ajv-validator\n      <\/a> \/ <a href=\"https:\/\/github.com\/ajv-validator\/ajv\" rel=\"noopener noreferrer\">\n        ajv\n      <\/a>\n    <\/h2>\n    <h3>\n      The fastest JSON schema Validator. Supports JSON Schema draft-04\/06\/07\/2019-09\/2020-12 and JSON Type Definition (RFC8927)\n    <\/h3>\n  <\/div>\n  <div class=\"ltag-github-body\">\n    \n<div id=\"readme\" class=\"md\">\n<p><a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/15d4ccfee390b38eac039f8b8db14beb3ef1c11b24a2a1c84810b431bc0232b0\/68747470733a2f2f616a762e6a732e6f72672f696d672f616a762e737667\"><img alt=\"Ajv logo\" width=\"160\" src=\"https:\/\/camo.githubusercontent.com\/15d4ccfee390b38eac039f8b8db14beb3ef1c11b24a2a1c84810b431bc0232b0\/68747470733a2f2f616a762e6a732e6f72672f696d672f616a762e737667\"><\/a><\/p>\n<p>\u00a0<\/p>\n<div class=\"markdown-heading\">\n<h1 class=\"heading-element\">Ajv JSON schema validator<\/h1>\n<\/div>\n<p>The fastest JSON validator for Node.js and browser.<\/p>\n<p>Supports JSON Schema draft-04\/06\/07\/2019-09\/2020-12 (<a href=\"https:\/\/ajv.js.org\/json-schema.html#draft-04\" rel=\"nofollow noopener noreferrer\">draft-04 support<\/a> requires ajv-draft-04 package) and JSON Type Definition <a href=\"https:\/\/datatracker.ietf.org\/doc\/rfc8927\/\" rel=\"nofollow noopener noreferrer\">RFC8927<\/a>.<\/p>\n<p><a href=\"https:\/\/github.com\/ajv-validator\/ajv\/actions?query=workflow%3Abuild\" rel=\"noopener noreferrer\"><img src=\"https:\/\/github.com\/ajv-validator\/ajv\/actions\/workflows\/build.yml\/badge.svg\" alt=\"build\"><\/a>\n<a href=\"https:\/\/www.npmjs.com\/package\/ajv\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/8e35d6470cfd8b9a4484e1788be22163da5e3c1b425ea4f60e7c9807594e9edf\/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f616a762e737667\" alt=\"npm\"><\/a>\n<a href=\"https:\/\/www.npmjs.com\/package\/ajv\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/17c011b2802b7363d53c9875add90406e788e24a366a41f067d55bdc3e2a404b\/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f616a762e737667\" alt=\"npm downloads\"><\/a>\n<a href=\"https:\/\/coveralls.io\/github\/ajv-validator\/ajv?branch=master\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/4a65090971ae673dc36ef3780ebd2f308eda4e6cefe62f44fc24a902fb24ee6e\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f616a762d76616c696461746f722f616a762f62616467652e7376673f6272616e63683d6d6173746572\" alt=\"Coverage Status\"><\/a>\n<a href=\"https:\/\/simplex.chat\/contact#\/?v=1-2&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2F8KvvURM6J38Gdq9dCuPswMOkMny0xCOJ%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAr8rPVRuMOXv6kwF2yUAap-eoVg-9ssOFCi1fIrxTUw0%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&amp;data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%224pwLRgWHU9tlroMWHz0uOg%3D%3D%22%7D\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/74228b85a781570d6f101a258c34d6bf07a97121c76caa5ce12757073c527dd5\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636861742d6f6e25323053696d706c65582d373046304639\" alt=\"SimpleX\"><\/a>\n<a href=\"https:\/\/gitter.im\/ajv-validator\/ajv\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/27901403e8d5b911b3ecfd2e9583d9e7134cf8ff3293f59b88281bcf45026280\/68747470733a2f2f696d672e736869656c64732e696f2f6769747465722f726f6f6d2f616a762d76616c696461746f722f616a762e737667\" alt=\"Gitter\"><\/a>\n<a href=\"https:\/\/github.com\/sponsors\/epoberezkin\" rel=\"noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/560908b8701632e39aae32dc42d3e5d5e5e2f38be654e662775ebf3dbe1a46fd\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f242d73706f6e736f72732d627269676874677265656e\" alt=\"GitHub Sponsors\"><\/a><\/p>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Ajv sponsors<\/h2>\n<\/div>\n<p><a href=\"https:\/\/www.mozilla.org\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/2eee4a153e00cccbcba265aa84c319495a15519b73d38337c622c89157ac8ed5\/68747470733a2f2f616a762e6a732e6f72672f696d672f6d6f7a696c6c612e737667\" width=\"45%\" alt=\"Mozilla\"><\/a><a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\"><img src=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\" width=\"9%\"><\/a><a href=\"https:\/\/opencollective.com\/ajv\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/3b6021cba8a1e3d06eb5f0f498a871ff31bd776e47483369cd6c34951db1ab10\/68747470733a2f2f616a762e6a732e6f72672f696d672f72657365727665642e737667\" width=\"45%\"><\/a><\/p>\n<p><a href=\"https:\/\/opensource.microsoft.com\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/141c7214d1ad2d28459ff3532ee4eee33737cdd87fe03640ecd90feee6671d3f\/68747470733a2f2f616a762e6a732e6f72672f696d672f6d6963726f736f66742e706e67\" width=\"31%\" alt=\"Microsoft\"><\/a><a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\"><img src=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\" width=\"3%\"><\/a><a href=\"https:\/\/opencollective.com\/ajv\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/3b6021cba8a1e3d06eb5f0f498a871ff31bd776e47483369cd6c34951db1ab10\/68747470733a2f2f616a762e6a732e6f72672f696d672f72657365727665642e737667\" width=\"31%\"><\/a><a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\"><img src=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\" width=\"3%\"><\/a><a href=\"https:\/\/opencollective.com\/ajv\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/3b6021cba8a1e3d06eb5f0f498a871ff31bd776e47483369cd6c34951db1ab10\/68747470733a2f2f616a762e6a732e6f72672f696d672f72657365727665642e737667\" width=\"31%\"><\/a><\/p>\n<p><a href=\"https:\/\/retool.com\/?utm_source=sponsor&amp;utm_campaign=ajv\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/a4e660942b365ac3d700ec801ae406ea629b92c46e6b584add9cfaf6cd45613c\/68747470733a2f2f616a762e6a732e6f72672f696d672f7265746f6f6c2e737667\" width=\"22.5%\" alt=\"Retool\"><\/a><a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\"><img src=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\" width=\"3%\"><\/a><a href=\"https:\/\/tidelift.com\/subscription\/pkg\/npm-ajv?utm_source=npm-ajv&amp;utm_medium=referral&amp;utm_campaign=enterprise\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/aa1c9c59492e7f6566f77231fe5b207f4bc6b2e5a997fca3d3e0fe1a48bd244a\/68747470733a2f2f616a762e6a732e6f72672f696d672f746964656c6966742e737667\" width=\"22.5%\" alt=\"Tidelift\"><\/a><a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\"><img src=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\" width=\"3%\"><\/a><a href=\"https:\/\/github.com\/simplex-chat\/simplex-chat\" rel=\"noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/af87a30d37c8d67004abc30c2587b9c39724aadccb5d4b6b8ebb3b644d8bee50\/68747470733a2f2f616a762e6a732e6f72672f696d672f73696d706c65782e737667\" width=\"22.5%\" alt=\"SimpleX\"><\/a><a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\"><img src=\"https:\/\/camo.githubusercontent.com\/d3da8990b7ed6a701d549be136fa5edf58fcc445edc5b9a09214dd45ebf7f94e\/68747470733a2f2f616a762e6a732e6f72672f696d672f6761702e737667\" width=\"3%\"><\/a><a href=\"https:\/\/opencollective.com\/ajv\" rel=\"nofollow noopener noreferrer\"><img src=\"https:\/\/camo.githubusercontent.com\/3b6021cba8a1e3d06eb5f0f498a871ff31bd776e47483369cd6c34951db1ab10\/68747470733a2f2f616a762e6a732e6f72672f696d672f72657365727665642e737667\" width=\"22.5%\"><\/a><\/p>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Contributing<\/h2>\n<\/div>\n<p>More than 100 people contributed to Ajv, and we would love to have you join the development. We welcome implementing new features that will benefit many users and ideas to improve our documentation.<\/p>\n<p>Please review <a href=\"https:\/\/github.com\/ajv-validator\/ajv.\/CONTRIBUTING.md\" rel=\"noopener noreferrer\">Contributing guidelines<\/a> and <a href=\"https:\/\/ajv.js.org\/components.html\" rel=\"nofollow noopener noreferrer\">Code components<\/a>.<\/p>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Documentation<\/h2>\n\n<\/div>\n<p>All documentation is available on the <a href=\"https:\/\/ajv.js.org\" rel=\"nofollow noopener noreferrer\">Ajv website<\/a>.<\/p>\n<p>Some useful site links:<\/p>\n<ul>\n<li><a href=\"https:\/\/ajv.js.org\/guide\/getting-started.html\" rel=\"nofollow noopener noreferrer\">Getting started<\/a><\/li>\n<li><a href=\"https:\/\/ajv.js.org\/guide\/schema-language.html\" rel=\"nofollow noopener noreferrer\">JSON Schema vs JSON Type Definition<\/a><\/li>\n<li><a href=\"https:\/\/ajv.js.org\/api.html\" rel=\"nofollow noopener noreferrer\">API reference<\/a><\/li>\n<li><a href=\"https:\/\/ajv.js.org\/strict-mode.html\" rel=\"nofollow noopener noreferrer\">Strict mode<\/a><\/li>\n<li><a href=\"https:\/\/ajv.js.org\/standalone.html\" rel=\"nofollow noopener noreferrer\">Standalone validation code<\/a><\/li>\n<li><a href=\"https:\/\/ajv.js.org\/security.html\" rel=\"nofollow noopener noreferrer\">Security considerations<\/a><\/li>\n<li><a href=\"https:\/\/ajv.js.org\/packages\/ajv-cli.html\" rel=\"nofollow noopener noreferrer\">Command line interface<\/a><\/li>\n<li><a href=\"https:\/\/ajv.js.org\/faq.html\" rel=\"nofollow noopener noreferrer\">Frequently Asked Questions<\/a><\/li>\n<\/ul>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">\nPlease <a href=\"https:\/\/github.com\/sponsors\/epoberezkin\" rel=\"noopener noreferrer\">sponsor Ajv development<\/a>\n<\/h2>\n\n<\/div>\n<p>Since I asked to support Ajv development 40 people and 6 organizations contributed via GitHub and OpenCollective - this support helped receiving the MOSS grant!<\/p>\n<p>Your continuing support is very important - the funds will be used\u2026<\/p>\n<\/div>\n  <\/div>\n  <div class=\"gh-btn-container\"><a class=\"gh-btn\" href=\"https:\/\/github.com\/ajv-validator\/ajv\" rel=\"noopener noreferrer\">View on GitHub<\/a><\/div>\n<\/div>\n\n\n<h3>\n  \n  \n  Superstructure\n<\/h3>\n\n\n<div class=\"ltag-github-readme-tag\">\n  <div class=\"readme-overview\">\n    <h2>\n      <img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg\" alt=\"GitHub logo\">\n      <a href=\"https:\/\/github.com\/ianstormtaylor\" rel=\"noopener noreferrer\">\n        ianstormtaylor\n      <\/a> \/ <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct\" rel=\"noopener noreferrer\">\n        superstruct\n      <\/a>\n    <\/h2>\n    <h3>\n      A simple and composable way to validate data in JavaScript (and TypeScript).\n    <\/h3>\n  <\/div>\n  <div class=\"ltag-github-body\">\n    \n<div id=\"readme\" class=\"md\">\n<p>\n  <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct#\" rel=\"noopener noreferrer\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fgithub.com%2Fianstormtaylor%2Fsuperstruct.%2Fdocs%2Fimages%2Fbanner.png\"><\/a>\n<\/p>\n\n<p>\n  A simple and composable way  <br>\n  to validate data in JavaScript (and TypeScript)\n<\/p>\n\n\n\n<p>\n  <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct#usage\" rel=\"noopener noreferrer\">Usage<\/a> \u2022\n  <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct#why\" rel=\"noopener noreferrer\">Why?<\/a> \u2022\n  <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct#principles\" rel=\"noopener noreferrer\">Principles<\/a> \u2022\n  <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct#demo\" rel=\"noopener noreferrer\">Demo<\/a> \u2022\n  <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct#examples\" rel=\"noopener noreferrer\">Examples<\/a> \u2022\n  <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct#documentation\" rel=\"noopener noreferrer\">Documentation<\/a>\n<\/p>\n\n<p>\n  <a href=\"https:\/\/unpkg.com\/superstruct\/umd\/superstruct.min.js\" rel=\"nofollow noopener noreferrer\">\n    <img src=\"https:\/\/camo.githubusercontent.com\/67317dd214f17f9eb1b483c6321d94cf3db5d6186c116159e66618ee28fefaec\/68747470733a2f2f62616467656e2e6e65742f62756e646c6570686f6269612f6d696e7a69702f73757065727374727563743f636f6c6f723d677265656e266c6162656c3d73697a65\" alt=\"\">\n  <\/a>\n  <a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct.\/package.json\" rel=\"noopener noreferrer\">\n    <img src=\"https:\/\/camo.githubusercontent.com\/ca74ebd44892aa216b1a93a925c5b5d448b60627ca03949a0e6a6ece664385a3\/68747470733a2f2f62616467656e2e6e65742f6e706d2f762f73757065727374727563743f636f6c6f723d626c7565266c6162656c3d76657273696f6e\" alt=\"\">\n  <\/a>\n  <a href=\"https:\/\/jsr.io\/@superstruct\/core\" rel=\"nofollow noopener noreferrer\">\n    <img src=\"https:\/\/camo.githubusercontent.com\/f7b65d356a1d1684e5569d01db345b956142e02d874a282677dc5c27c0455409\/68747470733a2f2f6a73722e696f2f6261646765732f4073757065727374727563742f636f7265\" alt=\"\">\n  <\/a>\n<\/p>\n\n\n\n<p>Superstruct makes it easy to define interfaces and then validate JavaScript data against them. Its type annotation API was inspired by <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/basic-types.html\" rel=\"nofollow noopener noreferrer\">Typescript<\/a>, <a href=\"https:\/\/flow.org\/en\/docs\/types\/\" rel=\"nofollow noopener noreferrer\">Flow<\/a>, <a href=\"https:\/\/gobyexample.com\/structs\" rel=\"nofollow noopener noreferrer\">Go<\/a>, and <a href=\"http:\/\/graphql.org\/learn\/schema\/\" rel=\"nofollow noopener noreferrer\">GraphQL<\/a>, giving it a familiar and easy to understand API.<\/p>\n\n<p>But Superstruct is designed for validating data at runtime, so it throws (or returns) detailed runtime errors for you or your end users. This is especially useful in situations like accepting arbitrary input in a REST or GraphQL API. But it can even be used to validate internal data structures at runtime when needed.<\/p>\n\n\n\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Usage<\/h3>\n<\/div>\n\n<p>Superstruct allows you to define the shape of data you want to validate:<\/p>\n\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight\">\n<pre><span class=\"pl-k\">import<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-s1\">assert<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">object<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">number<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">array<\/span> <span class=\"pl-kos\">}<\/span> <span class=\"pl-k\">from<\/span> <span class=\"pl-s\">'superstruct'<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-v\">Article<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">object<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span><\/pre>\u2026\n<\/div>\n<\/div>\n  <\/div>\n  <div class=\"gh-btn-container\"><a class=\"gh-btn\" href=\"https:\/\/github.com\/ianstormtaylor\/superstruct\" rel=\"noopener noreferrer\">View on GitHub<\/a><\/div>\n<\/div>\n\n\n\n<p>Superstruct makes it easy to define interfaces and then validate JavaScript data against them. Its type annotation API was inspired by Typescript, Flow, Go, and GraphQL, giving it a familiar and easy to understand API.<\/p>\n\n<p>But Superstruct is designed for validating data at runtime, so it throws (or returns) detailed runtime errors for you or your end users. This is especially useful in situations like accepting arbitrary input in a REST or GraphQL API. But it can even be used to validate internal data structures at runtime when needed.<\/p>\n\n<h3>\n  \n  \n  Forg Js\n<\/h3>\n\n\n<div class=\"ltag-github-readme-tag\">\n  <div class=\"readme-overview\">\n    <h2>\n      <img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg\" alt=\"GitHub logo\">\n      <a href=\"https:\/\/github.com\/oussamahamdaoui\" rel=\"noopener noreferrer\">\n        oussamahamdaoui\n      <\/a> \/ <a href=\"https:\/\/github.com\/oussamahamdaoui\/forgJs\" rel=\"noopener noreferrer\">\n        forgJs\n      <\/a>\n    <\/h2>\n    <h3>\n      ForgJs is a javascript lightweight object validator.\n    <\/h3>\n  <\/div>\n  <div class=\"ltag-github-body\">\n    \n<div id=\"readme\" class=\"md\">\n<div class=\"markdown-heading\">\n<h1 class=\"heading-element\"><a rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/oussamahamdaoui\/forgJs.\/media\/logo.png?raw=true\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fgithub.com%2Foussamahamdaoui%2FforgJs.%2Fmedia%2Flogo.png%3Fraw%3Dtrue\" alt=\"forgJs logo\"><\/a><\/h1>\n<\/div>\n<p>ForgJs is a JavaScript lightweight object validator. Go check the Quick start section and start coding with love \u2764\ufe0f<\/p>\n<p><a rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/oussamahamdaoui\/forgJs.\/media\/email.gif?raw=true\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fgithub.com%2Foussamahamdaoui%2FforgJs.%2Fmedia%2Femail.gif%3Fraw%3Dtrue\" alt=\"email\"><\/a><\/p>\n<p><a rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/oussamahamdaoui\/forgJs.\/media\/password.gif?raw=true\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fgithub.com%2Foussamahamdaoui%2FforgJs.%2Fmedia%2Fpassword.gif%3Fraw%3Dtrue\" alt=\"password\"><\/a><\/p>\n<p><a rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/oussamahamdaoui\/forgJs.\/media\/number.gif?raw=true\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fgithub.com%2Foussamahamdaoui%2FforgJs.%2Fmedia%2Fnumber.gif%3Fraw%3Dtrue\" alt=\"number\"><\/a><\/p>\n<p><a rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/oussamahamdaoui\/forgJs.\/media\/url.gif?raw=true\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fgithub.com%2Foussamahamdaoui%2FforgJs.%2Fmedia%2Furl.gif%3Fraw%3Dtrue\" alt=\"url\"><\/a><\/p>\n<p>See more live examples <a href=\"https:\/\/oussamahamdaoui.github.io\/forgjs-examples\/\" rel=\"nofollow noopener noreferrer\">here<\/a><\/p>\n<div class=\"markdown-heading\">\n<h1 class=\"heading-element\">Quick start<\/h1>\n<\/div>\n<p>Install it via npm by running <code>npm i @cesium133\/forgjs<\/code><\/p>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Your first validator<\/h2>\n<\/div>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight\">\n<pre>  <span class=\"pl-k\">const<\/span> <span class=\"pl-kos\">{<\/span> Validator<span class=\"pl-kos\">,<\/span> Rule <span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">require<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">'<a class=\"mentioned-user\" href=\"https:\/\/dev.to\/cesium133\">@cesium133<\/a>\/forgjs'<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">emailRule<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-v\">Rule<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">type<\/span>: <span class=\"pl-s\">'email'<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-en\">user<\/span>: <span class=\"pl-s1\">user<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-s1\">user<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">'dedede'<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-en\">domain<\/span>: <span class=\"pl-s1\">domain<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">'outlook'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'gmail'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'yahoo'<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">indexOf<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">domain<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">!==<\/span> <span class=\"pl-c1\">-<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">passwordRule<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-v\">Rule<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">type<\/span>: <span class=\"pl-s\">'password'<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">minLength<\/span>: <span class=\"pl-c1\">8<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">uppercase<\/span>: <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">numbers<\/span>: <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">matchesOneOf<\/span>: <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">'@'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'_'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'-'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'.'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'!'<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">vComplex<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-v\">Validator<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">age<\/span>: <span class=\"pl-k\">new<\/span> <span class=\"pl-v\">Rule<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">type<\/span><\/pre>\u2026\n<\/div>\n<\/div>\n  <\/div>\n  <div class=\"gh-btn-container\"><a class=\"gh-btn\" href=\"https:\/\/github.com\/oussamahamdaoui\/forgJs\" rel=\"noopener noreferrer\">View on GitHub<\/a><\/div>\n<\/div>\n\n\n"}}}