UNPKG

codice-fiscale-ts

Version:

A TypeScript library for calculating, validating, and decoding Italian Fiscal Codes (Codice Fiscale)

126 lines (93 loc) 5.43 kB
# codice-fiscale-ts A TypeScript library for calculating, validating, and decoding Italian Fiscal Codes (Codice Fiscale). For an introduction and description in Italian, check out [my blog post](https://blog.bitrey.dev/codice-fiscale-ts). ## Demo Check out the [live demo](https://cf.bitrey.it) to see codice-fiscale-ts in action! ## Why This Library? This library was created to address several limitations in existing Italian Fiscal Code libraries: - 🆕 **Automatically Updated Municipalities**: Other libraries like codice-fiscale-js aren't automatically updated when changes are made to the list of municipal cadastral codes. This library uses the [comuni-json](https://github.com/matteocontrini/comuni-json) repository and the [ISTAT API](https://situas-servizi.istat.it/publish/reportspooljson?pfun=61&pdata=01/01/1948) to stay up-to-date. - 🔒 **Modern TypeScript Support**: Full TypeScript support with proper type definitions, distinguishing between people born in Italy (`ItalianPerson`) and abroad (`ForeignPerson`). -**Tree Shaking Support**: Built with modern ES modules to support tree shaking. For validating a fiscal code (`isValidFiscalCode`), the entire library is under 10kB (~5kB with tree shaking enabled)! - 🌐 **Standardized Country Codes**: Uses ISO 3166-1 alpha-2 country codes instead of Italian country names when handling people born abroad. - 🧮 **Comprehensive Features**: Supports both calculation (personal data → fiscal code) and reverse calculation (fiscal code → personal data). - 🌐 **Cross-Platform**: Works in both browser and Node.js environments, with both CJS and ESM support. - 🐛 **Well-Documented and Tested**: Every function is documented, tested, and deterministic. ## Installation ```bash npm install codice-fiscale-ts # or yarn add codice-fiscale-ts # or pnpm add codice-fiscale-ts ``` ## Usage ### Calculating a Fiscal Code ```typescript import { calculateFiscalCode, type Person } from "codice-fiscale-ts"; const person: Person = { firstName: "Mario", lastName: "Rossi", birthDate: new Date("1990-01-01"), gender: "M", birthPlace: "Roma" }; const fiscalCode = await calculateFiscalCode(person); console.log(fiscalCode); // RSSMRA90A01H501W (example) ``` ### Validating a Fiscal Code ```typescript import { isValidFiscalCode } from "codice-fiscale-ts"; const isValid = isValidFiscalCode("RSSMRA90A01H501W"); console.log(isValid); // true ``` ### Decoding a Fiscal Code ```typescript import { decodeFiscalCode } from "codice-fiscale-ts"; const decodedData = await decodeFiscalCode("RSSMRA90A01H501W"); console.log(decodedData); /* { birthDate: new Date('1990-01-01'), gender: 'M', birthPlace: 'Roma', birthProvince: 'RM' } */ ``` ## API Documentation ### Functions - `calculateFiscalCode(person: Person): Promise<string>` - Calculate a fiscal code from personal data - `isValidFiscalCode(fiscalCode: string): boolean` - Validate a fiscal code - `decodeFiscalCode(fiscalCode: string): Promise<FiscalCodeData>` - Decode a fiscal code into its components - Other utility functions are also available for more granular control ### Utility Functions - `calculateFirstNameCode(firstName: string): string` - Get the three letters representing a first name - `calculateLastNameCode(lastName: string): string` - Get the three letters representing a last name - `calculateYearCode(date: Date): string` - Get the two digits representing the year - `calculateMonthCode(date: Date): string` - Get the letter representing the month - `calculateDayGenderCode(date: Date, gender: 'M' | 'F'): string` - Get the two digits for the day and gender - `calculateCheckCharacter(code: string): string` - Calculate the final check character - `normalizeString(str: string): string` - Normalize a string by removing spaces, accents and special characters - `extractConsonants(str: string): string` - Extract consonants from a string - `extractVowels(str: string): string` - Extract vowels from a string - `validatePerson(person: Person): void` - Validate that a person object has all required fields - `isItalianPerson(person: Person): boolean` - Check if a person was born in Italy - `isForeignPerson(person: Person): boolean` - Check if a person was born abroad - `getMunicipalityByCode(code: string): Promise<Municipality>` - Get municipality by cadastral code - `getMunicipalCodeFromPlace(place: string): Promise<string>` - Get cadastral code from place name - `getMunicipalities(): Promise<Municipality[]>` - Get all Italian municipalities - `getForeignCountries(): Promise<Country[]>` - Get all supported foreign countries - `getCountryCode(countryCode: string): Promise<string>` - Get country code from ISO Alpha2 country code - `decodeYear(yearCode: string): number` - Decode the year from a fiscal code - `decodeMonth(monthCode: string): number` - Decode the month from a fiscal code - `decodeDay(dayCode: number): number` - Decode the day from a fiscal code ### Types The package exports several TypeScript types to help with type checking: - `Person` - Basic person data needed for fiscal code calculation - `ItalianPerson` - Person born in Italy - `ForeignPerson` - Person born abroad - `FiscalCodeData` - The decoded components of a fiscal code ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## License This project is licensed under the MIT License - see the LICENSE file for details.