Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions packages/api/mocks/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,27 @@ export const handlers = [
},
),

http.get(
"https://apis.quran.foundation/content/api/v4/verses/by_range",
({ request }) => {
return HttpResponse.json({
verses: [
{
id: 1,
verse_number: 1,
page_number: 1,
verse_key: "1:1",
juz_number: 1,
hizb_number: 1,
rub_number: 1,
sajdah_type: null,
sajdah_number: null,
},
],
});
},
),

http.get(
"https://apis.quran.foundation/content/api/v4/chapters",
({ request }) => {
Expand Down
32 changes: 32 additions & 0 deletions packages/api/src/sdk/verses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,38 @@ export class QuranVerses {
return verse;
}

/**
* Get verses by range.
* @param {VerseKey} from start verse key (e.g., "1:1")
* @param {VerseKey} to end verse key (e.g., "1:7")
* @param {GetVerseOptions} options
* @example
* client.verses.findByRange('1:1', '1:7')
*/
async findByRange(
from: VerseKey,
to: VerseKey,
options?: GetVerseOptions,
): Promise<Verse[]> {
// We could validate keys here, but the API will also valid it.
// simpler to just pass through for now, or use isValidVerseKey if desired.
if (!isValidVerseKey(from) || !isValidVerseKey(to)) {
throw new Error("Invalid verse key");
}

const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(
"/content/api/v4/verses/by_range",
{
words: false, // verses-specific default
...options,
from,
to,
},
);

return verses;
}

/**
* Get verses by chapter.
* @param {ChapterId} id chapter id, minimum 1, maximum 114
Expand Down
7 changes: 7 additions & 0 deletions packages/api/src/types/api/Tafsir.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,11 @@ export interface Tafsir {
text?: string;
resourceName?: string;
languageName?: string;
slug?: string;
languageId?: number;
groupVerseKeyFrom?: string;
groupVerseKeyTo?: string;
groupTafsirId?: number;
startVerseId?: number;
endVerseId?: number;
}
25 changes: 25 additions & 0 deletions packages/api/test/verses.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,31 @@ describe("Verses API", () => {
});
});

describe("findByRange()", () => {
it("should return verses for valid range", async () => {
const response = await testClient.verses.findByRange(
VALID_VERSE_KEY,
VALID_VERSE_KEY,
);
expect(response).toBeInstanceOf(Array);
expect(response).toBeDefined();
});

it("should throw error when 'from' key is invalid", async () => {
await expect(
// @ts-expect-error - testing invalid verse key
testClient.verses.findByRange(INVALID_VERSE_KEY, VALID_VERSE_KEY),
).rejects.toThrowError();
});

it("should throw error when 'to' key is invalid", async () => {
await expect(
// @ts-expect-error - testing invalid verse key
testClient.verses.findByRange(VALID_VERSE_KEY, INVALID_VERSE_KEY),
).rejects.toThrowError();
});
});

describe("findByPage()", () => {
it("should return an array of verses for valid page", async () => {
const response = await testClient.verses.findByPage(VALID_PAGE_NUMBER);
Expand Down