UNPKG

lux-utils

Version:

JS library to validate and format common Luxembourgish administrative data.

1 lines 12.6 kB
{"version":3,"sources":["validateMatricule/index.js","validateCodePostal/index.js","validateFixedPhone/index.js","validateLicensePlate/index.js","index.js"],"names":["matriculeToValidate","Number","isInteger","matriculeToValidateString","toString","length","strippedMatricule","parseInt","substr","validateLuhn","validateVerhoeff","verhoeff","generate","luhn","calculateLuhn","d","p","computed","inv","sumLuhn","digits","even","i","sum","digit","invArray","array","String","Object","prototype","call","split","map","reverse","c","invertedArray","codePostalToValidate","startsWith","parsedCP","fixedPhoneNumber","strippedFixedPhoneNumber","replace","isNaN","licensePlateToValidate","strippedLicensePlateToValidate","isTwoLetters","rest","test","str","validateMatricule","validateCodePostal","validateFixedPhone","validateLicensePlate"],"mappings":"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","file":"index.umd.map","sourceRoot":"../src","sourcesContent":["/**\n * @memberof LuxUtils\n * @function validateMatricule\n * @description Returns `true` if the matricule is valid\n * @param {integer} matriculeToValidate matricule to validate\n * @returns {boolean} `true` or `false`\n\n *\n * @example\n * // validate a matricule\n * let isValid = LuxUtils.validateMatricule(1893120105732); //true;\n *\n */\n\nexport default (matriculeToValidate) => {\n if (!Number.isInteger(matriculeToValidate)) return false;\n const matriculeToValidateString = matriculeToValidate.toString();\n if (matriculeToValidateString.length !== 13) return false;\n\n const strippedMatricule = parseInt(matriculeToValidateString.substr(0, 11), 10);\n\n const luhn = parseInt(matriculeToValidateString.substr(11, 1), 10);\n if (!validateLuhn(strippedMatricule, luhn)) return false;\n const verhoeff = parseInt(matriculeToValidateString.substr(12, 1), 10);\n if (!validateVerhoeff(strippedMatricule, verhoeff)) return false;\n\n return true;\n};\n\nfunction validateVerhoeff(strippedMatricule, verhoeff) {\n return generate(strippedMatricule) === verhoeff;\n}\n\nfunction validateLuhn(strippedMatricule, luhn) {\n return calculateLuhn(strippedMatricule.toString()) === luhn;\n}\n\nconst d = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],\n];\n\n// permutation table p\nconst p = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],\n];\n\nconst computed = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9];\n// inverse table inv\nconst inv = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];\n\nfunction sumLuhn(digits, even) {\n let sum = 0,\n digit = 0,\n i = digits.length;\n\n while (i--) {\n digit = Number(digits[i]);\n sum += (even = !even) ? computed[digit] : digit;\n }\n\n return sum;\n}\n\nfunction calculateLuhn(digits) {\n const sum = sumLuhn(digits, false);\n return (sum * 9) % 10;\n}\n\n// converts string or number to an array and inverts it\nfunction invArray(array) {\n if (Number.isInteger(array) /* Object.prototype.toString.call(array) === '[object Number]' */) {\n array = String(array);\n }\n\n if (Object.prototype.toString.call(array) === '[object String]') {\n array = array.split('').map(Number);\n }\n\n return array.reverse();\n}\n\n// generates checksum\nfunction generate(array) {\n let c = 0;\n const invertedArray = invArray(array);\n\n for (let i = 0; i < invertedArray.length; i++) {\n c = d[c][p[(i + 1) % 8][invertedArray[i]]];\n }\n\n return inv[c];\n}\n","/**\n * @memberof LuxUtils\n * @function validateCodePostal\n * @description Returns `true` if the given postal code is valid\n * @param {(string|integer)} codePostalToValidate postal code to validate. Can be a `string` or a `integer`\n * @returns {boolean} `true` or `false`\n\n *\n * @example\n * // validate a postal code\n * let isValid = LuxUtils.validateCodePostal(4402); //true;\n * let isValid2 = LuxUtils.validateCodePostal(\"L-4402\"); //true;\n * let isValid3 = LuxUtils.validateCodePostal(\"0404\"); //false;\n */\n\nexport default codePostalToValidate => {\n //format: 4402\n if (Number.isInteger(codePostalToValidate)) {\n return codePostalToValidate >= 1110 && codePostalToValidate <= 9999;\n }\n if (typeof codePostalToValidate === \"string\") {\n //format: L-4402 as a string\n if (codePostalToValidate.startsWith(\"L-\")) {\n codePostalToValidate = codePostalToValidate.substr(\n 2,\n codePostalToValidate.length - 2\n );\n }\n //format: 4402 as a string\n if (codePostalToValidate.length === 4) {\n let parsedCP = parseInt(codePostalToValidate, 10);\n return parsedCP >= 1110 && parsedCP <= 9999;\n }\n }\n return false;\n};\n","/**\n * @memberof LuxUtils\n * @function validateFixedPhone\n * @description Returns `true` if the fixed phone number is valid\n * @param {(string|integer)} fixedPhoneNumber fixed phone number to validate. Can be a `string` or a `integer`\n * @returns {boolean} `true` or `false`\n\n *\n * @example\n * // validate a fixed phone number\n * let isValid = LuxUtils.validateFixedPhone(420288); //true;\n * let isValid2 = LuxUtils.validateFixedPhone(\"44 12 34 22\"); //true;\n * let isValid3 = LuxUtils.validateFixedPhone(\"4444\"); //false;\n */\n\nexport default (fixedPhoneNumber) => {\n if (typeof fixedPhoneNumber === 'string') {\n // format: 440288 as a string\n const strippedFixedPhoneNumber = fixedPhoneNumber.replace(/\\s/g, '').replace(/-/g, '');\n if (strippedFixedPhoneNumber.length >= 6 && strippedFixedPhoneNumber.length <= 8) {\n fixedPhoneNumber = parseInt(strippedFixedPhoneNumber);\n if (isNaN(fixedPhoneNumber)) {\n return false;\n }\n } else {\n return false;\n }\n }\n\n // format: 440288\n if (Number.isInteger(fixedPhoneNumber)) {\n return fixedPhoneNumber > 99999 && fixedPhoneNumber <= 99999999;\n }\n\n return false;\n};\n","/**\n * @memberof LuxUtils\n * @function validateLicensePlate\n * @description Returns `true` if the given postal code is valid\n * @param {(string|integer)} licensePlateToValidate postal code to validate. Can be a `string` or a `integer`\n * @returns {boolean} `true` or `false`\n\n *\n * @example\n * // validate a postal code\n * let isValid = LuxUtils.validateLicensePlate(4402); //true;\n * let isValid2 = LuxUtils.validateLicensePlate(\"L-4402\"); //true;\n * let isValid3 = LuxUtils.validateLicensePlate(\"0404\"); //false;\n */\n\nexport default (licensePlateToValidate) => {\n // format: custom plate - 1111 or 11111\n if (Number.isInteger(licensePlateToValidate)) {\n return (\n licensePlateToValidate.toString().length === 4\n || licensePlateToValidate.toString().length === 5\n );\n }\n // format: LL 22\n // format: LL 1234\n if (typeof licensePlateToValidate === 'string') {\n const strippedLicensePlateToValidate = licensePlateToValidate.replace(/\\s/g, '');\n const twoFirstLetters = strippedLicensePlateToValidate.substr(0, 2);\n\n if (isTwoLetters(twoFirstLetters)) {\n const rest = strippedLicensePlateToValidate.substr(\n 2,\n strippedLicensePlateToValidate.length - 2,\n );\n if (rest.length === 4 && /^\\d+$/.test(rest)) {\n return true;\n }\n } else {\n // custom plate\n return (\n strippedLicensePlateToValidate.toString().length === 4\n || strippedLicensePlateToValidate.toString().length === 5\n );\n }\n }\n\n return false;\n};\n\nfunction isTwoLetters(str) {\n const regex = /^[a-z]+$/i;\n return str.length === 2 && regex.test(str);\n}\n","/**\n * @class LuxUtils\n * @description JS library to validate and format common Luxembourgish administrative data.\n */\nimport validateMatricule from \"./validateMatricule\";\nimport validateCodePostal from \"./validateCodePostal\";\nimport validateFixedPhone from \"./validateFixedPhone\";\nimport validateLicensePlate from \"./validateLicensePlate\";\n\nexport default {\n /**\n * @see modules/validateMatricule\n */\n validateMatricule,\n /**\n * @see modules/validateCodePostal\n */\n validateCodePostal,\n /**\n * @see modules/validateFixedPhone\n */\n validateFixedPhone,\n /**\n * @see modules/validateLicensePlate\n */\n validateLicensePlate\n};\n"]}