@quranjs/api 3.8.0 → 3.9.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/generated/specs/operation-catalog.json","../src/generated/contracts.ts","../src/lib/http-utils.ts","../src/lib/runtime-utils.ts","../src/lib/url.ts","../src/runtime/analytics.ts","../src/runtime/quran-reflect-posts.ts","../src/utils/is-valid-chapter-id.ts","../src/utils/is-valid-juz.ts","../src/utils/is-valid-rub.ts","../src/utils/is-valid-hizb.ts","../src/utils/is-valid-quran-page.ts","../src/utils/verses-mapping.ts","../src/utils/is-valid-verse-key.ts","../src/sdk/answers.ts","../src/sdk/audio.ts","../src/sdk/chapters.ts","../src/lib/retry.ts","../src/lib/service-config.ts","../src/sdk/fetcher.ts","../src/sdk/hadith-references.ts","../src/sdk/juzs.ts","../src/sdk/resources.ts","../src/sdk/search.ts","../src/sdk/verses.ts","../src/runtime/create-client.ts","../src/server.ts"],"names":["operation_catalog_default","operationCatalog","resolveCatalogOperation","section","operationName","operation","encodeBasicAuth","username","password","raw","prepareBody","request","headers","toUserSession","token","currentSession","expiresIn","accessToken","idToken","refreshToken","tokenType","scope","expiresAt","HTTP_METHOD_TO_MUTATION_NAME","toCamelCase","value","parts","part","index","lower","toPascalCase","camel","isPathParam","segment","getResourceSegments","path","segments","pickGeneratedMethodName","resourceSegments","lastSegment","literalSegments","lastLiteral","groupLiteral","createRawClient","fetcher","rawOperations","resolvedOperation","createGeneratedGroups","groups","literals","groupName","suggestedName","currentGroup","methodName","decamelize","humps","ensureLeadingSlash","removeTrailingSlash","replacePathParams","params","_match","rawKey","normalizePathTemplate","fieldsKey","fieldsKeySet","key","preservedKeys","paramsToString","options","paramsString","rawValue","fields","fieldKey","optionalField","toAnalyticsEventBody","event","createAnalyticsFacade","isObject","isCreatePayload","createQuranReflectPostsFacade","generatedPosts","payloadOrRequest","idOrRequest","query","payload","isValidChapterId","id","parsedId","isValidJuz","juz","parsedJuz","isValidRub","rub","parsedRub","isValidHizb","hizb","parsedHizb","isValidQuranPage","page","parsedPage","versesMapping","isValidVerseKey","chapterId","verseId","parsedVerse","verseCount","normalizeAnswerCountWithinRangeResponse","response","verseKey","count","type","QuranAnswers","questionId","from","to","AUDIO_BASE_URL","normalizeVerseRecitations","audioFiles","file","absoluteUrl","QuranAudio","reciterId","audioFile","recitationId","data","QuranChapters","chapters","chapter","chapterInfo","retry","fn","lastError","i","error","resolve","API_BASE_URL","DEFAULT_BASE_URLS","DIRECT_PATH_PREFIX","GATEWAY_PATH_PREFIX","LEGACY_PREFIXES","camelizeKeys","APP_SERVICE_SCOPES","QURAN_REFLECT_POSTS_PATH_PREFIX","QURAN_REFLECT_COMMENT_PATH_SUFFIXES","GATEWAY_SERVICES","USER_SESSION_EXPIRED_MESSAGE","REFRESH_TOKEN_REJECTION_ERROR","USER_SESSION_REFRESH_WINDOW_MS","readResponseBody","isRefreshTokenRejection","responseBody","formatRefreshFailureMessage","body","details","QuranFetcher","mode","config","doFetch","storedSession","session","service","crossServiceGatewayPath","baseUrl","usesGateway","servicePath","effectiveAuth","url","userSession","refreshedSession","json","route","auth","normalizedPath","resourceUrl","refreshPromise","clientSecret","tokenUrl","cacheKey","cachedToken","cached","pathname","suffix","services","directBaseUrl","prefix","pathService","gatewayService","QuranHadithReferences","QuranJuzs","juzs","QuranResources","recitations","translations","tafsirs","languages","recitationInfo","translationInfo","tafsirInfo","chapterInfos","reciters","recitationStyles","verseMedia","resourceGroup","QuranSearch","QuranVerses","verse","verses","LEGACY_BOOKMARK_GET_MESSAGE","createUserServiceRequest","method","createAuthFacade","generatedGroups","collectionId","bookmarkId","noteId","createQuranReflectFacade","createOAuth2Facade","exchangeToken","requestRefreshToken","createContentFacade","answers","audio","hadithReferences","resources","createRuntimeClient","searchClient","contentV4","analyticsV1","authV1","quranReflectV1","oauth2V1","searchQuery","search","createServerClient"],"mappings":"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","file":"server.min.js","sourcesContent":["{\n \"analytics\": {\n \"v1\": {\n \"operations\": {\n \"submitAnalyticsEvents\": {\n \"auth\": \"app\",\n \"method\": \"post\",\n \"path\": \"/v1/events:batch\"\n }\n },\n \"service\": \"analytics\",\n \"version\": \"v1\"\n }\n },\n \"auth\": {\n \"v1\": {\n \"operations\": {\n \"getV1Collections\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/collections\"\n },\n \"postV1Collections\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/collections\"\n },\n \"postV1CollectionsByCollectionIdBookmarks\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/collections/{collectionId}/bookmarks\"\n },\n \"deleteV1CollectionsByCollectionIdBookmarks\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/collections/{collectionId}/bookmarks\"\n },\n \"getV1CollectionsByCollectionId\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/collections/{collectionId}\"\n },\n \"postV1CollectionsByCollectionId\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/collections/{collectionId}\"\n },\n \"deleteV1CollectionsByCollectionId\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/collections/{collectionId}\"\n },\n \"deleteV1CollectionsByCollectionIdBookmarksByBookmarkId\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/collections/{collectionId}/bookmarks/{bookmarkId}\"\n },\n \"getV1CollectionsAll\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/collections/all\"\n },\n \"getV1Bookmarks\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/bookmarks\"\n },\n \"postV1Bookmarks\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/bookmarks\"\n },\n \"deleteV1BookmarksByBookmarkId\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/bookmarks/{bookmarkId}\"\n },\n \"getV1BookmarksAyahsRange\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/bookmarks/ayahs-range\"\n },\n \"getV1BookmarksBookmark\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/bookmarks/bookmark\"\n },\n \"getV1BookmarksCollections\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/bookmarks/collections\"\n },\n \"getV1Preferences\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/preferences\"\n },\n \"postV1Preferences\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/preferences\"\n },\n \"postV1PreferencesBulk\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/preferences/bulk\"\n },\n \"getV1ReadingSessions\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/reading-sessions\"\n },\n \"postV1ReadingSessions\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/reading-sessions\"\n },\n \"getV1GoalsGetTodaysPlan\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/goals/get-todays-plan\"\n },\n \"putV1GoalsById\": {\n \"auth\": \"user\",\n \"method\": \"put\",\n \"path\": \"/v1/goals/{id}\"\n },\n \"deleteV1GoalsById\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/goals/{id}\"\n },\n \"postV1Goals\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/goals\"\n },\n \"getV1GoalsEstimate\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/goals/estimate\"\n },\n \"getV1Streaks\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/streaks\"\n },\n \"getV1StreaksCurrentStreakDays\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/streaks/current-streak-days\"\n },\n \"getV1ActivityDays\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/activity-days\"\n },\n \"postV1ActivityDays\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/activity-days\"\n },\n \"getV1ActivityDaysEstimateReadingTime\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/activity-days/estimate-reading-time\"\n },\n \"getV1Notes\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes\"\n },\n \"postV1Notes\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/notes\"\n },\n \"getV1NotesByVerseByVerseKey\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/by-verse/{verseKey}\"\n },\n \"getV1NotesByAttachedEntity\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/by-attached-entity\"\n },\n \"getV1NotesCountWithinRange\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/count-within-range\"\n },\n \"getV1NotesByRange\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/by-range\"\n },\n \"getV1NotesByNoteId\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/{noteId}\"\n },\n \"patchV1NotesByNoteId\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/notes/{noteId}\"\n },\n \"deleteV1NotesByNoteId\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/notes/{noteId}\"\n },\n \"postV1NotesByNoteIdPublish\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/notes/{noteId}/publish\"\n }\n },\n \"service\": \"auth\",\n \"version\": \"v1\"\n }\n },\n \"content\": {\n \"v4\": {\n \"operations\": {\n \"audioReciterTimestamp\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/audio/reciters/{reciter_id}/timestamp\"\n },\n \"audioReciterLookup\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/audio/reciters/{reciter_id}/lookup\"\n },\n \"listChapters\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapters\"\n },\n \"getChapter\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapters/{id}\"\n },\n \"getChapterInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapters/{id}/info\"\n },\n \"hadithReferencesByAyah\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hadith_references/by_ayah/{ayah_key}\"\n },\n \"hadithsByAyah\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hadith_references/by_ayah/{ayah_key}/hadiths\"\n },\n \"hadithCountWithinRange\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hadith_references/count_within_range\"\n },\n \"listPages\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/pages\"\n },\n \"getPagesLookup\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/pages/lookup\"\n },\n \"getPagesPageNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/pages/{page_number}\"\n },\n \"versesByChapterNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_chapter/{chapter_number}\"\n },\n \"versesByPageNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_page/{page_number}\"\n },\n \"versesByJuzNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_juz/{juz_number}\"\n },\n \"versesByHizbNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_hizb/{hizb_number}\"\n },\n \"versesByRubElHizbNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_rub/{rub_el_hizb_number}\"\n },\n \"versesByManzilNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_manzil/{manzil_number}\"\n },\n \"versesByRukuNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_ruku/{ruku_number}\"\n },\n \"versesByRange\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_range\"\n },\n \"versesByVerseKey\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_key/{verse_key}\"\n },\n \"randomVerse\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/random\"\n },\n \"listJuzs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/juzs\"\n },\n \"quranVersesByScript\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/{script}\"\n },\n \"quranVersesIndopak\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/indopak\"\n },\n \"quranVersesIndopakNastaleeq\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/indopak_nastaleeq\"\n },\n \"quranVersesUthmaniTajweed\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/uthmani_tajweed\"\n },\n \"quranVersesUthmani\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/uthmani\"\n },\n \"quranVersesUthmaniSimple\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/uthmani_simple\"\n },\n \"quranVersesImlaei\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/imlaei\"\n },\n \"recitations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/recitations\"\n },\n \"recitationAudioFiles\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/recitations/{recitation_id}\"\n },\n \"translation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/translations/{translation_id}\"\n },\n \"chapterReciters\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/chapter_reciters\"\n },\n \"tafsir\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/tafsirs/{tafsir_id}\"\n },\n \"quranVersesCodeV1\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/code_v1\"\n },\n \"quranVersesCodeV2\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/code_v2\"\n },\n \"listSurahRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_chapter/{chapter_number}\"\n },\n \"listJuzRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_juz/{juz_number}\"\n },\n \"listPageRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_page/{page_number}\"\n },\n \"listRubElHizbRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_rub/{rub_el_hizb_number}\"\n },\n \"listHizbRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_hizb/{hizb_number}\"\n },\n \"listAyahRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_ayah/{ayah_key}\"\n },\n \"recitationInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/recitations/{recitation_id}/info\"\n },\n \"translationInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/translations/{translation_id}/info\"\n },\n \"translations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/translations\"\n },\n \"tafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/tafsirs\"\n },\n \"tafsirInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/tafsirs/{tafsir_id}/info\"\n },\n \"recitationStyles\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/recitation_styles\"\n },\n \"languages\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/languages\"\n },\n \"chapterInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/chapter_infos\"\n },\n \"verseMedia\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/verse_media\"\n },\n \"listManzilRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_manzil/{manzil_number}\"\n },\n \"listRukuRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_ruku/{ruku_number}\"\n },\n \"listSurahTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_chapter/{chapter_number}\"\n },\n \"listPageTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_page/{page_number}\"\n },\n \"listJuzTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_juz/{juz_number}\"\n },\n \"listRubElHizbTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_rub_el_hizb/{rub_el_hizb_number}\"\n },\n \"listHizbTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_hizb/{hizb_number}\"\n },\n \"listManzilTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_manzil/{manzil_number}\"\n },\n \"listRukuTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_ruku/{ruku_number}\"\n },\n \"listAyahTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_ayah/{ayah_key}\"\n },\n \"listSurahTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_chapter/{chapter_number}\"\n },\n \"listPageTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_page/{page_number}\"\n },\n \"listJuzTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_juz/{juz_number}\"\n },\n \"listRubElHizbTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_rub_el_hizb/{rub_el_hizb_number}\"\n },\n \"listHizbTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_hizb/{hizb_number}\"\n },\n \"listManzilTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_manzil/{manzil_number}\"\n },\n \"listRukuTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_ruku/{ruku_number}\"\n },\n \"listAyahTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_ayah/{ayah_key}\"\n },\n \"getJuz\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/juzs/{id}\"\n },\n \"listHizbs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hizbs\"\n },\n \"getHizb\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hizbs/{id}\"\n },\n \"listRubElHizbs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/rub_el_hizbs\"\n },\n \"getRubElHizb\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/rub_el_hizbs/{id}\"\n },\n \"listRukus\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/rukus\"\n },\n \"getRuku\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/rukus/{id}\"\n },\n \"listManzils\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/manzils\"\n },\n \"getManzil\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/manzils/{id}\"\n },\n \"getFootNote\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/foot_notes/{id}\"\n },\n \"postsControllerFeed\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/feed\"\n },\n \"postsControllerFindOne\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/{id}\"\n },\n \"postsControllerGetUserPost\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/user-posts/{id}\"\n },\n \"postsControllerGetComments\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/{id}/comments\"\n },\n \"postsControllerGetAllComment\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/{id}/all-comments\"\n },\n \"chapterReciterAudioFiles\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapter_recitations/{reciter_id}\"\n },\n \"chapterReciterAudioFile\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapter_recitations/{reciter_id}/{chapter_number}\"\n },\n \"versesByRubElHizbNumberRubElHizb\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_rub_el_hizb/{rub_el_hizb_number}\"\n },\n \"listRubElHizbTranslationsRub\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_rub/{rub_el_hizb_number}\"\n },\n \"listRubElHizbTafsirsRub\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_rub/{rub_el_hizb_number}\"\n },\n \"listRubElHizbRecitationRubElHizb\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_rub_el_hizb/{rub_el_hizb_number}\"\n },\n \"listAyahAnswers\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/answers/by_ayah/{ayah_key}\"\n },\n \"getAnswerById\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/answers/{question_id}\"\n },\n \"countAnswersWithinRange\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/answers/count_within_range\"\n },\n \"resourcesSync\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/sync\"\n },\n \"resourcesSnapshot\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/snapshots/{resource_group}/{id}\"\n }\n },\n \"service\": \"content\",\n \"version\": \"v4\"\n }\n },\n \"oauth2\": {\n \"v1\": {\n \"operations\": {\n \"oauth2TokenExchange\": {\n \"auth\": \"none\",\n \"method\": \"post\",\n \"path\": \"/oauth2/token\"\n },\n \"introspectOauth2Token\": {\n \"auth\": \"none\",\n \"method\": \"post\",\n \"path\": \"/oauth2/introspect\"\n },\n \"revokeOauth2Token\": {\n \"auth\": \"none\",\n \"method\": \"post\",\n \"path\": \"/oauth2/revoke\"\n },\n \"oAuth2Authorize\": {\n \"auth\": \"none\",\n \"method\": \"get\",\n \"path\": \"/oauth2/auth\"\n },\n \"getOidcUserInfo\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/userinfo\"\n },\n \"revokeOidcSession\": {\n \"auth\": \"none\",\n \"method\": \"get\",\n \"path\": \"/oauth2/sessions/logout\"\n }\n },\n \"service\": \"oauth2\",\n \"version\": \"v1\"\n }\n },\n \"quranReflect\": {\n \"v1\": {\n \"operations\": {\n \"usersControllerProfile\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/profile\"\n },\n \"usersControllerUpdateProfile\": {\n \"auth\": \"user\",\n \"method\": \"put\",\n \"path\": \"/v1/users/profile\"\n },\n \"usersControllerEditProfile\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/users/profile\"\n },\n \"usersControllerRooms\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/my-rooms\"\n },\n \"usersControllerSearch\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/search\"\n },\n \"usersControllerToggleFollow\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/users/{followeeId}/toggle-follow\"\n },\n \"usersControllerRemoveFollower\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/users/{followerId}/remove-follower\"\n },\n \"usersControllerGetUserProfile\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/{id}\"\n },\n \"usersControllerGetUserProfile2\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/{username}/profile\"\n },\n \"usersControllerGetUserFollowers\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/{id}/followers\"\n },\n \"usersControllerGetUserFollowing\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/{id}/following\"\n },\n \"roomsControllerAdminsAccess\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/admins-access\"\n },\n \"roomsControllerCreateNewGroup\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/groups\"\n },\n \"roomsControllerUpdateGroup\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/rooms/groups\"\n },\n \"roomsControllerCreateNewPage\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/pages\"\n },\n \"roomsControllerUpdatePage\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/rooms/pages\"\n },\n \"roomsControllerGetRoomMembers\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}/members\"\n },\n \"roomsControllerGetClosedGroupJoinRequestStatus\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{groupId}/join-request\"\n },\n \"roomsControllerRequestToJoinClosedGroup\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{groupId}/join-request\"\n },\n \"roomsControllerCancelClosedGroupJoinRequest\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/rooms/{groupId}/join-request\"\n },\n \"roomsControllerGetPendingClosedGroupJoinRequests\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{groupId}/join-requests\"\n },\n \"roomsControllerApproveClosedGroupJoinRequest\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{groupId}/join-requests/{userId}/approve\"\n },\n \"roomsControllerRejectClosedGroupJoinRequest\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/rooms/{groupId}/join-requests/{userId}\"\n },\n \"roomsControllerInviteUserToRoom\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{id}/invite\"\n },\n \"roomsControllerAcceptInvite\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}/accept-invite\"\n },\n \"roomsControllerRejectInvite\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}/reject-invite\"\n },\n \"roomsControllerRemoveMember\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/rooms/{id}/members/{userId}\"\n },\n \"roomsControllerGetRooms\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/joined-rooms\"\n },\n \"roomsControllerGetRooms2\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/managed-rooms\"\n },\n \"roomsControllerSearchRooms\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/search\"\n },\n \"roomsControllerGetRoomProfile\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/group/{url}\"\n },\n \"roomsControllerGetRoomProfile2\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/page/{subdomain}\"\n },\n \"roomsControllerAcceptByPrivateToken\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/group/{url}/accept/{token}\"\n },\n \"roomsControllerAcceptByPrivateToken2\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/page/{subdomain}/accept/{token}\"\n },\n \"roomsControllerGetRoomProfileById\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}\"\n },\n \"roomsControllerGetRoomPosts\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}/posts\"\n },\n \"roomsControllerJoinRoom\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{groupId}/join\"\n },\n \"roomsControllerLeaveGroup\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{groupId}/leave\"\n },\n \"roomsControllerFollowPage\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{pageId}/follow\"\n },\n \"roomsControllerUnfollowPage\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{pageId}/unfollow\"\n },\n \"roomsControllerUpdatePostPrivacy\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/rooms/{roomId}/posts/{postId}/privacy\"\n },\n \"postsControllerFeed\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/feed\"\n },\n \"postsControllerGetRelatedPosts\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{postId}/related\"\n },\n \"postsControllerGetReReflections\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{postId}/re-reflections\"\n },\n \"postsControllerGetLoggedinUserPosts\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/my-posts\"\n },\n \"postsControllerGetMyPostsCountWithinRange\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/count-within-range\"\n },\n \"postsControllerGetLikedState\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{id}/liked\"\n },\n \"postsControllerFindOne\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{id}\"\n },\n \"postsControllerEdit\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/posts/{id}\"\n },\n \"postsControllerDelete\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/posts/{id}\"\n },\n \"postsControllerViewTracking\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/viewed/{id}\"\n },\n \"postsControllerReadTracking\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/read/{id}\"\n },\n \"postsControllerCreate\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts\"\n },\n \"postsControllerReportAbuse\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/{id}/report\"\n },\n \"postsControllerGetUserPost\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/user-posts/{id}\"\n },\n \"postsControllerToggleLike\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/{id}/toggle-like\"\n },\n \"postsControllerToggleSave\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/{id}/toggle-save\"\n },\n \"postsControllerGetComments\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{id}/comments\"\n },\n \"postsControllerGetAllComment\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{id}/all-comments\"\n },\n \"postsControllerExportMultiplePosts\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/export/pdf\"\n },\n \"postsControllerGetPublicPostCountByVerse\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/count-by-verse/{verseId}\"\n },\n \"postsControllerGetMyPostsByVerse\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/by-verse/{verseKey}\"\n },\n \"tagsControllerFind\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/tags\"\n },\n \"commentsControllerCreate\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/comments\"\n },\n \"commentsControllerEdit\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/comments/{id}\"\n },\n \"commentsControllerDeleteComment\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/comments/{id}/delete\"\n },\n \"commentsControllerToggleLike\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/comments/{id}/toggle-like\"\n },\n \"commentsControllerGet\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/comments/{id}/replies\"\n },\n \"exploreControllerFind\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/explore\"\n },\n \"trendingHashtagsControllerFind\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/trending-hashtags\"\n }\n },\n \"service\": \"quranReflect\",\n \"version\": \"v1\"\n }\n },\n \"search\": {\n \"v1\": {\n \"operations\": {\n \"searchControllerSearch\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/v1/search\"\n }\n },\n \"service\": \"search\",\n \"version\": \"v1\"\n }\n }\n}\n","import type { ApiService } from \"@/types\";\n\nimport operationCatalogJson from \"./specs/operation-catalog.json\";\n\nexport type HttpMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\nexport type OperationAuthMode = \"none\" | \"app\" | \"user\";\n\nexport interface OperationDefinition {\n auth: OperationAuthMode;\n method: HttpMethod;\n operationId?: string;\n operationName: string;\n path: string;\n serverUrl?: string;\n service: ApiService;\n tags: string[];\n version: string;\n}\n\nexport type CatalogOperationDefinition = Omit<\n OperationDefinition,\n \"operationName\" | \"service\" | \"tags\" | \"version\"\n> &\n Partial<\n Pick<OperationDefinition, \"operationName\" | \"service\" | \"tags\" | \"version\">\n >;\n\nexport interface ServiceOperationCatalog {\n operations: Record<string, CatalogOperationDefinition>;\n service: ApiService;\n version: string;\n}\n\ninterface OperationCatalog {\n analytics: { v1: ServiceOperationCatalog };\n auth: { v1: ServiceOperationCatalog };\n content: { v4: ServiceOperationCatalog };\n oauth2: { v1: ServiceOperationCatalog };\n quranReflect: { v1: ServiceOperationCatalog };\n search: { v1: ServiceOperationCatalog };\n}\n\nexport const operationCatalog = operationCatalogJson as OperationCatalog;\n\nexport const resolveCatalogOperation = (\n section: ServiceOperationCatalog,\n operationName: string,\n operation: CatalogOperationDefinition,\n): OperationDefinition => {\n return {\n ...operation,\n operationName: operation.operationName ?? operationName,\n service: operation.service ?? section.service,\n tags: operation.tags ?? [],\n version: operation.version ?? section.version,\n };\n};\n\nexport const getOperationByName = (\n service: ApiService,\n version: string,\n operationName: string,\n): OperationDefinition | undefined => {\n const serviceCatalog = operationCatalog[service] as\n | Record<string, ServiceOperationCatalog | undefined>\n | undefined;\n if (!serviceCatalog) {\n return undefined;\n }\n\n const versionCatalog = serviceCatalog[version];\n const operation = versionCatalog?.operations[operationName];\n if (!versionCatalog || !operation) {\n return undefined;\n }\n\n return resolveCatalogOperation(versionCatalog, operationName, operation);\n};\n","import type { OperationRequest, TokenResponse, UserSession } from \"@/types\";\n\nexport const encodeBasicAuth = (username: string, password: string): string => {\n const raw = `${username}:${password}`;\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(raw).toString(\"base64\");\n }\n\n if (typeof globalThis.btoa === \"function\") {\n return globalThis.btoa(raw);\n }\n\n throw new Error(\"No base64 encoder available for HTTP basic auth.\");\n};\n\nexport const prepareBody = (\n request: OperationRequest,\n headers: Headers,\n): string | URLSearchParams | undefined => {\n if (request.body === undefined || request.body === null) {\n return undefined;\n }\n\n if (\n typeof request.body === \"string\" ||\n request.body instanceof URLSearchParams\n ) {\n if (request.contentType) {\n headers.set(\"Content-Type\", request.contentType);\n }\n\n return request.body;\n }\n\n headers.set(\"Content-Type\", request.contentType ?? \"application/json\");\n return JSON.stringify(request.body);\n};\n\nexport const toUserSession = (\n token: TokenResponse & {\n accessToken?: string;\n expiresIn?: number;\n idToken?: string;\n refreshToken?: string;\n tokenType?: string;\n },\n currentSession?: Partial<UserSession> | null,\n): UserSession => {\n const expiresIn = token.expiresIn ?? token.expires_in;\n const accessToken = token.accessToken ?? token.access_token;\n const idToken = token.idToken ?? token.id_token ?? currentSession?.idToken;\n const refreshToken =\n token.refreshToken ?? token.refresh_token ?? currentSession?.refreshToken;\n const tokenType =\n token.tokenType ?? token.token_type ?? currentSession?.tokenType;\n const scope = token.scope ?? currentSession?.scope;\n const expiresAt = expiresIn\n ? Date.now() + expiresIn * 1000\n : currentSession?.expiresAt;\n\n return {\n accessToken,\n expiresAt,\n idToken,\n refreshToken,\n scope,\n tokenType,\n };\n};\n","import type {\n HttpMethod,\n OperationDefinition,\n ServiceOperationCatalog,\n} from \"@/generated/contracts\";\nimport { resolveCatalogOperation } from \"@/generated/contracts\";\n\nexport const HTTP_METHOD_TO_MUTATION_NAME: Record<HttpMethod, string> = {\n delete: \"remove\",\n get: \"list\",\n patch: \"update\",\n post: \"create\",\n put: \"update\",\n};\n\nexport const toCamelCase = (value: string): string => {\n const parts = value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[^A-Za-z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n\n if (parts.length === 0) {\n return \"misc\";\n }\n\n return parts\n .map((part, index) => {\n const lower = part.toLowerCase();\n if (index === 0) {\n return lower;\n }\n\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n })\n .join(\"\");\n};\n\nexport const toPascalCase = (value: string): string => {\n const camel = toCamelCase(value);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n};\n\nexport const isPathParam = (segment: string): boolean =>\n segment.startsWith(\"{\") && segment.endsWith(\"}\");\n\nexport const getResourceSegments = (path: string): string[] => {\n const segments = path.split(\"/\").filter(Boolean);\n if (segments[0]?.match(/^v\\d+$/)) {\n return segments.slice(1);\n }\n\n return segments;\n};\n\nexport const pickGeneratedMethodName = (\n operation: OperationDefinition,\n): string => {\n const resourceSegments = getResourceSegments(operation.path);\n const lastSegment = resourceSegments.at(-1);\n const literalSegments = resourceSegments.filter(\n (segment) => !isPathParam(segment),\n );\n const lastLiteral = literalSegments.at(-1);\n const groupLiteral = literalSegments[0];\n\n if (resourceSegments.length === 1) {\n return HTTP_METHOD_TO_MUTATION_NAME[operation.method];\n }\n\n if (\n resourceSegments.length === 2 &&\n lastSegment &&\n isPathParam(lastSegment)\n ) {\n if (operation.method === \"get\") {\n return \"get\";\n }\n\n if (operation.method === \"delete\") {\n return \"remove\";\n }\n\n return \"update\";\n }\n\n if (lastSegment && !isPathParam(lastSegment) && lastLiteral) {\n if (lastLiteral === groupLiteral) {\n return `${HTTP_METHOD_TO_MUTATION_NAME[operation.method]}ById`;\n }\n\n return toCamelCase(lastLiteral);\n }\n\n return toCamelCase(operation.operationName);\n};\n\nexport type RawOperation = (request?: unknown) => Promise<unknown>;\nexport type GeneratedGroup = Record<string, RawOperation>;\nexport type GeneratedGroups = Record<string, GeneratedGroup>;\n\nexport interface FetcherLike {\n request<T = unknown>(\n service: string,\n path: string,\n query?: unknown,\n request?: unknown,\n ): Promise<T>;\n requestOperation<T = unknown>(\n operation: OperationDefinition,\n request?: unknown,\n ): Promise<T>;\n getUserSession(): Promise<unknown>;\n setUserSession(session: unknown): Promise<void>;\n buildServiceUrl(service: string, path: string, query?: unknown): string;\n}\n\nexport const createRawClient = (\n fetcher: FetcherLike,\n section: ServiceOperationCatalog,\n): Record<string, RawOperation> => {\n const rawOperations: Record<string, RawOperation> = {};\n\n for (const [operationName, operation] of Object.entries(section.operations)) {\n const resolvedOperation = resolveCatalogOperation(\n section,\n operationName,\n operation,\n );\n\n rawOperations[operationName] = (request?: unknown) =>\n fetcher.requestOperation(resolvedOperation, request);\n }\n\n return rawOperations;\n};\n\nexport const createGeneratedGroups = (\n section: ServiceOperationCatalog,\n rawOperations: Record<string, RawOperation>,\n): GeneratedGroups => {\n const groups: GeneratedGroups = {};\n\n for (const [operationName, operation] of Object.entries(section.operations)) {\n const resolvedOperation = resolveCatalogOperation(\n section,\n operationName,\n operation,\n );\n const literals = getResourceSegments(resolvedOperation.path).filter(\n (segment) => !isPathParam(segment),\n );\n const groupName = toCamelCase(literals[0] ?? \"misc\");\n const suggestedName = pickGeneratedMethodName(resolvedOperation);\n const currentGroup = groups[groupName] ?? {};\n let methodName = suggestedName;\n\n if (currentGroup[methodName]) {\n methodName = `${suggestedName}${toPascalCase(operationName)}`;\n }\n\n currentGroup[methodName] = rawOperations[operationName]!;\n groups[groupName] = currentGroup;\n }\n\n return groups;\n};\n","import type { ApiParams } from \"@/types\";\nimport humps from \"humps\";\n\nconst { decamelize } = humps;\n\nexport const ensureLeadingSlash = (value: string): string =>\n value.startsWith(\"/\") ? value : `/${value}`;\n\nexport const removeTrailingSlash = (value: string): string =>\n value.endsWith(\"/\") ? value.slice(0, -1) : value;\n\nexport const removeBeginningSlash = (url: string) => {\n return url.startsWith(\"/\") ? url.slice(1) : url;\n};\n\nexport const replacePathParams = (\n path: string,\n params?: Record<string, string | number>,\n): string => {\n return path.replace(/\\{([^}]+)\\}/g, (_match: string, rawKey: string) => {\n const value = params?.[rawKey];\n if (value === undefined) {\n throw new Error(`Missing path parameter: ${rawKey}`);\n }\n\n return encodeURIComponent(String(value));\n });\n};\n\nexport const normalizePathTemplate = (path: string): string =>\n path.replace(/(^|\\/):([A-Za-z0-9_]+)/g, \"$1{$2}\");\n\ninterface ParamsToStringOptions {\n preserveCase?: boolean;\n}\n\nconst fieldsKey = [\"wordFields\", \"translationFields\", \"fields\"] as const;\nconst fieldsKeySet = new Set<string>([\n ...fieldsKey,\n ...fieldsKey.map((key) => decamelize(key)),\n]);\nconst preservedKeys = new Set([\n \"navigationalResultsNumber\",\n \"pageSize\",\n \"versesResultsNumber\",\n]);\n\nexport const paramsToString = (\n params?: ApiParams,\n options: ParamsToStringOptions = {},\n): string => {\n if (!params) return \"\";\n\n const paramsString = new URLSearchParams();\n\n for (const [rawKey, rawValue] of Object.entries(params)) {\n if (rawValue === undefined) continue;\n\n const key =\n options.preserveCase || preservedKeys.has(rawKey)\n ? rawKey\n : decamelize(rawKey);\n\n // fields is a special case, it's an object with boolean values\n if (fieldsKeySet.has(rawKey) || fieldsKeySet.has(key)) {\n const fields = Object.entries(rawValue as Record<string, boolean>)\n .filter(([, value]) => value)\n .map(([fieldKey]) => decamelize(fieldKey));\n if (fields.length > 0) {\n paramsString.set(key, fields.join(\",\"));\n }\n continue;\n }\n\n if (typeof rawValue === \"string\") {\n paramsString.set(key, rawValue);\n } else if (typeof rawValue === \"number\") {\n paramsString.set(key, rawValue.toString());\n } else if (typeof rawValue === \"boolean\") {\n paramsString.set(key, rawValue.toString());\n } else if (Array.isArray(rawValue)) {\n paramsString.set(key, rawValue.join(\",\"));\n }\n }\n\n if (paramsString.size === 0) return \"\";\n return `?${paramsString.toString()}`;\n};\n","import type {\n AnalyticsBatchAccepted,\n AnalyticsBatchRequest,\n AnalyticsEvent,\n OperationRequest,\n} from \"@/types\";\n\ntype RawOperation = (request?: OperationRequest) => Promise<unknown>;\n\nconst optionalField = <T>(value: T | undefined, key: string) =>\n value === undefined ? {} : { [key]: value };\n\nconst toAnalyticsEventBody = (event: AnalyticsEvent) => ({\n event_id: event.eventId,\n name: event.name,\n occurred_at:\n event.occurredAt instanceof Date\n ? event.occurredAt.toISOString()\n : event.occurredAt,\n version: event.version,\n ...optionalField(event.actionId, \"action_id\"),\n ...optionalField(event.anonymousId, \"anonymous_id\"),\n ...optionalField(event.properties, \"properties\"),\n ...optionalField(event.sessionId, \"session_id\"),\n ...optionalField(event.userId, \"user_id\"),\n});\n\nexport const createAnalyticsFacade = (raw: Record<string, RawOperation>) => ({\n events: {\n submit: (request: AnalyticsBatchRequest) =>\n raw.submitAnalyticsEvents!({\n body: {\n events: request.events.map(toAnalyticsEventBody),\n },\n }) as Promise<AnalyticsBatchAccepted>,\n },\n raw,\n});\n","import type {\n ApiParams,\n CreateQuranReflectPostPayload,\n OperationRequest,\n QuranReflectPost,\n QuranReflectPostMutationResponse,\n UpdateQuranReflectPostPayload,\n} from \"@/types\";\n\ntype RawOperation = (request?: OperationRequest) => Promise<unknown>;\ntype GeneratedGroup = Record<string, RawOperation>;\n\nexport type QuranReflectPostCreateOperationRequest = Omit<\n OperationRequest,\n \"body\"\n> & {\n body: {\n post: CreateQuranReflectPostPayload;\n };\n};\n\nexport type QuranReflectPostUpdateOperationRequest = Omit<\n OperationRequest,\n \"body\" | \"path\"\n> & {\n body: UpdateQuranReflectPostPayload;\n path: {\n id: string | number;\n };\n};\n\nexport type QuranReflectPostGetOperationRequest = Omit<\n OperationRequest,\n \"path\"\n> & {\n path: {\n id: string | number;\n };\n};\n\ntype CreateQuranReflectPost = {\n (\n payload: CreateQuranReflectPostPayload,\n ): Promise<QuranReflectPostMutationResponse>;\n (\n request: QuranReflectPostCreateOperationRequest,\n ): Promise<QuranReflectPostMutationResponse>;\n (request?: OperationRequest): Promise<unknown>;\n};\n\ntype UpdateQuranReflectPost = {\n (\n id: string | number,\n payload: UpdateQuranReflectPostPayload,\n ): Promise<QuranReflectPostMutationResponse>;\n (\n request: QuranReflectPostUpdateOperationRequest,\n ): Promise<QuranReflectPostMutationResponse>;\n (request?: OperationRequest): Promise<unknown>;\n};\n\ntype GetQuranReflectPost = {\n (id: string | number, query?: ApiParams): Promise<QuranReflectPost>;\n (request: QuranReflectPostGetOperationRequest): Promise<QuranReflectPost>;\n (request?: OperationRequest): Promise<unknown>;\n};\n\nexport type QuranReflectPostsFacade = GeneratedGroup & {\n create: CreateQuranReflectPost;\n get: GetQuranReflectPost;\n update: UpdateQuranReflectPost;\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst isCreatePayload = (value: unknown): value is CreateQuranReflectPostPayload => {\n if (!isObject(value)) {\n return false;\n }\n\n return (\n typeof value[\"body\"] === \"string\" &&\n typeof value[\"draft\"] === \"boolean\" &&\n Array.isArray(value[\"references\"]) &&\n Array.isArray(value[\"mentions\"])\n );\n};\n\nexport const createQuranReflectPostsFacade = (\n generatedPosts: GeneratedGroup,\n request: (\n method: \"GET\" | \"PATCH\" | \"POST\",\n path: string,\n operationRequest?: OperationRequest,\n ) => Promise<unknown>,\n): QuranReflectPostsFacade => {\n const create: CreateQuranReflectPost = ((\n payloadOrRequest:\n | CreateQuranReflectPostPayload\n | QuranReflectPostCreateOperationRequest,\n ) => {\n if (isCreatePayload(payloadOrRequest)) {\n return request(\"POST\", \"/v1/posts\", {\n body: {\n post: payloadOrRequest,\n },\n }) as Promise<QuranReflectPostMutationResponse>;\n }\n\n return request(\"POST\", \"/v1/posts\", payloadOrRequest) as Promise<\n QuranReflectPostMutationResponse\n >;\n }) as CreateQuranReflectPost;\n\n const update: UpdateQuranReflectPost = ((\n idOrRequest: string | number | QuranReflectPostUpdateOperationRequest,\n payload?: UpdateQuranReflectPostPayload,\n ) => {\n if (payload !== undefined) {\n return request(\"PATCH\", \"/v1/posts/{id}\", {\n body: payload,\n path: { id: idOrRequest as string | number },\n }) as Promise<QuranReflectPostMutationResponse>;\n }\n\n return request(\n \"PATCH\",\n \"/v1/posts/{id}\",\n idOrRequest as QuranReflectPostUpdateOperationRequest,\n ) as Promise<QuranReflectPostMutationResponse>;\n }) as UpdateQuranReflectPost;\n\n const get: GetQuranReflectPost = ((\n idOrRequest: string | number | QuranReflectPostGetOperationRequest,\n query?: ApiParams,\n ) => {\n if (typeof idOrRequest === \"string\" || typeof idOrRequest === \"number\") {\n return request(\"GET\", \"/v1/posts/{id}\", {\n path: { id: idOrRequest },\n query,\n }) as Promise<QuranReflectPost>;\n }\n\n return request(\"GET\", \"/v1/posts/{id}\", idOrRequest) as Promise<\n QuranReflectPost\n >;\n }) as GetQuranReflectPost;\n\n return {\n ...generatedPosts,\n create,\n get,\n update,\n };\n};\n","import type { ChapterId } from \"../types\";\n\n/**\n * Validates chapter id\n * @param id chapter id\n * @example\n * isValidChapterId('1') // true\n * isValidChapterId('114') // true\n * isValidChapterId('0') // false\n * isValidChapterId('-1') // false\n * isValidChapterId('200') // false\n */\nexport const isValidChapterId = (id: string | number): id is ChapterId => {\n const parsedId = typeof id === \"number\" ? id : Number(id);\n if (!parsedId || parsedId <= 0 || parsedId > 114) return false;\n return true;\n};\n","import type { JuzNumber } from \"../types\";\n\n/**\n * Validates juz number\n * @param juz juz number\n * @example\n * isValidJuz('1') // true\n * isValidJuz('30') // true\n * isValidJuz('0') // false\n * isValidJuz('-1') // false\n * isValidJuz('200') // false\n */\nexport const isValidJuz = (juz: string | number): juz is JuzNumber => {\n const parsedJuz = typeof juz === \"number\" ? juz : Number(juz);\n if (!parsedJuz || parsedJuz <= 0 || parsedJuz > 30) return false;\n return true;\n};\n","import type { RubNumber } from \"../types\";\n\n/**\n * Validates rub number\n * @param rub rub number\n * @example\n * isValidRub('1') // true\n * isValidRub('240') // true\n * isValidRub('0') // false\n * isValidRub('-1') // false\n * isValidRub('300') // false\n */\nexport const isValidRub = (rub: string | number): rub is RubNumber => {\n const parsedRub = typeof rub === \"number\" ? rub : Number(rub);\n if (!parsedRub || parsedRub <= 0 || parsedRub > 240) return false;\n return true;\n};\n","import type { HizbNumber } from \"../types\";\n\n/**\n * Validates hizb number\n * @param hizb hizb number\n * @example\n * isValidHizb('1') // true\n * isValidHizb('60') // true\n * isValidHizb('0') // false\n * isValidHizb('-1') // false\n * isValidHizb('200') // false\n */\nexport const isValidHizb = (hizb: string | number): hizb is HizbNumber => {\n const parsedHizb = typeof hizb === \"number\" ? hizb : Number(hizb);\n if (!parsedHizb || parsedHizb <= 0 || parsedHizb > 60) return false;\n return true;\n};\n","import type { PageNumber } from \"../types\";\n\n/**\n * Validates mushaf page number\n * @param page mushaf page number\n * @example\n * isValidQuranPage('1') // true\n * isValidQuranPage('604') // true\n * isValidQuranPage('0') // false\n * isValidQuranPage('-1') // false\n * isValidQuranPage('1000') // false\n */\nexport const isValidQuranPage = (page: string | number): page is PageNumber => {\n const parsedPage = typeof page === \"number\" ? page : Number(page);\n if (!parsedPage || parsedPage <= 0 || parsedPage > 604) return false;\n return true;\n};\n","/**\n * Maps chapter number to verse count\n */\nexport const versesMapping = {\n 1: 7,\n 2: 286,\n 3: 200,\n 4: 176,\n 5: 120,\n 6: 165,\n 7: 206,\n 8: 75,\n 9: 129,\n 10: 109,\n 11: 123,\n 12: 111,\n 13: 43,\n 14: 52,\n 15: 99,\n 16: 128,\n 17: 111,\n 18: 110,\n 19: 98,\n 20: 135,\n 21: 112,\n 22: 78,\n 23: 118,\n 24: 64,\n 25: 77,\n 26: 227,\n 27: 93,\n 28: 88,\n 29: 69,\n 30: 60,\n 31: 34,\n 32: 30,\n 33: 73,\n 34: 54,\n 35: 45,\n 36: 83,\n 37: 182,\n 38: 88,\n 39: 75,\n 40: 85,\n 41: 54,\n 42: 53,\n 43: 89,\n 44: 59,\n 45: 37,\n 46: 35,\n 47: 38,\n 48: 29,\n 49: 18,\n 50: 45,\n 51: 60,\n 52: 49,\n 53: 62,\n 54: 55,\n 55: 78,\n 56: 96,\n 57: 29,\n 58: 22,\n 59: 24,\n 60: 13,\n 61: 14,\n 62: 11,\n 63: 11,\n 64: 18,\n 65: 12,\n 66: 12,\n 67: 30,\n 68: 52,\n 69: 52,\n 70: 44,\n 71: 28,\n 72: 28,\n 73: 20,\n 74: 56,\n 75: 40,\n 76: 31,\n 77: 50,\n 78: 40,\n 79: 46,\n 80: 42,\n 81: 29,\n 82: 19,\n 83: 36,\n 84: 25,\n 85: 22,\n 86: 17,\n 87: 19,\n 88: 26,\n 89: 30,\n 90: 20,\n 91: 15,\n 92: 21,\n 93: 11,\n 94: 8,\n 95: 8,\n 96: 19,\n 97: 5,\n 98: 8,\n 99: 8,\n 100: 11,\n 101: 11,\n 102: 8,\n 103: 3,\n 104: 9,\n 105: 5,\n 106: 4,\n 107: 7,\n 108: 3,\n 109: 6,\n 110: 3,\n 111: 5,\n 112: 4,\n 113: 5,\n 114: 6,\n} as const satisfies Record<number, number>;\n","import type { ChapterId, VerseKey } from \"../types\";\nimport { isValidChapterId } from \"./is-valid-chapter-id\";\nimport { versesMapping } from \"./verses-mapping\";\n\n/**\n * Validates verse key\n * @param key colon separated verse key (chapter:verse)\n * @example\n * isValidVerseKey('1:1') // true\n * isValidVerseKey('30:1') // true\n * isValidVerseKey('0') // false\n * isValidVerseKey('1:-') // false\n * isValidVerseKey('1_1') // false\n */\nexport const isValidVerseKey = (key: string): key is VerseKey => {\n const [chapterId, verseId] = key.trim().split(\":\");\n if (!chapterId || !verseId || !isValidChapterId(chapterId)) return false;\n\n const parsedVerse = Number(verseId);\n const verseCount = versesMapping[chapterId as ChapterId];\n if (!parsedVerse || parsedVerse <= 0 || parsedVerse > verseCount)\n return false;\n\n return true;\n};\n","import type {\n AnswerCountWithinRangeResponse,\n AnswerQuestion,\n AnswersByAyahResponse,\n BaseApiParams,\n QuranFetchClient,\n VerseKey,\n} from \"@/types\";\nimport { isValidVerseKey } from \"@/utils\";\n\ntype GetAnswersByAyahOptions = BaseApiParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype CountAnswersWithinRangeOptions = BaseApiParams;\n\nconst normalizeAnswerCountWithinRangeResponse = (\n response: AnswerCountWithinRangeResponse,\n): AnswerCountWithinRangeResponse => {\n return Object.fromEntries(\n Object.entries(response).map(([verseKey, count]) => {\n if (!count.types) return [verseKey, count];\n\n return [\n verseKey,\n {\n ...count,\n types: Object.fromEntries(\n Object.entries(count.types).map(([type, value]) => [\n type.toUpperCase(),\n value,\n ]),\n ),\n },\n ];\n }),\n );\n};\n\n/**\n * Quran answers API methods.\n */\nexport class QuranAnswers {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get published answer questions linked to a specific ayah.\n * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"2:255\")\n * @param {GetAnswersByAyahOptions} options\n * @example\n * client.answers.findByAyah(\"2:255\", { page: 1, pageSize: 2 })\n */\n async findByAyah(\n key: VerseKey,\n options?: GetAnswersByAyahOptions,\n ): Promise<AnswersByAyahResponse> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n return this.fetcher.fetch<AnswersByAyahResponse>(\n `/content/api/v4/answers/by_ayah/${key}`,\n options,\n );\n }\n\n /**\n * Get a published answer question by id.\n * @param {string | number} questionId question id\n * @example\n * client.answers.findByQuestionId(\"988\")\n */\n async findByQuestionId(\n questionId: string | number,\n ): Promise<AnswerQuestion> {\n return this.fetcher.fetch<AnswerQuestion>(\n `/content/api/v4/answers/${questionId}`,\n );\n }\n\n /**\n * Get a verse-key to answer-count map within an inclusive ayah range.\n * @param {VerseKey} from start verse key in format \"chapter:verse\"\n * @param {VerseKey} to end verse key in format \"chapter:verse\"\n * @param {CountAnswersWithinRangeOptions} options\n * @example\n * client.answers.countWithinRange(\"2:255\", \"2:256\")\n */\n async countWithinRange(\n from: VerseKey,\n to: VerseKey,\n options?: CountAnswersWithinRangeOptions,\n ): Promise<AnswerCountWithinRangeResponse> {\n if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n throw new Error(\"Invalid verse key\");\n }\n\n const response = await this.fetcher.fetch<AnswerCountWithinRangeResponse>(\n \"/content/api/v4/answers/count_within_range\",\n {\n ...options,\n from,\n to,\n },\n );\n\n return normalizeAnswerCountWithinRangeResponse(response);\n }\n}\n","import type {\n BaseApiParams,\n ChapterId,\n ChapterRecitation,\n NormalizedVerseRecitation,\n Pagination,\n QuranFetchClient,\n VerseKey,\n VerseRecitation,\n VerseRecitationField,\n} from \"@/types\";\nimport { isValidChapterId, isValidVerseKey } from \"@/utils\";\n\ntype GetChapterRecitationOptions = BaseApiParams;\n\ntype GetVerseRecitationOptions = BaseApiParams & {\n fields?: Partial<Record<VerseRecitationField, boolean>>;\n};\n\ntype RawVerseRecitation = Omit<VerseRecitation, \"audioUrl\">;\n\n/**\n * Base URL for verse audio files from Quran.com\n * Used to convert relative paths to absolute URLs\n */\nconst AUDIO_BASE_URL = \"https://verses.quran.com\";\n\n/**\n * Normalize verse recitation data by adding absolute audioUrl\n * The API returns relative paths in the 'url' field, but we want\n * to provide absolute URLs for consistency with chapter recitations\n */\nfunction normalizeVerseRecitations(\n audioFiles: RawVerseRecitation[],\n): NormalizedVerseRecitation[] {\n return audioFiles.map((file) => {\n // If url is already absolute, use it; otherwise prepend the base URL\n const absoluteUrl =\n file.url.startsWith(\"http://\") || file.url.startsWith(\"https://\")\n ? file.url\n : `${AUDIO_BASE_URL}/${file.url.replace(/^\\/+/, \"\")}`;\n\n return {\n ...file,\n audioUrl: absoluteUrl,\n };\n });\n}\n\n/**\n * Audio API methods\n */\nexport class QuranAudio {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get all chapter recitations for specific reciter\n * @param {string} reciterId\n * @param {GetChapterRecitationOptions} options\n * @example\n * client.audio.findAllChapterRecitations('2')\n */\n async findAllChapterRecitations(\n reciterId: string,\n options?: GetChapterRecitationOptions,\n ): Promise<ChapterRecitation[]> {\n const { audioFiles } = await this.fetcher.fetch<{\n audioFiles: ChapterRecitation[];\n }>(`/content/api/v4/chapter_recitations/${reciterId}`, options);\n\n return audioFiles;\n }\n\n /**\n * Get a specific chapter recitation by reciter and chapter\n * @param {string} reciterId\n * @param {ChapterId} chapterId\n * @param {GetChapterRecitationOptions} options\n * @example\n * client.audio.findChapterRecitationById('2', '1')\n */\n async findChapterRecitationById(\n reciterId: string,\n chapterId: ChapterId,\n options?: GetChapterRecitationOptions,\n ): Promise<ChapterRecitation> {\n if (!isValidChapterId(chapterId)) throw new Error(\"Invalid chapter id\");\n\n const { audioFile } = await this.fetcher.fetch<{\n audioFile: ChapterRecitation;\n }>(\n `/content/api/v4/chapter_recitations/${reciterId}/${chapterId}`,\n options,\n );\n\n return audioFile;\n }\n\n /**\n * Get verse recitations by chapter\n * @param {ChapterId} chapterId\n * @param {string} recitationId\n * @param {GetVerseRecitationOptions} options\n * @example\n * client.audio.findVerseRecitationsByChapter('1', '2')\n */\n async findVerseRecitationsByChapter(\n chapterId: ChapterId,\n recitationId: string,\n options?: GetVerseRecitationOptions,\n ): Promise<{\n audioFiles: NormalizedVerseRecitation[];\n pagination: Pagination;\n }> {\n if (!isValidChapterId(chapterId)) throw new Error(\"Invalid chapter id\");\n\n const data = await this.fetcher.fetch<{\n audioFiles: RawVerseRecitation[];\n pagination: Pagination;\n }>(\n `/content/api/v4/recitations/${recitationId}/by_chapter/${chapterId}`,\n options,\n );\n\n return {\n ...data,\n audioFiles: normalizeVerseRecitations(data.audioFiles),\n };\n }\n\n /**\n * Get verse recitations by verse key\n * @param {VerseKey} key\n * @param {string} recitationId\n * @param {GetVerseRecitationOptions} options\n * @example\n * client.audio.findVerseRecitationsByKey('1:1', '2')\n */\n async findVerseRecitationsByKey(\n key: VerseKey,\n recitationId: string,\n options?: GetVerseRecitationOptions,\n ): Promise<{\n audioFiles: NormalizedVerseRecitation[];\n pagination: Pagination;\n }> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n const data = await this.fetcher.fetch<{\n audioFiles: RawVerseRecitation[];\n pagination: Pagination;\n }>(`/content/api/v4/recitations/${recitationId}/by_ayah/${key}`, options);\n\n return {\n ...data,\n audioFiles: normalizeVerseRecitations(data.audioFiles),\n };\n }\n}\n","import type {\n BaseApiParams,\n Chapter,\n ChapterId,\n ChapterInfo,\n ChapterInfoResponse,\n QuranFetchClient,\n} from \"@/types\";\nimport { isValidChapterId } from \"@/utils\";\n\ntype GetChapterOptions = BaseApiParams;\ntype GetChapterInfoOptions = BaseApiParams & {\n resourceId?: string | number;\n includeResources?: boolean;\n};\n\n/**\n * Chapters API methods\n */\nexport class QuranChapters {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get all chapters.\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/list-chapters\n * @param {GetChapterOptions} options\n * @example\n * client.chapters.findAll()\n */\n async findAll(options?: GetChapterOptions): Promise<Chapter[]> {\n const { chapters } = await this.fetcher.fetch<{ chapters: Chapter[] }>(\n \"/content/api/v4/chapters\",\n options,\n );\n\n return chapters;\n }\n\n /**\n * Get chapter by id.\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter\n * @param {ChapterId} id chapter id, minimum 1, maximum 114\n * @param {GetChapterOptions} options\n * @example\n * client.chapters.findById('1')\n * client.chapters.findById('114')\n */\n async findById(id: ChapterId, options?: GetChapterOptions): Promise<Chapter> {\n if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n const { chapter } = await this.fetcher.fetch<{ chapter: Chapter }>(\n `/content/api/v4/chapters/${id}`,\n options,\n );\n\n return chapter;\n }\n\n /**\n * Get chapter info by id.\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter-info\n * @param {ChapterId} id chapter id, minimum 1, maximum 114\n * @param {GetChapterInfoOptions} options\n * @example\n * client.chapters.findInfoById('1')\n * client.chapters.findInfoById('114')\n */\n async findInfoById(\n id: ChapterId,\n options?: GetChapterInfoOptions,\n ): Promise<ChapterInfo | null> {\n const { chapterInfo } = await this.findInfoResponseById(id, options);\n\n return chapterInfo;\n }\n\n /**\n * Get the full chapter info response, including available resources when requested.\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter-info\n * @param {ChapterId} id chapter id, minimum 1, maximum 114\n * @param {GetChapterInfoOptions} options\n * @example\n * client.chapters.findInfoResponseById('1', { includeResources: true })\n * client.chapters.findInfoResponseById('1', { resourceId: 'en-tafsir-ibn-ashur' })\n */\n async findInfoResponseById(\n id: ChapterId,\n options?: GetChapterInfoOptions,\n ): Promise<ChapterInfoResponse> {\n if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n return this.fetcher.fetch<ChapterInfoResponse>(\n `/content/api/v4/chapters/${id}/info`,\n options,\n );\n }\n}\n","export const retry = async <T>(\n fn: () => Promise<T>,\n options: { retries: number } = { retries: 3 },\n): Promise<T> => {\n let lastError: Error;\n\n for (let i = 0; i <= options.retries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (i === options.retries) {\n throw lastError;\n }\n\n // Simple exponential backoff\n await new Promise((resolve) =>\n setTimeout(resolve, Math.pow(2, i) * 1000),\n );\n }\n }\n\n throw lastError!;\n};\n","export const API_BASE_URL = \"https://apis.quran.foundation\";\n\nexport const DEFAULT_BASE_URLS = {\n analytics: \"https://apis.quran.foundation/analytics\",\n auth: \"https://apis.quran.foundation/auth\",\n content: \"https://apis.quran.foundation/content\",\n oauth2: \"https://oauth2.quran.foundation\",\n quranReflect: \"https://apis.quran.foundation/quran-reflect\",\n search: \"https://apis.quran.foundation/search\",\n} as const;\n\nexport const DIRECT_PATH_PREFIX = {\n analytics: \"/v1\",\n auth: \"/v1\",\n content: \"/api/v4\",\n oauth2: \"\",\n quranReflect: \"/v1\",\n search: \"/v1\",\n} as const;\n\nexport const GATEWAY_PATH_PREFIX = {\n analytics: \"/analytics/v1\",\n auth: \"/auth/v1\",\n content: \"/content/api/v4\",\n oauth2: \"\",\n quranReflect: \"/quran-reflect/v1\",\n search: \"/search/v1\",\n} as const;\n\nexport const LEGACY_PREFIXES = {\n analytics: [\"/analytics/v1\", \"/v1\"] as const,\n auth: [\"/auth/v1\", \"/v1\"] as const,\n content: [\"/content/api/v4\", \"/api/v4\"] as const,\n oauth2: [] as const,\n quranReflect: [\"/quran-reflect/v1\", \"/v1\"] as const,\n search: [\"/search/v1\", \"/v1\"] as const,\n} as const;\n","import type { OperationDefinition } from \"@/generated/contracts\";\nimport type {\n ApiParams,\n ApiService,\n CachedToken,\n CustomFetcher,\n OperationRequest,\n PublicClientConfig,\n RuntimeMode,\n ServerClientConfig,\n TokenResponse,\n UserSession,\n} from \"@/types\";\nimport { encodeBasicAuth, prepareBody, toUserSession } from \"@/lib/http-utils\";\nimport { retry } from \"@/lib/retry\";\nimport {\n API_BASE_URL,\n DEFAULT_BASE_URLS,\n DIRECT_PATH_PREFIX,\n GATEWAY_PATH_PREFIX,\n LEGACY_PREFIXES,\n} from \"@/lib/service-config\";\nimport {\n ensureLeadingSlash,\n normalizePathTemplate,\n paramsToString,\n removeTrailingSlash,\n replacePathParams,\n} from \"@/lib/url\";\nimport humps from \"humps\";\n\nconst { camelizeKeys } = humps;\n\ntype RuntimeClientConfig = PublicClientConfig | ServerClientConfig;\n\nconst APP_SERVICE_SCOPES: Partial<Record<ApiService, string>> = {\n analytics: \"analytics.events.write\",\n content: \"content\",\n search: \"search\",\n};\nconst QURAN_REFLECT_POSTS_PATH_PREFIX = \"/quran-reflect/v1/posts/\";\nconst QURAN_REFLECT_COMMENT_PATH_SUFFIXES = [\n \"/comments\",\n \"/all-comments\",\n] as const;\nconst GATEWAY_SERVICES = [\n \"analytics\",\n \"auth\",\n \"content\",\n \"quranReflect\",\n \"search\",\n] as const satisfies readonly ApiService[];\n\nconst USER_SESSION_EXPIRED_MESSAGE = \"User session expired. Sign in again.\";\nconst REFRESH_TOKEN_REJECTION_ERROR = \"invalid_grant\";\nconst USER_SESSION_REFRESH_WINDOW_MS = 60_000;\n\nconst readResponseBody = async (response: Response): Promise<string> => {\n try {\n return await response.text();\n } catch {\n return \"\";\n }\n};\n\nconst isRefreshTokenRejection = (\n response: Response,\n responseBody: string,\n): boolean => {\n if (\n response.status < 400 ||\n response.status >= 500 ||\n response.status === 429\n ) {\n return false;\n }\n\n return responseBody.toLowerCase().includes(REFRESH_TOKEN_REJECTION_ERROR);\n};\n\nconst formatRefreshFailureMessage = (\n response: Response,\n responseBody: string,\n): string => {\n const body = responseBody.trim();\n const details = body ? `: ${body}` : \"\";\n\n return `Token refresh failed: ${response.status} ${response.statusText}${details}`;\n};\n\nexport class QuranFetcher {\n private appTokens = new Map<string, CachedToken>();\n private userSession: UserSession | null | undefined;\n private userSessionRefreshPromise: Promise<UserSession> | null = null;\n\n constructor(\n private readonly mode: RuntimeMode,\n private readonly config: RuntimeClientConfig,\n ) {\n this.userSession = config.userSession;\n }\n\n public getFetch(): CustomFetcher {\n const doFetch = this.config.fetch ?? globalThis.fetch;\n\n if (typeof doFetch !== \"function\") {\n throw new Error(\n \"No fetch function available. Please provide a fetch implementation or ensure global fetch is available.\",\n );\n }\n\n return doFetch;\n }\n\n public clearCachedTokens(): void {\n this.appTokens.clear();\n }\n\n public async getUserSession(): Promise<UserSession | null> {\n const storedSession = await this.config.storage?.getSession?.();\n if (storedSession !== undefined) {\n return storedSession;\n }\n\n return this.userSession ?? null;\n }\n\n public async setUserSession(session: UserSession | null): Promise<void> {\n if (!this.config.storage) {\n this.userSession = session;\n return;\n }\n\n if (!session) {\n if (this.config.storage.clearSession) {\n await this.config.storage.clearSession();\n this.userSession = null;\n return;\n }\n\n await this.config.storage.setSession?.(null);\n this.userSession = null;\n return;\n }\n\n await this.config.storage.setSession?.(session);\n this.userSession = session;\n }\n\n public buildServiceUrl(\n service: ApiService,\n path: string,\n query?: ApiParams,\n ): string {\n const crossServiceGatewayPath = this.isCrossServiceGatewayPath(\n service,\n path,\n );\n const { baseUrl, usesGateway } = this.resolveServiceBaseUrl(\n service,\n crossServiceGatewayPath,\n );\n const servicePath = this.normalizeServicePath(\n service,\n path,\n usesGateway,\n crossServiceGatewayPath,\n );\n const preserveQueryParamCase =\n service === \"auth\" || service === \"quranReflect\";\n\n return `${baseUrl}${servicePath}${paramsToString(query, {\n preserveCase: preserveQueryParamCase,\n })}`;\n }\n\n public async requestOperation<T = unknown>(\n operation: OperationDefinition,\n request?: OperationRequest,\n ): Promise<T> {\n return this.request<T>(\n operation.service,\n replacePathParams(operation.path, request?.path),\n request?.query,\n {\n ...request,\n auth:\n request?.auth === \"auto\" || !request?.auth\n ? operation.auth\n : request.auth,\n method:\n request?.method ??\n (operation.method.toUpperCase() as OperationRequest[\"method\"]),\n path: undefined,\n },\n );\n }\n\n public async request<T = unknown>(\n service: ApiService,\n path: string,\n query?: ApiParams,\n request: OperationRequest = {},\n ): Promise<T> {\n const effectiveAuth = this.resolveAuthMode(service, request.auth);\n\n if (this.mode === \"public\" && effectiveAuth === \"app\") {\n throw new Error(\n \"This API requires @quranjs/api/server or a backend. Content and search are server-side for confidential clients.\",\n );\n }\n\n const url = this.buildServiceUrl(service, path, query);\n const userSession = await this.getRequestUserSession(\n effectiveAuth,\n request,\n );\n let response = await this.performRequest(\n service,\n url,\n request,\n effectiveAuth,\n userSession?.accessToken,\n );\n\n if (\n this.shouldRetryUserRequest(response, effectiveAuth, request, userSession)\n ) {\n const refreshedSession = await this.refreshStoredUserSession();\n response = await this.performRequest(\n service,\n url,\n request,\n effectiveAuth,\n refreshedSession.accessToken,\n );\n }\n\n if (!response.ok) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"application/json\")) {\n return (await response.text()) as T;\n }\n\n const json = await response.json();\n return camelizeKeys(json as object) as T;\n }\n\n public async fetch<T = unknown>(url: string, params?: ApiParams): Promise<T> {\n const route = this.resolveLegacyRoute(url);\n return this.request<T>(route.service, route.path, {\n ...this.config.defaults,\n ...params,\n });\n }\n\n private async performRequest(\n service: ApiService,\n url: string,\n request: OperationRequest,\n auth: \"app\" | \"none\" | \"user\",\n accessToken?: string,\n ): Promise<Response> {\n const headers = new Headers(request.headers);\n const body = prepareBody(request, headers);\n\n if (service !== \"oauth2\") {\n headers.set(\"x-client-id\", this.config.clientId);\n }\n\n await this.applyAuthenticationHeaders(\n service,\n auth,\n headers,\n {\n ...request,\n accessToken: accessToken ?? request.accessToken,\n },\n url,\n );\n\n return this.getFetch()(url, {\n body,\n headers,\n method: request.method ?? \"GET\",\n });\n }\n\n private resolveLegacyRoute(url: string): {\n path: string;\n service: ApiService;\n } {\n const normalizedPath = ensureLeadingSlash(normalizePathTemplate(url));\n\n if (\n normalizedPath.startsWith(\"/content/api/v4\") ||\n normalizedPath.startsWith(\"/api/v4\")\n ) {\n return {\n path: normalizedPath,\n service: \"content\",\n };\n }\n\n if (\n normalizedPath === \"/v1/search\" ||\n normalizedPath.startsWith(\"/search/v1\")\n ) {\n return {\n path: normalizedPath,\n service: \"search\",\n };\n }\n\n if (normalizedPath.startsWith(\"/auth/v1\")) {\n return {\n path: normalizedPath,\n service: \"auth\",\n };\n }\n\n if (normalizedPath.startsWith(\"/quran-reflect/v1\")) {\n return {\n path: normalizedPath,\n service: \"quranReflect\",\n };\n }\n\n if (\n normalizedPath.startsWith(\"/oauth2\") ||\n normalizedPath.startsWith(\"/userinfo\")\n ) {\n return {\n path: normalizedPath,\n service: \"oauth2\",\n };\n }\n\n throw new Error(`Unsupported SDK route: ${url}`);\n }\n\n private resolveAuthMode(\n service: ApiService,\n auth: OperationRequest[\"auth\"] = \"auto\",\n ): \"app\" | \"none\" | \"user\" {\n if (auth !== \"auto\") {\n return auth;\n }\n\n if (service === \"content\" || service === \"search\") {\n return \"app\";\n }\n\n if (service === \"auth\" || service === \"quranReflect\") {\n return \"user\";\n }\n\n return \"none\";\n }\n\n private async getRequestUserSession(\n auth: \"app\" | \"none\" | \"user\",\n request: OperationRequest,\n ): Promise<UserSession | null> {\n if (auth !== \"user\" || request.accessToken || this.mode !== \"server\") {\n return null;\n }\n\n const session = await this.getUserSession();\n if (!session?.accessToken) {\n throw new Error(\n \"This operation requires a user session. Sign in first or use @quranjs/api/server.\",\n );\n }\n\n if (!this.shouldRefreshUserSession(session)) {\n return session;\n }\n\n return this.refreshStoredUserSession(session);\n }\n\n private shouldRefreshUserSession(session: UserSession): boolean {\n if (!session.refreshToken || !session.expiresAt) {\n return false;\n }\n\n return session.expiresAt <= Date.now() + USER_SESSION_REFRESH_WINDOW_MS;\n }\n\n private shouldRetryUserRequest(\n response: Response,\n auth: \"app\" | \"none\" | \"user\",\n request: OperationRequest,\n session: UserSession | null,\n ): boolean {\n if (response.status !== 401) {\n return false;\n }\n\n if (auth !== \"user\" || request.accessToken || this.mode !== \"server\") {\n return false;\n }\n\n return Boolean(session?.refreshToken);\n }\n\n private async applyAuthenticationHeaders(\n service: ApiService,\n auth: \"app\" | \"none\" | \"user\",\n headers: Headers,\n request: OperationRequest,\n resourceUrl?: string,\n ): Promise<void> {\n if (request.basicAuth) {\n headers.set(\n \"Authorization\",\n `Basic ${encodeBasicAuth(\n request.basicAuth.username,\n request.basicAuth.password,\n )}`,\n );\n }\n\n if (request.accessToken) {\n this.setTokenHeaders(service, headers, request.accessToken);\n return;\n }\n\n if (auth === \"none\") {\n return;\n }\n\n if (auth === \"app\") {\n const token = await this.getAppAccessToken(service, resourceUrl);\n this.setTokenHeaders(service, headers, token);\n return;\n }\n\n const session = await this.getUserSession();\n if (!session?.accessToken) {\n throw new Error(\n \"This operation requires a user session. Sign in first or use @quranjs/api/server.\",\n );\n }\n\n this.setTokenHeaders(service, headers, session.accessToken);\n }\n\n private async refreshStoredUserSession(\n currentSession?: UserSession | null,\n ): Promise<UserSession> {\n if (this.userSessionRefreshPromise) {\n return this.userSessionRefreshPromise;\n }\n\n const refreshPromise = this.executeUserSessionRefresh(currentSession);\n this.userSessionRefreshPromise = refreshPromise;\n\n try {\n return await refreshPromise;\n } finally {\n if (this.userSessionRefreshPromise === refreshPromise) {\n this.userSessionRefreshPromise = null;\n }\n }\n }\n\n private async executeUserSessionRefresh(\n currentSession?: UserSession | null,\n ): Promise<UserSession> {\n if (this.mode !== \"server\" || !(\"clientSecret\" in this.config)) {\n throw new Error(\n \"Automatic session refresh requires @quranjs/api/server or a backend.\",\n );\n }\n\n const clientSecret = this.config.clientSecret;\n\n const session = currentSession ?? (await this.getUserSession());\n if (!session?.refreshToken) {\n throw new Error(USER_SESSION_EXPIRED_MESSAGE);\n }\n\n const tokenUrl = `${removeTrailingSlash(\n this.config.services?.tokenHost ??\n this.config.services?.oauth2BaseUrl ??\n DEFAULT_BASE_URLS.oauth2,\n )}/oauth2/token`;\n\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: session.refreshToken,\n });\n\n const response = await retry(\n () =>\n this.getFetch()(tokenUrl, {\n body,\n headers: {\n Accept: \"application/json\",\n Authorization: `Basic ${encodeBasicAuth(\n this.config.clientId,\n clientSecret,\n )}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n method: \"POST\",\n }),\n { retries: 3 },\n );\n\n if (!response.ok) {\n const responseBody = await readResponseBody(response);\n if (isRefreshTokenRejection(response, responseBody)) {\n await this.setUserSession(null);\n throw new Error(USER_SESSION_EXPIRED_MESSAGE);\n }\n\n throw new Error(formatRefreshFailureMessage(response, responseBody));\n }\n\n const token = (await response.json()) as TokenResponse;\n const refreshedSession = toUserSession(token, session);\n await this.setUserSession(refreshedSession);\n\n return refreshedSession;\n }\n\n private setTokenHeaders(\n service: ApiService,\n headers: Headers,\n accessToken: string,\n ): void {\n if (service === \"oauth2\") {\n headers.set(\"Authorization\", `Bearer ${accessToken}`);\n return;\n }\n\n headers.set(\"x-auth-token\", accessToken);\n }\n\n private async getAppAccessToken(\n service: ApiService,\n resourceUrl?: string,\n ): Promise<string> {\n if (this.mode !== \"server\") {\n throw new Error(\n \"App-authenticated APIs require @quranjs/api/server or a backend.\",\n );\n }\n\n const scope = this.resolveAppScope(service, resourceUrl);\n if (!scope) {\n throw new Error(\n `No client-credentials scope is configured for ${service}.`,\n );\n }\n\n const cacheKey = `${service}:${scope}`;\n const cachedToken = this.appTokens.get(cacheKey);\n\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) {\n return cachedToken.value;\n }\n\n if (!(\"clientSecret\" in this.config)) {\n throw new Error(\"client_secret is server-only. Use @quranjs/api/server.\");\n }\n\n const clientSecret = this.config.clientSecret;\n\n const tokenUrl = `${removeTrailingSlash(\n this.config.services?.tokenHost ??\n this.config.services?.oauth2BaseUrl ??\n DEFAULT_BASE_URLS.oauth2,\n )}/oauth2/token`;\n\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n scope,\n });\n\n const response = await retry(\n () =>\n this.getFetch()(tokenUrl, {\n body,\n headers: {\n Accept: \"application/json\",\n Authorization: `Basic ${encodeBasicAuth(\n this.config.clientId,\n clientSecret,\n )}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n method: \"POST\",\n }),\n { retries: 3 },\n );\n\n if (!response.ok) {\n throw new Error(\n `Token request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const json = (await response.json()) as TokenResponse;\n const cached = {\n expiresAt: Date.now() + json.expires_in * 1000,\n value: json.access_token,\n };\n\n this.appTokens.set(cacheKey, cached);\n return cached.value;\n }\n\n private resolveAppScope(\n service: ApiService,\n resourceUrl?: string,\n ): string | undefined {\n if (service !== \"content\" || !resourceUrl) {\n return APP_SERVICE_SCOPES[service];\n }\n\n const pathname = new URL(resourceUrl).pathname;\n if (!pathname.startsWith(QURAN_REFLECT_POSTS_PATH_PREFIX)) {\n return APP_SERVICE_SCOPES.content;\n }\n\n if (\n QURAN_REFLECT_COMMENT_PATH_SUFFIXES.some((suffix) =>\n pathname.endsWith(suffix),\n )\n ) {\n return \"comment.read\";\n }\n\n return \"post.read\";\n }\n\n private resolveServiceBaseUrl(\n service: ApiService,\n crossServiceGatewayPath = false,\n ): {\n baseUrl: string;\n usesGateway: boolean;\n } {\n const { services } = this.config;\n if (crossServiceGatewayPath) {\n return {\n baseUrl: removeTrailingSlash(services?.gatewayUrl ?? API_BASE_URL),\n usesGateway: true,\n };\n }\n\n const directBaseUrl =\n service === \"analytics\"\n ? services?.analyticsBaseUrl\n : service === \"content\"\n ? services?.contentBaseUrl\n : service === \"search\"\n ? services?.searchBaseUrl\n : service === \"auth\"\n ? services?.authBaseUrl\n : service === \"quranReflect\"\n ? services?.quranReflectBaseUrl\n : (services?.oauth2BaseUrl ?? services?.tokenHost);\n\n if (directBaseUrl) {\n return {\n baseUrl: removeTrailingSlash(directBaseUrl),\n usesGateway: false,\n };\n }\n\n if (services?.gatewayUrl && service !== \"oauth2\") {\n return {\n baseUrl: removeTrailingSlash(services.gatewayUrl),\n usesGateway: true,\n };\n }\n\n return {\n baseUrl: DEFAULT_BASE_URLS[service],\n usesGateway: false,\n };\n }\n\n private normalizeServicePath(\n service: ApiService,\n path: string,\n usesGateway: boolean,\n crossServiceGatewayPath = false,\n ): string {\n const normalizedPath = ensureLeadingSlash(normalizePathTemplate(path));\n if (service === \"oauth2\") {\n return normalizedPath;\n }\n\n if (crossServiceGatewayPath) {\n return normalizedPath;\n }\n\n let servicePath = normalizedPath;\n for (const prefix of LEGACY_PREFIXES[service]) {\n if (servicePath.startsWith(prefix)) {\n servicePath = ensureLeadingSlash(servicePath.slice(prefix.length));\n break;\n }\n }\n\n const prefix = usesGateway\n ? GATEWAY_PATH_PREFIX[service]\n : DIRECT_PATH_PREFIX[service];\n\n if (servicePath.startsWith(prefix)) {\n return servicePath;\n }\n\n return `${prefix}${servicePath}`;\n }\n\n private isCrossServiceGatewayPath(\n service: ApiService,\n path: string,\n ): boolean {\n const normalizedPath = ensureLeadingSlash(normalizePathTemplate(path));\n const pathService = GATEWAY_SERVICES.find((gatewayService) =>\n this.pathMatchesPrefix(\n normalizedPath,\n GATEWAY_PATH_PREFIX[gatewayService],\n ),\n );\n\n return Boolean(pathService && pathService !== service);\n }\n\n private pathMatchesPrefix(path: string, prefix: string): boolean {\n return (\n prefix.length > 0 && (path === prefix || path.startsWith(`${prefix}/`))\n );\n }\n}\n","import type {\n BaseApiParams,\n HadithCountWithinRangeResponse,\n HadithReferencesByAyahResponse,\n HadithsByAyahResponse,\n QuranFetchClient,\n VerseKey,\n} from \"@/types\";\nimport { isValidVerseKey } from \"@/utils\";\n\ntype GetHadithReferenceOptions = BaseApiParams;\n\ntype GetHadithsByAyahOptions = BaseApiParams & {\n page?: number;\n limit?: number;\n};\n\ntype CountHadithsWithinRangeOptions = BaseApiParams;\n\n/**\n * Hadith reference API methods.\n */\nexport class QuranHadithReferences {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get ordered hadith reference records linked to a specific ayah.\n * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"12:12\")\n * @param {GetHadithReferenceOptions} options\n * @example\n * client.hadithReferences.findByAyah(\"12:12\")\n */\n async findByAyah(\n key: VerseKey,\n options?: GetHadithReferenceOptions,\n ): Promise<HadithReferencesByAyahResponse> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n return this.fetcher.fetch<HadithReferencesByAyahResponse>(\n `/content/api/v4/hadith_references/by_ayah/${key}`,\n options,\n );\n }\n\n /**\n * Get paginated hadith payloads linked to a specific ayah.\n * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"12:12\")\n * @param {GetHadithsByAyahOptions} options\n * @example\n * client.hadithReferences.findHadithsByAyah(\"12:12\", { limit: 4 })\n */\n async findHadithsByAyah(\n key: VerseKey,\n options?: GetHadithsByAyahOptions,\n ): Promise<HadithsByAyahResponse> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n return this.fetcher.fetch<HadithsByAyahResponse>(\n `/content/api/v4/hadith_references/by_ayah/${key}/hadiths`,\n options,\n );\n }\n\n /**\n * Get a verse-key to hadith-count map within an inclusive ayah range.\n * @param {VerseKey} from start verse key in format \"chapter:verse\"\n * @param {VerseKey} to end verse key in format \"chapter:verse\"\n * @param {CountHadithsWithinRangeOptions} options\n * @example\n * client.hadithReferences.countWithinRange(\"12:12\", \"12:13\")\n */\n async countWithinRange(\n from: VerseKey,\n to: VerseKey,\n options?: CountHadithsWithinRangeOptions,\n ): Promise<HadithCountWithinRangeResponse> {\n if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n throw new Error(\"Invalid verse key\");\n }\n\n return this.fetcher.fetch<HadithCountWithinRangeResponse>(\n \"/content/api/v4/hadith_references/count_within_range\",\n {\n ...options,\n from,\n to,\n },\n );\n }\n}\n","import type { Juz, QuranFetchClient } from \"@/types\";\n\n/**\n * Juzs API methods\n */\nexport class QuranJuzs {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get All Juzs\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/juzs\n * @example\n * client.juzs.findAll()\n */\n async findAll(): Promise<Juz[]> {\n const { juzs } = await this.fetcher.fetch<{ juzs: Juz[] }>(\n \"/content/api/v4/juzs\",\n );\n return juzs;\n }\n}\n","import type {\n BaseApiParams,\n ChapterInfoResource,\n ChapterReciterResource,\n ContentResourceSnapshot,\n ContentResourceSnapshotOptions,\n ContentSyncOptions,\n ContentSyncResourceGroup,\n ContentSyncResponse,\n LanguageResource,\n QuranFetchClient,\n RecitationInfoResource,\n RecitationResource,\n RecitationStylesResource,\n TafsirInfoResource,\n TafsirResource,\n TranslationInfoResource,\n TranslationResource,\n VerseMediaResource,\n} from \"@/types\";\n\ntype GetResourceOptions = BaseApiParams;\n\n/**\n * Resources API methods\n */\nexport class QuranResources {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get all recitations.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllRecitations()\n */\n async findAllRecitations(\n options?: GetResourceOptions,\n ): Promise<RecitationResource[]> {\n const { recitations } = await this.fetcher.fetch<{\n recitations: RecitationResource[];\n }>(\"/content/api/v4/resources/recitations\", options);\n\n return recitations;\n }\n\n /**\n * Get all translations.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllTranslations()\n */\n async findAllTranslations(\n options?: GetResourceOptions,\n ): Promise<TranslationResource[]> {\n const { translations } = await this.fetcher.fetch<{\n translations: TranslationResource[];\n }>(\"/content/api/v4/resources/translations\", options);\n\n return translations;\n }\n\n /**\n * Get all tafsirs.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllTafsirs()\n */\n async findAllTafsirs(\n options?: GetResourceOptions,\n ): Promise<TafsirResource[]> {\n const { tafsirs } = await this.fetcher.fetch<{\n tafsirs: TafsirResource[];\n }>(\"/content/api/v4/resources/tafsirs\", options);\n\n return tafsirs;\n }\n\n /**\n * Get all languages.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllLanguages()\n */\n async findAllLanguages(\n options?: GetResourceOptions,\n ): Promise<LanguageResource[]> {\n const { languages } = await this.fetcher.fetch<{\n languages: LanguageResource[];\n }>(\"/content/api/v4/resources/languages\", options);\n\n return languages;\n }\n\n /**\n * Get recitation info by id.\n * @param {string} id recitation id\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findRecitationInfo('1')\n */\n async findRecitationInfo(\n id: string,\n options?: GetResourceOptions,\n ): Promise<RecitationInfoResource> {\n const { recitationInfo } = await this.fetcher.fetch<{\n recitationInfo: RecitationInfoResource;\n }>(`/content/api/v4/resources/recitations/${id}/info`, options);\n\n return recitationInfo;\n }\n\n /**\n * Get translation info by id.\n * @param {string} id translation id\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findTranslationInfo('131')\n */\n async findTranslationInfo(\n id: string,\n options?: GetResourceOptions,\n ): Promise<TranslationInfoResource> {\n const { translationInfo } = await this.fetcher.fetch<{\n translationInfo: TranslationInfoResource;\n }>(`/content/api/v4/resources/translations/${id}/info`, options);\n\n return translationInfo;\n }\n\n /**\n * Get tafsir info by id.\n * @param {string} id tafsir id\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findTafsirInfo('171')\n */\n async findTafsirInfo(\n id: string,\n options?: GetResourceOptions,\n ): Promise<TafsirInfoResource> {\n const { tafsirInfo } = await this.fetcher.fetch<{\n tafsirInfo: TafsirInfoResource;\n }>(`/content/api/v4/resources/tafsirs/${id}/info`, options);\n\n return tafsirInfo;\n }\n\n /**\n * Get all chapter infos.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllChapterInfos()\n */\n async findAllChapterInfos(\n options?: GetResourceOptions,\n ): Promise<ChapterInfoResource[]> {\n const { chapterInfos } = await this.fetcher.fetch<{\n chapterInfos: ChapterInfoResource[];\n }>(\"/content/api/v4/resources/chapter_infos\", options);\n\n return chapterInfos;\n }\n\n /**\n * Get all chapter reciters.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllChapterReciters()\n */\n async findAllChapterReciters(\n options?: GetResourceOptions,\n ): Promise<ChapterReciterResource[]> {\n const { reciters } = await this.fetcher.fetch<{\n reciters: ChapterReciterResource[];\n }>(\"/content/api/v4/resources/chapter_reciters\", options);\n\n return reciters;\n }\n\n /**\n * Get all recitation styles.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllRecitationStyles()\n */\n async findAllRecitationStyles(\n options?: GetResourceOptions,\n ): Promise<RecitationStylesResource> {\n const { recitationStyles } = await this.fetcher.fetch<{\n recitationStyles: RecitationStylesResource;\n }>(\"/content/api/v4/resources/recitation_styles\", options);\n\n return recitationStyles;\n }\n\n /**\n * Get verse media.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findVerseMedia()\n */\n async findVerseMedia(\n options?: GetResourceOptions,\n ): Promise<VerseMediaResource> {\n const { verseMedia } = await this.fetcher.fetch<{\n verseMedia: VerseMediaResource;\n }>(\"/content/api/v4/resources/verse_media\", options);\n\n return verseMedia;\n }\n\n /**\n * Bootstrap or incrementally sync public content resources.\n * @param {ContentSyncOptions} options\n * @example\n * client.resources.sync({\n * bootstrap: true,\n * resources: \"mushafs:1;translations:19;word_by_word_transliterations:60\"\n * })\n */\n async sync<TData extends Record<string, unknown> = Record<string, unknown>>(\n options?: ContentSyncOptions,\n ): Promise<ContentSyncResponse<TData>> {\n return this.fetcher.fetch<ContentSyncResponse<TData>>(\n \"/content/api/v4/resources/sync\",\n options,\n );\n }\n\n /**\n * Fetch the current full snapshot for a syncable public content resource.\n * @param {ContentSyncResourceGroup} resourceGroup\n * @param {string | number} id\n * @param {ContentResourceSnapshotOptions} options\n * @example\n * client.resources.findSnapshot(\"word_by_word_transliterations\", 60)\n */\n async findSnapshot<\n TRecord extends Record<string, unknown> = Record<string, unknown>,\n >(\n resourceGroup: ContentSyncResourceGroup,\n id: string | number,\n options?: ContentResourceSnapshotOptions,\n ): Promise<ContentResourceSnapshot<TRecord>> {\n return this.fetcher.fetch<ContentResourceSnapshot<TRecord>>(\n `/content/api/v4/resources/snapshots/${resourceGroup}/${id}`,\n options,\n );\n }\n}\n","import type { QuranFetchClient, SearchParams, SearchResponse } from \"@/types\";\n\ntype SearchOptions = Omit<SearchParams, \"query\">;\n\n/**\n * Search API methods\n */\nexport class QuranSearch {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Search\n * @description /v1/search\n * @param {string} query search query\n * @param {SearchOptions} options\n * @example\n * client.search.search('نور', { mode: SearchMode.Quick })\n * client.search.search('نور', { mode: SearchMode.Advanced, exactMatchesOnly: '1' })\n * client.search.search('نور', { mode: SearchMode.Quick, size: 10 })\n * client.search.search('نور', { mode: SearchMode.Quick, page: 2 })\n */\n async search(query: string, options: SearchOptions): Promise<SearchResponse> {\n return this.fetcher.fetch<SearchResponse>(\"/v1/search\", {\n query,\n size: 30, // search-specific default\n ...options,\n });\n }\n}\n","import type {\n BaseApiParams,\n ChapterId,\n HizbNumber,\n JuzNumber,\n PageNumber,\n PaginationParams,\n QuranFetchClient,\n RubNumber,\n TranslationField,\n Verse,\n VerseField,\n VerseKey,\n WordField,\n} from \"@/types\";\nimport {\n isValidChapterId,\n isValidHizb,\n isValidJuz,\n isValidQuranPage,\n isValidRub,\n isValidVerseKey,\n} from \"@/utils\";\n\ntype GetVerseOptions = BaseApiParams &\n PaginationParams & {\n reciter?: string | number;\n words?: boolean;\n translations?: string[] | number[];\n tafsirs?: string[] | number[];\n wordFields?: Partial<Record<WordField, boolean>>;\n translationFields?: Partial<Record<TranslationField, boolean>>;\n fields?: Partial<Record<VerseField, boolean>>;\n };\n\n/**\n * Verses API methods\n */\nexport class QuranVerses {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get a specific verse by its key.\n * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"1:1\")\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByKey('1:1')\n * client.verses.findByKey('2:255')\n */\n async findByKey(key: VerseKey, options?: GetVerseOptions): Promise<Verse> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n const { verse } = await this.fetcher.fetch<{ verse: Verse }>(\n `/content/api/v4/verses/by_key/${key}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verse;\n }\n\n /**\n * Get verses by range.\n * @param {VerseKey} from start verse key (e.g., \"1:1\")\n * @param {VerseKey} to end verse key (e.g., \"1:7\")\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByRange('1:1', '1:7')\n */\n async findByRange(\n from: VerseKey,\n to: VerseKey,\n options?: GetVerseOptions,\n ): Promise<Verse[]> {\n // We could validate keys here, but the API will also valid it.\n // simpler to just pass through for now, or use isValidVerseKey if desired.\n if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n throw new Error(\"Invalid verse key\");\n }\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n \"/content/api/v4/verses/by_range\",\n {\n words: false, // verses-specific default\n ...options,\n from,\n to,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by chapter.\n * @param {ChapterId} id chapter id, minimum 1, maximum 114\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByChapter('1')\n */\n async findByChapter(\n id: ChapterId,\n options?: GetVerseOptions,\n ): Promise<Verse[]> {\n if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_chapter/${id}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by page number.\n * @param {PageNumber} page page number\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByPage('1')\n */\n async findByPage(\n page: PageNumber,\n options?: GetVerseOptions,\n ): Promise<Verse[]> {\n if (!isValidQuranPage(page)) throw new Error(\"Invalid page number\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_page/${page}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by juz number.\n * @param {JuzNumber} juz juz number\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByJuz('1')\n */\n async findByJuz(juz: JuzNumber, options?: GetVerseOptions): Promise<Verse[]> {\n if (!isValidJuz(juz)) throw new Error(\"Invalid juz\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_juz/${juz}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by hizb number.\n * @param {HizbNumber} hizb hizb number\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByHizb('1')\n */\n async findByHizb(\n hizb: HizbNumber,\n options?: GetVerseOptions,\n ): Promise<Verse[]> {\n if (!isValidHizb(hizb)) throw new Error(\"Invalid hizb\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_hizb/${hizb}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by rub number.\n * @param {RubNumber} rub rub number\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByRub('1')\n */\n async findByRub(rub: RubNumber, options?: GetVerseOptions): Promise<Verse[]> {\n if (!isValidRub(rub)) throw new Error(\"Invalid rub\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_rub/${rub}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get a random verse.\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findRandom()\n */\n async findRandom(options?: GetVerseOptions): Promise<Verse> {\n const { verse } = await this.fetcher.fetch<{ verse: Verse }>(\n \"/content/api/v4/verses/random\",\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verse;\n }\n}\n","import type { AuthService } from \"@/generated/public-contracts\";\nimport type { QuranReflectPostsFacade } from \"@/runtime/quran-reflect-posts\";\nimport type {\n ApiParams,\n ChapterId,\n ContentSyncOptions,\n ContentSyncResourceGroup,\n HizbNumber,\n HTTPMethod,\n JuzNumber,\n OperationRequest,\n PageNumber,\n PublicClientConfig,\n RubNumber,\n SearchParams,\n ServerClientConfig,\n TokenResponse,\n VerseKey,\n} from \"@/types\";\nimport { operationCatalog } from \"@/generated/contracts\";\nimport { toUserSession } from \"@/lib/http-utils\";\nimport { createGeneratedGroups, createRawClient } from \"@/lib/runtime-utils\";\nimport { replacePathParams } from \"@/lib/url\";\nimport { createAnalyticsFacade } from \"@/runtime/analytics\";\nimport { createQuranReflectPostsFacade } from \"@/runtime/quran-reflect-posts\";\nimport { QuranAnswers } from \"@/sdk/answers\";\nimport { QuranAudio } from \"@/sdk/audio\";\nimport { QuranChapters } from \"@/sdk/chapters\";\nimport { QuranFetcher } from \"@/sdk/fetcher\";\nimport { QuranHadithReferences } from \"@/sdk/hadith-references\";\nimport { QuranJuzs } from \"@/sdk/juzs\";\nimport { QuranResources } from \"@/sdk/resources\";\nimport { QuranSearch } from \"@/sdk/search\";\nimport { QuranVerses } from \"@/sdk/verses\";\n\ntype RuntimeClientConfig = PublicClientConfig | ServerClientConfig;\ntype RuntimeMode = \"public\" | \"server\";\ntype RawOperation = (request?: OperationRequest) => Promise<unknown>;\ntype GeneratedGroup = Record<string, RawOperation>;\ntype QuranReflectFacade = {\n comments: GeneratedGroup;\n posts: QuranReflectPostsFacade;\n raw: Record<string, RawOperation>;\n rooms: GeneratedGroup;\n tags: GeneratedGroup;\n users: GeneratedGroup;\n};\n\nconst LEGACY_BOOKMARK_GET_MESSAGE =\n \"auth.bookmarks.get(bookmarkId) is not supported because /v1/bookmarks/bookmark expects bookmark detail query parameters. Pass a query object such as { mushafId, key, type, verseNumber } or { mushafId, isReading: true }.\";\n\nconst createUserServiceRequest =\n (fetcher: QuranFetcher, service: AuthService) =>\n (method: HTTPMethod, path: string, request?: OperationRequest) => {\n return fetcher.request<unknown>(\n service,\n replacePathParams(path, request?.path),\n request?.query,\n {\n ...request,\n auth: \"user\",\n method,\n path: undefined,\n query: undefined,\n },\n );\n };\n\nconst createAuthFacade = (fetcher: QuranFetcher) => {\n const raw = createRawClient(fetcher, operationCatalog.auth.v1);\n const generatedGroups = createGeneratedGroups(operationCatalog.auth.v1, raw);\n const request = createUserServiceRequest(fetcher, \"auth\");\n\n return {\n ...generatedGroups,\n collections: {\n ...generatedGroups.collections,\n addBookmark: (collectionId: string, body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/collections/{collectionId}/bookmarks\", {\n body,\n path: { collectionId },\n }),\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/collections\", { body }),\n get: (collectionId: string, query?: ApiParams) =>\n request(\"GET\", \"/v1/collections/{collectionId}\", {\n path: { collectionId },\n query,\n }),\n list: (query?: ApiParams) => request(\"GET\", \"/v1/collections\", { query }),\n listAll: (query?: ApiParams) =>\n request(\"GET\", \"/v1/collections/all\", { query }),\n remove: (collectionId: string) =>\n request(\"DELETE\", \"/v1/collections/{collectionId}\", {\n path: { collectionId },\n }),\n removeBookmark: (collectionId: string, bookmarkId: string) =>\n request(\n \"DELETE\",\n \"/v1/collections/{collectionId}/bookmarks/{bookmarkId}\",\n {\n path: { bookmarkId, collectionId },\n },\n ),\n update: (collectionId: string, body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/collections/{collectionId}\", {\n body,\n path: { collectionId },\n }),\n },\n bookmarks: {\n ...generatedGroups.bookmarks,\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/bookmarks\", { body }),\n get: async (query?: ApiParams | string) => {\n if (typeof query === \"string\") {\n throw new Error(LEGACY_BOOKMARK_GET_MESSAGE);\n }\n\n return request(\"GET\", \"/v1/bookmarks/bookmark\", {\n query,\n });\n },\n list: (query?: ApiParams) => request(\"GET\", \"/v1/bookmarks\", { query }),\n listCollections: (query?: ApiParams) =>\n request(\"GET\", \"/v1/bookmarks/collections\", { query }),\n listRange: (query?: ApiParams) =>\n request(\"GET\", \"/v1/bookmarks/ayahs-range\", { query }),\n remove: (bookmarkId: string) =>\n request(\"DELETE\", \"/v1/bookmarks/{bookmarkId}\", {\n path: { bookmarkId },\n }),\n },\n goals: {\n ...generatedGroups.goals,\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/goals\", { body }),\n estimate: (query?: ApiParams) =>\n request(\"GET\", \"/v1/goals/estimate\", { query }),\n getTodaysPlan: (query?: ApiParams) =>\n request(\"GET\", \"/v1/goals/get-todays-plan\", { query }),\n remove: (id: string) =>\n request(\"DELETE\", \"/v1/goals/{id}\", { path: { id } }),\n update: (id: string, body: Record<string, unknown>) =>\n request(\"PUT\", \"/v1/goals/{id}\", {\n body,\n path: { id },\n }),\n },\n notes: {\n ...generatedGroups.notes,\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/notes\", { body }),\n get: (noteId: string) =>\n request(\"GET\", \"/v1/notes/{noteId}\", { path: { noteId } }),\n list: (query?: ApiParams) => request(\"GET\", \"/v1/notes\", { query }),\n listByAttachedEntity: (query?: ApiParams) =>\n request(\"GET\", \"/v1/notes/by-attached-entity\", { query }),\n listByRange: (query?: ApiParams) =>\n request(\"GET\", \"/v1/notes/by-range\", { query }),\n listByVerseKey: (verseKey: string, query?: ApiParams) =>\n request(\"GET\", \"/v1/notes/by-verse/{verseKey}\", {\n path: { verseKey },\n query,\n }),\n publish: (noteId: string, body?: Record<string, unknown>) =>\n request(\"POST\", \"/v1/notes/{noteId}/publish\", {\n body,\n path: { noteId },\n }),\n remove: (noteId: string) =>\n request(\"DELETE\", \"/v1/notes/{noteId}\", { path: { noteId } }),\n update: (noteId: string, body: Record<string, unknown>) =>\n request(\"PATCH\", \"/v1/notes/{noteId}\", {\n body,\n path: { noteId },\n }),\n },\n preferences: {\n ...generatedGroups.preferences,\n bulkUpdate: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/preferences/bulk\", { body }),\n get: (query?: ApiParams) => request(\"GET\", \"/v1/preferences\", { query }),\n update: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/preferences\", { body }),\n },\n raw,\n readingSessions: {\n ...generatedGroups.readingSessions,\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/reading-sessions\", { body }),\n list: (query?: ApiParams) =>\n request(\"GET\", \"/v1/reading-sessions\", { query }),\n },\n };\n};\n\nconst createQuranReflectFacade = (\n fetcher: QuranFetcher,\n): QuranReflectFacade => {\n const raw = createRawClient(fetcher, operationCatalog.quranReflect.v1);\n const generatedGroups = createGeneratedGroups(\n operationCatalog.quranReflect.v1,\n raw,\n );\n\n return {\n comments: generatedGroups.comments ?? {},\n posts: createQuranReflectPostsFacade(\n generatedGroups.posts ?? {},\n createUserServiceRequest(fetcher, \"quranReflect\"),\n ),\n raw,\n rooms: generatedGroups.rooms ?? {},\n tags: generatedGroups.tags ?? {},\n users: generatedGroups.users ?? {},\n };\n};\n\nconst createOAuth2Facade = (\n fetcher: QuranFetcher,\n mode: RuntimeMode,\n config: RuntimeClientConfig,\n) => {\n const raw = createRawClient(fetcher, operationCatalog.oauth2.v1);\n\n const exchangeToken = async (\n body: URLSearchParams,\n options: {\n allowPublicExchange?: boolean;\n requiresRefreshToken?: boolean;\n } = {},\n ) => {\n if (mode === \"public\") {\n if ((config as PublicClientConfig).clientType !== \"public\") {\n throw new Error(\n \"This OAuth2 exchange requires a backend because your client is confidential.\",\n );\n }\n\n if (!options.allowPublicExchange) {\n throw new Error(\n \"This OAuth2 flow requires @quranjs/api/server or a backend.\",\n );\n }\n\n body.set(\"client_id\", config.clientId);\n }\n\n if (options.requiresRefreshToken && !body.get(\"refresh_token\")) {\n throw new Error(\"Missing refresh token.\");\n }\n\n const requestRefreshToken = body.get(\"refresh_token\") ?? undefined;\n const storedSession = options.requiresRefreshToken\n ? await fetcher.getUserSession()\n : null;\n const currentSession =\n options.requiresRefreshToken && requestRefreshToken\n ? { ...(storedSession ?? {}), refreshToken: requestRefreshToken }\n : storedSession;\n\n const token = await fetcher.request<TokenResponse>(\n \"oauth2\",\n \"/oauth2/token\",\n undefined,\n {\n auth: \"none\",\n basicAuth:\n mode === \"server\" && \"clientSecret\" in config\n ? {\n password: config.clientSecret,\n username: config.clientId,\n }\n : undefined,\n body,\n contentType: \"application/x-www-form-urlencoded\",\n method: \"POST\",\n },\n );\n\n await fetcher.setUserSession(toUserSession(token, currentSession));\n return token;\n };\n\n return {\n authorizeUrl: (query: Record<string, string | number | undefined>) =>\n fetcher.buildServiceUrl(\"oauth2\", \"/oauth2/auth\", query as ApiParams),\n exchangeCode: (params: {\n code: string;\n codeVerifier?: string;\n redirectUri: string;\n scope?: string;\n }) => {\n const body = new URLSearchParams({\n code: params.code,\n grant_type: \"authorization_code\",\n redirect_uri: params.redirectUri,\n });\n\n if (params.codeVerifier) {\n body.set(\"code_verifier\", params.codeVerifier);\n }\n\n if (params.scope) {\n body.set(\"scope\", params.scope);\n }\n\n return exchangeToken(body, { allowPublicExchange: true });\n },\n getUserInfo: (accessToken?: string) =>\n fetcher.request(\"oauth2\", \"/userinfo\", undefined, {\n accessToken,\n auth: \"user\",\n method: \"GET\",\n }),\n introspect: (token: string) => {\n if (mode !== \"server\" || !(\"clientSecret\" in config)) {\n throw new Error(\n \"Token introspection requires @quranjs/api/server or a backend.\",\n );\n }\n\n return fetcher.request(\"oauth2\", \"/oauth2/introspect\", undefined, {\n auth: \"none\",\n basicAuth: {\n password: config.clientSecret,\n username: config.clientId,\n },\n body: new URLSearchParams({ token }),\n contentType: \"application/x-www-form-urlencoded\",\n method: \"POST\",\n });\n },\n logout: (query?: ApiParams) =>\n fetcher.request(\"oauth2\", \"/oauth2/sessions/logout\", query, {\n auth: \"none\",\n method: \"GET\",\n }),\n raw,\n refresh: async (refreshToken?: string) => {\n const currentSession = await fetcher.getUserSession();\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken ?? currentSession?.refreshToken ?? \"\",\n });\n\n return exchangeToken(body, {\n allowPublicExchange: true,\n requiresRefreshToken: true,\n });\n },\n };\n};\n\nconst createContentFacade = (\n answers: QuranAnswers,\n chapters: QuranChapters,\n verses: QuranVerses,\n juzs: QuranJuzs,\n audio: QuranAudio,\n hadithReferences: QuranHadithReferences,\n resources: QuranResources,\n raw: Record<string, RawOperation>,\n) => {\n return {\n answers: {\n byAyah: (key: VerseKey, query?: ApiParams) =>\n answers.findByAyah(key, query),\n countWithinRange: (from: VerseKey, to: VerseKey, query?: ApiParams) =>\n answers.countWithinRange(from, to, query),\n get: (questionId: string | number) =>\n answers.findByQuestionId(questionId),\n },\n audio: {\n chapterRecitation: {\n get: (reciterId: string, chapterId: ChapterId, query?: ApiParams) =>\n audio.findChapterRecitationById(reciterId, chapterId, query),\n list: (reciterId: string, query?: ApiParams) =>\n audio.findAllChapterRecitations(reciterId, query),\n },\n verseRecitation: {\n byChapter: (\n chapterId: ChapterId,\n recitationId: string,\n query?: ApiParams,\n ) =>\n audio.findVerseRecitationsByChapter(chapterId, recitationId, query),\n byKey: (verseKey: VerseKey, recitationId: string, query?: ApiParams) =>\n audio.findVerseRecitationsByKey(verseKey, recitationId, query),\n },\n },\n chapters: {\n get: (id: ChapterId, query?: ApiParams) => chapters.findById(id, query),\n getInfo: (id: ChapterId, query?: ApiParams) =>\n chapters.findInfoById(id, query),\n getInfoResponse: (id: ChapterId, query?: ApiParams) =>\n chapters.findInfoResponseById(id, query),\n list: (query?: ApiParams) => chapters.findAll(query),\n },\n hadithReferences: {\n byAyah: (key: VerseKey, query?: ApiParams) =>\n hadithReferences.findByAyah(key, query),\n countWithinRange: (from: VerseKey, to: VerseKey, query?: ApiParams) =>\n hadithReferences.countWithinRange(from, to, query),\n hadithsByAyah: (key: VerseKey, query?: ApiParams) =>\n hadithReferences.findHadithsByAyah(key, query),\n },\n juzs: {\n list: () => juzs.findAll(),\n },\n raw,\n resources: {\n findSnapshot: (\n resourceGroup: ContentSyncResourceGroup,\n id: string | number,\n query?: ApiParams,\n ) => resources.findSnapshot(resourceGroup, id, query),\n chapterInfos: {\n list: (query?: ApiParams) => resources.findAllChapterInfos(query),\n },\n chapterReciters: {\n list: (query?: ApiParams) => resources.findAllChapterReciters(query),\n },\n languages: {\n list: (query?: ApiParams) => resources.findAllLanguages(query),\n },\n recitationStyles: {\n list: (query?: ApiParams) => resources.findAllRecitationStyles(query),\n },\n recitations: {\n getInfo: (id: string, query?: ApiParams) =>\n resources.findRecitationInfo(id, query),\n list: (query?: ApiParams) => resources.findAllRecitations(query),\n },\n tafsirs: {\n getInfo: (id: string, query?: ApiParams) =>\n resources.findTafsirInfo(id, query),\n list: (query?: ApiParams) => resources.findAllTafsirs(query),\n },\n translations: {\n getInfo: (id: string, query?: ApiParams) =>\n resources.findTranslationInfo(id, query),\n list: (query?: ApiParams) => resources.findAllTranslations(query),\n },\n verseMedia: {\n list: (query?: ApiParams) => resources.findVerseMedia(query),\n },\n sync: (query?: ContentSyncOptions) => resources.sync(query),\n },\n verses: {\n byChapter: (id: ChapterId, query?: ApiParams) =>\n verses.findByChapter(id, query),\n byHizb: (id: HizbNumber, query?: ApiParams) =>\n verses.findByHizb(id, query),\n byJuz: (id: JuzNumber, query?: ApiParams) => verses.findByJuz(id, query),\n byKey: (key: VerseKey, query?: ApiParams) => verses.findByKey(key, query),\n byPage: (page: PageNumber, query?: ApiParams) =>\n verses.findByPage(page, query),\n byRange: (from: VerseKey, to: VerseKey, query?: ApiParams) =>\n verses.findByRange(from, to, query),\n byRub: (id: RubNumber, query?: ApiParams) => verses.findByRub(id, query),\n random: (query?: ApiParams) => verses.findRandom(query),\n },\n };\n};\n\nexport const createRuntimeClient = (\n mode: RuntimeMode,\n config: RuntimeClientConfig,\n) => {\n const fetcher = new QuranFetcher(mode, config);\n fetcher.getFetch();\n const answers = new QuranAnswers(fetcher);\n const chapters = new QuranChapters(fetcher);\n const verses = new QuranVerses(fetcher);\n const juzs = new QuranJuzs(fetcher);\n const audio = new QuranAudio(fetcher);\n const hadithReferences = new QuranHadithReferences(fetcher);\n const resources = new QuranResources(fetcher);\n const searchClient = new QuranSearch(fetcher);\n\n const raw = {\n analytics: {\n v1: createRawClient(fetcher, operationCatalog.analytics.v1),\n },\n auth: {\n v1: createRawClient(fetcher, operationCatalog.auth.v1),\n },\n content: {\n v4: createRawClient(fetcher, operationCatalog.content.v4),\n },\n oauth2: {\n v1: createRawClient(fetcher, operationCatalog.oauth2.v1),\n },\n quranReflect: {\n v1: createRawClient(fetcher, operationCatalog.quranReflect.v1),\n },\n search: {\n v1: createRawClient(fetcher, operationCatalog.search.v1),\n },\n };\n\n const contentV4 = createContentFacade(\n answers,\n chapters,\n verses,\n juzs,\n audio,\n hadithReferences,\n resources,\n raw.content.v4,\n );\n const analyticsV1 = createAnalyticsFacade(raw.analytics.v1);\n const authV1 = createAuthFacade(fetcher);\n const quranReflectV1 = createQuranReflectFacade(fetcher);\n const oauth2V1 = createOAuth2Facade(fetcher, mode, config);\n\n const query = ({\n query: searchQuery,\n ...options\n }: {\n query: string;\n } & Omit<SearchParams, \"query\">) => searchClient.search(searchQuery, options);\n\n const search = Object.assign(searchClient, {\n query,\n raw: raw.search.v1,\n v1: {\n query,\n raw: raw.search.v1,\n },\n });\n\n return {\n analytics: {\n ...analyticsV1,\n v1: analyticsV1,\n },\n answers,\n audio,\n auth: {\n ...authV1,\n v1: authV1,\n },\n chapters,\n clearCachedTokens: () => fetcher.clearCachedTokens(),\n content: {\n ...contentV4,\n v4: contentV4,\n },\n getUserSession: () => fetcher.getUserSession(),\n hadithReferences,\n juzs,\n oauth2: {\n ...oauth2V1,\n v1: oauth2V1,\n },\n quranReflect: {\n ...quranReflectV1,\n v1: quranReflectV1,\n },\n raw,\n resources,\n search,\n verses,\n };\n};\n","import { Language } from \"@/types\";\nimport type { ServerClientConfig } from \"@/types\";\n\nimport { createRuntimeClient } from \"./runtime/create-client\";\n\nexport const createServerClient = (config: ServerClientConfig) => {\n return createRuntimeClient(\"server\", {\n ...config,\n defaults: {\n language: Language.ARABIC,\n ...config.defaults,\n },\n });\n};\n\nexport type ServerClient = ReturnType<typeof createServerClient>;\n"]}
1
+ {"version":3,"sources":["../src/generated/specs/operation-catalog.json","../src/generated/contracts.ts","../src/lib/http-utils.ts","../src/lib/runtime-utils.ts","../src/lib/url.ts","../src/runtime/analytics.ts","../src/runtime/app-state.ts","../src/runtime/quran-reflect-posts.ts","../src/utils/is-valid-chapter-id.ts","../src/utils/is-valid-juz.ts","../src/utils/is-valid-rub.ts","../src/utils/is-valid-hizb.ts","../src/utils/is-valid-quran-page.ts","../src/utils/verses-mapping.ts","../src/utils/is-valid-verse-key.ts","../src/sdk/answers.ts","../src/sdk/audio.ts","../src/sdk/chapters.ts","../src/lib/retry.ts","../src/sdk/http-error.ts","../src/lib/service-config.ts","../src/sdk/fetcher.ts","../src/sdk/hadith-references.ts","../src/sdk/juzs.ts","../src/sdk/resources.ts","../src/sdk/search.ts","../src/sdk/verses.ts","../src/runtime/create-client.ts","../src/sdk/app-state-errors.ts","../src/runtime/app-state-state.ts","../src/runtime/app-state-reconciler.ts","../src/server.ts"],"names":["operation_catalog_default","operationCatalog","resolveCatalogOperation","section","operationName","operation","encodeBasicAuth","username","password","raw","prepareBody","request","headers","toUserSession","token","currentSession","expiresIn","accessToken","idToken","refreshToken","tokenType","scope","expiresAt","HTTP_METHOD_TO_MUTATION_NAME","toCamelCase","value","parts","part","index","lower","toPascalCase","camel","isPathParam","segment","getResourceSegments","path","segments","pickGeneratedMethodName","resourceSegments","lastSegment","literalSegments","lastLiteral","groupLiteral","createRawClient","fetcher","rawOperations","resolvedOperation","createGeneratedGroups","groups","literals","groupName","suggestedName","currentGroup","methodName","decamelize","humps","ensureLeadingSlash","removeTrailingSlash","replacePathParams","params","_match","rawKey","normalizePathTemplate","fieldsKey","fieldsKeySet","key","preservedKeys","paramsToString","options","paramsString","rawValue","fields","fieldKey","optionalField","toAnalyticsEventBody","event","createAnalyticsFacade","documentPath","collection","mutationHeaders","idempotencyKey","ifMatch","ifNoneMatch","snapshotPutBody","body","snapshot","freezeJson","child","createAppStateFacade","method","query","requestWithEtag","etag","status","metadata","since","isObject","isCreatePayload","createQuranReflectPostsFacade","generatedPosts","payloadOrRequest","idOrRequest","payload","isValidChapterId","id","parsedId","isValidJuz","juz","parsedJuz","isValidRub","rub","parsedRub","isValidHizb","hizb","parsedHizb","isValidQuranPage","page","parsedPage","versesMapping","isValidVerseKey","chapterId","verseId","parsedVerse","verseCount","normalizeAnswerCountWithinRangeResponse","response","verseKey","count","type","QuranAnswers","questionId","from","to","AUDIO_BASE_URL","normalizeVerseRecitations","audioFiles","file","absoluteUrl","QuranAudio","reciterId","audioFile","recitationId","data","QuranChapters","chapters","chapter","chapterInfo","retry","fn","lastError","i","error","resolve","readErrorPayload","QuranHttpErrorClass","QuranHttpError","QURAN_HTTP_ERROR_CONSTRUCTOR","constructorRegistry","API_BASE_URL","DEFAULT_BASE_URLS","DIRECT_PATH_PREFIX","GATEWAY_PATH_PREFIX","LEGACY_PREFIXES","camelizeKeys","APP_SERVICE_SCOPES","QURAN_REFLECT_POSTS_PATH_PREFIX","QURAN_REFLECT_COMMENT_PATH_SUFFIXES","GATEWAY_SERVICES","USER_SESSION_EXPIRED_MESSAGE","REFRESH_TOKEN_REJECTION_ERROR","USER_SESSION_REFRESH_WINDOW_MS","readResponseBody","isRefreshTokenRejection","responseBody","formatRefreshFailureMessage","details","QuranFetcher","mode","config","doFetch","storedSession","session","service","crossServiceGatewayPath","baseUrl","usesGateway","servicePath","effectiveAuth","url","userSession","refreshedSession","json","route","auth","normalizedPath","resourceUrl","refreshPromise","clientSecret","tokenUrl","cacheKey","cachedToken","cached","pathname","suffix","services","directBaseUrl","prefix","pathService","gatewayService","QuranHadithReferences","QuranJuzs","juzs","QuranResources","recitations","translations","tafsirs","languages","recitationInfo","translationInfo","tafsirInfo","chapterInfos","reciters","recitationStyles","verseMedia","resourceGroup","QuranSearch","QuranVerses","verse","verses","LEGACY_BOOKMARK_GET_MESSAGE","createUserServiceRequest","createAuthFacade","generatedGroups","collectionId","bookmarkId","noteId","createQuranReflectFacade","createOAuth2Facade","exchangeToken","requestRefreshToken","createContentFacade","answers","audio","hadithReferences","resources","createRuntimeClient","searchClient","contentV4","analyticsV1","authV1","quranReflectV1","oauth2V1","searchQuery","search","APP_STATE_ERROR_CODES","getAppStateErrorCode","serviceError","code","isAppStateHttpError","actualCode","AppStateProtocolError","cloneJson","deepFreeze","stableJson","object","appStateDocumentId","createInitialAppStateState","assertSynchronousResult","createAppStateMemoryStore","initialStates","accounts","accountId","state","transactions","reducer","current","draft","result","applyChange","documents","change","applyAppStateChangePage","changes","nextSyncToken","target","replacement","applyAppStateBootstrapPage","items","nextCursor","item","promoteAppStateBootstrap","currentPrecondition","queueAppStatePut","localRevision","mutation","queueAppStateDelete","visibleFromShadow","shadow","visible","document","deriveAppStateStateView","snapshotAppStateMutations","removeAppStateMutation","replaceAppStateMutation","pending","DEFAULT_PAGE_SIZE","DEFAULT_MAX_BOOTSTRAP_RESTART_ATTEMPTS","DEFAULT_MAX_REBASE_ATTEMPTS","defaultIdempotencyKey","runtimeCrypto","mutationOptions","bootstrapItems","isRecoveryError","positiveInteger","name","createAppStateReconciler","initialAccountId","createIdempotencyKey","maxRebaseAttempts","pageSize","store","initialTransport","activeAccountId","activeTransport","accountGeneration","reconcileQueue","isCurrent","context","commit","reconcileContext","readProgress","resetBootstrap","rebuildBootstrap","reset","restartAttempts","progress","syncToken","pull","initial","applySuccessfulPut","acknowledgeDelete","refreshAndRebase","rebased","replayMutation","captured","rebaseAttempts","errorCode","replay","getStateFor","mutationContext","bodySnapshot","capturedContext","transport","createServerClient"],"mappings":"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,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,IACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EAAA,CACJ,EAAA,CAAI,GACJ,EAAA,CAAI,EAAA,CACJ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","file":"server.min.js","sourcesContent":["{\n \"analytics\": {\n \"v1\": {\n \"operations\": {\n \"submitAnalyticsEvents\": {\n \"auth\": \"app\",\n \"method\": \"post\",\n \"path\": \"/v1/events:batch\"\n }\n },\n \"service\": \"analytics\",\n \"version\": \"v1\"\n }\n },\n \"auth\": {\n \"v1\": {\n \"operations\": {\n \"getUserCsrfToken\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/users/csrf-token\"\n },\n \"listUserConnectedApps\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/users/connected-apps\"\n },\n \"runUserConnectedAppLifecycle\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/users/connected-apps/{appId}/lifecycle\"\n },\n \"getAppStateConfiguration\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/app-state:config\"\n },\n \"bootstrapAppState\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/app-state:bootstrap\"\n },\n \"getAppStateChanges\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/app-state:changes\"\n },\n \"listAppStateDocuments\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/app-state/{collection}\"\n },\n \"getAppStateDocument\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/app-state/{collection}/{key}\"\n },\n \"putAppStateDocument\": {\n \"auth\": \"user\",\n \"method\": \"put\",\n \"path\": \"/v1/app-state/{collection}/{key}\"\n },\n \"deleteAppStateDocument\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/app-state/{collection}/{key}\"\n },\n \"getV1Collections\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/collections\"\n },\n \"postV1Collections\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/collections\"\n },\n \"postV1CollectionsByCollectionIdBookmarks\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/collections/{collectionId}/bookmarks\"\n },\n \"deleteV1CollectionsByCollectionIdBookmarks\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/collections/{collectionId}/bookmarks\"\n },\n \"getV1CollectionsByCollectionId\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/collections/{collectionId}\"\n },\n \"postV1CollectionsByCollectionId\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/collections/{collectionId}\"\n },\n \"deleteV1CollectionsByCollectionId\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/collections/{collectionId}\"\n },\n \"deleteV1CollectionsByCollectionIdBookmarksByBookmarkId\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/collections/{collectionId}/bookmarks/{bookmarkId}\"\n },\n \"getV1CollectionsAll\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/collections/all\"\n },\n \"getV1Bookmarks\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/bookmarks\"\n },\n \"postV1Bookmarks\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/bookmarks\"\n },\n \"deleteV1BookmarksByBookmarkId\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/bookmarks/{bookmarkId}\"\n },\n \"getV1BookmarksAyahsRange\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/bookmarks/ayahs-range\"\n },\n \"getV1BookmarksBookmark\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/bookmarks/bookmark\"\n },\n \"getV1BookmarksCollections\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/bookmarks/collections\"\n },\n \"getV1Preferences\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/preferences\"\n },\n \"postV1Preferences\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/preferences\"\n },\n \"postV1PreferencesBulk\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/preferences/bulk\"\n },\n \"getV1ReadingSessions\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/reading-sessions\"\n },\n \"postV1ReadingSessions\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/reading-sessions\"\n },\n \"getV1GoalsGetTodaysPlan\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/goals/get-todays-plan\"\n },\n \"putV1GoalsById\": {\n \"auth\": \"user\",\n \"method\": \"put\",\n \"path\": \"/v1/goals/{id}\"\n },\n \"deleteV1GoalsById\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/goals/{id}\"\n },\n \"postV1Goals\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/goals\"\n },\n \"getV1GoalsEstimate\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/goals/estimate\"\n },\n \"getV1Streaks\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/streaks\"\n },\n \"getV1StreaksCurrentStreakDays\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/streaks/current-streak-days\"\n },\n \"getV1ActivityDays\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/activity-days\"\n },\n \"postV1ActivityDays\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/activity-days\"\n },\n \"getV1ActivityDaysEstimateReadingTime\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/activity-days/estimate-reading-time\"\n },\n \"getV1Notes\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes\"\n },\n \"postV1Notes\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/notes\"\n },\n \"getV1NotesByVerseByVerseKey\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/by-verse/{verseKey}\"\n },\n \"getV1NotesByAttachedEntity\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/by-attached-entity\"\n },\n \"getV1NotesCountWithinRange\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/count-within-range\"\n },\n \"getV1NotesByRange\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/by-range\"\n },\n \"getV1NotesByNoteId\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/notes/{noteId}\"\n },\n \"patchV1NotesByNoteId\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/notes/{noteId}\"\n },\n \"deleteV1NotesByNoteId\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/notes/{noteId}\"\n },\n \"postV1NotesByNoteIdPublish\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/notes/{noteId}/publish\"\n }\n },\n \"service\": \"auth\",\n \"version\": \"v1\"\n }\n },\n \"content\": {\n \"v4\": {\n \"operations\": {\n \"audioReciterTimestamp\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/audio/reciters/{reciter_id}/timestamp\"\n },\n \"audioReciterLookup\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/audio/reciters/{reciter_id}/lookup\"\n },\n \"listChapters\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapters\"\n },\n \"getChapter\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapters/{id}\"\n },\n \"getChapterInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapters/{id}/info\"\n },\n \"hadithReferencesByAyah\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hadith_references/by_ayah/{ayah_key}\"\n },\n \"hadithsByAyah\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hadith_references/by_ayah/{ayah_key}/hadiths\"\n },\n \"hadithCountWithinRange\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hadith_references/count_within_range\"\n },\n \"listPages\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/pages\"\n },\n \"getPagesLookup\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/pages/lookup\"\n },\n \"getPagesPageNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/pages/{page_number}\"\n },\n \"versesByChapterNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_chapter/{chapter_number}\"\n },\n \"versesByPageNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_page/{page_number}\"\n },\n \"versesByJuzNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_juz/{juz_number}\"\n },\n \"versesByHizbNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_hizb/{hizb_number}\"\n },\n \"versesByRubElHizbNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_rub/{rub_el_hizb_number}\"\n },\n \"versesByManzilNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_manzil/{manzil_number}\"\n },\n \"versesByRukuNumber\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_ruku/{ruku_number}\"\n },\n \"versesByRange\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_range\"\n },\n \"versesByVerseKey\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_key/{verse_key}\"\n },\n \"randomVerse\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/random\"\n },\n \"listJuzs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/juzs\"\n },\n \"quranVersesByScript\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/{script}\"\n },\n \"quranVersesIndopak\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/indopak\"\n },\n \"quranVersesIndopakNastaleeq\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/indopak_nastaleeq\"\n },\n \"quranVersesUthmaniTajweed\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/uthmani_tajweed\"\n },\n \"quranVersesUthmani\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/uthmani\"\n },\n \"quranVersesUthmaniSimple\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/uthmani_simple\"\n },\n \"quranVersesImlaei\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/imlaei\"\n },\n \"recitations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/recitations\"\n },\n \"recitationAudioFiles\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/recitations/{recitation_id}\"\n },\n \"translation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/translations/{translation_id}\"\n },\n \"chapterReciters\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/chapter_reciters\"\n },\n \"tafsir\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/tafsirs/{tafsir_id}\"\n },\n \"quranVersesCodeV1\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/code_v1\"\n },\n \"quranVersesCodeV2\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran/verses/code_v2\"\n },\n \"listSurahRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_chapter/{chapter_number}\"\n },\n \"listJuzRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_juz/{juz_number}\"\n },\n \"listPageRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_page/{page_number}\"\n },\n \"listRubElHizbRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_rub/{rub_el_hizb_number}\"\n },\n \"listHizbRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_hizb/{hizb_number}\"\n },\n \"listAyahRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_ayah/{ayah_key}\"\n },\n \"recitationInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/recitations/{recitation_id}/info\"\n },\n \"translationInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/translations/{translation_id}/info\"\n },\n \"translations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/translations\"\n },\n \"tafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/tafsirs\"\n },\n \"tafsirInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/tafsirs/{tafsir_id}/info\"\n },\n \"recitationStyles\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/recitation_styles\"\n },\n \"languages\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/languages\"\n },\n \"chapterInfo\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/chapter_infos\"\n },\n \"verseMedia\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/verse_media\"\n },\n \"listManzilRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_manzil/{manzil_number}\"\n },\n \"listRukuRecitation\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_ruku/{ruku_number}\"\n },\n \"listSurahTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_chapter/{chapter_number}\"\n },\n \"listPageTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_page/{page_number}\"\n },\n \"listJuzTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_juz/{juz_number}\"\n },\n \"listRubElHizbTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_rub_el_hizb/{rub_el_hizb_number}\"\n },\n \"listHizbTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_hizb/{hizb_number}\"\n },\n \"listManzilTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_manzil/{manzil_number}\"\n },\n \"listRukuTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_ruku/{ruku_number}\"\n },\n \"listAyahTranslations\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_ayah/{ayah_key}\"\n },\n \"listSurahTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_chapter/{chapter_number}\"\n },\n \"listPageTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_page/{page_number}\"\n },\n \"listJuzTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_juz/{juz_number}\"\n },\n \"listRubElHizbTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_rub_el_hizb/{rub_el_hizb_number}\"\n },\n \"listHizbTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_hizb/{hizb_number}\"\n },\n \"listManzilTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_manzil/{manzil_number}\"\n },\n \"listRukuTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_ruku/{ruku_number}\"\n },\n \"listAyahTafsirs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_ayah/{ayah_key}\"\n },\n \"getJuz\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/juzs/{id}\"\n },\n \"listHizbs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hizbs\"\n },\n \"getHizb\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/hizbs/{id}\"\n },\n \"listRubElHizbs\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/rub_el_hizbs\"\n },\n \"getRubElHizb\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/rub_el_hizbs/{id}\"\n },\n \"listRukus\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/rukus\"\n },\n \"getRuku\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/rukus/{id}\"\n },\n \"listManzils\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/manzils\"\n },\n \"getManzil\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/manzils/{id}\"\n },\n \"getFootNote\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/foot_notes/{id}\"\n },\n \"postsControllerFeed\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/feed\"\n },\n \"postsControllerFindOne\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/{id}\"\n },\n \"postsControllerGetUserPost\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/user-posts/{id}\"\n },\n \"postsControllerGetComments\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/{id}/comments\"\n },\n \"postsControllerGetAllComment\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/quran-reflect/v1/posts/{id}/all-comments\"\n },\n \"chapterReciterAudioFiles\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapter_recitations/{reciter_id}\"\n },\n \"chapterReciterAudioFile\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/chapter_recitations/{reciter_id}/{chapter_number}\"\n },\n \"versesByRubElHizbNumberRubElHizb\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/verses/by_rub_el_hizb/{rub_el_hizb_number}\"\n },\n \"listRubElHizbTranslationsRub\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/translations/{resource_id}/by_rub/{rub_el_hizb_number}\"\n },\n \"listRubElHizbTafsirsRub\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/tafsirs/{resource_id}/by_rub/{rub_el_hizb_number}\"\n },\n \"listRubElHizbRecitationRubElHizb\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/recitations/{recitation_id}/by_rub_el_hizb/{rub_el_hizb_number}\"\n },\n \"listAyahAnswers\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/answers/by_ayah/{ayah_key}\"\n },\n \"getAnswerById\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/answers/{question_id}\"\n },\n \"countAnswersWithinRange\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/answers/count_within_range\"\n },\n \"resourcesSync\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/sync\"\n },\n \"resourcesSnapshot\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/resources/snapshots/{resource_group}/{id}\"\n }\n },\n \"service\": \"content\",\n \"version\": \"v4\"\n }\n },\n \"oauth2\": {\n \"v1\": {\n \"operations\": {\n \"oauth2TokenExchange\": {\n \"auth\": \"none\",\n \"method\": \"post\",\n \"path\": \"/oauth2/token\"\n },\n \"introspectOauth2Token\": {\n \"auth\": \"none\",\n \"method\": \"post\",\n \"path\": \"/oauth2/introspect\"\n },\n \"revokeOauth2Token\": {\n \"auth\": \"none\",\n \"method\": \"post\",\n \"path\": \"/oauth2/revoke\"\n },\n \"oAuth2Authorize\": {\n \"auth\": \"none\",\n \"method\": \"get\",\n \"path\": \"/oauth2/auth\"\n },\n \"getOidcUserInfo\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/userinfo\"\n },\n \"revokeOidcSession\": {\n \"auth\": \"none\",\n \"method\": \"get\",\n \"path\": \"/oauth2/sessions/logout\"\n }\n },\n \"service\": \"oauth2\",\n \"version\": \"v1\"\n }\n },\n \"quranReflect\": {\n \"v1\": {\n \"operations\": {\n \"usersControllerProfile\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/profile\"\n },\n \"usersControllerUpdateProfile\": {\n \"auth\": \"user\",\n \"method\": \"put\",\n \"path\": \"/v1/users/profile\"\n },\n \"usersControllerEditProfile\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/users/profile\"\n },\n \"usersControllerRooms\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/my-rooms\"\n },\n \"usersControllerSearch\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/search\"\n },\n \"usersControllerToggleFollow\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/users/{followeeId}/toggle-follow\"\n },\n \"usersControllerRemoveFollower\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/users/{followerId}/remove-follower\"\n },\n \"usersControllerGetUserProfile\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/{id}\"\n },\n \"usersControllerGetUserProfile2\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/{username}/profile\"\n },\n \"usersControllerGetUserFollowers\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/{id}/followers\"\n },\n \"usersControllerGetUserFollowing\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/users/{id}/following\"\n },\n \"roomsControllerAdminsAccess\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/admins-access\"\n },\n \"roomsControllerCreateNewGroup\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/groups\"\n },\n \"roomsControllerUpdateGroup\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/rooms/groups\"\n },\n \"roomsControllerCreateNewPage\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/pages\"\n },\n \"roomsControllerUpdatePage\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/rooms/pages\"\n },\n \"roomsControllerGetRoomMembers\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}/members\"\n },\n \"roomsControllerGetClosedGroupJoinRequestStatus\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{groupId}/join-request\"\n },\n \"roomsControllerRequestToJoinClosedGroup\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{groupId}/join-request\"\n },\n \"roomsControllerCancelClosedGroupJoinRequest\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/rooms/{groupId}/join-request\"\n },\n \"roomsControllerGetPendingClosedGroupJoinRequests\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{groupId}/join-requests\"\n },\n \"roomsControllerApproveClosedGroupJoinRequest\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{groupId}/join-requests/{userId}/approve\"\n },\n \"roomsControllerRejectClosedGroupJoinRequest\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/rooms/{groupId}/join-requests/{userId}\"\n },\n \"roomsControllerInviteUserToRoom\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{id}/invite\"\n },\n \"roomsControllerAcceptInvite\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}/accept-invite\"\n },\n \"roomsControllerRejectInvite\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}/reject-invite\"\n },\n \"roomsControllerRemoveMember\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/rooms/{id}/members/{userId}\"\n },\n \"roomsControllerGetRooms\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/joined-rooms\"\n },\n \"roomsControllerGetRooms2\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/managed-rooms\"\n },\n \"roomsControllerSearchRooms\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/search\"\n },\n \"roomsControllerGetRoomProfile\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/group/{url}\"\n },\n \"roomsControllerGetRoomProfile2\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/page/{subdomain}\"\n },\n \"roomsControllerAcceptByPrivateToken\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/group/{url}/accept/{token}\"\n },\n \"roomsControllerAcceptByPrivateToken2\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/page/{subdomain}/accept/{token}\"\n },\n \"roomsControllerGetRoomProfileById\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}\"\n },\n \"roomsControllerGetRoomPosts\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/rooms/{id}/posts\"\n },\n \"roomsControllerJoinRoom\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{groupId}/join\"\n },\n \"roomsControllerLeaveGroup\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{groupId}/leave\"\n },\n \"roomsControllerFollowPage\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{pageId}/follow\"\n },\n \"roomsControllerUnfollowPage\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/rooms/{pageId}/unfollow\"\n },\n \"roomsControllerUpdatePostPrivacy\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/rooms/{roomId}/posts/{postId}/privacy\"\n },\n \"postsControllerFeed\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/feed\"\n },\n \"postsControllerGetRelatedPosts\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{postId}/related\"\n },\n \"postsControllerGetReReflections\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{postId}/re-reflections\"\n },\n \"postsControllerGetLoggedinUserPosts\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/my-posts\"\n },\n \"postsControllerGetMyPostsCountWithinRange\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/count-within-range\"\n },\n \"postsControllerGetLikedState\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{id}/liked\"\n },\n \"postsControllerFindOne\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{id}\"\n },\n \"postsControllerEdit\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/posts/{id}\"\n },\n \"postsControllerDelete\": {\n \"auth\": \"user\",\n \"method\": \"delete\",\n \"path\": \"/v1/posts/{id}\"\n },\n \"postsControllerViewTracking\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/viewed/{id}\"\n },\n \"postsControllerReadTracking\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/read/{id}\"\n },\n \"postsControllerCreate\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts\"\n },\n \"postsControllerReportAbuse\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/{id}/report\"\n },\n \"postsControllerGetUserPost\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/user-posts/{id}\"\n },\n \"postsControllerToggleLike\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/{id}/toggle-like\"\n },\n \"postsControllerToggleSave\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/{id}/toggle-save\"\n },\n \"postsControllerGetComments\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{id}/comments\"\n },\n \"postsControllerGetAllComment\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/{id}/all-comments\"\n },\n \"postsControllerExportMultiplePosts\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/posts/export/pdf\"\n },\n \"postsControllerGetPublicPostCountByVerse\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/count-by-verse/{verseId}\"\n },\n \"postsControllerGetMyPostsByVerse\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/posts/by-verse/{verseKey}\"\n },\n \"tagsControllerFind\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/tags\"\n },\n \"commentsControllerCreate\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/comments\"\n },\n \"commentsControllerEdit\": {\n \"auth\": \"user\",\n \"method\": \"patch\",\n \"path\": \"/v1/comments/{id}\"\n },\n \"commentsControllerDeleteComment\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/comments/{id}/delete\"\n },\n \"commentsControllerToggleLike\": {\n \"auth\": \"user\",\n \"method\": \"post\",\n \"path\": \"/v1/comments/{id}/toggle-like\"\n },\n \"commentsControllerGet\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/comments/{id}/replies\"\n },\n \"exploreControllerFind\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/explore\"\n },\n \"trendingHashtagsControllerFind\": {\n \"auth\": \"user\",\n \"method\": \"get\",\n \"path\": \"/v1/trending-hashtags\"\n }\n },\n \"service\": \"quranReflect\",\n \"version\": \"v1\"\n }\n },\n \"search\": {\n \"v1\": {\n \"operations\": {\n \"searchControllerSearch\": {\n \"auth\": \"app\",\n \"method\": \"get\",\n \"path\": \"/v1/search\"\n }\n },\n \"service\": \"search\",\n \"version\": \"v1\"\n }\n }\n}\n","import type { ApiService } from \"@/types\";\n\nimport operationCatalogJson from \"./specs/operation-catalog.json\";\n\nexport type HttpMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\nexport type OperationAuthMode = \"none\" | \"app\" | \"user\";\n\nexport interface OperationDefinition {\n auth: OperationAuthMode;\n method: HttpMethod;\n operationId?: string;\n operationName: string;\n path: string;\n serverUrl?: string;\n service: ApiService;\n tags: string[];\n version: string;\n}\n\nexport type CatalogOperationDefinition = Omit<\n OperationDefinition,\n \"operationName\" | \"service\" | \"tags\" | \"version\"\n> &\n Partial<\n Pick<OperationDefinition, \"operationName\" | \"service\" | \"tags\" | \"version\">\n >;\n\nexport interface ServiceOperationCatalog {\n operations: Record<string, CatalogOperationDefinition>;\n service: ApiService;\n version: string;\n}\n\ninterface OperationCatalog {\n analytics: { v1: ServiceOperationCatalog };\n auth: { v1: ServiceOperationCatalog };\n content: { v4: ServiceOperationCatalog };\n oauth2: { v1: ServiceOperationCatalog };\n quranReflect: { v1: ServiceOperationCatalog };\n search: { v1: ServiceOperationCatalog };\n}\n\nexport const operationCatalog = operationCatalogJson as OperationCatalog;\n\nexport const resolveCatalogOperation = (\n section: ServiceOperationCatalog,\n operationName: string,\n operation: CatalogOperationDefinition,\n): OperationDefinition => {\n return {\n ...operation,\n operationName: operation.operationName ?? operationName,\n service: operation.service ?? section.service,\n tags: operation.tags ?? [],\n version: operation.version ?? section.version,\n };\n};\n\nexport const getOperationByName = (\n service: ApiService,\n version: string,\n operationName: string,\n): OperationDefinition | undefined => {\n const serviceCatalog = operationCatalog[service] as\n | Record<string, ServiceOperationCatalog | undefined>\n | undefined;\n if (!serviceCatalog) {\n return undefined;\n }\n\n const versionCatalog = serviceCatalog[version];\n const operation = versionCatalog?.operations[operationName];\n if (!versionCatalog || !operation) {\n return undefined;\n }\n\n return resolveCatalogOperation(versionCatalog, operationName, operation);\n};\n","import type { OperationRequest, TokenResponse, UserSession } from \"@/types\";\n\nexport const encodeBasicAuth = (username: string, password: string): string => {\n const raw = `${username}:${password}`;\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(raw).toString(\"base64\");\n }\n\n if (typeof globalThis.btoa === \"function\") {\n return globalThis.btoa(raw);\n }\n\n throw new Error(\"No base64 encoder available for HTTP basic auth.\");\n};\n\nexport const prepareBody = (\n request: OperationRequest,\n headers: Headers,\n): string | URLSearchParams | undefined => {\n if (request.body === undefined || request.body === null) {\n return undefined;\n }\n\n if (\n typeof request.body === \"string\" ||\n request.body instanceof URLSearchParams\n ) {\n if (request.contentType) {\n headers.set(\"Content-Type\", request.contentType);\n }\n\n return request.body;\n }\n\n headers.set(\"Content-Type\", request.contentType ?? \"application/json\");\n return JSON.stringify(request.body);\n};\n\nexport const toUserSession = (\n token: TokenResponse & {\n accessToken?: string;\n expiresIn?: number;\n idToken?: string;\n refreshToken?: string;\n tokenType?: string;\n },\n currentSession?: Partial<UserSession> | null,\n): UserSession => {\n const expiresIn = token.expiresIn ?? token.expires_in;\n const accessToken = token.accessToken ?? token.access_token;\n const idToken = token.idToken ?? token.id_token ?? currentSession?.idToken;\n const refreshToken =\n token.refreshToken ?? token.refresh_token ?? currentSession?.refreshToken;\n const tokenType =\n token.tokenType ?? token.token_type ?? currentSession?.tokenType;\n const scope = token.scope ?? currentSession?.scope;\n const expiresAt = expiresIn\n ? Date.now() + expiresIn * 1000\n : currentSession?.expiresAt;\n\n return {\n accessToken,\n expiresAt,\n idToken,\n refreshToken,\n scope,\n tokenType,\n };\n};\n","import type {\n HttpMethod,\n OperationDefinition,\n ServiceOperationCatalog,\n} from \"@/generated/contracts\";\nimport { resolveCatalogOperation } from \"@/generated/contracts\";\n\nexport const HTTP_METHOD_TO_MUTATION_NAME: Record<HttpMethod, string> = {\n delete: \"remove\",\n get: \"list\",\n patch: \"update\",\n post: \"create\",\n put: \"update\",\n};\n\nexport const toCamelCase = (value: string): string => {\n const parts = value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[^A-Za-z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n\n if (parts.length === 0) {\n return \"misc\";\n }\n\n return parts\n .map((part, index) => {\n const lower = part.toLowerCase();\n if (index === 0) {\n return lower;\n }\n\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n })\n .join(\"\");\n};\n\nexport const toPascalCase = (value: string): string => {\n const camel = toCamelCase(value);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n};\n\nexport const isPathParam = (segment: string): boolean =>\n segment.startsWith(\"{\") && segment.endsWith(\"}\");\n\nexport const getResourceSegments = (path: string): string[] => {\n const segments = path.split(\"/\").filter(Boolean);\n if (segments[0]?.match(/^v\\d+$/)) {\n return segments.slice(1);\n }\n\n return segments;\n};\n\nexport const pickGeneratedMethodName = (\n operation: OperationDefinition,\n): string => {\n const resourceSegments = getResourceSegments(operation.path);\n const lastSegment = resourceSegments.at(-1);\n const literalSegments = resourceSegments.filter(\n (segment) => !isPathParam(segment),\n );\n const lastLiteral = literalSegments.at(-1);\n const groupLiteral = literalSegments[0];\n\n if (resourceSegments.length === 1) {\n return HTTP_METHOD_TO_MUTATION_NAME[operation.method];\n }\n\n if (\n resourceSegments.length === 2 &&\n lastSegment &&\n isPathParam(lastSegment)\n ) {\n if (operation.method === \"get\") {\n return \"get\";\n }\n\n if (operation.method === \"delete\") {\n return \"remove\";\n }\n\n return \"update\";\n }\n\n if (lastSegment && !isPathParam(lastSegment) && lastLiteral) {\n if (lastLiteral === groupLiteral) {\n return `${HTTP_METHOD_TO_MUTATION_NAME[operation.method]}ById`;\n }\n\n return toCamelCase(lastLiteral);\n }\n\n return toCamelCase(operation.operationName);\n};\n\nexport type RawOperation = (request?: unknown) => Promise<unknown>;\nexport type GeneratedGroup = Record<string, RawOperation>;\nexport type GeneratedGroups = Record<string, GeneratedGroup>;\n\nexport interface FetcherLike {\n request<T = unknown>(\n service: string,\n path: string,\n query?: unknown,\n request?: unknown,\n ): Promise<T>;\n requestOperation<T = unknown>(\n operation: OperationDefinition,\n request?: unknown,\n ): Promise<T>;\n getUserSession(): Promise<unknown>;\n setUserSession(session: unknown): Promise<void>;\n buildServiceUrl(service: string, path: string, query?: unknown): string;\n}\n\nexport const createRawClient = (\n fetcher: FetcherLike,\n section: ServiceOperationCatalog,\n): Record<string, RawOperation> => {\n const rawOperations: Record<string, RawOperation> = {};\n\n for (const [operationName, operation] of Object.entries(section.operations)) {\n const resolvedOperation = resolveCatalogOperation(\n section,\n operationName,\n operation,\n );\n\n rawOperations[operationName] = (request?: unknown) =>\n fetcher.requestOperation(resolvedOperation, request);\n }\n\n return rawOperations;\n};\n\nexport const createGeneratedGroups = (\n section: ServiceOperationCatalog,\n rawOperations: Record<string, RawOperation>,\n): GeneratedGroups => {\n const groups: GeneratedGroups = {};\n\n for (const [operationName, operation] of Object.entries(section.operations)) {\n const resolvedOperation = resolveCatalogOperation(\n section,\n operationName,\n operation,\n );\n const literals = getResourceSegments(resolvedOperation.path).filter(\n (segment) => !isPathParam(segment),\n );\n const groupName = toCamelCase(literals[0] ?? \"misc\");\n const suggestedName = pickGeneratedMethodName(resolvedOperation);\n const currentGroup = groups[groupName] ?? {};\n let methodName = suggestedName;\n\n if (currentGroup[methodName]) {\n methodName = `${suggestedName}${toPascalCase(operationName)}`;\n }\n\n currentGroup[methodName] = rawOperations[operationName]!;\n groups[groupName] = currentGroup;\n }\n\n return groups;\n};\n","import type { ApiParams } from \"@/types\";\nimport humps from \"humps\";\n\nconst { decamelize } = humps;\n\nexport const ensureLeadingSlash = (value: string): string =>\n value.startsWith(\"/\") ? value : `/${value}`;\n\nexport const removeTrailingSlash = (value: string): string =>\n value.endsWith(\"/\") ? value.slice(0, -1) : value;\n\nexport const removeBeginningSlash = (url: string) => {\n return url.startsWith(\"/\") ? url.slice(1) : url;\n};\n\nexport const replacePathParams = (\n path: string,\n params?: Record<string, string | number>,\n): string => {\n return path.replace(/\\{([^}]+)\\}/g, (_match: string, rawKey: string) => {\n const value = params?.[rawKey];\n if (value === undefined) {\n throw new Error(`Missing path parameter: ${rawKey}`);\n }\n\n return encodeURIComponent(String(value));\n });\n};\n\nexport const normalizePathTemplate = (path: string): string =>\n path.replace(/(^|\\/):([A-Za-z0-9_]+)/g, \"$1{$2}\");\n\ninterface ParamsToStringOptions {\n preserveCase?: boolean;\n}\n\nconst fieldsKey = [\"wordFields\", \"translationFields\", \"fields\"] as const;\nconst fieldsKeySet = new Set<string>([\n ...fieldsKey,\n ...fieldsKey.map((key) => decamelize(key)),\n]);\nconst preservedKeys = new Set([\n \"navigationalResultsNumber\",\n \"pageSize\",\n \"versesResultsNumber\",\n]);\n\nexport const paramsToString = (\n params?: ApiParams,\n options: ParamsToStringOptions = {},\n): string => {\n if (!params) return \"\";\n\n const paramsString = new URLSearchParams();\n\n for (const [rawKey, rawValue] of Object.entries(params)) {\n if (rawValue === undefined) continue;\n\n const key =\n options.preserveCase || preservedKeys.has(rawKey)\n ? rawKey\n : decamelize(rawKey);\n\n // fields is a special case, it's an object with boolean values\n if (fieldsKeySet.has(rawKey) || fieldsKeySet.has(key)) {\n const fields = Object.entries(rawValue as Record<string, boolean>)\n .filter(([, value]) => value)\n .map(([fieldKey]) => decamelize(fieldKey));\n if (fields.length > 0) {\n paramsString.set(key, fields.join(\",\"));\n }\n continue;\n }\n\n if (typeof rawValue === \"string\") {\n paramsString.set(key, rawValue);\n } else if (typeof rawValue === \"number\") {\n paramsString.set(key, rawValue.toString());\n } else if (typeof rawValue === \"boolean\") {\n paramsString.set(key, rawValue.toString());\n } else if (Array.isArray(rawValue)) {\n paramsString.set(key, rawValue.join(\",\"));\n }\n }\n\n if (paramsString.size === 0) return \"\";\n return `?${paramsString.toString()}`;\n};\n","import type {\n AnalyticsBatchAccepted,\n AnalyticsBatchRequest,\n AnalyticsEvent,\n OperationRequest,\n} from \"@/types\";\n\ntype RawOperation = (request?: OperationRequest) => Promise<unknown>;\n\nconst optionalField = <T>(value: T | undefined, key: string) =>\n value === undefined ? {} : { [key]: value };\n\nconst toAnalyticsEventBody = (event: AnalyticsEvent) => ({\n event_id: event.eventId,\n name: event.name,\n occurred_at:\n event.occurredAt instanceof Date\n ? event.occurredAt.toISOString()\n : event.occurredAt,\n version: event.version,\n ...optionalField(event.actionId, \"action_id\"),\n ...optionalField(event.anonymousId, \"anonymous_id\"),\n ...optionalField(event.properties, \"properties\"),\n ...optionalField(event.sessionId, \"session_id\"),\n ...optionalField(event.userId, \"user_id\"),\n});\n\nexport const createAnalyticsFacade = (raw: Record<string, RawOperation>) => ({\n events: {\n submit: (request: AnalyticsBatchRequest) =>\n raw.submitAnalyticsEvents!({\n body: {\n events: request.events.map(toAnalyticsEventBody),\n },\n }) as Promise<AnalyticsBatchAccepted>,\n },\n raw,\n});\n","import type {\n ApiParams,\n AppStateBootstrapPage,\n AppStateChangesOptions,\n AppStateChangesPage,\n AppStateConfiguration,\n AppStateDocument,\n AppStateJsonValue,\n AppStateMutationOptions,\n AppStateMutationResult,\n AppStatePage,\n AppStatePageOptions,\n AppStatePutBody,\n AppStateResponse,\n AppStateSuccess,\n AppStateTransport,\n HTTPMethod,\n OperationRequest,\n} from \"@/types\";\nimport { replacePathParams } from \"@/lib/url\";\n\ninterface AppStateFetcher {\n request<T>(\n service: \"auth\",\n path: string,\n query?: ApiParams,\n request?: OperationRequest,\n ): Promise<T>;\n}\n\nconst documentPath = (collection: string, key: string): string =>\n replacePathParams(\"/v1/app-state/{collection}/{key}\", { collection, key });\n\nconst mutationHeaders = (\n options: AppStateMutationOptions,\n): Readonly<Record<string, string>> => {\n const { idempotencyKey, ifMatch, ifNoneMatch } = options as {\n idempotencyKey: string;\n ifMatch?: string;\n ifNoneMatch?: string;\n };\n if (ifMatch !== undefined && ifNoneMatch !== undefined) {\n throw new Error(\n \"App State mutations accept only one of ifMatch or ifNoneMatch.\",\n );\n }\n\n return Object.freeze({\n \"Idempotency-Key\": idempotencyKey,\n ...(ifMatch === undefined ? {} : { \"If-Match\": ifMatch }),\n ...(ifNoneMatch === undefined ? {} : { \"If-None-Match\": ifNoneMatch }),\n });\n};\n\nconst snapshotPutBody = (body: AppStatePutBody): AppStatePutBody => {\n const snapshot = JSON.parse(JSON.stringify(body)) as AppStatePutBody;\n\n const freezeJson = (value: AppStatePutBody | AppStateJsonValue): void => {\n if (typeof value !== \"object\" || value === null) {\n return;\n }\n\n Object.freeze(value);\n for (const child of Object.values(value)) {\n freezeJson(child as AppStateJsonValue);\n }\n };\n\n freezeJson(snapshot);\n return snapshot;\n};\n\nexport const createAppStateFacade = (\n fetcher: AppStateFetcher,\n): AppStateTransport => {\n const request = <T>(\n method: HTTPMethod,\n path: string,\n query?: ApiParams,\n options: OperationRequest = {},\n ) =>\n fetcher.request<T>(\"auth\", path, query, {\n ...options,\n auth: \"user\",\n method,\n preserveResponseKeys: true,\n });\n\n const requestWithEtag = async <T>(\n method: HTTPMethod,\n path: string,\n options: OperationRequest = {},\n ): Promise<AppStateResponse<T>> => {\n let etag: string | null = null;\n let status = 0;\n const body = await request<AppStateSuccess<T>>(method, path, undefined, {\n ...options,\n onResponse: (metadata) => {\n etag = metadata.headers.get(\"etag\");\n status = metadata.status;\n },\n });\n\n return { ...body, etag, status };\n };\n\n return {\n bootstrap: (options: AppStatePageOptions = {}) =>\n request<AppStateSuccess<AppStateBootstrapPage>>(\n \"GET\",\n \"/v1/app-state:bootstrap\",\n options,\n ),\n deleteDocument: async (\n collection: string,\n key: string,\n options: AppStateMutationOptions,\n ) => {\n await request<void>(\"DELETE\", documentPath(collection, key), undefined, {\n headers: mutationHeaders(options),\n });\n },\n getChanges: (since: string, options: AppStateChangesOptions = {}) =>\n request<AppStateSuccess<AppStateChangesPage>>(\n \"GET\",\n \"/v1/app-state:changes\",\n { ...options, since },\n ),\n getConfiguration: () =>\n request<AppStateSuccess<AppStateConfiguration>>(\n \"GET\",\n \"/v1/app-state:config\",\n ),\n getDocument: (collection: string, key: string) =>\n requestWithEtag<AppStateDocument>(\"GET\", documentPath(collection, key)),\n listDocuments: (collection: string, options: AppStatePageOptions = {}) =>\n request<AppStateSuccess<AppStatePage>>(\n \"GET\",\n replacePathParams(\"/v1/app-state/{collection}\", { collection }),\n options,\n ),\n putDocument: async (\n collection: string,\n key: string,\n body: AppStatePutBody,\n options: AppStateMutationOptions,\n ) => {\n const headers = mutationHeaders(options);\n const snapshot = snapshotPutBody(body);\n return requestWithEtag<AppStateMutationResult>(\n \"PUT\",\n documentPath(collection, key),\n {\n body: snapshot as unknown as Record<string, unknown>,\n headers,\n },\n );\n },\n };\n};\n","import type {\n ApiParams,\n CreateQuranReflectPostPayload,\n OperationRequest,\n QuranReflectPost,\n QuranReflectPostMutationResponse,\n UpdateQuranReflectPostPayload,\n} from \"@/types\";\n\ntype RawOperation = (request?: OperationRequest) => Promise<unknown>;\ntype GeneratedGroup = Record<string, RawOperation>;\n\nexport type QuranReflectPostCreateOperationRequest = Omit<\n OperationRequest,\n \"body\"\n> & {\n body: {\n post: CreateQuranReflectPostPayload;\n };\n};\n\nexport type QuranReflectPostUpdateOperationRequest = Omit<\n OperationRequest,\n \"body\" | \"path\"\n> & {\n body: UpdateQuranReflectPostPayload;\n path: {\n id: string | number;\n };\n};\n\nexport type QuranReflectPostGetOperationRequest = Omit<\n OperationRequest,\n \"path\"\n> & {\n path: {\n id: string | number;\n };\n};\n\ntype CreateQuranReflectPost = {\n (\n payload: CreateQuranReflectPostPayload,\n ): Promise<QuranReflectPostMutationResponse>;\n (\n request: QuranReflectPostCreateOperationRequest,\n ): Promise<QuranReflectPostMutationResponse>;\n (request?: OperationRequest): Promise<unknown>;\n};\n\ntype UpdateQuranReflectPost = {\n (\n id: string | number,\n payload: UpdateQuranReflectPostPayload,\n ): Promise<QuranReflectPostMutationResponse>;\n (\n request: QuranReflectPostUpdateOperationRequest,\n ): Promise<QuranReflectPostMutationResponse>;\n (request?: OperationRequest): Promise<unknown>;\n};\n\ntype GetQuranReflectPost = {\n (id: string | number, query?: ApiParams): Promise<QuranReflectPost>;\n (request: QuranReflectPostGetOperationRequest): Promise<QuranReflectPost>;\n (request?: OperationRequest): Promise<unknown>;\n};\n\nexport type QuranReflectPostsFacade = GeneratedGroup & {\n create: CreateQuranReflectPost;\n get: GetQuranReflectPost;\n update: UpdateQuranReflectPost;\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst isCreatePayload = (value: unknown): value is CreateQuranReflectPostPayload => {\n if (!isObject(value)) {\n return false;\n }\n\n return (\n typeof value[\"body\"] === \"string\" &&\n typeof value[\"draft\"] === \"boolean\" &&\n Array.isArray(value[\"references\"]) &&\n Array.isArray(value[\"mentions\"])\n );\n};\n\nexport const createQuranReflectPostsFacade = (\n generatedPosts: GeneratedGroup,\n request: (\n method: \"GET\" | \"PATCH\" | \"POST\",\n path: string,\n operationRequest?: OperationRequest,\n ) => Promise<unknown>,\n): QuranReflectPostsFacade => {\n const create: CreateQuranReflectPost = ((\n payloadOrRequest:\n | CreateQuranReflectPostPayload\n | QuranReflectPostCreateOperationRequest,\n ) => {\n if (isCreatePayload(payloadOrRequest)) {\n return request(\"POST\", \"/v1/posts\", {\n body: {\n post: payloadOrRequest,\n },\n }) as Promise<QuranReflectPostMutationResponse>;\n }\n\n return request(\"POST\", \"/v1/posts\", payloadOrRequest) as Promise<\n QuranReflectPostMutationResponse\n >;\n }) as CreateQuranReflectPost;\n\n const update: UpdateQuranReflectPost = ((\n idOrRequest: string | number | QuranReflectPostUpdateOperationRequest,\n payload?: UpdateQuranReflectPostPayload,\n ) => {\n if (payload !== undefined) {\n return request(\"PATCH\", \"/v1/posts/{id}\", {\n body: payload,\n path: { id: idOrRequest as string | number },\n }) as Promise<QuranReflectPostMutationResponse>;\n }\n\n return request(\n \"PATCH\",\n \"/v1/posts/{id}\",\n idOrRequest as QuranReflectPostUpdateOperationRequest,\n ) as Promise<QuranReflectPostMutationResponse>;\n }) as UpdateQuranReflectPost;\n\n const get: GetQuranReflectPost = ((\n idOrRequest: string | number | QuranReflectPostGetOperationRequest,\n query?: ApiParams,\n ) => {\n if (typeof idOrRequest === \"string\" || typeof idOrRequest === \"number\") {\n return request(\"GET\", \"/v1/posts/{id}\", {\n path: { id: idOrRequest },\n query,\n }) as Promise<QuranReflectPost>;\n }\n\n return request(\"GET\", \"/v1/posts/{id}\", idOrRequest) as Promise<\n QuranReflectPost\n >;\n }) as GetQuranReflectPost;\n\n return {\n ...generatedPosts,\n create,\n get,\n update,\n };\n};\n","import type { ChapterId } from \"../types\";\n\n/**\n * Validates chapter id\n * @param id chapter id\n * @example\n * isValidChapterId('1') // true\n * isValidChapterId('114') // true\n * isValidChapterId('0') // false\n * isValidChapterId('-1') // false\n * isValidChapterId('200') // false\n */\nexport const isValidChapterId = (id: string | number): id is ChapterId => {\n const parsedId = typeof id === \"number\" ? id : Number(id);\n if (!parsedId || parsedId <= 0 || parsedId > 114) return false;\n return true;\n};\n","import type { JuzNumber } from \"../types\";\n\n/**\n * Validates juz number\n * @param juz juz number\n * @example\n * isValidJuz('1') // true\n * isValidJuz('30') // true\n * isValidJuz('0') // false\n * isValidJuz('-1') // false\n * isValidJuz('200') // false\n */\nexport const isValidJuz = (juz: string | number): juz is JuzNumber => {\n const parsedJuz = typeof juz === \"number\" ? juz : Number(juz);\n if (!parsedJuz || parsedJuz <= 0 || parsedJuz > 30) return false;\n return true;\n};\n","import type { RubNumber } from \"../types\";\n\n/**\n * Validates rub number\n * @param rub rub number\n * @example\n * isValidRub('1') // true\n * isValidRub('240') // true\n * isValidRub('0') // false\n * isValidRub('-1') // false\n * isValidRub('300') // false\n */\nexport const isValidRub = (rub: string | number): rub is RubNumber => {\n const parsedRub = typeof rub === \"number\" ? rub : Number(rub);\n if (!parsedRub || parsedRub <= 0 || parsedRub > 240) return false;\n return true;\n};\n","import type { HizbNumber } from \"../types\";\n\n/**\n * Validates hizb number\n * @param hizb hizb number\n * @example\n * isValidHizb('1') // true\n * isValidHizb('60') // true\n * isValidHizb('0') // false\n * isValidHizb('-1') // false\n * isValidHizb('200') // false\n */\nexport const isValidHizb = (hizb: string | number): hizb is HizbNumber => {\n const parsedHizb = typeof hizb === \"number\" ? hizb : Number(hizb);\n if (!parsedHizb || parsedHizb <= 0 || parsedHizb > 60) return false;\n return true;\n};\n","import type { PageNumber } from \"../types\";\n\n/**\n * Validates mushaf page number\n * @param page mushaf page number\n * @example\n * isValidQuranPage('1') // true\n * isValidQuranPage('604') // true\n * isValidQuranPage('0') // false\n * isValidQuranPage('-1') // false\n * isValidQuranPage('1000') // false\n */\nexport const isValidQuranPage = (page: string | number): page is PageNumber => {\n const parsedPage = typeof page === \"number\" ? page : Number(page);\n if (!parsedPage || parsedPage <= 0 || parsedPage > 604) return false;\n return true;\n};\n","/**\n * Maps chapter number to verse count\n */\nexport const versesMapping = {\n 1: 7,\n 2: 286,\n 3: 200,\n 4: 176,\n 5: 120,\n 6: 165,\n 7: 206,\n 8: 75,\n 9: 129,\n 10: 109,\n 11: 123,\n 12: 111,\n 13: 43,\n 14: 52,\n 15: 99,\n 16: 128,\n 17: 111,\n 18: 110,\n 19: 98,\n 20: 135,\n 21: 112,\n 22: 78,\n 23: 118,\n 24: 64,\n 25: 77,\n 26: 227,\n 27: 93,\n 28: 88,\n 29: 69,\n 30: 60,\n 31: 34,\n 32: 30,\n 33: 73,\n 34: 54,\n 35: 45,\n 36: 83,\n 37: 182,\n 38: 88,\n 39: 75,\n 40: 85,\n 41: 54,\n 42: 53,\n 43: 89,\n 44: 59,\n 45: 37,\n 46: 35,\n 47: 38,\n 48: 29,\n 49: 18,\n 50: 45,\n 51: 60,\n 52: 49,\n 53: 62,\n 54: 55,\n 55: 78,\n 56: 96,\n 57: 29,\n 58: 22,\n 59: 24,\n 60: 13,\n 61: 14,\n 62: 11,\n 63: 11,\n 64: 18,\n 65: 12,\n 66: 12,\n 67: 30,\n 68: 52,\n 69: 52,\n 70: 44,\n 71: 28,\n 72: 28,\n 73: 20,\n 74: 56,\n 75: 40,\n 76: 31,\n 77: 50,\n 78: 40,\n 79: 46,\n 80: 42,\n 81: 29,\n 82: 19,\n 83: 36,\n 84: 25,\n 85: 22,\n 86: 17,\n 87: 19,\n 88: 26,\n 89: 30,\n 90: 20,\n 91: 15,\n 92: 21,\n 93: 11,\n 94: 8,\n 95: 8,\n 96: 19,\n 97: 5,\n 98: 8,\n 99: 8,\n 100: 11,\n 101: 11,\n 102: 8,\n 103: 3,\n 104: 9,\n 105: 5,\n 106: 4,\n 107: 7,\n 108: 3,\n 109: 6,\n 110: 3,\n 111: 5,\n 112: 4,\n 113: 5,\n 114: 6,\n} as const satisfies Record<number, number>;\n","import type { ChapterId, VerseKey } from \"../types\";\nimport { isValidChapterId } from \"./is-valid-chapter-id\";\nimport { versesMapping } from \"./verses-mapping\";\n\n/**\n * Validates verse key\n * @param key colon separated verse key (chapter:verse)\n * @example\n * isValidVerseKey('1:1') // true\n * isValidVerseKey('30:1') // true\n * isValidVerseKey('0') // false\n * isValidVerseKey('1:-') // false\n * isValidVerseKey('1_1') // false\n */\nexport const isValidVerseKey = (key: string): key is VerseKey => {\n const [chapterId, verseId] = key.trim().split(\":\");\n if (!chapterId || !verseId || !isValidChapterId(chapterId)) return false;\n\n const parsedVerse = Number(verseId);\n const verseCount = versesMapping[chapterId as ChapterId];\n if (!parsedVerse || parsedVerse <= 0 || parsedVerse > verseCount)\n return false;\n\n return true;\n};\n","import type {\n AnswerCountWithinRangeResponse,\n AnswerQuestion,\n AnswersByAyahResponse,\n BaseApiParams,\n QuranFetchClient,\n VerseKey,\n} from \"@/types\";\nimport { isValidVerseKey } from \"@/utils\";\n\ntype GetAnswersByAyahOptions = BaseApiParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype CountAnswersWithinRangeOptions = BaseApiParams;\n\nconst normalizeAnswerCountWithinRangeResponse = (\n response: AnswerCountWithinRangeResponse,\n): AnswerCountWithinRangeResponse => {\n return Object.fromEntries(\n Object.entries(response).map(([verseKey, count]) => {\n if (!count.types) return [verseKey, count];\n\n return [\n verseKey,\n {\n ...count,\n types: Object.fromEntries(\n Object.entries(count.types).map(([type, value]) => [\n type.toUpperCase(),\n value,\n ]),\n ),\n },\n ];\n }),\n );\n};\n\n/**\n * Quran answers API methods.\n */\nexport class QuranAnswers {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get published answer questions linked to a specific ayah.\n * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"2:255\")\n * @param {GetAnswersByAyahOptions} options\n * @example\n * client.answers.findByAyah(\"2:255\", { page: 1, pageSize: 2 })\n */\n async findByAyah(\n key: VerseKey,\n options?: GetAnswersByAyahOptions,\n ): Promise<AnswersByAyahResponse> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n return this.fetcher.fetch<AnswersByAyahResponse>(\n `/content/api/v4/answers/by_ayah/${key}`,\n options,\n );\n }\n\n /**\n * Get a published answer question by id.\n * @param {string | number} questionId question id\n * @example\n * client.answers.findByQuestionId(\"988\")\n */\n async findByQuestionId(\n questionId: string | number,\n ): Promise<AnswerQuestion> {\n return this.fetcher.fetch<AnswerQuestion>(\n `/content/api/v4/answers/${questionId}`,\n );\n }\n\n /**\n * Get a verse-key to answer-count map within an inclusive ayah range.\n * @param {VerseKey} from start verse key in format \"chapter:verse\"\n * @param {VerseKey} to end verse key in format \"chapter:verse\"\n * @param {CountAnswersWithinRangeOptions} options\n * @example\n * client.answers.countWithinRange(\"2:255\", \"2:256\")\n */\n async countWithinRange(\n from: VerseKey,\n to: VerseKey,\n options?: CountAnswersWithinRangeOptions,\n ): Promise<AnswerCountWithinRangeResponse> {\n if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n throw new Error(\"Invalid verse key\");\n }\n\n const response = await this.fetcher.fetch<AnswerCountWithinRangeResponse>(\n \"/content/api/v4/answers/count_within_range\",\n {\n ...options,\n from,\n to,\n },\n );\n\n return normalizeAnswerCountWithinRangeResponse(response);\n }\n}\n","import type {\n BaseApiParams,\n ChapterId,\n ChapterRecitation,\n NormalizedVerseRecitation,\n Pagination,\n QuranFetchClient,\n VerseKey,\n VerseRecitation,\n VerseRecitationField,\n} from \"@/types\";\nimport { isValidChapterId, isValidVerseKey } from \"@/utils\";\n\ntype GetChapterRecitationOptions = BaseApiParams;\n\ntype GetVerseRecitationOptions = BaseApiParams & {\n fields?: Partial<Record<VerseRecitationField, boolean>>;\n};\n\ntype RawVerseRecitation = Omit<VerseRecitation, \"audioUrl\">;\n\n/**\n * Base URL for verse audio files from Quran.com\n * Used to convert relative paths to absolute URLs\n */\nconst AUDIO_BASE_URL = \"https://verses.quran.com\";\n\n/**\n * Normalize verse recitation data by adding absolute audioUrl\n * The API returns relative paths in the 'url' field, but we want\n * to provide absolute URLs for consistency with chapter recitations\n */\nfunction normalizeVerseRecitations(\n audioFiles: RawVerseRecitation[],\n): NormalizedVerseRecitation[] {\n return audioFiles.map((file) => {\n // If url is already absolute, use it; otherwise prepend the base URL\n const absoluteUrl =\n file.url.startsWith(\"http://\") || file.url.startsWith(\"https://\")\n ? file.url\n : `${AUDIO_BASE_URL}/${file.url.replace(/^\\/+/, \"\")}`;\n\n return {\n ...file,\n audioUrl: absoluteUrl,\n };\n });\n}\n\n/**\n * Audio API methods\n */\nexport class QuranAudio {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get all chapter recitations for specific reciter\n * @param {string} reciterId\n * @param {GetChapterRecitationOptions} options\n * @example\n * client.audio.findAllChapterRecitations('2')\n */\n async findAllChapterRecitations(\n reciterId: string,\n options?: GetChapterRecitationOptions,\n ): Promise<ChapterRecitation[]> {\n const { audioFiles } = await this.fetcher.fetch<{\n audioFiles: ChapterRecitation[];\n }>(`/content/api/v4/chapter_recitations/${reciterId}`, options);\n\n return audioFiles;\n }\n\n /**\n * Get a specific chapter recitation by reciter and chapter\n * @param {string} reciterId\n * @param {ChapterId} chapterId\n * @param {GetChapterRecitationOptions} options\n * @example\n * client.audio.findChapterRecitationById('2', '1')\n */\n async findChapterRecitationById(\n reciterId: string,\n chapterId: ChapterId,\n options?: GetChapterRecitationOptions,\n ): Promise<ChapterRecitation> {\n if (!isValidChapterId(chapterId)) throw new Error(\"Invalid chapter id\");\n\n const { audioFile } = await this.fetcher.fetch<{\n audioFile: ChapterRecitation;\n }>(\n `/content/api/v4/chapter_recitations/${reciterId}/${chapterId}`,\n options,\n );\n\n return audioFile;\n }\n\n /**\n * Get verse recitations by chapter\n * @param {ChapterId} chapterId\n * @param {string} recitationId\n * @param {GetVerseRecitationOptions} options\n * @example\n * client.audio.findVerseRecitationsByChapter('1', '2')\n */\n async findVerseRecitationsByChapter(\n chapterId: ChapterId,\n recitationId: string,\n options?: GetVerseRecitationOptions,\n ): Promise<{\n audioFiles: NormalizedVerseRecitation[];\n pagination: Pagination;\n }> {\n if (!isValidChapterId(chapterId)) throw new Error(\"Invalid chapter id\");\n\n const data = await this.fetcher.fetch<{\n audioFiles: RawVerseRecitation[];\n pagination: Pagination;\n }>(\n `/content/api/v4/recitations/${recitationId}/by_chapter/${chapterId}`,\n options,\n );\n\n return {\n ...data,\n audioFiles: normalizeVerseRecitations(data.audioFiles),\n };\n }\n\n /**\n * Get verse recitations by verse key\n * @param {VerseKey} key\n * @param {string} recitationId\n * @param {GetVerseRecitationOptions} options\n * @example\n * client.audio.findVerseRecitationsByKey('1:1', '2')\n */\n async findVerseRecitationsByKey(\n key: VerseKey,\n recitationId: string,\n options?: GetVerseRecitationOptions,\n ): Promise<{\n audioFiles: NormalizedVerseRecitation[];\n pagination: Pagination;\n }> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n const data = await this.fetcher.fetch<{\n audioFiles: RawVerseRecitation[];\n pagination: Pagination;\n }>(`/content/api/v4/recitations/${recitationId}/by_ayah/${key}`, options);\n\n return {\n ...data,\n audioFiles: normalizeVerseRecitations(data.audioFiles),\n };\n }\n}\n","import type {\n BaseApiParams,\n Chapter,\n ChapterId,\n ChapterInfo,\n ChapterInfoResponse,\n QuranFetchClient,\n} from \"@/types\";\nimport { isValidChapterId } from \"@/utils\";\n\ntype GetChapterOptions = BaseApiParams;\ntype GetChapterInfoOptions = BaseApiParams & {\n resourceId?: string | number;\n includeResources?: boolean;\n};\n\n/**\n * Chapters API methods\n */\nexport class QuranChapters {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get all chapters.\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/list-chapters\n * @param {GetChapterOptions} options\n * @example\n * client.chapters.findAll()\n */\n async findAll(options?: GetChapterOptions): Promise<Chapter[]> {\n const { chapters } = await this.fetcher.fetch<{ chapters: Chapter[] }>(\n \"/content/api/v4/chapters\",\n options,\n );\n\n return chapters;\n }\n\n /**\n * Get chapter by id.\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter\n * @param {ChapterId} id chapter id, minimum 1, maximum 114\n * @param {GetChapterOptions} options\n * @example\n * client.chapters.findById('1')\n * client.chapters.findById('114')\n */\n async findById(id: ChapterId, options?: GetChapterOptions): Promise<Chapter> {\n if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n const { chapter } = await this.fetcher.fetch<{ chapter: Chapter }>(\n `/content/api/v4/chapters/${id}`,\n options,\n );\n\n return chapter;\n }\n\n /**\n * Get chapter info by id.\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter-info\n * @param {ChapterId} id chapter id, minimum 1, maximum 114\n * @param {GetChapterInfoOptions} options\n * @example\n * client.chapters.findInfoById('1')\n * client.chapters.findInfoById('114')\n */\n async findInfoById(\n id: ChapterId,\n options?: GetChapterInfoOptions,\n ): Promise<ChapterInfo | null> {\n const { chapterInfo } = await this.findInfoResponseById(id, options);\n\n return chapterInfo;\n }\n\n /**\n * Get the full chapter info response, including available resources when requested.\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter-info\n * @param {ChapterId} id chapter id, minimum 1, maximum 114\n * @param {GetChapterInfoOptions} options\n * @example\n * client.chapters.findInfoResponseById('1', { includeResources: true })\n * client.chapters.findInfoResponseById('1', { resourceId: 'en-tafsir-ibn-ashur' })\n */\n async findInfoResponseById(\n id: ChapterId,\n options?: GetChapterInfoOptions,\n ): Promise<ChapterInfoResponse> {\n if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n return this.fetcher.fetch<ChapterInfoResponse>(\n `/content/api/v4/chapters/${id}/info`,\n options,\n );\n }\n}\n","export const retry = async <T>(\n fn: () => Promise<T>,\n options: { retries: number } = { retries: 3 },\n): Promise<T> => {\n let lastError: Error;\n\n for (let i = 0; i <= options.retries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (i === options.retries) {\n throw lastError;\n }\n\n // Simple exponential backoff\n await new Promise((resolve) =>\n setTimeout(resolve, Math.pow(2, i) * 1000),\n );\n }\n }\n\n throw lastError!;\n};\n","const readErrorPayload = async (response: Response): Promise<unknown> => {\n try {\n const body = await response.text();\n if (!body) {\n return undefined;\n }\n\n if (response.headers.get(\"content-type\")?.toLowerCase().includes(\"json\")) {\n try {\n return JSON.parse(body) as unknown;\n } catch {\n return body;\n }\n }\n\n return body;\n } catch {\n return undefined;\n }\n};\n\nexport interface QuranHttpError extends Error {\n readonly headers: Headers;\n readonly payload: unknown;\n readonly status: number;\n}\n\nconst QuranHttpErrorClass = class QuranHttpError\n extends Error\n implements QuranHttpError\n{\n public readonly headers: Headers;\n public readonly payload: unknown;\n public readonly status: number;\n\n private constructor(response: Response, payload: unknown) {\n super(`${response.status} ${response.statusText}`);\n this.name = \"QuranHttpError\";\n this.headers = new Headers(response.headers);\n this.payload = payload;\n this.status = response.status;\n }\n\n public static async fromResponse(\n response: Response,\n ): Promise<QuranHttpError> {\n return new QuranHttpError(response, await readErrorPayload(response));\n }\n};\n\ntype QuranHttpErrorConstructor = typeof QuranHttpErrorClass;\n\nObject.defineProperty(QuranHttpErrorClass, \"name\", {\n configurable: true,\n value: \"QuranHttpError\",\n});\n\nconst QURAN_HTTP_ERROR_CONSTRUCTOR = Symbol.for(\n \"@quranjs/api/QuranHttpError/v1\",\n);\nconst constructorRegistry = globalThis as typeof globalThis & {\n [QURAN_HTTP_ERROR_CONSTRUCTOR]?: QuranHttpErrorConstructor;\n};\n\nexport const QuranHttpError: QuranHttpErrorConstructor =\n constructorRegistry[QURAN_HTTP_ERROR_CONSTRUCTOR] ?? QuranHttpErrorClass;\n\nconstructorRegistry[QURAN_HTTP_ERROR_CONSTRUCTOR] = QuranHttpError;\n","export const API_BASE_URL = \"https://apis.quran.foundation\";\n\nexport const DEFAULT_BASE_URLS = {\n analytics: \"https://apis.quran.foundation/analytics\",\n auth: \"https://apis.quran.foundation/auth\",\n content: \"https://apis.quran.foundation/content\",\n oauth2: \"https://oauth2.quran.foundation\",\n quranReflect: \"https://apis.quran.foundation/quran-reflect\",\n search: \"https://apis.quran.foundation/search\",\n} as const;\n\nexport const DIRECT_PATH_PREFIX = {\n analytics: \"/v1\",\n auth: \"/v1\",\n content: \"/api/v4\",\n oauth2: \"\",\n quranReflect: \"/v1\",\n search: \"/v1\",\n} as const;\n\nexport const GATEWAY_PATH_PREFIX = {\n analytics: \"/analytics/v1\",\n auth: \"/auth/v1\",\n content: \"/content/api/v4\",\n oauth2: \"\",\n quranReflect: \"/quran-reflect/v1\",\n search: \"/search/v1\",\n} as const;\n\nexport const LEGACY_PREFIXES = {\n analytics: [\"/analytics/v1\", \"/v1\"] as const,\n auth: [\"/auth/v1\", \"/v1\"] as const,\n content: [\"/content/api/v4\", \"/api/v4\"] as const,\n oauth2: [] as const,\n quranReflect: [\"/quran-reflect/v1\", \"/v1\"] as const,\n search: [\"/search/v1\", \"/v1\"] as const,\n} as const;\n","import type { OperationDefinition } from \"@/generated/contracts\";\nimport type {\n ApiParams,\n ApiService,\n CachedToken,\n CustomFetcher,\n OperationRequest,\n PublicClientConfig,\n RuntimeMode,\n ServerClientConfig,\n TokenResponse,\n UserSession,\n} from \"@/types\";\nimport { encodeBasicAuth, prepareBody, toUserSession } from \"@/lib/http-utils\";\nimport { retry } from \"@/lib/retry\";\nimport { QuranHttpError } from \"@/sdk/http-error\";\nimport {\n API_BASE_URL,\n DEFAULT_BASE_URLS,\n DIRECT_PATH_PREFIX,\n GATEWAY_PATH_PREFIX,\n LEGACY_PREFIXES,\n} from \"@/lib/service-config\";\nimport {\n ensureLeadingSlash,\n normalizePathTemplate,\n paramsToString,\n removeTrailingSlash,\n replacePathParams,\n} from \"@/lib/url\";\nimport humps from \"humps\";\n\nconst { camelizeKeys } = humps;\n\ntype RuntimeClientConfig = PublicClientConfig | ServerClientConfig;\n\nconst APP_SERVICE_SCOPES: Partial<Record<ApiService, string>> = {\n analytics: \"analytics.events.write\",\n content: \"content\",\n search: \"search\",\n};\nconst QURAN_REFLECT_POSTS_PATH_PREFIX = \"/quran-reflect/v1/posts/\";\nconst QURAN_REFLECT_COMMENT_PATH_SUFFIXES = [\n \"/comments\",\n \"/all-comments\",\n] as const;\nconst GATEWAY_SERVICES = [\n \"analytics\",\n \"auth\",\n \"content\",\n \"quranReflect\",\n \"search\",\n] as const satisfies readonly ApiService[];\n\nconst USER_SESSION_EXPIRED_MESSAGE = \"User session expired. Sign in again.\";\nconst REFRESH_TOKEN_REJECTION_ERROR = \"invalid_grant\";\nconst USER_SESSION_REFRESH_WINDOW_MS = 60_000;\n\nconst readResponseBody = async (response: Response): Promise<string> => {\n try {\n return await response.text();\n } catch {\n return \"\";\n }\n};\n\nconst isRefreshTokenRejection = (\n response: Response,\n responseBody: string,\n): boolean => {\n if (\n response.status < 400 ||\n response.status >= 500 ||\n response.status === 429\n ) {\n return false;\n }\n\n return responseBody.toLowerCase().includes(REFRESH_TOKEN_REJECTION_ERROR);\n};\n\nconst formatRefreshFailureMessage = (\n response: Response,\n responseBody: string,\n): string => {\n const body = responseBody.trim();\n const details = body ? `: ${body}` : \"\";\n\n return `Token refresh failed: ${response.status} ${response.statusText}${details}`;\n};\n\nexport class QuranFetcher {\n private appTokens = new Map<string, CachedToken>();\n private userSession: UserSession | null | undefined;\n private userSessionRefreshPromise: Promise<UserSession> | null = null;\n\n constructor(\n private readonly mode: RuntimeMode,\n private readonly config: RuntimeClientConfig,\n ) {\n this.userSession = config.userSession;\n }\n\n public getFetch(): CustomFetcher {\n const doFetch = this.config.fetch ?? globalThis.fetch;\n\n if (typeof doFetch !== \"function\") {\n throw new Error(\n \"No fetch function available. Please provide a fetch implementation or ensure global fetch is available.\",\n );\n }\n\n return doFetch;\n }\n\n public clearCachedTokens(): void {\n this.appTokens.clear();\n }\n\n public async getUserSession(): Promise<UserSession | null> {\n const storedSession = await this.config.storage?.getSession?.();\n if (storedSession !== undefined) {\n return storedSession;\n }\n\n return this.userSession ?? null;\n }\n\n public async setUserSession(session: UserSession | null): Promise<void> {\n if (!this.config.storage) {\n this.userSession = session;\n return;\n }\n\n if (!session) {\n if (this.config.storage.clearSession) {\n await this.config.storage.clearSession();\n this.userSession = null;\n return;\n }\n\n await this.config.storage.setSession?.(null);\n this.userSession = null;\n return;\n }\n\n await this.config.storage.setSession?.(session);\n this.userSession = session;\n }\n\n public buildServiceUrl(\n service: ApiService,\n path: string,\n query?: ApiParams,\n ): string {\n const crossServiceGatewayPath = this.isCrossServiceGatewayPath(\n service,\n path,\n );\n const { baseUrl, usesGateway } = this.resolveServiceBaseUrl(\n service,\n crossServiceGatewayPath,\n );\n const servicePath = this.normalizeServicePath(\n service,\n path,\n usesGateway,\n crossServiceGatewayPath,\n );\n const preserveQueryParamCase =\n service === \"auth\" || service === \"quranReflect\";\n\n return `${baseUrl}${servicePath}${paramsToString(query, {\n preserveCase: preserveQueryParamCase,\n })}`;\n }\n\n public async requestOperation<T = unknown>(\n operation: OperationDefinition,\n request?: OperationRequest,\n ): Promise<T> {\n return this.request<T>(\n operation.service,\n replacePathParams(operation.path, request?.path),\n request?.query,\n {\n ...request,\n auth:\n request?.auth === \"auto\" || !request?.auth\n ? operation.auth\n : request.auth,\n method:\n request?.method ??\n (operation.method.toUpperCase() as OperationRequest[\"method\"]),\n path: undefined,\n },\n );\n }\n\n public async request<T = unknown>(\n service: ApiService,\n path: string,\n query?: ApiParams,\n request: OperationRequest = {},\n ): Promise<T> {\n const effectiveAuth = this.resolveAuthMode(service, request.auth);\n\n if (this.mode === \"public\" && effectiveAuth === \"app\") {\n throw new Error(\n \"This API requires @quranjs/api/server or a backend. Content and search are server-side for confidential clients.\",\n );\n }\n\n const url = this.buildServiceUrl(service, path, query);\n const userSession = await this.getRequestUserSession(\n effectiveAuth,\n request,\n );\n let response = await this.performRequest(\n service,\n url,\n request,\n effectiveAuth,\n userSession?.accessToken,\n );\n\n if (\n this.shouldRetryUserRequest(response, effectiveAuth, request, userSession)\n ) {\n const refreshedSession = await this.refreshStoredUserSession();\n response = await this.performRequest(\n service,\n url,\n request,\n effectiveAuth,\n refreshedSession.accessToken,\n );\n }\n\n if (!response.ok) {\n throw await QuranHttpError.fromResponse(response);\n }\n\n request.onResponse?.({\n headers: response.headers,\n status: response.status,\n });\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"application/json\")) {\n return (await response.text()) as T;\n }\n\n const json = await response.json();\n if (request.preserveResponseKeys) {\n return json as T;\n }\n return camelizeKeys(json as object) as T;\n }\n\n public async fetch<T = unknown>(url: string, params?: ApiParams): Promise<T> {\n const route = this.resolveLegacyRoute(url);\n return this.request<T>(route.service, route.path, {\n ...this.config.defaults,\n ...params,\n });\n }\n\n private async performRequest(\n service: ApiService,\n url: string,\n request: OperationRequest,\n auth: \"app\" | \"none\" | \"user\",\n accessToken?: string,\n ): Promise<Response> {\n const headers = new Headers(request.headers);\n const body = prepareBody(request, headers);\n\n if (service !== \"oauth2\") {\n headers.set(\"x-client-id\", this.config.clientId);\n }\n\n await this.applyAuthenticationHeaders(\n service,\n auth,\n headers,\n {\n ...request,\n accessToken: accessToken ?? request.accessToken,\n },\n url,\n );\n\n return this.getFetch()(url, {\n body,\n headers,\n method: request.method ?? \"GET\",\n });\n }\n\n private resolveLegacyRoute(url: string): {\n path: string;\n service: ApiService;\n } {\n const normalizedPath = ensureLeadingSlash(normalizePathTemplate(url));\n\n if (\n normalizedPath.startsWith(\"/content/api/v4\") ||\n normalizedPath.startsWith(\"/api/v4\")\n ) {\n return {\n path: normalizedPath,\n service: \"content\",\n };\n }\n\n if (\n normalizedPath === \"/v1/search\" ||\n normalizedPath.startsWith(\"/search/v1\")\n ) {\n return {\n path: normalizedPath,\n service: \"search\",\n };\n }\n\n if (normalizedPath.startsWith(\"/auth/v1\")) {\n return {\n path: normalizedPath,\n service: \"auth\",\n };\n }\n\n if (normalizedPath.startsWith(\"/quran-reflect/v1\")) {\n return {\n path: normalizedPath,\n service: \"quranReflect\",\n };\n }\n\n if (\n normalizedPath.startsWith(\"/oauth2\") ||\n normalizedPath.startsWith(\"/userinfo\")\n ) {\n return {\n path: normalizedPath,\n service: \"oauth2\",\n };\n }\n\n throw new Error(`Unsupported SDK route: ${url}`);\n }\n\n private resolveAuthMode(\n service: ApiService,\n auth: OperationRequest[\"auth\"] = \"auto\",\n ): \"app\" | \"none\" | \"user\" {\n if (auth !== \"auto\") {\n return auth;\n }\n\n if (service === \"content\" || service === \"search\") {\n return \"app\";\n }\n\n if (service === \"auth\" || service === \"quranReflect\") {\n return \"user\";\n }\n\n return \"none\";\n }\n\n private async getRequestUserSession(\n auth: \"app\" | \"none\" | \"user\",\n request: OperationRequest,\n ): Promise<UserSession | null> {\n if (auth !== \"user\" || request.accessToken || this.mode !== \"server\") {\n return null;\n }\n\n const session = await this.getUserSession();\n if (!session?.accessToken) {\n throw new Error(\n \"This operation requires a user session. Sign in first or use @quranjs/api/server.\",\n );\n }\n\n if (!this.shouldRefreshUserSession(session)) {\n return session;\n }\n\n return this.refreshStoredUserSession(session);\n }\n\n private shouldRefreshUserSession(session: UserSession): boolean {\n if (!session.refreshToken || !session.expiresAt) {\n return false;\n }\n\n return session.expiresAt <= Date.now() + USER_SESSION_REFRESH_WINDOW_MS;\n }\n\n private shouldRetryUserRequest(\n response: Response,\n auth: \"app\" | \"none\" | \"user\",\n request: OperationRequest,\n session: UserSession | null,\n ): boolean {\n if (response.status !== 401) {\n return false;\n }\n\n if (auth !== \"user\" || request.accessToken || this.mode !== \"server\") {\n return false;\n }\n\n return Boolean(session?.refreshToken);\n }\n\n private async applyAuthenticationHeaders(\n service: ApiService,\n auth: \"app\" | \"none\" | \"user\",\n headers: Headers,\n request: OperationRequest,\n resourceUrl?: string,\n ): Promise<void> {\n if (request.basicAuth) {\n headers.set(\n \"Authorization\",\n `Basic ${encodeBasicAuth(\n request.basicAuth.username,\n request.basicAuth.password,\n )}`,\n );\n }\n\n if (request.accessToken) {\n this.setTokenHeaders(service, headers, request.accessToken);\n return;\n }\n\n if (auth === \"none\") {\n return;\n }\n\n if (auth === \"app\") {\n const token = await this.getAppAccessToken(service, resourceUrl);\n this.setTokenHeaders(service, headers, token);\n return;\n }\n\n const session = await this.getUserSession();\n if (!session?.accessToken) {\n throw new Error(\n \"This operation requires a user session. Sign in first or use @quranjs/api/server.\",\n );\n }\n\n this.setTokenHeaders(service, headers, session.accessToken);\n }\n\n private async refreshStoredUserSession(\n currentSession?: UserSession | null,\n ): Promise<UserSession> {\n if (this.userSessionRefreshPromise) {\n return this.userSessionRefreshPromise;\n }\n\n const refreshPromise = this.executeUserSessionRefresh(currentSession);\n this.userSessionRefreshPromise = refreshPromise;\n\n try {\n return await refreshPromise;\n } finally {\n if (this.userSessionRefreshPromise === refreshPromise) {\n this.userSessionRefreshPromise = null;\n }\n }\n }\n\n private async executeUserSessionRefresh(\n currentSession?: UserSession | null,\n ): Promise<UserSession> {\n if (this.mode !== \"server\" || !(\"clientSecret\" in this.config)) {\n throw new Error(\n \"Automatic session refresh requires @quranjs/api/server or a backend.\",\n );\n }\n\n const clientSecret = this.config.clientSecret;\n\n const session = currentSession ?? (await this.getUserSession());\n if (!session?.refreshToken) {\n throw new Error(USER_SESSION_EXPIRED_MESSAGE);\n }\n\n const tokenUrl = `${removeTrailingSlash(\n this.config.services?.tokenHost ??\n this.config.services?.oauth2BaseUrl ??\n DEFAULT_BASE_URLS.oauth2,\n )}/oauth2/token`;\n\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: session.refreshToken,\n });\n\n const response = await retry(\n () =>\n this.getFetch()(tokenUrl, {\n body,\n headers: {\n Accept: \"application/json\",\n Authorization: `Basic ${encodeBasicAuth(\n this.config.clientId,\n clientSecret,\n )}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n method: \"POST\",\n }),\n { retries: 3 },\n );\n\n if (!response.ok) {\n const responseBody = await readResponseBody(response);\n if (isRefreshTokenRejection(response, responseBody)) {\n await this.setUserSession(null);\n throw new Error(USER_SESSION_EXPIRED_MESSAGE);\n }\n\n throw new Error(formatRefreshFailureMessage(response, responseBody));\n }\n\n const token = (await response.json()) as TokenResponse;\n const refreshedSession = toUserSession(token, session);\n await this.setUserSession(refreshedSession);\n\n return refreshedSession;\n }\n\n private setTokenHeaders(\n service: ApiService,\n headers: Headers,\n accessToken: string,\n ): void {\n if (service === \"oauth2\") {\n headers.set(\"Authorization\", `Bearer ${accessToken}`);\n return;\n }\n\n headers.set(\"x-auth-token\", accessToken);\n }\n\n private async getAppAccessToken(\n service: ApiService,\n resourceUrl?: string,\n ): Promise<string> {\n if (this.mode !== \"server\") {\n throw new Error(\n \"App-authenticated APIs require @quranjs/api/server or a backend.\",\n );\n }\n\n const scope = this.resolveAppScope(service, resourceUrl);\n if (!scope) {\n throw new Error(\n `No client-credentials scope is configured for ${service}.`,\n );\n }\n\n const cacheKey = `${service}:${scope}`;\n const cachedToken = this.appTokens.get(cacheKey);\n\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) {\n return cachedToken.value;\n }\n\n if (!(\"clientSecret\" in this.config)) {\n throw new Error(\"client_secret is server-only. Use @quranjs/api/server.\");\n }\n\n const clientSecret = this.config.clientSecret;\n\n const tokenUrl = `${removeTrailingSlash(\n this.config.services?.tokenHost ??\n this.config.services?.oauth2BaseUrl ??\n DEFAULT_BASE_URLS.oauth2,\n )}/oauth2/token`;\n\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n scope,\n });\n\n const response = await retry(\n () =>\n this.getFetch()(tokenUrl, {\n body,\n headers: {\n Accept: \"application/json\",\n Authorization: `Basic ${encodeBasicAuth(\n this.config.clientId,\n clientSecret,\n )}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n method: \"POST\",\n }),\n { retries: 3 },\n );\n\n if (!response.ok) {\n throw new Error(\n `Token request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const json = (await response.json()) as TokenResponse;\n const cached = {\n expiresAt: Date.now() + json.expires_in * 1000,\n value: json.access_token,\n };\n\n this.appTokens.set(cacheKey, cached);\n return cached.value;\n }\n\n private resolveAppScope(\n service: ApiService,\n resourceUrl?: string,\n ): string | undefined {\n if (service !== \"content\" || !resourceUrl) {\n return APP_SERVICE_SCOPES[service];\n }\n\n const pathname = new URL(resourceUrl).pathname;\n if (!pathname.startsWith(QURAN_REFLECT_POSTS_PATH_PREFIX)) {\n return APP_SERVICE_SCOPES.content;\n }\n\n if (\n QURAN_REFLECT_COMMENT_PATH_SUFFIXES.some((suffix) =>\n pathname.endsWith(suffix),\n )\n ) {\n return \"comment.read\";\n }\n\n return \"post.read\";\n }\n\n private resolveServiceBaseUrl(\n service: ApiService,\n crossServiceGatewayPath = false,\n ): {\n baseUrl: string;\n usesGateway: boolean;\n } {\n const { services } = this.config;\n if (crossServiceGatewayPath) {\n return {\n baseUrl: removeTrailingSlash(services?.gatewayUrl ?? API_BASE_URL),\n usesGateway: true,\n };\n }\n\n const directBaseUrl =\n service === \"analytics\"\n ? services?.analyticsBaseUrl\n : service === \"content\"\n ? services?.contentBaseUrl\n : service === \"search\"\n ? services?.searchBaseUrl\n : service === \"auth\"\n ? services?.authBaseUrl\n : service === \"quranReflect\"\n ? services?.quranReflectBaseUrl\n : (services?.oauth2BaseUrl ?? services?.tokenHost);\n\n if (directBaseUrl) {\n return {\n baseUrl: removeTrailingSlash(directBaseUrl),\n usesGateway: false,\n };\n }\n\n if (services?.gatewayUrl && service !== \"oauth2\") {\n return {\n baseUrl: removeTrailingSlash(services.gatewayUrl),\n usesGateway: true,\n };\n }\n\n return {\n baseUrl: DEFAULT_BASE_URLS[service],\n usesGateway: false,\n };\n }\n\n private normalizeServicePath(\n service: ApiService,\n path: string,\n usesGateway: boolean,\n crossServiceGatewayPath = false,\n ): string {\n const normalizedPath = ensureLeadingSlash(normalizePathTemplate(path));\n if (service === \"oauth2\") {\n return normalizedPath;\n }\n\n if (crossServiceGatewayPath) {\n return normalizedPath;\n }\n\n let servicePath = normalizedPath;\n for (const prefix of LEGACY_PREFIXES[service]) {\n if (servicePath.startsWith(prefix)) {\n servicePath = ensureLeadingSlash(servicePath.slice(prefix.length));\n break;\n }\n }\n\n const prefix = usesGateway\n ? GATEWAY_PATH_PREFIX[service]\n : DIRECT_PATH_PREFIX[service];\n\n if (servicePath.startsWith(prefix)) {\n return servicePath;\n }\n\n return `${prefix}${servicePath}`;\n }\n\n private isCrossServiceGatewayPath(\n service: ApiService,\n path: string,\n ): boolean {\n const normalizedPath = ensureLeadingSlash(normalizePathTemplate(path));\n const pathService = GATEWAY_SERVICES.find((gatewayService) =>\n this.pathMatchesPrefix(\n normalizedPath,\n GATEWAY_PATH_PREFIX[gatewayService],\n ),\n );\n\n return Boolean(pathService && pathService !== service);\n }\n\n private pathMatchesPrefix(path: string, prefix: string): boolean {\n return (\n prefix.length > 0 && (path === prefix || path.startsWith(`${prefix}/`))\n );\n }\n}\n","import type {\n BaseApiParams,\n HadithCountWithinRangeResponse,\n HadithReferencesByAyahResponse,\n HadithsByAyahResponse,\n QuranFetchClient,\n VerseKey,\n} from \"@/types\";\nimport { isValidVerseKey } from \"@/utils\";\n\ntype GetHadithReferenceOptions = BaseApiParams;\n\ntype GetHadithsByAyahOptions = BaseApiParams & {\n page?: number;\n limit?: number;\n};\n\ntype CountHadithsWithinRangeOptions = BaseApiParams;\n\n/**\n * Hadith reference API methods.\n */\nexport class QuranHadithReferences {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get ordered hadith reference records linked to a specific ayah.\n * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"12:12\")\n * @param {GetHadithReferenceOptions} options\n * @example\n * client.hadithReferences.findByAyah(\"12:12\")\n */\n async findByAyah(\n key: VerseKey,\n options?: GetHadithReferenceOptions,\n ): Promise<HadithReferencesByAyahResponse> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n return this.fetcher.fetch<HadithReferencesByAyahResponse>(\n `/content/api/v4/hadith_references/by_ayah/${key}`,\n options,\n );\n }\n\n /**\n * Get paginated hadith payloads linked to a specific ayah.\n * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"12:12\")\n * @param {GetHadithsByAyahOptions} options\n * @example\n * client.hadithReferences.findHadithsByAyah(\"12:12\", { limit: 4 })\n */\n async findHadithsByAyah(\n key: VerseKey,\n options?: GetHadithsByAyahOptions,\n ): Promise<HadithsByAyahResponse> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n return this.fetcher.fetch<HadithsByAyahResponse>(\n `/content/api/v4/hadith_references/by_ayah/${key}/hadiths`,\n options,\n );\n }\n\n /**\n * Get a verse-key to hadith-count map within an inclusive ayah range.\n * @param {VerseKey} from start verse key in format \"chapter:verse\"\n * @param {VerseKey} to end verse key in format \"chapter:verse\"\n * @param {CountHadithsWithinRangeOptions} options\n * @example\n * client.hadithReferences.countWithinRange(\"12:12\", \"12:13\")\n */\n async countWithinRange(\n from: VerseKey,\n to: VerseKey,\n options?: CountHadithsWithinRangeOptions,\n ): Promise<HadithCountWithinRangeResponse> {\n if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n throw new Error(\"Invalid verse key\");\n }\n\n return this.fetcher.fetch<HadithCountWithinRangeResponse>(\n \"/content/api/v4/hadith_references/count_within_range\",\n {\n ...options,\n from,\n to,\n },\n );\n }\n}\n","import type { Juz, QuranFetchClient } from \"@/types\";\n\n/**\n * Juzs API methods\n */\nexport class QuranJuzs {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get All Juzs\n * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/juzs\n * @example\n * client.juzs.findAll()\n */\n async findAll(): Promise<Juz[]> {\n const { juzs } = await this.fetcher.fetch<{ juzs: Juz[] }>(\n \"/content/api/v4/juzs\",\n );\n return juzs;\n }\n}\n","import type {\n BaseApiParams,\n ChapterInfoResource,\n ChapterReciterResource,\n ContentResourceSnapshot,\n ContentResourceSnapshotOptions,\n ContentSyncOptions,\n ContentSyncResourceGroup,\n ContentSyncResponse,\n LanguageResource,\n QuranFetchClient,\n RecitationInfoResource,\n RecitationResource,\n RecitationStylesResource,\n TafsirInfoResource,\n TafsirResource,\n TranslationInfoResource,\n TranslationResource,\n VerseMediaResource,\n} from \"@/types\";\n\ntype GetResourceOptions = BaseApiParams;\n\n/**\n * Resources API methods\n */\nexport class QuranResources {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get all recitations.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllRecitations()\n */\n async findAllRecitations(\n options?: GetResourceOptions,\n ): Promise<RecitationResource[]> {\n const { recitations } = await this.fetcher.fetch<{\n recitations: RecitationResource[];\n }>(\"/content/api/v4/resources/recitations\", options);\n\n return recitations;\n }\n\n /**\n * Get all translations.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllTranslations()\n */\n async findAllTranslations(\n options?: GetResourceOptions,\n ): Promise<TranslationResource[]> {\n const { translations } = await this.fetcher.fetch<{\n translations: TranslationResource[];\n }>(\"/content/api/v4/resources/translations\", options);\n\n return translations;\n }\n\n /**\n * Get all tafsirs.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllTafsirs()\n */\n async findAllTafsirs(\n options?: GetResourceOptions,\n ): Promise<TafsirResource[]> {\n const { tafsirs } = await this.fetcher.fetch<{\n tafsirs: TafsirResource[];\n }>(\"/content/api/v4/resources/tafsirs\", options);\n\n return tafsirs;\n }\n\n /**\n * Get all languages.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllLanguages()\n */\n async findAllLanguages(\n options?: GetResourceOptions,\n ): Promise<LanguageResource[]> {\n const { languages } = await this.fetcher.fetch<{\n languages: LanguageResource[];\n }>(\"/content/api/v4/resources/languages\", options);\n\n return languages;\n }\n\n /**\n * Get recitation info by id.\n * @param {string} id recitation id\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findRecitationInfo('1')\n */\n async findRecitationInfo(\n id: string,\n options?: GetResourceOptions,\n ): Promise<RecitationInfoResource> {\n const { recitationInfo } = await this.fetcher.fetch<{\n recitationInfo: RecitationInfoResource;\n }>(`/content/api/v4/resources/recitations/${id}/info`, options);\n\n return recitationInfo;\n }\n\n /**\n * Get translation info by id.\n * @param {string} id translation id\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findTranslationInfo('131')\n */\n async findTranslationInfo(\n id: string,\n options?: GetResourceOptions,\n ): Promise<TranslationInfoResource> {\n const { translationInfo } = await this.fetcher.fetch<{\n translationInfo: TranslationInfoResource;\n }>(`/content/api/v4/resources/translations/${id}/info`, options);\n\n return translationInfo;\n }\n\n /**\n * Get tafsir info by id.\n * @param {string} id tafsir id\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findTafsirInfo('171')\n */\n async findTafsirInfo(\n id: string,\n options?: GetResourceOptions,\n ): Promise<TafsirInfoResource> {\n const { tafsirInfo } = await this.fetcher.fetch<{\n tafsirInfo: TafsirInfoResource;\n }>(`/content/api/v4/resources/tafsirs/${id}/info`, options);\n\n return tafsirInfo;\n }\n\n /**\n * Get all chapter infos.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllChapterInfos()\n */\n async findAllChapterInfos(\n options?: GetResourceOptions,\n ): Promise<ChapterInfoResource[]> {\n const { chapterInfos } = await this.fetcher.fetch<{\n chapterInfos: ChapterInfoResource[];\n }>(\"/content/api/v4/resources/chapter_infos\", options);\n\n return chapterInfos;\n }\n\n /**\n * Get all chapter reciters.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllChapterReciters()\n */\n async findAllChapterReciters(\n options?: GetResourceOptions,\n ): Promise<ChapterReciterResource[]> {\n const { reciters } = await this.fetcher.fetch<{\n reciters: ChapterReciterResource[];\n }>(\"/content/api/v4/resources/chapter_reciters\", options);\n\n return reciters;\n }\n\n /**\n * Get all recitation styles.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findAllRecitationStyles()\n */\n async findAllRecitationStyles(\n options?: GetResourceOptions,\n ): Promise<RecitationStylesResource> {\n const { recitationStyles } = await this.fetcher.fetch<{\n recitationStyles: RecitationStylesResource;\n }>(\"/content/api/v4/resources/recitation_styles\", options);\n\n return recitationStyles;\n }\n\n /**\n * Get verse media.\n * @param {GetResourceOptions} options\n * @example\n * client.resources.findVerseMedia()\n */\n async findVerseMedia(\n options?: GetResourceOptions,\n ): Promise<VerseMediaResource> {\n const { verseMedia } = await this.fetcher.fetch<{\n verseMedia: VerseMediaResource;\n }>(\"/content/api/v4/resources/verse_media\", options);\n\n return verseMedia;\n }\n\n /**\n * Bootstrap or incrementally sync public content resources.\n * @param {ContentSyncOptions} options\n * @example\n * client.resources.sync({\n * bootstrap: true,\n * resources: \"mushafs:1;translations:19;word_by_word_transliterations:60\"\n * })\n */\n async sync<TData extends Record<string, unknown> = Record<string, unknown>>(\n options?: ContentSyncOptions,\n ): Promise<ContentSyncResponse<TData>> {\n return this.fetcher.fetch<ContentSyncResponse<TData>>(\n \"/content/api/v4/resources/sync\",\n options,\n );\n }\n\n /**\n * Fetch the current full snapshot for a syncable public content resource.\n * @param {ContentSyncResourceGroup} resourceGroup\n * @param {string | number} id\n * @param {ContentResourceSnapshotOptions} options\n * @example\n * client.resources.findSnapshot(\"word_by_word_transliterations\", 60)\n */\n async findSnapshot<\n TRecord extends Record<string, unknown> = Record<string, unknown>,\n >(\n resourceGroup: ContentSyncResourceGroup,\n id: string | number,\n options?: ContentResourceSnapshotOptions,\n ): Promise<ContentResourceSnapshot<TRecord>> {\n return this.fetcher.fetch<ContentResourceSnapshot<TRecord>>(\n `/content/api/v4/resources/snapshots/${resourceGroup}/${id}`,\n options,\n );\n }\n}\n","import type { QuranFetchClient, SearchParams, SearchResponse } from \"@/types\";\n\ntype SearchOptions = Omit<SearchParams, \"query\">;\n\n/**\n * Search API methods\n */\nexport class QuranSearch {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Search\n * @description /v1/search\n * @param {string} query search query\n * @param {SearchOptions} options\n * @example\n * client.search.search('نور', { mode: SearchMode.Quick })\n * client.search.search('نور', { mode: SearchMode.Advanced, exactMatchesOnly: '1' })\n * client.search.search('نور', { mode: SearchMode.Quick, size: 10 })\n * client.search.search('نور', { mode: SearchMode.Quick, page: 2 })\n */\n async search(query: string, options: SearchOptions): Promise<SearchResponse> {\n return this.fetcher.fetch<SearchResponse>(\"/v1/search\", {\n query,\n size: 30, // search-specific default\n ...options,\n });\n }\n}\n","import type {\n BaseApiParams,\n ChapterId,\n HizbNumber,\n JuzNumber,\n PageNumber,\n PaginationParams,\n QuranFetchClient,\n RubNumber,\n TranslationField,\n Verse,\n VerseField,\n VerseKey,\n WordField,\n} from \"@/types\";\nimport {\n isValidChapterId,\n isValidHizb,\n isValidJuz,\n isValidQuranPage,\n isValidRub,\n isValidVerseKey,\n} from \"@/utils\";\n\ntype GetVerseOptions = BaseApiParams &\n PaginationParams & {\n reciter?: string | number;\n words?: boolean;\n translations?: string[] | number[];\n tafsirs?: string[] | number[];\n wordFields?: Partial<Record<WordField, boolean>>;\n translationFields?: Partial<Record<TranslationField, boolean>>;\n fields?: Partial<Record<VerseField, boolean>>;\n };\n\n/**\n * Verses API methods\n */\nexport class QuranVerses {\n constructor(private fetcher: QuranFetchClient) {}\n\n /**\n * Get a specific verse by its key.\n * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"1:1\")\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByKey('1:1')\n * client.verses.findByKey('2:255')\n */\n async findByKey(key: VerseKey, options?: GetVerseOptions): Promise<Verse> {\n if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n const { verse } = await this.fetcher.fetch<{ verse: Verse }>(\n `/content/api/v4/verses/by_key/${key}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verse;\n }\n\n /**\n * Get verses by range.\n * @param {VerseKey} from start verse key (e.g., \"1:1\")\n * @param {VerseKey} to end verse key (e.g., \"1:7\")\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByRange('1:1', '1:7')\n */\n async findByRange(\n from: VerseKey,\n to: VerseKey,\n options?: GetVerseOptions,\n ): Promise<Verse[]> {\n // We could validate keys here, but the API will also valid it.\n // simpler to just pass through for now, or use isValidVerseKey if desired.\n if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n throw new Error(\"Invalid verse key\");\n }\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n \"/content/api/v4/verses/by_range\",\n {\n words: false, // verses-specific default\n ...options,\n from,\n to,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by chapter.\n * @param {ChapterId} id chapter id, minimum 1, maximum 114\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByChapter('1')\n */\n async findByChapter(\n id: ChapterId,\n options?: GetVerseOptions,\n ): Promise<Verse[]> {\n if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_chapter/${id}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by page number.\n * @param {PageNumber} page page number\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByPage('1')\n */\n async findByPage(\n page: PageNumber,\n options?: GetVerseOptions,\n ): Promise<Verse[]> {\n if (!isValidQuranPage(page)) throw new Error(\"Invalid page number\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_page/${page}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by juz number.\n * @param {JuzNumber} juz juz number\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByJuz('1')\n */\n async findByJuz(juz: JuzNumber, options?: GetVerseOptions): Promise<Verse[]> {\n if (!isValidJuz(juz)) throw new Error(\"Invalid juz\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_juz/${juz}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by hizb number.\n * @param {HizbNumber} hizb hizb number\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByHizb('1')\n */\n async findByHizb(\n hizb: HizbNumber,\n options?: GetVerseOptions,\n ): Promise<Verse[]> {\n if (!isValidHizb(hizb)) throw new Error(\"Invalid hizb\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_hizb/${hizb}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get verses by rub number.\n * @param {RubNumber} rub rub number\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findByRub('1')\n */\n async findByRub(rub: RubNumber, options?: GetVerseOptions): Promise<Verse[]> {\n if (!isValidRub(rub)) throw new Error(\"Invalid rub\");\n\n const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n `/content/api/v4/verses/by_rub/${rub}`,\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verses;\n }\n\n /**\n * Get a random verse.\n * @param {GetVerseOptions} options\n * @example\n * client.verses.findRandom()\n */\n async findRandom(options?: GetVerseOptions): Promise<Verse> {\n const { verse } = await this.fetcher.fetch<{ verse: Verse }>(\n \"/content/api/v4/verses/random\",\n {\n words: false, // verses-specific default\n ...options,\n },\n );\n\n return verse;\n }\n}\n","import type { AuthService } from \"@/generated/public-contracts\";\nimport type { QuranReflectPostsFacade } from \"@/runtime/quran-reflect-posts\";\nimport type {\n ApiParams,\n ChapterId,\n ContentSyncOptions,\n ContentSyncResourceGroup,\n HizbNumber,\n HTTPMethod,\n JuzNumber,\n OperationRequest,\n PageNumber,\n PublicClientConfig,\n RubNumber,\n SearchParams,\n ServerClientConfig,\n TokenResponse,\n VerseKey,\n} from \"@/types\";\nimport { operationCatalog } from \"@/generated/contracts\";\nimport { toUserSession } from \"@/lib/http-utils\";\nimport { createGeneratedGroups, createRawClient } from \"@/lib/runtime-utils\";\nimport { replacePathParams } from \"@/lib/url\";\nimport { createAnalyticsFacade } from \"@/runtime/analytics\";\nimport { createAppStateFacade } from \"@/runtime/app-state\";\nimport { createQuranReflectPostsFacade } from \"@/runtime/quran-reflect-posts\";\nimport { QuranAnswers } from \"@/sdk/answers\";\nimport { QuranAudio } from \"@/sdk/audio\";\nimport { QuranChapters } from \"@/sdk/chapters\";\nimport { QuranFetcher } from \"@/sdk/fetcher\";\nimport { QuranHadithReferences } from \"@/sdk/hadith-references\";\nimport { QuranJuzs } from \"@/sdk/juzs\";\nimport { QuranResources } from \"@/sdk/resources\";\nimport { QuranSearch } from \"@/sdk/search\";\nimport { QuranVerses } from \"@/sdk/verses\";\n\ntype RuntimeClientConfig = PublicClientConfig | ServerClientConfig;\ntype RuntimeMode = \"public\" | \"server\";\ntype RawOperation = (request?: OperationRequest) => Promise<unknown>;\ntype GeneratedGroup = Record<string, RawOperation>;\ntype QuranReflectFacade = {\n comments: GeneratedGroup;\n posts: QuranReflectPostsFacade;\n raw: Record<string, RawOperation>;\n rooms: GeneratedGroup;\n tags: GeneratedGroup;\n users: GeneratedGroup;\n};\n\nconst LEGACY_BOOKMARK_GET_MESSAGE =\n \"auth.bookmarks.get(bookmarkId) is not supported because /v1/bookmarks/bookmark expects bookmark detail query parameters. Pass a query object such as { mushafId, key, type, verseNumber } or { mushafId, isReading: true }.\";\n\nconst createUserServiceRequest =\n (fetcher: QuranFetcher, service: AuthService) =>\n (method: HTTPMethod, path: string, request?: OperationRequest) => {\n return fetcher.request<unknown>(\n service,\n replacePathParams(path, request?.path),\n request?.query,\n {\n ...request,\n auth: \"user\",\n method,\n path: undefined,\n query: undefined,\n },\n );\n };\n\nconst createAuthFacade = (fetcher: QuranFetcher) => {\n const raw = createRawClient(fetcher, operationCatalog.auth.v1);\n const generatedGroups = createGeneratedGroups(operationCatalog.auth.v1, raw);\n const request = createUserServiceRequest(fetcher, \"auth\");\n\n return {\n ...generatedGroups,\n appState: createAppStateFacade(fetcher),\n collections: {\n ...generatedGroups.collections,\n addBookmark: (collectionId: string, body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/collections/{collectionId}/bookmarks\", {\n body,\n path: { collectionId },\n }),\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/collections\", { body }),\n get: (collectionId: string, query?: ApiParams) =>\n request(\"GET\", \"/v1/collections/{collectionId}\", {\n path: { collectionId },\n query,\n }),\n list: (query?: ApiParams) => request(\"GET\", \"/v1/collections\", { query }),\n listAll: (query?: ApiParams) =>\n request(\"GET\", \"/v1/collections/all\", { query }),\n remove: (collectionId: string) =>\n request(\"DELETE\", \"/v1/collections/{collectionId}\", {\n path: { collectionId },\n }),\n removeBookmark: (collectionId: string, bookmarkId: string) =>\n request(\n \"DELETE\",\n \"/v1/collections/{collectionId}/bookmarks/{bookmarkId}\",\n {\n path: { bookmarkId, collectionId },\n },\n ),\n update: (collectionId: string, body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/collections/{collectionId}\", {\n body,\n path: { collectionId },\n }),\n },\n bookmarks: {\n ...generatedGroups.bookmarks,\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/bookmarks\", { body }),\n get: async (query?: ApiParams | string) => {\n if (typeof query === \"string\") {\n throw new Error(LEGACY_BOOKMARK_GET_MESSAGE);\n }\n\n return request(\"GET\", \"/v1/bookmarks/bookmark\", {\n query,\n });\n },\n list: (query?: ApiParams) => request(\"GET\", \"/v1/bookmarks\", { query }),\n listCollections: (query?: ApiParams) =>\n request(\"GET\", \"/v1/bookmarks/collections\", { query }),\n listRange: (query?: ApiParams) =>\n request(\"GET\", \"/v1/bookmarks/ayahs-range\", { query }),\n remove: (bookmarkId: string) =>\n request(\"DELETE\", \"/v1/bookmarks/{bookmarkId}\", {\n path: { bookmarkId },\n }),\n },\n goals: {\n ...generatedGroups.goals,\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/goals\", { body }),\n estimate: (query?: ApiParams) =>\n request(\"GET\", \"/v1/goals/estimate\", { query }),\n getTodaysPlan: (query?: ApiParams) =>\n request(\"GET\", \"/v1/goals/get-todays-plan\", { query }),\n remove: (id: string) =>\n request(\"DELETE\", \"/v1/goals/{id}\", { path: { id } }),\n update: (id: string, body: Record<string, unknown>) =>\n request(\"PUT\", \"/v1/goals/{id}\", {\n body,\n path: { id },\n }),\n },\n notes: {\n ...generatedGroups.notes,\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/notes\", { body }),\n get: (noteId: string) =>\n request(\"GET\", \"/v1/notes/{noteId}\", { path: { noteId } }),\n list: (query?: ApiParams) => request(\"GET\", \"/v1/notes\", { query }),\n listByAttachedEntity: (query?: ApiParams) =>\n request(\"GET\", \"/v1/notes/by-attached-entity\", { query }),\n listByRange: (query?: ApiParams) =>\n request(\"GET\", \"/v1/notes/by-range\", { query }),\n listByVerseKey: (verseKey: string, query?: ApiParams) =>\n request(\"GET\", \"/v1/notes/by-verse/{verseKey}\", {\n path: { verseKey },\n query,\n }),\n publish: (noteId: string, body?: Record<string, unknown>) =>\n request(\"POST\", \"/v1/notes/{noteId}/publish\", {\n body,\n path: { noteId },\n }),\n remove: (noteId: string) =>\n request(\"DELETE\", \"/v1/notes/{noteId}\", { path: { noteId } }),\n update: (noteId: string, body: Record<string, unknown>) =>\n request(\"PATCH\", \"/v1/notes/{noteId}\", {\n body,\n path: { noteId },\n }),\n },\n preferences: {\n ...generatedGroups.preferences,\n bulkUpdate: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/preferences/bulk\", { body }),\n get: (query?: ApiParams) => request(\"GET\", \"/v1/preferences\", { query }),\n update: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/preferences\", { body }),\n },\n raw,\n readingSessions: {\n ...generatedGroups.readingSessions,\n create: (body: Record<string, unknown>) =>\n request(\"POST\", \"/v1/reading-sessions\", { body }),\n list: (query?: ApiParams) =>\n request(\"GET\", \"/v1/reading-sessions\", { query }),\n },\n };\n};\n\nconst createQuranReflectFacade = (\n fetcher: QuranFetcher,\n): QuranReflectFacade => {\n const raw = createRawClient(fetcher, operationCatalog.quranReflect.v1);\n const generatedGroups = createGeneratedGroups(\n operationCatalog.quranReflect.v1,\n raw,\n );\n\n return {\n comments: generatedGroups.comments ?? {},\n posts: createQuranReflectPostsFacade(\n generatedGroups.posts ?? {},\n createUserServiceRequest(fetcher, \"quranReflect\"),\n ),\n raw,\n rooms: generatedGroups.rooms ?? {},\n tags: generatedGroups.tags ?? {},\n users: generatedGroups.users ?? {},\n };\n};\n\nconst createOAuth2Facade = (\n fetcher: QuranFetcher,\n mode: RuntimeMode,\n config: RuntimeClientConfig,\n) => {\n const raw = createRawClient(fetcher, operationCatalog.oauth2.v1);\n\n const exchangeToken = async (\n body: URLSearchParams,\n options: {\n allowPublicExchange?: boolean;\n requiresRefreshToken?: boolean;\n } = {},\n ) => {\n if (mode === \"public\") {\n if ((config as PublicClientConfig).clientType !== \"public\") {\n throw new Error(\n \"This OAuth2 exchange requires a backend because your client is confidential.\",\n );\n }\n\n if (!options.allowPublicExchange) {\n throw new Error(\n \"This OAuth2 flow requires @quranjs/api/server or a backend.\",\n );\n }\n\n body.set(\"client_id\", config.clientId);\n }\n\n if (options.requiresRefreshToken && !body.get(\"refresh_token\")) {\n throw new Error(\"Missing refresh token.\");\n }\n\n const requestRefreshToken = body.get(\"refresh_token\") ?? undefined;\n const storedSession = options.requiresRefreshToken\n ? await fetcher.getUserSession()\n : null;\n const currentSession =\n options.requiresRefreshToken && requestRefreshToken\n ? { ...(storedSession ?? {}), refreshToken: requestRefreshToken }\n : storedSession;\n\n const token = await fetcher.request<TokenResponse>(\n \"oauth2\",\n \"/oauth2/token\",\n undefined,\n {\n auth: \"none\",\n basicAuth:\n mode === \"server\" && \"clientSecret\" in config\n ? {\n password: config.clientSecret,\n username: config.clientId,\n }\n : undefined,\n body,\n contentType: \"application/x-www-form-urlencoded\",\n method: \"POST\",\n },\n );\n\n await fetcher.setUserSession(toUserSession(token, currentSession));\n return token;\n };\n\n return {\n authorizeUrl: (query: Record<string, string | number | undefined>) =>\n fetcher.buildServiceUrl(\"oauth2\", \"/oauth2/auth\", query as ApiParams),\n exchangeCode: (params: {\n code: string;\n codeVerifier?: string;\n redirectUri: string;\n scope?: string;\n }) => {\n const body = new URLSearchParams({\n code: params.code,\n grant_type: \"authorization_code\",\n redirect_uri: params.redirectUri,\n });\n\n if (params.codeVerifier) {\n body.set(\"code_verifier\", params.codeVerifier);\n }\n\n if (params.scope) {\n body.set(\"scope\", params.scope);\n }\n\n return exchangeToken(body, { allowPublicExchange: true });\n },\n getUserInfo: (accessToken?: string) =>\n fetcher.request(\"oauth2\", \"/userinfo\", undefined, {\n accessToken,\n auth: \"user\",\n method: \"GET\",\n }),\n introspect: (token: string) => {\n if (mode !== \"server\" || !(\"clientSecret\" in config)) {\n throw new Error(\n \"Token introspection requires @quranjs/api/server or a backend.\",\n );\n }\n\n return fetcher.request(\"oauth2\", \"/oauth2/introspect\", undefined, {\n auth: \"none\",\n basicAuth: {\n password: config.clientSecret,\n username: config.clientId,\n },\n body: new URLSearchParams({ token }),\n contentType: \"application/x-www-form-urlencoded\",\n method: \"POST\",\n });\n },\n logout: (query?: ApiParams) =>\n fetcher.request(\"oauth2\", \"/oauth2/sessions/logout\", query, {\n auth: \"none\",\n method: \"GET\",\n }),\n raw,\n refresh: async (refreshToken?: string) => {\n const currentSession = await fetcher.getUserSession();\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken ?? currentSession?.refreshToken ?? \"\",\n });\n\n return exchangeToken(body, {\n allowPublicExchange: true,\n requiresRefreshToken: true,\n });\n },\n };\n};\n\nconst createContentFacade = (\n answers: QuranAnswers,\n chapters: QuranChapters,\n verses: QuranVerses,\n juzs: QuranJuzs,\n audio: QuranAudio,\n hadithReferences: QuranHadithReferences,\n resources: QuranResources,\n raw: Record<string, RawOperation>,\n) => {\n return {\n answers: {\n byAyah: (key: VerseKey, query?: ApiParams) =>\n answers.findByAyah(key, query),\n countWithinRange: (from: VerseKey, to: VerseKey, query?: ApiParams) =>\n answers.countWithinRange(from, to, query),\n get: (questionId: string | number) =>\n answers.findByQuestionId(questionId),\n },\n audio: {\n chapterRecitation: {\n get: (reciterId: string, chapterId: ChapterId, query?: ApiParams) =>\n audio.findChapterRecitationById(reciterId, chapterId, query),\n list: (reciterId: string, query?: ApiParams) =>\n audio.findAllChapterRecitations(reciterId, query),\n },\n verseRecitation: {\n byChapter: (\n chapterId: ChapterId,\n recitationId: string,\n query?: ApiParams,\n ) =>\n audio.findVerseRecitationsByChapter(chapterId, recitationId, query),\n byKey: (verseKey: VerseKey, recitationId: string, query?: ApiParams) =>\n audio.findVerseRecitationsByKey(verseKey, recitationId, query),\n },\n },\n chapters: {\n get: (id: ChapterId, query?: ApiParams) => chapters.findById(id, query),\n getInfo: (id: ChapterId, query?: ApiParams) =>\n chapters.findInfoById(id, query),\n getInfoResponse: (id: ChapterId, query?: ApiParams) =>\n chapters.findInfoResponseById(id, query),\n list: (query?: ApiParams) => chapters.findAll(query),\n },\n hadithReferences: {\n byAyah: (key: VerseKey, query?: ApiParams) =>\n hadithReferences.findByAyah(key, query),\n countWithinRange: (from: VerseKey, to: VerseKey, query?: ApiParams) =>\n hadithReferences.countWithinRange(from, to, query),\n hadithsByAyah: (key: VerseKey, query?: ApiParams) =>\n hadithReferences.findHadithsByAyah(key, query),\n },\n juzs: {\n list: () => juzs.findAll(),\n },\n raw,\n resources: {\n findSnapshot: (\n resourceGroup: ContentSyncResourceGroup,\n id: string | number,\n query?: ApiParams,\n ) => resources.findSnapshot(resourceGroup, id, query),\n chapterInfos: {\n list: (query?: ApiParams) => resources.findAllChapterInfos(query),\n },\n chapterReciters: {\n list: (query?: ApiParams) => resources.findAllChapterReciters(query),\n },\n languages: {\n list: (query?: ApiParams) => resources.findAllLanguages(query),\n },\n recitationStyles: {\n list: (query?: ApiParams) => resources.findAllRecitationStyles(query),\n },\n recitations: {\n getInfo: (id: string, query?: ApiParams) =>\n resources.findRecitationInfo(id, query),\n list: (query?: ApiParams) => resources.findAllRecitations(query),\n },\n tafsirs: {\n getInfo: (id: string, query?: ApiParams) =>\n resources.findTafsirInfo(id, query),\n list: (query?: ApiParams) => resources.findAllTafsirs(query),\n },\n translations: {\n getInfo: (id: string, query?: ApiParams) =>\n resources.findTranslationInfo(id, query),\n list: (query?: ApiParams) => resources.findAllTranslations(query),\n },\n verseMedia: {\n list: (query?: ApiParams) => resources.findVerseMedia(query),\n },\n sync: (query?: ContentSyncOptions) => resources.sync(query),\n },\n verses: {\n byChapter: (id: ChapterId, query?: ApiParams) =>\n verses.findByChapter(id, query),\n byHizb: (id: HizbNumber, query?: ApiParams) =>\n verses.findByHizb(id, query),\n byJuz: (id: JuzNumber, query?: ApiParams) => verses.findByJuz(id, query),\n byKey: (key: VerseKey, query?: ApiParams) => verses.findByKey(key, query),\n byPage: (page: PageNumber, query?: ApiParams) =>\n verses.findByPage(page, query),\n byRange: (from: VerseKey, to: VerseKey, query?: ApiParams) =>\n verses.findByRange(from, to, query),\n byRub: (id: RubNumber, query?: ApiParams) => verses.findByRub(id, query),\n random: (query?: ApiParams) => verses.findRandom(query),\n },\n };\n};\n\nexport const createRuntimeClient = (\n mode: RuntimeMode,\n config: RuntimeClientConfig,\n) => {\n const fetcher = new QuranFetcher(mode, config);\n fetcher.getFetch();\n const answers = new QuranAnswers(fetcher);\n const chapters = new QuranChapters(fetcher);\n const verses = new QuranVerses(fetcher);\n const juzs = new QuranJuzs(fetcher);\n const audio = new QuranAudio(fetcher);\n const hadithReferences = new QuranHadithReferences(fetcher);\n const resources = new QuranResources(fetcher);\n const searchClient = new QuranSearch(fetcher);\n\n const raw = {\n analytics: {\n v1: createRawClient(fetcher, operationCatalog.analytics.v1),\n },\n auth: {\n v1: createRawClient(fetcher, operationCatalog.auth.v1),\n },\n content: {\n v4: createRawClient(fetcher, operationCatalog.content.v4),\n },\n oauth2: {\n v1: createRawClient(fetcher, operationCatalog.oauth2.v1),\n },\n quranReflect: {\n v1: createRawClient(fetcher, operationCatalog.quranReflect.v1),\n },\n search: {\n v1: createRawClient(fetcher, operationCatalog.search.v1),\n },\n };\n\n const contentV4 = createContentFacade(\n answers,\n chapters,\n verses,\n juzs,\n audio,\n hadithReferences,\n resources,\n raw.content.v4,\n );\n const analyticsV1 = createAnalyticsFacade(raw.analytics.v1);\n const authV1 = createAuthFacade(fetcher);\n const quranReflectV1 = createQuranReflectFacade(fetcher);\n const oauth2V1 = createOAuth2Facade(fetcher, mode, config);\n\n const query = ({\n query: searchQuery,\n ...options\n }: {\n query: string;\n } & Omit<SearchParams, \"query\">) => searchClient.search(searchQuery, options);\n\n const search = Object.assign(searchClient, {\n query,\n raw: raw.search.v1,\n v1: {\n query,\n raw: raw.search.v1,\n },\n });\n\n return {\n analytics: {\n ...analyticsV1,\n v1: analyticsV1,\n },\n answers,\n audio,\n auth: {\n ...authV1,\n v1: authV1,\n },\n chapters,\n clearCachedTokens: () => fetcher.clearCachedTokens(),\n content: {\n ...contentV4,\n v4: contentV4,\n },\n getUserSession: () => fetcher.getUserSession(),\n hadithReferences,\n juzs,\n oauth2: {\n ...oauth2V1,\n v1: oauth2V1,\n },\n quranReflect: {\n ...quranReflectV1,\n v1: quranReflectV1,\n },\n raw,\n resources,\n search,\n verses,\n };\n};\n","import { QuranHttpError } from \"./http-error\";\n\nexport type AppStateErrorCode =\n | \"app_state_data_deleted\"\n | \"app_state_disabled\"\n | \"app_state_policy_changed\"\n | \"app_state_unavailable\"\n | \"bootstrap_required\"\n | \"collection_not_allowed\"\n | \"document_not_found\"\n | \"document_too_large\"\n | \"idempotency_key_reused\"\n | \"internal_server_error\"\n | \"insufficient_scope\"\n | \"invalid_collection\"\n | \"invalid_etag\"\n | \"invalid_idempotency_key\"\n | \"invalid_json\"\n | \"invalid_key\"\n | \"invalid_precondition\"\n | \"invalid_sync_token\"\n | \"invalid_token\"\n | \"namespace_resolution_unavailable\"\n | \"payload_too_large\"\n | \"precondition_failed\"\n | \"precondition_required\"\n | \"quota_exceeded\"\n | \"rate_limit_exceeded\"\n | \"sync_token_expired\";\n\nexport interface AppStateServiceError {\n code: AppStateErrorCode;\n details?: {\n currentETag?: string | null;\n [key: string]: unknown;\n };\n message?: string;\n [key: string]: unknown;\n}\n\nexport interface AppStateErrorPayload {\n details: {\n currentETag?: string | null;\n error: AppStateErrorCode | AppStateServiceError;\n [key: string]: unknown;\n };\n message: string;\n success: false;\n type: string;\n}\n\nexport type AppStateHttpError = QuranHttpError & {\n readonly payload: AppStateErrorPayload;\n};\n\nconst APP_STATE_ERROR_CODES: ReadonlySet<string> = new Set<AppStateErrorCode>([\n \"app_state_data_deleted\",\n \"app_state_disabled\",\n \"app_state_policy_changed\",\n \"app_state_unavailable\",\n \"bootstrap_required\",\n \"collection_not_allowed\",\n \"document_not_found\",\n \"document_too_large\",\n \"idempotency_key_reused\",\n \"internal_server_error\",\n \"insufficient_scope\",\n \"invalid_collection\",\n \"invalid_etag\",\n \"invalid_idempotency_key\",\n \"invalid_json\",\n \"invalid_key\",\n \"invalid_precondition\",\n \"invalid_sync_token\",\n \"invalid_token\",\n \"namespace_resolution_unavailable\",\n \"payload_too_large\",\n \"precondition_failed\",\n \"precondition_required\",\n \"quota_exceeded\",\n \"rate_limit_exceeded\",\n \"sync_token_expired\",\n]);\n\nexport const getAppStateErrorCode = (\n error: unknown,\n): AppStateErrorCode | undefined => {\n if (!(error instanceof QuranHttpError)) {\n return undefined;\n }\n\n const payload = error.payload;\n if (typeof payload !== \"object\" || payload === null) {\n return undefined;\n }\n\n const details = (payload as { details?: unknown }).details;\n if (typeof details !== \"object\" || details === null) {\n return undefined;\n }\n\n const serviceError = (details as { error?: unknown }).error;\n const code =\n typeof serviceError === \"string\"\n ? serviceError\n : typeof serviceError === \"object\" && serviceError !== null\n ? (serviceError as { code?: unknown }).code\n : undefined;\n return typeof code === \"string\" && APP_STATE_ERROR_CODES.has(code)\n ? (code as AppStateErrorCode)\n : undefined;\n};\n\nexport function isAppStateHttpError(\n error: unknown,\n code?: AppStateErrorCode,\n): error is AppStateHttpError {\n const actualCode = getAppStateErrorCode(error);\n return (\n actualCode !== undefined && (code === undefined || code === actualCode)\n );\n}\n","import type {\n AppStateAccountState,\n AppStateChange,\n AppStatePendingMutation,\n AppStatePendingPut,\n AppStatePutBody,\n AppStateStateView,\n AppStateStore,\n AppStateStoredDocument,\n AppStateStoreReducer,\n AppStateVisibleDocument,\n} from \"@/types\";\n\nexport type AppStateProtocolErrorCode =\n | \"bootstrap_cursor_missing\"\n | \"bootstrap_sync_token_missing\"\n | \"put_response_etag_missing\"\n | \"same_version_conflict\";\n\nexport class AppStateProtocolError extends Error {\n public readonly code: AppStateProtocolErrorCode;\n\n public constructor(code: AppStateProtocolErrorCode) {\n super(`App State reconciliation protocol error: ${code}`);\n this.name = \"AppStateProtocolError\";\n this.code = code;\n }\n}\n\nconst cloneJson = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst deepFreeze = <T>(value: T): Readonly<T> => {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return value;\n }\n\n for (const child of Object.values(value)) {\n deepFreeze(child);\n }\n return Object.freeze(value);\n};\n\nconst stableJson = (value: unknown): string => {\n if (Array.isArray(value)) {\n return `[${value.map(stableJson).join(\",\")}]`;\n }\n if (typeof value === \"object\" && value !== null) {\n const object = value as Record<string, unknown>;\n return `{${Object.keys(object)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableJson(object[key])}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value);\n};\n\nexport const appStateDocumentId = (collection: string, key: string): string =>\n `${collection}/${encodeURIComponent(key)}`;\n\nexport const createInitialAppStateState = (): AppStateAccountState => ({\n bootstrapCursor: null,\n localRevision: 0,\n pendingMutations: [],\n shadow: {},\n stagingBootstrap: null,\n syncToken: null,\n});\n\nconst assertSynchronousResult = (value: unknown): void => {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then?: unknown }).then === \"function\"\n ) {\n throw new TypeError(\"App State store reducers must be synchronous.\");\n }\n};\n\nexport const createAppStateMemoryStore = (\n initialStates: Readonly<Record<string, AppStateAccountState>> = {},\n): AppStateStore => {\n const accounts = new Map<string, AppStateAccountState>(\n Object.entries(initialStates).map(([accountId, state]) => [\n accountId,\n deepFreeze(cloneJson(state)) as AppStateAccountState,\n ]),\n );\n const transactions = new Map<string, Promise<void>>();\n\n return {\n transaction: <T>(\n accountId: string,\n reducer: AppStateStoreReducer<T>,\n ): Promise<T> => {\n if (!accountId) {\n return Promise.reject(\n new TypeError(\"App State transactions require an account ID.\"),\n );\n }\n\n const previous = transactions.get(accountId) ?? Promise.resolve();\n const operation = previous.then(() => {\n const current = accounts.get(accountId) ?? createInitialAppStateState();\n const draft = cloneJson(current);\n const result = reducer(draft);\n assertSynchronousResult(result);\n deepFreeze(draft);\n accounts.set(accountId, draft);\n return result;\n });\n transactions.set(\n accountId,\n operation.then(\n () => undefined,\n () => undefined,\n ),\n );\n return operation;\n },\n };\n};\n\nconst applyChange = (\n documents: Record<string, AppStateStoredDocument>,\n change: AppStateChange,\n): void => {\n const id = appStateDocumentId(change.collection, change.key);\n const current = documents[id];\n if (current && change.version < current.version) {\n return;\n }\n if (current && change.version === current.version) {\n if (stableJson(current) !== stableJson(change)) {\n throw new AppStateProtocolError(\"same_version_conflict\");\n }\n return;\n }\n documents[id] = cloneJson(change);\n};\n\nexport const applyAppStateChangePage = (\n state: AppStateAccountState,\n changes: readonly AppStateChange[],\n nextSyncToken: string,\n target: \"shadow\" | \"stagingBootstrap\" = \"shadow\",\n): void => {\n const current =\n target === \"shadow\" ? state.shadow : (state.stagingBootstrap ?? {});\n const replacement = cloneJson(current);\n for (const change of changes) {\n applyChange(replacement, change);\n }\n\n if (target === \"shadow\") {\n state.shadow = replacement;\n } else {\n state.stagingBootstrap = replacement;\n }\n state.syncToken = nextSyncToken;\n};\n\nexport const applyAppStateBootstrapPage = (\n state: AppStateAccountState,\n items: readonly AppStateStoredDocument[],\n nextCursor: string | null,\n): void => {\n const replacement = cloneJson(state.stagingBootstrap ?? {});\n for (const item of items) {\n applyChange(replacement, item);\n }\n state.stagingBootstrap = replacement;\n state.bootstrapCursor = nextCursor;\n};\n\nexport const promoteAppStateBootstrap = (state: AppStateAccountState): void => {\n state.shadow = cloneJson(state.stagingBootstrap ?? {});\n state.stagingBootstrap = null;\n state.bootstrapCursor = null;\n};\n\nconst currentPrecondition = (\n state: AppStateAccountState,\n collection: string,\n key: string,\n): Pick<AppStatePendingMutation, \"ifMatch\" | \"ifNoneMatch\"> => {\n const current = state.shadow[appStateDocumentId(collection, key)];\n return current?.operation === \"upsert\"\n ? { ifMatch: current.etag }\n : { ifNoneMatch: \"*\" };\n};\n\nexport const queueAppStatePut = (\n state: AppStateAccountState,\n collection: string,\n key: string,\n body: AppStatePutBody,\n idempotencyKey: string,\n): number => {\n const localRevision = state.localRevision + 1;\n const mutation: AppStatePendingPut = {\n ...currentPrecondition(state, collection, key),\n body: cloneJson(body),\n collection,\n idempotencyKey,\n key,\n localRevision,\n method: \"PUT\",\n };\n deepFreeze(mutation);\n state.pendingMutations = [...state.pendingMutations, mutation];\n state.localRevision = localRevision;\n return localRevision;\n};\n\nexport const queueAppStateDelete = (\n state: AppStateAccountState,\n collection: string,\n key: string,\n idempotencyKey: string,\n): number => {\n const localRevision = state.localRevision + 1;\n const mutation: AppStatePendingMutation = {\n ...currentPrecondition(state, collection, key),\n collection,\n idempotencyKey,\n key,\n localRevision,\n method: \"DELETE\",\n };\n deepFreeze(mutation);\n state.pendingMutations = [...state.pendingMutations, mutation];\n state.localRevision = localRevision;\n return localRevision;\n};\n\nconst visibleFromShadow = (\n shadow: Readonly<Record<string, AppStateStoredDocument>>,\n): Record<string, AppStateVisibleDocument> => {\n const visible: Record<string, AppStateVisibleDocument> = {};\n for (const [id, document] of Object.entries(shadow)) {\n if (document.operation === \"delete\") {\n continue;\n }\n visible[id] = {\n collection: document.collection,\n etag: document.etag,\n key: document.key,\n pending: false,\n schemaVersion: document.schemaVersion,\n updatedAt: document.updatedAt,\n value: cloneJson(document.value),\n version: document.version,\n };\n }\n return visible;\n};\n\nexport const deriveAppStateStateView = (\n state: AppStateAccountState,\n): AppStateStateView => {\n const snapshot = cloneJson(state);\n const visible = visibleFromShadow(snapshot.shadow);\n for (const mutation of snapshot.pendingMutations) {\n const id = appStateDocumentId(mutation.collection, mutation.key);\n if (mutation.method === \"DELETE\") {\n delete visible[id];\n continue;\n }\n const current = visible[id];\n visible[id] = {\n collection: mutation.collection,\n etag: current?.etag ?? null,\n key: mutation.key,\n pending: true,\n schemaVersion: mutation.body.schemaVersion,\n updatedAt: current?.updatedAt ?? null,\n value: cloneJson(mutation.body.value),\n version: current?.version ?? null,\n };\n }\n return deepFreeze({ ...snapshot, visible }) as AppStateStateView;\n};\n\nexport const snapshotAppStateMutations = (\n state: AppStateAccountState,\n): readonly AppStatePendingMutation[] =>\n deepFreeze(cloneJson(state.pendingMutations));\n\nexport const removeAppStateMutation = (\n state: AppStateAccountState,\n localRevision: number,\n): void => {\n state.pendingMutations = state.pendingMutations.filter(\n (mutation) => mutation.localRevision !== localRevision,\n );\n};\n\nexport const replaceAppStateMutation = (\n state: AppStateAccountState,\n mutation: AppStatePendingMutation,\n): void => {\n state.pendingMutations = state.pendingMutations.map((pending) =>\n pending.localRevision === mutation.localRevision\n ? (deepFreeze(cloneJson(mutation)) as AppStatePendingMutation)\n : pending,\n );\n};\n","import type {\n AppStateAccountState,\n AppStateChange,\n AppStateMutationOptions,\n AppStatePendingMutation,\n AppStatePendingPut,\n AppStatePutBody,\n AppStateReconciler,\n AppStateReconcilerOptions,\n AppStateResponse,\n AppStateStateView,\n AppStateStoredDocument,\n AppStateTransport,\n} from \"@/types\";\nimport { getAppStateErrorCode } from \"@/sdk/app-state-errors\";\n\nimport {\n applyAppStateBootstrapPage,\n applyAppStateChangePage,\n appStateDocumentId,\n AppStateProtocolError,\n deriveAppStateStateView,\n promoteAppStateBootstrap,\n queueAppStateDelete,\n queueAppStatePut,\n removeAppStateMutation,\n replaceAppStateMutation,\n snapshotAppStateMutations,\n} from \"./app-state-state\";\n\ninterface ReconcileContext {\n accountId: string;\n generation: number;\n transport: AppStateTransport;\n}\n\nconst DEFAULT_PAGE_SIZE = 100;\nconst DEFAULT_MAX_BOOTSTRAP_RESTART_ATTEMPTS = 3;\nconst DEFAULT_MAX_REBASE_ATTEMPTS = 3;\n\nconst defaultIdempotencyKey = (): string => {\n const runtimeCrypto = (\n globalThis as { crypto?: { randomUUID?: () => string } }\n ).crypto;\n if (typeof runtimeCrypto?.randomUUID !== \"function\") {\n throw new Error(\n \"App State reconciliation requires createIdempotencyKey when crypto.randomUUID is unavailable.\",\n );\n }\n return runtimeCrypto.randomUUID();\n};\n\nconst mutationOptions = (\n mutation: AppStatePendingMutation,\n): AppStateMutationOptions => {\n if (mutation.ifMatch !== undefined) {\n return {\n idempotencyKey: mutation.idempotencyKey,\n ifMatch: mutation.ifMatch,\n };\n }\n if (mutation.ifNoneMatch !== undefined) {\n return {\n idempotencyKey: mutation.idempotencyKey,\n ifNoneMatch: mutation.ifNoneMatch,\n };\n }\n return { idempotencyKey: mutation.idempotencyKey };\n};\n\nconst bootstrapItems = (\n items: readonly Omit<AppStateStoredDocument, \"operation\">[],\n): AppStateStoredDocument[] =>\n items.map((item) => ({ ...item, operation: \"upsert\" }));\n\nconst isRecoveryError = (error: unknown): boolean => {\n const code = getAppStateErrorCode(error);\n return code === \"bootstrap_required\" || code === \"sync_token_expired\";\n};\n\nconst positiveInteger = (value: number, name: string): number => {\n if (!Number.isInteger(value) || value <= 0) {\n throw new TypeError(`${name} must be a positive integer.`);\n }\n return value;\n};\n\nexport const createAppStateReconciler = ({\n accountId: initialAccountId,\n createIdempotencyKey = defaultIdempotencyKey,\n maxRebaseAttempts = DEFAULT_MAX_REBASE_ATTEMPTS,\n pageSize = DEFAULT_PAGE_SIZE,\n store,\n transport: initialTransport,\n}: AppStateReconcilerOptions): AppStateReconciler => {\n if (!initialAccountId) {\n throw new TypeError(\"App State reconciliation requires an account ID.\");\n }\n positiveInteger(pageSize, \"pageSize\");\n if (!Number.isInteger(maxRebaseAttempts) || maxRebaseAttempts < 0) {\n throw new TypeError(\"maxRebaseAttempts must be a non-negative integer.\");\n }\n\n let activeAccountId = initialAccountId;\n let activeTransport = initialTransport;\n let accountGeneration = 0;\n let reconcileQueue = Promise.resolve();\n\n const isCurrent = (context: ReconcileContext): boolean =>\n context.accountId === activeAccountId &&\n context.generation === accountGeneration;\n\n const context = (): ReconcileContext => ({\n accountId: activeAccountId,\n generation: accountGeneration,\n transport: activeTransport,\n });\n\n const commit = async (\n reconcileContext: ReconcileContext,\n reducer: (state: AppStateAccountState) => void,\n ): Promise<boolean> => {\n if (!isCurrent(reconcileContext)) return false;\n return store.transaction(reconcileContext.accountId, (state) => {\n if (!isCurrent(reconcileContext)) return false;\n reducer(state);\n return true;\n });\n };\n\n const readProgress = (reconcileContext: ReconcileContext) =>\n store.transaction(reconcileContext.accountId, (state) => ({\n bootstrapCursor: state.bootstrapCursor,\n hasStaging: state.stagingBootstrap !== null,\n syncToken: state.syncToken,\n }));\n\n const resetBootstrap = (\n reconcileContext: ReconcileContext,\n ): Promise<boolean> =>\n commit(reconcileContext, (state) => {\n state.bootstrapCursor = null;\n state.stagingBootstrap = {};\n state.syncToken = null;\n });\n\n const rebuildBootstrap = async (\n reconcileContext: ReconcileContext,\n reset: boolean,\n ): Promise<void> => {\n let restartAttempts = 0;\n if (reset && !(await resetBootstrap(reconcileContext))) return;\n\n while (isCurrent(reconcileContext)) {\n while (isCurrent(reconcileContext)) {\n const progress = await readProgress(reconcileContext);\n if (!isCurrent(reconcileContext)) return;\n if (\n progress.hasStaging &&\n progress.bootstrapCursor === null &&\n progress.syncToken !== null\n ) {\n break;\n }\n\n let response: Awaited<ReturnType<AppStateTransport[\"bootstrap\"]>>;\n try {\n response = await reconcileContext.transport.bootstrap({\n ...(progress.bootstrapCursor === null\n ? {}\n : { cursor: progress.bootstrapCursor }),\n limit: pageSize,\n });\n } catch (error) {\n if (!isCurrent(reconcileContext)) return;\n throw error;\n }\n if (!isCurrent(reconcileContext)) return;\n\n const page = response.data;\n if (page.hasMore && page.nextCursor === null) {\n throw new AppStateProtocolError(\"bootstrap_cursor_missing\");\n }\n if (!page.hasMore && page.nextSyncToken === null) {\n throw new AppStateProtocolError(\"bootstrap_sync_token_missing\");\n }\n const pageCommitted = await commit(reconcileContext, (state) => {\n applyAppStateBootstrapPage(\n state,\n bootstrapItems(page.items),\n page.hasMore ? page.nextCursor : null,\n );\n if (!page.hasMore) {\n state.syncToken = page.nextSyncToken;\n }\n });\n if (!pageCommitted) return;\n if (!page.hasMore) break;\n }\n\n while (isCurrent(reconcileContext)) {\n const { syncToken } = await readProgress(reconcileContext);\n if (!isCurrent(reconcileContext)) return;\n if (syncToken === null) {\n throw new AppStateProtocolError(\"bootstrap_sync_token_missing\");\n }\n let response: Awaited<ReturnType<AppStateTransport[\"getChanges\"]>>;\n try {\n response = await reconcileContext.transport.getChanges(syncToken, {\n limit: pageSize,\n });\n } catch (error) {\n if (!isCurrent(reconcileContext)) return;\n if (!isRecoveryError(error)) throw error;\n const resetCommitted = await resetBootstrap(reconcileContext);\n if (!resetCommitted) return;\n if (restartAttempts >= DEFAULT_MAX_BOOTSTRAP_RESTART_ATTEMPTS) {\n throw error;\n }\n restartAttempts += 1;\n break;\n }\n if (!isCurrent(reconcileContext)) return;\n\n const pageCommitted = await commit(reconcileContext, (state) => {\n applyAppStateChangePage(\n state,\n response.data.changes,\n response.data.nextSyncToken,\n \"stagingBootstrap\",\n );\n if (!response.data.hasMore) {\n promoteAppStateBootstrap(state);\n }\n });\n if (!pageCommitted || !response.data.hasMore) return;\n }\n }\n };\n\n const pull = async (reconcileContext: ReconcileContext): Promise<void> => {\n const initial = await readProgress(reconcileContext);\n if (!isCurrent(reconcileContext)) return;\n if (initial.syncToken === null || initial.hasStaging) {\n await rebuildBootstrap(reconcileContext, false);\n return;\n }\n\n while (isCurrent(reconcileContext)) {\n const { syncToken } = await readProgress(reconcileContext);\n if (!isCurrent(reconcileContext)) return;\n if (syncToken === null) {\n await rebuildBootstrap(reconcileContext, false);\n return;\n }\n\n try {\n const response = await reconcileContext.transport.getChanges(\n syncToken,\n {\n limit: pageSize,\n },\n );\n if (!isCurrent(reconcileContext)) return;\n const pageCommitted = await commit(reconcileContext, (state) => {\n applyAppStateChangePage(\n state,\n response.data.changes,\n response.data.nextSyncToken,\n );\n });\n if (!pageCommitted || !response.data.hasMore) return;\n } catch (error) {\n if (!isCurrent(reconcileContext)) return;\n if (!isRecoveryError(error)) throw error;\n await rebuildBootstrap(reconcileContext, true);\n return;\n }\n }\n };\n\n const applySuccessfulPut = async (\n reconcileContext: ReconcileContext,\n mutation: AppStatePendingPut,\n response: AppStateResponse<{\n collection: string;\n key: string;\n schemaVersion: number;\n updatedAt: string;\n version: number;\n }>,\n ): Promise<void> => {\n const etag = response.etag;\n if (etag === null) {\n throw new AppStateProtocolError(\"put_response_etag_missing\");\n }\n await commit(reconcileContext, (state) => {\n if (state.syncToken !== null) {\n const change: AppStateChange = {\n ...response.data,\n etag,\n operation: \"upsert\",\n value: mutation.body.value,\n };\n applyAppStateChangePage(state, [change], state.syncToken);\n }\n removeAppStateMutation(state, mutation.localRevision);\n });\n };\n\n const acknowledgeDelete = async (\n reconcileContext: ReconcileContext,\n mutation: AppStatePendingMutation,\n ): Promise<void> => {\n await commit(reconcileContext, (state) => {\n const id = appStateDocumentId(mutation.collection, mutation.key);\n const current = state.shadow[id];\n if (current) {\n state.shadow[id] = { ...current, operation: \"delete\", value: null };\n }\n removeAppStateMutation(state, mutation.localRevision);\n });\n };\n\n const refreshAndRebase = async (\n reconcileContext: ReconcileContext,\n mutation: AppStatePendingMutation,\n ): Promise<AppStatePendingMutation | null> => {\n let current: Awaited<ReturnType<AppStateTransport[\"getDocument\"]>> | null;\n try {\n current = await reconcileContext.transport.getDocument(\n mutation.collection,\n mutation.key,\n );\n } catch (error) {\n if (getAppStateErrorCode(error) !== \"document_not_found\") throw error;\n current = null;\n }\n if (!isCurrent(reconcileContext)) return null;\n if (current !== null && current.etag === null) {\n throw new Error(\"App State conflict refresh did not return an ETag.\");\n }\n\n if (current === null && mutation.method === \"DELETE\") {\n await acknowledgeDelete(reconcileContext, mutation);\n return null;\n }\n\n const rebased: AppStatePendingMutation =\n mutation.method === \"PUT\"\n ? {\n body: mutation.body,\n collection: mutation.collection,\n idempotencyKey: createIdempotencyKey(),\n ...(current === null\n ? { ifNoneMatch: \"*\" }\n : { ifMatch: current.etag! }),\n key: mutation.key,\n localRevision: mutation.localRevision,\n method: \"PUT\",\n }\n : {\n collection: mutation.collection,\n idempotencyKey: createIdempotencyKey(),\n ifMatch: current!.etag!,\n key: mutation.key,\n localRevision: mutation.localRevision,\n method: \"DELETE\",\n };\n\n const committed = await commit(reconcileContext, (state) => {\n if (current !== null && state.syncToken !== null) {\n applyAppStateChangePage(\n state,\n [\n {\n ...current.data,\n etag: current.etag!,\n operation: \"upsert\",\n },\n ],\n state.syncToken,\n );\n }\n replaceAppStateMutation(state, rebased);\n });\n return committed ? rebased : null;\n };\n\n const replayMutation = async (\n reconcileContext: ReconcileContext,\n captured: AppStatePendingMutation,\n ): Promise<void> => {\n let mutation = captured;\n let rebaseAttempts = 0;\n\n while (isCurrent(reconcileContext)) {\n try {\n if (mutation.method === \"PUT\") {\n const response = await reconcileContext.transport.putDocument(\n mutation.collection,\n mutation.key,\n mutation.body,\n mutationOptions(mutation),\n );\n if (!isCurrent(reconcileContext)) return;\n await applySuccessfulPut(reconcileContext, mutation, response);\n } else {\n await reconcileContext.transport.deleteDocument(\n mutation.collection,\n mutation.key,\n mutationOptions(mutation),\n );\n if (!isCurrent(reconcileContext)) return;\n await acknowledgeDelete(reconcileContext, mutation);\n }\n return;\n } catch (error) {\n if (!isCurrent(reconcileContext)) return;\n const errorCode = getAppStateErrorCode(error);\n if (\n mutation.method === \"DELETE\" &&\n errorCode === \"document_not_found\"\n ) {\n await acknowledgeDelete(reconcileContext, mutation);\n return;\n }\n if (\n errorCode !== \"precondition_failed\" ||\n rebaseAttempts >= maxRebaseAttempts\n ) {\n throw error;\n }\n rebaseAttempts += 1;\n const rebased = await refreshAndRebase(reconcileContext, mutation);\n if (rebased === null) return;\n mutation = rebased;\n }\n }\n };\n\n const replay = async (reconcileContext: ReconcileContext): Promise<void> => {\n const captured = await store.transaction(\n reconcileContext.accountId,\n snapshotAppStateMutations,\n );\n for (const mutation of captured) {\n if (!isCurrent(reconcileContext)) return;\n await replayMutation(reconcileContext, mutation);\n }\n };\n\n const reconcileContext = async (\n reconcileContext: ReconcileContext,\n ): Promise<void> => {\n await pull(reconcileContext);\n if (!isCurrent(reconcileContext)) return;\n try {\n await replay(reconcileContext);\n } catch (error) {\n if (!isRecoveryError(error)) throw error;\n await rebuildBootstrap(reconcileContext, true);\n if (!isCurrent(reconcileContext)) return;\n await replay(reconcileContext);\n }\n if (!isCurrent(reconcileContext)) return;\n await pull(reconcileContext);\n };\n\n const getStateFor = (accountId: string): Promise<AppStateStateView> =>\n store.transaction(accountId, deriveAppStateStateView);\n\n return {\n deleteDocument: async (collection, key) => {\n const mutationContext = context();\n const idempotencyKey = createIdempotencyKey();\n await store.transaction(mutationContext.accountId, (state) => {\n queueAppStateDelete(state, collection, key, idempotencyKey);\n });\n return getStateFor(activeAccountId);\n },\n getState: () => getStateFor(activeAccountId),\n putDocument: async (collection, key, body: AppStatePutBody) => {\n const mutationContext = context();\n const idempotencyKey = createIdempotencyKey();\n const bodySnapshot = JSON.parse(JSON.stringify(body)) as AppStatePutBody;\n await store.transaction(mutationContext.accountId, (state) => {\n queueAppStatePut(\n state,\n collection,\n key,\n bodySnapshot,\n idempotencyKey,\n );\n });\n return getStateFor(activeAccountId);\n },\n reconcile: () => {\n const capturedContext = context();\n const operation = reconcileQueue.then(() =>\n reconcileContext(capturedContext),\n );\n reconcileQueue = operation.then(\n () => undefined,\n () => undefined,\n );\n return operation.then(() => getStateFor(activeAccountId));\n },\n switchAccount: (accountId, transport) => {\n if (!accountId) {\n return Promise.reject(\n new TypeError(\"App State reconciliation requires an account ID.\"),\n );\n }\n accountGeneration += 1;\n activeAccountId = accountId;\n activeTransport = transport;\n return getStateFor(accountId);\n },\n };\n};\n","import type { ServerClientConfig } from \"@/types\";\nimport { Language } from \"@/types\";\n\nimport { createRuntimeClient } from \"./runtime/create-client\";\n\nexport { createAppStateReconciler } from \"./runtime/app-state-reconciler\";\nexport {\n AppStateProtocolError,\n createAppStateMemoryStore,\n} from \"./runtime/app-state-state\";\nexport { QuranHttpError } from \"./sdk/http-error\";\nexport {\n getAppStateErrorCode,\n isAppStateHttpError,\n} from \"./sdk/app-state-errors\";\nexport type {\n AppStateErrorCode,\n AppStateErrorPayload,\n AppStateHttpError,\n} from \"./sdk/app-state-errors\";\nexport type {\n AppStateAccountState,\n AppStateBootstrapPage,\n AppStateChange,\n AppStateChangesOptions,\n AppStateChangesPage,\n AppStateCollection,\n AppStateConfiguration,\n AppStateDocument,\n AppStateDocumentWithEtag,\n AppStateJsonValue,\n AppStateLimits,\n AppStateMutationOptions,\n AppStateMutationResult,\n AppStatePage,\n AppStatePageOptions,\n AppStatePendingDelete,\n AppStatePendingMutation,\n AppStatePendingMutationBase,\n AppStatePendingPut,\n AppStatePutBody,\n AppStateReconciler,\n AppStateReconcilerOptions,\n AppStateResponse,\n AppStateStateView,\n AppStateStore,\n AppStateStoredDocument,\n AppStateStoreReducer,\n AppStateSuccess,\n AppStateTransport,\n AppStateVisibleDocument,\n} from \"@/types\";\n\nexport const createServerClient = (config: ServerClientConfig) => {\n return createRuntimeClient(\"server\", {\n ...config,\n defaults: {\n language: Language.ARABIC,\n ...config.defaults,\n },\n });\n};\n\nexport type ServerClient = ReturnType<typeof createServerClient>;\n"]}