nino-validator
Version:
A lightweight npm package for validating UK National Insurance Numbers (NINO)
249 lines (232 loc) • 10.5 kB
JavaScript
/**
* Internationalization messages for NINO Validator
*
* @fileoverview Localized error messages and suggestions for validation
* @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 validation errors
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 errors
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 errors
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)',
},
MISSING_REQUIRED_SUFFIX: {
error: 'Suffix letter is required in this context',
suggestion: 'Add a valid suffix letter (A, B, C, E, G, H, etc.)',
},
INVALID_SUFFIX_FORMAT: {
error: 'Suffix must be a single letter',
suggestion: 'Ensure the last character is a letter',
},
INVALID_FORMAT: {
error:
'Invalid NINO format. Expected format: XX123456X (suffix optional)',
suggestion:
'Ensure the NINO has 2 letters, 6 digits, and optionally 1 letter',
},
// HMRC rule validation errors
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_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_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: {
// Input validation errors
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, όχι μεγαλύτερη συμβολοσειρά',
},
// Character validation errors
INVALID_CHARACTERS: {
error:
'Ο NINO περιέχει μη έγκυρους χαρακτήρες. Επιτρέπονται μόνο γράμματα και αριθμοί',
suggestion:
'Αφαιρέστε τυχόν ειδικούς χαρακτήρες, σημεία στίξης ή σύμβολα',
},
SPACES_NOT_ALLOWED: {
error: 'Τα κενά δεν επιτρέπονται σε αυτό το πλαίσιο',
suggestion: 'Αφαιρέστε όλα τα κενά από τον NINO',
},
// Length validation errors
TOO_SHORT: {
error:
'Ο NINO είναι πολύ μικρός ({length} χαρακτήρες). Απαιτούνται τουλάχιστον 8 χαρακτήρες',
suggestion:
'Βεβαιωθείτε ότι ο NINO έχει 2 γράμματα, 6 ψηφία και προαιρετικά 1 γράμμα',
},
TOO_LONG: {
error:
'Ο NINO είναι πολύ μεγάλος ({length} χαρακτήρες). Επιτρέπονται μέχρι 9 χαρακτήρες',
suggestion: 'Αφαιρέστε τους επιπλέον χαρακτήρες από τον NINO',
},
// Format validation errors
INVALID_PREFIX_FORMAT: {
error: 'Ο NINO πρέπει να αρχίζει με ακριβώς 2 γράμματα',
suggestion:
'Βεβαιωθείτε ότι οι πρώτοι 2 χαρακτήρες είναι γράμματα (π.χ., AB, CD, EF)',
},
INVALID_NUMBER_FORMAT: {
error:
'Ο NINO πρέπει να έχει ακριβώς 6 ψηφία μετά το πρόθεμα 2 γραμμάτων',
suggestion:
'Βεβαιωθείτε ότι οι χαρακτήρες 3-8 είναι όλοι αριθμοί (π.χ., 123456)',
},
MISSING_REQUIRED_SUFFIX: {
error: 'Το γράμμα επιθήματος είναι απαραίτητο σε αυτό το πλαίσιο',
suggestion:
'Προσθέστε ένα έγκυρο γράμμα επιθήματος (A, B, C, E, G, H, κλπ.)',
},
INVALID_SUFFIX_FORMAT: {
error: 'Το επίθημα πρέπει να είναι ένα μόνο γράμμα',
suggestion: 'Βεβαιωθείτε ότι ο τελευταίος χαρακτήρας είναι γράμμα',
},
INVALID_FORMAT: {
error:
'Μη έγκυρη μορφή NINO. Αναμενόμενη μορφή: XX123456X (το επίθημα είναι προαιρετικό)',
suggestion:
'Βεβαιωθείτε ότι ο NINO έχει 2 γράμματα, 6 ψηφία και προαιρετικά 1 γράμμα',
},
// HMRC rule validation errors
INVALID_PREFIX: {
error:
'Μη έγκυρο πρόθεμα "{prefix}". Αυτό το πρόθεμα δεν χρησιμοποιείται από την HMRC',
suggestion: 'Χρησιμοποιήστε έγκυρο πρόθεμα όπως AB, CD, EF, GH, JK, κλπ.',
},
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_NUMBER_PATTERN: {
error:
'Μη έγκυρο μοτίβο αριθμών "{numbers}". Όλα τα έξι ψηφία δεν μπορούν να είναι τα ίδια',
suggestion:
'Χρησιμοποιήστε μια ακολουθία αριθμών όπου δεν είναι όλα τα ψηφία πανομοιότυπα',
},
},
};
/**
* Get localized message for error code
* @param {string} errorCode - The error code
* @param {string} language - Language code (default: 'en')
* @param {Object} params - Parameters for message interpolation
* @returns {Object} Object with error and suggestion
*/
function getMessage(errorCode, language = 'en', params = {}) {
const lang = messages[language] || messages.en;
const message = lang[errorCode] || messages.en[errorCode];
if (!message) {
return {
error: `Unknown error code: ${errorCode}`,
suggestion: 'Please check the error code and try again',
};
}
// Simple template replacement
let error = message.error;
let suggestion = message.suggestion;
Object.keys(params).forEach((key) => {
const placeholder = `{${key}}`;
error = error.replace(placeholder, params[key]);
suggestion = suggestion.replace(placeholder, params[key]);
});
return { error, suggestion };
}
module.exports = {
messages,
getMessage,
};