UNPKG

@bangladeshi/bangladesh-address

Version:

A simple npm package for Bangladesh's administrative divisions, districts, upazilas, and metropolitan thanas.

270 lines (269 loc) 10.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.thanaData = exports.upazilaData = exports.searchLocations = exports.upazilaNamesOfDivision = exports.upazilasOfDivision = exports.getDistrictOfUpazila = exports.getUpazila = exports.getThana = exports.isUpazila = exports.isThana = exports.thanaNamesOf = exports.thanasOf = exports.allThanaNames = exports.allThana = exports.allUpazila = exports.upazilaNamesOf = exports.upazilasOf = void 0; const bd_upazila_json_1 = __importDefault(require("../json/bd-upazila.json")); exports.upazilaData = bd_upazila_json_1.default; const bd_thana_json_1 = __importDefault(require("../json/bd-thana.json")); exports.thanaData = bd_thana_json_1.default; const division_name_1 = require("../division/types/division-name"); // Pre-computed lookup maps for O(1) performance const thanaNameSet = new Set(bd_thana_json_1.default.map((t) => t.thana.toLowerCase())); const upazilaNameSet = new Set(bd_upazila_json_1.default.map((u) => u.upazila.toLowerCase())); const thanaByName = new Map(bd_thana_json_1.default.map((t) => [t.thana.toLowerCase(), t])); const upazilaByName = new Map(bd_upazila_json_1.default.map((u) => [u.upazila.toLowerCase(), u])); // Pre-computed set for O(1) division validation const divisionNameSet = new Set(Object.values(division_name_1.DivisionName).map((d) => d.toLowerCase())); /** * Get all upazilas in a given district * @param district - The district name * @returns Array of upazila objects containing upazila, district, and division */ const upazilasOf = (district) => { if (!district || typeof district !== "string") { return []; } const normalizedDistrict = district.trim().toLowerCase(); return bd_upazila_json_1.default.filter((item) => item.district.toLowerCase() === normalizedDistrict); }; exports.upazilasOf = upazilasOf; /** * Get all upazila names in a given district * @param district - The district name * @returns Array of upazila names (strings) */ const upazilaNamesOf = (district) => { return (0, exports.upazilasOf)(district).map((u) => u.upazila); }; exports.upazilaNamesOf = upazilaNamesOf; /** * Get all upazila names in Bangladesh * @returns Array of all upazila names (495 upazilas) */ const allUpazila = () => { return bd_upazila_json_1.default.map((item) => item.upazila); }; exports.allUpazila = allUpazila; /** * Get all thanas (metropolitan police stations) in Bangladesh * @returns Array of thana objects (26 thanas) */ const allThana = () => { return bd_thana_json_1.default; }; exports.allThana = allThana; /** * Get all thana names in Bangladesh * @returns Array of all thana names (26 thanas) */ const allThanaNames = () => { return bd_thana_json_1.default.map((item) => item.thana); }; exports.allThanaNames = allThanaNames; /** * Get thanas in a given district * @param district - The district name * @returns Array of thana objects for the district */ const thanasOf = (district) => { if (!district || typeof district !== "string") { return []; } const normalizedDistrict = district.trim().toLowerCase(); return bd_thana_json_1.default.filter((item) => item.district.toLowerCase() === normalizedDistrict); }; exports.thanasOf = thanasOf; /** * Get thana names in a given district * @param district - The district name * @returns Array of thana names (strings) */ const thanaNamesOf = (district) => { return (0, exports.thanasOf)(district).map((t) => t.thana); }; exports.thanaNamesOf = thanaNamesOf; /** * Check if a location is a thana (metropolitan police station) * @param name - The location name to check * @param district - Optional district name to disambiguate (e.g., "Kotwali" exists in both Dhaka and Chattogram) * @returns true if the location is a thana, false otherwise */ const isThana = (name, district) => { if (!name || typeof name !== "string") { return false; } const normalizedName = name.trim().toLowerCase(); if (district) { const normalizedDistrict = district.trim().toLowerCase(); return bd_thana_json_1.default.some((item) => item.thana.toLowerCase() === normalizedName && item.district.toLowerCase() === normalizedDistrict); } return thanaNameSet.has(normalizedName); }; exports.isThana = isThana; /** * Check if a location is an upazila * @param name - The location name to check * @param district - Optional district name to disambiguate * @returns true if the location is an upazila, false otherwise */ const isUpazila = (name, district) => { if (!name || typeof name !== "string") { return false; } const normalizedName = name.trim().toLowerCase(); if (district) { const normalizedDistrict = district.trim().toLowerCase(); return bd_upazila_json_1.default.some((item) => item.upazila.toLowerCase() === normalizedName && item.district.toLowerCase() === normalizedDistrict); } return upazilaNameSet.has(normalizedName); }; exports.isUpazila = isUpazila; /** * Get a thana by name * @param name - The thana name to find * @param district - Optional district name to disambiguate (e.g., "Kotwali" exists in both Dhaka and Chattogram) * @returns The thana object if found, undefined otherwise */ const getThana = (name, district) => { if (!name || typeof name !== "string") { return undefined; } const normalizedName = name.trim().toLowerCase(); if (district) { const normalizedDistrict = district.trim().toLowerCase(); return bd_thana_json_1.default.find((item) => item.thana.toLowerCase() === normalizedName && item.district.toLowerCase() === normalizedDistrict); } return thanaByName.get(normalizedName); }; exports.getThana = getThana; /** * Get an upazila by name * @param name - The upazila name to find * @param district - Optional district name to disambiguate * @returns The upazila object if found, undefined otherwise */ const getUpazila = (name, district) => { if (!name || typeof name !== "string") { return undefined; } const normalizedName = name.trim().toLowerCase(); if (district) { const normalizedDistrict = district.trim().toLowerCase(); return bd_upazila_json_1.default.find((item) => item.upazila.toLowerCase() === normalizedName && item.district.toLowerCase() === normalizedDistrict); } return upazilaByName.get(normalizedName); }; exports.getUpazila = getUpazila; /** * Get the district for a given upazila (reverse lookup) * @param upazila - The upazila name * @param division - Optional division name to disambiguate if upazila name exists in multiple districts * @returns The district name if found, undefined otherwise */ const getDistrictOfUpazila = (upazila, division) => { if (!upazila || typeof upazila !== "string") { return undefined; } const normalizedName = upazila.trim().toLowerCase(); if (division) { const normalizedDivision = division.trim().toLowerCase(); const found = bd_upazila_json_1.default.find((item) => item.upazila.toLowerCase() === normalizedName && item.division.toLowerCase() === normalizedDivision); return found === null || found === void 0 ? void 0 : found.district; } const found = upazilaByName.get(normalizedName); return found === null || found === void 0 ? void 0 : found.district; }; exports.getDistrictOfUpazila = getDistrictOfUpazila; /** * Get all upazilas in a given division * @param division - The division name * @returns Array of upazila objects for the division */ const upazilasOfDivision = (division) => { if (!division || typeof division !== "string") { return []; } const normalizedDivision = division.trim().toLowerCase(); if (!divisionNameSet.has(normalizedDivision)) { return []; } return bd_upazila_json_1.default.filter((item) => item.division.toLowerCase() === normalizedDivision); }; exports.upazilasOfDivision = upazilasOfDivision; /** * Get all upazila names in a given division * @param division - The division name * @returns Array of upazila names (strings) */ const upazilaNamesOfDivision = (division) => { return (0, exports.upazilasOfDivision)(division).map((u) => u.upazila); }; exports.upazilaNamesOfDivision = upazilaNamesOfDivision; /** * Search across all locations (divisions, districts, upazilas, thanas) * @param query - The search query (case-insensitive, partial match) * @returns Array of matching locations sorted by type (division > district > upazila > thana) */ const searchLocations = (query) => { if (!query || typeof query !== "string") { return []; } const normalizedQuery = query.trim().toLowerCase(); if (normalizedQuery.length === 0) { return []; } const results = []; // Search divisions Object.values(division_name_1.DivisionName).forEach((divisionName) => { if (divisionName.toLowerCase().includes(normalizedQuery)) { results.push({ name: divisionName, type: "division", }); } }); // Search districts (use Set to avoid duplicates) const matchedDistricts = new Set(); bd_upazila_json_1.default.forEach((item) => { if (item.district.toLowerCase().includes(normalizedQuery) && !matchedDistricts.has(item.district)) { matchedDistricts.add(item.district); results.push({ name: item.district, type: "district", division: item.division, }); } }); // Search upazilas bd_upazila_json_1.default.forEach((item) => { if (item.upazila.toLowerCase().includes(normalizedQuery)) { results.push({ name: item.upazila, type: "upazila", district: item.district, division: item.division, }); } }); // Search thanas bd_thana_json_1.default.forEach((item) => { if (item.thana.toLowerCase().includes(normalizedQuery)) { results.push({ name: item.thana, type: "thana", district: item.district, division: item.division, }); } }); return results; }; exports.searchLocations = searchLocations;