Skip to content

Commit afae24f

Browse files
committed
feat: improve date handling in birth number generation
1 parent a306e21 commit afae24f

File tree

6 files changed

+67
-16
lines changed

6 files changed

+67
-16
lines changed

README.md

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[![Coverage Status](https://img.shields.io/coveralls/github/p333ter/birth-number-utils?style=flat-square)](https://coveralls.io/github/p333ter/birth-number-utils)
77
[![Build Status](https://img.shields.io/github/actions/workflow/status/p333ter/birth-number-utils/publish.yml?style=flat-square)](https://github.com/p333ter/birth-number-utils/actions)
88

9-
A TypeScript/JavaScript library for generating, validating, and parsing Czech and Slovak birth numbers (rodné číslo).
9+
A TypeScript/JavaScript library for generating, validating, and parsing 🇨🇿Czech and 🇸🇰Slovak birth numbers (rodné číslo). Built for reliability, performance, and ease of use.
1010

1111
## Installation
1212

@@ -25,12 +25,29 @@ import { generateBirthNumber } from '@ppasmik/birth-number-utils';
2525
const randomBirthNumber = generateBirthNumber();
2626
console.log('Random Birth Number:', randomBirthNumber); // e.g., "900720/3117"
2727

28-
// Generate a birth number with specific parameters
29-
const customBirthNumber = generateBirthNumber({
28+
// Generate using string date (recommended)
29+
const birthNumber1 = generateBirthNumber({
30+
gender: 'MALE',
31+
birthDate: '1985-11-19', // November 19, 1985 (YYYY-MM-DD format)
32+
});
33+
34+
// Generate using Date object (note: months are 0-based in JavaScript Date)
35+
const birthNumber2 = generateBirthNumber({
3036
gender: 'FEMALE',
31-
birthDate: new Date(1990, 6, 20), // 20th July 1990
37+
birthDate: new Date(1990, 6, 20), // July 20, 1990 (month 6 = July)
3238
});
33-
console.log('Custom Birth Number:', customBirthNumber); // e.g., "905720/3111"
39+
```
40+
41+
⚠️ **Important Note About Dates**:
42+
43+
- When using string dates (recommended): Months are 1-based (1 = January, 12 = December)
44+
- When using JavaScript Date object: Months are 0-based (0 = January, 11 = December)
45+
- Examples:
46+
47+
```typescript
48+
// These create the same birth number (November 19, 1985):
49+
generateBirthNumber({ birthDate: '1985-11-19' }); // string format
50+
generateBirthNumber({ birthDate: new Date(1985, 10, 19) }); // Date object (10 = November)
3451
```
3552

3653
### Validate Birth Numbers

package-lock.json

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@ppasmik/birth-number-utils",
3-
"version": "2.0.6",
3+
"version": "2.0.7",
44
"description": "A TypeScript/JavaScript library for generating, validating, and parsing Czech and Slovak birth numbers (rodné číslo).",
55
"author": "Peter Pasmik",
66
"license": "MIT",

src/__tests__/birthNumber.test.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,24 @@ describe('Birth Number Validation and Parsing', () => {
100100
}
101101
});
102102

103+
it('parses valid male birth number', () => {
104+
const birthDate = new Date(Date.UTC(1985, 10, 19));
105+
const birthDate2 = generateBirthNumber({
106+
birthDate: "1985-11-19",
107+
gender: "MALE"
108+
});
109+
const result = parseBirthNumber(birthDate2);
110+
111+
expect(result).not.toBe(false);
112+
if (result) {
113+
expect(result.birthDate).toEqual(birthDate);
114+
expect(result.gender).toBe('MALE');
115+
expect(result.isMale).toBe(true);
116+
expect(result.isFemale).toBe(false);
117+
expect(result.birthDateAsString).toBe('19.11.1985');
118+
}
119+
});
120+
103121
/**
104122
* @description Parses valid female birth number and verifies all details.
105123
*/
@@ -122,7 +140,7 @@ describe('Birth Number Validation and Parsing', () => {
122140
*/
123141
it('correctly calculates age and validates dates', () => {
124142
const result = parseBirthNumber('0001018336');
125-
expect(result).not.toBe(false);
143+
expect(result).not.toBe(true);
126144
if (result) {
127145
const currentYear = new Date().getFullYear();
128146
const expectedAge =

src/generators/generateBirthNumber.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import dayjs from 'dayjs';
2+
import customParseFormat from 'dayjs/plugin/customParseFormat';
3+
import utc from 'dayjs/plugin/utc';
4+
5+
dayjs.extend(utc);
6+
dayjs.extend(customParseFormat);
27

38
export interface BirthNumberOptions {
49
gender?: 'MALE' | 'FEMALE';
5-
birthDate?: Date;
10+
birthDate?: Date | string;
611
}
712

813
export const generateBirthNumber = (
@@ -12,15 +17,15 @@ export const generateBirthNumber = (
1217
? dayjs(options.birthDate)
1318
: dayjs().subtract(Math.floor(Math.random() * 72 + 18), 'years');
1419

15-
let month = birthDayjs.month() + 1;
20+
const year = birthDayjs.format('YY');
21+
const day = birthDayjs.format('DD');
22+
let month = birthDayjs.month() + 1;
23+
1624
if (options.gender === 'FEMALE') {
1725
month += 50;
1826
}
1927

20-
const firstPart =
21-
birthDayjs.format('YY') +
22-
month.toString().padStart(2, '0') +
23-
birthDayjs.format('DD');
28+
const firstPart = year + month.toString().padStart(2, '0') + day;
2429

2530
let controlPart = Math.floor(Math.random() * 10000)
2631
.toString()
@@ -39,4 +44,8 @@ export const generateBirthNumber = (
3944

4045
// Pre zachovanie spätnej kompatibility môžeme exportovať alias funkcie:
4146
export const generateCzechBirthNumber = generateBirthNumber;
47+
48+
49+
50+
4251
export const generateSlovakBirthNumber = generateBirthNumber;

src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
export { BirthNumber, rodnecislo } from './classes/BirthNumber';
2-
export { generateBirthNumber } from './generators';
2+
export {
3+
generateBirthNumber,
4+
generateCzechBirthNumber,
5+
generateSlovakBirthNumber
6+
} from './generators';
37
export { isValidBirthNumber, parseBirthNumber } from './validators';

0 commit comments

Comments
 (0)