@code-plate/iran-cities 1.0.1 → 1.0.2
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/dist/index.cjs +107 -52
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +21 -8
- package/dist/index.d.ts +21 -8
- package/dist/index.mjs +106 -52
- package/dist/index.mjs.map +1 -1
- package/dist/react.cjs +92 -39
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.mts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.mjs +92 -39
- package/dist/react.mjs.map +1 -1
- package/dist/{types--eoWJy5A.d.mts → types-DwFZSr9I.d.mts} +8 -1
- package/dist/{types--eoWJy5A.d.ts → types-DwFZSr9I.d.ts} +8 -1
- package/package.json +6 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as FlatCity, C as City, P as Province, S as SearchOptions } from './types
|
|
2
|
-
export { L as Locale } from './types
|
|
1
|
+
import { F as FlatCity, C as City, a as CityKey, P as Province, S as SearchOptions } from './types-DwFZSr9I.mjs';
|
|
2
|
+
export { L as Locale } from './types-DwFZSr9I.mjs';
|
|
3
3
|
|
|
4
4
|
/** لیست کامل استانها به همراه شهرهای هرکدام */
|
|
5
5
|
declare function getProvinces(): Province[];
|
|
@@ -8,19 +8,32 @@ declare function getProvincesList(): {
|
|
|
8
8
|
en: string;
|
|
9
9
|
fa: string;
|
|
10
10
|
}[];
|
|
11
|
-
/** پیدا کردن یک استان با شناسه انگلیسی یا نام فارسی (دقیق، نرمالشده) */
|
|
11
|
+
/** پیدا کردن یک استان با شناسه انگلیسی یا نام فارسی (دقیق، نرمالشده) - O(1) */
|
|
12
12
|
declare function getProvince(query: string): Province | undefined;
|
|
13
13
|
/** لیست شهرهای یک استان بر اساس شناسه انگلیسی یا نام فارسی استان */
|
|
14
14
|
declare function getCities(provinceQuery: string): City[];
|
|
15
15
|
/** لیست تمام شهرهای کشور به صورت مسطح، همراه با اطلاعات استان مربوطه */
|
|
16
16
|
declare function getAllCities(): FlatCity[];
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* پیدا کردن یک شهر با شناسهی یکتای سراسری آن (City.slug، بهفرم `provinceEn/cityEn`) - O(1)
|
|
19
|
+
* برای پکیجهای وابسته که دادهی اضافه (کد تلفن، پلاک، پیششماره کد ملی و ...) را بر اساس
|
|
20
|
+
* این کلید نگه میدارند، مسیر پیشنهادی همین تابع است چون بدون ابهامِ همنامی کار میکند.
|
|
21
|
+
*/
|
|
22
|
+
declare function getCityBySlug(slug: CityKey): FlatCity | undefined;
|
|
23
|
+
/** پیدا کردن یک شهر با شناسه انگلیسی یا نام فارسی (اختیاری: محدود به یک استان خاص) - O(1) / O(اندازه استان) */
|
|
18
24
|
declare function getCity(cityQuery: string, provinceQuery?: string): FlatCity | undefined;
|
|
19
|
-
/** استانی که یک شهر مشخص در آن قرار دارد را برمیگرداند */
|
|
25
|
+
/** استانی که یک شهر مشخص در آن قرار دارد را برمیگرداند - O(1) */
|
|
20
26
|
declare function getProvinceOfCity(cityQuery: string): Province | undefined;
|
|
21
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* جستجوی رتبهبندیشده در بین استانها بر اساس بخشی از نام.
|
|
29
|
+
* ترتیب نتایج: تطابق دقیق > شروعشوندهبا > شاملشونده > (در حالت fuzzy) نزدیک از نظر فاصلهی ادیت.
|
|
30
|
+
*/
|
|
22
31
|
declare function searchProvinces(query: string, options?: SearchOptions): Province[];
|
|
23
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* جستجوی رتبهبندیشده در بین تمام شهرهای کشور بر اساس بخشی از نام.
|
|
34
|
+
* ترتیب نتایج: تطابق دقیق > شروعشوندهبا > شاملشونده > (در حالت fuzzy) نزدیک از نظر فاصلهی ادیت.
|
|
35
|
+
* برای تحمل غلط تایپی، `{ fuzzy: true }` را در options پاس بده.
|
|
36
|
+
*/
|
|
24
37
|
declare function searchCities(query: string, options?: SearchOptions): FlatCity[];
|
|
25
38
|
/** آمار کلی: تعداد استانها و تعداد کل شهرها */
|
|
26
39
|
declare function getStats(): {
|
|
@@ -28,4 +41,4 @@ declare function getStats(): {
|
|
|
28
41
|
cityCount: number;
|
|
29
42
|
};
|
|
30
43
|
|
|
31
|
-
export { City, FlatCity, Province, SearchOptions, getAllCities, getCities, getCity, getProvince, getProvinceOfCity, getProvinces, getProvincesList, getStats, searchCities, searchProvinces };
|
|
44
|
+
export { City, CityKey, FlatCity, Province, SearchOptions, getAllCities, getCities, getCity, getCityBySlug, getProvince, getProvinceOfCity, getProvinces, getProvincesList, getStats, searchCities, searchProvinces };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as FlatCity, C as City, P as Province, S as SearchOptions } from './types
|
|
2
|
-
export { L as Locale } from './types
|
|
1
|
+
import { F as FlatCity, C as City, a as CityKey, P as Province, S as SearchOptions } from './types-DwFZSr9I.js';
|
|
2
|
+
export { L as Locale } from './types-DwFZSr9I.js';
|
|
3
3
|
|
|
4
4
|
/** لیست کامل استانها به همراه شهرهای هرکدام */
|
|
5
5
|
declare function getProvinces(): Province[];
|
|
@@ -8,19 +8,32 @@ declare function getProvincesList(): {
|
|
|
8
8
|
en: string;
|
|
9
9
|
fa: string;
|
|
10
10
|
}[];
|
|
11
|
-
/** پیدا کردن یک استان با شناسه انگلیسی یا نام فارسی (دقیق، نرمالشده) */
|
|
11
|
+
/** پیدا کردن یک استان با شناسه انگلیسی یا نام فارسی (دقیق، نرمالشده) - O(1) */
|
|
12
12
|
declare function getProvince(query: string): Province | undefined;
|
|
13
13
|
/** لیست شهرهای یک استان بر اساس شناسه انگلیسی یا نام فارسی استان */
|
|
14
14
|
declare function getCities(provinceQuery: string): City[];
|
|
15
15
|
/** لیست تمام شهرهای کشور به صورت مسطح، همراه با اطلاعات استان مربوطه */
|
|
16
16
|
declare function getAllCities(): FlatCity[];
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* پیدا کردن یک شهر با شناسهی یکتای سراسری آن (City.slug، بهفرم `provinceEn/cityEn`) - O(1)
|
|
19
|
+
* برای پکیجهای وابسته که دادهی اضافه (کد تلفن، پلاک، پیششماره کد ملی و ...) را بر اساس
|
|
20
|
+
* این کلید نگه میدارند، مسیر پیشنهادی همین تابع است چون بدون ابهامِ همنامی کار میکند.
|
|
21
|
+
*/
|
|
22
|
+
declare function getCityBySlug(slug: CityKey): FlatCity | undefined;
|
|
23
|
+
/** پیدا کردن یک شهر با شناسه انگلیسی یا نام فارسی (اختیاری: محدود به یک استان خاص) - O(1) / O(اندازه استان) */
|
|
18
24
|
declare function getCity(cityQuery: string, provinceQuery?: string): FlatCity | undefined;
|
|
19
|
-
/** استانی که یک شهر مشخص در آن قرار دارد را برمیگرداند */
|
|
25
|
+
/** استانی که یک شهر مشخص در آن قرار دارد را برمیگرداند - O(1) */
|
|
20
26
|
declare function getProvinceOfCity(cityQuery: string): Province | undefined;
|
|
21
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* جستجوی رتبهبندیشده در بین استانها بر اساس بخشی از نام.
|
|
29
|
+
* ترتیب نتایج: تطابق دقیق > شروعشوندهبا > شاملشونده > (در حالت fuzzy) نزدیک از نظر فاصلهی ادیت.
|
|
30
|
+
*/
|
|
22
31
|
declare function searchProvinces(query: string, options?: SearchOptions): Province[];
|
|
23
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* جستجوی رتبهبندیشده در بین تمام شهرهای کشور بر اساس بخشی از نام.
|
|
34
|
+
* ترتیب نتایج: تطابق دقیق > شروعشوندهبا > شاملشونده > (در حالت fuzzy) نزدیک از نظر فاصلهی ادیت.
|
|
35
|
+
* برای تحمل غلط تایپی، `{ fuzzy: true }` را در options پاس بده.
|
|
36
|
+
*/
|
|
24
37
|
declare function searchCities(query: string, options?: SearchOptions): FlatCity[];
|
|
25
38
|
/** آمار کلی: تعداد استانها و تعداد کل شهرها */
|
|
26
39
|
declare function getStats(): {
|
|
@@ -28,4 +41,4 @@ declare function getStats(): {
|
|
|
28
41
|
cityCount: number;
|
|
29
42
|
};
|
|
30
43
|
|
|
31
|
-
export { City, FlatCity, Province, SearchOptions, getAllCities, getCities, getCity, getProvince, getProvinceOfCity, getProvinces, getProvincesList, getStats, searchCities, searchProvinces };
|
|
44
|
+
export { City, CityKey, FlatCity, Province, SearchOptions, getAllCities, getCities, getCity, getCityBySlug, getProvince, getProvinceOfCity, getProvinces, getProvincesList, getStats, searchCities, searchProvinces };
|
package/dist/index.mjs
CHANGED
|
@@ -5201,25 +5201,98 @@ var data_default = [
|
|
|
5201
5201
|
];
|
|
5202
5202
|
|
|
5203
5203
|
// src/index.ts
|
|
5204
|
-
var provinces = data_default.map((p) => ({
|
|
5205
|
-
en: p["province-en"],
|
|
5206
|
-
fa: p["province-fa"],
|
|
5207
|
-
cities: p.cities.map((c) => ({ en: c["city-en"], fa: c["city-fa"] }))
|
|
5208
|
-
}));
|
|
5209
5204
|
function normalize(input) {
|
|
5210
5205
|
return input.trim().toLowerCase().replace(/ي/g, "\u06CC").replace(/ك/g, "\u06A9").replace(/[\u200c\s-]+/g, "");
|
|
5211
5206
|
}
|
|
5212
|
-
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
const
|
|
5216
|
-
|
|
5217
|
-
|
|
5218
|
-
|
|
5207
|
+
function levenshtein(a, b) {
|
|
5208
|
+
if (a === b) return 0;
|
|
5209
|
+
const al = a.length;
|
|
5210
|
+
const bl = b.length;
|
|
5211
|
+
if (al === 0) return bl;
|
|
5212
|
+
if (bl === 0) return al;
|
|
5213
|
+
let prev = new Array(bl + 1);
|
|
5214
|
+
for (let j = 0; j <= bl; j++) prev[j] = j;
|
|
5215
|
+
for (let i = 1; i <= al; i++) {
|
|
5216
|
+
const curr = new Array(bl + 1);
|
|
5217
|
+
curr[0] = i;
|
|
5218
|
+
for (let j = 1; j <= bl; j++) {
|
|
5219
|
+
const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1;
|
|
5220
|
+
curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);
|
|
5219
5221
|
}
|
|
5222
|
+
prev = curr;
|
|
5220
5223
|
}
|
|
5221
|
-
|
|
5222
|
-
|
|
5224
|
+
return prev[bl];
|
|
5225
|
+
}
|
|
5226
|
+
function matchScore(query, target, fuzzy, maxDistance) {
|
|
5227
|
+
if (!target) return Infinity;
|
|
5228
|
+
if (target === query) return 0;
|
|
5229
|
+
if (target.startsWith(query)) return 1;
|
|
5230
|
+
if (target.includes(query)) return 2;
|
|
5231
|
+
if (fuzzy) {
|
|
5232
|
+
const dist = levenshtein(query, target);
|
|
5233
|
+
if (dist <= maxDistance) return 3 + dist;
|
|
5234
|
+
}
|
|
5235
|
+
return Infinity;
|
|
5236
|
+
}
|
|
5237
|
+
var provinces = data_default.map((p) => {
|
|
5238
|
+
const provinceEn = p["province-en"];
|
|
5239
|
+
const provinceFa = p["province-fa"];
|
|
5240
|
+
return {
|
|
5241
|
+
en: provinceEn,
|
|
5242
|
+
fa: provinceFa,
|
|
5243
|
+
cities: p.cities.map((c) => ({
|
|
5244
|
+
en: c["city-en"],
|
|
5245
|
+
fa: c["city-fa"],
|
|
5246
|
+
slug: `${provinceEn}/${c["city-en"]}`
|
|
5247
|
+
}))
|
|
5248
|
+
};
|
|
5249
|
+
});
|
|
5250
|
+
var flatCities = [];
|
|
5251
|
+
var cityBySlug = /* @__PURE__ */ new Map();
|
|
5252
|
+
var cityByNormKey = /* @__PURE__ */ new Map();
|
|
5253
|
+
var provinceByNormKey = /* @__PURE__ */ new Map();
|
|
5254
|
+
var cityToProvinceByNormKey = /* @__PURE__ */ new Map();
|
|
5255
|
+
var searchableCities = [];
|
|
5256
|
+
var searchableProvinces = [];
|
|
5257
|
+
for (const p of provinces) {
|
|
5258
|
+
const pNormEn = normalize(p.en);
|
|
5259
|
+
const pNormFa = normalize(p.fa);
|
|
5260
|
+
if (!provinceByNormKey.has(pNormEn)) provinceByNormKey.set(pNormEn, p);
|
|
5261
|
+
if (!provinceByNormKey.has(pNormFa)) provinceByNormKey.set(pNormFa, p);
|
|
5262
|
+
searchableProvinces.push({ item: p, normEn: pNormEn, normFa: pNormFa });
|
|
5263
|
+
for (const c of p.cities) {
|
|
5264
|
+
const flat = { en: c.en, fa: c.fa, slug: c.slug, provinceEn: p.en, provinceFa: p.fa };
|
|
5265
|
+
flatCities.push(flat);
|
|
5266
|
+
cityBySlug.set(flat.slug, flat);
|
|
5267
|
+
const cNormEn = normalize(c.en);
|
|
5268
|
+
const cNormFa = normalize(c.fa);
|
|
5269
|
+
if (!cityByNormKey.has(cNormEn)) cityByNormKey.set(cNormEn, flat);
|
|
5270
|
+
if (!cityByNormKey.has(cNormFa)) cityByNormKey.set(cNormFa, flat);
|
|
5271
|
+
if (!cityToProvinceByNormKey.has(cNormEn)) cityToProvinceByNormKey.set(cNormEn, p);
|
|
5272
|
+
if (!cityToProvinceByNormKey.has(cNormFa)) cityToProvinceByNormKey.set(cNormFa, p);
|
|
5273
|
+
searchableCities.push({ item: flat, normEn: cNormEn, normFa: cNormFa });
|
|
5274
|
+
}
|
|
5275
|
+
}
|
|
5276
|
+
function rankedSearch(pool, query, options) {
|
|
5277
|
+
var _a, _b, _c;
|
|
5278
|
+
const q = normalize(query);
|
|
5279
|
+
if (!q) {
|
|
5280
|
+
const all = pool.map((e) => e.item);
|
|
5281
|
+
return options.limit ? all.slice(0, options.limit) : all;
|
|
5282
|
+
}
|
|
5283
|
+
const locale = (_a = options.locale) != null ? _a : "both";
|
|
5284
|
+
const fuzzy = (_b = options.fuzzy) != null ? _b : false;
|
|
5285
|
+
const maxDistance = (_c = options.maxDistance) != null ? _c : 2;
|
|
5286
|
+
const scored = [];
|
|
5287
|
+
for (const entry of pool) {
|
|
5288
|
+
let score = Infinity;
|
|
5289
|
+
if (locale !== "fa") score = Math.min(score, matchScore(q, entry.normEn, fuzzy, maxDistance));
|
|
5290
|
+
if (locale !== "en") score = Math.min(score, matchScore(q, entry.normFa, fuzzy, maxDistance));
|
|
5291
|
+
if (score !== Infinity) scored.push({ item: entry.item, score });
|
|
5292
|
+
}
|
|
5293
|
+
scored.sort((a, b) => a.score - b.score);
|
|
5294
|
+
const results = scored.map((s) => s.item);
|
|
5295
|
+
return options.limit ? results.slice(0, options.limit) : results;
|
|
5223
5296
|
}
|
|
5224
5297
|
function getProvinces() {
|
|
5225
5298
|
return provinces;
|
|
@@ -5228,67 +5301,48 @@ function getProvincesList() {
|
|
|
5228
5301
|
return provinces.map((p) => ({ en: p.en, fa: p.fa }));
|
|
5229
5302
|
}
|
|
5230
5303
|
function getProvince(query) {
|
|
5231
|
-
|
|
5232
|
-
return provinces.find((p) => normalize(p.en) === q || normalize(p.fa) === q);
|
|
5304
|
+
return provinceByNormKey.get(normalize(query));
|
|
5233
5305
|
}
|
|
5234
5306
|
function getCities(provinceQuery) {
|
|
5235
|
-
|
|
5236
|
-
return
|
|
5307
|
+
var _a, _b;
|
|
5308
|
+
return (_b = (_a = getProvince(provinceQuery)) == null ? void 0 : _a.cities) != null ? _b : [];
|
|
5237
5309
|
}
|
|
5238
5310
|
function getAllCities() {
|
|
5239
|
-
return
|
|
5311
|
+
return flatCities;
|
|
5312
|
+
}
|
|
5313
|
+
function getCityBySlug(slug) {
|
|
5314
|
+
return cityBySlug.get(slug);
|
|
5240
5315
|
}
|
|
5241
5316
|
function getCity(cityQuery, provinceQuery) {
|
|
5242
5317
|
const q = normalize(cityQuery);
|
|
5243
|
-
|
|
5244
|
-
|
|
5245
|
-
return
|
|
5246
|
-
|
|
5247
|
-
|
|
5248
|
-
|
|
5249
|
-
|
|
5250
|
-
}) : getFlatCitiesInternal();
|
|
5251
|
-
return pool.find((c) => normalize(c.en) === q || normalize(c.fa) === q);
|
|
5318
|
+
if (provinceQuery) {
|
|
5319
|
+
const province = getProvince(provinceQuery);
|
|
5320
|
+
if (!province) return void 0;
|
|
5321
|
+
const city = province.cities.find((c) => normalize(c.en) === q || normalize(c.fa) === q);
|
|
5322
|
+
return city ? { en: city.en, fa: city.fa, slug: city.slug, provinceEn: province.en, provinceFa: province.fa } : void 0;
|
|
5323
|
+
}
|
|
5324
|
+
return cityByNormKey.get(q);
|
|
5252
5325
|
}
|
|
5253
5326
|
function getProvinceOfCity(cityQuery) {
|
|
5254
|
-
|
|
5255
|
-
return provinces.find((p) => p.cities.some((c) => normalize(c.en) === q || normalize(c.fa) === q));
|
|
5327
|
+
return cityToProvinceByNormKey.get(normalize(cityQuery));
|
|
5256
5328
|
}
|
|
5257
5329
|
function searchProvinces(query, options = {}) {
|
|
5258
|
-
|
|
5259
|
-
const q = normalize(query);
|
|
5260
|
-
if (!q) return options.limit ? provinces.slice(0, options.limit) : provinces;
|
|
5261
|
-
const locale = (_a = options.locale) != null ? _a : "both";
|
|
5262
|
-
const results = provinces.filter((p) => {
|
|
5263
|
-
const matchEn = locale !== "fa" && normalize(p.en).includes(q);
|
|
5264
|
-
const matchFa = locale !== "en" && normalize(p.fa).includes(q);
|
|
5265
|
-
return matchEn || matchFa;
|
|
5266
|
-
});
|
|
5267
|
-
return options.limit ? results.slice(0, options.limit) : results;
|
|
5330
|
+
return rankedSearch(searchableProvinces, query, options);
|
|
5268
5331
|
}
|
|
5269
5332
|
function searchCities(query, options = {}) {
|
|
5270
|
-
|
|
5271
|
-
const q = normalize(query);
|
|
5272
|
-
const all = getFlatCitiesInternal();
|
|
5273
|
-
if (!q) return options.limit ? all.slice(0, options.limit) : all;
|
|
5274
|
-
const locale = (_a = options.locale) != null ? _a : "both";
|
|
5275
|
-
const results = all.filter((c) => {
|
|
5276
|
-
const matchEn = locale !== "fa" && normalize(c.en).includes(q);
|
|
5277
|
-
const matchFa = locale !== "en" && normalize(c.fa).includes(q);
|
|
5278
|
-
return matchEn || matchFa;
|
|
5279
|
-
});
|
|
5280
|
-
return options.limit ? results.slice(0, options.limit) : results;
|
|
5333
|
+
return rankedSearch(searchableCities, query, options);
|
|
5281
5334
|
}
|
|
5282
5335
|
function getStats() {
|
|
5283
5336
|
return {
|
|
5284
5337
|
provinceCount: provinces.length,
|
|
5285
|
-
cityCount:
|
|
5338
|
+
cityCount: flatCities.length
|
|
5286
5339
|
};
|
|
5287
5340
|
}
|
|
5288
5341
|
export {
|
|
5289
5342
|
getAllCities,
|
|
5290
5343
|
getCities,
|
|
5291
5344
|
getCity,
|
|
5345
|
+
getCityBySlug,
|
|
5292
5346
|
getProvince,
|
|
5293
5347
|
getProvinceOfCity,
|
|
5294
5348
|
getProvinces,
|