mm-states
Version:
Myanmar states and regions including township with postalcode(mm, en)
131 lines (114 loc) • 3.64 kB
text/typescript
import statesData from './data/states.json';
import townshipsData from './data/townships.json';
interface State {
id: string;
name: string;
mm_name: string;
capital: string;
postal_code_prefix: string;
type: string;
area_sq_km?: number;
population?: number;
}
interface Township {
name: string;
mm_name: string;
postal_code: string;
districts?: Township[];
}
/**
* Get all states/regions of Myanmar
* @returns Array of State objects
*/
export function getAllStates(): State[] {
return statesData;
}
/**
* Get a state/region by its ID
* @param id - State ID (e.g., '12' for Yangon)
* @returns State object or undefined if not found
*/
export function getStateById(id: string): State | undefined {
return statesData.find(state => state.id === id);
}
/**
* Get townships by state/region ID
* @param stateId - State ID (e.g., '09' for Mandalay)
* @returns Array of Township objects
*/
export function getTownshipsByStateId(stateId: string): Township[] {
return townshipsData[stateId as keyof typeof townshipsData] || [];
}
/**
* Get townships by state/region name (case insensitive)
* @param stateName - State name (e.g., 'yangon')
* @returns Array of Township objects
*/
export function getTownshipsByStateName(stateName: string): Township[] {
const state = statesData.find(
s => s.name.toLowerCase() === stateName.toLowerCase()
);
return state ? getTownshipsByStateId(state.id) : [];
}
/**
* Search townships by name across all states (case insensitive)
* @param townshipName - Partial or full township name
* @returns Array of Township objects with state information
*/
export function searchTownships(townshipName: string): Array<{
township: Township;
state: State;
}> {
const results: Array<{ township: Township; state: State }> = [];
statesData.forEach(state => {
const townships = getTownshipsByStateId(state.id);
townships.forEach(township => {
if (
township.name.toLowerCase().includes(townshipName.toLowerCase()) ||
township.mm_name.includes(townshipName)
) {
results.push({ township, state });
}
// Search in districts if they exist
if (township.districts) {
township.districts.forEach(district => {
if (
district.name.toLowerCase().includes(townshipName.toLowerCase()) ||
district.mm_name.includes(townshipName)
) {
results.push({ township: district, state });
}
});
}
});
});
return results;
}
/**
* Get postal code information by code
* @param postalCode - 5-digit postal code
* @returns { township: Township, state: State } or undefined if not found
*/
export function getByPostalCode(postalCode: string): { township: Township; state: State } | undefined {
if (!/^\d{5}$/.test(postalCode)) return undefined;
const statePrefix = postalCode.substring(0, 2);
const state = getStateById(statePrefix);
if (!state) return undefined;
const townships = getTownshipsByStateId(statePrefix);
for (const township of townships) {
if (township.postal_code === postalCode) {
return { township, state };
}
// Check districts if they exist
if (township.districts) {
for (const district of township.districts) {
if (district.postal_code === postalCode) {
return { township: district, state };
}
}
}
}
return undefined;
}
// Export types for TypeScript users
export type { State, Township };