nino-validator
Version:
A lightweight npm package for validating UK National Insurance Numbers (NINO)
251 lines (236 loc) • 10.9 kB
JavaScript
/**
* Internationalization messages for NINO Validator (ESM)
*
* @fileoverview Localized error messages and suggestions for validation (ES Module version)
* @author Byron Thanopoulos <byron.thanopoulos@gmail.com>
* @version 1.0.0
*/
const messages = {
en: {
// Input validation errors
NULL_INPUT: {
error: 'NINO cannot be null or undefined',
suggestion: 'Provide a valid NINO string',
},
INVALID_TYPE: {
error: 'Expected string, got {type}',
suggestion: 'Convert the input to a string before validation',
},
EMPTY_INPUT: {
error: 'NINO cannot be empty',
suggestion: 'Provide a non-empty NINO string',
},
INPUT_TOO_LONG: {
error: 'NINO input too long (maximum 20 characters)',
suggestion: 'Ensure the input is a valid NINO, not a longer string',
},
// Character and format validation
INVALID_CHARACTERS: {
error:
'NINO contains invalid characters. Only letters and numbers are allowed',
suggestion: 'Remove any special characters, punctuation, or symbols',
},
SPACES_NOT_ALLOWED: {
error: 'Spaces are not allowed in this context',
suggestion: 'Remove all spaces from the NINO',
},
// Length validation
TOO_SHORT: {
error:
'NINO too short ({length} characters). Minimum 8 characters required',
suggestion:
'Ensure the NINO has 2 letters, 6 digits, and optionally 1 letter',
},
TOO_LONG: {
error:
'NINO too long ({length} characters). Maximum 9 characters allowed',
suggestion: 'Remove extra characters from the NINO',
},
// Format validation
INVALID_FORMAT: {
error:
'Invalid NINO format. Expected format: XX123456X (suffix optional)',
suggestion:
'Ensure the NINO has 2 letters, 6 digits, and optionally 1 letter',
},
INVALID_PREFIX_FORMAT: {
error: 'NINO must start with exactly 2 letters',
suggestion:
'Ensure the first 2 characters are letters (e.g., AB, CD, EF)',
},
INVALID_NUMBER_FORMAT: {
error: 'NINO must have exactly 6 digits after the 2-letter prefix',
suggestion: 'Ensure characters 3-8 are all numbers (e.g., 123456)',
},
INVALID_SUFFIX_FORMAT: {
error: 'Suffix must be a single letter',
suggestion: 'Ensure the last character is a letter',
},
MISSING_REQUIRED_SUFFIX: {
error: 'Suffix letter is required in this context',
suggestion: 'Add a valid suffix letter (A, B, C, E, G, H, etc.)',
},
// HMRC rules validation
INVALID_FIRST_LETTER: {
error:
'Invalid first letter "{letter}". Letters D, F, I, Q, U, V are not used as first letters',
suggestion:
'Use a valid first letter: A, B, C, E, G, H, J, K, L, M, N, O, P, R, S, T, W, X, Y, Z',
},
INVALID_SECOND_LETTER: {
error:
'Invalid second letter "{letter}". Letters D, F, I, Q, U, V are not used as second letters',
suggestion:
'Use a valid second letter: A, B, C, E, G, H, J, K, L, M, N, O, P, R, S, T, W, X, Y, Z',
},
INVALID_SUFFIX: {
error:
'Invalid suffix "{suffix}". Letters D, F, I, Q, U, V are not used as suffix letters',
suggestion:
'Use a valid suffix letter: A, B, C, E, G, H, J, K, L, M, N, O, P, R, S, T, W, X, Y, Z',
},
INVALID_PREFIX: {
error: 'Invalid prefix "{prefix}". This prefix is not used by HMRC',
suggestion: 'Use a valid prefix like AB, CD, EF, GH, JK, etc.',
},
INVALID_NUMBER_PATTERN: {
error:
'Invalid number pattern "{numbers}". All six digits cannot be the same',
suggestion: 'Use a number sequence where not all digits are identical',
},
},
el: {
// Σφάλματα επικύρωσης εισόδου
NULL_INPUT: {
error: 'Ο NINO δεν μπορεί να είναι null ή undefined',
suggestion: 'Παρέχετε μια έγκυρη συμβολοσειρά NINO',
},
INVALID_TYPE: {
error: 'Αναμενόταν string, δόθηκε {type}',
suggestion: 'Μετατρέψτε την είσοδο σε string πριν από την επικύρωση',
},
EMPTY_INPUT: {
error: 'Ο NINO δεν μπορεί να είναι κενός',
suggestion: 'Παρέχετε μια μη-κενή συμβολοσειρά NINO',
},
INPUT_TOO_LONG: {
error: 'Η είσοδος NINO είναι πολύ μεγάλη (μέγιστο 20 χαρακτήρες)',
suggestion:
'Βεβαιωθείτε ότι η είσοδος είναι έγκυρος NINO, όχι μεγαλύτερη συμβολοσειρά',
},
// Επικύρωση χαρακτήρων και μορφής
INVALID_CHARACTERS: {
error:
'Ο NINO περιέχει μη έγκυρους χαρακτήρες. Επιτρέπονται μόνο γράμματα και αριθμοί',
suggestion:
'Αφαιρέστε τυχόν ειδικούς χαρακτήρες, σημεία στίξης ή σύμβολα',
},
SPACES_NOT_ALLOWED: {
error: 'Τα κενά δεν επιτρέπονται σε αυτό το πλαίσιο',
suggestion: 'Αφαιρέστε όλα τα κενά από τον NINO',
},
// Επικύρωση μήκους
TOO_SHORT: {
error:
'Ο NINO είναι πολύ μικρός ({length} χαρακτήρες). Απαιτούνται τουλάχιστον 8 χαρακτήρες',
suggestion:
'Βεβαιωθείτε ότι ο NINO έχει 2 γράμματα, 6 ψηφία και προαιρετικά 1 γράμμα',
},
TOO_LONG: {
error:
'Ο NINO είναι πολύ μεγάλος ({length} χαρακτήρες). Επιτρέπονται μέχρι 9 χαρακτήρες',
suggestion: 'Αφαιρέστε τους επιπλέον χαρακτήρες από τον NINO',
},
// Επικύρωση μορφής
INVALID_FORMAT: {
error:
'Μη έγκυρη μορφή NINO. Αναμενόμενη μορφή: XX123456X (το επίθημα είναι προαιρετικό)',
suggestion:
'Βεβαιωθείτε ότι ο NINO έχει 2 γράμματα, 6 ψηφία και προαιρετικά 1 γράμμα',
},
INVALID_PREFIX_FORMAT: {
error: 'Ο NINO πρέπει να ξεκινά με ακριβώς 2 γράμματα',
suggestion:
'Βεβαιωθείτε ότι οι πρώτοι 2 χαρακτήρες είναι γράμματα (π.χ., AB, CD, EF)',
},
INVALID_NUMBER_FORMAT: {
error:
'Ο NINO πρέπει να έχει ακριβώς 6 ψηφία μετά το πρόθεμα 2 γραμμάτων',
suggestion:
'Βεβαιωθείτε ότι οι χαρακτήρες 3-8 είναι όλοι αριθμοί (π.χ., 123456)',
},
INVALID_SUFFIX_FORMAT: {
error: 'Το επίθημα πρέπει να είναι ένα μόνο γράμμα',
suggestion: 'Βεβαιωθείτε ότι ο τελευταίος χαρακτήρας είναι γράμμα',
},
MISSING_REQUIRED_SUFFIX: {
error: 'Το γράμμα επιθήματος είναι απαραίτητο σε αυτό το πλαίσιο',
suggestion:
'Προσθέστε ένα έγκυρο γράμμα επιθήματος (A, B, C, E, G, H, κλπ.)',
},
// Επικύρωση κανόνων HMRC
INVALID_FIRST_LETTER: {
error:
'Μη έγκυρο πρώτο γράμμα "{letter}". Τα γράμματα D, F, I, Q, U, V δεν χρησιμοποιούνται ως πρώτα γράμματα',
suggestion:
'Χρησιμοποιήστε έγκυρο πρώτο γράμμα: A, B, C, E, G, H, J, K, L, M, N, O, P, R, S, T, W, X, Y, Z',
},
INVALID_SECOND_LETTER: {
error:
'Μη έγκυρο δεύτερο γράμμα "{letter}". Τα γράμματα D, F, I, Q, U, V δεν χρησιμοποιούνται ως δεύτερα γράμματα',
suggestion:
'Χρησιμοποιήστε έγκυρο δεύτερο γράμμα: A, B, C, E, G, H, J, K, L, M, N, O, P, R, S, T, W, X, Y, Z',
},
INVALID_SUFFIX: {
error:
'Μη έγκυρο επίθημα "{suffix}". Τα γράμματα D, F, I, Q, U, V δεν χρησιμοποιούνται ως γράμματα επιθήματος',
suggestion:
'Χρησιμοποιήστε έγκυρο γράμμα επιθήματος: A, B, C, E, G, H, J, K, L, M, N, O, P, R, S, T, W, X, Y, Z',
},
INVALID_PREFIX: {
error:
'Μη έγκυρο πρόθεμα "{prefix}". Αυτό το πρόθεμα δεν χρησιμοποιείται από την HMRC',
suggestion: 'Χρησιμοποιήστε έγκυρο πρόθεμα όπως AB, CD, EF, GH, JK, κλπ.',
},
INVALID_NUMBER_PATTERN: {
error:
'Μη έγκυρο μοτίβο αριθμών "{numbers}". Όλα τα έξι ψηφία δεν μπορούν να είναι τα ίδια',
suggestion:
'Χρησιμοποιήστε μια ακολουθία αριθμών όπου δεν είναι όλα τα ψηφία πανομοιότυπα',
},
},
};
/**
* Interpolate parameters in a message string
* @param {string} template - Template string with {param} placeholders
* @param {Object} params - Parameters to interpolate
* @returns {string} Interpolated string
*/
function interpolateMessage(template, params = {}) {
return template.replace(/\{(\w+)\}/g, (match, key) => {
return params[key] !== undefined ? params[key] : match;
});
}
/**
* Get localized message for a specific error code and language
* @param {string} errorCode - Error code
* @param {string} language - Language code ('en', 'el')
* @param {Object} params - Parameters for message interpolation
* @returns {Object} Object with localized error and suggestion
*/
export function getMessage(errorCode, language = 'en', params = {}) {
// Default to English if language not supported
const lang = messages[language] ? language : 'en';
const messageData = messages[lang][errorCode];
if (!messageData) {
// Return a generic message for unknown error codes
return {
error: `Unknown error code: ${errorCode}`,
suggestion: 'Please check the error code and try again',
};
}
return {
error: interpolateMessage(messageData.error, params),
suggestion: interpolateMessage(messageData.suggestion, params),
};
}