@devmubs/pakistan-cities
v1.0.0
Published
Zero-dependency dataset + API of all Pakistani cities across provinces and territories. Works in Node and the browser, no backend or network calls required.
Maintainers
Readme
@devmubs/pakistan-cities
Zero-dependency dataset + API of every city in Pakistan — all 4 provinces, plus Azad Jammu & Kashmir, Gilgit-Baltistan, and the Islamabad Capital Territory.
No backend, no fetch, no API key. The data ships inside the package and runs entirely client-side or server-side — works in Node, React, Vue, plain HTML, anywhere JavaScript runs.
Install
npm install @devmubs/pakistan-citiesAlso works with other package managers:
yarn add @devmubs/pakistan-cities
pnpm add @devmubs/pakistan-citiesOr run it directly with npx — no install needed
npx @devmubs/pakistan-cities search lahore
npx @devmubs/pakistan-cities province Sindh
npx @devmubs/pakistan-cities capitals
npx @devmubs/pakistan-cities countFull CLI command list:
| Command | Example |
|---|---|
| search <name> | npx @devmubs/pakistan-cities search multan |
| city <name> | npx @devmubs/pakistan-cities city lahore |
| province <name> | npx @devmubs/pakistan-cities province Punjab |
| provinces | npx @devmubs/pakistan-cities provinces |
| capitals | npx @devmubs/pakistan-cities capitals |
| list | npx @devmubs/pakistan-cities list |
| count | npx @devmubs/pakistan-cities count |
| help | npx @devmubs/pakistan-cities help |
Every command prints JSON to stdout, so you can pipe it straight into jq, a file, or another script.
Quick start
const PakistanCities = require('@devmubs/pakistan-cities');
PakistanCities.count(); // 191
PakistanCities.search('lahore'); // [{ city: 'Lahore', province: 'Punjab', capital: true }]
PakistanCities.getByProvince('Sindh'); // all Sindh citiesESM / TypeScript:
import PakistanCities from '@devmubs/pakistan-cities';
const results = PakistanCities.search('gwadar');CDN (no npm install, no bundler)
Just drop this at the bottom of your <body> — works on plain HTML pages, no build step:
<script src="https://unpkg.com/@devmubs/pakistan-cities/dist/pakistan-cities.min.js"></script>
<script>
console.log(PakistanCitiesAPI.count()); // 191
console.log(PakistanCitiesAPI.search('lahore')); // [{ city: 'Lahore', ... }]
</script>jsDelivr also works, and you can pin a version once published:
<script src="https://cdn.jsdelivr.net/npm/@devmubs/pakistan-cities@1/dist/pakistan-cities.min.js"></script>This CDN build exposes a single global — window.PakistanCitiesAPI — with the exact same methods as the npm import. Same dataset, same API, zero dependencies either way.
API
| Method | Returns | Description |
|---|---|---|
| getAll() | PakistanCity[] | Every city, unfiltered |
| getProvinces() | string[] | The 7 provinces/territories |
| getByProvince(name) | PakistanCity[] | Cities in a province (case-insensitive) |
| search(query, options?) | PakistanCity[] | Substring match on city name. options.limit caps results |
| getCity(name) | PakistanCity \| undefined | Exact case-insensitive lookup |
| getCapitals() | PakistanCity[] | The capital of each province/territory |
| count() | number | Total number of cities |
| isValidProvince(name) | boolean | Validate a province name |
| toOptions(province?) | {value, label}[] | Ready-made list for <select> dropdowns |
Each city object looks like:
{ city: string, province: string, capital?: boolean }Recipes
Cascading <select> (Province → City)
const provinceSelect = document.querySelector('#province');
const citySelect = document.querySelector('#city');
PakistanCities.getProvinces().forEach((p) => {
provinceSelect.add(new Option(p, p));
});
function fillCities(province) {
citySelect.innerHTML = '';
PakistanCities.toOptions(province).forEach((opt) => {
citySelect.add(new Option(opt.label, opt.value));
});
}
provinceSelect.addEventListener('change', (e) => fillCities(e.target.value));
fillCities(provinceSelect.value);Autocomplete field
input.addEventListener('input', () => {
const matches = PakistanCities.search(input.value, { limit: 8 });
renderDropdown(matches);
});Form validation
function validateCityField(cityName, provinceName) {
const city = PakistanCities.getCity(cityName);
if (!city) return 'Unknown city';
if (city.province !== provinceName) return 'City does not belong to selected province';
return null;
}Why this exists
Most "Pakistan cities" packages on npm are either abandoned, missing AJK/Gilgit-Baltistan, or require a network call. This one is a flat, static, dependency-free dataset — safe to bundle into a frontend build with zero runtime cost.
License
MIT © Usama Saleem
