From c292df4f23d74f28f4e5a490e1b81bafdf0df713 Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Sun, 12 Jan 2025 16:27:43 +0800 Subject: [PATCH] Improvements --- .github/workflows/docker-image.yml | 5 + frontend/components/SpeedTest.vue | 89 +- frontend/locales/en.json | 17 +- frontend/locales/fr.json | 5 +- frontend/locales/zh.json | 33 +- frontend/utils/speedtest-colos.js | 1324 ++++++++++++++++++++++++++++ 6 files changed, 1448 insertions(+), 25 deletions(-) create mode 100644 frontend/utils/speedtest-colos.js diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 88d53e70..f6f49113 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -40,6 +40,11 @@ jobs: printf "RELEASE_VERSION=%s\n" "${{ github.event.release.tag_name }}" >> $GITHUB_ENV printf "RELEASE_NOTES<> $GITHUB_ENV + - name: Clean RELEASE_NOTES + run: | + export CLEAN_RELEASE_NOTES=$(echo "${{ env.RELEASE_NOTES }}" | sed '/^\s*$/d') + echo "RELEASE_NOTES=${CLEAN_RELEASE_NOTES}" >> $GITHUB_ENV + - name: Set version for manual dispatch if: github.event_name == 'workflow_dispatch' run: | diff --git a/frontend/components/SpeedTest.vue b/frontend/components/SpeedTest.vue index a228cd8b..168e2401 100644 --- a/frontend/components/SpeedTest.vue +++ b/frontend/components/SpeedTest.vue @@ -44,6 +44,25 @@ + +
+
+ + {{connectionData.country}} + +
+
+ +
+
+ + {{connectionData.colo}},  + {{connectionData.coloCountry}} +
+
+
-

{{ t('speedtest.score') }} +

  + + {{ t('speedtest.connectionFrom') }} + {{ connectionData.ip }} ( {{ connectionData.country }} ) + {{ t('speedtest.connectionTo') }} + {{ connectionData.colo }} + ( {{ connectionData.coloCity }} + , {{ connectionData.coloCountry }} ) + {{ t('speedtest.connectionEnd') }} + + {{ t('speedtest.score') }} {{ t('speedtest.videoStreaming') }} {{ speedTest.streamingScore }} @@ -113,6 +142,9 @@ import { ref, computed, onMounted, reactive, markRaw } from 'vue'; import { useMainStore } from '@/store'; import { useI18n } from 'vue-i18n'; import { trackEvent } from '@/utils/use-analytics'; +import { isValidIP } from '@/utils/valid-ip.js'; +import getCountryName from '@/utils/country-name.js'; +import getColoCountry from '@/utils/speedtest-colos.js'; // 引入 SpeedTest import SpeedTestEngine from '@cloudflare/speedtest'; @@ -121,6 +153,7 @@ const { t } = useI18n(); const store = useMainStore(); const isDarkMode = computed(() => store.isDarkMode); const isMobile = computed(() => store.isMobile); +const lang = computed(() => store.lang); const speedTest = reactive({ id: "speedTest", @@ -147,6 +180,40 @@ const packageSize = reactive({ } }); +const connectionData = ref({ + ip: "", + colo: "", + loc: "", + country: "", + coloCountry: "", + coloCountryCode: "", + coloCity: "" +}); + +const getIPFromSpeedTest = async () => { + try { + const response = await fetch("https://speed.cloudflare.com/cdn-cgi/trace"); + const data = await response.text(); + const lines = data.split("\n"); + + const ip = lines.find((line) => line.startsWith("ip="))?.split("=")[1]; + const colo = lines.find((line) => line.startsWith("colo="))?.split("=")[1]; + const loc = lines.find((line) => line.startsWith("loc="))?.split("=")[1]; + + if (isValidIP(ip)) { + const country = getCountryName(loc, lang.value) || ''; + const coloCountryCode = getColoCountry(colo).country || ''; + const coloCity = getColoCountry(colo).city || ''; + const coloCountry = getCountryName(coloCountryCode, lang.value) || ''; + return { ip, colo, loc, country, coloCountry, coloCountryCode, coloCity }; + } else { + console.error("Invalid IP from SpeedTest Server:", ip); + } + } catch (error) { + console.error("Error fetching IP from SpeedTest Server:", error); + } +}; + // 定义 Speed Test 引擎 let testEngine; @@ -166,12 +233,15 @@ const resetSpeedTest = () => { }; // Speed Test 引擎 -const speedTestController = () => { +const speedTestController = async () => { if (speedTestStatus.value === 'running') { testEngine.pause(); speedTestStatus.value = "paused"; } else { startSpeedTest(); + if (!connectionData.value.ip) { + connectionData.value = await getIPFromSpeedTest(); + } } }; @@ -365,8 +435,23 @@ defineExpose({ background-color: var(--bs-btn-hover-bg); border-color: var(--bs-btn-hover-border-color); } + .jn-text-warning { --bs-text-opacity: 1; color: #c67c14; } + +.slide-fade-enter-active { + transition: all 0.3s ease-out; +} + +.slide-fade-leave-active { + transition: all 0.8s cubic-bezier(1, 0.5, 0.8, 1); +} + +.slide-fade-enter-from, +.slide-fade-leave-to { + transform: translateX(20px); + opacity: 0; +} diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 439d3357..b8c4b1db 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -57,12 +57,12 @@ "Optional": "Optional", "Essential": "Essential", "Advanced": "Advanced", - "Reset":"Reset Checklist", - "ShowAll":"Show All", - "ShowUnchecked":"Show Unchecked", - "ShowIgnored":"Show Ignored", - "ShowChecked":"Show Checked", - "Loading":"Loading..." + "Reset": "Reset Checklist", + "ShowAll": "Show All", + "ShowUnchecked": "Show Unchecked", + "ShowIgnored": "Show Ignored", + "ShowChecked": "Show Checked", + "Loading": "Loading..." }, "shell": { "Title": "Command Line API", @@ -407,7 +407,10 @@ "gaming": ", Gaming: ", "rtc": ", Video Chatting: ", "score": "Based on the speed test, got the following quality scores:", - "resultNote": ". The score is for reference only." + "resultNote": ". The score is for reference only.", + "connectionFrom": "Finished speed test from your IP: ", + "connectionTo": " to test server:", + "connectionEnd": " ." }, "pingtest": { "id": "pingtest", diff --git a/frontend/locales/fr.json b/frontend/locales/fr.json index 54a27877..48c37026 100644 --- a/frontend/locales/fr.json +++ b/frontend/locales/fr.json @@ -407,7 +407,10 @@ "gaming": ", Jeu : ", "rtc": ", Chat vidéo : ", "score": "Sur la base du test de vitesse, voici les scores de qualité suivants :", - "resultNote": ". Le score est donné à titre indicatif seulement." + "resultNote": ". Le score est donné à titre indicatif seulement.", + "connectionFrom": "Test de vitesse terminé depuis votre IP: ", + "connectionTo": " vers le serveur de test:", + "connectionEnd": " ." }, "pingtest": { "id": "pingtest", diff --git a/frontend/locales/zh.json b/frontend/locales/zh.json index c7294329..205e7003 100644 --- a/frontend/locales/zh.json +++ b/frontend/locales/zh.json @@ -46,23 +46,23 @@ "Items": "个项目", "Priority": "级别", "Ignore": "忽略", - "alert-total":"安全检查一共有", - "alert-checked":"你已经完成了", - "alert-ignored":"被忽略", - "alert-unchecked":"个未进行检查。", + "alert-total": "安全检查一共有", + "alert-checked": "你已经完成了", + "alert-ignored": "被忽略", + "alert-unchecked": "个未进行检查。", "Checked": "已检查", "Ignored": "已忽略", "Unchecked": "未检查", - "Basic":"基础", - "Optional":"可选", - "Essential":"必要", - "Advanced":"高级", - "Reset":"重置", - "ShowAll":"显示所有", - "ShowUnchecked":"显示未检查", - "ShowIgnored":"显示已忽略", - "ShowChecked":"显示已检查", - "Loading":"加载中..." + "Basic": "基础", + "Optional": "可选", + "Essential": "必要", + "Advanced": "高级", + "Reset": "重置", + "ShowAll": "显示所有", + "ShowUnchecked": "显示未检查", + "ShowIgnored": "显示已忽略", + "ShowChecked": "显示已检查", + "Loading": "加载中..." }, "shell": { "Title": "命令行 API", @@ -407,7 +407,10 @@ "gaming": " 分,在线游戏:", "rtc": " 分,视频会议:", "score": "根据网速测试,得出以下质量分数:", - "resultNote": " 分。分数仅供参考。" + "resultNote": " 分。分数仅供参考。", + "connectionFrom": "已完成从你的 IP:", + "connectionTo": "与测速服务器:", + "connectionEnd": " 的测试。" }, "pingtest": { "id": "pingtest", diff --git a/frontend/utils/speedtest-colos.js b/frontend/utils/speedtest-colos.js new file mode 100644 index 00000000..75cd5833 --- /dev/null +++ b/frontend/utils/speedtest-colos.js @@ -0,0 +1,1324 @@ +const coloList = { + "AAE": { + "country": "DZ", + "city": "Annaba" + }, + "ABJ": { + "country": "CI", + "city": "Abidjan" + }, + "ABQ": { + "country": "US", + "city": "Albuquerque" + }, + "ACC": { + "country": "GH", + "city": "Accra" + }, + "ADB": { + "country": "TR", + "city": "Izmir" + }, + "ADL": { + "country": "AU", + "city": "Adelaide" + }, + "AKL": { + "country": "NZ", + "city": "Auckland" + }, + "AKX": { + "country": "KZ", + "city": "Aktobe" + }, + "ALA": { + "country": "KZ", + "city": "Almaty" + }, + "ALG": { + "country": "DZ", + "city": "Algiers" + }, + "AMD": { + "country": "IN", + "city": "Ahmedabad" + }, + "AMM": { + "country": "JO", + "city": "Amman" + }, + "AMS": { + "country": "NL", + "city": "Amsterdam" + }, + "ANC": { + "country": "US", + "city": "Anchorage" + }, + "ARI": { + "country": "CL", + "city": "Arica" + }, + "ARN": { + "country": "SE", + "city": "Stockholm" + }, + "ARU": { + "country": "BR", + "city": "Aracatuba" + }, + "ASK": { + "country": "CI", + "city": "Yamoussoukro" + }, + "ASU": { + "country": "PY", + "city": "Asunción" + }, + "ATH": { + "country": "GR", + "city": "Athens" + }, + "ATL": { + "country": "US", + "city": "Atlanta" + }, + "AUS": { + "country": "US", + "city": "Austin" + }, + "BAH": { + "country": "BH", + "city": "Manama" + }, + "BAQ": { + "country": "CO", + "city": "Barranquilla" + }, + "BBI": { + "country": "IN", + "city": "Bhubaneswar" + }, + "BCN": { + "country": "ES", + "city": "Barcelona" + }, + "BEG": { + "country": "RS", + "city": "Belgrade" + }, + "BEL": { + "country": "BR", + "city": "Belém" + }, + "BEY": { + "country": "LB", + "city": "Beirut" + }, + "BGI": { + "country": "BB", + "city": "Bridgetown" + }, + "BGR": { + "country": "US", + "city": "Bangor" + }, + "BGW": { + "country": "IQ", + "city": "Baghdad" + }, + "BHY": { + "country": "CN", + "city": "Beihai"}, + "BKK": { + "country": "TH", + "city": "Bangkok" + }, + "BLR": { + "country": "IN", + "city": "Bangalore" + }, + "BNA": { + "country": "US", + "city": "Nashville" + }, + "BNE": { + "country": "AU", + "city": "Brisbane" + }, + "BNU": { + "country": "BR", + "city": "Blumenau" + }, + "BOD": { + "country": "FR", + "city": "Bordeaux" + }, + "BOG": { + "country": "CO", + "city": "Bogota" + }, + "BOM": { + "country": "IN", + "city": "Mumbai" + }, + "BOS": { + "country": "US", + "city": "Boston" + }, + "BRU": { + "country": "BE", + "city": "Brussels" + }, + "BSB": { + "country": "BR", + "city": "Brasilia" + }, + "BSR": { + "country": "IQ", + "city": "Basra" + }, + "BTS": { + "country": "SK", + "city": "Bratislava" + }, + "BUD": { + "country": "HU", + "city": "Budapest" + }, + "BUF": { + "country": "US", + "city": "Buffalo" + }, + "BWN": { + "country": "BN", + "city": "Bandar Seri Begawan" + }, + "CAI": { + "country": "EG", + "city": "Cairo" + }, + "CAN": { + "country": "CN", + "city": "Guangzhou"}, + "CAW": { + "country": "BR", + "city": "Campos dos Goytacazes" + }, + "CBR": { + "country": "AU", + "city": "Canberra" + }, + "CCU": { + "country": "IN", + "city": "Kolkata" + }, + "CDG": { + "country": "FR", + "city": "Paris" + }, + "CEB": { + "country": "PH", + "city": "Cebu" + }, + "CFC": { + "country": "BR", + "city": "Cacador" + }, + "CGB": { + "country": "BR", + "city": "Cuiaba" + }, + "CGD": { + "country": "CN", + "city": "Changde"}, + "CGK": { + "country": "ID", + "city": "Jakarta" + }, + "CGO": { + "country": "CN", + "city": "Zhengzhou"}, + "CGP": { + "country": "BD", + "city": "Chittagong" + }, + "CGY": { + "country": "PH", + "city": "Cagayan de Oro" + }, + "CHC": { + "country": "NZ", + "city": "Christchurch" + }, + "CKG": { + "country": "CN", + "city": "Chongqing"}, + "CLE": { + "country": "US", + "city": "Cleveland" + }, + "CLO": { + "country": "CO", + "city": "Cali" + }, + "CLT": { + "country": "US", + "city": "Charlotte" + }, + "CMB": { + "country": "LK", + "city": "Colombo" + }, + "CMH": { + "country": "US", + "city": "Columbus" + }, + "CNF": { + "country": "BR", + "city": "Belo Horizonte" + }, + "CNN": { + "country": "IN", + "city": "Kannur" + }, + "CNX": { + "country": "TH", + "city": "Chiang Mai" + }, + "COK": { + "country": "IN", + "city": "Kochi" + }, + "COR": { + "country": "AR", + "city": "Córdoba" + }, + "CPH": { + "country": "DK", + "city": "Copenhagen" + }, + "CPT": { + "country": "ZA", + "city": "Cape Town" + }, + "CRK": { + "country": "PH", + "city": "Tarlac City" + }, + "CSX": { + "country": "CN", + "city": "Changsha"}, + "CTU": { + "country": "CN", + "city": "Chengdu"}, + "CWB": { + "country": "BR", + "city": "Curitiba" + }, + "CZX": { + "country": "CN", + "city": "Changzhou"}, + "DAC": { + "country": "BD", + "city": "Dhaka" + }, + "DAD": { + "country": "VN", + "city": "Da Nang" + }, + "DAR": { + "country": "TZ", + "city": "Dar es Salaam" + }, + "DEL": { + "country": "IN", + "city": "New Delhi" + }, + "DEN": { + "country": "US", + "city": "Denver" + }, + "DFW": { + "country": "US", + "city": "Dallas" + }, + "DKR": { + "country": "SN", + "city": "Dakar" + }, + "DLC": { + "country": "CN", + "city": "Dalian"}, + "DME": { + "country": "RU", + "city": "Moscow" + }, + "DMM": { + "country": "SA", + "city": "Dammam" + }, + "DOH": { + "country": "QA", + "city": "Doha" + }, + "DPS": { + "country": "ID", + "city": "Denpasar" + }, + "DTW": { + "country": "US", + "city": "Detroit" + }, + "DUB": { + "country": "IE", + "city": "Dublin" + }, + "DUR": { + "country": "ZA", + "city": "Durban" + }, + "DUS": { + "country": "DE", + "city": "Düsseldorf" + }, + "DXB": { + "country": "AE", + "city": "Dubai" + }, + "EBB": { + "country": "UG", + "city": "Kampala" + }, + "EBL": { + "country": "IQ", + "city": "Erbil" + }, + "EDI": { + "country": "GB", + "city": "Edinburgh" + }, + "EVN": { + "country": "AM", + "city": "Yerevan" + }, + "EWR": { + "country": "US", + "city": "Newark" + }, + "EZE": { + "country": "AR", + "city": "Buenos Aires" + }, + "FCO": { + "country": "IT", + "city": "Rome" + }, + "FIH": { + "country": "CD", + "city": "Kinshasa" + }, + "FLN": { + "country": "BR", + "city": "Florianopolis" + }, + "FOC": { + "country": "CN", + "city": "Fuzhou"}, + "FOR": { + "country": "BR", + "city": "Fortaleza" + }, + "FRA": { + "country": "DE", + "city": "Frankfurt" + }, + "FSD": { + "country": "US", + "city": "Sioux Falls" + }, + "FUK": { + "country": "JP", + "city": "Fukuoka" + }, + "FUO": { + "country": "CN", + "city": "Foshan"}, + "GBE": { + "country": "BW", + "city": "Gaborone" + }, + "GDL": { + "country": "MX", + "city": "Guadalajara" + }, + "GEO": { + "country": "GY", + "city": "Georgetown" + }, + "GIG": { + "country": "BR", + "city": "Rio de Janeiro" + }, + "GND": { + "country": "GD", + "city": "St. George's" + }, + "GOT": { + "country": "SE", + "city": "Gothenburg" + }, + "GRU": { + "country": "BR", + "city": "São Paulo" + }, + "GUA": { + "country": "GT", + "city": "Guatemala City" + }, + "GUM": { + "country": "GU", + "city": "Hagatna" + }, + "GVA": { + "country": "CH", + "city": "Geneva" + }, + "GYD": { + "country": "AZ", + "city": "Baku" + }, + "GYE": { + "country": "EC", + "city": "Guayaquil" + }, + "GYN": { + "country": "BR", + "city": "Goiania" + }, + "HAK": { + "country": "CN", + "city": "Chengmai"}, + "HAM": { + "country": "DE", + "city": "Hamburg" + }, + "HAN": { + "country": "VN", + "city": "Hanoi" + }, + "HBA": { + "country": "AU", + "city": "Hobart" + }, + "HEL": { + "country": "FI", + "city": "Helsinki" + }, + "HFA": { + "country": "IL", + "city": "Haifa" + }, + "HFE": { + "country": "CN", + "city": "Huainan"}, + "HGH": { + "country": "CN", + "city": "Shaoxing"}, + "HKG": { + "country": "HK", + "city": "Hong Kong"}, + "HNL": { + "country": "US", + "city": "Honolulu" + }, + "HRE": { + "country": "ZW", + "city": "Harare" + }, + "HYD": { + "country": "IN", + "city": "Hyderabad" + }, + "HYN": { + "country": "CN", + "city": "Taizhou"}, + "IAD": { + "country": "US", + "city": "Ashburn" + }, + "IAH": { + "country": "US", + "city": "Houston" + }, + "ICN": { + "country": "KR", + "city": "Seoul" + }, + "IND": { + "country": "US", + "city": "Indianapolis" + }, + "ISB": { + "country": "PK", + "city": "Islamabad" + }, + "IST": { + "country": "TR", + "city": "Istanbul" + }, + "ISU": { + "country": "IQ", + "city": "Sulaymaniyah" + }, + "ITJ": { + "country": "BR", + "city": "Itajai" + }, + "IXC": { + "country": "IN", + "city": "Chandigarh" + }, + "JAX": { + "country": "US", + "city": "Jacksonville" + }, + "JDO": { + "country": "BR", + "city": "Juazeiro do Norte" + }, + "JED": { + "country": "SA", + "city": "Jeddah" + }, + "JHB": { + "country": "MY", + "city": "Johor Bahru" + }, + "JIB": { + "country": "DJ", + "city": "Djibouti" + }, + "JNB": { + "country": "ZA", + "city": "Johannesburg" + }, + "JOG": { + "country": "ID", + "city": "Yogyakarta" + }, + "JOI": { + "country": "BR", + "city": "Joinville" + }, + "JSR": { + "country": "BD", + "city": "Jashore" + }, + "JXG": { + "country": "CN", + "city": "Jiaxing"}, + "KBP": { + "country": "UA", + "city": "Kyiv" + }, + "KCH": { + "country": "MY", + "city": "Kuching" + }, + "KEF": { + "country": "IS", + "city": "Reykjavík" + }, + "KGL": { + "country": "RW", + "city": "Kigali" + }, + "KHH": { + "country": "TW", + "city": "Kaohsiung City" + }, + "KHI": { + "country": "PK", + "city": "Karachi" + }, + "KHN": { + "country": "CN", + "city": "Nanchang"}, + "KIN": { + "country": "JM", + "city": "Kingston" + }, + "KIV": { + "country": "MD", + "city": "Chișinău" + }, + "KIX": { + "country": "JP", + "city": "Osaka" + }, + "KJA": { + "country": "RU", + "city": "Krasnoyarsk" + }, + "KLD": { + "country": "RU", + "city": "Tver" + }, + "KMG": { + "country": "CN", + "city": "Kunming"}, + "KNU": { + "country": "IN", + "city": "Kanpur" + }, + "KTM": { + "country": "NP", + "city": "Kathmandu" + }, + "KUL": { + "country": "MY", + "city": "Kuala Lumpur" + }, + "KWE": { + "country": "CN", + "city": "Guiyang"}, + "KWI": { + "country": "KW", + "city": "Kuwait City" + }, + "LAD": { + "country": "AO", + "city": "Luanda" + }, + "LAS": { + "country": "US", + "city": "Las Vegas" + }, + "LAX": { + "country": "US", + "city": "Los Angeles" + }, + "LCA": { + "country": "CY", + "city": "Nicosia" + }, + "LED": { + "country": "RU", + "city": "Saint Petersburg" + }, + "LHE": { + "country": "PK", + "city": "Lahore" + }, + "LHR": { + "country": "GB", + "city": "London" + }, + "LHW": { + "country": "CN", + "city": "Lanzhou"}, + "LIM": { + "country": "PE", + "city": "Lima" + }, + "LIS": { + "country": "PT", + "city": "Lisbon" + }, + "LLK": { + "country": "AZ", + "city": "Astara" + }, + "LOS": { + "country": "NG", + "city": "Lagos" + }, + "LPB": { + "country": "BO", + "city": "La Paz" + }, + "LUX": { + "country": "LU", + "city": "Luxembourg City" + }, + "LYS": { + "country": "FR", + "city": "Lyon" + }, + "MAA": { + "country": "IN", + "city": "Chennai" + }, + "MAD": { + "country": "ES", + "city": "Madrid" + }, + "MAN": { + "country": "GB", + "city": "Manchester" + }, + "MAO": { + "country": "BR", + "city": "Manaus" + }, + "MBA": { + "country": "KE", + "city": "Mombasa" + }, + "MCI": { + "country": "US", + "city": "Kansas City" + }, + "MCT": { + "country": "OM", + "city": "Muscat" + }, + "MDE": { + "country": "CO", + "city": "Medellín" + }, + "MDL": { + "country": "MM", + "city": "Mandalay" + }, + "MEL": { + "country": "AU", + "city": "Melbourne" + }, + "MEM": { + "country": "US", + "city": "Memphis" + }, + "MEX": { + "country": "MX", + "city": "Mexico City" + }, + "MFE": { + "country": "US", + "city": "McAllen" + }, + "MFM": { + "country": "MO", + "city": "Macau"}, + "MGM": { + "country": "US", + "city": "Montgomery" + }, + "MIA": { + "country": "US", + "city": "Miami" + }, + "MLE": { + "country": "MV", + "city": "Male" + }, + "MNL": { + "country": "PH", + "city": "Manila" + }, + "MPM": { + "country": "MZ", + "city": "Maputo" + }, + "MRS": { + "country": "FR", + "city": "Marseille" + }, + "MRU": { + "country": "MU", + "city": "Port Louis" + }, + "MSP": { + "country": "US", + "city": "Minneapolis" + }, + "MSQ": { + "country": "BY", + "city": "Minsk" + }, + "MUC": { + "country": "DE", + "city": "Munich" + }, + "MXP": { + "country": "IT", + "city": "Milan" + }, + "NAG": { + "country": "IN", + "city": "Nagpur" + }, + "NBO": { + "country": "KE", + "city": "Nairobi" + }, + "NJF": { + "country": "IQ", + "city": "Najaf" + }, + "NNG": { + "country": "CN", + "city": "Nanning"}, + "NOU": { + "country": "NC", + "city": "Noumea" + }, + "NQN": { + "country": "AR", + "city": "Neuquen" + }, + "NQZ": { + "country": "KZ", + "city": "Astana" + }, + "NRT": { + "country": "JP", + "city": "Tokyo" + }, + "NVT": { + "country": "BR", + "city": "Timbo" + }, + "OKA": { + "country": "JP", + "city": "Naha" + }, + "OKC": { + "country": "US", + "city": "Oklahoma City" + }, + "OMA": { + "country": "US", + "city": "Omaha" + }, + "ORD": { + "country": "US", + "city": "Chicago" + }, + "ORF": { + "country": "US", + "city": "Norfolk" + }, + "ORK": { + "country": "IE", + "city": "Cork" + }, + "ORN": { + "country": "DZ", + "city": "Oran" + }, + "OSL": { + "country": "NO", + "city": "Oslo" + }, + "OTP": { + "country": "RO", + "city": "Bucharest" + }, + "OUA": { + "country": "BF", + "city": "Ouagadougou" + }, + "PAT": { + "country": "IN", + "city": "Patna" + }, + "PBH": { + "country": "BT", + "city": "Thimphu" + }, + "PBM": { + "country": "SR", + "city": "Paramaribo" + }, + "PDX": { + "country": "US", + "city": "Portland" + }, + "PER": { + "country": "AU", + "city": "Perth" + }, + "PHL": { + "country": "US", + "city": "Philadelphia" + }, + "PHX": { + "country": "US", + "city": "Phoenix" + }, + "PIT": { + "country": "US", + "city": "Pittsburgh" + }, + "PKX": { + "country": "CN", + "city": "Langfang"}, + "PMO": { + "country": "IT", + "city": "Palermo" + }, + "PMW": { + "country": "BR", + "city": "Palmas" + }, + "PNH": { + "country": "KH", + "city": "Phnom Penh" + }, + "POA": { + "country": "BR", + "city": "Porto Alegre" + }, + "POS": { + "country": "TT", + "city": "Port of Spain" + }, + "PPT": { + "country": "PF", + "city": "Tahiti" + }, + "PRG": { + "country": "CZ", + "city": "Prague" + }, + "PTY": { + "country": "PA", + "city": "Panama City" + }, + "QRO": { + "country": "MX", + "city": "Queretaro" + }, + "QWJ": { + "country": "BR", + "city": "Americana" + }, + "RAO": { + "country": "BR", + "city": "Ribeirao Preto" + }, + "RDU": { + "country": "US", + "city": "Durham" + }, + "REC": { + "country": "BR", + "city": "Recife" + }, + "RGN": { + "country": "MM", + "city": "Yangon" + }, + "RIC": { + "country": "US", + "city": "Richmond" + }, + "RIX": { + "country": "LV", + "city": "Riga" + }, + "RUH": { + "country": "SA", + "city": "Riyadh" + }, + "RUN": { + "country": "RE", + "city": "Saint-Denis" + }, + "SAN": { + "country": "US", + "city": "San Diego" + }, + "SAT": { + "country": "US", + "city": "San Antonio" + }, + "SCL": { + "country": "CL", + "city": "Santiago" + }, + "SDQ": { + "country": "DO", + "city": "Santo Domingo" + }, + "SEA": { + "country": "US", + "city": "Seattle" + }, + "SFO": { + "country": "US", + "city": "San Francisco" + }, + "SGN": { + "country": "VN", + "city": "Ho Chi Minh City" + }, + "SHA": { + "country": "CN", + "city": "Shanghai"}, + "SIN": { + "country": "SG", + "city": "Singapore" + }, + "SJC": { + "country": "US", + "city": "San Jose" + }, + "SJK": { + "country": "BR", + "city": "São José dos Campos" + }, + "SJO": { + "country": "CR", + "city": "San José" + }, + "SJP": { + "country": "BR", + "city": "São José do Rio Preto" + }, + "SJU": { + "country": "PR", + "city": "San Juan" + }, + "SJW": { + "country": "CN", + "city": "Hengshui"}, + "SKG": { + "country": "GR", + "city": "Thessaloniki" + }, + "SKP": { + "country": "MK", + "city": "Skopje" + }, + "SLC": { + "country": "US", + "city": "Salt Lake City" + }, + "SMF": { + "country": "US", + "city": "Sacramento" + }, + "SOD": { + "country": "BR", + "city": "Sorocaba" + }, + "SOF": { + "country": "BG", + "city": "Sofia" + }, + "SSA": { + "country": "BR", + "city": "Salvador" + }, + "STI": { + "country": "DO", + "city": "Santiago de los Caballeros" + }, + "STL": { + "country": "US", + "city": "St. Louis" + }, + "STR": { + "country": "DE", + "city": "Stuttgart" + }, + "SUV": { + "country": "FJ", + "city": "Suva" + }, + "SVX": { + "country": "RU", + "city": "Yekaterinburg" + }, + "SYD": { + "country": "AU", + "city": "Sydney" + }, + "SZX": { + "country": "CN", + "city": "Shenzhen"}, + "TAO": { + "country": "CN", + "city": "Qingdao"}, + "TAS": { + "country": "UZ", + "city": "Tashkent" + }, + "TBS": { + "country": "GE", + "city": "Tbilisi" + }, + "TEN": { + "country": "CN", + "city": "Tongren"}, + "TGU": { + "country": "HN", + "city": "Tegucigalpa" + }, + "TIA": { + "country": "AL", + "city": "Tirana" + }, + "TLH": { + "country": "US", + "city": "Tallahassee" + }, + "TLL": { + "country": "EE", + "city": "Tallinn" + }, + "TLV": { + "country": "IL", + "city": "Tel Aviv" + }, + "TNA": { + "country": "CN", + "city": "Zibo"}, + "TNR": { + "country": "MG", + "city": "Antananarivo" + }, + "TPA": { + "country": "US", + "city": "Tampa" + }, + "TPE": { + "country": "TW", + "city": "Taipei"}, + "TSN": { + "country": "CN", + "city": "Tianjin"}, + "TUN": { + "country": "TN", + "city": "Tunis" + }, + "TXL": { + "country": "DE", + "city": "Berlin" + }, + "TYN": { + "country": "CN", + "city": "Yangquan"}, + "UDI": { + "country": "BR", + "city": "Uberlandia" + }, + "UIO": { + "country": "EC", + "city": "Quito" + }, + "ULN": { + "country": "MN", + "city": "Ulaanbaatar" + }, + "URT": { + "country": "TH", + "city": "Surat Thani" + }, + "VCP": { + "country": "BR", + "city": "Campinas" + }, + "VIE": { + "country": "AT", + "city": "Vienna" + }, + "VIX": { + "country": "BR", + "city": "Vitoria" + }, + "VNO": { + "country": "LT", + "city": "Vilnius" + }, + "VTE": { + "country": "LA", + "city": "Vientiane" + }, + "WAW": { + "country": "PL", + "city": "Warsaw" + }, + "WDH": { + "country": "NA", + "city": "Windhoek" + }, + "WHU": { + "country": "CN", + "city": "Wuhu"}, + "XAP": { + "country": "BR", + "city": "Chapeco" + }, + "XFN": { + "country": "CN", + "city": "Xiangyang"}, + "XIY": { + "country": "CN", + "city": "Baoji"}, + "XNH": { + "country": "IQ", + "city": "Nasiriyah" + }, + "XNN": { + "country": "CN", + "city": "Xining"}, + "YHZ": { + "country": "CA", + "city": "Halifax" + }, + "YOW": { + "country": "CA", + "city": "Ottawa" + }, + "YUL": { + "country": "CA", + "city": "Montréal" + }, + "YVR": { + "country": "CA", + "city": "Vancouver" + }, + "YWG": { + "country": "CA", + "city": "Winnipeg" + }, + "YXE": { + "country": "CA", + "city": "Saskatoon" + }, + "YYC": { + "country": "CA", + "city": "Calgary" + }, + "YYZ": { + "country": "CA", + "city": "Toronto" + }, + "ZAG": { + "country": "HR", + "city": "Zagreb" + }, + "ZDM": { + "country": "PS", + "city": "Ramallah" + }, + "ZGN": { + "country": "CN", + "city": "Zhongshan" + }, + "ZRH": { + "country": "CH", + "city": "Zurich" + } +} + +export default function getColoCountry(abbr) { + return { + country: coloList[abbr].country || '', + city: coloList[abbr].city || '' + } +} \ No newline at end of file