UNPKG

@ntpu/i18n-iso-countries

Version:
280 lines (251 loc) 6.02 kB
"use strict"; var codes = require("./codes.json"); var removeDiacritics = require('diacritics').remove; var registeredLocales = {}; /* * All codes map to ISO 3166-1 alpha-2 */ var alpha2 = {}, alpha3 = {}, numeric = {}, invertedNumeric = {}; codes.forEach(function(codeInformation) { var s = codeInformation; alpha2[s[0]] = s[1]; alpha3[s[1]] = s[0]; numeric[s[2]] = s[0]; invertedNumeric[s[0]] = s[2]; }); function formatNumericCode(code) { return String('000'+(code ? code : '')).slice(-3); } function registerLocale(localeData) { if (!localeData.locale) { throw new TypeError('Missing localeData.locale'); } if (!localeData.countries) { throw new TypeError('Missing localeData.countries'); } registeredLocales[localeData.locale] = localeData.countries; } exports.registerLocale = registerLocale; /* * @param code Alpha-3 code * @return Alpha-2 code or undefined */ function alpha3ToAlpha2(code) { return alpha3[code]; } exports.alpha3ToAlpha2 = alpha3ToAlpha2; /* * @param code Alpha-2 code * @return Alpha-3 code or undefined */ function alpha2ToAlpha3(code) { return alpha2[code]; } exports.alpha2ToAlpha3 = alpha2ToAlpha3; /* * @param code Alpha-3 code * @return Numeric code or undefined */ function alpha3ToNumeric(code) { return invertedNumeric[alpha3ToAlpha2(code)]; } exports.alpha3ToNumeric = alpha3ToNumeric; /* * @param code Alpha-2 code * @return Numeric code or undefined */ function alpha2ToNumeric(code) { return invertedNumeric[code]; } exports.alpha2ToNumeric = alpha2ToNumeric; /* * @param code Numeric code * @return Alpha-3 code or undefined */ function numericToAlpha3(code) { var padded = formatNumericCode(code); return alpha2ToAlpha3(numeric[padded]); } exports.numericToAlpha3 = numericToAlpha3; /* * @param code Numeric code * @return Alpha-2 code or undefined */ function numericToAlpha2(code) { var padded = formatNumericCode(code); return numeric[padded]; } exports.numericToAlpha2 = numericToAlpha2; /* * @param code ISO 3166-1 alpha-2, alpha-3 or numeric code * @return ISO 3166-1 alpha-3 */ function toAlpha3(code) { if (typeof code === "string") { if (/^[0-9]*$/.test(code)) { return numericToAlpha3(code); } if(code.length === 2) { return alpha2ToAlpha3(code.toUpperCase()); } if (code.length === 3) { return code.toUpperCase(); } } if (typeof code === "number") { return numericToAlpha3(code); } return undefined; } exports.toAlpha3 = toAlpha3; /* * @param code ISO 3166-1 alpha-2, alpha-3 or numeric code * @return ISO 3166-1 alpha-2 */ function toAlpha2(code) { if (typeof code === "string") { if (/^[0-9]*$/.test(code)) { return numericToAlpha2(code); } if (code.length === 2) { return code.toUpperCase(); } if(code.length === 3) { return alpha3ToAlpha2(code.toUpperCase()); } } if (typeof code === "number") { return numericToAlpha2(code); } return undefined; } exports.toAlpha2 = toAlpha2; /* * @param code ISO 3166-1 alpha-2, alpha-3 or numeric code * @param lang language for country name * @return name or undefined */ exports.getName = function(code, lang) { try { var d = registeredLocales[lang.toLowerCase()]; return d[toAlpha2(code)]; } catch (err) { return undefined; } }; /* * @param lang language for country names * @return Object of country code mapped to county name */ exports.getNames = function(lang) { var d = registeredLocales[lang.toLowerCase()]; if (d === undefined) { return {}; } return d; }; /* * @param name name * @param lang language for country name * @return ISO 3166-1 alpha-2 or undefined */ exports.getAlpha2Code = function(name, lang) { try { var p, codenames = registeredLocales[lang.toLowerCase()]; for (p in codenames) { if (codenames.hasOwnProperty(p)) { if (codenames[p].toLowerCase() === name.toLowerCase()) { return p; } } } return undefined; } catch (err) { return undefined; } }; /* * @param name name * @param lang language for country name * @return ISO 3166-1 alpha-2 or undefined */ exports.getSimpleAlpha2Code = function(name, lang) { try { var p, codenames = registeredLocales[lang.toLowerCase()]; for (p in codenames) { if (codenames.hasOwnProperty(p)) { if (removeDiacritics(codenames[p].toLowerCase()) === removeDiacritics(name.toLowerCase())) { return p; } } } return undefined; } catch (err) { return undefined; } }; /* * @return Object of alpha-2 codes mapped to alpha-3 codes */ exports.getAlpha2Codes = function() { return alpha2; }; /* * @param name name * @param lang language for country name * @return ISO 3166-1 alpha-3 or undefined */ exports.getAlpha3Code = function(name, lang) { var alpha2 = this.getAlpha2Code(name, lang); if (alpha2) { return this.toAlpha3(alpha2); } else { return undefined; } }; /* * @param name name * @param lang language for country name * @return ISO 3166-1 alpha-3 or undefined */ exports.getSimpleAlpha3Code = function(name, lang) { var alpha2 = this.getSimpleAlpha2Code(name, lang); if (alpha2) { return this.toAlpha3(alpha2); } else { return undefined; } }; /* * @return Object of alpha-3 codes mapped to alpha-2 codes */ exports.getAlpha3Codes = function() { return alpha3; }; /* * @return Object of numeric codes mapped to alpha-2 codes */ exports.getNumericCodes = function() { return numeric; }; /* * @return Array of supported languages */ exports.langs = function() { return Object.keys(registeredLocales); }; /* * @param code ISO 3166-1 alpha-2, alpha-3 or numeric code * @return Boolean */ exports.isValid = function(code) { if (!code) { return false; } var coerced = code.toString().toUpperCase(); return alpha3.hasOwnProperty(coerced) || alpha2.hasOwnProperty(coerced) || numeric.hasOwnProperty(coerced); };