{"_id":"@aminnairi/validation","_rev":"1-4ddd80abcd3b25b7b9d1f9938da21ee6","name":"@aminnairi/validation","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"homepage":"https://github.com/aminnairi/validation#readme","license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/aminnairi/validation/issues"},"author":{"name":"Amin NAIRI","url":"https://github.com/aminnairi"},"repository":{"type":"git","url":"git+https://github.com/aminnairi/validation.git"},"keywords":["validation","form","check","verification","validity"],"module":"build/index.module.js","browser":"build/index.browser.js","main":"build/index.common.js","name":"@aminnairi/validation","types":"build/index.d.ts","version":"0.1.0","description":"Validation library for forms","scripts":{"build":"rollup --config rollup.config.ts","test":"jest"},"devDependencies":{"@rollup/plugin-typescript":"8.3.4","@types/jest":"28.1.6","@types/node":"18.6.3","jest":"28.1.3","rollup":"2.77.2","rollup-plugin-delete":"2.0.0","rollup-plugin-terser":"^7.0.2","ts-jest":"28.0.7","tslib":"2.4.0","typescript":"4.7.4"},"dependencies":{"ts-node":"10.9.1"},"gitHead":"c53d0976e8782a3c449ed9405b6ac5ba1a4b2a6b","_id":"@aminnairi/validation@0.1.0","_nodeVersion":"18.3.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-DvUxTKnyZafrX/GZOVH3M7N8FfAlUyNhz50gDuf26iKy+X2NALGP2YfD6j8vjdnBDe7v0Wn8wAcYZ2gEGGjgtg==","shasum":"9bf02e9579792d79127cac3afb108179cfc176de","tarball":"https://registry.npmjs.org/@aminnairi/validation/-/validation-0.1.0.tgz","fileCount":5,"unpackedSize":62968,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHJQYX+CxXqB4X66B9ABfuPhpiNEkYzkLbyszmYQmH4QAiEA4TaSksE/RkPd76g42fg8Orv/nzRQjZv1dDUVHoB6xGo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7kKtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpw8Q/9EUKC8xeHKz26tj8e88+0eym9NYJ03hZf+5z0zh6KrqBXNTSb\r\nAWdZmT2iviRqGsBBQo8QbdDb4Y0nZ4besJIx05JxScyD6YtNL25Gl4aDWLao\r\nGb5D/s/U4az6mprTBGfqT0mNOTktX6oGTgxHfKlF1ilzhnmmvS7NqaV8/IyR\r\nRFiv/8B6zphnyJPiDJLZb1FMLrLKbVq93/8y2s28Eq0Y98UJs65NDJk5FwiX\r\nbcTOcBMhz/VM4Lh5mbzfK3A7lW7eGdeWgfSM4+t5ii1M5X4EZFXldbYJM6La\r\n2duaSyEveS1p3e8dEGyKn9lUGzE3DMWVvAEgVlf7oHhCeN5+AT8CeFaEax6E\r\nwvh/lCxz/ICQgt4OCLiyz7YvhOG6sR2xD/ABf8YRZThOFeHPKpgZQiHS/cg3\r\nh17SfRVRIlu6WZzYSSx5vDTW0Jf7S6zINY74lhFYuzvpunr/9HpJfjG0o9Wk\r\n4EdVtEGl2pC4cbuxweHsagecs5ZwQsLNllFGh1xwIeMVVNiUrsygFRQGZHbD\r\ngrSt1+10ON1BJNHfqwDooZDMv1fqvyNrZPOv9ZfgQ/XLKfd99KdaKtxY6Exm\r\natTlWMXW5NzE0QoMfFGjr7WDA4SIPOkMQoJb1Ttsbl5EGHMMwWaGXTPXURM2\r\nnbNUKIg4eIm1bchYY+gsOLTBHrUBYmfCU08=\r\n=DYiq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"aminnairi","email":"nairi.amin@gmail.com"},"directories":{},"maintainers":[{"name":"aminnairi","email":"nairi.amin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/validation_0.1.0_1659781805471_0.4005513313480673"},"_hasShrinkwrap":false},"0.1.1":{"homepage":"https://github.com/aminnairi/validation#readme","license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/aminnairi/validation/issues"},"author":{"name":"Amin NAIRI","url":"https://github.com/aminnairi"},"repository":{"type":"git","url":"git+https://github.com/aminnairi/validation.git"},"keywords":["validation","form","check","verification","validity"],"module":"build/index.module.js","browser":"build/index.browser.js","main":"build/index.common.js","name":"@aminnairi/validation","types":"build/index.d.ts","version":"0.1.1","description":"Validation library for forms","scripts":{"build":"rollup --config rollup.config.ts","test":"jest"},"devDependencies":{"@rollup/plugin-typescript":"8.3.4","@types/jest":"28.1.6","@types/node":"18.6.3","jest":"28.1.3","rollup":"2.77.2","rollup-plugin-delete":"2.0.0","rollup-plugin-terser":"^7.0.2","ts-jest":"28.0.7","tslib":"2.4.0","typescript":"4.7.4"},"dependencies":{"ts-node":"10.9.1"},"gitHead":"9f3eaeb596b2289a713a54de2d6c57e132a13ab9","_id":"@aminnairi/validation@0.1.1","_nodeVersion":"18.3.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-PnkrdbT2Mgu2GCZ8JPaF3HC8P68UybUpjYHDPJ2mb2WH2eSEswDet2PS9G1B5ub1ePuWRVzag/TjaHrNYDFoQQ==","shasum":"a9eb77d07cf26dbc42a06315c18582ae1230508e","tarball":"https://registry.npmjs.org/@aminnairi/validation/-/validation-0.1.1.tgz","fileCount":7,"unpackedSize":68832,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIELen13k7Cl4Y7f9byuMoAJuZs4RnSN0H1olNEzpWdvhAiEAx/MaWyCXqy9+k+26E0AS+LL4/sPD6ks7nMhPDX59Ou0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7mhMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoSvg//XDgz6QndEVBOBFUdwTqYCbNzYZxwLFjucC71aJfETeVXsD6N\r\nGzkZV+j3FJtdOS3T1q6mGhIjn7D4asR5DnH4gFEhSGFAKibxg3coIf7raEMh\r\nUjLOdLFdT+NDZu1nzVG/mVIz7GupZ/tH/2OcOfnmGMNiebwC33GWVdu8SK6c\r\n2YcPZi4YHnE8Nw6oc7WJsVqU4JzEtb5Q7qo+GHIl3Odxdy+CyYJdSu3PkY5R\r\nUJ5J5hdt+i1WejjsdVrYjeivvM0yCK+M6yBsmUSpautUIPQbakpJFH+3l9JE\r\nk71FsGRph0jz4JC/t1sEFg+6ycmtN99PiEGkOkIGagF3lMI4wOf54+gfuAqy\r\na9lsLrwPoyUJm6t5tU8qh9Xk+2V+2PB/OB6yn5f+L8oFP9j/KAdKVzpFnnvG\r\nP4tJsOp3wKEnFGGLOoO4I8MvKXew3EHx2z1JhwranALYEGbqYCT+jBOJIbHZ\r\nZ9kPbvnLP9vUspSh37wV05/tB+App+/2ZtV0+f2RkpRjP+uVwWw48Ybc3Rlr\r\n10qrph4Ye1x9S7DuDoYGSu/grEFm0CdBfXfp9GH/SLFHxYg1tZqM8fXoEt88\r\n//WK1UW9g5XlxtEtrYJKaRfKJKhSxmDQj/zMr3On6+YzxMF+sJIhpv1qv+uz\r\noBlrvpG6DjGW/h/3vnYFyeo2LmdWTQH6VLw=\r\n=kTQ5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"aminnairi","email":"nairi.amin@gmail.com"},"directories":{},"maintainers":[{"name":"aminnairi","email":"nairi.amin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/validation_0.1.1_1659791436098_0.28670122714825363"},"_hasShrinkwrap":false}},"time":{"created":"2022-08-06T10:30:05.403Z","0.1.0":"2022-08-06T10:30:05.741Z","modified":"2022-08-06T13:10:36.360Z","0.1.1":"2022-08-06T13:10:36.263Z"},"maintainers":[{"name":"aminnairi","email":"nairi.amin@gmail.com"}],"description":"Validation library for forms","homepage":"https://github.com/aminnairi/validation#readme","keywords":["validation","form","check","verification","validity"],"repository":{"type":"git","url":"git+https://github.com/aminnairi/validation.git"},"author":{"name":"Amin NAIRI","url":"https://github.com/aminnairi"},"bugs":{"url":"https://github.com/aminnairi/validation/issues"},"license":"GPL-3.0-or-later","readme":"# @aminnairi/validation\n\nValidation library for forms written in TypeScript\n\n## Requirements\n\n- Node\n- NPM\n\n## Installation\n\n```bash\nnpm install @aminnairi/validation\n```\n\n## Examples\n\n### Form validation check\n\n```typescript\nimport { createValidator, isEmail, isNumber } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  id: {\n    isValidIdentifier: isNumber()\n  },\n  email: {\n    isValidEmail: isEmail()\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    email: \"email@incorrect\",\n    id: 123\n  });\n  \n  console.log(validation.isValid);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    email: \"email@incorrect.com\",\n    id: 123\n  });\n  \n  console.log(validation.isValid);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### Field validation check\n\n```typescript\nimport { createValidator, isEmail, isNumber } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  id: {\n    isValidIdentifier: isNumber()\n  },\n  email: {\n    isValidEmail: isEmail()\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    email: \"email@incorrect\",\n    id: \"123\"\n  });\n  \n  console.log(validation.email.isValid);\n  // false\n  \n  console.log(validation.id.isValid);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    email: \"email@incorrect.com\",\n    id: 123\n  });\n  \n  console.log(validation.email.isValid);\n  // true\n  \n  console.log(validation.id.isValid);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### Rule validation check\n\n```typescript\nimport { createValidator, isEmail, isNumber } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  id: {\n    isValidIdentifier: isNumber()\n  },\n  email: {\n    isValidEmail: isEmail()\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    email: \"email@incorrect\",\n    id: \"123\"\n  });\n  \n  console.log(validation.email.isValidEmail);\n  // false\n  \n  console.log(validation.id.isValidIdentifier);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    email: \"email@incorrect.com\",\n    id: 123\n  });\n  \n  console.log(validation.email.isValidEmail);\n  // true\n  \n  console.log(validation.id.isValidIdentifier);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### Custom validation function\n\n```typescript\nimport { createValidator } from \"@aminnairi/validation\";\n\nconst isEmailNotTaken = () => {\n  return {\n    isValid: async (target, property, value) => {\n      try {\n        const response = await fetch(\"https://jsonplaceholder.typicode.com/users\");\n        const users = await response.json();\n        return users.every(user => user.email !== value);\n      } catch {\n        return false;\n      }\n    }\n  };\n};\n\nconst {validate} = createValidator({\n  email: {\n    isNotTaken: isEmailNotTaken()\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    email: \"sincere@april.biz\"\n  });\n  \n  console.log(validation.email.isNotTaken);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    email: \"user@domain.com\"\n  });\n  \n  console.log(validation.email.isNotTaken);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### React\n\n```tsx\nimport React, { useCallback, useState, useEffect } from \"react\";\nimport { createValidator, isEmail } from \"@aminnairi/validation\";\n\nconst {initialValidation, validate} = createValidator({\n  email: {\n    isValidEmail: isEmail()\n  }\n});\n\nexport const Form = () => {\n  const [formData, setFormData] = useState({\n    email: \"\"\n  });\n  \n  const [validation, setValidation] = useState(initialValidation);\n  \n  const updateFormData = useCallback((property) => (event) => {\n    setFormData(oldFormData => ({\n      ...oldFormData,\n      [property]: event.target.value\n    }));\n  }, []);\n  \n  const create = useCallback((event) => {\n    event.preventDefault();\n    console.log(formData);\n    \n    if (validation.isValid) {\n      // TODO: send the form\n    }\n  }, [formData, validation]);\n  \n  useEffect(() => {\n    validate(formData).then(newValidation => {\n      setValidation(newValidation);\n    });\n  }, [formData]);\n\n  return (\n    <form onSubmit={create}>\n      <div>\n        <input\n          className={validation.email.isValid ? \"text-red\" : \"\"}\n          type=\"email\"\n          value={formData.email}\n          onChange={updateFormData(\"email\")} />\n        {validation.email.isValidEmail || <small>Invalid email</small>}\n      </div>\n      <button disabled={!validation.isValid}>Create</button>\n    </form>\n  );\n};\n```\n\n## TypeScript\n\nThis library has been written in TypeScript with autocompletion in mind. Autocompletion will help you reduce the vector of mistake when updating a validation field or rule name throughout your code base. It is highly recommended that you use TypeScript with this library.\n\n## API\n\n### doesMatch\n\nCheck whether a property match a regular expression.\n\n```typescript\nimport { createValidator, doesMatch } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  color: {\n    isValidColor: doesMatch(/^(light|dark).*$/)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    color: \"red\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.color.isValid);\n  // false\n\n  console.log(validation.color.isValidColor);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    color: \"lightblue\"\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.color.isValid);\n  // true\n\n  console.log(validation.color.isValidColor);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### doesNotMatch\n\nCheck whether a property does not match a regular expression.\n\n```typescript\nimport { createValidator, doesNotMatch } from \"./sources\";\n\nconst {validate} = createValidator({\n  product: {\n    isValidProductName: doesNotMatch(/^.*(chair|table).*$/i)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    product: \"Little chair\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.product.isValid);\n  // false\n\n  console.log(validation.product.isValidProductName);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    product: \"Heavy bag\"\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.product.isValid);\n  // true\n\n  console.log(validation.product.isValidProductName);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isEmail\n\nCheck if a string is a valid email.\n\n```typescript\nimport { createValidator, isEmail } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  email: {\n    isValidEmail: isEmail()\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    email: \"user@domain\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.email.isValid);\n  // false\n\n  console.log(validation.email.isValidEmail);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    email: \"email@domain.com\"\n  });\n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.email.isValid);\n  // true\n\n  console.log(validation.email.isValidEmail);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isEqualToProperty\n\nCheck whether a property is equal to another one.\n\n```typescript\nimport { createValidator, isEqualToProperty, isPassword } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  password: {\n    isValidPassword: isPassword()\n  },\n  passwordConfirmation: {\n    isValidConfirmation: isEqualToProperty(\"password\")\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    password: \"password\",\n    passwordConfirmation: \"confirmation\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.passwordConfirmation.isValid);\n  // false\n\n  console.log(validation.passwordConfirmation.isValidConfirmation);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    password: \"#St0nkP4ssw0rd#\",\n    passwordConfirmation: \"#St0nkP4ssw0rd#\"\n  });\n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.passwordConfirmation.isValid);\n  // true\n\n  console.log(validation.passwordConfirmation.isValidConfirmation);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isInteger\n\nCheck if a property is an integer number.\n\n```typescript\nimport { createValidator, isInteger } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  id: {\n    isValidIdentifier: isInteger()\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    id: \"123\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.id.isValid);\n  // false\n\n  console.log(validation.id.isValidIdentifier);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    id: 123\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.id.isValid);\n  // true\n\n  console.log(validation.id.isValidIdentifier);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isIntegerEqualTo\n\nCheck if a property is an integer number and that it is equal to a given integer.\n\n```typescript\nimport { createValidator, isIntegerEqualTo } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  answer: {\n    isValidAnswer: isIntegerEqualTo(42)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    answer: 123\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.answer.isValid);\n  // false\n\n  console.log(validation.answer.isValidAnswer);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    answer: 42\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.answer.isValid);\n  // true\n\n  console.log(validation.answer.isValidAnswer);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n## isIntegerGreaterThan\n\nCheck whether a property is an integer number greater than an integer.\n\n```typescript\nimport { createValidator, isIntegerGreaterThan } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  height: {\n    isValidHeight: isIntegerGreaterThan(150)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    height: 110\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.height.isValid);\n  // false\n\n  console.log(validation.height.isValidHeight);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    height: 190\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.height.isValid);\n  // true\n\n  console.log(validation.height.isValidHeight);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isIntegerLowerThan\n\nCheck whether a property is an integer number lower than an integer.\n\n```typescript\nimport { createValidator, isIntegerLowerThan } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  passengers: {\n    isValidPassengerCount: isIntegerLowerThan(50)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    passengers: 70\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.passengers.isValid);\n  // false\n\n  console.log(validation.passengers.isValidPassengerCount);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    passengers: 45\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.passengers.isValid);\n  // true\n\n  console.log(validation.passengers.isValidPassengerCount);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isIntegerNotEqualTo\n\nCheck whether a property is an integer number not equal to an integer.\n\n```typescript\nimport { createValidator, isIntegerNotEqualTo } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  guests: {\n    isValidGuestCount: isIntegerNotEqualTo(4)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    guests: 4\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.guests.isValid);\n  // false\n\n  console.log(validation.guests.isValidGuestCount);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    guests: 7\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.guests.isValid);\n  // true\n\n  console.log(validation.guests.isValidGuestCount);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isNotEqualToProperty\n\nCheck whether a property is not equal to another property.\n\n```typescript\nimport { createValidator, isEmail, isNotEqualToProperty, isPassword } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  email: {\n    isValidEmail: isEmail()\n  },\n  password: {\n    isValidPassword: isPassword(),\n    isSecure: isNotEqualToProperty(\"email\")\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    email: \"email@domain.com\",\n    password: \"email@domain.com\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.password.isValid);\n  // false\n\n  console.log(validation.password.isSecure);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    email: \"email@domain.com\",\n    password: \"~P4SSw0rd/\"\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.password.isValid);\n  // true\n\n  console.log(validation.password.isSecure);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isNotOneOf\n\nCheck whether a property is not equal to a list of values.\n\n```typescript\nimport { createValidator, isNotOneOf } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  country: {\n    isValidCountry: isNotOneOf([\"France\", \"Spain\", \"Germany\"])\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    country: \"France\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.country.isValid);\n  // false\n\n  console.log(validation.country.isValidCountry);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    country: \"Sweden\"\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.country.isValid);\n  // true\n\n  console.log(validation.country.isValidCountry);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isNumber\n\nCheck if a value is a number.\n\n```typescript\nimport { createValidator, isNumber } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  id: {\n    isValidIdentifier: isNumber()\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    id: \"123\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.id.isValid);\n  // false\n\n  console.log(validation.id.isValidIdentifier);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    id: 123\n  });\n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.id.isValid);\n  // true\n\n  console.log(validation.id.isValidIdentifier);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isNumberEqualTo\n\nCheck whether a property is a number equal to a number.\n\n```typescript\nimport { createValidator, isNumberEqualTo } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  temperature: {\n    isValidTemperature: isNumberEqualTo(12.34)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    temperature: 43.21\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.temperature.isValid);\n  // false\n\n  console.log(validation.temperature.isValidTemperature);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    temperature: 12.34\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.temperature.isValid);\n  // true\n\n  console.log(validation.temperature.isValidTemperature);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isNumberGreaterThan\n\nCheck whether a property is a number greater than a number.\n\n```typescript\nimport { createValidator, isNumberGreaterThan } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  investment: {\n    isValidAmount: isNumberGreaterThan(1234.56)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    investment: 123.45\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.investment.isValid);\n  // false\n\n  console.log(validation.investment.isValidAmount);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    investment: 2345.67\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.investment.isValid);\n  // true\n\n  console.log(validation.investment.isValidAmount);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isNumberLowerThan\n\nCheck whether a property is a number lower than a number.\n\n```typescript\nimport { createValidator, isNumberLowerThan } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  angle: {\n    isValidAngle: isNumberLowerThan(92.31)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    angle: 103.82\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.angle.isValid);\n  // false\n\n  console.log(validation.angle.isValidAngle);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    angle: 23.31\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.angle.isValid);\n  // true\n\n  console.log(validation.angle.isValidAngle);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isNumberNotEqualTo\n\nCheck whether a property is a number not equal to a number.\n\n```typescript\nimport { createValidator, isNumberNotEqualTo } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  price: {\n    isValidPrice: isNumberNotEqualTo(99.99)\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    price: 99.99\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.price.isValid);\n  // false\n\n  console.log(validation.price.isValidPrice);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    price: 92.75\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.price.isValid);\n  // true\n\n  console.log(validation.price.isValidPrice);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isOneOf\n\nCheck whether a property is equal to one of the value of a list.\n\n```typescript\nimport { createValidator, isOneOf } from \"@aminnairi/validation\";\n\nconst {validate} = createValidator({\n  role: {\n    isValidRole: isOneOf([\"USER\", \"ADMIN\", \"MOD\"])\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    role: \"ANONYMOUS\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.role.isValid);\n  // false\n\n  console.log(validation.role.isValidRole);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    role: \"USER\"\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.role.isValid);\n  // true\n\n  console.log(validation.role.isValidRole);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n### isPassword\n\nCheck whether a password contains at least one lower case letter, one upper case letter, one digit, one symbol and is at least 8 characters long.\n\n```typescript\nimport { createValidator, isPassword } from \"@aminnairi/password\";\n\nconst {validate} = createValidator({\n  password: {\n    isStrong: isPassword()\n  }\n});\n\nconst invalid = async () => {\n  const validation = await validate({\n    password: \"password\"\n  }); \n  \n  console.log(validation.isValid);\n  // false\n\n  console.log(validation.password.isValid);\n  // false\n\n  console.log(validation.password.isStrong);\n  // false\n};\n\nconst valid = async () => {\n  const validation = await validate({\n    password: \"t5B8FRy#53HN\"\n  }); \n  \n  console.log(validation.isValid);\n  // true\n\n  console.log(validation.password.isValid);\n  // true\n\n  console.log(validation.password.isStrong);\n  // true\n};\n\ninvalid().catch(console.error);\nvalid().catch(console.error);\n```\n\n## Changelog\n\nSee [`CHANGELOG.md`](./CHANGELOG.md).\n\n## License\n\nSee [`LICENSE`](./LICENSE).\n\n## Contributing\n\nSee [`CONTRIBUTING.md`](./CONTRIBUTING.md).\n\n## Code of conduct\n\nSee [`CODE_OF_CONDUCT.md`](./CODE_OF_CONDUCT.md).","readmeFilename":"README.md"}