@gdimx/ngx-input-validator
Version:
Libreriía de validaciones reutilizables para formularios en angular
273 lines (211 loc) • 6.56 kB
Markdown
# NgxInputValidator
Utilidades de validación **sin dependencias** para Angular: validadores sincrónicos reutilizables (RFC, CURP, email, solo letras, alfanumérico, etc.), más utilidades para **mensajes de error centralizados**.
> Compatible con **Reactive Forms** y usable en **Template-Driven Forms** (con funciones personalizadas).
## Características
- Validadores listos para usar (`required`, `email`, `alpha`, `alphaNumeric`, `numeric`, `decimal`, `rfc`, `curp`, etc.)
- Validadores **parametrizables** (`minLength`, `maxLength`, `allowedCharacters`, `disallowedCharacters`)
- Funciones auxiliares para **mensajes de error** por control (`getErrorMessage`) y **resumen del formulario** (`getAllFormErrors`)
- Reglas de mayúsculas/minúsculas y espacios (`onlyUppercase`, `onlyLowercase`, `noSpaces`)
- Expresiones para **RFC** y **CURP** (incluye XEXX y `NE`)
## Instalación
1. Coloca el archivo `NgxInputValidator.ts` en tu proyecto, por ejemplo:
```
npm i @gdimx/ngx-input-validator
```
2. Importa la clase donde la necesites:
```ts
import { NgxInputValidator } from 'node_modules/@gdimx/NgxInputValidator';
```
> No requiere providers ni módulos adicionales.
## Uso en Reactive Forms
```ts
import { Component } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { NgxInputValidator } from 'src/app/shared/validators/NgxInputValidator';
@Component({
selector: 'app-demo',
templateUrl: './demo.component.html'
})
export class DemoComponent {
form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
nombre: ['', [
NgxInputValidator.required,
NgxInputValidator.alpha,
NgxInputValidator.minLength(3),
NgxInputValidator.maxLength(60),
]],
correo: ['', [NgxInputValidator.required, NgxInputValidator.email]],
rfc: ['', [NgxInputValidator.rfc]],
curp: ['', [NgxInputValidator.curp]],
codigo: ['', [
NgxInputValidator.allowedCharacters(/^[A-Z0-9-]*$/),
NgxInputValidator.onlyUppercase
]],
cantidad: ['', [NgxInputValidator.decimal]]
});
}
getError(ctrlName: string): string {
const ctrl = this.form.get(ctrlName);
return NgxInputValidator.getErrorMessage(ctrl);
}
}
```
**Template (Angular Material):**
```html
<mat-form-field appearance="outline">
<mat-label>Correo</mat-label>
<input matInput formControlName="correo" />
<mat-error *ngIf="form.get('correo')?.invalid">
{{ getError('correo') }}
</mat-error>
</mat-form-field>
```
## Ejemplos de Cada Validador
### 1. `required`
```ts
this.fb.control('', [NgxInputValidator.required]);
```
`''` → error `{ required: true }` → No válido
`'texto'` → válido
### 2. `email`
```ts
this.fb.control('', [NgxInputValidator.email]);
```
`'correo@'` → `{ email: true }` → No válido
`'test@mail.com'` → válido
### 3. `alpha`
```ts
this.fb.control('', [NgxInputValidator.alpha]);
```
`'123'` → `{ alpha: true }` → No válido
`'José Pérez'` → válido
### 4. `alphaNumeric`
```ts
this.fb.control('', [NgxInputValidator.alphaNumeric]);
```
`'abc@123'` → `{ alphaNumeric: true }` → No válido
`'abc123'` → válido
### 5. `numeric`
```ts
this.fb.control('', [NgxInputValidator.numeric]);
```
`'12a'` → `{ numeric: true }` → No válido
`'12345'` → válido
### 6. `decimal`
```ts
this.fb.control('', [NgxInputValidator.decimal]);
```
`'abc'` → `{ decimal: true }` → No válido
`'123.45'` → válido
### 7. `minLength` y `maxLength`
```ts
this.fb.control('', [NgxInputValidator.minLength(3), NgxInputValidator.maxLength(5)]);
```
`'ab'` → `{ minLength: { requiredLength: 3 } }` → No válido
`'abcdef'` → `{ maxLength: { requiredLength: 5 } }` → No válido
`'abcd'` → válido
### 8. `allowedCharacters`
```ts
this.fb.control('', [NgxInputValidator.allowedCharacters(/^[A-Z0-9-]*$/)]);
```
`'abc'` → `{ invalidCharacters: true }` → No válido
`'ABC-123'` → válido
### 9. `disallowedCharacters`
```ts
this.fb.control('', [NgxInputValidator.disallowedCharacters(/[!@#$%^&*]/)]);
```
`'clave@123'` → `{ forbiddenCharacters: true }` → No válido
`'clave123'` → válido
### 10. `noSpaces`
```ts
this.fb.control('', [NgxInputValidator.noSpaces]);
```
`'con espacio'` → `{ noSpaces: true }` → No válido
`'sin_espacio'` → válido
### 11. `onlyUppercase`
```ts
this.fb.control('', [NgxInputValidator.onlyUppercase]);
```
`'abc'` → `{ onlyUppercase: true }` → No válido
`'ABC123'` → válido
### 12. `onlyLowercase`
```ts
this.fb.control('', [NgxInputValidator.onlyLowercase]);
```
`'ABC'` → `{ onlyLowercase: true }` → No válido
`'abc123'` → válido
### 13. `rfc`
```ts
this.fb.control('', [NgxInputValidator.rfc]);
```
`'X'` → `{ rfc: true }` → No válido
`'ABC010101XXX'` → válido
### 14. `curp`
```ts
this.fb.control('', [NgxInputValidator.curp]);
```
`'Z'` → `{ curp: true }` → No válido
`'CUPU800825HDFABC09'` → válido
`'XEXX010101HNEXXXA4'` → válido (extranjeros)
## Mensajes de Error
### Por control
```ts
NgxInputValidator.getErrorMessage(control: AbstractControl): string
```
### De todo el formulario
```ts
NgxInputValidator.getAllFormErrors(form: FormGroup): string
```
Ejemplo:
```ts
const resumen = NgxInputValidator.getAllFormErrors(this.form);
alert(resumen);
```
Salida:
```
• Este campo es obligatorio
• RFC inválido
```
## Pruebas Unitarias (Jasmine + Karma)
```ts
import { NgxInputValidator } from './NgxInputValidator';
describe('NgxInputValidator', () => {
const c = (v: any) => ({ value: v });
it('valida required', () => {
expect(NgxInputValidator.required(c('texto'))).toBeNull();
expect(NgxInputValidator.required(c(''))).toEqual({ required: true });
});
it('valida email', () => {
expect(NgxInputValidator.email(c('a@b.com'))).toBeNull();
expect(NgxInputValidator.email(c('mal'))).toEqual({ email: true });
});
it('valida RFC', () => {
expect(NgxInputValidator.rfc(c('ABC010101XXX'))).toBeNull();
expect(NgxInputValidator.rfc(c('X'))).toEqual({ rfc: true });
});
});
```
## Licencia
MIT.