@quranjs/api 1.7.4 → 2.0.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/dist/index.d.ts CHANGED
@@ -1,24 +1,165 @@
1
- declare type _NumbersFrom0ToN<Nr extends number> = Nr extends Nr ? number extends Nr ? number : Nr extends 0 ? never : _NumbersFrom0ToNRec<Nr, [], 0> : never;
2
- declare type _NumbersFrom0ToNRec<Nr extends number, Counter extends any[], Accumulator extends number> = Counter['length'] extends Nr ? Accumulator : _NumbersFrom0ToNRec<Nr, [any, ...Counter], Accumulator | Counter['length']>;
3
- declare type NumberRange<Start extends number, End extends number> = Exclude<_NumbersFrom0ToN<End>, _NumbersFrom0ToN<Start>>;
4
- declare type NumberUnionToString<TType> = TType extends number ? `${TType}` : TType;
1
+ /**
2
+ * Maps chapter number to verse count
3
+ */
4
+ declare const versesMapping: {
5
+ readonly 1: 7;
6
+ readonly 2: 286;
7
+ readonly 3: 200;
8
+ readonly 4: 176;
9
+ readonly 5: 120;
10
+ readonly 6: 165;
11
+ readonly 7: 206;
12
+ readonly 8: 75;
13
+ readonly 9: 129;
14
+ readonly 10: 109;
15
+ readonly 11: 123;
16
+ readonly 12: 111;
17
+ readonly 13: 43;
18
+ readonly 14: 52;
19
+ readonly 15: 99;
20
+ readonly 16: 128;
21
+ readonly 17: 111;
22
+ readonly 18: 110;
23
+ readonly 19: 98;
24
+ readonly 20: 135;
25
+ readonly 21: 112;
26
+ readonly 22: 78;
27
+ readonly 23: 118;
28
+ readonly 24: 64;
29
+ readonly 25: 77;
30
+ readonly 26: 227;
31
+ readonly 27: 93;
32
+ readonly 28: 88;
33
+ readonly 29: 69;
34
+ readonly 30: 60;
35
+ readonly 31: 34;
36
+ readonly 32: 30;
37
+ readonly 33: 73;
38
+ readonly 34: 54;
39
+ readonly 35: 45;
40
+ readonly 36: 83;
41
+ readonly 37: 182;
42
+ readonly 38: 88;
43
+ readonly 39: 75;
44
+ readonly 40: 85;
45
+ readonly 41: 54;
46
+ readonly 42: 53;
47
+ readonly 43: 89;
48
+ readonly 44: 59;
49
+ readonly 45: 37;
50
+ readonly 46: 35;
51
+ readonly 47: 38;
52
+ readonly 48: 29;
53
+ readonly 49: 18;
54
+ readonly 50: 45;
55
+ readonly 51: 60;
56
+ readonly 52: 49;
57
+ readonly 53: 62;
58
+ readonly 54: 55;
59
+ readonly 55: 78;
60
+ readonly 56: 96;
61
+ readonly 57: 29;
62
+ readonly 58: 22;
63
+ readonly 59: 24;
64
+ readonly 60: 13;
65
+ readonly 61: 14;
66
+ readonly 62: 11;
67
+ readonly 63: 11;
68
+ readonly 64: 18;
69
+ readonly 65: 12;
70
+ readonly 66: 12;
71
+ readonly 67: 30;
72
+ readonly 68: 52;
73
+ readonly 69: 52;
74
+ readonly 70: 44;
75
+ readonly 71: 28;
76
+ readonly 72: 28;
77
+ readonly 73: 20;
78
+ readonly 74: 56;
79
+ readonly 75: 40;
80
+ readonly 76: 31;
81
+ readonly 77: 50;
82
+ readonly 78: 40;
83
+ readonly 79: 46;
84
+ readonly 80: 42;
85
+ readonly 81: 29;
86
+ readonly 82: 19;
87
+ readonly 83: 36;
88
+ readonly 84: 25;
89
+ readonly 85: 22;
90
+ readonly 86: 17;
91
+ readonly 87: 19;
92
+ readonly 88: 26;
93
+ readonly 89: 30;
94
+ readonly 90: 20;
95
+ readonly 91: 15;
96
+ readonly 92: 21;
97
+ readonly 93: 11;
98
+ readonly 94: 8;
99
+ readonly 95: 8;
100
+ readonly 96: 19;
101
+ readonly 97: 5;
102
+ readonly 98: 8;
103
+ readonly 99: 8;
104
+ readonly 100: 11;
105
+ readonly 101: 11;
106
+ readonly 102: 8;
107
+ readonly 103: 3;
108
+ readonly 104: 9;
109
+ readonly 105: 5;
110
+ readonly 106: 4;
111
+ readonly 107: 7;
112
+ readonly 108: 3;
113
+ readonly 109: 6;
114
+ readonly 110: 3;
115
+ readonly 111: 5;
116
+ readonly 112: 4;
117
+ readonly 113: 5;
118
+ readonly 114: 6;
119
+ };
120
+
121
+ type _NumbersFrom0ToN<Nr extends number> = Nr extends Nr ? number extends Nr ? number : Nr extends 0 ? never : _NumbersFrom0ToNRec<Nr, [], 0> : never;
122
+ type _NumbersFrom0ToNRec<Nr extends number, Counter extends unknown[], Accumulator extends number> = Counter["length"] extends Nr ? Accumulator : _NumbersFrom0ToNRec<Nr, [
123
+ unknown,
124
+ ...Counter
125
+ ], Accumulator | Counter["length"]>;
126
+ type NumberRange<Start extends number, End extends number> = Exclude<_NumbersFrom0ToN<End>, _NumbersFrom0ToN<Start>>;
127
+ type NumberUnionToString<TType> = TType extends number ? `${TType}` : TType;
128
+ /**
129
+ * Builds a tuple with a length equal to the provided number literal.
130
+ * Used for type-level arithmetic.
131
+ */
132
+ type BuildTuple<TLength extends number, TAccumulator extends unknown[] = []> = TAccumulator["length"] extends TLength ? TAccumulator : BuildTuple<TLength, [...TAccumulator, unknown]>;
133
+ /**
134
+ * Increments a numeric literal type by 1.
135
+ */
136
+ type Increment<TNumber extends number> = [
137
+ ...BuildTuple<TNumber>,
138
+ unknown
139
+ ]["length"];
5
140
 
6
- declare type VerseKey = `1:${NumberRange<1, 8>}` | `2:${NumberRange<1, 287>}` | `3:${NumberRange<1, 201>}` | `4:${NumberRange<1, 177>}` | `5:${NumberRange<1, 121>}` | `6:${NumberRange<1, 166>}` | `7:${NumberRange<1, 207>}` | `8:${NumberRange<1, 76>}` | `9:${NumberRange<1, 130>}` | `10:${NumberRange<1, 110>}` | `11:${NumberRange<1, 124>}` | `12:${NumberRange<1, 112>}` | `13:${NumberRange<1, 44>}` | `14:${NumberRange<1, 53>}` | `15:${NumberRange<1, 100>}` | `16:${NumberRange<1, 129>}` | `17:${NumberRange<1, 112>}` | `18:${NumberRange<1, 111>}` | `19:${NumberRange<1, 99>}` | `20:${NumberRange<1, 136>}` | `21:${NumberRange<1, 113>}` | `22:${NumberRange<1, 79>}` | `23:${NumberRange<1, 119>}` | `24:${NumberRange<1, 65>}` | `25:${NumberRange<1, 78>}` | `26:${NumberRange<1, 228>}` | `27:${NumberRange<1, 94>}` | `28:${NumberRange<1, 89>}` | `29:${NumberRange<1, 70>}` | `30:${NumberRange<1, 61>}` | `31:${NumberRange<1, 35>}` | `32:${NumberRange<1, 31>}` | `33:${NumberRange<1, 74>}` | `34:${NumberRange<1, 55>}` | `35:${NumberRange<1, 46>}` | `36:${NumberRange<1, 84>}` | `37:${NumberRange<1, 183>}` | `38:${NumberRange<1, 89>}` | `39:${NumberRange<1, 76>}` | `40:${NumberRange<1, 86>}` | `41:${NumberRange<1, 55>}` | `42:${NumberRange<1, 54>}` | `43:${NumberRange<1, 90>}` | `44:${NumberRange<1, 60>}` | `45:${NumberRange<1, 38>}` | `46:${NumberRange<1, 36>}` | `47:${NumberRange<1, 39>}` | `48:${NumberRange<1, 30>}` | `49:${NumberRange<1, 19>}` | `50:${NumberRange<1, 46>}` | `51:${NumberRange<1, 61>}` | `52:${NumberRange<1, 50>}` | `53:${NumberRange<1, 63>}` | `54:${NumberRange<1, 56>}` | `55:${NumberRange<1, 79>}` | `56:${NumberRange<1, 97>}` | `57:${NumberRange<1, 30>}` | `58:${NumberRange<1, 23>}` | `59:${NumberRange<1, 25>}` | `60:${NumberRange<1, 14>}` | `61:${NumberRange<1, 15>}` | `62:${NumberRange<1, 12>}` | `63:${NumberRange<1, 12>}` | `64:${NumberRange<1, 19>}` | `65:${NumberRange<1, 13>}` | `66:${NumberRange<1, 13>}` | `67:${NumberRange<1, 31>}` | `68:${NumberRange<1, 53>}` | `69:${NumberRange<1, 53>}` | `70:${NumberRange<1, 45>}` | `71:${NumberRange<1, 29>}` | `72:${NumberRange<1, 29>}` | `73:${NumberRange<1, 21>}` | `74:${NumberRange<1, 57>}` | `75:${NumberRange<1, 41>}` | `76:${NumberRange<1, 32>}` | `77:${NumberRange<1, 51>}` | `78:${NumberRange<1, 41>}` | `79:${NumberRange<1, 47>}` | `80:${NumberRange<1, 43>}` | `81:${NumberRange<1, 30>}` | `82:${NumberRange<1, 20>}` | `83:${NumberRange<1, 37>}` | `84:${NumberRange<1, 26>}` | `85:${NumberRange<1, 23>}` | `86:${NumberRange<1, 18>}` | `87:${NumberRange<1, 20>}` | `88:${NumberRange<1, 27>}` | `89:${NumberRange<1, 31>}` | `90:${NumberRange<1, 21>}` | `91:${NumberRange<1, 16>}` | `92:${NumberRange<1, 22>}` | `93:${NumberRange<1, 12>}` | `94:${NumberRange<1, 9>}` | `95:${NumberRange<1, 9>}` | `96:${NumberRange<1, 20>}` | `97:${NumberRange<1, 6>}` | `98:${NumberRange<1, 9>}` | `99:${NumberRange<1, 9>}` | `100:${NumberRange<1, 12>}` | `101:${NumberRange<1, 12>}` | `102:${NumberRange<1, 9>}` | `103:${NumberRange<1, 4>}` | `104:${NumberRange<1, 10>}` | `105:${NumberRange<1, 6>}` | `106:${NumberRange<1, 5>}` | `107:${NumberRange<1, 8>}` | `108:${NumberRange<1, 4>}` | `109:${NumberRange<1, 7>}` | `110:${NumberRange<1, 4>}` | `111:${NumberRange<1, 6>}` | `112:${NumberRange<1, 5>}` | `113:${NumberRange<1, 6>}` | `114:${NumberRange<1, 7>}`;
141
+ /**
142
+ * A `VerseKey` is a string literal in the form `${chapter}:${verse}` where:
143
+ * - `chapter` is a valid chapter id from `versesMapping`
144
+ * - `verse` is within the range 1..(verseCount for that chapter)
145
+ */
146
+ type VerseKey = {
147
+ [TChapter in keyof typeof versesMapping]: `${TChapter}:${NumberRange<1, Increment<(typeof versesMapping)[TChapter]>>}`;
148
+ }[keyof typeof versesMapping];
7
149
 
8
- declare type _ChapterId = NumberRange<1, 115>;
9
- declare type ChapterId = _ChapterId | NumberUnionToString<_ChapterId>;
150
+ type ChapterId = keyof typeof versesMapping | NumberUnionToString<keyof typeof versesMapping>;
10
151
 
11
- declare type _HizbNumber = NumberRange<1, 61>;
12
- declare type HizbNumber = _HizbNumber | NumberUnionToString<_HizbNumber>;
152
+ type _HizbNumber = NumberRange<1, 61>;
153
+ type HizbNumber = _HizbNumber | NumberUnionToString<_HizbNumber>;
13
154
 
14
- declare type _JuzNumber = NumberRange<1, 31>;
15
- declare type JuzNumber = _JuzNumber | NumberUnionToString<_JuzNumber>;
155
+ type _JuzNumber = NumberRange<1, 31>;
156
+ type JuzNumber = _JuzNumber | NumberUnionToString<_JuzNumber>;
16
157
 
17
- declare type _PageNumber = NumberRange<1, 605>;
18
- declare type PageNumber = _PageNumber | NumberUnionToString<_PageNumber>;
158
+ type _PageNumber = NumberRange<1, 605>;
159
+ type PageNumber = _PageNumber | NumberUnionToString<_PageNumber>;
19
160
 
20
- declare type _RubNumber = NumberRange<1, 241>;
21
- declare type RubNumber = _RubNumber | NumberUnionToString<_RubNumber>;
161
+ type _RubNumber = NumberRange<1, 241>;
162
+ type RubNumber = _RubNumber | NumberUnionToString<_RubNumber>;
22
163
 
23
164
  interface Translation {
24
165
  id?: number;
@@ -88,7 +229,7 @@ interface SearchResponse {
88
229
  /**
89
230
  * Segment structure is [wordFrom, wordTo, timeFrom, timeTo] time is in ms
90
231
  */
91
- declare type Segment = [number, number, number, number];
232
+ type Segment = [number, number, number, number];
92
233
 
93
234
  interface ChapterRecitation {
94
235
  id: number;
@@ -204,6 +345,7 @@ interface Verse {
204
345
  textImlaei?: string;
205
346
  textImlaeiSimple?: string;
206
347
  textIndopak?: string;
348
+ textIndopakNastaleeq?: string;
207
349
  sajdahNumber: null;
208
350
  imageUrl?: string;
209
351
  imageWidth?: number;
@@ -303,7 +445,68 @@ interface ChapterReciterResource {
303
445
  filesSize?: number;
304
446
  }
305
447
 
306
- declare type FetchFn = (url: string) => Promise<Record<string, unknown>>;
448
+ interface SearchResult {
449
+ verseKey: VerseKey;
450
+ verseId: number;
451
+ text: string;
452
+ highlighted?: string;
453
+ words: Word[];
454
+ translations: Translation[];
455
+ }
456
+
457
+ type ApiParams = Record<string, string | number | boolean | unknown[] | undefined | Record<string, boolean>>;
458
+ /**
459
+ * Base parameters that are common across most API endpoints
460
+ */
461
+ interface BaseApiParams extends ApiParams {
462
+ /** Language for the response */
463
+ language?: Language;
464
+ }
465
+ /**
466
+ * Pagination parameters
467
+ */
468
+ interface PaginationParams extends ApiParams {
469
+ /** Page number for pagination */
470
+ page?: number;
471
+ /** Number of items per page */
472
+ perPage?: number;
473
+ }
474
+ /**
475
+ * Search parameters
476
+ */
477
+ interface SearchParams extends BaseApiParams {
478
+ /** Number of results to return */
479
+ size?: number;
480
+ /** Page number for pagination */
481
+ page?: number;
482
+ }
483
+
484
+ /**
485
+ * Custom fetcher function type that matches the native fetch API
486
+ */
487
+ type CustomFetcher = typeof fetch;
488
+ interface QuranClientConfig {
489
+ /** Client ID for authentication */
490
+ clientId: string;
491
+ /** Client secret for authentication */
492
+ clientSecret: string;
493
+ /** Base URL for content APIs */
494
+ contentBaseUrl?: string;
495
+ /** Base URL for authentication */
496
+ authBaseUrl?: string;
497
+ /** Custom fetch implementation */
498
+ fetch?: CustomFetcher;
499
+ /** Default parameters for all API calls */
500
+ defaults?: Partial<BaseApiParams>;
501
+ }
502
+ interface CachedToken {
503
+ value: string;
504
+ expiresAt: number;
505
+ }
506
+ interface TokenResponse {
507
+ access_token: string;
508
+ expires_in: number;
509
+ }
307
510
 
308
511
  declare enum Language {
309
512
  ARABIC = "ar",
@@ -347,8 +550,6 @@ declare enum Language {
347
550
  CHECHEN = "ce",
348
551
  CZECH = "cs",
349
552
  DIVEHI = "dv",
350
- DHIVEHI = "dv",
351
- MALDIVIAN = "dv",
352
553
  FINNISH = "fi",
353
554
  GUJAARATI = "gu",
354
555
  HEBREW = "he",
@@ -362,7 +563,6 @@ declare enum Language {
362
563
  SWEDISH = "sv",
363
564
  TELUGU = "te",
364
565
  TATAR = "tt",
365
- UIGHUR = "ug",
366
566
  UYGHUR = "ug",
367
567
  UKRAINIAN = "uk",
368
568
  NORWEGIAN = "no",
@@ -373,7 +573,6 @@ declare enum Language {
373
573
  SINDHI = "sd",
374
574
  NORTHERN_SAMI = "se",
375
575
  SINHALA = "si",
376
- SINHALESE = "si",
377
576
  SOMALI = "so",
378
577
  ALBANIAN_SQ = "sq"
379
578
  }
@@ -382,186 +581,428 @@ declare enum QuranFont {
382
581
  MadaniV2 = "code_v2",
383
582
  Uthmani = "text_uthmani"
384
583
  }
385
- declare type VerseField = 'chapterId' | 'textUthmani' | 'textUthmaniSimple' | 'textImlaei' | 'textImlaeiSimple' | 'textIndopak' | 'textUthmaniTajweed' | 'imageUrl' | 'imageWidth' | 'codeV1' | 'codeV2' | 'v1Page' | 'v2Page';
386
- declare type WordField = 'v1Page' | 'v2Page' | 'textUthmani' | 'textImlaei' | 'textIndopak' | 'verseKey' | 'location' | 'codeV1' | 'codeV2';
387
- declare type TranslationField = 'resourceName' | 'verseId' | 'languageId' | 'languageName' | 'verseKey' | 'chapterId' | 'verseNumber' | 'juzNumber' | 'hizbNumber' | 'rubNumber' | 'pageNumber';
388
- declare type VerseRecitationField = 'id' | 'chapterId' | 'segments' | 'format';
389
-
390
- interface BaseApiOptions {
391
- language: Language;
392
- fetchFn?: FetchFn;
393
- }
394
-
395
- declare const quran: {
396
- v4: {
397
- chapters: {
398
- findAll: (options?: Partial<BaseApiOptions> | undefined) => Promise<Chapter[]>;
399
- findById: (id: ChapterId, options?: Partial<BaseApiOptions> | undefined) => Promise<Chapter>;
400
- findInfoById: (id: ChapterId, options?: Partial<BaseApiOptions> | undefined) => Promise<ChapterInfo>;
401
- };
402
- verses: {
403
- findByKey: (key: VerseKey, options?: Partial<BaseApiOptions & {
404
- reciter: string | number;
405
- words: boolean;
406
- translations: number[] | string[];
407
- tafsirs: number[] | string[];
408
- wordFields: Partial<Record<WordField, boolean>>;
409
- translationFields: Partial<Record<TranslationField, boolean>>;
410
- fields: Partial<Record<VerseField, boolean>>;
411
- page: number;
412
- perPage: number;
413
- }> | undefined) => Promise<Verse>;
414
- findByChapter: (id: ChapterId, options?: Partial<BaseApiOptions & {
415
- reciter: string | number;
416
- words: boolean;
417
- translations: number[] | string[];
418
- tafsirs: number[] | string[];
419
- wordFields: Partial<Record<WordField, boolean>>;
420
- translationFields: Partial<Record<TranslationField, boolean>>;
421
- fields: Partial<Record<VerseField, boolean>>;
422
- page: number;
423
- perPage: number;
424
- }> | undefined) => Promise<Verse[]>;
425
- findByPage: (page: PageNumber, options?: Partial<BaseApiOptions & {
426
- reciter: string | number;
427
- words: boolean;
428
- translations: number[] | string[];
429
- tafsirs: number[] | string[];
430
- wordFields: Partial<Record<WordField, boolean>>;
431
- translationFields: Partial<Record<TranslationField, boolean>>;
432
- fields: Partial<Record<VerseField, boolean>>;
433
- page: number;
434
- perPage: number;
435
- }> | undefined) => Promise<Verse[]>;
436
- findByJuz: (juz: JuzNumber, options?: Partial<BaseApiOptions & {
437
- reciter: string | number;
438
- words: boolean;
439
- translations: number[] | string[];
440
- tafsirs: number[] | string[];
441
- wordFields: Partial<Record<WordField, boolean>>;
442
- translationFields: Partial<Record<TranslationField, boolean>>;
443
- fields: Partial<Record<VerseField, boolean>>;
444
- page: number;
445
- perPage: number;
446
- }> | undefined) => Promise<Verse[]>;
447
- findByHizb: (hizb: HizbNumber, options?: Partial<BaseApiOptions & {
448
- reciter: string | number;
449
- words: boolean;
450
- translations: number[] | string[];
451
- tafsirs: number[] | string[];
452
- wordFields: Partial<Record<WordField, boolean>>;
453
- translationFields: Partial<Record<TranslationField, boolean>>;
454
- fields: Partial<Record<VerseField, boolean>>;
455
- page: number;
456
- perPage: number;
457
- }> | undefined) => Promise<Verse[]>;
458
- findByRub: (rub: RubNumber, options?: Partial<BaseApiOptions & {
459
- reciter: string | number;
460
- words: boolean;
461
- translations: number[] | string[];
462
- tafsirs: number[] | string[];
463
- wordFields: Partial<Record<WordField, boolean>>;
464
- translationFields: Partial<Record<TranslationField, boolean>>;
465
- fields: Partial<Record<VerseField, boolean>>;
466
- page: number;
467
- perPage: number;
468
- }> | undefined) => Promise<Verse[]>;
469
- findRandom: (options?: Partial<BaseApiOptions & {
470
- reciter: string | number;
471
- words: boolean;
472
- translations: number[] | string[];
473
- tafsirs: number[] | string[];
474
- wordFields: Partial<Record<WordField, boolean>>;
475
- translationFields: Partial<Record<TranslationField, boolean>>;
476
- fields: Partial<Record<VerseField, boolean>>;
477
- page: number;
478
- perPage: number;
479
- }> | undefined) => Promise<Verse>;
480
- };
481
- juzs: {
482
- findAll: (options?: Omit<BaseApiOptions, "language"> | undefined) => Promise<Juz[]>;
483
- };
484
- audio: {
485
- findAllChapterRecitations: (reciterId: string, options?: Partial<BaseApiOptions> | undefined) => Promise<ChapterRecitation[]>;
486
- findChapterRecitationById: (chapterId: ChapterId, reciterId: string, options?: Partial<BaseApiOptions> | undefined) => Promise<ChapterRecitation>;
487
- findVerseRecitationsByChapter: (chapterId: ChapterId, recitationId: string, options?: Partial<BaseApiOptions & {
488
- fields: Partial<Record<VerseRecitationField, boolean>>;
489
- }> | undefined) => Promise<{
490
- audioFiles: VerseRecitation[];
491
- pagination: Pagination;
492
- }>;
493
- findVerseRecitationsByJuz: (juz: JuzNumber, recitationId: string, options?: Partial<BaseApiOptions & {
494
- fields: Partial<Record<VerseRecitationField, boolean>>;
495
- }> | undefined) => Promise<{
496
- audioFiles: VerseRecitation[];
497
- pagination: Pagination;
498
- }>;
499
- findVerseRecitationsByPage: (page: PageNumber, recitationId: string, options?: Partial<BaseApiOptions & {
500
- fields: Partial<Record<VerseRecitationField, boolean>>;
501
- }> | undefined) => Promise<{
502
- audioFiles: VerseRecitation[];
503
- pagination: Pagination;
504
- }>;
505
- findVerseRecitationsByRub: (rub: RubNumber, recitationId: string, options?: Partial<BaseApiOptions & {
506
- fields: Partial<Record<VerseRecitationField, boolean>>;
507
- }> | undefined) => Promise<{
508
- audioFiles: VerseRecitation[];
509
- pagination: Pagination;
510
- }>;
511
- findVerseRecitationsByHizb: (hizb: HizbNumber, recitationId: string, options?: Partial<BaseApiOptions & {
512
- fields: Partial<Record<VerseRecitationField, boolean>>;
513
- }> | undefined) => Promise<{
514
- audioFiles: VerseRecitation[];
515
- pagination: Pagination;
516
- }>;
517
- findVerseRecitationsByKey: (key: VerseKey, recitationId: string, options?: Partial<BaseApiOptions & {
518
- fields: Partial<Record<VerseRecitationField, boolean>>;
519
- }> | undefined) => Promise<{
520
- audioFiles: VerseRecitation[];
521
- pagination: Pagination;
522
- }>;
523
- };
524
- resources: {
525
- findAllRecitations: (options?: Partial<BaseApiOptions> | undefined) => Promise<RecitationResource[]>;
526
- findAllTranslations: (options?: Partial<BaseApiOptions> | undefined) => Promise<TranslationResource[]>;
527
- findAllTafsirs: (options?: Partial<BaseApiOptions> | undefined) => Promise<TafsirResource[]>;
528
- findAllRecitationStyles: (options?: Omit<BaseApiOptions, "language"> | undefined) => Promise<RecitationStylesResource>;
529
- findAllLanguages: (options?: Partial<BaseApiOptions> | undefined) => Promise<LanguageResource[]>;
530
- findVerseMedia: (options?: Partial<BaseApiOptions> | undefined) => Promise<VerseMediaResource>;
531
- findAllChapterReciters: (options?: Partial<BaseApiOptions> | undefined) => Promise<ChapterReciterResource[]>;
532
- findAllChapterInfos: (options?: Partial<BaseApiOptions> | undefined) => Promise<ChapterInfoResource[]>;
533
- findRecitationInfo: (id: string, options?: Partial<BaseApiOptions> | undefined) => Promise<RecitationInfoResource>;
534
- findTranslationInfo: (id: string, options?: Partial<BaseApiOptions> | undefined) => Promise<TranslationInfoResource>;
535
- findTafsirInfo: (id: string, options?: Partial<BaseApiOptions> | undefined) => Promise<TafsirInfoResource>;
536
- };
537
- search: {
538
- search: (q: string, options?: Partial<BaseApiOptions & {
539
- size: number;
540
- page: number;
541
- }> | undefined) => Promise<{
542
- query: string;
543
- totalResults: number;
544
- currentPage: number;
545
- totalPages: number;
546
- results?: {
547
- verseKey: string;
548
- verse_id: number;
549
- text: string;
550
- highlighted: string;
551
- words: Word[];
552
- translations: Translation[];
553
- }[] | undefined;
554
- }>;
555
- };
556
- };
557
- utils: {
558
- isValidChapterId: (id: string | number) => id is ChapterId;
559
- isValidJuz: (juz: string | number) => juz is JuzNumber;
560
- isValidRub: (rub: string | number) => rub is RubNumber;
561
- isValidHizb: (hizb: string | number) => hizb is HizbNumber;
562
- isValidQuranPage: (page: string | number) => page is PageNumber;
563
- isValidVerseKey: (key: string) => key is VerseKey;
564
- };
584
+ type VerseField = "chapterId" | "textUthmani" | "textUthmaniSimple" | "textImlaei" | "textImlaeiSimple" | "textIndopak" | "textIndopakNastaleeq" | "textUthmaniTajweed" | "imageUrl" | "imageWidth" | "codeV1" | "codeV2" | "v1Page" | "v2Page";
585
+ type WordField = "v1Page" | "v2Page" | "textUthmani" | "textImlaei" | "textIndopak" | "verseKey" | "location" | "codeV1" | "codeV2";
586
+ type TranslationField = "resourceName" | "verseId" | "languageId" | "languageName" | "verseKey" | "chapterId" | "verseNumber" | "juzNumber" | "hizbNumber" | "rubNumber" | "pageNumber";
587
+ type VerseRecitationField = "id" | "chapterId" | "segments" | "format";
588
+
589
+ type Config = Required<Pick<QuranClientConfig, "contentBaseUrl" | "authBaseUrl">> & Omit<QuranClientConfig, "contentBaseUrl" | "authBaseUrl">;
590
+ /**
591
+ * Handles HTTP requests with authentication for the Quran API
592
+ */
593
+ declare class QuranFetcher {
594
+ private config;
595
+ private cachedToken;
596
+ constructor(config: Config);
597
+ /**
598
+ * Update the configuration
599
+ */
600
+ updateConfig(config: Config): void;
601
+ getFetch(): CustomFetcher;
602
+ private doFetch;
603
+ /**
604
+ * Get access token for API authentication
605
+ */
606
+ private getAccessToken;
607
+ /**
608
+ * Clear cached token (useful for testing or forcing re-authentication)
609
+ */
610
+ clearCachedToken(): void;
611
+ /**
612
+ * Make URL with base URL and query parameters
613
+ */
614
+ private makeUrl;
615
+ /**
616
+ * Make authenticated HTTP request
617
+ */
618
+ fetch<T extends object>(url: string, params?: ApiParams): Promise<T>;
619
+ }
620
+
621
+ type GetChapterRecitationOptions = BaseApiParams;
622
+ type GetVerseRecitationOptions = BaseApiParams & {
623
+ fields?: Partial<Record<VerseRecitationField, boolean>>;
624
+ };
625
+ /**
626
+ * Audio API methods
627
+ */
628
+ declare class QuranAudio {
629
+ private fetcher;
630
+ constructor(fetcher: QuranFetcher);
631
+ /**
632
+ * Get all chapter recitations for specific reciter
633
+ * @param {string} reciterId
634
+ * @param {GetChapterRecitationOptions} options
635
+ * @example
636
+ * client.audio.findAllChapterRecitations('2')
637
+ */
638
+ findAllChapterRecitations(reciterId: string, options?: GetChapterRecitationOptions): Promise<ChapterRecitation[]>;
639
+ /**
640
+ * Get a specific chapter recitation by reciter and chapter
641
+ * @param {string} reciterId
642
+ * @param {ChapterId} chapterId
643
+ * @param {GetChapterRecitationOptions} options
644
+ * @example
645
+ * client.audio.findChapterRecitationById('2', '1')
646
+ */
647
+ findChapterRecitationById(reciterId: string, chapterId: ChapterId, options?: GetChapterRecitationOptions): Promise<ChapterRecitation>;
648
+ /**
649
+ * Get verse recitations by chapter
650
+ * @param {ChapterId} chapterId
651
+ * @param {string} recitationId
652
+ * @param {GetVerseRecitationOptions} options
653
+ * @example
654
+ * client.audio.findVerseRecitationsByChapter('1', '2')
655
+ */
656
+ findVerseRecitationsByChapter(chapterId: ChapterId, recitationId: string, options?: GetVerseRecitationOptions): Promise<{
657
+ audioFiles: VerseRecitation[];
658
+ pagination: Pagination;
659
+ }>;
660
+ /**
661
+ * Get verse recitations by verse key
662
+ * @param {VerseKey} key
663
+ * @param {string} recitationId
664
+ * @param {GetVerseRecitationOptions} options
665
+ * @example
666
+ * client.audio.findVerseRecitationsByKey('1:1', '2')
667
+ */
668
+ findVerseRecitationsByKey(key: VerseKey, recitationId: string, options?: GetVerseRecitationOptions): Promise<{
669
+ audioFiles: VerseRecitation[];
670
+ pagination: Pagination;
671
+ }>;
672
+ }
673
+
674
+ type GetChapterOptions = BaseApiParams;
675
+ /**
676
+ * Chapters API methods
677
+ */
678
+ declare class QuranChapters {
679
+ private fetcher;
680
+ constructor(fetcher: QuranFetcher);
681
+ /**
682
+ * Get all chapters.
683
+ * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/list-chapters
684
+ * @param {GetChapterOptions} options
685
+ * @example
686
+ * client.chapters.findAll()
687
+ */
688
+ findAll(options?: GetChapterOptions): Promise<Chapter[]>;
689
+ /**
690
+ * Get chapter by id.
691
+ * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter
692
+ * @param {ChapterId} id chapter id, minimum 1, maximum 114
693
+ * @param {GetChapterOptions} options
694
+ * @example
695
+ * client.chapters.findById('1')
696
+ * client.chapters.findById('114')
697
+ */
698
+ findById(id: ChapterId, options?: GetChapterOptions): Promise<Chapter>;
699
+ /**
700
+ * Get chapter info by id.
701
+ * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter-info
702
+ * @param {ChapterId} id chapter id, minimum 1, maximum 114
703
+ * @param {GetChapterOptions} options
704
+ * @example
705
+ * client.chapters.findInfoById('1')
706
+ * client.chapters.findInfoById('114')
707
+ */
708
+ findInfoById(id: ChapterId, options?: GetChapterOptions): Promise<ChapterInfo>;
709
+ }
710
+
711
+ /**
712
+ * Juzs API methods
713
+ */
714
+ declare class QuranJuzs {
715
+ private fetcher;
716
+ constructor(fetcher: QuranFetcher);
717
+ /**
718
+ * Get All Juzs
719
+ * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/juzs
720
+ * @example
721
+ * client.juzs.findAll()
722
+ */
723
+ findAll(): Promise<Juz[]>;
724
+ }
725
+
726
+ type GetResourceOptions = BaseApiParams;
727
+ /**
728
+ * Resources API methods
729
+ */
730
+ declare class QuranResources {
731
+ private fetcher;
732
+ constructor(fetcher: QuranFetcher);
733
+ /**
734
+ * Get all recitations.
735
+ * @param {GetResourceOptions} options
736
+ * @example
737
+ * client.resources.findAllRecitations()
738
+ */
739
+ findAllRecitations(options?: GetResourceOptions): Promise<RecitationResource[]>;
740
+ /**
741
+ * Get all translations.
742
+ * @param {GetResourceOptions} options
743
+ * @example
744
+ * client.resources.findAllTranslations()
745
+ */
746
+ findAllTranslations(options?: GetResourceOptions): Promise<TranslationResource[]>;
747
+ /**
748
+ * Get all tafsirs.
749
+ * @param {GetResourceOptions} options
750
+ * @example
751
+ * client.resources.findAllTafsirs()
752
+ */
753
+ findAllTafsirs(options?: GetResourceOptions): Promise<TafsirResource[]>;
754
+ /**
755
+ * Get all languages.
756
+ * @param {GetResourceOptions} options
757
+ * @example
758
+ * client.resources.findAllLanguages()
759
+ */
760
+ findAllLanguages(options?: GetResourceOptions): Promise<LanguageResource[]>;
761
+ /**
762
+ * Get recitation info by id.
763
+ * @param {string} id recitation id
764
+ * @param {GetResourceOptions} options
765
+ * @example
766
+ * client.resources.findRecitationInfo('1')
767
+ */
768
+ findRecitationInfo(id: string, options?: GetResourceOptions): Promise<RecitationInfoResource>;
769
+ /**
770
+ * Get translation info by id.
771
+ * @param {string} id translation id
772
+ * @param {GetResourceOptions} options
773
+ * @example
774
+ * client.resources.findTranslationInfo('131')
775
+ */
776
+ findTranslationInfo(id: string, options?: GetResourceOptions): Promise<TranslationInfoResource>;
777
+ /**
778
+ * Get tafsir info by id.
779
+ * @param {string} id tafsir id
780
+ * @param {GetResourceOptions} options
781
+ * @example
782
+ * client.resources.findTafsirInfo('171')
783
+ */
784
+ findTafsirInfo(id: string, options?: GetResourceOptions): Promise<TafsirInfoResource>;
785
+ /**
786
+ * Get all chapter infos.
787
+ * @param {GetResourceOptions} options
788
+ * @example
789
+ * client.resources.findAllChapterInfos()
790
+ */
791
+ findAllChapterInfos(options?: GetResourceOptions): Promise<ChapterInfoResource[]>;
792
+ /**
793
+ * Get all chapter reciters.
794
+ * @param {GetResourceOptions} options
795
+ * @example
796
+ * client.resources.findAllChapterReciters()
797
+ */
798
+ findAllChapterReciters(options?: GetResourceOptions): Promise<ChapterReciterResource[]>;
799
+ /**
800
+ * Get all recitation styles.
801
+ * @param {GetResourceOptions} options
802
+ * @example
803
+ * client.resources.findAllRecitationStyles()
804
+ */
805
+ findAllRecitationStyles(options?: GetResourceOptions): Promise<RecitationStylesResource>;
806
+ /**
807
+ * Get verse media.
808
+ * @param {GetResourceOptions} options
809
+ * @example
810
+ * client.resources.findVerseMedia()
811
+ */
812
+ findVerseMedia(options?: GetResourceOptions): Promise<VerseMediaResource>;
813
+ }
814
+
815
+ type SearchOptions = SearchParams;
816
+ /**
817
+ * Search API methods
818
+ */
819
+ declare class QuranSearch {
820
+ private fetcher;
821
+ constructor(fetcher: QuranFetcher);
822
+ /**
823
+ * Search
824
+ * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/search
825
+ * @param {string} q search query
826
+ * @param {SearchOptions} options
827
+ * @example
828
+ * client.search.search('نور')
829
+ * client.search.search('نور', { language: Language.ENGLISH })
830
+ * client.search.search('نور', { language: Language.ENGLISH, size: 10 })
831
+ * client.search.search('نور', { language: Language.ENGLISH, page: 2 })
832
+ */
833
+ search(q: string, options?: SearchOptions): Promise<SearchResponse["search"]>;
834
+ }
835
+
836
+ type GetVerseOptions = BaseApiParams & PaginationParams & {
837
+ reciter?: string | number;
838
+ words?: boolean;
839
+ translations?: string[] | number[];
840
+ tafsirs?: string[] | number[];
841
+ wordFields?: Partial<Record<WordField, boolean>>;
842
+ translationFields?: Partial<Record<TranslationField, boolean>>;
843
+ fields?: Partial<Record<VerseField, boolean>>;
565
844
  };
845
+ /**
846
+ * Verses API methods
847
+ */
848
+ declare class QuranVerses {
849
+ private fetcher;
850
+ constructor(fetcher: QuranFetcher);
851
+ /**
852
+ * Get a specific verse by its key.
853
+ * @param {VerseKey} key verse key in format "chapter:verse" (e.g., "1:1")
854
+ * @param {GetVerseOptions} options
855
+ * @example
856
+ * client.verses.findByKey('1:1')
857
+ * client.verses.findByKey('2:255')
858
+ */
859
+ findByKey(key: VerseKey, options?: GetVerseOptions): Promise<Verse>;
860
+ /**
861
+ * Get verses by chapter.
862
+ * @param {ChapterId} id chapter id, minimum 1, maximum 114
863
+ * @param {GetVerseOptions} options
864
+ * @example
865
+ * client.verses.findByChapter('1')
866
+ */
867
+ findByChapter(id: ChapterId, options?: GetVerseOptions): Promise<Verse[]>;
868
+ /**
869
+ * Get verses by page number.
870
+ * @param {PageNumber} page page number
871
+ * @param {GetVerseOptions} options
872
+ * @example
873
+ * client.verses.findByPage('1')
874
+ */
875
+ findByPage(page: PageNumber, options?: GetVerseOptions): Promise<Verse[]>;
876
+ /**
877
+ * Get verses by juz number.
878
+ * @param {JuzNumber} juz juz number
879
+ * @param {GetVerseOptions} options
880
+ * @example
881
+ * client.verses.findByJuz('1')
882
+ */
883
+ findByJuz(juz: JuzNumber, options?: GetVerseOptions): Promise<Verse[]>;
884
+ /**
885
+ * Get verses by hizb number.
886
+ * @param {HizbNumber} hizb hizb number
887
+ * @param {GetVerseOptions} options
888
+ * @example
889
+ * client.verses.findByHizb('1')
890
+ */
891
+ findByHizb(hizb: HizbNumber, options?: GetVerseOptions): Promise<Verse[]>;
892
+ /**
893
+ * Get verses by rub number.
894
+ * @param {RubNumber} rub rub number
895
+ * @param {GetVerseOptions} options
896
+ * @example
897
+ * client.verses.findByRub('1')
898
+ */
899
+ findByRub(rub: RubNumber, options?: GetVerseOptions): Promise<Verse[]>;
900
+ /**
901
+ * Get a random verse.
902
+ * @param {GetVerseOptions} options
903
+ * @example
904
+ * client.verses.findRandom()
905
+ */
906
+ findRandom(options?: GetVerseOptions): Promise<Verse>;
907
+ }
908
+
909
+ /**
910
+ * Main Quran API client
911
+ */
912
+ declare class QuranClient {
913
+ private config;
914
+ private fetcher;
915
+ readonly chapters: QuranChapters;
916
+ readonly verses: QuranVerses;
917
+ readonly juzs: QuranJuzs;
918
+ readonly audio: QuranAudio;
919
+ readonly resources: QuranResources;
920
+ readonly search: QuranSearch;
921
+ constructor(config: QuranClientConfig);
922
+ /**
923
+ * Get the current configuration
924
+ */
925
+ getConfig(): QuranClientConfig;
926
+ /**
927
+ * Update the configuration
928
+ */
929
+ updateConfig(newConfig: Partial<QuranClientConfig>): void;
930
+ /**
931
+ * Clear cached authentication token
932
+ */
933
+ clearCachedToken(): void;
934
+ }
935
+
936
+ /**
937
+ * Validates chapter id
938
+ * @param id chapter id
939
+ * @example
940
+ * isValidChapterId('1') // true
941
+ * isValidChapterId('114') // true
942
+ * isValidChapterId('0') // false
943
+ * isValidChapterId('-1') // false
944
+ * isValidChapterId('200') // false
945
+ */
946
+ declare const isValidChapterId: (id: string | number) => id is ChapterId;
947
+
948
+ /**
949
+ * Validates juz number
950
+ * @param juz juz number
951
+ * @example
952
+ * isValidJuz('1') // true
953
+ * isValidJuz('30') // true
954
+ * isValidJuz('0') // false
955
+ * isValidJuz('-1') // false
956
+ * isValidJuz('200') // false
957
+ */
958
+ declare const isValidJuz: (juz: string | number) => juz is JuzNumber;
959
+
960
+ /**
961
+ * Validates rub number
962
+ * @param rub rub number
963
+ * @example
964
+ * isValidRub('1') // true
965
+ * isValidRub('240') // true
966
+ * isValidRub('0') // false
967
+ * isValidRub('-1') // false
968
+ * isValidRub('300') // false
969
+ */
970
+ declare const isValidRub: (rub: string | number) => rub is RubNumber;
971
+
972
+ /**
973
+ * Validates hizb number
974
+ * @param hizb hizb number
975
+ * @example
976
+ * isValidHizb('1') // true
977
+ * isValidHizb('60') // true
978
+ * isValidHizb('0') // false
979
+ * isValidHizb('-1') // false
980
+ * isValidHizb('200') // false
981
+ */
982
+ declare const isValidHizb: (hizb: string | number) => hizb is HizbNumber;
983
+
984
+ /**
985
+ * Validates mushaf page number
986
+ * @param page mushaf page number
987
+ * @example
988
+ * isValidQuranPage('1') // true
989
+ * isValidQuranPage('604') // true
990
+ * isValidQuranPage('0') // false
991
+ * isValidQuranPage('-1') // false
992
+ * isValidQuranPage('1000') // false
993
+ */
994
+ declare const isValidQuranPage: (page: string | number) => page is PageNumber;
995
+
996
+ /**
997
+ * Validates verse key
998
+ * @param key colon separated verse key (chapter:verse)
999
+ * @example
1000
+ * isValidVerseKey('1:1') // true
1001
+ * isValidVerseKey('30:1') // true
1002
+ * isValidVerseKey('0') // false
1003
+ * isValidVerseKey('1:-') // false
1004
+ * isValidVerseKey('1_1') // false
1005
+ */
1006
+ declare const isValidVerseKey: (key: string) => key is VerseKey;
566
1007
 
567
- export { AudioResponse, Chapter, ChapterId, ChapterInfo, ChapterInfoResource, ChapterRecitation, ChapterReciterResource, CharType, FetchFn, Footnote, HizbNumber, Juz, JuzNumber, Language, LanguageResource, PageNumber, Pagination, QuranFont, RecitationInfoResource, RecitationResource, RecitationStylesResource, Reciter, RubNumber, SearchResponse, Segment, Tafsir, TafsirInfo, TafsirInfoResource, TafsirResource, TranslatedName, Translation, TranslationField, TranslationInfoResource, TranslationResource, Transliteration, Verse, VerseField, VerseKey, VerseMediaResource, VerseRecitation, VerseRecitationField, Word, WordField, quran };
1008
+ export { type ApiParams, type AudioResponse, type BaseApiParams, type CachedToken, type Chapter, type ChapterId, type ChapterInfo, type ChapterInfoResource, type ChapterRecitation, type ChapterReciterResource, CharType, type CustomFetcher, type Footnote, type HizbNumber, type Juz, type JuzNumber, Language, type LanguageResource, type PageNumber, type Pagination, type PaginationParams, QuranClient, type QuranClientConfig, QuranFont, type RecitationInfoResource, type RecitationResource, type RecitationStylesResource, type Reciter, type RubNumber, type SearchParams, type SearchResponse, type SearchResult, type Segment, type Tafsir, type TafsirInfo, type TafsirInfoResource, type TafsirResource, type TokenResponse, type TranslatedName, type Translation, type TranslationField, type TranslationInfoResource, type TranslationResource, type Transliteration, type Verse, type VerseField, type VerseKey, type VerseMediaResource, type VerseRecitation, type VerseRecitationField, type Word, type WordField, isValidChapterId, isValidHizb, isValidJuz, isValidQuranPage, isValidRub, isValidVerseKey };