@quranjs/api 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +2 -2
- package/dist/index.min.mjs.map +1 -1
- package/dist/public.d.mts +2 -2
- package/dist/public.d.ts +2 -2
- package/dist/public.min.js +1 -1
- package/dist/public.min.js.map +1 -1
- package/dist/public.min.mjs +1 -1
- package/dist/public.min.mjs.map +1 -1
- package/dist/server.d.mts +2 -2
- package/dist/server.d.ts +2 -2
- package/dist/server.min.js +2 -2
- package/dist/server.min.js.map +1 -1
- package/dist/server.min.mjs +2 -2
- package/dist/server.min.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.min.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';var _=require('humps');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ___default=/*#__PURE__*/_interopDefault(_);var w=(i,e)=>{let t=`${i}:${e}`;if(typeof Buffer<"u")return Buffer.from(t).toString("base64");if(typeof globalThis.btoa=="function")return globalThis.btoa(t);throw new Error("No base64 encoder available for HTTP basic auth.")};var C=async(i,e={retries:3})=>{let t;for(let s=0;s<=e.retries;s++)try{return await i()}catch(o){if(t=o,s===e.retries)throw t;await new Promise(n=>setTimeout(n,Math.pow(2,s)*1e3));}throw t};var T="https://apis.quran.foundation",V={oauth2:"https://oauth2.quran.foundation"};var{decamelize:y}=___default.default;var S=i=>i.startsWith("/")?i.slice(1):i;var N=["wordFields","translationFields","fields"],E=new Set([...N,...N.map(i=>y(i))]),F=new Set(["navigationalResultsNumber","versesResultsNumber"]),g=i=>{if(!i)return "";let e=new URLSearchParams;for(let[t,s]of Object.entries(i)){if(s===void 0)continue;let o=F.has(t)?t:y(t);if(E.has(t)||E.has(o)){let n=Object.entries(s).filter(([,R])=>R).map(([R])=>y(R));n.length>0&&e.set(o,n.join(","));continue}typeof s=="string"?e.set(o,s):typeof s=="number"||typeof s=="boolean"?e.set(o,s.toString()):Array.isArray(s)&&e.set(o,s.join(","));}return e.size===0?"":`?${e.toString()}`};var k=(n=>(n.Word="word",n.End="end",n.Pause="pause",n.Sajdah="sajdah",n.RubElHizb="rub-el-hizb",n))(k||{});var G=(c=>(c.SURAH="surah",c.JUZ="juz",c.HIZB="hizb",c.AYAH="ayah",c.RUB_EL_HIZB="rub_el_hizb",c.SEARCH_PAGE="search_page",c.PAGE="page",c.RANGE="range",c.QURAN_RANGE="quran_range",c))(G||{});var z=(t=>(t.Advanced="advanced",t.Quick="quick",t))(z||{});var B=(r=>(r.ARABIC="ar",r.ENGLISH="en",r.URDU="ur",r.BENGALI="bn",r.TURKISH="tr",r.SPANISH="es",r.GERMAN="de",r.BOSNIAN="bs",r.RUSSIAN="ru",r.ALBANIAN_AL="al",r.FRENCH="fr",r.DUTCH="nl",r.TAMIL="ta",r.TAJIK="tg",r.INDONESIAN="id",r.UZBEK="uz",r.VIETNAMESE="vi",r.CHINESE="zh",r.ITALIAN="it",r.JAPANESE="ja",r.MALAYALAM="ml",r.AMHARIC="am",r.KAZAKH="kk",r.PORTUGUESE="pt",r.TAGALOG="tl",r.THAI="th",r.KOREAN="ko",r.HINDI="hi",r.KURDISH="ku",r.HAUSA="ha",r.AZERI="az",r.SWAHILI="sw",r.PERSIAN="fa",r.SERBIAN="sr",r.MARANAO="mrn",r.AMAZIGH="zgh",r.ASSAMESE="as",r.BULGARIAN="bg",r.CHECHEN="ce",r.CZECH="cs",r.DIVEHI="dv",r.FINNISH="fi",r.GUJAARATI="gu",r.HEBREW="he",r.GEORGIAN="ka",r.CENTRAL_KHMER="km",r.GANDA="lg",r.MARATHI="mr",r.YORUBA="yo",r.MALAY="ms",r.NEPALI="ne",r.SWEDISH="sv",r.TELUGU="te",r.TATAR="tt",r.UYGHUR="ug",r.UKRAINIAN="uk",r.NORWEGIAN="no",r.OROMO="om",r.POLISH="pl",r.PASHTO="ps",r.ROMANIAN="ro",r.SINDHI="sd",r.NORTHERN_SAMI="se",r.SINHALA="si",r.SOMALI="so",r.ALBANIAN_SQ="sq",r))(B||{}),H=(s=>(s.MadaniV1="code_v1",s.MadaniV2="code_v2",s.Uthmani="text_uthmani",s))(H||{});var a=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>114)};var b=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>30)};var A=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>240)};var I=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>60)};var v=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>604)};var O={1:7,2:286,3:200,4:176,5:120,6:165,7:206,8:75,9:129,10:109,11:123,12:111,13:43,14:52,15:99,16:128,17:111,18:110,19:98,20:135,21:112,22:78,23:118,24:64,25:77,26:227,27:93,28:88,29:69,30:60,31:34,32:30,33:73,34:54,35:45,36:83,37:182,38:88,39:75,40:85,41:54,42:53,43:89,44:59,45:37,46:35,47:38,48:29,49:18,50:45,51:60,52:49,53:62,54:55,55:78,56:96,57:29,58:22,59:24,60:13,61:14,62:11,63:11,64:18,65:12,66:12,67:30,68:52,69:52,70:44,71:28,72:28,73:20,74:56,75:40,76:31,77:50,78:40,79:46,80:42,81:29,82:19,83:36,84:25,85:22,86:17,87:19,88:26,89:30,90:20,91:15,92:21,93:11,94:8,95:8,96:19,97:5,98:8,99:8,100:11,101:11,102:8,103:3,104:9,105:5,106:4,107:7,108:3,109:6,110:3,111:5,112:4,113:5,114:6};var p=i=>{let[e,t]=i.trim().split(":");if(!e||!t||!a(e))return false;let s=Number(t),o=O[e];return !(!s||s<=0||s>o)};var $="https://verses.quran.com";function U(i){return i.map(e=>{let t=e.url.startsWith("http://")||e.url.startsWith("https://")?e.url:`${$}/${e.url.replace(/^\/+/,"")}`;return {...e,audioUrl:t}})}var f=class{constructor(e){this.fetcher=e;}async findAllChapterRecitations(e,t){let{audioFiles:s}=await this.fetcher.fetch(`/content/api/v4/chapter_recitations/${e}`,t);return s}async findChapterRecitationById(e,t,s){if(!a(t))throw new Error("Invalid chapter id");let{audioFile:o}=await this.fetcher.fetch(`/content/api/v4/chapter_recitations/${e}/${t}`,s);return o}async findVerseRecitationsByChapter(e,t,s){if(!a(e))throw new Error("Invalid chapter id");let o=await this.fetcher.fetch(`/content/api/v4/recitations/${t}/by_chapter/${e}`,s);return {...o,audioFiles:U(o.audioFiles)}}async findVerseRecitationsByKey(e,t,s){if(!p(e))throw new Error("Invalid verse key");let o=await this.fetcher.fetch(`/content/api/v4/recitations/${t}/by_ayah/${e}`,s);return {...o,audioFiles:U(o.audioFiles)}}};var h=class{constructor(e){this.fetcher=e;}async findAll(e){let{chapters:t}=await this.fetcher.fetch("/content/api/v4/chapters",e);return t}async findById(e,t){if(!a(e))throw new Error("Invalid chapter id");let{chapter:s}=await this.fetcher.fetch(`/content/api/v4/chapters/${e}`,t);return s}async findInfoById(e,t){if(!a(e))throw new Error("Invalid chapter id");let{chapterInfo:s}=await this.fetcher.fetch(`/content/api/v4/chapters/${e}/info`,t);return s}};var l=class{constructor(e){this.fetcher=e;}async findAll(){let{juzs:e}=await this.fetcher.fetch("/content/api/v4/juzs");return e}};var u=class{constructor(e){this.fetcher=e;}async findAllRecitations(e){let{recitations:t}=await this.fetcher.fetch("/content/api/v4/resources/recitations",e);return t}async findAllTranslations(e){let{translations:t}=await this.fetcher.fetch("/content/api/v4/resources/translations",e);return t}async findAllTafsirs(e){let{tafsirs:t}=await this.fetcher.fetch("/content/api/v4/resources/tafsirs",e);return t}async findAllLanguages(e){let{languages:t}=await this.fetcher.fetch("/content/api/v4/resources/languages",e);return t}async findRecitationInfo(e,t){let{recitationInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/recitations/${e}/info`,t);return s}async findTranslationInfo(e,t){let{translationInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/translations/${e}/info`,t);return s}async findTafsirInfo(e,t){let{tafsirInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/tafsirs/${e}/info`,t);return s}async findAllChapterInfos(e){let{chapterInfos:t}=await this.fetcher.fetch("/content/api/v4/resources/chapter_infos",e);return t}async findAllChapterReciters(e){let{reciters:t}=await this.fetcher.fetch("/content/api/v4/resources/chapter_reciters",e);return t}async findAllRecitationStyles(e){let{recitationStyles:t}=await this.fetcher.fetch("/content/api/v4/resources/recitation_styles",e);return t}async findVerseMedia(e){let{verseMedia:t}=await this.fetcher.fetch("/content/api/v4/resources/verse_media",e);return t}};var m=class{constructor(e){this.fetcher=e;}async search(e,t){return this.fetcher.fetch("/v1/search",{query:e,size:30,...t})}};var d=class{constructor(e){this.fetcher=e;}async findByKey(e,t){if(!p(e))throw new Error("Invalid verse key");let{verse:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_key/${e}`,{words:false,...t});return s}async findByRange(e,t,s){if(!p(e)||!p(t))throw new Error("Invalid verse key");let{verses:o}=await this.fetcher.fetch("/content/api/v4/verses/by_range",{words:false,...s,from:e,to:t});return o}async findByChapter(e,t){if(!a(e))throw new Error("Invalid chapter id");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_chapter/${e}`,{words:false,...t});return s}async findByPage(e,t){if(!v(e))throw new Error("Invalid page number");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_page/${e}`,{words:false,...t});return s}async findByJuz(e,t){if(!b(e))throw new Error("Invalid juz");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_juz/${e}`,{words:false,...t});return s}async findByHizb(e,t){if(!I(e))throw new Error("Invalid hizb");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_hizb/${e}`,{words:false,...t});return s}async findByRub(e,t){if(!A(e))throw new Error("Invalid rub");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_rub/${e}`,{words:false,...t});return s}async findRandom(e){let{verse:t}=await this.fetcher.fetch("/content/api/v4/verses/random",{words:false,...e});return t}};var {camelizeKeys:M}=___default.default,Q="content search",P=class{constructor(e){this.config=e;}cachedToken=null;updateConfig(e){this.config=e;}getFetch(){let e=this.config.fetch??globalThis.fetch;if(typeof e!="function")throw new Error("No fetch function available. Please provide a fetch implementation or ensure global fetch is available.");return e}clearCachedToken(){this.cachedToken=null;}async fetch(e,t){let s=await this.getAccessToken(),o=await this.getFetch()(this.makeUrl(e,t),{headers:{"Content-Type":"application/json","x-auth-token":s,"x-client-id":this.config.clientId}});if(!o.ok||o.status>=400)throw new Error(`${o.status} ${o.statusText}`);let n=await o.json();return M(n)}makeUrl(e,t){return `${this.config.contentBaseUrl}/${S(e)}${g({...this.config.defaults,...t})}`}async getAccessToken(){if(this.cachedToken&&this.cachedToken.expiresAt>Date.now()+3e4)return this.cachedToken.value;let e=new URLSearchParams({grant_type:"client_credentials",scope:Q}).toString(),t=await C(()=>this.getFetch()(`${this.config.authBaseUrl}/oauth2/token`,{body:e,headers:{Accept:"application/json",Authorization:`Basic ${w(this.config.clientId,this.config.clientSecret)}`,"Content-Type":"application/x-www-form-urlencoded"},method:"POST"}),{retries:3});if(!t.ok)throw new Error(`Token request failed: ${t.statusText}`);let s=await t.json();return this.cachedToken={expiresAt:Date.now()+s.expires_in*1e3,value:s.access_token},this.cachedToken.value}},x=class{config;fetcher;chapters;verses;juzs;audio;resources;search;constructor(e){this.config={authBaseUrl:V.oauth2,contentBaseUrl:T,...e,defaults:{language:"ar",...e.defaults}},this.fetcher=new P(this.config),this.fetcher.getFetch(),this.chapters=new h(this.fetcher),this.verses=new d(this.fetcher),this.juzs=new l(this.fetcher),this.audio=new f(this.fetcher),this.resources=new u(this.fetcher),this.search=new m(this.fetcher);}getConfig(){return {...this.config}}updateConfig(e){this.config={...this.config,...e,defaults:{...this.config.defaults,...e.defaults}},this.fetcher.updateConfig(this.config);}clearCachedToken(){this.fetcher.clearCachedToken();}};
|
|
2
|
-
exports.CharType=
|
|
1
|
+
'use strict';var F=require('humps');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var F__default=/*#__PURE__*/_interopDefault(F);var C=(i,e)=>{let t=`${i}:${e}`;if(typeof Buffer<"u")return Buffer.from(t).toString("base64");if(typeof globalThis.btoa=="function")return globalThis.btoa(t);throw new Error("No base64 encoder available for HTTP basic auth.")};var T=async(i,e={retries:3})=>{let t;for(let s=0;s<=e.retries;s++)try{return await i()}catch(o){if(t=o,s===e.retries)throw t;await new Promise(n=>setTimeout(n,Math.pow(2,s)*1e3));}throw t};var V="https://apis.quran.foundation",N={oauth2:"https://oauth2.quran.foundation"};var{decamelize:y}=F__default.default;var g=i=>i.startsWith("/")?i.slice(1):i;var E=["wordFields","translationFields","fields"],S=new Set([...E,...E.map(i=>y(i))]),k=new Set(["navigationalResultsNumber","versesResultsNumber"]),O=(i,e={})=>{if(!i)return "";let t=new URLSearchParams;for(let[s,o]of Object.entries(i)){if(o===void 0)continue;let n=e.preserveCase||k.has(s)?s:y(s);if(S.has(s)||S.has(n)){let w=Object.entries(o).filter(([,R])=>R).map(([R])=>y(R));w.length>0&&t.set(n,w.join(","));continue}typeof o=="string"?t.set(n,o):typeof o=="number"||typeof o=="boolean"?t.set(n,o.toString()):Array.isArray(o)&&t.set(n,o.join(","));}return t.size===0?"":`?${t.toString()}`};var G=(n=>(n.Word="word",n.End="end",n.Pause="pause",n.Sajdah="sajdah",n.RubElHizb="rub-el-hizb",n))(G||{});var z=(c=>(c.SURAH="surah",c.JUZ="juz",c.HIZB="hizb",c.AYAH="ayah",c.RUB_EL_HIZB="rub_el_hizb",c.SEARCH_PAGE="search_page",c.PAGE="page",c.RANGE="range",c.QURAN_RANGE="quran_range",c))(z||{});var H=(t=>(t.Advanced="advanced",t.Quick="quick",t))(H||{});var B=(r=>(r.ARABIC="ar",r.ENGLISH="en",r.URDU="ur",r.BENGALI="bn",r.TURKISH="tr",r.SPANISH="es",r.GERMAN="de",r.BOSNIAN="bs",r.RUSSIAN="ru",r.ALBANIAN_AL="al",r.FRENCH="fr",r.DUTCH="nl",r.TAMIL="ta",r.TAJIK="tg",r.INDONESIAN="id",r.UZBEK="uz",r.VIETNAMESE="vi",r.CHINESE="zh",r.ITALIAN="it",r.JAPANESE="ja",r.MALAYALAM="ml",r.AMHARIC="am",r.KAZAKH="kk",r.PORTUGUESE="pt",r.TAGALOG="tl",r.THAI="th",r.KOREAN="ko",r.HINDI="hi",r.KURDISH="ku",r.HAUSA="ha",r.AZERI="az",r.SWAHILI="sw",r.PERSIAN="fa",r.SERBIAN="sr",r.MARANAO="mrn",r.AMAZIGH="zgh",r.ASSAMESE="as",r.BULGARIAN="bg",r.CHECHEN="ce",r.CZECH="cs",r.DIVEHI="dv",r.FINNISH="fi",r.GUJAARATI="gu",r.HEBREW="he",r.GEORGIAN="ka",r.CENTRAL_KHMER="km",r.GANDA="lg",r.MARATHI="mr",r.YORUBA="yo",r.MALAY="ms",r.NEPALI="ne",r.SWEDISH="sv",r.TELUGU="te",r.TATAR="tt",r.UYGHUR="ug",r.UKRAINIAN="uk",r.NORWEGIAN="no",r.OROMO="om",r.POLISH="pl",r.PASHTO="ps",r.ROMANIAN="ro",r.SINDHI="sd",r.NORTHERN_SAMI="se",r.SINHALA="si",r.SOMALI="so",r.ALBANIAN_SQ="sq",r))(B||{}),$=(s=>(s.MadaniV1="code_v1",s.MadaniV2="code_v2",s.Uthmani="text_uthmani",s))($||{});var a=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>114)};var b=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>30)};var A=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>240)};var I=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>60)};var v=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>604)};var U={1:7,2:286,3:200,4:176,5:120,6:165,7:206,8:75,9:129,10:109,11:123,12:111,13:43,14:52,15:99,16:128,17:111,18:110,19:98,20:135,21:112,22:78,23:118,24:64,25:77,26:227,27:93,28:88,29:69,30:60,31:34,32:30,33:73,34:54,35:45,36:83,37:182,38:88,39:75,40:85,41:54,42:53,43:89,44:59,45:37,46:35,47:38,48:29,49:18,50:45,51:60,52:49,53:62,54:55,55:78,56:96,57:29,58:22,59:24,60:13,61:14,62:11,63:11,64:18,65:12,66:12,67:30,68:52,69:52,70:44,71:28,72:28,73:20,74:56,75:40,76:31,77:50,78:40,79:46,80:42,81:29,82:19,83:36,84:25,85:22,86:17,87:19,88:26,89:30,90:20,91:15,92:21,93:11,94:8,95:8,96:19,97:5,98:8,99:8,100:11,101:11,102:8,103:3,104:9,105:5,106:4,107:7,108:3,109:6,110:3,111:5,112:4,113:5,114:6};var p=i=>{let[e,t]=i.trim().split(":");if(!e||!t||!a(e))return false;let s=Number(t),o=U[e];return !(!s||s<=0||s>o)};var K="https://verses.quran.com";function _(i){return i.map(e=>{let t=e.url.startsWith("http://")||e.url.startsWith("https://")?e.url:`${K}/${e.url.replace(/^\/+/,"")}`;return {...e,audioUrl:t}})}var f=class{constructor(e){this.fetcher=e;}async findAllChapterRecitations(e,t){let{audioFiles:s}=await this.fetcher.fetch(`/content/api/v4/chapter_recitations/${e}`,t);return s}async findChapterRecitationById(e,t,s){if(!a(t))throw new Error("Invalid chapter id");let{audioFile:o}=await this.fetcher.fetch(`/content/api/v4/chapter_recitations/${e}/${t}`,s);return o}async findVerseRecitationsByChapter(e,t,s){if(!a(e))throw new Error("Invalid chapter id");let o=await this.fetcher.fetch(`/content/api/v4/recitations/${t}/by_chapter/${e}`,s);return {...o,audioFiles:_(o.audioFiles)}}async findVerseRecitationsByKey(e,t,s){if(!p(e))throw new Error("Invalid verse key");let o=await this.fetcher.fetch(`/content/api/v4/recitations/${t}/by_ayah/${e}`,s);return {...o,audioFiles:_(o.audioFiles)}}};var h=class{constructor(e){this.fetcher=e;}async findAll(e){let{chapters:t}=await this.fetcher.fetch("/content/api/v4/chapters",e);return t}async findById(e,t){if(!a(e))throw new Error("Invalid chapter id");let{chapter:s}=await this.fetcher.fetch(`/content/api/v4/chapters/${e}`,t);return s}async findInfoById(e,t){if(!a(e))throw new Error("Invalid chapter id");let{chapterInfo:s}=await this.fetcher.fetch(`/content/api/v4/chapters/${e}/info`,t);return s}};var l=class{constructor(e){this.fetcher=e;}async findAll(){let{juzs:e}=await this.fetcher.fetch("/content/api/v4/juzs");return e}};var u=class{constructor(e){this.fetcher=e;}async findAllRecitations(e){let{recitations:t}=await this.fetcher.fetch("/content/api/v4/resources/recitations",e);return t}async findAllTranslations(e){let{translations:t}=await this.fetcher.fetch("/content/api/v4/resources/translations",e);return t}async findAllTafsirs(e){let{tafsirs:t}=await this.fetcher.fetch("/content/api/v4/resources/tafsirs",e);return t}async findAllLanguages(e){let{languages:t}=await this.fetcher.fetch("/content/api/v4/resources/languages",e);return t}async findRecitationInfo(e,t){let{recitationInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/recitations/${e}/info`,t);return s}async findTranslationInfo(e,t){let{translationInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/translations/${e}/info`,t);return s}async findTafsirInfo(e,t){let{tafsirInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/tafsirs/${e}/info`,t);return s}async findAllChapterInfos(e){let{chapterInfos:t}=await this.fetcher.fetch("/content/api/v4/resources/chapter_infos",e);return t}async findAllChapterReciters(e){let{reciters:t}=await this.fetcher.fetch("/content/api/v4/resources/chapter_reciters",e);return t}async findAllRecitationStyles(e){let{recitationStyles:t}=await this.fetcher.fetch("/content/api/v4/resources/recitation_styles",e);return t}async findVerseMedia(e){let{verseMedia:t}=await this.fetcher.fetch("/content/api/v4/resources/verse_media",e);return t}};var m=class{constructor(e){this.fetcher=e;}async search(e,t){return this.fetcher.fetch("/v1/search",{query:e,size:30,...t})}};var d=class{constructor(e){this.fetcher=e;}async findByKey(e,t){if(!p(e))throw new Error("Invalid verse key");let{verse:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_key/${e}`,{words:false,...t});return s}async findByRange(e,t,s){if(!p(e)||!p(t))throw new Error("Invalid verse key");let{verses:o}=await this.fetcher.fetch("/content/api/v4/verses/by_range",{words:false,...s,from:e,to:t});return o}async findByChapter(e,t){if(!a(e))throw new Error("Invalid chapter id");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_chapter/${e}`,{words:false,...t});return s}async findByPage(e,t){if(!v(e))throw new Error("Invalid page number");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_page/${e}`,{words:false,...t});return s}async findByJuz(e,t){if(!b(e))throw new Error("Invalid juz");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_juz/${e}`,{words:false,...t});return s}async findByHizb(e,t){if(!I(e))throw new Error("Invalid hizb");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_hizb/${e}`,{words:false,...t});return s}async findByRub(e,t){if(!A(e))throw new Error("Invalid rub");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_rub/${e}`,{words:false,...t});return s}async findRandom(e){let{verse:t}=await this.fetcher.fetch("/content/api/v4/verses/random",{words:false,...e});return t}};var {camelizeKeys:Q}=F__default.default,j="content search",P=class{constructor(e){this.config=e;}cachedToken=null;updateConfig(e){this.config=e;}getFetch(){let e=this.config.fetch??globalThis.fetch;if(typeof e!="function")throw new Error("No fetch function available. Please provide a fetch implementation or ensure global fetch is available.");return e}clearCachedToken(){this.cachedToken=null;}async fetch(e,t){let s=await this.getAccessToken(),o=await this.getFetch()(this.makeUrl(e,t),{headers:{"Content-Type":"application/json","x-auth-token":s,"x-client-id":this.config.clientId}});if(!o.ok||o.status>=400)throw new Error(`${o.status} ${o.statusText}`);let n=await o.json();return Q(n)}makeUrl(e,t){return `${this.config.contentBaseUrl}/${g(e)}${O({...this.config.defaults,...t})}`}async getAccessToken(){if(this.cachedToken&&this.cachedToken.expiresAt>Date.now()+3e4)return this.cachedToken.value;let e=new URLSearchParams({grant_type:"client_credentials",scope:j}).toString(),t=await T(()=>this.getFetch()(`${this.config.authBaseUrl}/oauth2/token`,{body:e,headers:{Accept:"application/json",Authorization:`Basic ${C(this.config.clientId,this.config.clientSecret)}`,"Content-Type":"application/x-www-form-urlencoded"},method:"POST"}),{retries:3});if(!t.ok)throw new Error(`Token request failed: ${t.statusText}`);let s=await t.json();return this.cachedToken={expiresAt:Date.now()+s.expires_in*1e3,value:s.access_token},this.cachedToken.value}},x=class{config;fetcher;chapters;verses;juzs;audio;resources;search;constructor(e){this.config={authBaseUrl:N.oauth2,contentBaseUrl:V,...e,defaults:{language:"ar",...e.defaults}},this.fetcher=new P(this.config),this.fetcher.getFetch(),this.chapters=new h(this.fetcher),this.verses=new d(this.fetcher),this.juzs=new l(this.fetcher),this.audio=new f(this.fetcher),this.resources=new u(this.fetcher),this.search=new m(this.fetcher);}getConfig(){return {...this.config}}updateConfig(e){this.config={...this.config,...e,defaults:{...this.config.defaults,...e.defaults}},this.fetcher.updateConfig(this.config);}clearCachedToken(){this.fetcher.clearCachedToken();}};
|
|
2
|
+
exports.CharType=G;exports.Language=B;exports.QuranClient=x;exports.QuranFont=$;exports.SearchMode=H;exports.SearchNavigationType=z;exports.isValidChapterId=a;exports.isValidHizb=I;exports.isValidJuz=b;exports.isValidQuranPage=v;exports.isValidRub=A;exports.isValidVerseKey=p;//# sourceMappingURL=index.min.js.map
|
|
3
3
|
//# sourceMappingURL=index.min.js.map
|
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/http-utils.ts","../src/lib/retry.ts","../src/lib/service-config.ts","../src/lib/url.ts","../src/types/api/Word.ts","../src/types/api/search-result.ts","../src/types/BaseApiParams.ts","../src/types/index.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/audio.ts","../src/sdk/chapters.ts","../src/sdk/juzs.ts","../src/sdk/resources.ts","../src/sdk/search.ts","../src/sdk/verses.ts","../src/sdk/client.ts"],"names":["encodeBasicAuth","username","password","raw","retry","fn","options","lastError","i","error","resolve","API_BASE_URL","DEFAULT_BASE_URLS","decamelize","humps","removeBeginningSlash","url","fieldsKey","fieldsKeySet","key","preservedKeys","paramsToString","params","paramsString","rawKey","rawValue","fields","value","fieldKey","CharType","SearchNavigationType","SearchMode","Language","QuranFont","isValidChapterId","id","parsedId","isValidJuz","juz","parsedJuz","isValidRub","rub","parsedRub","isValidHizb","hizb","parsedHizb","isValidQuranPage","page","parsedPage","versesMapping","isValidVerseKey","chapterId","verseId","parsedVerse","verseCount","AUDIO_BASE_URL","normalizeVerseRecitations","audioFiles","file","absoluteUrl","QuranAudio","fetcher","reciterId","audioFile","recitationId","data","QuranChapters","chapters","chapter","chapterInfo","QuranJuzs","juzs","QuranResources","recitations","translations","tafsirs","languages","recitationInfo","translationInfo","tafsirInfo","chapterInfos","reciters","recitationStyles","verseMedia","QuranSearch","query","QuranVerses","verse","from","to","verses","camelizeKeys","LEGACY_CLIENT_CREDENTIALS_SCOPE","LegacyQuranFetcher","config","doFetch","token","response","json","body","QuranClient","newConfig"],"mappings":"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","file":"index.min.js","sourcesContent":["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","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 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 auth: \"/v1\",\n content: \"/api/v4\",\n oauth2: \"\",\n quranReflect: \"/v1\",\n search: \"/v1\",\n} as const;\n\nexport const GATEWAY_PATH_PREFIX = {\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 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 { 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\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 \"versesResultsNumber\",\n]);\n\nexport const paramsToString = (params?: ApiParams): 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 = preservedKeys.has(rawKey) ? rawKey : 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 { VerseKey } from \"../common/verse-key\";\nimport type { Translation } from \"./Translation\";\nimport type { Transliteration } from \"./Transliteration\";\n\nexport enum CharType {\n Word = \"word\",\n End = \"end\",\n Pause = \"pause\",\n Sajdah = \"sajdah\",\n RubElHizb = \"rub-el-hizb\",\n}\n\nexport interface Word {\n id?: number;\n position: number;\n audioUrl: string;\n charTypeName: CharType;\n codeV1?: string;\n codeV2?: string;\n pageNumber?: number;\n lineNumber?: number;\n text?: string;\n textUthmani?: string;\n textIndopak?: string;\n textImlaei?: string;\n translation: Translation;\n transliteration: Transliteration;\n location?: string; // chapter:verse:word\n verseKey?: VerseKey;\n}\n","export enum SearchNavigationType {\n SURAH = \"surah\",\n JUZ = \"juz\",\n HIZB = \"hizb\",\n AYAH = \"ayah\",\n RUB_EL_HIZB = \"rub_el_hizb\",\n SEARCH_PAGE = \"search_page\",\n PAGE = \"page\",\n RANGE = \"range\",\n QURAN_RANGE = \"quran_range\",\n}\n\nexport interface SearchResult {\n resultType: SearchNavigationType;\n key: number | string;\n name: string;\n arabic?: string;\n isArabic?: boolean;\n isTransliteration?: boolean;\n}\n","import type {\n Language,\n TranslationField,\n VerseField,\n WordField,\n} from \".\";\n\nexport type ApiParams = Record<\n string,\n string | number | boolean | unknown[] | undefined | Record<string, boolean>\n>;\n\n/**\n * Base parameters that are common across most API endpoints\n */\nexport interface BaseApiParams extends ApiParams {\n /** Language for the response */\n language?: Language;\n}\n\n/**\n * Pagination parameters\n */\nexport interface PaginationParams extends ApiParams {\n /** Page number for pagination */\n page?: number;\n /** Number of items per page */\n perPage?: number;\n}\n\nexport type BinaryString = \"0\" | \"1\";\n\nexport enum SearchMode {\n Advanced = \"advanced\",\n Quick = \"quick\",\n}\n\n/**\n * Search parameters\n */\nexport interface SearchParams extends BaseApiParams {\n /** Search mode */\n mode: SearchMode;\n /** Search query */\n query: string;\n /** Filter translations */\n filterTranslations?: string | string[];\n /** For advanced search, limit to exact matches */\n exactMatchesOnly?: BinaryString;\n /** Include text in the response */\n getText?: BinaryString;\n /** Include highlighted text */\n highlight?: BinaryString;\n /** Quick search navigational results count */\n navigationalResultsNumber?: number;\n /** Quick search verse results count */\n versesResultsNumber?: number;\n /** Comma-separated list of indexes */\n indexes?: string | string[];\n /** Page number for pagination */\n page?: number;\n /** Number of results to return */\n size?: number;\n /** Translation IDs to use for language detection */\n translationIds?: string | number | Array<string | number>;\n /** Quran fields to include in verse filters */\n fields?: Partial<Record<VerseField, boolean>>;\n /** Translation fields to include in verse filters */\n translationFields?: Partial<Record<TranslationField, boolean>>;\n /** Word fields to include in verse filters */\n wordFields?: Partial<Record<WordField, boolean>>;\n /** Include word data in verse filters */\n words?: boolean;\n}\n","export enum Language {\n ARABIC = \"ar\",\n ENGLISH = \"en\",\n URDU = \"ur\",\n BENGALI = \"bn\",\n TURKISH = \"tr\",\n SPANISH = \"es\",\n GERMAN = \"de\",\n BOSNIAN = \"bs\",\n RUSSIAN = \"ru\",\n ALBANIAN_AL = \"al\",\n FRENCH = \"fr\",\n DUTCH = \"nl\",\n TAMIL = \"ta\",\n TAJIK = \"tg\",\n INDONESIAN = \"id\",\n UZBEK = \"uz\",\n VIETNAMESE = \"vi\",\n CHINESE = \"zh\",\n ITALIAN = \"it\",\n JAPANESE = \"ja\",\n MALAYALAM = \"ml\",\n AMHARIC = \"am\",\n KAZAKH = \"kk\",\n PORTUGUESE = \"pt\",\n TAGALOG = \"tl\",\n THAI = \"th\",\n KOREAN = \"ko\",\n HINDI = \"hi\",\n KURDISH = \"ku\",\n HAUSA = \"ha\",\n AZERI = \"az\",\n SWAHILI = \"sw\",\n PERSIAN = \"fa\",\n SERBIAN = \"sr\",\n MARANAO = \"mrn\",\n AMAZIGH = \"zgh\",\n ASSAMESE = \"as\",\n BULGARIAN = \"bg\",\n CHECHEN = \"ce\",\n CZECH = \"cs\",\n DIVEHI = \"dv\",\n FINNISH = \"fi\",\n GUJAARATI = \"gu\",\n HEBREW = \"he\",\n GEORGIAN = \"ka\",\n CENTRAL_KHMER = \"km\",\n GANDA = \"lg\",\n MARATHI = \"mr\",\n YORUBA = \"yo\",\n MALAY = \"ms\",\n NEPALI = \"ne\",\n SWEDISH = \"sv\",\n TELUGU = \"te\",\n TATAR = \"tt\",\n UYGHUR = \"ug\",\n UKRAINIAN = \"uk\",\n NORWEGIAN = \"no\",\n OROMO = \"om\",\n POLISH = \"pl\",\n PASHTO = \"ps\",\n ROMANIAN = \"ro\",\n SINDHI = \"sd\",\n NORTHERN_SAMI = \"se\",\n SINHALA = \"si\",\n SOMALI = \"so\",\n ALBANIAN_SQ = \"sq\",\n}\n\nexport enum QuranFont {\n MadaniV1 = \"code_v1\",\n MadaniV2 = \"code_v2\",\n Uthmani = \"text_uthmani\",\n}\n\nexport type VerseField =\n | \"chapterId\"\n | \"textUthmani\"\n | \"textUthmaniSimple\"\n | \"textImlaei\"\n | \"textImlaeiSimple\"\n | \"textIndopak\"\n | \"textIndopakNastaleeq\"\n | \"textUthmaniTajweed\"\n | \"imageUrl\"\n | \"imageWidth\"\n | \"codeV1\"\n | \"codeV2\"\n | \"v1Page\"\n | \"v2Page\";\n\nexport type WordField =\n | \"v1Page\"\n | \"v2Page\"\n | \"textUthmani\"\n | \"textImlaei\"\n | \"textIndopak\"\n | \"verseKey\"\n | \"location\"\n | \"codeV1\"\n | \"codeV2\";\n\nexport type TranslationField =\n | \"resourceName\"\n | \"verseId\"\n | \"languageId\"\n | \"languageName\"\n | \"verseKey\"\n | \"chapterId\"\n | \"verseNumber\"\n | \"juzNumber\"\n | \"hizbNumber\"\n | \"rubNumber\"\n | \"pageNumber\";\n\nexport type VerseRecitationField = \"id\" | \"chapterId\" | \"segments\" | \"format\";\n\nexport * from \"./common/verse-key\";\nexport * from \"./common/chapter-id\";\nexport * from \"./common/hizb-number\";\nexport * from \"./common/juz-number\";\nexport * from \"./common/page-number\";\nexport * from \"./common/rub-number\";\n\nexport * from \"./api\";\nexport * from \"./BaseApiParams\";\nexport * from \"./quran-client\";\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 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 QuranFetchClient,\n} from \"@/types\";\nimport { isValidChapterId } from \"@/utils\";\n\ntype GetChapterOptions = BaseApiParams;\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 {GetChapterOptions} options\n * @example\n * client.chapters.findInfoById('1')\n * client.chapters.findInfoById('114')\n */\n async findInfoById(\n id: ChapterId,\n options?: GetChapterOptions,\n ): Promise<ChapterInfo> {\n if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n const { chapterInfo } = await this.fetcher.fetch<{\n chapterInfo: ChapterInfo;\n }>(`/content/api/v4/chapters/${id}/info`, options);\n\n return chapterInfo;\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 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","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 {\n ApiParams,\n CachedToken,\n CustomFetcher,\n QuranClientConfig,\n TokenResponse,\n} from \"@/types\";\nimport { encodeBasicAuth } from \"@/lib/http-utils\";\nimport { retry } from \"@/lib/retry\";\nimport { API_BASE_URL, DEFAULT_BASE_URLS } from \"@/lib/service-config\";\nimport { paramsToString, removeBeginningSlash } from \"@/lib/url\";\nimport { Language } from \"@/types\";\nimport humps from \"humps\";\n\nimport { QuranAudio } from \"./audio\";\nimport { QuranChapters } from \"./chapters\";\nimport { QuranJuzs } from \"./juzs\";\nimport { QuranResources } from \"./resources\";\nimport { QuranSearch } from \"./search\";\nimport { QuranVerses } from \"./verses\";\n\nconst { camelizeKeys } = humps;\nconst LEGACY_CLIENT_CREDENTIALS_SCOPE = \"content search\";\n\ntype LegacyConfig = Required<\n Pick<QuranClientConfig, \"authBaseUrl\" | \"contentBaseUrl\">\n> &\n Omit<QuranClientConfig, \"authBaseUrl\" | \"contentBaseUrl\">;\n\nclass LegacyQuranFetcher {\n private cachedToken: CachedToken | null = null;\n\n constructor(private config: LegacyConfig) {}\n\n public updateConfig(config: LegacyConfig): void {\n this.config = config;\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 clearCachedToken(): void {\n this.cachedToken = null;\n }\n\n public async fetch<T = unknown>(url: string, params?: ApiParams): Promise<T> {\n const token = await this.getAccessToken();\n const response = await this.getFetch()(this.makeUrl(url, params), {\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-auth-token\": token,\n \"x-client-id\": this.config.clientId,\n },\n });\n\n if (!response.ok || response.status >= 400) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n const json = await response.json();\n return camelizeKeys(json as object) as T;\n }\n\n private makeUrl(url: string, params?: ApiParams): string {\n return `${this.config.contentBaseUrl}/${removeBeginningSlash(\n url,\n )}${paramsToString({ ...this.config.defaults, ...params })}`;\n }\n\n private async getAccessToken(): Promise<string> {\n if (this.cachedToken && this.cachedToken.expiresAt > Date.now() + 30_000) {\n return this.cachedToken.value;\n }\n\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n scope: LEGACY_CLIENT_CREDENTIALS_SCOPE,\n }).toString();\n\n const response = await retry(\n () =>\n this.getFetch()(`${this.config.authBaseUrl}/oauth2/token`, {\n body,\n headers: {\n Accept: \"application/json\",\n Authorization: `Basic ${encodeBasicAuth(\n this.config.clientId,\n this.config.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(`Token request failed: ${response.statusText}`);\n }\n\n const json = (await response.json()) as TokenResponse;\n\n this.cachedToken = {\n expiresAt: Date.now() + json.expires_in * 1000,\n value: json.access_token,\n };\n\n return this.cachedToken.value;\n }\n}\n\n/**\n * Legacy universal Quran API client.\n *\n * Prefer `createPublicClient` from `@quranjs/api/public` or\n * `createServerClient` from `@quranjs/api/server` for new applications.\n */\nexport class QuranClient {\n private config: LegacyConfig;\n private fetcher: LegacyQuranFetcher;\n\n public readonly chapters: QuranChapters;\n public readonly verses: QuranVerses;\n public readonly juzs: QuranJuzs;\n public readonly audio: QuranAudio;\n public readonly resources: QuranResources;\n public readonly search: QuranSearch;\n\n constructor(config: QuranClientConfig) {\n this.config = {\n authBaseUrl: DEFAULT_BASE_URLS.oauth2,\n contentBaseUrl: API_BASE_URL,\n ...config,\n defaults: {\n language: Language.ARABIC,\n ...config.defaults,\n },\n };\n\n this.fetcher = new LegacyQuranFetcher(this.config);\n this.fetcher.getFetch();\n\n this.chapters = new QuranChapters(this.fetcher);\n this.verses = new QuranVerses(this.fetcher);\n this.juzs = new QuranJuzs(this.fetcher);\n this.audio = new QuranAudio(this.fetcher);\n this.resources = new QuranResources(this.fetcher);\n this.search = new QuranSearch(this.fetcher);\n }\n\n public getConfig(): QuranClientConfig {\n return { ...this.config };\n }\n\n public updateConfig(newConfig: Partial<QuranClientConfig>): void {\n this.config = {\n ...this.config,\n ...newConfig,\n defaults: {\n ...this.config.defaults,\n ...newConfig.defaults,\n },\n };\n\n this.fetcher.updateConfig(this.config);\n }\n\n public clearCachedToken(): void {\n this.fetcher.clearCachedToken();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/http-utils.ts","../src/lib/retry.ts","../src/lib/service-config.ts","../src/lib/url.ts","../src/types/api/Word.ts","../src/types/api/search-result.ts","../src/types/BaseApiParams.ts","../src/types/index.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/audio.ts","../src/sdk/chapters.ts","../src/sdk/juzs.ts","../src/sdk/resources.ts","../src/sdk/search.ts","../src/sdk/verses.ts","../src/sdk/client.ts"],"names":["encodeBasicAuth","username","password","raw","retry","fn","options","lastError","i","error","resolve","API_BASE_URL","DEFAULT_BASE_URLS","decamelize","humps","removeBeginningSlash","url","fieldsKey","fieldsKeySet","key","preservedKeys","paramsToString","params","paramsString","rawKey","rawValue","fields","value","fieldKey","CharType","SearchNavigationType","SearchMode","Language","QuranFont","isValidChapterId","id","parsedId","isValidJuz","juz","parsedJuz","isValidRub","rub","parsedRub","isValidHizb","hizb","parsedHizb","isValidQuranPage","page","parsedPage","versesMapping","isValidVerseKey","chapterId","verseId","parsedVerse","verseCount","AUDIO_BASE_URL","normalizeVerseRecitations","audioFiles","file","absoluteUrl","QuranAudio","fetcher","reciterId","audioFile","recitationId","data","QuranChapters","chapters","chapter","chapterInfo","QuranJuzs","juzs","QuranResources","recitations","translations","tafsirs","languages","recitationInfo","translationInfo","tafsirInfo","chapterInfos","reciters","recitationStyles","verseMedia","QuranSearch","query","QuranVerses","verse","from","to","verses","camelizeKeys","LEGACY_CLIENT_CREDENTIALS_SCOPE","LegacyQuranFetcher","config","doFetch","token","response","json","body","QuranClient","newConfig"],"mappings":"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","file":"index.min.js","sourcesContent":["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","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 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 auth: \"/v1\",\n content: \"/api/v4\",\n oauth2: \"\",\n quranReflect: \"/v1\",\n search: \"/v1\",\n} as const;\n\nexport const GATEWAY_PATH_PREFIX = {\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 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 { 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 \"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 { VerseKey } from \"../common/verse-key\";\nimport type { Translation } from \"./Translation\";\nimport type { Transliteration } from \"./Transliteration\";\n\nexport enum CharType {\n Word = \"word\",\n End = \"end\",\n Pause = \"pause\",\n Sajdah = \"sajdah\",\n RubElHizb = \"rub-el-hizb\",\n}\n\nexport interface Word {\n id?: number;\n position: number;\n audioUrl: string;\n charTypeName: CharType;\n codeV1?: string;\n codeV2?: string;\n pageNumber?: number;\n lineNumber?: number;\n text?: string;\n textUthmani?: string;\n textIndopak?: string;\n textImlaei?: string;\n translation: Translation;\n transliteration: Transliteration;\n location?: string; // chapter:verse:word\n verseKey?: VerseKey;\n}\n","export enum SearchNavigationType {\n SURAH = \"surah\",\n JUZ = \"juz\",\n HIZB = \"hizb\",\n AYAH = \"ayah\",\n RUB_EL_HIZB = \"rub_el_hizb\",\n SEARCH_PAGE = \"search_page\",\n PAGE = \"page\",\n RANGE = \"range\",\n QURAN_RANGE = \"quran_range\",\n}\n\nexport interface SearchResult {\n resultType: SearchNavigationType;\n key: number | string;\n name: string;\n arabic?: string;\n isArabic?: boolean;\n isTransliteration?: boolean;\n}\n","import type {\n Language,\n TranslationField,\n VerseField,\n WordField,\n} from \".\";\n\nexport type ApiParams = Record<\n string,\n string | number | boolean | unknown[] | undefined | Record<string, boolean>\n>;\n\n/**\n * Base parameters that are common across most API endpoints\n */\nexport interface BaseApiParams extends ApiParams {\n /** Language for the response */\n language?: Language;\n}\n\n/**\n * Pagination parameters\n */\nexport interface PaginationParams extends ApiParams {\n /** Page number for pagination */\n page?: number;\n /** Number of items per page */\n perPage?: number;\n}\n\nexport type BinaryString = \"0\" | \"1\";\n\nexport enum SearchMode {\n Advanced = \"advanced\",\n Quick = \"quick\",\n}\n\n/**\n * Search parameters\n */\nexport interface SearchParams extends BaseApiParams {\n /** Search mode */\n mode: SearchMode;\n /** Search query */\n query: string;\n /** Filter translations */\n filterTranslations?: string | string[];\n /** For advanced search, limit to exact matches */\n exactMatchesOnly?: BinaryString;\n /** Include text in the response */\n getText?: BinaryString;\n /** Include highlighted text */\n highlight?: BinaryString;\n /** Quick search navigational results count */\n navigationalResultsNumber?: number;\n /** Quick search verse results count */\n versesResultsNumber?: number;\n /** Comma-separated list of indexes */\n indexes?: string | string[];\n /** Page number for pagination */\n page?: number;\n /** Number of results to return */\n size?: number;\n /** Translation IDs to use for language detection */\n translationIds?: string | number | Array<string | number>;\n /** Quran fields to include in verse filters */\n fields?: Partial<Record<VerseField, boolean>>;\n /** Translation fields to include in verse filters */\n translationFields?: Partial<Record<TranslationField, boolean>>;\n /** Word fields to include in verse filters */\n wordFields?: Partial<Record<WordField, boolean>>;\n /** Include word data in verse filters */\n words?: boolean;\n}\n","export enum Language {\n ARABIC = \"ar\",\n ENGLISH = \"en\",\n URDU = \"ur\",\n BENGALI = \"bn\",\n TURKISH = \"tr\",\n SPANISH = \"es\",\n GERMAN = \"de\",\n BOSNIAN = \"bs\",\n RUSSIAN = \"ru\",\n ALBANIAN_AL = \"al\",\n FRENCH = \"fr\",\n DUTCH = \"nl\",\n TAMIL = \"ta\",\n TAJIK = \"tg\",\n INDONESIAN = \"id\",\n UZBEK = \"uz\",\n VIETNAMESE = \"vi\",\n CHINESE = \"zh\",\n ITALIAN = \"it\",\n JAPANESE = \"ja\",\n MALAYALAM = \"ml\",\n AMHARIC = \"am\",\n KAZAKH = \"kk\",\n PORTUGUESE = \"pt\",\n TAGALOG = \"tl\",\n THAI = \"th\",\n KOREAN = \"ko\",\n HINDI = \"hi\",\n KURDISH = \"ku\",\n HAUSA = \"ha\",\n AZERI = \"az\",\n SWAHILI = \"sw\",\n PERSIAN = \"fa\",\n SERBIAN = \"sr\",\n MARANAO = \"mrn\",\n AMAZIGH = \"zgh\",\n ASSAMESE = \"as\",\n BULGARIAN = \"bg\",\n CHECHEN = \"ce\",\n CZECH = \"cs\",\n DIVEHI = \"dv\",\n FINNISH = \"fi\",\n GUJAARATI = \"gu\",\n HEBREW = \"he\",\n GEORGIAN = \"ka\",\n CENTRAL_KHMER = \"km\",\n GANDA = \"lg\",\n MARATHI = \"mr\",\n YORUBA = \"yo\",\n MALAY = \"ms\",\n NEPALI = \"ne\",\n SWEDISH = \"sv\",\n TELUGU = \"te\",\n TATAR = \"tt\",\n UYGHUR = \"ug\",\n UKRAINIAN = \"uk\",\n NORWEGIAN = \"no\",\n OROMO = \"om\",\n POLISH = \"pl\",\n PASHTO = \"ps\",\n ROMANIAN = \"ro\",\n SINDHI = \"sd\",\n NORTHERN_SAMI = \"se\",\n SINHALA = \"si\",\n SOMALI = \"so\",\n ALBANIAN_SQ = \"sq\",\n}\n\nexport enum QuranFont {\n MadaniV1 = \"code_v1\",\n MadaniV2 = \"code_v2\",\n Uthmani = \"text_uthmani\",\n}\n\nexport type VerseField =\n | \"chapterId\"\n | \"textUthmani\"\n | \"textUthmaniSimple\"\n | \"textImlaei\"\n | \"textImlaeiSimple\"\n | \"textIndopak\"\n | \"textIndopakNastaleeq\"\n | \"textUthmaniTajweed\"\n | \"imageUrl\"\n | \"imageWidth\"\n | \"codeV1\"\n | \"codeV2\"\n | \"v1Page\"\n | \"v2Page\";\n\nexport type WordField =\n | \"v1Page\"\n | \"v2Page\"\n | \"textUthmani\"\n | \"textImlaei\"\n | \"textIndopak\"\n | \"verseKey\"\n | \"location\"\n | \"codeV1\"\n | \"codeV2\";\n\nexport type TranslationField =\n | \"resourceName\"\n | \"verseId\"\n | \"languageId\"\n | \"languageName\"\n | \"verseKey\"\n | \"chapterId\"\n | \"verseNumber\"\n | \"juzNumber\"\n | \"hizbNumber\"\n | \"rubNumber\"\n | \"pageNumber\";\n\nexport type VerseRecitationField = \"id\" | \"chapterId\" | \"segments\" | \"format\";\n\nexport * from \"./common/verse-key\";\nexport * from \"./common/chapter-id\";\nexport * from \"./common/hizb-number\";\nexport * from \"./common/juz-number\";\nexport * from \"./common/page-number\";\nexport * from \"./common/rub-number\";\n\nexport * from \"./api\";\nexport * from \"./BaseApiParams\";\nexport * from \"./quran-client\";\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 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 QuranFetchClient,\n} from \"@/types\";\nimport { isValidChapterId } from \"@/utils\";\n\ntype GetChapterOptions = BaseApiParams;\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 {GetChapterOptions} options\n * @example\n * client.chapters.findInfoById('1')\n * client.chapters.findInfoById('114')\n */\n async findInfoById(\n id: ChapterId,\n options?: GetChapterOptions,\n ): Promise<ChapterInfo> {\n if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n const { chapterInfo } = await this.fetcher.fetch<{\n chapterInfo: ChapterInfo;\n }>(`/content/api/v4/chapters/${id}/info`, options);\n\n return chapterInfo;\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 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","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 {\n ApiParams,\n CachedToken,\n CustomFetcher,\n QuranClientConfig,\n TokenResponse,\n} from \"@/types\";\nimport { encodeBasicAuth } from \"@/lib/http-utils\";\nimport { retry } from \"@/lib/retry\";\nimport { API_BASE_URL, DEFAULT_BASE_URLS } from \"@/lib/service-config\";\nimport { paramsToString, removeBeginningSlash } from \"@/lib/url\";\nimport { Language } from \"@/types\";\nimport humps from \"humps\";\n\nimport { QuranAudio } from \"./audio\";\nimport { QuranChapters } from \"./chapters\";\nimport { QuranJuzs } from \"./juzs\";\nimport { QuranResources } from \"./resources\";\nimport { QuranSearch } from \"./search\";\nimport { QuranVerses } from \"./verses\";\n\nconst { camelizeKeys } = humps;\nconst LEGACY_CLIENT_CREDENTIALS_SCOPE = \"content search\";\n\ntype LegacyConfig = Required<\n Pick<QuranClientConfig, \"authBaseUrl\" | \"contentBaseUrl\">\n> &\n Omit<QuranClientConfig, \"authBaseUrl\" | \"contentBaseUrl\">;\n\nclass LegacyQuranFetcher {\n private cachedToken: CachedToken | null = null;\n\n constructor(private config: LegacyConfig) {}\n\n public updateConfig(config: LegacyConfig): void {\n this.config = config;\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 clearCachedToken(): void {\n this.cachedToken = null;\n }\n\n public async fetch<T = unknown>(url: string, params?: ApiParams): Promise<T> {\n const token = await this.getAccessToken();\n const response = await this.getFetch()(this.makeUrl(url, params), {\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-auth-token\": token,\n \"x-client-id\": this.config.clientId,\n },\n });\n\n if (!response.ok || response.status >= 400) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n const json = await response.json();\n return camelizeKeys(json as object) as T;\n }\n\n private makeUrl(url: string, params?: ApiParams): string {\n return `${this.config.contentBaseUrl}/${removeBeginningSlash(\n url,\n )}${paramsToString({ ...this.config.defaults, ...params })}`;\n }\n\n private async getAccessToken(): Promise<string> {\n if (this.cachedToken && this.cachedToken.expiresAt > Date.now() + 30_000) {\n return this.cachedToken.value;\n }\n\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n scope: LEGACY_CLIENT_CREDENTIALS_SCOPE,\n }).toString();\n\n const response = await retry(\n () =>\n this.getFetch()(`${this.config.authBaseUrl}/oauth2/token`, {\n body,\n headers: {\n Accept: \"application/json\",\n Authorization: `Basic ${encodeBasicAuth(\n this.config.clientId,\n this.config.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(`Token request failed: ${response.statusText}`);\n }\n\n const json = (await response.json()) as TokenResponse;\n\n this.cachedToken = {\n expiresAt: Date.now() + json.expires_in * 1000,\n value: json.access_token,\n };\n\n return this.cachedToken.value;\n }\n}\n\n/**\n * Legacy universal Quran API client.\n *\n * Prefer `createPublicClient` from `@quranjs/api/public` or\n * `createServerClient` from `@quranjs/api/server` for new applications.\n */\nexport class QuranClient {\n private config: LegacyConfig;\n private fetcher: LegacyQuranFetcher;\n\n public readonly chapters: QuranChapters;\n public readonly verses: QuranVerses;\n public readonly juzs: QuranJuzs;\n public readonly audio: QuranAudio;\n public readonly resources: QuranResources;\n public readonly search: QuranSearch;\n\n constructor(config: QuranClientConfig) {\n this.config = {\n authBaseUrl: DEFAULT_BASE_URLS.oauth2,\n contentBaseUrl: API_BASE_URL,\n ...config,\n defaults: {\n language: Language.ARABIC,\n ...config.defaults,\n },\n };\n\n this.fetcher = new LegacyQuranFetcher(this.config);\n this.fetcher.getFetch();\n\n this.chapters = new QuranChapters(this.fetcher);\n this.verses = new QuranVerses(this.fetcher);\n this.juzs = new QuranJuzs(this.fetcher);\n this.audio = new QuranAudio(this.fetcher);\n this.resources = new QuranResources(this.fetcher);\n this.search = new QuranSearch(this.fetcher);\n }\n\n public getConfig(): QuranClientConfig {\n return { ...this.config };\n }\n\n public updateConfig(newConfig: Partial<QuranClientConfig>): void {\n this.config = {\n ...this.config,\n ...newConfig,\n defaults: {\n ...this.config.defaults,\n ...newConfig.defaults,\n },\n };\n\n this.fetcher.updateConfig(this.config);\n }\n\n public clearCachedToken(): void {\n this.fetcher.clearCachedToken();\n }\n}\n"]}
|
package/dist/index.min.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import _ from'humps';var w=(i,e)=>{let t=`${i}:${e}`;if(typeof Buffer<"u")return Buffer.from(t).toString("base64");if(typeof globalThis.btoa=="function")return globalThis.btoa(t);throw new Error("No base64 encoder available for HTTP basic auth.")};var C=async(i,e={retries:3})=>{let t;for(let s=0;s<=e.retries;s++)try{return await i()}catch(o){if(t=o,s===e.retries)throw t;await new Promise(n=>setTimeout(n,Math.pow(2,s)*1e3));}throw t};var T="https://apis.quran.foundation",V={oauth2:"https://oauth2.quran.foundation"};var{decamelize:y}=_;var S=i=>i.startsWith("/")?i.slice(1):i;var N=["wordFields","translationFields","fields"],E=new Set([...N,...N.map(i=>y(i))]),F=new Set(["navigationalResultsNumber","versesResultsNumber"]),g=i=>{if(!i)return "";let e=new URLSearchParams;for(let[t,s]of Object.entries(i)){if(s===void 0)continue;let o=F.has(t)?t:y(t);if(E.has(t)||E.has(o)){let n=Object.entries(s).filter(([,R])=>R).map(([R])=>y(R));n.length>0&&e.set(o,n.join(","));continue}typeof s=="string"?e.set(o,s):typeof s=="number"||typeof s=="boolean"?e.set(o,s.toString()):Array.isArray(s)&&e.set(o,s.join(","));}return e.size===0?"":`?${e.toString()}`};var k=(n=>(n.Word="word",n.End="end",n.Pause="pause",n.Sajdah="sajdah",n.RubElHizb="rub-el-hizb",n))(k||{});var G=(c=>(c.SURAH="surah",c.JUZ="juz",c.HIZB="hizb",c.AYAH="ayah",c.RUB_EL_HIZB="rub_el_hizb",c.SEARCH_PAGE="search_page",c.PAGE="page",c.RANGE="range",c.QURAN_RANGE="quran_range",c))(G||{});var z=(t=>(t.Advanced="advanced",t.Quick="quick",t))(z||{});var B=(r=>(r.ARABIC="ar",r.ENGLISH="en",r.URDU="ur",r.BENGALI="bn",r.TURKISH="tr",r.SPANISH="es",r.GERMAN="de",r.BOSNIAN="bs",r.RUSSIAN="ru",r.ALBANIAN_AL="al",r.FRENCH="fr",r.DUTCH="nl",r.TAMIL="ta",r.TAJIK="tg",r.INDONESIAN="id",r.UZBEK="uz",r.VIETNAMESE="vi",r.CHINESE="zh",r.ITALIAN="it",r.JAPANESE="ja",r.MALAYALAM="ml",r.AMHARIC="am",r.KAZAKH="kk",r.PORTUGUESE="pt",r.TAGALOG="tl",r.THAI="th",r.KOREAN="ko",r.HINDI="hi",r.KURDISH="ku",r.HAUSA="ha",r.AZERI="az",r.SWAHILI="sw",r.PERSIAN="fa",r.SERBIAN="sr",r.MARANAO="mrn",r.AMAZIGH="zgh",r.ASSAMESE="as",r.BULGARIAN="bg",r.CHECHEN="ce",r.CZECH="cs",r.DIVEHI="dv",r.FINNISH="fi",r.GUJAARATI="gu",r.HEBREW="he",r.GEORGIAN="ka",r.CENTRAL_KHMER="km",r.GANDA="lg",r.MARATHI="mr",r.YORUBA="yo",r.MALAY="ms",r.NEPALI="ne",r.SWEDISH="sv",r.TELUGU="te",r.TATAR="tt",r.UYGHUR="ug",r.UKRAINIAN="uk",r.NORWEGIAN="no",r.OROMO="om",r.POLISH="pl",r.PASHTO="ps",r.ROMANIAN="ro",r.SINDHI="sd",r.NORTHERN_SAMI="se",r.SINHALA="si",r.SOMALI="so",r.ALBANIAN_SQ="sq",r))(B||{}),H=(s=>(s.MadaniV1="code_v1",s.MadaniV2="code_v2",s.Uthmani="text_uthmani",s))(H||{});var a=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>114)};var b=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>30)};var A=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>240)};var I=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>60)};var v=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>604)};var O={1:7,2:286,3:200,4:176,5:120,6:165,7:206,8:75,9:129,10:109,11:123,12:111,13:43,14:52,15:99,16:128,17:111,18:110,19:98,20:135,21:112,22:78,23:118,24:64,25:77,26:227,27:93,28:88,29:69,30:60,31:34,32:30,33:73,34:54,35:45,36:83,37:182,38:88,39:75,40:85,41:54,42:53,43:89,44:59,45:37,46:35,47:38,48:29,49:18,50:45,51:60,52:49,53:62,54:55,55:78,56:96,57:29,58:22,59:24,60:13,61:14,62:11,63:11,64:18,65:12,66:12,67:30,68:52,69:52,70:44,71:28,72:28,73:20,74:56,75:40,76:31,77:50,78:40,79:46,80:42,81:29,82:19,83:36,84:25,85:22,86:17,87:19,88:26,89:30,90:20,91:15,92:21,93:11,94:8,95:8,96:19,97:5,98:8,99:8,100:11,101:11,102:8,103:3,104:9,105:5,106:4,107:7,108:3,109:6,110:3,111:5,112:4,113:5,114:6};var p=i=>{let[e,t]=i.trim().split(":");if(!e||!t||!a(e))return false;let s=Number(t),o=O[e];return !(!s||s<=0||s>o)};var $="https://verses.quran.com";function U(i){return i.map(e=>{let t=e.url.startsWith("http://")||e.url.startsWith("https://")?e.url:`${$}/${e.url.replace(/^\/+/,"")}`;return {...e,audioUrl:t}})}var f=class{constructor(e){this.fetcher=e;}async findAllChapterRecitations(e,t){let{audioFiles:s}=await this.fetcher.fetch(`/content/api/v4/chapter_recitations/${e}`,t);return s}async findChapterRecitationById(e,t,s){if(!a(t))throw new Error("Invalid chapter id");let{audioFile:o}=await this.fetcher.fetch(`/content/api/v4/chapter_recitations/${e}/${t}`,s);return o}async findVerseRecitationsByChapter(e,t,s){if(!a(e))throw new Error("Invalid chapter id");let o=await this.fetcher.fetch(`/content/api/v4/recitations/${t}/by_chapter/${e}`,s);return {...o,audioFiles:U(o.audioFiles)}}async findVerseRecitationsByKey(e,t,s){if(!p(e))throw new Error("Invalid verse key");let o=await this.fetcher.fetch(`/content/api/v4/recitations/${t}/by_ayah/${e}`,s);return {...o,audioFiles:U(o.audioFiles)}}};var h=class{constructor(e){this.fetcher=e;}async findAll(e){let{chapters:t}=await this.fetcher.fetch("/content/api/v4/chapters",e);return t}async findById(e,t){if(!a(e))throw new Error("Invalid chapter id");let{chapter:s}=await this.fetcher.fetch(`/content/api/v4/chapters/${e}`,t);return s}async findInfoById(e,t){if(!a(e))throw new Error("Invalid chapter id");let{chapterInfo:s}=await this.fetcher.fetch(`/content/api/v4/chapters/${e}/info`,t);return s}};var l=class{constructor(e){this.fetcher=e;}async findAll(){let{juzs:e}=await this.fetcher.fetch("/content/api/v4/juzs");return e}};var u=class{constructor(e){this.fetcher=e;}async findAllRecitations(e){let{recitations:t}=await this.fetcher.fetch("/content/api/v4/resources/recitations",e);return t}async findAllTranslations(e){let{translations:t}=await this.fetcher.fetch("/content/api/v4/resources/translations",e);return t}async findAllTafsirs(e){let{tafsirs:t}=await this.fetcher.fetch("/content/api/v4/resources/tafsirs",e);return t}async findAllLanguages(e){let{languages:t}=await this.fetcher.fetch("/content/api/v4/resources/languages",e);return t}async findRecitationInfo(e,t){let{recitationInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/recitations/${e}/info`,t);return s}async findTranslationInfo(e,t){let{translationInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/translations/${e}/info`,t);return s}async findTafsirInfo(e,t){let{tafsirInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/tafsirs/${e}/info`,t);return s}async findAllChapterInfos(e){let{chapterInfos:t}=await this.fetcher.fetch("/content/api/v4/resources/chapter_infos",e);return t}async findAllChapterReciters(e){let{reciters:t}=await this.fetcher.fetch("/content/api/v4/resources/chapter_reciters",e);return t}async findAllRecitationStyles(e){let{recitationStyles:t}=await this.fetcher.fetch("/content/api/v4/resources/recitation_styles",e);return t}async findVerseMedia(e){let{verseMedia:t}=await this.fetcher.fetch("/content/api/v4/resources/verse_media",e);return t}};var m=class{constructor(e){this.fetcher=e;}async search(e,t){return this.fetcher.fetch("/v1/search",{query:e,size:30,...t})}};var d=class{constructor(e){this.fetcher=e;}async findByKey(e,t){if(!p(e))throw new Error("Invalid verse key");let{verse:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_key/${e}`,{words:false,...t});return s}async findByRange(e,t,s){if(!p(e)||!p(t))throw new Error("Invalid verse key");let{verses:o}=await this.fetcher.fetch("/content/api/v4/verses/by_range",{words:false,...s,from:e,to:t});return o}async findByChapter(e,t){if(!a(e))throw new Error("Invalid chapter id");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_chapter/${e}`,{words:false,...t});return s}async findByPage(e,t){if(!v(e))throw new Error("Invalid page number");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_page/${e}`,{words:false,...t});return s}async findByJuz(e,t){if(!b(e))throw new Error("Invalid juz");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_juz/${e}`,{words:false,...t});return s}async findByHizb(e,t){if(!I(e))throw new Error("Invalid hizb");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_hizb/${e}`,{words:false,...t});return s}async findByRub(e,t){if(!A(e))throw new Error("Invalid rub");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_rub/${e}`,{words:false,...t});return s}async findRandom(e){let{verse:t}=await this.fetcher.fetch("/content/api/v4/verses/random",{words:false,...e});return t}};var {camelizeKeys:M}=_,Q="content search",P=class{constructor(e){this.config=e;}cachedToken=null;updateConfig(e){this.config=e;}getFetch(){let e=this.config.fetch??globalThis.fetch;if(typeof e!="function")throw new Error("No fetch function available. Please provide a fetch implementation or ensure global fetch is available.");return e}clearCachedToken(){this.cachedToken=null;}async fetch(e,t){let s=await this.getAccessToken(),o=await this.getFetch()(this.makeUrl(e,t),{headers:{"Content-Type":"application/json","x-auth-token":s,"x-client-id":this.config.clientId}});if(!o.ok||o.status>=400)throw new Error(`${o.status} ${o.statusText}`);let n=await o.json();return M(n)}makeUrl(e,t){return `${this.config.contentBaseUrl}/${S(e)}${g({...this.config.defaults,...t})}`}async getAccessToken(){if(this.cachedToken&&this.cachedToken.expiresAt>Date.now()+3e4)return this.cachedToken.value;let e=new URLSearchParams({grant_type:"client_credentials",scope:Q}).toString(),t=await C(()=>this.getFetch()(`${this.config.authBaseUrl}/oauth2/token`,{body:e,headers:{Accept:"application/json",Authorization:`Basic ${w(this.config.clientId,this.config.clientSecret)}`,"Content-Type":"application/x-www-form-urlencoded"},method:"POST"}),{retries:3});if(!t.ok)throw new Error(`Token request failed: ${t.statusText}`);let s=await t.json();return this.cachedToken={expiresAt:Date.now()+s.expires_in*1e3,value:s.access_token},this.cachedToken.value}},x=class{config;fetcher;chapters;verses;juzs;audio;resources;search;constructor(e){this.config={authBaseUrl:V.oauth2,contentBaseUrl:T,...e,defaults:{language:"ar",...e.defaults}},this.fetcher=new P(this.config),this.fetcher.getFetch(),this.chapters=new h(this.fetcher),this.verses=new d(this.fetcher),this.juzs=new l(this.fetcher),this.audio=new f(this.fetcher),this.resources=new u(this.fetcher),this.search=new m(this.fetcher);}getConfig(){return {...this.config}}updateConfig(e){this.config={...this.config,...e,defaults:{...this.config.defaults,...e.defaults}},this.fetcher.updateConfig(this.config);}clearCachedToken(){this.fetcher.clearCachedToken();}};
|
|
2
|
-
export{
|
|
1
|
+
import F from'humps';var C=(i,e)=>{let t=`${i}:${e}`;if(typeof Buffer<"u")return Buffer.from(t).toString("base64");if(typeof globalThis.btoa=="function")return globalThis.btoa(t);throw new Error("No base64 encoder available for HTTP basic auth.")};var T=async(i,e={retries:3})=>{let t;for(let s=0;s<=e.retries;s++)try{return await i()}catch(o){if(t=o,s===e.retries)throw t;await new Promise(n=>setTimeout(n,Math.pow(2,s)*1e3));}throw t};var V="https://apis.quran.foundation",N={oauth2:"https://oauth2.quran.foundation"};var{decamelize:y}=F;var g=i=>i.startsWith("/")?i.slice(1):i;var E=["wordFields","translationFields","fields"],S=new Set([...E,...E.map(i=>y(i))]),k=new Set(["navigationalResultsNumber","versesResultsNumber"]),O=(i,e={})=>{if(!i)return "";let t=new URLSearchParams;for(let[s,o]of Object.entries(i)){if(o===void 0)continue;let n=e.preserveCase||k.has(s)?s:y(s);if(S.has(s)||S.has(n)){let w=Object.entries(o).filter(([,R])=>R).map(([R])=>y(R));w.length>0&&t.set(n,w.join(","));continue}typeof o=="string"?t.set(n,o):typeof o=="number"||typeof o=="boolean"?t.set(n,o.toString()):Array.isArray(o)&&t.set(n,o.join(","));}return t.size===0?"":`?${t.toString()}`};var G=(n=>(n.Word="word",n.End="end",n.Pause="pause",n.Sajdah="sajdah",n.RubElHizb="rub-el-hizb",n))(G||{});var z=(c=>(c.SURAH="surah",c.JUZ="juz",c.HIZB="hizb",c.AYAH="ayah",c.RUB_EL_HIZB="rub_el_hizb",c.SEARCH_PAGE="search_page",c.PAGE="page",c.RANGE="range",c.QURAN_RANGE="quran_range",c))(z||{});var H=(t=>(t.Advanced="advanced",t.Quick="quick",t))(H||{});var B=(r=>(r.ARABIC="ar",r.ENGLISH="en",r.URDU="ur",r.BENGALI="bn",r.TURKISH="tr",r.SPANISH="es",r.GERMAN="de",r.BOSNIAN="bs",r.RUSSIAN="ru",r.ALBANIAN_AL="al",r.FRENCH="fr",r.DUTCH="nl",r.TAMIL="ta",r.TAJIK="tg",r.INDONESIAN="id",r.UZBEK="uz",r.VIETNAMESE="vi",r.CHINESE="zh",r.ITALIAN="it",r.JAPANESE="ja",r.MALAYALAM="ml",r.AMHARIC="am",r.KAZAKH="kk",r.PORTUGUESE="pt",r.TAGALOG="tl",r.THAI="th",r.KOREAN="ko",r.HINDI="hi",r.KURDISH="ku",r.HAUSA="ha",r.AZERI="az",r.SWAHILI="sw",r.PERSIAN="fa",r.SERBIAN="sr",r.MARANAO="mrn",r.AMAZIGH="zgh",r.ASSAMESE="as",r.BULGARIAN="bg",r.CHECHEN="ce",r.CZECH="cs",r.DIVEHI="dv",r.FINNISH="fi",r.GUJAARATI="gu",r.HEBREW="he",r.GEORGIAN="ka",r.CENTRAL_KHMER="km",r.GANDA="lg",r.MARATHI="mr",r.YORUBA="yo",r.MALAY="ms",r.NEPALI="ne",r.SWEDISH="sv",r.TELUGU="te",r.TATAR="tt",r.UYGHUR="ug",r.UKRAINIAN="uk",r.NORWEGIAN="no",r.OROMO="om",r.POLISH="pl",r.PASHTO="ps",r.ROMANIAN="ro",r.SINDHI="sd",r.NORTHERN_SAMI="se",r.SINHALA="si",r.SOMALI="so",r.ALBANIAN_SQ="sq",r))(B||{}),$=(s=>(s.MadaniV1="code_v1",s.MadaniV2="code_v2",s.Uthmani="text_uthmani",s))($||{});var a=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>114)};var b=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>30)};var A=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>240)};var I=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>60)};var v=i=>{let e=typeof i=="number"?i:Number(i);return !(!e||e<=0||e>604)};var U={1:7,2:286,3:200,4:176,5:120,6:165,7:206,8:75,9:129,10:109,11:123,12:111,13:43,14:52,15:99,16:128,17:111,18:110,19:98,20:135,21:112,22:78,23:118,24:64,25:77,26:227,27:93,28:88,29:69,30:60,31:34,32:30,33:73,34:54,35:45,36:83,37:182,38:88,39:75,40:85,41:54,42:53,43:89,44:59,45:37,46:35,47:38,48:29,49:18,50:45,51:60,52:49,53:62,54:55,55:78,56:96,57:29,58:22,59:24,60:13,61:14,62:11,63:11,64:18,65:12,66:12,67:30,68:52,69:52,70:44,71:28,72:28,73:20,74:56,75:40,76:31,77:50,78:40,79:46,80:42,81:29,82:19,83:36,84:25,85:22,86:17,87:19,88:26,89:30,90:20,91:15,92:21,93:11,94:8,95:8,96:19,97:5,98:8,99:8,100:11,101:11,102:8,103:3,104:9,105:5,106:4,107:7,108:3,109:6,110:3,111:5,112:4,113:5,114:6};var p=i=>{let[e,t]=i.trim().split(":");if(!e||!t||!a(e))return false;let s=Number(t),o=U[e];return !(!s||s<=0||s>o)};var K="https://verses.quran.com";function _(i){return i.map(e=>{let t=e.url.startsWith("http://")||e.url.startsWith("https://")?e.url:`${K}/${e.url.replace(/^\/+/,"")}`;return {...e,audioUrl:t}})}var f=class{constructor(e){this.fetcher=e;}async findAllChapterRecitations(e,t){let{audioFiles:s}=await this.fetcher.fetch(`/content/api/v4/chapter_recitations/${e}`,t);return s}async findChapterRecitationById(e,t,s){if(!a(t))throw new Error("Invalid chapter id");let{audioFile:o}=await this.fetcher.fetch(`/content/api/v4/chapter_recitations/${e}/${t}`,s);return o}async findVerseRecitationsByChapter(e,t,s){if(!a(e))throw new Error("Invalid chapter id");let o=await this.fetcher.fetch(`/content/api/v4/recitations/${t}/by_chapter/${e}`,s);return {...o,audioFiles:_(o.audioFiles)}}async findVerseRecitationsByKey(e,t,s){if(!p(e))throw new Error("Invalid verse key");let o=await this.fetcher.fetch(`/content/api/v4/recitations/${t}/by_ayah/${e}`,s);return {...o,audioFiles:_(o.audioFiles)}}};var h=class{constructor(e){this.fetcher=e;}async findAll(e){let{chapters:t}=await this.fetcher.fetch("/content/api/v4/chapters",e);return t}async findById(e,t){if(!a(e))throw new Error("Invalid chapter id");let{chapter:s}=await this.fetcher.fetch(`/content/api/v4/chapters/${e}`,t);return s}async findInfoById(e,t){if(!a(e))throw new Error("Invalid chapter id");let{chapterInfo:s}=await this.fetcher.fetch(`/content/api/v4/chapters/${e}/info`,t);return s}};var l=class{constructor(e){this.fetcher=e;}async findAll(){let{juzs:e}=await this.fetcher.fetch("/content/api/v4/juzs");return e}};var u=class{constructor(e){this.fetcher=e;}async findAllRecitations(e){let{recitations:t}=await this.fetcher.fetch("/content/api/v4/resources/recitations",e);return t}async findAllTranslations(e){let{translations:t}=await this.fetcher.fetch("/content/api/v4/resources/translations",e);return t}async findAllTafsirs(e){let{tafsirs:t}=await this.fetcher.fetch("/content/api/v4/resources/tafsirs",e);return t}async findAllLanguages(e){let{languages:t}=await this.fetcher.fetch("/content/api/v4/resources/languages",e);return t}async findRecitationInfo(e,t){let{recitationInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/recitations/${e}/info`,t);return s}async findTranslationInfo(e,t){let{translationInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/translations/${e}/info`,t);return s}async findTafsirInfo(e,t){let{tafsirInfo:s}=await this.fetcher.fetch(`/content/api/v4/resources/tafsirs/${e}/info`,t);return s}async findAllChapterInfos(e){let{chapterInfos:t}=await this.fetcher.fetch("/content/api/v4/resources/chapter_infos",e);return t}async findAllChapterReciters(e){let{reciters:t}=await this.fetcher.fetch("/content/api/v4/resources/chapter_reciters",e);return t}async findAllRecitationStyles(e){let{recitationStyles:t}=await this.fetcher.fetch("/content/api/v4/resources/recitation_styles",e);return t}async findVerseMedia(e){let{verseMedia:t}=await this.fetcher.fetch("/content/api/v4/resources/verse_media",e);return t}};var m=class{constructor(e){this.fetcher=e;}async search(e,t){return this.fetcher.fetch("/v1/search",{query:e,size:30,...t})}};var d=class{constructor(e){this.fetcher=e;}async findByKey(e,t){if(!p(e))throw new Error("Invalid verse key");let{verse:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_key/${e}`,{words:false,...t});return s}async findByRange(e,t,s){if(!p(e)||!p(t))throw new Error("Invalid verse key");let{verses:o}=await this.fetcher.fetch("/content/api/v4/verses/by_range",{words:false,...s,from:e,to:t});return o}async findByChapter(e,t){if(!a(e))throw new Error("Invalid chapter id");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_chapter/${e}`,{words:false,...t});return s}async findByPage(e,t){if(!v(e))throw new Error("Invalid page number");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_page/${e}`,{words:false,...t});return s}async findByJuz(e,t){if(!b(e))throw new Error("Invalid juz");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_juz/${e}`,{words:false,...t});return s}async findByHizb(e,t){if(!I(e))throw new Error("Invalid hizb");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_hizb/${e}`,{words:false,...t});return s}async findByRub(e,t){if(!A(e))throw new Error("Invalid rub");let{verses:s}=await this.fetcher.fetch(`/content/api/v4/verses/by_rub/${e}`,{words:false,...t});return s}async findRandom(e){let{verse:t}=await this.fetcher.fetch("/content/api/v4/verses/random",{words:false,...e});return t}};var {camelizeKeys:Q}=F,j="content search",P=class{constructor(e){this.config=e;}cachedToken=null;updateConfig(e){this.config=e;}getFetch(){let e=this.config.fetch??globalThis.fetch;if(typeof e!="function")throw new Error("No fetch function available. Please provide a fetch implementation or ensure global fetch is available.");return e}clearCachedToken(){this.cachedToken=null;}async fetch(e,t){let s=await this.getAccessToken(),o=await this.getFetch()(this.makeUrl(e,t),{headers:{"Content-Type":"application/json","x-auth-token":s,"x-client-id":this.config.clientId}});if(!o.ok||o.status>=400)throw new Error(`${o.status} ${o.statusText}`);let n=await o.json();return Q(n)}makeUrl(e,t){return `${this.config.contentBaseUrl}/${g(e)}${O({...this.config.defaults,...t})}`}async getAccessToken(){if(this.cachedToken&&this.cachedToken.expiresAt>Date.now()+3e4)return this.cachedToken.value;let e=new URLSearchParams({grant_type:"client_credentials",scope:j}).toString(),t=await T(()=>this.getFetch()(`${this.config.authBaseUrl}/oauth2/token`,{body:e,headers:{Accept:"application/json",Authorization:`Basic ${C(this.config.clientId,this.config.clientSecret)}`,"Content-Type":"application/x-www-form-urlencoded"},method:"POST"}),{retries:3});if(!t.ok)throw new Error(`Token request failed: ${t.statusText}`);let s=await t.json();return this.cachedToken={expiresAt:Date.now()+s.expires_in*1e3,value:s.access_token},this.cachedToken.value}},x=class{config;fetcher;chapters;verses;juzs;audio;resources;search;constructor(e){this.config={authBaseUrl:N.oauth2,contentBaseUrl:V,...e,defaults:{language:"ar",...e.defaults}},this.fetcher=new P(this.config),this.fetcher.getFetch(),this.chapters=new h(this.fetcher),this.verses=new d(this.fetcher),this.juzs=new l(this.fetcher),this.audio=new f(this.fetcher),this.resources=new u(this.fetcher),this.search=new m(this.fetcher);}getConfig(){return {...this.config}}updateConfig(e){this.config={...this.config,...e,defaults:{...this.config.defaults,...e.defaults}},this.fetcher.updateConfig(this.config);}clearCachedToken(){this.fetcher.clearCachedToken();}};
|
|
2
|
+
export{G as CharType,B as Language,x as QuranClient,$ as QuranFont,H as SearchMode,z as SearchNavigationType,a as isValidChapterId,I as isValidHizb,b as isValidJuz,v as isValidQuranPage,A as isValidRub,p as isValidVerseKey};//# sourceMappingURL=index.min.mjs.map
|
|
3
3
|
//# sourceMappingURL=index.min.mjs.map
|