UNPKG

@geoapify/un-locode

Version:

A Node.js library for querying United Nations Location Code (UN/LOCODE) data

88 lines (87 loc) 2.52 kB
import * as path from 'path'; import csvToJson from 'convert-csv-to-json'; const loadedFiles = new Map(); const fileExpiryTime = 1000 * 60 * 60 * 24; // 24 hours export function query(countryCode, locationCode) { clearOldFiles(); let file = loadDataFile(countryCode); if (!file) { return null; } let item = findItemInFile(file, locationCode); if (item) { const codeData = { country: item.country, location: item.location, locationName: item.nameWoDiacritics, subdivision: item.subdivision, status: item.status, functionCodes: convertToFunctionArray(item.function) }; if (item.lat && item.lon) { codeData.coordinates = { lat: parseFloat(item.lat), lon: parseFloat(item.lon) }; } if (!codeData.subdivision) { delete codeData.subdivision; } return codeData; } else { return null; } } function loadDataFile(countryName) { if (loadedFiles.has(countryName)) { return loadedFiles.get(countryName).data; } const fileName = countryName + '.csv'; const filePath = path.join(__dirname, 'data', fileName); try { //const fileContents = await fs.readFile(filePath, 'utf-8'); const data = csvToJson.fieldDelimiter(',').supportQuotedField(true).getJsonFromCsv(filePath); data.forEach(item => { if (item['geocoded'] === 'true') { item['geocoded'] = true; } else { delete item['geocoded']; } }); addFile(countryName, data); return data; } catch (error) { return null; } } function findItemInFile(file, locationCode) { return file.find(item => item.location === locationCode); } function clearOldFiles() { loadedFiles.forEach((value, key) => { if (value.loadDate.getTime() + fileExpiryTime < Date.now()) { loadedFiles.delete(key); } }); } function addFile(countryName, data) { loadedFiles.set(countryName, { loadDate: new Date(), data: data }); } function convertToFunctionArray(functionCode) { if (!functionCode) { return []; } let result = []; for (let i = 0; i < functionCode.length; i++) { if (functionCode.charAt(i) !== '-') { result.push(functionCode.charAt(i)); } } return result; }