{"_id":"@andufratu/ngx-custom-validators","_rev":"3-3cc10d70c195dbfbb528cee21889ea1d","name":"@andufratu/ngx-custom-validators","dist-tags":{"latest":"12.0.1"},"versions":{"11.0.1":{"name":"@andufratu/ngx-custom-validators","version":"11.0.1","description":"Angular custom directives for validation","repository":{"type":"git","url":"git+https://github.com/andufratu/ngx-custom-validators.git"},"keywords":["angular","angular 10","directive","reactive","template","forms","validate","validation","validators","custom"],"author":{"name":"Ralf Saenen","email":"ralf.saenen@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/andufratu/ngx-custom-validators/issues"},"homepage":"https://github.com/andufratu/ngx-custom-validators#readme","private":false,"peerDependencies":{"@angular/common":"~13.0.0","@angular/core":"~13.0.0","@angular/forms":"~13.0.0"},"dependencies":{"@angular/common":"~13.0.0","@angular/compiler":"~13.0.0","@angular/core":"~13.0.0","@angular/forms":"~13.0.0","@angular/platform-browser":"~13.0.0","@angular/platform-browser-dynamic":"~13.0.0","moment":"^2.28.0","rxjs":"~6.6.3","tslib":"^2.0.0","zone.js":"~0.11.1"},"module":"fesm2015/andufratu-ngx-custom-validators.mjs","es2020":"fesm2020/andufratu-ngx-custom-validators.mjs","esm2020":"esm2020/andufratu-ngx-custom-validators.mjs","fesm2020":"fesm2020/andufratu-ngx-custom-validators.mjs","fesm2015":"fesm2015/andufratu-ngx-custom-validators.mjs","typings":"andufratu-ngx-custom-validators.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./andufratu-ngx-custom-validators.d.ts","esm2020":"./esm2020/andufratu-ngx-custom-validators.mjs","es2020":"./fesm2020/andufratu-ngx-custom-validators.mjs","es2015":"./fesm2015/andufratu-ngx-custom-validators.mjs","node":"./fesm2015/andufratu-ngx-custom-validators.mjs","default":"./fesm2020/andufratu-ngx-custom-validators.mjs"}},"sideEffects":false,"_id":"@andufratu/ngx-custom-validators@11.0.1","_nodeVersion":"14.15.2","_npmVersion":"6.14.9","dist":{"integrity":"sha512-AiKH7awDrx8LDMBth7/22iIrgIRzeiRHNaEDB1OHeN3Vrj7mfEWcQJjWohPqZYGsezUPkonpfxYMiDFbxkyOCA==","shasum":"708f0363ac8a42dff0661573d070e73997886665","tarball":"https://registry.npmjs.org/@andufratu/ngx-custom-validators/-/ngx-custom-validators-11.0.1.tgz","fileCount":130,"unpackedSize":565343,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiAk9xCRA9TVsSAnZWagAA19oP/018TJaSqzDUaUSm3blj\nW5SJGCEIrUyQ91dFMPFU6BerXWBoqP0dgMctxuUjIuldEXHWzmmH6uVAU0Qy\nbLcwtuBTge8LkGbeBR/UjGe/L0wT//K96QQa1YJ3NgvVl1o+IVQXuMJj8WLN\n93DNuy5DLu76ttYDyXHXzAn288wFzLDAHbNtgjGB7DsrqGoSvbJwyifPF2dv\ngjwtbtS8XG0NzUM2WydFMXHBsMFIJ81C6lhWYny425QrIiovbBUvUk+a3fCp\nu6xL8NPmYT4Jo9jwnVDBVTdC20jcVRiGxcXpzOBBmoxqYrUP8HWQCLcw/9p7\nsuA/oWQ6D6y4lutcXgCV3/V7sz2TqCJKYkKkHxtHbxnsKPFs3i2hSM0BOQYU\n+zqEPHKmsvQNviL6PSbTUDJcwFyf3dEmo9JgyJqaJyHtWr0bgf19fIPizNxU\nkGHI/D0cVFqjwPtcmv7GhK95XGWUryYu9PbKk6wfAVnBNrazM8HAVVJ9Uxo/\nOv+ctTEDnbsIFLqotSM6nTjaj8WcqSlDT/UnFE+vPFWHywzYGvgXMv6DH9HE\nDmWGsBct/Kv2ttwZiMoVzlUTiKSLo6ucruGWmWR5eywRwZ5Pb6UBX23a9zIP\nr7L40QkXn/OemAg+S54Vy2WcMD1Df0X2WexQzDSuJeYoTkS9tJm/4UBoweoP\nFWua\r\n=ZPqA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAIbsTpnkG9taAY9iqFrvQmY/1Mbm0hZKms9hlKaWyV5AiEA6sVVwOgLsQKZx9tcDa7NRnhRDLxObC/UN4AuqaU7CQg="}]},"_npmUser":{"name":"andufratu","email":"andu@fratu.ro"},"directories":{},"maintainers":[{"name":"andufratu","email":"andu@fratu.ro"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ngx-custom-validators_11.0.1_1644318577223_0.43516827195177"},"_hasShrinkwrap":false},"12.0.0":{"name":"@andufratu/ngx-custom-validators","version":"12.0.0","description":"Angular custom directives for validation","repository":{"type":"git","url":"git+https://github.com/andufratu/ngx-custom-validators.git"},"keywords":["angular","angular 10","directive","reactive","template","forms","validate","validation","validators","custom"],"author":{"name":"Ralf Saenen","email":"ralf.saenen@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/andufratu/ngx-custom-validators/issues"},"homepage":"https://github.com/andufratu/ngx-custom-validators#readme","private":false,"peerDependencies":{"@angular/common":"~13.0.0","@angular/core":"~13.0.0","@angular/forms":"~13.0.0"},"dependencies":{"@angular/common":"~13.0.0","@angular/compiler":"~13.0.0","@angular/core":"~13.0.0","@angular/forms":"~13.0.0","@angular/platform-browser":"~13.0.0","@angular/platform-browser-dynamic":"~13.0.0","moment":"^2.28.0","rxjs":"~6.6.3","tslib":"^2.0.0","zone.js":"~0.11.1"},"module":"fesm2015/andufratu-ngx-custom-validators.mjs","es2020":"fesm2020/andufratu-ngx-custom-validators.mjs","esm2020":"esm2020/andufratu-ngx-custom-validators.mjs","fesm2020":"fesm2020/andufratu-ngx-custom-validators.mjs","fesm2015":"fesm2015/andufratu-ngx-custom-validators.mjs","typings":"andufratu-ngx-custom-validators.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./andufratu-ngx-custom-validators.d.ts","esm2020":"./esm2020/andufratu-ngx-custom-validators.mjs","es2020":"./fesm2020/andufratu-ngx-custom-validators.mjs","es2015":"./fesm2015/andufratu-ngx-custom-validators.mjs","node":"./fesm2015/andufratu-ngx-custom-validators.mjs","default":"./fesm2020/andufratu-ngx-custom-validators.mjs"}},"sideEffects":false,"_id":"@andufratu/ngx-custom-validators@12.0.0","_nodeVersion":"14.15.2","_npmVersion":"6.14.9","dist":{"integrity":"sha512-XZjc93EkaNiwDzM7bdgnmvdQnUGSrbNpp8YqYwXeMzqiWPG5OTjWb2p0zyreHtTuLNLZN53asL8QpoXNwhlhlA==","shasum":"720ae1fa2cd28795e5c5c054a1afeeff1a03838c","tarball":"https://registry.npmjs.org/@andufratu/ngx-custom-validators/-/ngx-custom-validators-12.0.0.tgz","fileCount":130,"unpackedSize":565342,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiAk/SCRA9TVsSAnZWagAAIbMP/3z5BK+3EMjw7simW03y\nELY8B5UfjWxW+jX95n39QErzryvtvBT27NZEzeEPy3827/OGLd8kBvuZQIE9\nHZ8NRLBQMDrKjsjO2LGHu5Odn6C+U+1+UW92gMOFc3sxBY625Sw/ZT+XLCmT\nBrjGRu1/8xsM2sfmGEdcRulrlOqz6frsuWpprMP7WEqCtqhavZNziu7CsVvm\nY+p+1qmGvtH7SrICLsT4cUd7REHFiO/i+JJTcmKx8zH/Zp9pgd7b7JRkiZEh\nLNKbKHqygg5GCL1a/44DhxWi37jxFHfD0MGALO0YhZlQunNgXGW+b4/7mSyZ\nPjVdi+ZnsK1lgNSzjUdXi3uAaXKCV12rp+5M8J/eb7H/ZXqfPEBhEzwznJwJ\nMRKvqW23ZytWm339Z7jUw7fkbJb4wu9JN7QTqoONXn9hKJbjdNC0QvQJzcn4\nuoBJa70e8JhkPkfUdmaVkVHAxYIoagETQqdXH2+jq795f3IBVr4NTqGFuQqI\nBiKlB+rS9jLT4SjA5zYa9n/cShX8ayBeEJVyxnF06yXumY5IdvF/BAPZ4tMJ\nqZywyJqoTbLkhswsYQt6ooq7eS7WaC7kA4FuPPaEd5AwrPR2cnpx/SSgOTR/\n30h2GO3RyXzk8M6B5WBAdAxjE33YvZneLRfFPRT21jH57S7AgVKKnGiaIm7q\nDYOr\r\n=M/jZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtPh2vxw894I/8rbu60vkYAb+iTA7haAsdIatAGGdnAgIhAOm9f0IFUZbcKxf1HsdCv8QXzFyXeU8RyJTBLYjBzAp/"}]},"_npmUser":{"name":"andufratu","email":"andu@fratu.ro"},"directories":{},"maintainers":[{"name":"andufratu","email":"andu@fratu.ro"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ngx-custom-validators_12.0.0_1644318674513_0.5042474154663636"},"_hasShrinkwrap":false},"12.0.1":{"name":"@andufratu/ngx-custom-validators","version":"12.0.1","description":"Angular custom directives for validation","repository":{"type":"git","url":"git+https://github.com/andufratu/ngx-custom-validators.git"},"keywords":["angular","angular 10","directive","reactive","template","forms","validate","validation","validators","custom"],"author":{"name":"Ralf Saenen","email":"ralf.saenen@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/andufratu/ngx-custom-validators/issues"},"homepage":"https://github.com/andufratu/ngx-custom-validators#readme","private":false,"peerDependencies":{"@angular/common":"~13.0.0","@angular/core":"~13.0.0","@angular/forms":"~13.0.0"},"dependencies":{"@angular/common":"~13.0.0","@angular/compiler":"~13.0.0","@angular/core":"~13.0.0","@angular/forms":"~13.0.0","@angular/platform-browser":"~13.0.0","@angular/platform-browser-dynamic":"~13.0.0","moment":"^2.28.0","rxjs":"~6.6.3","tslib":"^2.0.0","zone.js":"^0.11.5"},"module":"fesm2015/andufratu-ngx-custom-validators.mjs","es2020":"fesm2020/andufratu-ngx-custom-validators.mjs","esm2020":"esm2020/andufratu-ngx-custom-validators.mjs","fesm2020":"fesm2020/andufratu-ngx-custom-validators.mjs","fesm2015":"fesm2015/andufratu-ngx-custom-validators.mjs","typings":"andufratu-ngx-custom-validators.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./andufratu-ngx-custom-validators.d.ts","esm2020":"./esm2020/andufratu-ngx-custom-validators.mjs","es2020":"./fesm2020/andufratu-ngx-custom-validators.mjs","es2015":"./fesm2015/andufratu-ngx-custom-validators.mjs","node":"./fesm2015/andufratu-ngx-custom-validators.mjs","default":"./fesm2020/andufratu-ngx-custom-validators.mjs"}},"sideEffects":false,"_id":"@andufratu/ngx-custom-validators@12.0.1","_nodeVersion":"14.15.2","_npmVersion":"6.14.16","dist":{"integrity":"sha512-VvjiV91PRxKn1jFBHRQ5EC89yi4Dot7WWSY4nZB2IIGoXDW5AiPEtFwqfT6CwyoeqDlUA9Gl52Vqiv0oZNxW+A==","shasum":"ac76eae16ef4ed6275d50491ab413d370536e6cd","tarball":"https://registry.npmjs.org/@andufratu/ngx-custom-validators/-/ngx-custom-validators-12.0.1.tgz","fileCount":130,"unpackedSize":565342,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDBzV5WNhX6hnYhF41T8Lf7bJyMNWdpcgIZwA0xdXd5QAiEA/75zpffLlEPFy9cMtfaEL9fylXvEu6cgtRzINQhAa5g="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimHMtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpdfA//bWyAcqF16yzYHJmBkqVcSZwCyufwo/zMFXdrw9KgXUPyXt7l\r\nzhJBwcPjMBUOrgZbqO6e64DaN6YANVTR26HiT7ACjua3q3F1JMOdEyHe3y2O\r\nth2Ml3MSCgej5c6KnM7hVi5ayFCE5xWLf3w2nINpiUFMrlIw+Z2mgVS7jhIy\r\nfaDYodtA4kdXf1xk47FY9TX9IQt/B6h0sbMsx/CyDl04EOaw2nlFxp1P3wTI\r\nbGJPPZbXu372dLCl6S9mumdsaKGqF1PRhPomk/IXMViKDjQK+2vEy8n41rKy\r\nCVn8Rp17OdctezbkPobfGJnwsi7t97i3kTS9eSGMmE6YFcRWPg0PgEkgDSm7\r\nSS7zP0wKhuDULTZCNXwmUqaIPUAZ+JcuHxQnoiJTPBJ5MsdnQOBYpo3Hu5pt\r\nOaJHcEmRsHgXOs2wgrc9DcbrCYN94MBDQk4Xa547tTZSsBSaQ3oEqYAmlRWR\r\nTtH8s5P1F8RlBROTePmBkldAeqhY5HAB2tvjwlXOVp73km+e0BFLznHdhr50\r\ne2Mpe/ZryFlTO1SzWTm/kUBUpiu/yKeCH3lnVkiaRsxzhAhzSLVI82je9Kdp\r\n40VSteBIBSHJUMGz90A1DUBLFUG8GyQLsucMqjbkDoqJs7Acf5RJrLMDm74T\r\nCG7dqCvk6HBtGulqfJIZcr5M7yAqkr3w1h0=\r\n=p/OL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"andufratu","email":"andu@fratu.ro"},"directories":{},"maintainers":[{"name":"andufratu","email":"andu@fratu.ro"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ngx-custom-validators_12.0.1_1654158125489_0.8461912661727404"},"_hasShrinkwrap":false}},"time":{"created":"2022-02-08T11:09:37.176Z","11.0.1":"2022-02-08T11:09:37.383Z","modified":"2022-06-02T08:22:05.765Z","12.0.0":"2022-02-08T11:11:14.685Z","12.0.1":"2022-06-02T08:22:05.702Z"},"maintainers":[{"name":"andufratu","email":"andu@fratu.ro"}],"description":"Angular custom directives for validation","homepage":"https://github.com/andufratu/ngx-custom-validators#readme","keywords":["angular","angular 10","directive","reactive","template","forms","validate","validation","validators","custom"],"repository":{"type":"git","url":"git+https://github.com/andufratu/ngx-custom-validators.git"},"author":{"name":"Ralf Saenen","email":"ralf.saenen@gmail.com"},"bugs":{"url":"https://github.com/andufratu/ngx-custom-validators/issues"},"license":"MIT","readme":"# Description\n\nAngular Custom Validators, forked from [ng2-validation](https://github.com/yuyang041060120/ng2-validation).\nDirectives for form validation (template or model driven).\n\n# Installation\n\n```bash\nnpm i ngx-custom-validators --save\n```\n\n# Validators\n\n## Angular built-in validators\n\n- maxlength\n- minlength\n- pattern\n- required\n\n## Custom validators\n\n- array length\n- base64\n- credit card\n- date\n- date ISO\n- digits\n- email\n- equal\n- included in\n- not included in\n- not equal\n- equal to\n- not equal to\n- greater than\n- greater than or equal\n- json\n- less than\n- less than or equal\n- max\n- max date\n- min\n- min date\n- not equal\n- not equal to\n- number\n- property\n- range\n- range length\n- url\n- uuid\n\n# Usage\n\nThe paramater of each validator (if it has) can be accessible in the template with `reason`.\n```html\n<input type=\"number\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [gt]=\"10\">\n<!-- Will display : error message and must be greater than 10 -->\n<p *ngIf=\"field.errors?.gt\">error message and must be greater than {{ field.errors?.reason }}</p>\n``` \n\n## Template driven\n\nimport `FormsModule` and `CustomFormsModule` in *app.module.ts*\n\n```typescript\nimport { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { CustomFormsModule } from 'ngx-custom-validators';\n\nimport { AppComponent } from './app.component';\n\n@NgModule({\n    imports: [BrowserModule, FormsModule, CustomFormsModule],\n    declarations: [AppComponent],\n    bootstrap: [AppComponent]\n})\nexport class AppModule {\n}\n```\n\n### range length - rangeLength\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [rangeLength]=\"[5, 9]\">\n<p *ngIf=\"field.errors?.rangeLength\">error message</p>\n```\n\n### min\n\n```html\n<input type=\"number\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [min]=\"10\">\n<p *ngIf=\"field.errors?.min\">error message</p>\n```\n\n### greater than - gt\n\n```html\n<input type=\"number\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [gt]=\"10\">\n<p *ngIf=\"field.errors?.gt\">error message</p>\n```\n\n### greater than or equal - gte\n\n```html\n<input type=\"number\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [gte]=\"10\">\n<p *ngIf=\"field.errors?.gte\">error message</p>\n```\n\n### max\n\n```html\n<input type=\"number\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [max]=\"20\">\n<p *ngIf=\"field.errors?.max\">error message</p>\n```\n\n### less than - lt\n\n```html\n<input type=\"number\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [lt]=\"20\">\n<p *ngIf=\"field.errors?.lt\">error message</p>\n```\n\n### less than or equal - lte\n\n```html\n<input type=\"number\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [lte]=\"20\">\n<p *ngIf=\"field.errors?.lte\">error message</p>\n```\n\n### range\n\n```html\n<input type=\"number\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [range]=\"[10, 20]\">\n<p *ngIf=\"field.errors?.range\">error message</p>\n```\n\n### digits\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" digits>\n<p *ngIf=\"field.errors?.digits\">error message</p>\n```\n\n### number\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" number>\n<p *ngIf=\"field.errors?.number\">error message</p>\n```\n\n### url\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" url>\n<p *ngIf=\"field.errors?.url\">error message</p>\n```\n\n### email\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" ngvemail>\n<p *ngIf=\"field.errors?.email\">error message</p>\n```\n\n### date\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" date>\n<p *ngIf=\"field.errors?.date\">error message</p>\n```\n\n### min date - minDate\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" minDate=\"2016-09-09\">\n<p *ngIf=\"field.errors?.minDate\">error message</p>\n```\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [minDate]=\"myOtherField\">\n<p *ngIf=\"field.errors?.minDate\">error message</p>\n```\n\n### max date - maxDate\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" maxDate=\"2016-09-09\">\n<p *ngIf=\"field.errors?.maxDate\">error message</p>\n```\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [maxDate]=\"myOtherField\">\n<p *ngIf=\"field.errors?.maxDate\">error message</p>\n```\n\n### date ISO - dateISO\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" dateISO>\n<p *ngIf=\"field.errors?.dateISO\">error message</p>\n```\n\n### credit card - creditCard\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" creditCard>\n<p *ngIf=\"field.errors?.creditCard\">error message</p>\n```\n\n### json\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" json>\n<p *ngIf=\"field.errors?.json\">error message</p>\n```\n\n### base64\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" base64>\n<p *ngIf=\"field.errors?.base64\">error message</p>\n```\n\n### uuid\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [uuid]=\"'all'\">\n<p *ngIf=\"field.errors?.uuid\">error message</p>\n```\n\n*default*: all\n\n**support**\n\n- 3\n- 4\n- 5\n- all\n\n### equal\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [equal]=\"'xxx'\">\n<p *ngIf=\"field.errors?.equal\">error message</p>\n```\n\n### not equal - notEqual\n\n```html\n<input type=\"text\" [(ngModel)]=\"model.field\" name=\"field\" #field=\"ngModel\" [notEqual]=\"'xxx'\">\n<p *ngIf=\"field.errors?.notEqual\">error message</p>\n```\n\n### equal to - equalTo\n\n```html\n<input type=\"password\" ngModel name=\"password\" #password=\"ngModel\" required>\n<p *ngIf=\"password.errors?.required\">required error</p>\n<input type=\"password\" ngModel name=\"certainPassword\" #certainPassword=\"ngModel\" [equalTo]=\"password\">\n<p *ngIf=\"certainPassword.errors?.equalTo\">equalTo error</p>\n```\n\n### not equal to - notEqualTo\n\n```html\n<input type=\"text\" ngModel name=\"password\" #password=\"ngModel\" required>\n<p *ngIf=\"password.errors?.required\">required error</p>\n<input type=\"password\" ngModel name=\"certainPassword\" #certainPassword=\"ngModel\" [notEqualTo]=\"password\">\n<p *ngIf=\"certainPassword.errors?.equalTo\">equalTo error</p>\n```\n\n### property\n\n```typescript\npublic obj = { id: 1 } // OK\npublic obj = { name: 'baguette' } // KO\n```\n\n```html\n<input type=\"text\" ngModel name=\"obj\" #obj=\"ngModel\" property=\"id\">\n<!-- For multiple properties check -->\n<input type=\"text\" ngModel name=\"obj\" #obj=\"ngModel\" property=\"id,value,name\">\n<p *ngIf=\"obj.errors?.property\">property error</p>\n```\n\n### array length - ArrayLength\n```typescript\npublic arr = [{ name: 'baguette' }, { name: 'croisant' }] // OK\npublic arr = [{ name: 'baguette' }] // KO\n```\n\n```html\n<input type=\"text\" ngModel name=\"arr\" #arr=\"ngModel\" arrayLength=\"2\">\n<p *ngIf=\"arr.errors?.arrayLength\">arrayLength error</p>\n```\n\n## Model driven\n\nimport `ReactiveFormsModule` in *app.module.ts*\n\n```typescript\nimport { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { AppComponent } from './app.component';\n\n@NgModule({\n    imports: [BrowserModule, ReactiveFormsModule],\n    declarations: [AppComponent],\n    bootstrap: [AppComponent]\n})\nexport class AppModule {\n}\n```\n\nimport `CustomValidators` in *app.component.ts*\n\n```typescript\nimport { Component } from '@angular/core';\nimport { FormGroup, FormControl } from '@angular/forms';\nimport { CustomValidators } from 'ngx-custom-validators';\n\n@Component({\n    selector: 'app',\n    template: require('./app.html')\n})\nexport class AppComponent {\n    form: FormGroup;\n\n    constructor() {\n        this.form = new FormGroup({\n            field: new FormControl('', CustomValidators.range([5, 9]))\n        });\n    }\n}\n```\n\n```html\n<input type=\"text\" formControlName=\"field\">\n<p *ngIf=\"demoForm.from.controls.field.errors?.rangeLength\">error message</p>\n```\n\n### range length - rangeLenght\n\n```typescript\nnew FormControl('', CustomValidators.rangeLength([5, 9]))\n```\n\n### min\n\n```typescript\nnew FormControl('', CustomValidators.min(10))\n```\n\n### greater than - gt\n\n```typescript\nnew FormControl('', CustomValidators.gt(10))\n```\n\n### max\n\n```typescript\nnew FormControl('', CustomValidators.max(20))\n```\n\n### less than - lt\n\n```typescript\nnew FormControl('', CustomValidators.lt(20))\n```\n\n### range\n\n```typescript\nnew FormControl('', CustomValidators.range([10, 20]))\n```\n\n### digits\n\n```typescript\nnew FormControl('', CustomValidators.digits)\n```\n\n### number\n\n```typescript\nnew FormControl('', CustomValidators.number)\n```\n\n### url\n\n```typescript\nnew FormControl('', CustomValidators.url)\n```\n\n### email\n\n```typescript\nnew FormControl('', CustomValidators.email)\n```\n\n### date\n\n```typescript\nnew FormControl('', CustomValidators.date)\n```\n\n### min date - minDate\n\n```typescript\nnew FormControl('', CustomValidators.minDate('2016-09-09'))\n```\n\n### max date - maxDate\n\n```typescript\nnew FormControl('', CustomValidators.maxDate('2016-09-09'))\n```\n\n### date ISO - dateISO\n\n```typescript\nnew FormControl('', CustomValidators.dateISO)\n```\n\n### credit card - creditCard\n\n```typescript\nnew FormControl('', CustomValidators.creditCard)\n```\n\n### json\n\n```typescript\nnew FormControl('', CustomValidators.json)\n```\n\n### base64\n\n```typescript\nnew FormControl('', CustomValidators.base64)\n```\n\n### uuid\n\n```typescript\nnew FormControl('', CustomValidators.uuid('3'))\n```\n\n### equal\n\n```typescript\nnew FormControl('', CustomValidators.equal('xxx'))\n```\n\n### not equal - notEqual\n\n```typescript\nnew FormControl('', CustomValidators.notEqual('xxx'))\n```\n\n### equal to - equalTo\n\n```typescript\nlet password = new FormControl('', Validators.required);\nlet certainPassword = new FormControl('', CustomValidators.equalTo(password));\n\nthis.form = new FormGroup({\n  password: password,\n  certainPassword: certainPassword\n});\n```\n\n```html\n<form [formGroup]=\"form\">\n  <input type=\"password\" formControlName=\"password\">\n  <p *ngIf=\"form.controls.password.errors?.required\">required error</p>\n  <input type=\"password\" formControlName=\"certainPassword\">\n  <p *ngIf=\"form.controls.certainPassword.errors?.equalTo\">equalTo error</p>\n</form>\n```\n\n### not equal to - notEqualTo\n\n```typescript\nlet password = new FormControl('', Validators.required);\nlet certainPassword = new FormControl('', CustomValidators.notEqualTo(password));\n\nthis.form = new FormGroup({\n  password: password,\n  certainPassword: certainPassword\n});\n```\n\n```html\n<form [formGroup]=\"form\">\n  <input type=\"password\" formControlName=\"password\">\n  <p *ngIf=\"form.controls.password.errors?.required\">required error</p>\n  <input type=\"password\" formControlName=\"certainPassword\">\n  <p *ngIf=\"form.controls.certainPassword.errors?.notEqualTo\">notEqualTo error</p>\n</form>\n```\n\n### property\n```typescript\npublic obj = { id: 1 };\n\nthis.form = new FormGroup({\n  obj: new FormControl('', CustomValidators.property('id'))\n  // For multiple properties check\n  obj: new FormControl('', CustomValidators.property('id,value,name'))\n});\n```\n\n```html\n<form [formGroup]=\"form\">\n  <input type=\"text\" formControlName=\"obj\">\n  <p *ngIf=\"form.controls.obj.errors?.property\">property error</p>\n</form>\n```\n\n### array length - ArrayLength\n```typescript\npublic arr = [{ name: 'baguette' }, { name: 'croisant' }]\nthis.form = new FormGroup({\n  arr: new FormControl('', CustomValidators.arrayLength(2))\n});\n```\n\n```html\n<form [formGroup]=\"form\">\n  <input type=\"text\" formControlName=\"arr\">\n  <p *ngIf=\"arr.errors?.arrayLength\">arrayLength error</p>\n</form>\n```\n\n### included in array - includedIn\n```typescript\npublic arr = [{ name: 'baguette' }, { name: 'croisant' }]\nthis.form = new FormGroup({\n  arr: new FormControl('bread', CustomValidators.includedIn(arr))\n});\n```\n\n```html\n<form [formGroup]=\"form\">\n  <input type=\"text\" formControlName=\"arr\">\n  <p *ngIf=\"arr.errors?.includedIn\">includedIn error</p>\n</form>\n```\n\n### not included in array - notIncludedIn\n```typescript\npublic arr = [{ name: 'baguette' }, { name: 'croisant' }]\nthis.form = new FormGroup({\n  arr: new FormControl('baguette', CustomValidators.notIncludedIn(arr))\n});\n```\n\n```html\n<form [formGroup]=\"form\">\n  <input type=\"text\" formControlName=\"arr\">\n  <p *ngIf=\"arr.errors?.notIncludedIn\">notIncludedIn error</p>\n</form>\n```\n\n### not matching a regular expression - notMatching (negate pattern)\n```typescript\npublic pattern = /a+bc/\nthis.form = new FormGroup({\n  p: new FormControl('aabc', CustomValidators.notIncludedIn(pattern))\n});\n```\n\n```html\n<form [formGroup]=\"form\">\n  <input type=\"text\" formControlName=\"p\">\n  <p *ngIf=\"arr.errors?.notMatching\">notMatching error</p>\n</form>\n```\n\n# For developpers\nTo run the projet : `npm start`\nDon't forget to run `npm test` and `npm lint` before each pull request. Thanks !\n","readmeFilename":"README.md"}