{"id":18069221,"url":"https://github.com/dliocode/datavalidator","last_synced_at":"2025-04-11T23:43:57.574Z","repository":{"id":47776919,"uuid":"363913147","full_name":"dliocode/datavalidator","owner":"dliocode","description":"DataValidator foi projetado para ser uma biblioteca simples de validação de dados.","archived":false,"fork":false,"pushed_at":"2023-04-21T19:48:19.000Z","size":314,"stargazers_count":52,"open_issues_count":1,"forks_count":14,"subscribers_count":5,"default_branch":"v2","last_synced_at":"2025-03-25T19:41:36.673Z","etag":null,"topics":["contains","customvalue","datavalidator","delphi","endswith","isalpha","isalphanumeric","isascii","isbase32","isbase58","isbase64","isbetween","isphone","json","pascal","validator"],"latest_commit_sha":null,"homepage":"","language":"Pascal","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dliocode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-03T11:53:32.000Z","updated_at":"2024-11-17T10:30:57.000Z","dependencies_parsed_at":"2023-02-01T09:01:38.947Z","dependency_job_id":null,"html_url":"https://github.com/dliocode/datavalidator","commit_stats":null,"previous_names":[],"tags_count":39,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fdatavalidator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fdatavalidator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fdatavalidator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fdatavalidator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dliocode","download_url":"https://codeload.github.com/dliocode/datavalidator/tar.gz/refs/heads/v2","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248497894,"owners_count":21113983,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["contains","customvalue","datavalidator","delphi","endswith","isalpha","isalphanumeric","isascii","isbase32","isbase58","isbase64","isbetween","isphone","json","pascal","validator"],"created_at":"2024-10-31T08:09:38.118Z","updated_at":"2025-04-11T23:43:57.550Z","avatar_url":"https://github.com/dliocode.png","language":"Pascal","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://user-images.githubusercontent.com/54585337/123715878-a52ae580-d84f-11eb-9d2d-32a98aaac5d8.png\"\u003e\n    \u003cimg alt=\"DataValidator\" src=\"https://user-images.githubusercontent.com/54585337/123715878-a52ae580-d84f-11eb-9d2d-32a98aaac5d8.png\"\u003e\n  \u003c/a\u003e  \n\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e \n  \u003cimg src=\"https://img.shields.io/github/v/release/dliocode/datavalidator?style=flat-square\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/dliocode/datavalidator?style=flat-square\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/forks/dliocode/datavalidator?style=flat-square\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/contributors/dliocode/datavalidator?color=orange\u0026style=flat-square\"\u003e\n  \u003cimg src=\"https://tokei.rs/b1/github/dliocode/datavalidator?color=red\u0026category=lines\"\u003e\n  \u003cimg src=\"https://tokei.rs/b1/github/dliocode/datavalidator?color=green\u0026category=code\"\u003e\n  \u003cimg src=\"https://tokei.rs/b1/github/dliocode/datavalidator?color=yellow\u0026category=files\"\u003e\n\u003c/p\u003e\n\n# DataValidator\n\nDataValidator foi projetado para ser uma biblioteca simples de validação de dados.\n\nSupport: developer.dlio@gmail.com\n\n## Instalação\n\n#### Para instalar em seu projeto usando [boss](https://github.com/HashLoad/boss):\n```sh\n$ boss install github.com/dliocode/datavalidator\n```\n\n#### Instalação Manual\n\nAdicione as seguintes pastas ao seu projeto, em *Project \u003e Options \u003e Delphi Compiler \u003e Search path*\n\n```\n../datavalidator/src/core\n../datavalidator/src/sanitializators\n../datavalidator/src/validators\n```\n\n#### Samples\n  * Veja alguns exemplos: [samples](https://github.com/dliocode/datavalidator/tree/v2/samples)\n\n\n## Como usar\n\n#### **Uses necessária**\n\n```\nuses DataValidator;\n``` \n\n#### **Tipos de Validação**\n\n* Values\n* JSON \n\n## Values\n\n- No modo values, o valor informado no **_validate_** é o que será analisado! \n\n```\nvar\n  LResult: IDataValidatorResult;\nbegin\n  LResult :=  \n\n  TDataValidator.Values\n\n  .Validate('APELIDO')\n      .Trim\n      .\u0026Not.IsEmpty.WithMessage('Você não informou o seu apelido!')\n      .IsAlpha(TDataValidatorLocaleLanguage.tl_pt_BR).WithMessage('Seu apelido deve conter apenas letras!')\n      .IsLength(1, 10).WithMessage('O apelido deve ter no máximo 10 caracteres!')\n  .\u0026End\n\n  .Validate('developer.dlio@gmail.com')\n      .Trim\n      .\u0026Not.IsEmpty.WithMessage('Você não informou o seu e-mail!')\n      .IsEmail.WithMessage('Não é um e-mail válido!')\n      .NormalizeEmail\n  .\u0026End\n\n  .Check;  \n```\n\n## JSON\n\n- No modo JSON, o que deve ser informado **_validate_** é o nome da key do json! \n- Caso seja utilizado algum **_sanitizer_**, o valor dentro do JSON será modificado!\n\n```\nvar\n  LJO: TJSONObject;\n  LResult: IDataValidatorResult;\nbegin\n  LJO := TJSONObject.ParseJSONValue('{\"apelido\":\"DLIO\", \"email\":\"developer.dlio@gmail.com\"}') as TJSONObject;\n\n  LResult :=  \n\n    TDataValidator.JSON(AJO)\n\n    .Validate('apelido')\n      .Value\n        .Trim\n        .\u0026Not.IsEmpty.WithMessage('Você não informou o seu apelido!')\n        .IsAlpha(TDataValidatorLocaleLanguage.tl_pt_BR).WithMessage('Seu apelido deve conter apenas letras!')\n        .IsLength(1, 10).WithMessage('O apelido deve ter no máximo 10 caracteres!')\n      .\u0026End        \n    .\u0026End\n\n    .Validate('email')\n      .Value\n        .Trim\n        .\u0026Not.IsEmpty.WithMessage('Você não informou o seu e-mail!')\n        .IsEmail.WithMessage('Não é um e-mail válido!')\n        .NormalizeEmail\n      .\u0026End      \n    .\u0026End\n\n    .Validate('login')\n      .Key // Faz a validação somente da key\n        .IsRequired.WithMessage('É obrigatório ter a Key \"login\" no JSON.')\n      .\u0026End\n\n      .Value // Faz a validação somente do valor dentro da Key 'login'\n        .Trim\n        .\u0026Not.IsEmpty.WithMessage('Você não informou o login!')\n        .IsAlpha(TDataValidatorLocaleLanguage.tl_pt_BR).WithMessage('Seu login deve conter apenas letras!')\n        .IsLength(1, 10).WithMessage('O login deve ter no máximo 10 caracteres!')\n      .\u0026End      \n    .\u0026End\n\n    .Validate('nome')\n      .Key\n        .IsOptionalKey // É opcional - se existir a Key \"nome\" ele faz a validação\n      .\u0026End  \n\n      .Value      \n        .Trim\n        .\u0026Not.IsEmpty.WithMessage('Você não informou o nome!')\n        .IsAlpha(TDataValidatorLocaleLanguage.tl_pt_BR).WithMessage('Seu nome deve conter apenas letras!')\n        .IsLength(1, 10).WithMessage('O nome deve ter no máximo 10 caracteres!')\n      .\u0026End      \n    .\u0026End\n\n    .CheckAll;\n```\n## Informações\n\n### Diferença de Check e CheckAll\n- **Check**: Faz a verificação de todos os **_validate_**, mas se houver um item com retorno **_false_** ele interrompe, retornando uma única mensagem com erro se tiver!\n\n- **CheckAll**: Faz a verificação de todos os **_validate_**, retornando todas mensagens com erro se tiver! \u003cbr\u003e \n\nUsando o ``` CheckAll(TDataValidatorCheckAll.tcFirst) ``` ele retornar apenas a primeira mensagem de erro de cada **_validate_**.\n\n### Como saber se houve error\n\n```\n    Result := LResult.Ok; // True = Nenhum erro | False = Tem erro\n```\n\n### Como recuperar a mensagem com erro\n```\n    Result := LResult.Informations.Message;\n```\n\n### Como recuperar uma única mensagem de error\n```\n    Result := LResult.Informations.GetItem(0).Message;\n```\n\n### Como recuperar a quantidade de errors\n```\n    Result := LResult.Informations.Count;\n```\n\n### Como recuperar o valor analizado\n```\n    Result := LResult.Values[0]; // Recupera o primeiro valor\n```\n\n### **Validação Schema**\n- É uma forma de criar um esqueleto de validação e conseguir reutilizar em outras validações.\n\n```\nfunction SchemaNome(const AField: string): IDataValidatorSchemaContext;\nbegin\n  Result :=\n  TDataValidator.Schema\n    .Validate\n      .Trim\n      .\u0026Not.IsEmpty.WithMessage('Preencha o campo %s !', [AField]) // Não pode ser vazio\n      .IsLength(2, 10).WithMessage('O campo %s deve conter entre 2 a 10 caracteres!', [AField])\n      .IsAlpha(TDataValidatorLocaleLanguage.tl_pt_BR).WithMessage('O campo %s possui caracteres inválidos!', [AField])\n    .\u0026End;\nend;\n\nfunction SchemaEmail(const AField: string): IDataValidatorSchemaContext;\nbegin\n  Result :=\n  TDataValidator.Schema\n    .Validate\n      .Trim\n      .\u0026Not.IsEmpty.WithMessage('O %s não pode ser vazio!',[AField])\n      .IsLength(2, 999).WithMessage('O campo %s deve ter mais de 6 caracteres!', [AField])\n      .IsEmail.WithMessage('Não é um %s válido!',[AField])\n      .NormalizeEmail\n    .\u0026End;\nend;\n\nbegin\n  TDataValidator.Values\n\n  .Validate(ANome)\n    .AddSchema(SchemaNome('Nome'))\n  .\u0026End\n\n  .Validate(AApelido)\n    .AddSchema(SchemaNome('Apelido'))\n    .IsUppercase.WithMessage('O apelido (${value}) deve ser digitado tudo em maiúscula!') // Add outra validação    \n  .\u0026End\n\n  .Validate(AEmail)\n    .AddSchema(SchemaEmail('E-mail'))\n  .\u0026End\n\n  .Validate(AEmailConfirmacao)\n    .AddSchema(SchemaEmail('E-mail de confirmação'))\n  .\u0026End\n\n  .CheckAll;  \nend.\n```\n\n#### Sanitizers\n\n- **_Sanitizer_** é o tratamento de um valor. \n\n- Exemplo: Sanitizers MD5: Pega o valor do **_validate_** e converte para MD5\n\n```\nTDataValidator.Values\n\n  .Validate('APELIDO')\n    .ToMD5\n  .\u0026End\n```\n\n#### Validators Especiais\n\n| Nome | Informação |\n| ------------ | ------------ |\n| Not | Quando usado esse validador, ele nega o resultado do validador. \u003cbr\u003e Ex: **Validate('email').\u0026Not.IsEmpty** \u003cbr\u003e Se entende que o valor não deve ser vazio.|\n| Execute | Define o que deve ser executado se aquele **_validate_** não passar na validação. A execução dessa procedure é forma manual. \u003cbr\u003e Ex: \u003cbr\u003e CheckAll.Informations.GetItem(0).OnExecute;|\n| WithMessage | Define a mensagem do error. \u003cbr\u003e Para adicionar na mensagem o valor validado, basta adicionar a tag **\\${value}**. \u003cbr\u003e Ex: **IsEmail.WithMessage('E-mail \\${value} está inválido!')**. ```output: E-mail null@@null está inválido! ```  |\n\n## Validators / Sanitizers\n\n| Validação para values | Validação JSON (Key/Value) | Sanitizers para values | \n| ------------ | ------------ | ------------ | \n| CustomValue | (Key) IsOptional | CustomSanitizer | \n| Contains | (Key) IsRequired | NormalizeEmail | \n| EndsWith | (Value) CustomJSONValue | OnlyNumbers | \n| IsAlpha | (Value) IsJSONNull | RemoveAccents | \n| IsAlphaNumeric | (Value) IsJSONBoolean | Replace | \n| IsAscii | (Value) IsJSONNumeric | ToBase64Decode | \n| IsBase32 | (Value) IsJSONString | ToBase64Encode | \n| IsBase58 | (Value) MinItems | ToDate | \n| IsBase64 | (Value) MaxItems | ToDateTime | \n| IsBetween | (Value) + Validação para values | ToHTMLDecode | \n| IsBoolean | | ToHTMLEncode | \n| IsBTCAddress | | ToInteger | \n| IsCNPJ | | ToLowerCase | \n| IsCPF | | ToMD5 | \n| IsCPFCNPJ | | ToNumeric | \n| IsDate | | ToTime | \n| IsDateBetween | | ToUpperCase | \n| IsDateEquals | | ToURLDecode | \n| IsDateGreaterThan | | ToURLEncode | \n| IsDateLessThan | | Trim | \n| IsDateTime | | TrimLeft | \n| IsEmail | | TrimRight | \n| IsEmpty | | | \n| IsEquals | | | \n| IsEthereumAddress | | | \n| IsGreaterThan | | | \n| IsGTIN | | | \n| IsGTIN8 | | | \n| IsGTIN12 | | | \n| IsGTIN13 | | | \n| IsGTIN14 | | | \n| IsHexadecimal | | | \n| IsHexColor | | | \n| IsInteger | | | \n| IsIP | | | \n| IsIPv4 | | | \n| IsIPv6 | | | \n| IsISO8601 | | | \n| IsJSON | | | \n| IsJSONArray | | | \n| IsJSONObject | | | \n| IsJWT | | | \n| IsLatLong | | | \n| IsLength | | | \n| IsLessThan | | | \n| IsLocale | | | \n| IsLowercase | | | \n| IsMACAddress | | | \n| IsMagnetURI | | | \n| IsMD5 | | | \n| IsMimeType | | | \n| IsMongoId | | | \n| IsNegative | | | \n| IsNumeric | | | \n| IsOptional | | | \n| IsOctal | | | \n| IsPassportNumber | | | \n| IsPhoneNumber | | | \n| IsPort | | | \n| IsPositive | | | \n| IsPostalCode | | | \n| IsRGBColor | | | \n| IsSSN | | | \n| IsTime | | | \n| IsTimeBetween | | | \n| IsTimeEquals | | | \n| IsTimeGreaterThan | | | \n| IsTimeLessThan | | | \n| IsUppercase | | | \n| IsURL | | | \n| IsUUID | | | \n| IsUUIDv1 | | | \n| IsUUIDv2 | | | \n| IsUUIDv3 | | | \n| IsUUIDv4 | | | \n| IsUUIDv5 | | | \n| IsZero | | | \n| RegexIsMatch | | | \n| StartsWith | | | \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdliocode%2Fdatavalidator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdliocode%2Fdatavalidator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdliocode%2Fdatavalidator/lists"}