iraqi-data 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ar.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![CI](https://github.com/karam-fikre/iraqi-data/actions/workflows/ci.yml/badge.svg)](https://github.com/karam-fikre/iraqi-data/actions/workflows/ci.yml)
7
7
  [![license](https://img.shields.io/npm/l/iraqi-data.svg)](LICENSE)
8
8
 
9
- محافظات العراق بالعربية والإنجليزية والكردية، جاهزة لنماذج العناوين والقوائم المنسدلة وتطبيقات التوصيل. البحث يفهم الطرق المختلفة التي يكتب بها الناس اسم المكان نفسه: `البصرة` و `البصره` و `Basrah` و `بەسرە` كلها تجد البصرة.
9
+ محافظات العراق وأقضيتها بالعربية والإنجليزية والكردية، جاهزة لنماذج العناوين والقوائم المنسدلة وتطبيقات التوصيل. البحث يفهم الطرق المختلفة التي يكتب بها الناس اسم المكان نفسه: `البصرة` و `البصره` و `Basrah` و `بەسرە` كلها تجد البصرة.
10
10
 
11
11
  يعمل في **Node.js** و**المتصفح** و **React** و **React Native / Expo** و **Vue**، ويأتي مع أنواع TypeScript، وبلا أي اعتماديات.
12
12
 
@@ -18,6 +18,8 @@ npm install iraqi-data
18
18
  yarn add iraqi-data
19
19
  ```
20
20
 
21
+ حجم الحزمة كاملةً مع البيانات نحو 11 كيلوبايت بعد الضغط (gzip).
22
+
21
23
  ## الاستخدام
22
24
 
23
25
  ```ts
@@ -32,34 +34,73 @@ getGovernorate('Basrah');
32
34
  // en: 'Basra',
33
35
  // ku: 'بەسرە',
34
36
  // region: 'federal',
35
- // capital: { ar: 'البصرة', en: 'Basra' },
37
+ // capital: { ar: 'البصرة', en: 'Basra', lat: 30.4952, lng: 47.8091 },
36
38
  // aliases: ['Basrah']
37
39
  // }
38
40
 
39
41
  getGovernorate('هولير')?.ar; // 'أربيل'
40
42
  getGovernorate('IQ-NI')?.capital.ar; // 'الموصل'
43
+ getGovernorate('أربيل')?.capital; // { ar: 'أربيل', en: 'Erbil', lat: 36.1912, lng: 44.0094 }
41
44
 
42
45
  searchGovernorates('نجف').map((g) => g.ar); // ['النجف']
43
46
  searchGovernorates('ba').map((g) => g.ar); // ['بغداد', 'البصرة', 'بابل', 'الأنبار', 'كربلاء']
44
47
  ```
45
48
 
46
- ### مثال قائمة منسدلة (React)
49
+ ### الأقضية
50
+
51
+ ```ts
52
+ import { getDistrict, searchDistricts, getDistrictsByGovernorate } from 'iraqi-data';
53
+
54
+ getDistrict('ابو غريب');
55
+ // {
56
+ // id: 'abughraib',
57
+ // governorateId: 'baghdad',
58
+ // pcode: null,
59
+ // ar: 'أبو غريب',
60
+ // en: 'Abu Ghraib',
61
+ // ku: 'ئەبو غرێب',
62
+ // center: { ar: 'أبو غريب', en: 'Abu Ghraib', lat: 33.3145, lng: 44.1682 },
63
+ // aliases: []
64
+ // }
65
+
66
+ getDistrict('الدغارة')?.ar; // 'أكد' (الدغارة مركزه)
67
+ getDistrictsByGovernorate('البصرة').length; // 11
68
+ searchDistricts('كر', { governorate: 'بغداد' }).map((d) => d.ar); // ['الكرخ']
69
+ ```
70
+
71
+ ### قوائم العنوان المنسدلة (React)
72
+
73
+ قائمة للمحافظات، وقائمة ثانية تعرض أقضية المحافظة المختارة:
47
74
 
48
75
  ```tsx
49
- import { governorates } from 'iraqi-data';
76
+ import { useState } from 'react';
77
+ import { governorates, getDistrictsByGovernorate } from 'iraqi-data';
78
+
79
+ export function AddressSelect() {
80
+ const [governorate, setGovernorate] = useState('');
81
+ const [district, setDistrict] = useState('');
50
82
 
51
- export function GovernorateSelect({ value, onChange }) {
52
83
  return (
53
- <select value={value} onChange={(e) => onChange(e.target.value)}>
54
- {governorates.map((g) => (
55
- <option key={g.id} value={g.id}>{g.ar}</option>
56
- ))}
57
- </select>
84
+ <>
85
+ <select value={governorate} onChange={(e) => { setGovernorate(e.target.value); setDistrict(''); }}>
86
+ <option value="">المحافظة</option>
87
+ {governorates.map((g) => (
88
+ <option key={g.id} value={g.id}>{g.ar}</option>
89
+ ))}
90
+ </select>
91
+
92
+ <select value={district} onChange={(e) => setDistrict(e.target.value)} disabled={!governorate}>
93
+ <option value="">القضاء</option>
94
+ {getDistrictsByGovernorate(governorate).map((d) => (
95
+ <option key={d.id} value={d.id}>{d.ar}</option>
96
+ ))}
97
+ </select>
98
+ </>
58
99
  );
59
100
  }
60
101
  ```
61
102
 
62
- احفظ الـ `id` ‏(`'baghdad'` و `'basra'` …) في قاعدة بياناتك، وليس الاسم المعروض. الـ `id` لا يتغير أبداً، أما تهجئة الاسم فقد تُصحَّح في إصدار لاحق.
103
+ استخدم `g.en` / `d.en` أو `g.ku` / `d.ku` للأسماء بالإنجليزية أو الكردية. احفظ المعرّفات (`'baghdad'` و `'abughraib'` …) في قاعدة بياناتك، وليس الأسماء المعروضة. المعرّف لا يتغير أبداً، أما تهجئة الاسم فقد تُصحَّح في إصدار لاحق.
63
104
 
64
105
  ## الواجهة البرمجية (API)
65
106
 
@@ -75,7 +116,7 @@ interface Governorate {
75
116
  en: string; // الاسم بالإنجليزية
76
117
  ku: string; // الاسم بالكردية (السورانية)
77
118
  region: 'federal' | 'kurdistan';
78
- capital: { ar: string; en: string }; // مركز المحافظة
119
+ capital: { ar: string; en: string; lat: number; lng: number }; // مركز المحافظة وإحداثياته
79
120
  aliases: string[]; // تهجئات أخرى: 'Basrah' و 'Arbil' و 'Hawler'
80
121
  }
81
122
  ```
@@ -92,6 +133,35 @@ interface Governorate {
92
133
 
93
134
  محافظات العراق الاتحادي أو محافظات إقليم كردستان.
94
135
 
136
+ ### `districts: readonly District[]`
137
+
138
+ كل الأقضية الـ 182، مرتّبة حسب المحافظة بترتيب `governorates` نفسه، ثم حسب الاسم الإنجليزي. المصفوفة وعناصرها مجمّدة ولا يمكن تعديلها.
139
+
140
+ ```ts
141
+ interface District {
142
+ id: string; // معرّف ثابت للحفظ: 'abughraib'
143
+ governorateId: string; // معرّف المحافظة: 'baghdad'
144
+ pcode: string | null; // رمز OCHA (P-code): 'IQG08Q01' (‏null إذا لم تعدّه OCHA قضاءً)
145
+ ar: string; // الاسم بالعربية
146
+ en: string; // الاسم بالإنجليزية
147
+ ku: string; // الاسم بالكردية (السورانية)
148
+ center: { ar: string; en: string; lat: number; lng: number }; // مركز القضاء وإحداثياته
149
+ aliases: string[]; // تهجئات وأسماء أخرى: 'الدغارة' لأكد
150
+ }
151
+ ```
152
+
153
+ ### `getDistrict(query: string): District | undefined`
154
+
155
+ تجد قضاءً واحداً بالـ `id` أو رمز P-code أو اسمه الكامل بأي لغة، بما في ذلك التهجئات الأخرى. تعمل مثل `getGovernorate`.
156
+
157
+ ### `searchDistricts(query: string, options?: { governorate?: string }): District[]`
158
+
159
+ تجد كل قضاء يحتوي اسمه على نص البحث، بترتيب `searchGovernorates` نفسه. مرّر `governorate` (أي قيمة تقبلها `getGovernorate`) للبحث في أقضية تلك المحافظة فقط.
160
+
161
+ ### `getDistrictsByGovernorate(governorate: string): District[]`
162
+
163
+ أقضية محافظة واحدة، تُحدَّد بأي قيمة تقبلها `getGovernorate`: `'basra'` أو `'البصرة'` أو `'IQ-BA'`. تُرجع `[]` لمحافظة غير معروفة.
164
+
95
165
  ### `normalize(text: string): string`
96
166
 
97
167
  الدالة التي يستخدمها البحث لمقارنة الأسماء. هي مُصدَّرة لتقارن بها قيمك المحفوظة بالطريقة نفسها.
@@ -103,6 +173,7 @@ interface Governorate {
103
173
  | التشكيل والتطويل | `البَصْرَة` ← `بصره` |
104
174
  | أداة التعريف | `البصرة` و `Al-Basrah` و `As Sulaymaniyah` |
105
175
  | الحروف الكردية المكتوبة بلوحة مفاتيح عربية | `سلێمانی` = `سليماني`، `دهۆک` = `دهوك` |
176
+ | شكلا الهاء المستخدمان في الكردية | `ھەولێر` = `هەولێر` |
106
177
  | حالة الأحرف والمسافات والشرطات | `Dhi Qar` = `dhiqar` |
107
178
 
108
179
  ```ts
@@ -112,38 +183,83 @@ normalize('البَصْرَة'); // 'بصره'
112
183
 
113
184
  ## البيانات
114
185
 
115
- | العربية | الإنجليزية | الكردية | المركز | ISO | الإقليم |
116
- | --- | --- | --- | --- | --- | --- |
117
- | بغداد | Baghdad | بەغدا | بغداد | IQ-BG | اتحادي |
118
- | البصرة | Basra | بەسرە | البصرة | IQ-BA | اتحادي |
119
- | نينوى | Nineveh | نەینەوا | الموصل | IQ-NI | اتحادي |
120
- | الأنبار | Anbar | ئەنبار | الرمادي | IQ-AN | اتحادي |
121
- | صلاح الدين | Salah al-Din | سەلاحەدین | تكريت | IQ-SD | اتحادي |
122
- | كركوك | Kirkuk | کەرکووک | كركوك | IQ-KI | اتحادي |
123
- | ديالى | Diyala | دیالە | بعقوبة | IQ-DI | اتحادي |
124
- | واسط | Wasit | واسیت | الكوت | IQ-WA | اتحادي |
125
- | بابل | Babil | بابل | الحلة | IQ-BB | اتحادي |
126
- | كربلاء | Karbala | کەربەلا | كربلاء | IQ-KA | اتحادي |
127
- | النجف | Najaf | نەجەف | النجف | IQ-NA | اتحادي |
128
- | القادسية | Al-Qadisiyyah | قادسیە | الديوانية | IQ-QA | اتحادي |
129
- | المثنى | Muthanna | موسەننا | السماوة | IQ-MU | اتحادي |
130
- | ذي قار | Dhi Qar | زیقار | الناصرية | IQ-DQ | اتحادي |
131
- | ميسان | Maysan | مەیسان | العمارة | IQ-MA | اتحادي |
132
- | أربيل | Erbil | هەولێر | أربيل | IQ-AR | كردستان |
133
- | السليمانية | Sulaymaniyah | سلێمانی | السليمانية | IQ-SU | كردستان |
134
- | دهوك | Duhok | دهۆک | دهوك | IQ-DA | كردستان |
135
- | حلبجة | Halabja | هەڵەبجە | حلبجة | — | كردستان |
186
+ ### المحافظات
187
+
188
+ | العربية | الإنجليزية | الكردية | المركز | الإحداثيات | ISO | الإقليم |
189
+ | --- | --- | --- | --- | --- | --- | --- |
190
+ | بغداد | Baghdad | بەغدا | بغداد | 33.3062, 44.3872 | IQ-BG | اتحادي |
191
+ | البصرة | Basra | بەسرە | البصرة | 30.4952, 47.8091 | IQ-BA | اتحادي |
192
+ | نينوى | Nineveh | نەینەوا | الموصل | 36.3416, 43.1291 | IQ-NI | اتحادي |
193
+ | الأنبار | Anbar | ئەنبار | الرمادي | 33.4260, 43.2999 | IQ-AN | اتحادي |
194
+ | صلاح الدين | Salah al-Din | سەلاحەدین | تكريت | 34.6158, 43.6786 | IQ-SD | اتحادي |
195
+ | كركوك | Kirkuk | کەرکووک | كركوك | 35.4719, 44.3954 | IQ-KI | اتحادي |
196
+ | ديالى | Diyala | دیالە | بعقوبة | 33.7447, 44.6328 | IQ-DI | اتحادي |
197
+ | واسط | Wasit | واسیت | الكوت | 32.5147, 45.8189 | IQ-WA | اتحادي |
198
+ | بابل | Babil | بابل | الحلة | 32.4822, 44.4328 | IQ-BB | اتحادي |
199
+ | كربلاء | Karbala | کەربەلا | كربلاء | 32.5984, 44.0158 | IQ-KA | اتحادي |
200
+ | النجف | Najaf | نەجەف | النجف | 32.0010, 44.3300 | IQ-NA | اتحادي |
201
+ | القادسية | Al-Qadisiyyah | قادسیە | الديوانية | 31.9892, 44.9247 | IQ-QA | اتحادي |
202
+ | المثنى | Muthanna | موسەننا | السماوة | 31.3079, 45.2827 | IQ-MU | اتحادي |
203
+ | ذي قار | Dhi Qar | زیقار | الناصرية | 31.0440, 46.2399 | IQ-DQ | اتحادي |
204
+ | ميسان | Maysan | مەیسان | العمارة | 31.8498, 47.1496 | IQ-MA | اتحادي |
205
+ | أربيل | Erbil | هەولێر | أربيل | 36.1912, 44.0094 | IQ-AR | كردستان |
206
+ | السليمانية | Sulaymaniyah | سلێمانی | السليمانية | 35.5571, 45.4426 | IQ-SU | كردستان |
207
+ | دهوك | Duhok | دهۆک | دهوك | 36.8543, 42.9925 | IQ-DA | كردستان |
208
+ | حلبجة | Halabja | هەڵەبجە | حلبجة | 35.1792, 45.9874 | — | كردستان |
136
209
 
137
210
  أقرّ مجلس النواب العراقي حلبجة محافظةً تاسعة عشرة للعراق عام 2025. ليس لها رمز ISO 3166-2 بعد، لذلك قيمة `iso` لها `null`.
138
211
 
212
+ الإحداثيات هي وسط مدينة مركز كل محافظة، مأخوذة من [OpenStreetMap](https://www.openstreetmap.org) (والكوت والديوانية من [Wikidata](https://www.wikidata.org))، ومقرّبة إلى 4 منازل عشرية (نحو 11 متراً). تختلف المصادر في تحديد وسط المدينة بما يصل إلى 3 كم تقريباً، لذا استخدمها لدبابيس الخرائط وحساب المسافات، وليس كعناوين دقيقة.
213
+
214
+ ### الأقضية
215
+
216
+ | المحافظة | الأقضية |
217
+ | --- | --- |
218
+ | بغداد | أبو غريب، الأعظمية، ذات السلاسل، الكاظمية، الكرخ، المدائن، المحمودية، الراشدية، الرصافة، الصدر الأولى، الصدر الثانية، التاجي، الطارمية، الزوراء، الزهور |
219
+ | البصرة | أبو الخصيب، البصرة، الدير، الفاو، الهارثة، المدينة، القرنة، الصادق، سفوان، شط العرب، الزبير |
220
+ | نينوى | البعاج، الحمدانية، الحضر، مخمور، الموصل، الشيخان، سنجار، تلعفر، تلكيف |
221
+ | الأنبار | القائم، العامرية، عانة، الفلوجة، الحبانية، حديثة، هيت، الكرمة، العبور، الرمادي، راوة، الرطبة |
222
+ | صلاح الدين | العلم، آمرلي، بيجي، بلد، الضلوعية، الدور، الدجيل، سامراء، الشرقاط، تكريت، طوز خورماتو |
223
+ | كركوك | داقوق، الدبس، الحويجة، كركوك |
224
+ | ديالى | بلدروز، بعقوبة، الخالص، خانقين، كفري، مندلي، المنصورية، المقدادية |
225
+ | واسط | الأحرار، العزيزية، بدرة، الحي، الكوت، الموفقية، النعمانية، الصويرة، الزبيدية |
226
+ | بابل | الهاشمية، الحلة، الكفل، كوثى، المحاويل، المسيب، القاسم |
227
+ | كربلاء | عين التمر، الهندية، الحر، الحسينية، الجدول الغربي، كربلاء |
228
+ | النجف | الكوفة، المناذرة، المشخاب، النجف |
229
+ | القادسية | عفك، أكد، البدير، الديوانية، غماس، الحمزة، المهناوية، السنية، الشافعية، الشامية، الشنافية، السدير، سومر |
230
+ | المثنى | الهلال، الخضر، المجد، النجمي، الرميثة، السلمان، السماوة، السوير، الوركاء |
231
+ | ذي قار | البطحاء، الجبايش، الدواية، الفجر، الفهود، الغراف، الإصلاح، كرمة بني سعيد، الناصرية، النصر، قلعة سكر، الرفاعي، سيد دخيل، الشطرة، سوق الشيوخ |
232
+ | ميسان | علي الغربي، العمارة، الكحلاء، كميت، الميمونة، المجر الكبير، قلعة صالح |
233
+ | أربيل | عنكاوة، جومان، دشت أربيل، أربيل، حرير، خبات، خليفان، كويسنجق، ميركسور، بيرمام، قوشتبة، راوندوز، شقلاوة، سيدكان، سوران |
234
+ | السليمانية | بازيان، جمجمال، دربندخان، دوكان، حاجياوة، كلار، ماوت، بنجوين، بشدر، قرة داغ، رانية، سيد صادق، شهرزور، شاربازير، السليمانية |
235
+ | دهوك | عقرة، العمادية، بردرش، باتيفا، دهوك، سميل، زاخو |
236
+ | حلبجة | بمو، بيارة، حلبجة، خورمال، سيروان |
237
+
238
+ الأسماء الكردية ورموز P-code والإحداثيات لكل قضاء موجودة في [`src/districts.json`](src/districts.json).
239
+
240
+ القائمة هي التي اعتمدها التعداد العام للسكان لعام 2024:
241
+
242
+ - العراق الاتحادي يتبع [المجموعة الإحصائية السنوية 2024](https://cosit.gov.iq/documents/AAS2024/01.pdf) للجهاز المركزي للإحصاء، التي تذكر كل قضاء ونواحيه. أقضية كثيرة استُحدثت بعد 2019، مثل الصدر الأولى والثانية في بغداد، ومعظم أقضية ذي قار والقادسية.
243
+ - إقليم كردستان يتبع أقضية تعداد 2024، وهي تطابق تقسيمات حكومة الإقليم (سوران وبيرمام وسيدكان وحاجياوة…). حلبجة محافظة مستقلة بخمسة أقضية، وليست جزءاً من السليمانية.
244
+ - كفري وخانقين والشيخان يعدّها التعداد في محافظة اتحادية وأخرى في الإقليم معاً. هنا تُذكر مرة واحدة، في ديالى ونينوى. أما عقرة وبردرش ففي دهوك، كما يذكرها الجهاز المركزي للإحصاء.
245
+
246
+ `pcode` هو رمز القضاء في [الحدود الإدارية لـ OCHA](https://data.humdata.org/dataset/cod-ab-irq)، وهي من عام 2019. الأقضية المستحدثة بعدها، أو التي تعدّها OCHA نواحيَ (أبو غريب والتاجي)، قيمة `pcode` لها `null`.
247
+
248
+ `center` هو مركز القضاء، أي البلدة التي يُدار منها. غالباً تحمل اسم القضاء نفسه، لكن ليس دائماً: مركز المدائن سلمان باك، ومركز بشدر قلعة دزة. بعض الأقضية ليس لها بلدة مستقلة، مثل أحدث أقضية بغداد (الصدر الأولى والثانية والزوراء والزهور) وبمو في حلبجة، لذا نقطتها وسط المنطقة. الإحداثيات من OpenStreetMap، ومقرّبة إلى 4 منازل عشرية.
249
+
250
+ ## المصادر
251
+
252
+ - قائمة الأقضية: [المجموعة الإحصائية السنوية 2024](https://cosit.gov.iq/documents/AAS2024/01.pdf) ونتائج تعداد 2024 كما نشرها موقع [City Population](https://www.citypopulation.de/en/iraq/admin/)
253
+ - رموز P-code للأقضية: [OCHA / الجهاز المركزي للإحصاء](https://data.humdata.org/dataset/cod-ab-irq)، بترخيص [CC BY-IGO](https://creativecommons.org/licenses/by/3.0/igo/)
254
+ - الإحداثيات: © المساهمون في [OpenStreetMap](https://www.openstreetmap.org/copyright)، و [Wikidata](https://www.wikidata.org)
255
+
139
256
  ## الخطط القادمة
140
257
 
141
- - الأقضية في كل محافظة
142
258
  - النواحي
143
259
 
144
260
  ## المساهمة
145
261
 
146
- التصحيحات مرحّب بها جداً، خصوصاً التهجئات الكردية، والتهجئات الشائعة الأخرى التي يجب إضافتها إلى `aliases`. افتح issue أو pull request يعدّل الملف [`src/governorates.json`](src/governorates.json).
262
+ التصحيحات مرحّب بها جداً، خصوصاً التهجئات الكردية، والتهجئات الشائعة الأخرى التي يجب إضافتها إلى `aliases`. افتح issue أو pull request يعدّل الملف [`src/governorates.json`](src/governorates.json) أو [`src/districts.json`](src/districts.json).
147
263
 
148
264
  ### التطوير
149
265
 
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![CI](https://github.com/karam-fikre/iraqi-data/actions/workflows/ci.yml/badge.svg)](https://github.com/karam-fikre/iraqi-data/actions/workflows/ci.yml)
7
7
  [![license](https://img.shields.io/npm/l/iraqi-data.svg)](LICENSE)
8
8
 
9
- The governorates of Iraq in Arabic, English and Kurdish, ready for address forms, dropdowns and delivery apps. Lookup and search understand the different ways people spell the same place: `البصرة`, `البصره`, `Basrah` and `بەسرە` all find Basra.
9
+ The governorates of Iraq and their districts in Arabic, English and Kurdish, ready for address forms, dropdowns and delivery apps. Lookup and search understand the different ways people spell the same place: `البصرة`, `البصره`, `Basrah` and `بەسرە` all find Basra.
10
10
 
11
11
  Works in **Node.js**, the **browser**, **React**, **React Native / Expo** and **Vue**, with TypeScript types included. No dependencies.
12
12
 
@@ -18,6 +18,8 @@ npm install iraqi-data
18
18
  yarn add iraqi-data
19
19
  ```
20
20
 
21
+ The whole package, data included, is about 11 KB gzipped.
22
+
21
23
  ## Usage
22
24
 
23
25
  ```ts
@@ -32,34 +34,73 @@ getGovernorate('Basrah');
32
34
  // en: 'Basra',
33
35
  // ku: 'بەسرە',
34
36
  // region: 'federal',
35
- // capital: { ar: 'البصرة', en: 'Basra' },
37
+ // capital: { ar: 'البصرة', en: 'Basra', lat: 30.4952, lng: 47.8091 },
36
38
  // aliases: ['Basrah']
37
39
  // }
38
40
 
39
41
  getGovernorate('هولير')?.en; // 'Erbil'
40
42
  getGovernorate('IQ-NI')?.capital.en; // 'Mosul'
43
+ getGovernorate('Erbil')?.capital; // { ar: 'أربيل', en: 'Erbil', lat: 36.1912, lng: 44.0094 }
41
44
 
42
45
  searchGovernorates('نجف').map((g) => g.en); // ['Najaf']
43
46
  searchGovernorates('ba').map((g) => g.en); // ['Baghdad', 'Basra', 'Babil', 'Anbar', 'Karbala']
44
47
  ```
45
48
 
46
- ### Dropdown example (React)
49
+ ### Districts
50
+
51
+ ```ts
52
+ import { getDistrict, searchDistricts, getDistrictsByGovernorate } from 'iraqi-data';
53
+
54
+ getDistrict('ابو غريب');
55
+ // {
56
+ // id: 'abughraib',
57
+ // governorateId: 'baghdad',
58
+ // pcode: null,
59
+ // ar: 'أبو غريب',
60
+ // en: 'Abu Ghraib',
61
+ // ku: 'ئەبو غرێب',
62
+ // center: { ar: 'أبو غريب', en: 'Abu Ghraib', lat: 33.3145, lng: 44.1682 },
63
+ // aliases: []
64
+ // }
65
+
66
+ getDistrict('الدغارة')?.en; // 'Akkad' (Daghara is its seat)
67
+ getDistrictsByGovernorate('البصرة').length; // 11
68
+ searchDistricts('كر', { governorate: 'baghdad' }).map((d) => d.en); // ['Karkh']
69
+ ```
70
+
71
+ ### Address dropdowns (React)
72
+
73
+ A governorate dropdown, and a district dropdown that lists the chosen governorate's districts:
47
74
 
48
75
  ```tsx
49
- import { governorates } from 'iraqi-data';
76
+ import { useState } from 'react';
77
+ import { governorates, getDistrictsByGovernorate } from 'iraqi-data';
78
+
79
+ export function AddressSelect() {
80
+ const [governorate, setGovernorate] = useState('');
81
+ const [district, setDistrict] = useState('');
50
82
 
51
- export function GovernorateSelect({ value, onChange }) {
52
83
  return (
53
- <select value={value} onChange={(e) => onChange(e.target.value)}>
54
- {governorates.map((g) => (
55
- <option key={g.id} value={g.id}>{g.ar}</option>
56
- ))}
57
- </select>
84
+ <>
85
+ <select value={governorate} onChange={(e) => { setGovernorate(e.target.value); setDistrict(''); }}>
86
+ <option value="">Governorate</option>
87
+ {governorates.map((g) => (
88
+ <option key={g.id} value={g.id}>{g.en}</option>
89
+ ))}
90
+ </select>
91
+
92
+ <select value={district} onChange={(e) => setDistrict(e.target.value)} disabled={!governorate}>
93
+ <option value="">District</option>
94
+ {getDistrictsByGovernorate(governorate).map((d) => (
95
+ <option key={d.id} value={d.id}>{d.en}</option>
96
+ ))}
97
+ </select>
98
+ </>
58
99
  );
59
100
  }
60
101
  ```
61
102
 
62
- Store the `id` (`'baghdad'`, `'basra'`, …) in your database, not the display name. Ids never change, while a name's spelling may be corrected in a later version.
103
+ Use `g.ar` / `d.ar` or `g.ku` / `d.ku` for an Arabic or Kurdish form. Store the ids (`'baghdad'`, `'abughraib'`, …) in your database, not the display names. Ids never change, while a name's spelling may be corrected in a later version.
63
104
 
64
105
  ## API
65
106
 
@@ -75,7 +116,7 @@ interface Governorate {
75
116
  en: string; // English name
76
117
  ku: string; // Kurdish (Sorani) name
77
118
  region: 'federal' | 'kurdistan';
78
- capital: { ar: string; en: string };
119
+ capital: { ar: string; en: string; lat: number; lng: number }; // capital city and its center
79
120
  aliases: string[]; // other spellings: 'Basrah', 'Arbil', 'Hawler'
80
121
  }
81
122
  ```
@@ -92,6 +133,35 @@ Finds every governorate whose name contains the query, for autocomplete. Exact m
92
133
 
93
134
  The governorates of federal Iraq or of the Kurdistan Region.
94
135
 
136
+ ### `districts: readonly District[]`
137
+
138
+ All 182 districts (أقضية), grouped by governorate in the same order as `governorates`, then sorted by English name. The array and its objects are frozen.
139
+
140
+ ```ts
141
+ interface District {
142
+ id: string; // stable id to store: 'abughraib'
143
+ governorateId: string; // the governorate's id: 'baghdad'
144
+ pcode: string | null; // OCHA P-code: 'IQG08Q01' (null if OCHA doesn't list it as a district)
145
+ ar: string; // Arabic name
146
+ en: string; // English name
147
+ ku: string; // Kurdish (Sorani) name
148
+ center: { ar: string; en: string; lat: number; lng: number }; // the town the district is run from
149
+ aliases: string[]; // other spellings and names: 'Daghara' for Akkad
150
+ }
151
+ ```
152
+
153
+ ### `getDistrict(query: string): District | undefined`
154
+
155
+ Finds one district by its id, P-code, or full name in any language, including the aliases. Works like `getGovernorate`.
156
+
157
+ ### `searchDistricts(query: string, options?: { governorate?: string }): District[]`
158
+
159
+ Finds every district whose name contains the query, ranked like `searchGovernorates`. Pass `governorate` (anything `getGovernorate` accepts) to search only that governorate's districts.
160
+
161
+ ### `getDistrictsByGovernorate(governorate: string): District[]`
162
+
163
+ The districts of one governorate, found by anything `getGovernorate` accepts: `'basra'`, `'البصرة'`, `'IQ-BA'`. Returns `[]` for an unknown governorate.
164
+
95
165
  ### `normalize(text: string): string`
96
166
 
97
167
  The function lookup and search use to compare names. It's exported so you can compare your own stored values the same way.
@@ -103,6 +173,7 @@ The function lookup and search use to compare names. It's exported so you can co
103
173
  | Tashkeel and tatweel | `البَصْرَة` → `بصره` |
104
174
  | The article | `البصرة`, `Al-Basrah`, `As Sulaymaniyah` |
105
175
  | Kurdish letters typed on an Arabic keyboard | `سلێمانی` = `سليماني`, `دهۆک` = `دهوك` |
176
+ | The two forms of heh used in Kurdish | `ھەولێر` = `هەولێر` |
106
177
  | Case, spaces, hyphens | `Dhi Qar` = `dhiqar` |
107
178
 
108
179
  ```ts
@@ -112,38 +183,83 @@ normalize('البَصْرَة'); // 'بصره'
112
183
 
113
184
  ## Data
114
185
 
115
- | Arabic | English | Kurdish | Capital | ISO | Region |
116
- | --- | --- | --- | --- | --- | --- |
117
- | بغداد | Baghdad | بەغدا | Baghdad | IQ-BG | federal |
118
- | البصرة | Basra | بەسرە | Basra | IQ-BA | federal |
119
- | نينوى | Nineveh | نەینەوا | Mosul | IQ-NI | federal |
120
- | الأنبار | Anbar | ئەنبار | Ramadi | IQ-AN | federal |
121
- | صلاح الدين | Salah al-Din | سەلاحەدین | Tikrit | IQ-SD | federal |
122
- | كركوك | Kirkuk | کەرکووک | Kirkuk | IQ-KI | federal |
123
- | ديالى | Diyala | دیالە | Baqubah | IQ-DI | federal |
124
- | واسط | Wasit | واسیت | Kut | IQ-WA | federal |
125
- | بابل | Babil | بابل | Hillah | IQ-BB | federal |
126
- | كربلاء | Karbala | کەربەلا | Karbala | IQ-KA | federal |
127
- | النجف | Najaf | نەجەف | Najaf | IQ-NA | federal |
128
- | القادسية | Al-Qadisiyyah | قادسیە | Diwaniyah | IQ-QA | federal |
129
- | المثنى | Muthanna | موسەننا | Samawah | IQ-MU | federal |
130
- | ذي قار | Dhi Qar | زیقار | Nasiriyah | IQ-DQ | federal |
131
- | ميسان | Maysan | مەیسان | Amarah | IQ-MA | federal |
132
- | أربيل | Erbil | هەولێر | Erbil | IQ-AR | kurdistan |
133
- | السليمانية | Sulaymaniyah | سلێمانی | Sulaymaniyah | IQ-SU | kurdistan |
134
- | دهوك | Duhok | دهۆک | Duhok | IQ-DA | kurdistan |
135
- | حلبجة | Halabja | هەڵەبجە | Halabja | — | kurdistan |
186
+ ### Governorates
187
+
188
+ | Arabic | English | Kurdish | Capital | Coordinates | ISO | Region |
189
+ | --- | --- | --- | --- | --- | --- | --- |
190
+ | بغداد | Baghdad | بەغدا | Baghdad | 33.3062, 44.3872 | IQ-BG | federal |
191
+ | البصرة | Basra | بەسرە | Basra | 30.4952, 47.8091 | IQ-BA | federal |
192
+ | نينوى | Nineveh | نەینەوا | Mosul | 36.3416, 43.1291 | IQ-NI | federal |
193
+ | الأنبار | Anbar | ئەنبار | Ramadi | 33.4260, 43.2999 | IQ-AN | federal |
194
+ | صلاح الدين | Salah al-Din | سەلاحەدین | Tikrit | 34.6158, 43.6786 | IQ-SD | federal |
195
+ | كركوك | Kirkuk | کەرکووک | Kirkuk | 35.4719, 44.3954 | IQ-KI | federal |
196
+ | ديالى | Diyala | دیالە | Baqubah | 33.7447, 44.6328 | IQ-DI | federal |
197
+ | واسط | Wasit | واسیت | Kut | 32.5147, 45.8189 | IQ-WA | federal |
198
+ | بابل | Babil | بابل | Hillah | 32.4822, 44.4328 | IQ-BB | federal |
199
+ | كربلاء | Karbala | کەربەلا | Karbala | 32.5984, 44.0158 | IQ-KA | federal |
200
+ | النجف | Najaf | نەجەف | Najaf | 32.0010, 44.3300 | IQ-NA | federal |
201
+ | القادسية | Al-Qadisiyyah | قادسیە | Diwaniyah | 31.9892, 44.9247 | IQ-QA | federal |
202
+ | المثنى | Muthanna | موسەننا | Samawah | 31.3079, 45.2827 | IQ-MU | federal |
203
+ | ذي قار | Dhi Qar | زیقار | Nasiriyah | 31.0440, 46.2399 | IQ-DQ | federal |
204
+ | ميسان | Maysan | مەیسان | Amarah | 31.8498, 47.1496 | IQ-MA | federal |
205
+ | أربيل | Erbil | هەولێر | Erbil | 36.1912, 44.0094 | IQ-AR | kurdistan |
206
+ | السليمانية | Sulaymaniyah | سلێمانی | Sulaymaniyah | 35.5571, 45.4426 | IQ-SU | kurdistan |
207
+ | دهوك | Duhok | دهۆک | Duhok | 36.8543, 42.9925 | IQ-DA | kurdistan |
208
+ | حلبجة | Halabja | هەڵەبجە | Halabja | 35.1792, 45.9874 | — | kurdistan |
136
209
 
137
210
  Halabja was approved as Iraq's 19th governorate by the Iraqi parliament in 2025. It doesn't have an ISO 3166-2 code yet, so its `iso` is `null`.
138
211
 
212
+ Coordinates are the center of each capital city, from [OpenStreetMap](https://www.openstreetmap.org) (Kut and Diwaniyah from [Wikidata](https://www.wikidata.org)), rounded to 4 decimal places (about 11 m). Sources place a city's center differently by up to about 3 km, so use them for map pins and distances, not as exact addresses.
213
+
214
+ ### Districts
215
+
216
+ | Governorate | Districts |
217
+ | --- | --- |
218
+ | Baghdad | Abu Ghraib, Adhamiya, Dhat al-Salasil, Kadhimiya, Karkh, Mada'in, Mahmudiya, Rashidiya, Rusafa, Sadr City 1, Sadr City 2, Taji, Tarmiya, Zawraa, Zuhur |
219
+ | Basra | Abu al-Khasib, Basra, Dair, Faw, Hartha, Madina, Qurna, Sadiq, Safwan, Shatt al-Arab, Zubair |
220
+ | Nineveh | Ba'aj, Hamdaniya, Hatra, Makhmur, Mosul, Shekhan, Sinjar, Tal Afar, Tel Kaif |
221
+ | Anbar | Al-Qa'im, Amiriyah, Anah, Fallujah, Habbaniyah, Haditha, Hit, Karma, Obour, Ramadi, Rawa, Rutba |
222
+ | Salah al-Din | Al-Alam, Amerli, Baiji, Balad, Dhuluiya, Dour, Dujail, Samarra, Shirqat, Tikrit, Tuz Khurmatu |
223
+ | Kirkuk | Daquq, Dibis, Hawija, Kirkuk |
224
+ | Diyala | Balad Ruz, Baqubah, Khalis, Khanaqin, Kifri, Mandali, Mansuriya, Muqdadiya |
225
+ | Wasit | Ahrar, Aziziyah, Badra, Hai, Kut, Muwaffaqiya, Numaniyah, Suwaira, Zubaidiya |
226
+ | Babil | Hashimiya, Hillah, Kifl, Kutha, Mahawil, Musayyib, Qasim |
227
+ | Karbala | Ain al-Tamr, Hindiya, Hur, Husseiniya, Jadwal al-Gharbi, Karbala |
228
+ | Najaf | Kufa, Manathera, Mishkhab, Najaf |
229
+ | Al-Qadisiyyah | Afak, Akkad, Budair, Diwaniyah, Ghammas, Hamza, Mhanawiya, Saniya, Shafi'iya, Shamiya, Shinafiya, Sudair, Sumer |
230
+ | Muthanna | Hilal, Khidhir, Majd, Najmi, Rumaitha, Salman, Samawah, Suwair, Warka |
231
+ | Dhi Qar | Batha, Chibayish, Dawaya, Fajr, Fuhud, Gharraf, Islah, Karmat Bani Sa'id, Nasiriyah, Nasr, Qal'at Sukkar, Rifai, Sayyid Dakhil, Shatra, Suq al-Shuyukh |
232
+ | Maysan | Ali al-Gharbi, Amarah, Kahla, Kumait, Maimouna, Majar al-Kabir, Qal'at Salih |
233
+ | Erbil | Ainkawa, Choman, Dashti Hawler, Erbil, Harir, Khabat, Khalifan, Koya, Mergasor, Pirmam, Qushtapa, Rawanduz, Shaqlawa, Sidakan, Soran |
234
+ | Sulaymaniyah | Bazyan, Chamchamal, Darbandikhan, Dukan, Haji Awa, Kalar, Mawat, Penjwen, Pshdar, Qaradagh, Ranya, Said Sadiq, Sharazoor, Sharbazher, Sulaymaniyah |
235
+ | Duhok | Akre, Amedi, Bardarash, Batifa, Duhok, Simele, Zakho |
236
+ | Halabja | Bamo, Byara, Halabja, Khurmal, Sirwan |
237
+
238
+ Arabic and Kurdish names, P-codes and coordinates for each are in [`src/districts.json`](src/districts.json).
239
+
240
+ The list is the one Iraq's 2024 census used:
241
+
242
+ - Federal Iraq follows the [2024 Annual Statistical Abstract](https://cosit.gov.iq/documents/AAS2024/01.pdf) of the Central Statistical Organization (COSIT), which lists every district with its sub-districts. Many districts are new since 2019, such as Sadr City 1 and 2 in Baghdad, and most of Dhi Qar's and Al-Qadisiyyah's.
243
+ - The Kurdistan Region follows the districts of the 2024 census, which match the Kurdistan Regional Government's own divisions (Soran, Pirmam, Sidakan, Haji Awa…). Halabja is its own governorate with five districts, not part of Sulaymaniyah.
244
+ - Kifri, Khanaqin and Shekhan are counted in both a federal and a Kurdistan governorate by the census. They're listed once here, in Diyala and Nineveh. Akre and Bardarash are in Duhok, as COSIT lists them.
245
+
246
+ `pcode` is the district's P-code in the [OCHA administrative boundaries](https://data.humdata.org/dataset/cod-ab-irq), which are from 2019. Districts created since then, or that OCHA counts as sub-districts (Abu Ghraib, Taji), have `pcode: null`.
247
+
248
+ Each `center` is the town the district is run from. It's often a town of the same name, but not always: Mada'in is run from Salman Pak, and Pshdar from Qaladiza. A few districts have no separate town, such as Baghdad's newest (Sadr City 1 and 2, Zawraa, Zuhur) and Bamo in Halabja, so their point is the middle of the area. Coordinates are from OpenStreetMap, rounded to 4 decimal places.
249
+
250
+ ## Sources
251
+
252
+ - District list: [COSIT Annual Statistical Abstract 2024](https://cosit.gov.iq/documents/AAS2024/01.pdf) and the 2024 census results, as published by [City Population](https://www.citypopulation.de/en/iraq/admin/)
253
+ - District P-codes: [OCHA / Iraq Central Statistics Office](https://data.humdata.org/dataset/cod-ab-irq), [CC BY-IGO](https://creativecommons.org/licenses/by/3.0/igo/)
254
+ - Coordinates: © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors, and [Wikidata](https://www.wikidata.org)
255
+
139
256
  ## Roadmap
140
257
 
141
- - Districts (أقضية) of each governorate
142
258
  - Sub-districts (نواحي)
143
259
 
144
260
  ## Contributing
145
261
 
146
- Corrections are very welcome, especially Kurdish spellings and other common spellings that should be added as aliases. Open an issue or a pull request that edits [`src/governorates.json`](src/governorates.json).
262
+ Corrections are very welcome, especially Kurdish spellings and other common spellings that should be added as aliases. Open an issue or a pull request that edits [`src/governorates.json`](src/governorates.json) or [`src/districts.json`](src/districts.json).
147
263
 
148
264
  ### Development
149
265
 
package/dist/index.d.mts CHANGED
@@ -1,4 +1,11 @@
1
1
  type Region = "federal" | "kurdistan";
2
+ /** A town, with the latitude and longitude of its center */
3
+ interface Town {
4
+ readonly ar: string;
5
+ readonly en: string;
6
+ readonly lat: number;
7
+ readonly lng: number;
8
+ }
2
9
  interface Governorate {
3
10
  /** Stable id to store in a database, such as "baghdad" */
4
11
  readonly id: string;
@@ -10,15 +17,34 @@ interface Governorate {
10
17
  readonly ku: string;
11
18
  /** Federal Iraq or the Kurdistan Region */
12
19
  readonly region: Region;
13
- readonly capital: {
14
- readonly ar: string;
15
- readonly en: string;
16
- };
20
+ /** The governorate's capital city, with the latitude and longitude of its center */
21
+ readonly capital: Town;
17
22
  /** Other spellings people use: Basrah, Arbil, Hawler */
18
23
  readonly aliases: readonly string[];
19
24
  }
25
+ interface District {
26
+ /** Stable id to store in a database, such as "abughraib" */
27
+ readonly id: string;
28
+ /** Id of the governorate the district is in, such as "baghdad" */
29
+ readonly governorateId: string;
30
+ /**
31
+ * OCHA P-code, or null for a district that OCHA's 2019 data doesn't list:
32
+ * one created since, or one it counts as a sub-district (Abu Ghraib)
33
+ */
34
+ readonly pcode: string | null;
35
+ readonly ar: string;
36
+ readonly en: string;
37
+ /** Kurdish (Sorani) */
38
+ readonly ku: string;
39
+ /** The town the district is run from, with the latitude and longitude of its center */
40
+ readonly center: Town;
41
+ /** Other spellings people use, and other names: Daghara for Akkad */
42
+ readonly aliases: readonly string[];
43
+ }
20
44
  /** All 19 governorates: the 15 of federal Iraq, then the 4 of the Kurdistan Region */
21
45
  declare const governorates: readonly Governorate[];
46
+ /** All districts, grouped by governorate in the same order as `governorates` */
47
+ declare const districts: readonly District[];
22
48
  /** Reduces a name to the form used for comparing: "Al-Basrah" → "basrah", "البَصرة" → "بصره" */
23
49
  declare function normalize(text: string): string;
24
50
  /**
@@ -33,5 +59,21 @@ declare function getGovernorate(query: string): Governorate | undefined;
33
59
  declare function searchGovernorates(query: string): Governorate[];
34
60
  /** Governorates in federal Iraq or in the Kurdistan Region */
35
61
  declare function getGovernoratesByRegion(region: Region): Governorate[];
62
+ /**
63
+ * Finds a district by its id, P-code, or name in any language, ignoring
64
+ * spelling differences: "Abu Ghraib", "ابو غريب" and "abughraib" all return
65
+ * Abu Ghraib.
66
+ */
67
+ declare function getDistrict(query: string): District | undefined;
68
+ /**
69
+ * Finds every district whose name contains the query, for autocomplete.
70
+ * Exact matches come first, then names that start with the query. Pass a
71
+ * governorate (any query `getGovernorate` accepts) to search only its districts.
72
+ */
73
+ declare function searchDistricts(query: string, options?: {
74
+ governorate?: string;
75
+ }): District[];
76
+ /** The districts of a governorate, found by any query `getGovernorate` accepts */
77
+ declare function getDistrictsByGovernorate(governorate: string): District[];
36
78
 
37
- export { type Governorate, type Region, getGovernorate, getGovernoratesByRegion, governorates, normalize, searchGovernorates };
79
+ export { type District, type Governorate, type Region, type Town, districts, getDistrict, getDistrictsByGovernorate, getGovernorate, getGovernoratesByRegion, governorates, normalize, searchDistricts, searchGovernorates };