Numerik — walidacja i parsowanie polskich numerów identyfikacyjnych (PESEL, NIP, REGON i innych) w PHP i TypeScript

Numerik — walidacja i parsowanie polskich numerów identyfikacyjnych (PESEL, NIP, REGON i innych) w PHP i TypeScript
Sqrcz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
2

Cześć,

Chciałbym pokazać projekt, nad którym ostatnio pracowałem: Numerik — zestaw bibliotek do walidacji i parsowania polskich numerów identyfikacyjnych: PESEL, NIP, REGON, KRS, NRB, VAT-EU, IBAN, dowód osobisty i paszport.

Dlaczego kolejna biblioteka do tego?

Istniejące rozwiązania (np. kiczort/polish-validator w PHP, validate-polish w JS) działają, ale zwykle:

  • zwracają jedynie true/false, nie mówiąc nic o tym, dlaczego walidacja zawiodła,
  • opierają się na wyrażeniach regularnych,
  • nie dają dostępu do sparsowanych danych (daty urodzenia, płci, wieku) w gotowej postaci — to trzeba dopisać samodzielnie.

Co Numerik robi inaczej

  • Zero zależności — PHP 8.3+, declare(strict_types=1) wszędzie.
  • Bogate value objectyparse() zwraca np. dla PESEL obiekt z getBirthDate(), getGender(), getAge(), isAdult().
  • Typowane przyczyny błędów — enum ValidationFailureReason (InvalidChecksum, FutureDate, InvalidMonth itd.) zamiast prostego boolean'a.
  • Bez wyrażeń regularnych — cała logika to operacje na tablicach cyfr, więc zero ryzyka ReDoS.
  • PHPStan poziom 10, testy mutacyjne (Infection), pełne CI.

Przykład

Kopiuj
use SlashLab\Numerik\Numerik;

Numerik::pesel()->isValid('92060512186'); // true

$result = Numerik::pesel()->validate('92060512185'); // zły checksum
$result->isFailed(); // true
$result->getFirstFailure()->reason; // ValidationFailureReason::InvalidChecksum

$pesel = Numerik::pesel()->parse('92060512186');
$pesel->getBirthDate()->format('Y-m-d'); // '1992-06-05'
$pesel->getGender(); // Gender::Female
$pesel->getAge(); // liczone od dziś

Instalacja

Kopiuj
composer require slashlab/numerik

Dodatkowe pakiety

Linki

Projekt jest świeży i cały czas rozwijany — chętnie usłyszę uwagi, zwłaszcza jeśli ktoś zna edge case'y w tych numerach, których jeszcze nie obsłużyłem.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5077
0

Jakie masz pokrycie testowe?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.