packages/fxa-content-server/app/scripts/lib/country-telephone-info.js (129 lines of code) (raw):

/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * Country->phone number info. */ /** * Each country entry should have the fields listed below. */ /** * Format `serverPhoneNumber` for display. * * @method format * @param {String} serverPhoneNumber phone number returned by the server * @return {String} phone number formatted for country */ /** * Normalize a string accepted by `pattern` to the full phone number, * including country code prefix. * * @method normalize * @param {String} num phone number to convert * @return {String} full phone number with country code prefix */ /** * Pattern used for input validation * * @property pattern * @type {RegExp} */ /** * Country code prefix * @property prefix * @type {String} */ /** * Rollout rate. Should be in the range of [0, 1]. Used * for gradual rollouts to a country. If rolloutRate is * not defined, 1 is assumed. * * @property rolloutRate * @type {Number} */ /** * Create a `format` function. `${serverPhoneNumber}` in `format` * will be replaced with `serverPhoneNumber` * * @param {String} format * @returns {Function} */ function formatter(format) { return (serverPhoneNumber) => format.replace(/\$\{serverPhoneNumber\}/, serverPhoneNumber); } function hasPrefix(num, prefix) { return num.indexOf(prefix) === 0; } function ensurePrefix(prefix) { return function (num) { if (hasPrefix(num, prefix)) { return num; } return `${prefix}${num}`; }; } module.exports = { // Austria // https://en.wikipedia.org/wiki/Telephone_numbers_in_Austria AT: { format: formatter('+43 ${serverPhoneNumber}'), normalize: ensurePrefix('+43'), pattern: /^(?:\+43)?\d{6,}$/, prefix: '+43', rolloutRate: 1, }, // Australia // https://en.wikipedia.org/wiki/Telephone_numbers_in_Australia AU: { format: formatter('+61 ${serverPhoneNumber}'), normalize: ensurePrefix('+61'), pattern: /^(?:\+61\d{9}|\d{10})$/, prefix: '+61', rolloutRate: 1, }, // Belgium // https://en.wikipedia.org/wiki/Telephone_numbers_in_Belgium BE: { format: formatter('+32 ${serverPhoneNumber}'), normalize: ensurePrefix('+32'), pattern: /^(?:\+32\d{9}|\d{10})$/, prefix: '+32', rolloutRate: 1, }, // Germany // https://en.wikipedia.org/wiki/Telephone_numbers_in_Germany DE: { format: formatter('+49 ${serverPhoneNumber}'), normalize: ensurePrefix('+49'), pattern: /^(?:\+49)?\d{6,13}$/, prefix: '+49', rolloutRate: 1, }, // Denmark // https://en.wikipedia.org/wiki/Telephone_numbers_in_Denmark DK: { format: formatter('+45 ${serverPhoneNumber}'), normalize: ensurePrefix('+45'), pattern: /^(?:\+45)?\d{8}$/, prefix: '+45', rolloutRate: 1, }, // Spain // https://en.wikipedia.org/wiki/Telephone_numbers_in_Spain ES: { format: formatter('+34 ${serverPhoneNumber}'), normalize: ensurePrefix('+34'), pattern: /^(?:\+34)?\d{9}$/, prefix: '+34', rolloutRate: 1, }, // France // https://en.wikipedia.org/wiki/Telephone_numbers_in_France FR: { format: formatter('+33 ${serverPhoneNumber}'), normalize: ensurePrefix('+33'), pattern: /^(?:\+33\d{9}|\d{10})$/, prefix: '+33', rolloutRate: 1, }, GB: { format: formatter('+44 ${serverPhoneNumber}'), normalize: ensurePrefix('+44'), pattern: /^(?:\+44\d{10}|\d{11})$/, prefix: '+44', rolloutRate: 1, }, // Italy // https://en.wikipedia.org/wiki/Telephone_numbers_in_Italy IT: { format: formatter('+39 ${serverPhoneNumber}'), normalize: ensurePrefix('+39'), // Italy can have either 9 or 10 digit numbers. 9 digits // are the old style and are still used. pattern: /^(?:\+39)?\d{9,10}$/, prefix: '+39', rolloutRate: 1, }, // Luxembourg // https://en.wikipedia.org/wiki/Telephone_numbers_in_Luxembourg LU: { format: formatter('+352 ${serverPhoneNumber}'), normalize: ensurePrefix('+352'), pattern: /^(?:\+352)?\d{9}$/, prefix: '+352', rolloutRate: 0, // being soft launched. Testers will need to open `/sms?service=sync&country=LU` }, // Netherlands // https://en.wikipedia.org/wiki/Telephone_numbers_in_the_Netherlands NL: { format: formatter('+31 ${serverPhoneNumber}'), normalize: ensurePrefix('+31'), pattern: /^(?:\+31)?\d{4,}$/, // Non-geographical numbers have no fixed length. 3 access digits + at least one other digit. prefix: '+31', rolloutRate: 1, }, // Portugal // https://en.wikipedia.org/wiki/Telephone_numbers_in_Portugal PT: { format: formatter('+351 ${serverPhoneNumber}'), normalize: ensurePrefix('+351'), pattern: /^(?:\+351)?\d{9}$/, prefix: '+351', rolloutRate: 1, }, RO: { format: formatter('+40 ${serverPhoneNumber}'), normalize(num) { // allow +40 country code prefix // as well as an extra 0 before the 7 prefix. const prefix = /^(\+40)?0?/; if (prefix.test(num)) { num = num.replace(prefix, ''); } return `+40${num}`; }, // +407xxxxxxxx, allow leading 0 for sloppiness. pattern: /^(?:\+40)?0?7\d{8,8}$/, prefix: '+40', rolloutRate: 1, }, US: { // Americans don't use country codes, just return the number // as formatted by the backend. format: (formattedNumber) => formattedNumber, normalize(num) { if (/^\+1/.test(num)) { return num; } else if (/^1/.test(num) && num.length === 11) { return `+${num}`; } return `+1${num}`; }, pattern: /^(\+?1)?[2-9]\d{9,9}$/, // allow for a +1 or 1 prefix before the area code, area codes are all 2-9 prefix: '+1', rolloutRate: 1, }, }; // alias CA (Canada) to use the same info as the US. module.exports.CA = module.exports.US;