@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
JavaScript
;
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;