UNPKG

thai-postcode-helper

Version:

Thai address postcode resolver with fuzzy and bilingual support

80 lines (79 loc) 3.55 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.findPostcode = findPostcode; exports.findByPostcode = findByPostcode; exports.suggestSubdistricts = suggestSubdistricts; exports.suggestSubdistrictsFuzzy = suggestSubdistrictsFuzzy; exports.findPostcodeFuzzy = findPostcodeFuzzy; const data_json_1 = __importDefault(require("../data/data.json")); const utils_1 = require("./utils"); const fuse_js_1 = __importDefault(require("fuse.js")); const data = data_json_1.default; function findPostcode(province, district, subdistrict, lang = 'th') { return data .filter(entry => (0, utils_1.normalize)(entry[`province_${lang}`]) === (0, utils_1.normalize)(province) && (0, utils_1.normalize)(entry[`district_${lang}`]) === (0, utils_1.normalize)(district) && (0, utils_1.normalize)(entry[`subdistrict_${lang}`]) === (0, utils_1.normalize)(subdistrict)) .map(entry => entry.zipcode); } function findByPostcode(zipcode, lang = 'th') { return data .filter(entry => entry.zipcode === zipcode) .map(entry => ({ province: entry[`province_${lang}`], district: entry[`district_${lang}`], subdistrict: entry[`subdistrict_${lang}`], zipcode: entry.zipcode, })); } function suggestSubdistricts(province, district, lang = 'th') { return Array.from(new Set(data .filter(entry => { if (province && (0, utils_1.normalize)(entry[`province_${lang}`]) !== (0, utils_1.normalize)(province)) return false; if (district && (0, utils_1.normalize)(entry[`district_${lang}`]) !== (0, utils_1.normalize)(district)) return false; return true; }) .map(entry => entry[`subdistrict_${lang}`]))); } function suggestSubdistrictsFuzzy(keyword, lang = 'th', limit = 10) { const entries = Array.from(new Set(data.map(entry => entry[`subdistrict_${lang}`]))); const fuse = new fuse_js_1.default(entries, { threshold: 0.4, }); return fuse.search(keyword).slice(0, limit).map(r => r.item); } function findPostcodeFuzzy(provinceInput, districtInput, subdistrictInput, lang = 'th') { var _a, _b, _c; const provKey = `province_${lang}`; const distKey = `district_${lang}`; const subdistKey = `subdistrict_${lang}`; const provinceFuse = new fuse_js_1.default(data, { keys: [provKey], threshold: 0.4 }); const matchedProvince = (_a = provinceFuse.search(provinceInput)[0]) === null || _a === void 0 ? void 0 : _a.item; if (!matchedProvince) return []; const filteredByProvince = data.filter(d => d[provKey] === matchedProvince[provKey]); const districtFuse = new fuse_js_1.default(filteredByProvince, { keys: [distKey], threshold: 0.4 }); const matchedDistrict = (_b = districtFuse.search(districtInput)[0]) === null || _b === void 0 ? void 0 : _b.item; if (!matchedDistrict) return []; const filteredByDistrict = filteredByProvince.filter(d => d[distKey] === matchedDistrict[distKey]); const subdistrictFuse = new fuse_js_1.default(filteredByDistrict, { keys: [subdistKey], threshold: 0.4 }); const matchedSubdistrict = (_c = subdistrictFuse.search(subdistrictInput)[0]) === null || _c === void 0 ? void 0 : _c.item; if (!matchedSubdistrict) return []; return [matchedSubdistrict.zipcode]; }