From ed0a96cff20ba459f62ef820a380c393306348b3 Mon Sep 17 00:00:00 2001 From: Horace Williams Date: Fri, 3 Aug 2018 17:20:10 -0700 Subject: [PATCH] Migrate to internal iso3166 defnitions This is a somewhat roundabout fix to #1179, as a way to deal with the persistent npm ls and commit hook troubles we were dealing with due to dependencies of the iso3166 package. Additionally it should give us a faster definition of these ISO lookups, since the existing approaches were implemented using linear scans through an array rather than map-based lookups. --- controller/libpostal.js | 6 +- helper/iso3166.js | 324 +++++++++++++++++++++++++++++++++ package.json | 1 - sanitizer/_boundary_country.js | 8 +- sanitizer/_iso2_to_iso3.js | 6 +- test/unit/helper/iso3166.js | 67 +++++++ test/unit/run.js | 1 + 7 files changed, 402 insertions(+), 11 deletions(-) create mode 100644 helper/iso3166.js create mode 100644 test/unit/helper/iso3166.js diff --git a/controller/libpostal.js b/controller/libpostal.js index 7ecbe3b6..dd85e9a2 100644 --- a/controller/libpostal.js +++ b/controller/libpostal.js @@ -1,5 +1,5 @@ const _ = require('lodash'); -const iso3166 = require('iso3166-1'); +const iso3166 = require('../helper/iso3166'); const Debug = require('../helper/debug'); const debugLog = new Debug('controller:libpostal'); const logger = require('pelias-logger').get('api'); @@ -91,8 +91,8 @@ function setup(libpostalService, should_execute) { return o; }, {}); - if (_.has(req.clean.parsed_text, 'country') && iso3166.is2(_.toUpper(req.clean.parsed_text.country))) { - req.clean.parsed_text.country = iso3166.to3(_.toUpper(req.clean.parsed_text.country)); + if (_.has(req.clean.parsed_text, 'country') && iso3166.isISO2Code(req.clean.parsed_text.country)) { + req.clean.parsed_text.country = iso3166.convertISO2ToISO3(req.clean.parsed_text.country); } debugLog.push(req, {parsed_text: req.clean.parsed_text}); diff --git a/helper/iso3166.js b/helper/iso3166.js new file mode 100644 index 00000000..d07da32d --- /dev/null +++ b/helper/iso3166.js @@ -0,0 +1,324 @@ +const _ = require('lodash'); + +const byISO2 = {'AF':{'country':'Afghanistan','alpha2':'AF','alpha3':'AFG','numeric':'004'}, + 'AX':{'country':'Åland Islands','alpha2':'AX','alpha3':'ALA','numeric':'248'}, + 'AL':{'country':'Albania','alpha2':'AL','alpha3':'ALB','numeric':'008'}, + 'DZ':{'country':'Algeria','alpha2':'DZ','alpha3':'DZA','numeric':'012'}, + 'AS':{'country':'American Samoa','alpha2':'AS','alpha3':'ASM','numeric':'016'}, + 'AD':{'country':'Andorra','alpha2':'AD','alpha3':'AND','numeric':'020'}, + 'AO':{'country':'Angola','alpha2':'AO','alpha3':'AGO','numeric':'024'}, + 'AI':{'country':'Anguilla','alpha2':'AI','alpha3':'AIA','numeric':'660'}, + 'AQ':{'country':'Antarctica','alpha2':'AQ','alpha3':'ATA','numeric':'010'}, + 'AG':{'country':'Antigua and Barbuda','alpha2':'AG','alpha3':'ATG','numeric':'028'}, + 'AR':{'country':'Argentina','alpha2':'AR','alpha3':'ARG','numeric':'032'}, + 'AM':{'country':'Armenia','alpha2':'AM','alpha3':'ARM','numeric':'051'}, + 'AW':{'country':'Aruba','alpha2':'AW','alpha3':'ABW','numeric':'533'}, + 'AU':{'country':'Australia','alpha2':'AU','alpha3':'AUS','numeric':'036'}, + 'AT':{'country':'Austria','alpha2':'AT','alpha3':'AUT','numeric':'040'}, + 'AZ':{'country':'Azerbaijan','alpha2':'AZ','alpha3':'AZE','numeric':'031'}, + 'BS':{'country':'Bahamas','alpha2':'BS','alpha3':'BHS','numeric':'044'}, + 'BH':{'country':'Bahrain','alpha2':'BH','alpha3':'BHR','numeric':'048'}, + 'BD':{'country':'Bangladesh','alpha2':'BD','alpha3':'BGD','numeric':'050'}, + 'BB':{'country':'Barbados','alpha2':'BB','alpha3':'BRB','numeric':'052'}, + 'BY':{'country':'Belarus','alpha2':'BY','alpha3':'BLR','numeric':'112'}, + 'BE':{'country':'Belgium','alpha2':'BE','alpha3':'BEL','numeric':'056'}, + 'BZ':{'country':'Belize','alpha2':'BZ','alpha3':'BLZ','numeric':'084'}, + 'BJ':{'country':'Benin','alpha2':'BJ','alpha3':'BEN','numeric':'204'}, + 'BM':{'country':'Bermuda','alpha2':'BM','alpha3':'BMU','numeric':'060'}, + 'BT':{'country':'Bhutan','alpha2':'BT','alpha3':'BTN','numeric':'064'}, + 'BO':{'country':'Bolivia','alpha2':'BO','alpha3':'BOL','numeric':'068'}, + 'BQ':{'country':'Bonaire, Sint Eustatius and Saba','alpha2':'BQ','alpha3':'BES','numeric':'535'}, + 'BA':{'country':'Bosnia and Herzegovina','alpha2':'BA','alpha3':'BIH','numeric':'070'}, + 'BW':{'country':'Botswana','alpha2':'BW','alpha3':'BWA','numeric':'072'}, + 'BV':{'country':'Bouvet Island','alpha2':'BV','alpha3':'BVT','numeric':'074'}, + 'BR':{'country':'Brazil','alpha2':'BR','alpha3':'BRA','numeric':'076'}, + 'IO':{'country':'British Indian Ocean Territory','alpha2':'IO','alpha3':'IOT','numeric':'086'}, + 'BN':{'country':'Brunei Darussalam','alpha2':'BN','alpha3':'BRN','numeric':'096'}, + 'BG':{'country':'Bulgaria','alpha2':'BG','alpha3':'BGR','numeric':'100'}, + 'BF':{'country':'Burkina Faso','alpha2':'BF','alpha3':'BFA','numeric':'854'}, + 'BI':{'country':'Burundi','alpha2':'BI','alpha3':'BDI','numeric':'108'}, + 'CV':{'country':'Cabo Verde','alpha2':'CV','alpha3':'CPV','numeric':'132'}, + 'KH':{'country':'Cambodia','alpha2':'KH','alpha3':'KHM','numeric':'116'}, + 'CM':{'country':'Cameroon','alpha2':'CM','alpha3':'CMR','numeric':'120'}, + 'CA':{'country':'Canada','alpha2':'CA','alpha3':'CAN','numeric':'124'}, + 'KY':{'country':'Cayman Islands','alpha2':'KY','alpha3':'CYM','numeric':'136'}, + 'CF':{'country':'Central African Republic','alpha2':'CF','alpha3':'CAF','numeric':'140'}, + 'TD':{'country':'Chad','alpha2':'TD','alpha3':'TCD','numeric':'148'}, + 'CL':{'country':'Chile','alpha2':'CL','alpha3':'CHL','numeric':'152'}, + 'CN':{'country':'China','alpha2':'CN','alpha3':'CHN','numeric':'156'}, + 'CX':{'country':'Christmas Island','alpha2':'CX','alpha3':'CXR','numeric':'162'}, + 'CC':{'country':'Cocos Islands','alpha2':'CC','alpha3':'CCK','numeric':'166'}, + 'CO':{'country':'Colombia','alpha2':'CO','alpha3':'COL','numeric':'170'}, + 'KM':{'country':'Comoros','alpha2':'KM','alpha3':'COM','numeric':'174'}, + 'CG':{'country':'Congo','alpha2':'CG','alpha3':'COG','numeric':'178'}, + 'CD':{'country':'Congo','alpha2':'CD','alpha3':'COD','numeric':'180'}, + 'CK':{'country':'Cook Islands','alpha2':'CK','alpha3':'COK','numeric':'184'}, + 'CR':{'country':'Costa Rica','alpha2':'CR','alpha3':'CRI','numeric':'188'}, + 'CI':{'country':'Côte d\'Ivoire','alpha2':'CI','alpha3':'CIV','numeric':'384'}, + 'HR':{'country':'Croatia','alpha2':'HR','alpha3':'HRV','numeric':'191'}, + 'CU':{'country':'Cuba','alpha2':'CU','alpha3':'CUB','numeric':'192'}, + 'CW':{'country':'Curaçao','alpha2':'CW','alpha3':'CUW','numeric':'531'}, + 'CY':{'country':'Cyprus','alpha2':'CY','alpha3':'CYP','numeric':'196'}, + 'CZ':{'country':'Czech Republic','alpha2':'CZ','alpha3':'CZE','numeric':'203'}, + 'DK':{'country':'Denmark','alpha2':'DK','alpha3':'DNK','numeric':'208'}, + 'DJ':{'country':'Djibouti','alpha2':'DJ','alpha3':'DJI','numeric':'262'}, + 'DM':{'country':'Dominica','alpha2':'DM','alpha3':'DMA','numeric':'212'}, + 'DO':{'country':'Dominican Republic','alpha2':'DO','alpha3':'DOM','numeric':'214'}, + 'EC':{'country':'Ecuador','alpha2':'EC','alpha3':'ECU','numeric':'218'}, + 'EG':{'country':'Egypt','alpha2':'EG','alpha3':'EGY','numeric':'818'}, + 'SV':{'country':'El Salvador','alpha2':'SV','alpha3':'SLV','numeric':'222'}, + 'GQ':{'country':'Equatorial Guinea','alpha2':'GQ','alpha3':'GNQ','numeric':'226'}, + 'ER':{'country':'Eritrea','alpha2':'ER','alpha3':'ERI','numeric':'232'}, + 'EE':{'country':'Estonia','alpha2':'EE','alpha3':'EST','numeric':'233'}, + 'ET':{'country':'Ethiopia','alpha2':'ET','alpha3':'ETH','numeric':'231'}, + 'FK':{'country':'Falkland Islands','alpha2':'FK','alpha3':'FLK','numeric':'238'}, + 'FO':{'country':'Faroe Islands','alpha2':'FO','alpha3':'FRO','numeric':'234'}, + 'FJ':{'country':'Fiji','alpha2':'FJ','alpha3':'FJI','numeric':'242'}, + 'FI':{'country':'Finland','alpha2':'FI','alpha3':'FIN','numeric':'246'}, + 'FR':{'country':'France','alpha2':'FR','alpha3':'FRA','numeric':'250'}, + 'GF':{'country':'French Guiana','alpha2':'GF','alpha3':'GUF','numeric':'254'}, + 'PF':{'country':'French Polynesia','alpha2':'PF','alpha3':'PYF','numeric':'258'}, + 'TF':{'country':'French Southern Territories','alpha2':'TF','alpha3':'ATF','numeric':'260'}, + 'GA':{'country':'Gabon','alpha2':'GA','alpha3':'GAB','numeric':'266'}, + 'GM':{'country':'Gambia','alpha2':'GM','alpha3':'GMB','numeric':'270'}, + 'GE':{'country':'Georgia','alpha2':'GE','alpha3':'GEO','numeric':'268'}, + 'DE':{'country':'Germany','alpha2':'DE','alpha3':'DEU','numeric':'276'}, + 'GH':{'country':'Ghana','alpha2':'GH','alpha3':'GHA','numeric':'288'}, + 'GI':{'country':'Gibraltar','alpha2':'GI','alpha3':'GIB','numeric':'292'}, + 'GR':{'country':'Greece','alpha2':'GR','alpha3':'GRC','numeric':'300'}, + 'GL':{'country':'Greenland','alpha2':'GL','alpha3':'GRL','numeric':'304'}, + 'GD':{'country':'Grenada','alpha2':'GD','alpha3':'GRD','numeric':'308'}, + 'GP':{'country':'Guadeloupe','alpha2':'GP','alpha3':'GLP','numeric':'312'}, + 'GU':{'country':'Guam','alpha2':'GU','alpha3':'GUM','numeric':'316'}, + 'GT':{'country':'Guatemala','alpha2':'GT','alpha3':'GTM','numeric':'320'}, + 'GG':{'country':'Guernsey','alpha2':'GG','alpha3':'GGY','numeric':'831'}, + 'GN':{'country':'Guinea','alpha2':'GN','alpha3':'GIN','numeric':'324'}, + 'GW':{'country':'Guinea-Bissau','alpha2':'GW','alpha3':'GNB','numeric':'624'}, + 'GY':{'country':'Guyana','alpha2':'GY','alpha3':'GUY','numeric':'328'}, + 'HT':{'country':'Haiti','alpha2':'HT','alpha3':'HTI','numeric':'332'}, + 'HM':{'country':'Heard Island and McDonald Islands','alpha2':'HM','alpha3':'HMD','numeric':'334'}, + 'VA':{'country':'Holy See','alpha2':'VA','alpha3':'VAT','numeric':'336'}, + 'HN':{'country':'Honduras','alpha2':'HN','alpha3':'HND','numeric':'340'}, + 'HK':{'country':'Hong Kong','alpha2':'HK','alpha3':'HKG','numeric':'344'}, + 'HU':{'country':'Hungary','alpha2':'HU','alpha3':'HUN','numeric':'348'}, + 'IS':{'country':'Iceland','alpha2':'IS','alpha3':'ISL','numeric':'352'}, + 'IN':{'country':'India','alpha2':'IN','alpha3':'IND','numeric':'356'}, + 'ID':{'country':'Indonesia','alpha2':'ID','alpha3':'IDN','numeric':'360'}, + 'IR':{'country':'Islamic Republic of Iran','alpha2':'IR','alpha3':'IRN','numeric':'364'}, + 'IQ':{'country':'Iraq','alpha2':'IQ','alpha3':'IRQ','numeric':'368'}, + 'IE':{'country':'Ireland','alpha2':'IE','alpha3':'IRL','numeric':'372'}, + 'IM':{'country':'Isle of Man','alpha2':'IM','alpha3':'IMN','numeric':'833'}, + 'IL':{'country':'Israel','alpha2':'IL','alpha3':'ISR','numeric':'376'}, + 'IT':{'country':'Italy','alpha2':'IT','alpha3':'ITA','numeric':'380'}, + 'JM':{'country':'Jamaica','alpha2':'JM','alpha3':'JAM','numeric':'388'}, + 'JP':{'country':'Japan','alpha2':'JP','alpha3':'JPN','numeric':'392'}, + 'JE':{'country':'Jersey','alpha2':'JE','alpha3':'JEY','numeric':'832'}, + 'JO':{'country':'Jordan','alpha2':'JO','alpha3':'JOR','numeric':'400'}, + 'KZ':{'country':'Kazakhstan','alpha2':'KZ','alpha3':'KAZ','numeric':'398'}, + 'KE':{'country':'Kenya','alpha2':'KE','alpha3':'KEN','numeric':'404'}, + 'KI':{'country':'Kiribati','alpha2':'KI','alpha3':'KIR','numeric':'296'}, + 'KP':{'country':'Democratic People\'s Republic of Korea','alpha2':'KP','alpha3':'PRK','numeric':'408'}, + 'KR':{'country':'Republic of Korea','alpha2':'KR','alpha3':'KOR','numeric':'410'}, + 'KW':{'country':'Kuwait','alpha2':'KW','alpha3':'KWT','numeric':'414'}, + 'KG':{'country':'Kyrgyzstan','alpha2':'KG','alpha3':'KGZ','numeric':'417'}, + 'LA':{'country':'Lao People\'s Democratic Republic','alpha2':'LA','alpha3':'LAO','numeric':'418'}, + 'LV':{'country':'Latvia','alpha2':'LV','alpha3':'LVA','numeric':'428'}, + 'LB':{'country':'Lebanon','alpha2':'LB','alpha3':'LBN','numeric':'422'}, + 'LS':{'country':'Lesotho','alpha2':'LS','alpha3':'LSO','numeric':'426'}, + 'LR':{'country':'Liberia','alpha2':'LR','alpha3':'LBR','numeric':'430'}, + 'LY':{'country':'Libya','alpha2':'LY','alpha3':'LBY','numeric':'434'}, + 'LI':{'country':'Liechtenstein','alpha2':'LI','alpha3':'LIE','numeric':'438'}, + 'LT':{'country':'Lithuania','alpha2':'LT','alpha3':'LTU','numeric':'440'}, + 'LU':{'country':'Luxembourg','alpha2':'LU','alpha3':'LUX','numeric':'442'}, + 'MO':{'country':'Macao','alpha2':'MO','alpha3':'MAC','numeric':'446'}, + 'MK':{'country':'Macedonia','alpha2':'MK','alpha3':'MKD','numeric':'807'}, + 'MG':{'country':'Madagascar','alpha2':'MG','alpha3':'MDG','numeric':'450'}, + 'MW':{'country':'Malawi','alpha2':'MW','alpha3':'MWI','numeric':'454'}, + 'MY':{'country':'Malaysia','alpha2':'MY','alpha3':'MYS','numeric':'458'}, + 'MV':{'country':'Maldives','alpha2':'MV','alpha3':'MDV','numeric':'462'}, + 'ML':{'country':'Mali','alpha2':'ML','alpha3':'MLI','numeric':'466'}, + 'MT':{'country':'Malta','alpha2':'MT','alpha3':'MLT','numeric':'470'}, + 'MH':{'country':'Marshall Islands','alpha2':'MH','alpha3':'MHL','numeric':'584'}, + 'MQ':{'country':'Martinique','alpha2':'MQ','alpha3':'MTQ','numeric':'474'}, + 'MR':{'country':'Mauritania','alpha2':'MR','alpha3':'MRT','numeric':'478'}, + 'MU':{'country':'Mauritius','alpha2':'MU','alpha3':'MUS','numeric':'480'}, + 'YT':{'country':'Mayotte','alpha2':'YT','alpha3':'MYT','numeric':'175'}, + 'MX':{'country':'Mexico','alpha2':'MX','alpha3':'MEX','numeric':'484'}, + 'FM':{'country':'Federated States of Micronesia','alpha2':'FM','alpha3':'FSM','numeric':'583'}, + 'MD':{'country':'Republic of Moldova','alpha2':'MD','alpha3':'MDA','numeric':'498'}, + 'MC':{'country':'Monaco','alpha2':'MC','alpha3':'MCO','numeric':'492'}, + 'MN':{'country':'Mongolia','alpha2':'MN','alpha3':'MNG','numeric':'496'}, + 'ME':{'country':'Montenegro','alpha2':'ME','alpha3':'MNE','numeric':'499'}, + 'MS':{'country':'Montserrat','alpha2':'MS','alpha3':'MSR','numeric':'500'}, + 'MA':{'country':'Morocco','alpha2':'MA','alpha3':'MAR','numeric':'504'}, + 'MZ':{'country':'Mozambique','alpha2':'MZ','alpha3':'MOZ','numeric':'508'}, + 'MM':{'country':'Myanmar','alpha2':'MM','alpha3':'MMR','numeric':'104'}, + 'NA':{'country':'Namibia','alpha2':'NA','alpha3':'NAM','numeric':'516'}, + 'NR':{'country':'Nauru','alpha2':'NR','alpha3':'NRU','numeric':'520'}, + 'NP':{'country':'Nepal','alpha2':'NP','alpha3':'NPL','numeric':'524'}, + 'NL':{'country':'Netherlands','alpha2':'NL','alpha3':'NLD','numeric':'528'}, + 'NC':{'country':'New Caledonia','alpha2':'NC','alpha3':'NCL','numeric':'540'}, + 'NZ':{'country':'New Zealand','alpha2':'NZ','alpha3':'NZL','numeric':'554'}, + 'NI':{'country':'Nicaragua','alpha2':'NI','alpha3':'NIC','numeric':'558'}, + 'NE':{'country':'Niger','alpha2':'NE','alpha3':'NER','numeric':'562'}, + 'NG':{'country':'Nigeria','alpha2':'NG','alpha3':'NGA','numeric':'566'}, + 'NU':{'country':'Niue','alpha2':'NU','alpha3':'NIU','numeric':'570'}, + 'NF':{'country':'Norfolk Island','alpha2':'NF','alpha3':'NFK','numeric':'574'}, + 'MP':{'country':'Northern Mariana Islands','alpha2':'MP','alpha3':'MNP','numeric':'580'}, + 'NO':{'country':'Norway','alpha2':'NO','alpha3':'NOR','numeric':'578'}, + 'OM':{'country':'Oman','alpha2':'OM','alpha3':'OMN','numeric':'512'}, + 'PK':{'country':'Pakistan','alpha2':'PK','alpha3':'PAK','numeric':'586'}, + 'PW':{'country':'Palau','alpha2':'PW','alpha3':'PLW','numeric':'585'}, + 'PS':{'country':'State of Palestine','alpha2':'PS','alpha3':'PSE','numeric':'275'}, + 'PA':{'country':'Panama','alpha2':'PA','alpha3':'PAN','numeric':'591'}, + 'PG':{'country':'Papua New Guinea','alpha2':'PG','alpha3':'PNG','numeric':'598'}, + 'PY':{'country':'Paraguay','alpha2':'PY','alpha3':'PRY','numeric':'600'}, + 'PE':{'country':'Peru','alpha2':'PE','alpha3':'PER','numeric':'604'}, + 'PH':{'country':'Philippines','alpha2':'PH','alpha3':'PHL','numeric':'608'}, + 'PN':{'country':'Pitcairn','alpha2':'PN','alpha3':'PCN','numeric':'612'}, + 'PL':{'country':'Poland','alpha2':'PL','alpha3':'POL','numeric':'616'}, + 'PT':{'country':'Portugal','alpha2':'PT','alpha3':'PRT','numeric':'620'}, + 'PR':{'country':'Puerto Rico','alpha2':'PR','alpha3':'PRI','numeric':'630'}, + 'QA':{'country':'Qatar','alpha2':'QA','alpha3':'QAT','numeric':'634'}, + 'RE':{'country':'Réunion','alpha2':'RE','alpha3':'REU','numeric':'638'}, + 'RO':{'country':'Romania','alpha2':'RO','alpha3':'ROU','numeric':'642'}, + 'RU':{'country':'Russian Federation','alpha2':'RU','alpha3':'RUS','numeric':'643'}, + 'RW':{'country':'Rwanda','alpha2':'RW','alpha3':'RWA','numeric':'646'}, + 'BL':{'country':'Saint Barthélemy','alpha2':'BL','alpha3':'BLM','numeric':'652'}, + 'SH':{'country':'Saint Helena, Ascension and Tristan da Cunha','alpha2':'SH','alpha3':'SHN','numeric':'654'}, + 'KN':{'country':'Saint Kitts and Nevis','alpha2':'KN','alpha3':'KNA','numeric':'659'}, + 'LC':{'country':'Saint Lucia','alpha2':'LC','alpha3':'LCA','numeric':'662'}, + 'MF':{'country':'Saint Martin','alpha2':'MF','alpha3':'MAF','numeric':'663'}, + 'PM':{'country':'Saint Pierre and Miquelon','alpha2':'PM','alpha3':'SPM','numeric':'666'}, + 'VC':{'country':'Saint Vincent and the Grenadines','alpha2':'VC','alpha3':'VCT','numeric':'670'}, + 'WS':{'country':'Samoa','alpha2':'WS','alpha3':'WSM','numeric':'882'}, + 'SM':{'country':'San Marino','alpha2':'SM','alpha3':'SMR','numeric':'674'}, + 'ST':{'country':'Sao Tome and Principe','alpha2':'ST','alpha3':'STP','numeric':'678'}, + 'SA':{'country':'Saudi Arabia','alpha2':'SA','alpha3':'SAU','numeric':'682'}, + 'SN':{'country':'Senegal','alpha2':'SN','alpha3':'SEN','numeric':'686'}, + 'RS':{'country':'Serbia','alpha2':'RS','alpha3':'SRB','numeric':'688'}, + 'SC':{'country':'Seychelles','alpha2':'SC','alpha3':'SYC','numeric':'690'}, + 'SL':{'country':'Sierra Leone','alpha2':'SL','alpha3':'SLE','numeric':'694'}, + 'SG':{'country':'Singapore','alpha2':'SG','alpha3':'SGP','numeric':'702'}, + 'SX':{'country':'Sint Maarten','alpha2':'SX','alpha3':'SXM','numeric':'534'}, + 'SK':{'country':'Slovakia','alpha2':'SK','alpha3':'SVK','numeric':'703'}, + 'SI':{'country':'Slovenia','alpha2':'SI','alpha3':'SVN','numeric':'705'}, + 'SB':{'country':'Solomon Islands','alpha2':'SB','alpha3':'SLB','numeric':'090'}, + 'SO':{'country':'Somalia','alpha2':'SO','alpha3':'SOM','numeric':'706'}, + 'ZA':{'country':'South Africa','alpha2':'ZA','alpha3':'ZAF','numeric':'710'}, + 'GS':{'country':'South Georgia and the South Sandwich Islands','alpha2':'GS','alpha3':'SGS','numeric':'239'}, + 'SS':{'country':'South Sudan','alpha2':'SS','alpha3':'SSD','numeric':'728'}, + 'ES':{'country':'Spain','alpha2':'ES','alpha3':'ESP','numeric':'724'}, + 'LK':{'country':'Sri Lanka','alpha2':'LK','alpha3':'LKA','numeric':'144'}, + 'SD':{'country':'Sudan','alpha2':'SD','alpha3':'SDN','numeric':'729'}, + 'SR':{'country':'Suriname','alpha2':'SR','alpha3':'SUR','numeric':'740'}, + 'SJ':{'country':'Svalbard and Jan Mayen','alpha2':'SJ','alpha3':'SJM','numeric':'744'}, + 'SZ':{'country':'Swaziland','alpha2':'SZ','alpha3':'SWZ','numeric':'748'}, + 'SE':{'country':'Sweden','alpha2':'SE','alpha3':'SWE','numeric':'752'}, + 'CH':{'country':'Switzerland','alpha2':'CH','alpha3':'CHE','numeric':'756'}, + 'SY':{'country':'Syrian Arab Republic','alpha2':'SY','alpha3':'SYR','numeric':'760'}, + 'TW':{'country':'Taiwan, Province of China','alpha2':'TW','alpha3':'TWN','numeric':'158'}, + 'TJ':{'country':'Tajikistan','alpha2':'TJ','alpha3':'TJK','numeric':'762'}, + 'TZ':{'country':'United Republic of Tanzania','alpha2':'TZ','alpha3':'TZA','numeric':'834'}, + 'TH':{'country':'Thailand','alpha2':'TH','alpha3':'THA','numeric':'764'}, + 'TL':{'country':'Timor-Leste','alpha2':'TL','alpha3':'TLS','numeric':'626'}, + 'TG':{'country':'Togo','alpha2':'TG','alpha3':'TGO','numeric':'768'}, + 'TK':{'country':'Tokelau','alpha2':'TK','alpha3':'TKL','numeric':'772'}, + 'TO':{'country':'Tonga','alpha2':'TO','alpha3':'TON','numeric':'776'}, + 'TT':{'country':'Trinidad and Tobago','alpha2':'TT','alpha3':'TTO','numeric':'780'}, + 'TN':{'country':'Tunisia','alpha2':'TN','alpha3':'TUN','numeric':'788'}, + 'TR':{'country':'Turkey','alpha2':'TR','alpha3':'TUR','numeric':'792'}, + 'TM':{'country':'Turkmenistan','alpha2':'TM','alpha3':'TKM','numeric':'795'}, + 'TC':{'country':'Turks and Caicos Islands','alpha2':'TC','alpha3':'TCA','numeric':'796'}, + 'TV':{'country':'Tuvalu','alpha2':'TV','alpha3':'TUV','numeric':'798'}, + 'UG':{'country':'Uganda','alpha2':'UG','alpha3':'UGA','numeric':'800'}, + 'UA':{'country':'Ukraine','alpha2':'UA','alpha3':'UKR','numeric':'804'}, + 'AE':{'country':'United Arab Emirates','alpha2':'AE','alpha3':'ARE','numeric':'784'}, + 'GB':{'country':'United Kingdom of Great Britain and Northern Ireland','alpha2':'GB','alpha3':'GBR','numeric':'826'}, + 'US':{'country':'United States of America','alpha2':'US','alpha3':'USA','numeric':'840'}, + 'UM':{'country':'United States Minor Outlying Islands','alpha2':'UM','alpha3':'UMI','numeric':'581'}, + 'UY':{'country':'Uruguay','alpha2':'UY','alpha3':'URY','numeric':'858'}, + 'UZ':{'country':'Uzbekistan','alpha2':'UZ','alpha3':'UZB','numeric':'860'}, + 'VU':{'country':'Vanuatu','alpha2':'VU','alpha3':'VUT','numeric':'548'}, + 'VE':{'country':'Venezuela (Bolivarian Republic of)','alpha2':'VE','alpha3':'VEN','numeric':'862'}, + 'VN':{'country':'Viet Nam','alpha2':'VN','alpha3':'VNM','numeric':'704'}, + 'VG':{'country':'Virgin Islands','alpha2':'VG','alpha3':'VGB','numeric':'092'}, + 'VI':{'country':'Virgin Islands','alpha2':'VI','alpha3':'VIR','numeric':'850'}, + 'WF':{'country':'Wallis and Futuna','alpha2':'WF','alpha3':'WLF','numeric':'876'}, + 'EH':{'country':'Western Sahara','alpha2':'EH','alpha3':'ESH','numeric':'732'}, + 'YE':{'country':'Yemen','alpha2':'YE','alpha3':'YEM','numeric':'887'}, + 'ZM':{'country':'Zambia','alpha2':'ZM','alpha3':'ZMB','numeric':'894'}, + 'ZW':{'country':'Zimbabwe','alpha2':'ZW','alpha3':'ZWE','numeric':'716'}}; + +const iso3to2 = {'AFG':'AF','ALA':'AX','ALB':'AL','DZA':'DZ','ASM':'AS','AND':'AD','AGO':'AO', + 'AIA':'AI','ATA':'AQ','ATG':'AG','ARG':'AR','ARM':'AM','ABW':'AW','AUS':'AU', + 'AUT':'AT','AZE':'AZ','BHS':'BS','BHR':'BH','BGD':'BD','BRB':'BB','BLR':'BY', + 'BEL':'BE','BLZ':'BZ','BEN':'BJ','BMU':'BM','BTN':'BT','BOL':'BO','BES':'BQ', + 'BIH':'BA','BWA':'BW','BVT':'BV','BRA':'BR','IOT':'IO','BRN':'BN','BGR':'BG', + 'BFA':'BF','BDI':'BI','CPV':'CV','KHM':'KH','CMR':'CM','CAN':'CA','CYM':'KY', + 'CAF':'CF','TCD':'TD','CHL':'CL','CHN':'CN','CXR':'CX','CCK':'CC','COL':'CO', + 'COM':'KM','COG':'CG','COD':'CD','COK':'CK','CRI':'CR','CIV':'CI','HRV':'HR', + 'CUB':'CU','CUW':'CW','CYP':'CY','CZE':'CZ','DNK':'DK','DJI':'DJ','DMA':'DM', + 'DOM':'DO','ECU':'EC','EGY':'EG','SLV':'SV','GNQ':'GQ','ERI':'ER','EST':'EE', + 'ETH':'ET','FLK':'FK','FRO':'FO','FJI':'FJ','FIN':'FI','FRA':'FR','GUF':'GF', + 'PYF':'PF','ATF':'TF','GAB':'GA','GMB':'GM','GEO':'GE','DEU':'DE','GHA':'GH', + 'GIB':'GI','GRC':'GR','GRL':'GL','GRD':'GD','GLP':'GP','GUM':'GU','GTM':'GT', + 'GGY':'GG','GIN':'GN','GNB':'GW','GUY':'GY','HTI':'HT','HMD':'HM','VAT':'VA', + 'HND':'HN','HKG':'HK','HUN':'HU','ISL':'IS','IND':'IN','IDN':'ID','IRN':'IR', + 'IRQ':'IQ','IRL':'IE','IMN':'IM','ISR':'IL','ITA':'IT','JAM':'JM','JPN':'JP', + 'JEY':'JE','JOR':'JO','KAZ':'KZ','KEN':'KE','KIR':'KI','PRK':'KP','KOR':'KR', + 'KWT':'KW','KGZ':'KG','LAO':'LA','LVA':'LV','LBN':'LB','LSO':'LS','LBR':'LR', + 'LBY':'LY','LIE':'LI','LTU':'LT','LUX':'LU','MAC':'MO','MKD':'MK','MDG':'MG', + 'MWI':'MW','MYS':'MY','MDV':'MV','MLI':'ML','MLT':'MT','MHL':'MH','MTQ':'MQ', + 'MRT':'MR','MUS':'MU','MYT':'YT','MEX':'MX','FSM':'FM','MDA':'MD','MCO':'MC', + 'MNG':'MN','MNE':'ME','MSR':'MS','MAR':'MA','MOZ':'MZ','MMR':'MM','NAM':'NA', + 'NRU':'NR','NPL':'NP','NLD':'NL','NCL':'NC','NZL':'NZ','NIC':'NI','NER':'NE', + 'NGA':'NG','NIU':'NU','NFK':'NF','MNP':'MP','NOR':'NO','OMN':'OM','PAK':'PK', + 'PLW':'PW','PSE':'PS','PAN':'PA','PNG':'PG','PRY':'PY','PER':'PE','PHL':'PH', + 'PCN':'PN','POL':'PL','PRT':'PT','PRI':'PR','QAT':'QA','REU':'RE','ROU':'RO', + 'RUS':'RU','RWA':'RW','BLM':'BL','SHN':'SH','KNA':'KN','LCA':'LC','MAF':'MF', + 'SPM':'PM','VCT':'VC','WSM':'WS','SMR':'SM','STP':'ST','SAU':'SA','SEN':'SN', + 'SRB':'RS','SYC':'SC','SLE':'SL','SGP':'SG','SXM':'SX','SVK':'SK','SVN':'SI', + 'SLB':'SB','SOM':'SO','ZAF':'ZA','SGS':'GS','SSD':'SS','ESP':'ES','LKA':'LK', + 'SDN':'SD','SUR':'SR','SJM':'SJ','SWZ':'SZ','SWE':'SE','CHE':'CH','SYR':'SY', + 'TWN':'TW','TJK':'TJ','TZA':'TZ','THA':'TH','TLS':'TL','TGO':'TG','TKL':'TK', + 'TON':'TO','TTO':'TT','TUN':'TN','TUR':'TR','TKM':'TM','TCA':'TC','TUV':'TV', + 'UGA':'UG','UKR':'UA','ARE':'AE','GBR':'GB','USA':'US','UMI':'UM','URY':'UY', + 'UZB':'UZ','VUT':'VU','VEN':'VE','VNM':'VN','VGB':'VG','VIR':'VI','WLF':'WF', + 'ESH':'EH','YEM':'YE','ZMB':'ZM','ZWE':'ZW'}; + + +function isISO2Code(code) { + return byISO2[_.toUpper(code)] !== undefined; +} + +function isISO3Code(code) { + return iso3to2[_.toUpper(code)] !== undefined; +} + +function convertISO2ToISO3(code) { + const country = byISO2[_.toUpper(code)]; + if (country !== undefined) { + return country.alpha3; + } +} + +function convertISO3ToISO2(code) { + return iso3to2[_.toUpper(code)]; +} + +function iso3Code(code) { + if (isISO2Code(code)) { + return convertISO2ToISO3(code); + } else if (isISO3Code(code)) { + return _.toUpper(code); + } +} + +module.exports = { + isISO2Code, + isISO3Code, + convertISO2ToISO3, + convertISO3ToISO2, + iso3Code +}; diff --git a/package.json b/package.json index 9c6e977e..2d1f2f06 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "geojson": "^0.5.0", "geolib": "^2.0.18", "iso-639-3": "^1.0.0", - "iso3166-1": "^0.3.0", "joi": "^13.1.3", "locale": "^0.1.0", "lodash": "^4.17.4", diff --git a/sanitizer/_boundary_country.js b/sanitizer/_boundary_country.js index 2b7f9bb3..81a5e7d5 100644 --- a/sanitizer/_boundary_country.js +++ b/sanitizer/_boundary_country.js @@ -1,5 +1,5 @@ const check = require('check-types'); -const iso3166 = require('iso3166-1'); +const iso3166 = require('../helper/iso3166'); function _sanitize(raw, clean) { // error & warning messages @@ -18,7 +18,7 @@ function _sanitize(raw, clean) { } // must be a valid ISO 3166 code - else if (!containsIsoCode(country.toUpperCase())) { + else if (!containsIsoCode(country)) { messages.errors.push(country + ' is not a valid ISO2/ISO3 country code'); } @@ -26,7 +26,7 @@ function _sanitize(raw, clean) { else { // the only way for boundary.country to be assigned is if input is // a string and a known ISO2 or ISO3 - clean['boundary.country'] = iso3166.to3(country.toUpperCase()); + clean['boundary.country'] = iso3166.iso3Code(country); } } @@ -34,7 +34,7 @@ function _sanitize(raw, clean) { } function containsIsoCode(isoCode) { - return iso3166.is2(isoCode) || iso3166.is3(isoCode); + return iso3166.isISO2Code(isoCode) || iso3166.isISO3Code(isoCode); } function _expected(){ diff --git a/sanitizer/_iso2_to_iso3.js b/sanitizer/_iso2_to_iso3.js index 6b37cec2..882f80d7 100644 --- a/sanitizer/_iso2_to_iso3.js +++ b/sanitizer/_iso2_to_iso3.js @@ -1,5 +1,5 @@ const _ = require('lodash'); -const iso3166 = require('iso3166-1'); +const iso3166 = require('../helper/iso3166'); // this sanitizer exists solely to convert an ISO2 country value to ISO3 // eg - 'TH' -> 'THA' @@ -8,8 +8,8 @@ function _sanitize( raw, clean ){ // error & warning messages const messages = { errors: [], warnings: [] }; - if (clean.hasOwnProperty('parsed_text') && iso3166.is2(_.toUpper(clean.parsed_text.country))) { - clean.parsed_text.country = iso3166.to3(_.toUpper(clean.parsed_text.country)); + if (clean.hasOwnProperty('parsed_text') && iso3166.isISO2Code(clean.parsed_text.country)) { + clean.parsed_text.country = iso3166.convertISO2ToISO3(clean.parsed_text.country); } return messages; diff --git a/test/unit/helper/iso3166.js b/test/unit/helper/iso3166.js new file mode 100644 index 00000000..0d78715b --- /dev/null +++ b/test/unit/helper/iso3166.js @@ -0,0 +1,67 @@ +var iso3166 = require('../../../helper/iso3166'); + +module.exports.tests = {}; + +module.exports.tests.recognizingISOCodes = function(test, common) { + test('Recognizes iso2 codes', function(t) { + t.true(iso3166.isISO2Code('US')); + t.true(iso3166.isISO2Code('Us')); + t.false(iso3166.isISO2Code('xx')); + t.end(); + }); + + test('Recognizes iso3 codes', function(t) { + t.true(iso3166.isISO3Code('USA')); + t.true(iso3166.isISO3Code('UsA')); + t.false(iso3166.isISO3Code('xxx')); + t.end(); + }); +}; + +module.exports.tests.convertingISOCodes = function(test, common) { + test('converts iso2 to iso3', function(t) { + t.equal('USA', iso3166.convertISO2ToISO3('uS')); + t.equal('FRA', iso3166.convertISO2ToISO3('FR')); + t.equal('FRA', iso3166.convertISO2ToISO3('Fr')); + t.equal(undefined, iso3166.convertISO2ToISO3('uSa')); + t.equal(undefined, iso3166.convertISO2ToISO3('xx')); + t.end(); + }); + + test('converts iso3 to iso2', function(t) { + t.equal('US', iso3166.convertISO3ToISO2('uSa')); + t.equal('FR', iso3166.convertISO3ToISO2('fra')); + t.equal('FR', iso3166.convertISO3ToISO2('frA')); + t.equal(undefined, iso3166.convertISO3ToISO2('xxx')); + t.equal(undefined, iso3166.convertISO3ToISO2('fr')); + t.end(); + }); +}; + +module.exports.tests.getISO3Code = function(test, common) { + test('Gets iso 3 code for iso 2 code', function(t) { + t.equal('USA', iso3166.iso3Code('uS')); + t.equal('FRA', iso3166.iso3Code('fr')); + t.equal(undefined, iso3166.iso3Code('xxx')); + t.end(); + }); + + test('Recognizes and returns existing ISO 3 code', function(t) { + t.equal('USA', iso3166.iso3Code('USA')); + t.equal('FRA', iso3166.iso3Code('FRA')); + t.end(); + }); + + test('Upcases given ISO3 code if needed', function(t) { + t.equal('USA', iso3166.iso3Code('UsA')); + t.equal('USA', iso3166.iso3Code('usa')); + t.equal('FRA', iso3166.iso3Code('FRa')); + t.end(); + }); +}; + +module.exports.all = function (test, common) { + for( var testCase in module.exports.tests ){ + module.exports.tests[testCase](test, common); + } +}; diff --git a/test/unit/run.js b/test/unit/run.js index f196dc53..c8eee73a 100644 --- a/test/unit/run.js +++ b/test/unit/run.js @@ -37,6 +37,7 @@ var tests = [ require('./helper/fieldValue'), require('./helper/geojsonify_place_details'), require('./helper/geojsonify'), + require('./helper/iso3166'), require('./helper/logging'), require('./helper/TypeMapping'), require('./helper/type_mapping'),