File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -45,6 +45,27 @@ export const handlers = [
4545 } ,
4646 ) ,
4747
48+ http . get (
49+ "https://apis.quran.foundation/content/api/v4/verses/by_range" ,
50+ ( { request } ) => {
51+ return HttpResponse . json ( {
52+ verses : [
53+ {
54+ id : 1 ,
55+ verse_number : 1 ,
56+ page_number : 1 ,
57+ verse_key : "1:1" ,
58+ juz_number : 1 ,
59+ hizb_number : 1 ,
60+ rub_number : 1 ,
61+ sajdah_type : null ,
62+ sajdah_number : null ,
63+ } ,
64+ ] ,
65+ } ) ;
66+ } ,
67+ ) ,
68+
4869 http . get (
4970 "https://apis.quran.foundation/content/api/v4/chapters" ,
5071 ( { request } ) => {
Original file line number Diff line number Diff line change @@ -62,6 +62,38 @@ export class QuranVerses {
6262 return verse ;
6363 }
6464
65+ /**
66+ * Get verses by range.
67+ * @param {VerseKey } from start verse key (e.g., "1:1")
68+ * @param {VerseKey } to end verse key (e.g., "1:7")
69+ * @param {GetVerseOptions } options
70+ * @example
71+ * client.verses.findByRange('1:1', '1:7')
72+ */
73+ async findByRange (
74+ from : VerseKey ,
75+ to : VerseKey ,
76+ options ?: GetVerseOptions ,
77+ ) : Promise < Verse [ ] > {
78+ // We could validate keys here, but the API will also valid it.
79+ // simpler to just pass through for now, or use isValidVerseKey if desired.
80+ if ( ! isValidVerseKey ( from ) || ! isValidVerseKey ( to ) ) {
81+ throw new Error ( "Invalid verse key" ) ;
82+ }
83+
84+ const { verses } = await this . fetcher . fetch < { verses : Verse [ ] } > (
85+ "/content/api/v4/verses/by_range" ,
86+ {
87+ words : false , // verses-specific default
88+ ...options ,
89+ from,
90+ to,
91+ } ,
92+ ) ;
93+
94+ return verses ;
95+ }
96+
6597 /**
6698 * Get verses by chapter.
6799 * @param {ChapterId } id chapter id, minimum 1, maximum 114
Original file line number Diff line number Diff line change @@ -4,4 +4,11 @@ export interface Tafsir {
44 text ?: string ;
55 resourceName ?: string ;
66 languageName ?: string ;
7+ slug ?: string ;
8+ languageId ?: number ;
9+ groupVerseKeyFrom ?: string ;
10+ groupVerseKeyTo ?: string ;
11+ groupTafsirId ?: number ;
12+ startVerseId ?: number ;
13+ endVerseId ?: number ;
714}
Original file line number Diff line number Diff line change @@ -60,6 +60,31 @@ describe("Verses API", () => {
6060 } ) ;
6161 } ) ;
6262
63+ describe ( "findByRange()" , ( ) => {
64+ it ( "should return verses for valid range" , async ( ) => {
65+ const response = await testClient . verses . findByRange (
66+ VALID_VERSE_KEY ,
67+ VALID_VERSE_KEY ,
68+ ) ;
69+ expect ( response ) . toBeInstanceOf ( Array ) ;
70+ expect ( response ) . toBeDefined ( ) ;
71+ } ) ;
72+
73+ it ( "should throw error when 'from' key is invalid" , async ( ) => {
74+ await expect (
75+ // @ts -expect-error - testing invalid verse key
76+ testClient . verses . findByRange ( INVALID_VERSE_KEY , VALID_VERSE_KEY ) ,
77+ ) . rejects . toThrowError ( ) ;
78+ } ) ;
79+
80+ it ( "should throw error when 'to' key is invalid" , async ( ) => {
81+ await expect (
82+ // @ts -expect-error - testing invalid verse key
83+ testClient . verses . findByRange ( VALID_VERSE_KEY , INVALID_VERSE_KEY ) ,
84+ ) . rejects . toThrowError ( ) ;
85+ } ) ;
86+ } ) ;
87+
6388 describe ( "findByPage()" , ( ) => {
6489 it ( "should return an array of verses for valid page" , async ( ) => {
6590 const response = await testClient . verses . findByPage ( VALID_PAGE_NUMBER ) ;
You can’t perform that action at this time.
0 commit comments