1.2.0 • Published 2 months ago

ngx-iban-validator v1.2.0

Weekly downloads
11
License
MIT
Repository
github
Last release
2 months ago

IBAN Validator

IBAN Validator for your web application forms (Angular, React, Vue, ...), comes without any dependencies and can be used as a standalone function in any JS project. It can perform format, digit and length IBAN validations. Currently 108 countries are supported.

Content

Install

npm install ngx-iban-validator --save

Use as a standalone function

You can use validateIBAN function independently from any forms.

Value can be passed as part of object in this case validation flow will be the same as for form validation:

  • If IBAN is valid as result of validation null is returned.

  • If IBAN is invalid and some of the checks fail IBANValidationResult object is returned containing more info about error.

const ibanIsInvalid =
  validateIBAN({
    value: "AL35202111090000000001234567",
  }) !== null;

Value can be passed as a string:

  • For valid and invalid IBAN IBANValidationResult object is returned
const ibanIsInvalid = validateIBAN("AL35202111090000000001234567").ibanInvalid;

NodeJS

const ibanValidator = require("ngx-iban-validator");
const ibanIsInvalid = ibanValidator.validateIBAN(
  "BA393385804800211234"
).ibanInvalid;

Error Response

  • If IBAN is valid as result of validation null is returned.

  • If IBAN is invalid and some of the checks fail IBANValidationResult object is returned containing more info about error.

export interface IBANValidationResult {
  ibanInvalid: boolean;
  error: IBANError;
}

export interface IBANError {
  countryUnsupported: boolean;
  codeLengthInvalid: boolean;
  patternInvalid: boolean;
}

Error object contains more details about validation error. You can display errors easily as with any other validator.

Use as a form validator

Angular

Import validateIBAN function from ngx-iban-validator package into your component file. Add validateIBAN to your form validators array.

import { Component, inject } from "@angular/core";
import { NgIf } from "@angular/common";
import {
  FormBuilder,
  FormGroup,
  ReactiveFormsModule,
  Validators,
} from "@angular/forms";

import { validateIBAN } from "ngx-iban-validator";

@Component({
  selector: "my-app",
  standalone: true,
  imports: [NgIf, ReactiveFormsModule],
  template: `
    <div class="page">
      <form [formGroup]="ibanForm" (ngSubmit)="submit(ibanForm)">
        <h2>NGX IBAN Validator</h2>
        <div>
          <input type="text" formControlName="iban" placeholder="Enter IBAN" />
          <button [disabled]="ibanForm.invalid">Submit</button>
        </div>
        <div class="validation-errors">
          <small
            *ngIf="
                ibanForm.get('iban')?.errors && ibanForm.get('iban')?.errors?.['ibanInvalid']
              "
          >
            <span
              *ngIf="ibanForm.get('iban')?.errors?.['error']['countryUnsupported']"
            >
              Country not supported
            </span>
            <span
              *ngIf="ibanForm.get('iban')?.errors?.['error']['codeLengthInvalid']"
            >
              IBAN Code length is invalid
            </span>
            <span
              *ngIf="ibanForm.get('iban')?.errors?.['error']['patternInvalid']"
            >
              IBAN Code pattern is invalid
            </span>
          </small>
        </div>
      </form>
    </div>
  `,
  styles: [
    `
      .page {
        height: 100vh;
        display: flex;
        justify-content: center;
        align-items: center;
      }
      h2 {
        text-align: center;
      }
      form {
        padding: 20px;
      }
      input {
        padding: 10px;
      }
      button {
        padding: 10px;
      }
      .validation-errors {
        color: red;
      }
    `,
  ],
})
export class App {
  formBuilder = inject(FormBuilder);
  ibanForm = this.formBuilder.group({
    iban: [null, [Validators.required, validateIBAN]],
  });
  submit(form: FormGroup) {
    const { valid, value } = form;
    const { iban } = value;
    if (valid) {
      alert(`IBAN: ${iban}, is valid!`);
    }
  }
}

React

import { useState } from "react";
import {
  IBANError,
  IBANValidationResult,
  validateIBAN,
} from "ngx-iban-validator/dist/iban.validator";

import "./App.css";

function App() {
  const [error, setError] = useState<IBANError | null>(null);

  const validate = (iban: string): boolean => {
    const validation = validateIBAN({
      value: iban,
    });
    if (validation) {
      const { ibanInvalid, error }: IBANValidationResult = validation;
      if (ibanInvalid) {
        setError(error);
        return false;
      } else {
        setError(null);
        return true;
      }
    } else {
      setError(null);
      return true;
    }
  };

  const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
    event.preventDefault();
    const formData = new FormData(event.currentTarget);
    const iban = formData.get("iban") as string;
    const validation = validate(iban);
    if (validation) {
      alert("IBAN is valid");
    } else {
      alert("IBAN is not valid");
    }
  };

  const handleIbanChanged = (event: React.ChangeEvent<HTMLInputElement>) => {
    const { value } = event.target;
    validate(value);
  };

  return (
    <div className="page">
      <form onSubmit={handleSubmit}>
        <h2>NGX IBAN Validator</h2>
        <div>
          <input
            type="text"
            name="iban"
            placeholder="Enter IBAN"
            onChange={handleIbanChanged}
          />
          <button>Submit</button>
        </div>
        <div className="validation-errors">
          <small hidden={!error}>
            <span hidden={!error?.countryUnsupported}>
              Country not supported
            </span>
            <span hidden={!error?.codeLengthInvalid}>
              IBAN Code length is invalid
            </span>
            <span hidden={!error?.patternInvalid}>
              IBAN Code pattern is invalid
            </span>
          </small>
        </div>
      </form>
    </div>
  );
}

export default App;

Demo

Check demo applications for usage examples:

Supported countries

CountryCountry CodeLength
AlbaniaAL28
AlgeriaDZ26
AndorraAD24
AngolaAO25
AustriaAT20
AzerbaijanAZ28
BahrainBH22
BelarusBY28
BelgiumBE16
BeninBJ28
Bosnia and HerzegovinaBA20
BrazilBR29
BulgariaBG22
BurundiBI16
Burkina FasoBF28
CameroonCM27
Cape VerdeCV25
Central African RepublicCF27
ChadTD27
ComorosKM27
CongoCG27
Costa RicaCR22
CroatiaHR21
CyprusCY28
Czech RepublicCZ24
DenmarkDK18
DjiboutiDJ27
Dominican RepublicDO28
EgyptEG29
El SalvadorSV28
Equatorial GuineaGQ27
EstoniaEE20
Falkland IslandsFK18
Faroe IslandsFO18
FinlandFI18
FranceFR27
GabonGA27
GeorgiaGE22
GermanyDE22
GibraltarGI23
GreeceGR27
GreenlandGL18
GuatemalaGT28
Guinea-BissauGW25
VaticanVA22
HondurasHN28
HungaryHU28
IcelandIS26
IranIR26
IraqIQ23
IrelandIE22
IsraelIL23
ItalyIT27
Ivory CoastCI28
JordanJO30
KazakhstanKZ20
KosovoXK20
KuwaitKW30
LatviaLV21
LebanonLB28
LibyaLY25
LiechtensteinLI21
LithuaniaLT20
LuxembourgLU20
MadagascarMG27
MaliML28
MaltaMT31
MauritaniaMR27
MauritiusMU30
MoldovaMD24
MonacoMC27
MongoliaMN20
MontenegroME22
MoroccoMA28
MozambiqueMZ25
NetherlandsNL18
NicaraguaNI32
NigerNE28
North MacedoniaMK19
NorwayNO15
PakistanPK24
PalestinePS29
PolandPL28
PortugalPT25
QatarQA29
RomaniaRO24
RussiaRU33
Saint LuciaLC32
San MarinoSM27
Sao Tome and PrincipeST25
Saudi ArabiaSA24
SenegalSN28
SerbiaRS22
SeychellesSC31
Slovak RepublicSK24
SloveniaSI19
SomaliaSO23
SpainES24
SudanSD18
Sultanate of OmanOM23
SwedenSE24
SwitzerlandCH21
Timor-LesteTL23
TogoTG28
TunisiaTN24
TurkeyTR26
UkraineUA29
United Arab EmiratesAE23
United KingdomGB22
Virgin Islands, BritishVG24

Development

Install dependencies

npm i

Test

npm run test

Build

npx tsc

Changelog

v 1.2.0

  • Updated documentation

v 1.1.9

  • Added support for Sultanate of Oman

v 1.1.8

  • Added support for Falkland Islands

v 1.1.7

  • Added support for Djibouti and Somalia

v 1.1.6

  • Updated error display logic
  • Value can be passed directly as a string or part of the object.
    • If value is passed as a part of object same logic as for form validation is applied:
      • If IBAN is valid as result of validation null is returned.
      • If IBAN is invalid and some of the checks fail IBANValidationResult object is returned containing more info about error.
    • If value is passed as a string:
      • For valid and invalid IBAN IBANValidationResult object is returned.
  • Return null for valid form field to fix issue with disabling | enabling buttons
    • Thnx to @pramodEE for reporting the issue

v 1.1.5

Added additional pattern validation Added more tests to improve test coverage Added support for new countries: Algeria, Angola, Benin, Burkina Faso, Burundi, Cameroon, Cape Verde, Central African Republic, Chad, Comoros, Congo, Equatorial Guinea, Gabon, Guinea-Bissau, Honduras, Iran, Ivory Coast, Madagascar, Mali, Mongolia, Morocco, Mozambique, Nicaragua, Niger, Russia, Senegal, Togo

v 1.1.4

Avoid Angular warnings for old CommonJS module usage (see https://angular.io/guide/build#configuring-commonjs-dependencies)

Replaced mocha and chai with JEST for tests

v 1.1.3

Added support for new countries: Vatican, Libya, Sao Tome and Principe, Sudan Updated length for LC Saint Lucia from 30 to 32

Added Tests Added Mocha and Chai for testing

v 1.1.2

Updated length for CR to 22 - @freddy36

Read more

IBAN Examples

1.2.0

2 months ago

1.1.9

2 months ago

1.1.8

8 months ago

1.1.7

10 months ago

1.1.6

11 months ago

1.1.5

1 year ago

1.1.4

2 years ago

1.0.1

2 years ago

1.1.3

2 years ago

1.1.2

2 years ago

1.1.0

4 years ago

1.0.0

4 years ago