{"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/answers.ts","../src/sdk/audio.ts","../src/sdk/chapters.ts","../src/sdk/hadith-references.ts","../src/sdk/juzs.ts","../src/sdk/resources.ts","../src/sdk/search.ts","../src/sdk/verses.ts","../src/sdk/client.ts","../src/sdk/http-error.ts","../src/sdk/app-state-errors.ts","../src/runtime/app-state-state.ts","../src/runtime/app-state-reconciler.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","normalizeAnswerCountWithinRangeResponse","response","verseKey","count","type","QuranAnswers","fetcher","questionId","from","to","AUDIO_BASE_URL","normalizeVerseRecitations","audioFiles","file","absoluteUrl","QuranAudio","reciterId","audioFile","recitationId","data","QuranChapters","chapters","chapter","chapterInfo","QuranHadithReferences","QuranJuzs","juzs","QuranResources","recitations","translations","tafsirs","languages","recitationInfo","translationInfo","tafsirInfo","chapterInfos","reciters","recitationStyles","verseMedia","resourceGroup","QuranSearch","query","QuranVerses","verse","verses","camelizeKeys","LEGACY_CLIENT_CREDENTIALS_SCOPE","LegacyQuranFetcher","config","doFetch","token","json","body","QuranClient","newConfig","readErrorPayload","QuranHttpErrorClass","QuranHttpError","payload","QURAN_HTTP_ERROR_CONSTRUCTOR","constructorRegistry","APP_STATE_ERROR_CODES","getAppStateErrorCode","details","serviceError","code","isAppStateHttpError","actualCode","AppStateProtocolError","cloneJson","deepFreeze","child","stableJson","object","appStateDocumentId","collection","createInitialAppStateState","assertSynchronousResult","createAppStateMemoryStore","initialStates","accounts","accountId","state","transactions","reducer","operation","current","draft","result","applyChange","documents","change","applyAppStateChangePage","changes","nextSyncToken","target","replacement","applyAppStateBootstrapPage","items","nextCursor","item","promoteAppStateBootstrap","currentPrecondition","queueAppStatePut","idempotencyKey","localRevision","mutation","queueAppStateDelete","visibleFromShadow","shadow","visible","document","deriveAppStateStateView","snapshot","snapshotAppStateMutations","removeAppStateMutation","replaceAppStateMutation","pending","DEFAULT_PAGE_SIZE","DEFAULT_MAX_BOOTSTRAP_RESTART_ATTEMPTS","DEFAULT_MAX_REBASE_ATTEMPTS","defaultIdempotencyKey","runtimeCrypto","mutationOptions","bootstrapItems","isRecoveryError","positiveInteger","name","createAppStateReconciler","initialAccountId","createIdempotencyKey","maxRebaseAttempts","pageSize","store","initialTransport","activeAccountId","activeTransport","accountGeneration","reconcileQueue","isCurrent","context","commit","reconcileContext","readProgress","resetBootstrap","rebuildBootstrap","reset","restartAttempts","progress","syncToken","pull","initial","applySuccessfulPut","etag","acknowledgeDelete","refreshAndRebase","rebased","replayMutation","captured","rebaseAttempts","errorCode","replay","getStateFor","mutationContext","bodySnapshot","capturedContext","transport"],"mappings":"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","file":"index.min.mjs","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  analytics: \"https://apis.quran.foundation/analytics\",\n  auth: \"https://apis.quran.foundation/auth\",\n  content: \"https://apis.quran.foundation/content\",\n  oauth2: \"https://oauth2.quran.foundation\",\n  quranReflect: \"https://apis.quran.foundation/quran-reflect\",\n  search: \"https://apis.quran.foundation/search\",\n} as const;\n\nexport const DIRECT_PATH_PREFIX = {\n  analytics: \"/v1\",\n  auth: \"/v1\",\n  content: \"/api/v4\",\n  oauth2: \"\",\n  quranReflect: \"/v1\",\n  search: \"/v1\",\n} as const;\n\nexport const GATEWAY_PATH_PREFIX = {\n  analytics: \"/analytics/v1\",\n  auth: \"/auth/v1\",\n  content: \"/content/api/v4\",\n  oauth2: \"\",\n  quranReflect: \"/quran-reflect/v1\",\n  search: \"/search/v1\",\n} as const;\n\nexport const LEGACY_PREFIXES = {\n  analytics: [\"/analytics/v1\", \"/v1\"] as const,\n  auth: [\"/auth/v1\", \"/v1\"] as const,\n  content: [\"/content/api/v4\", \"/api/v4\"] as const,\n  oauth2: [] as const,\n  quranReflect: [\"/quran-reflect/v1\", \"/v1\"] as const,\n  search: [\"/search/v1\", \"/v1\"] as const,\n} as const;\n","import type { ApiParams } from \"@/types\";\nimport humps from \"humps\";\n\nconst { decamelize } = humps;\n\nexport const ensureLeadingSlash = (value: string): string =>\n  value.startsWith(\"/\") ? value : `/${value}`;\n\nexport const removeTrailingSlash = (value: string): string =>\n  value.endsWith(\"/\") ? value.slice(0, -1) : value;\n\nexport const removeBeginningSlash = (url: string) => {\n  return url.startsWith(\"/\") ? url.slice(1) : url;\n};\n\nexport const replacePathParams = (\n  path: string,\n  params?: Record<string, string | number>,\n): string => {\n  return path.replace(/\\{([^}]+)\\}/g, (_match: string, rawKey: string) => {\n    const value = params?.[rawKey];\n    if (value === undefined) {\n      throw new Error(`Missing path parameter: ${rawKey}`);\n    }\n\n    return encodeURIComponent(String(value));\n  });\n};\n\nexport const normalizePathTemplate = (path: string): string =>\n  path.replace(/(^|\\/):([A-Za-z0-9_]+)/g, \"$1{$2}\");\n\ninterface ParamsToStringOptions {\n  preserveCase?: boolean;\n}\n\nconst fieldsKey = [\"wordFields\", \"translationFields\", \"fields\"] as const;\nconst fieldsKeySet = new Set<string>([\n  ...fieldsKey,\n  ...fieldsKey.map((key) => decamelize(key)),\n]);\nconst preservedKeys = new Set([\n  \"navigationalResultsNumber\",\n  \"pageSize\",\n  \"versesResultsNumber\",\n]);\n\nexport const paramsToString = (\n  params?: ApiParams,\n  options: ParamsToStringOptions = {},\n): string => {\n  if (!params) return \"\";\n\n  const paramsString = new URLSearchParams();\n\n  for (const [rawKey, rawValue] of Object.entries(params)) {\n    if (rawValue === undefined) continue;\n\n    const key =\n      options.preserveCase || preservedKeys.has(rawKey)\n        ? rawKey\n        : decamelize(rawKey);\n\n    // fields is a special case, it's an object with boolean values\n    if (fieldsKeySet.has(rawKey) || fieldsKeySet.has(key)) {\n      const fields = Object.entries(rawValue as Record<string, boolean>)\n        .filter(([, value]) => value)\n        .map(([fieldKey]) => decamelize(fieldKey));\n      if (fields.length > 0) {\n        paramsString.set(key, fields.join(\",\"));\n      }\n      continue;\n    }\n\n    if (typeof rawValue === \"string\") {\n      paramsString.set(key, rawValue);\n    } else if (typeof rawValue === \"number\") {\n      paramsString.set(key, rawValue.toString());\n    } else if (typeof rawValue === \"boolean\") {\n      paramsString.set(key, rawValue.toString());\n    } else if (Array.isArray(rawValue)) {\n      paramsString.set(key, rawValue.join(\",\"));\n    }\n  }\n\n  if (paramsString.size === 0) return \"\";\n  return `?${paramsString.toString()}`;\n};\n","import type { 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 \"./analytics\";\nexport * from \"./app-state\";\nexport * from \"./quran-client\";\nexport * from \"./quran-reflect\";\n","import type { ChapterId } from \"../types\";\n\n/**\n * Validates chapter id\n * @param id chapter id\n * @example\n * isValidChapterId('1') // true\n * isValidChapterId('114') // true\n * isValidChapterId('0') // false\n * isValidChapterId('-1') // false\n * isValidChapterId('200') // false\n */\nexport const isValidChapterId = (id: string | number): id is ChapterId => {\n  const parsedId = typeof id === \"number\" ? id : Number(id);\n  if (!parsedId || parsedId <= 0 || parsedId > 114) return false;\n  return true;\n};\n","import type { JuzNumber } from \"../types\";\n\n/**\n * Validates juz number\n * @param juz juz number\n * @example\n * isValidJuz('1') // true\n * isValidJuz('30') // true\n * isValidJuz('0') // false\n * isValidJuz('-1') // false\n * isValidJuz('200') // false\n */\nexport const isValidJuz = (juz: string | number): juz is JuzNumber => {\n  const parsedJuz = typeof juz === \"number\" ? juz : Number(juz);\n  if (!parsedJuz || parsedJuz <= 0 || parsedJuz > 30) return false;\n  return true;\n};\n","import type { RubNumber } from \"../types\";\n\n/**\n * Validates rub number\n * @param rub rub number\n * @example\n * isValidRub('1') // true\n * isValidRub('240') // true\n * isValidRub('0') // false\n * isValidRub('-1') // false\n * isValidRub('300') // false\n */\nexport const isValidRub = (rub: string | number): rub is RubNumber => {\n  const parsedRub = typeof rub === \"number\" ? rub : Number(rub);\n  if (!parsedRub || parsedRub <= 0 || parsedRub > 240) return false;\n  return true;\n};\n","import type { HizbNumber } from \"../types\";\n\n/**\n * Validates hizb number\n * @param hizb hizb number\n * @example\n * isValidHizb('1') // true\n * isValidHizb('60') // true\n * isValidHizb('0') // false\n * isValidHizb('-1') // false\n * isValidHizb('200') // false\n */\nexport const isValidHizb = (hizb: string | number): hizb is HizbNumber => {\n  const parsedHizb = typeof hizb === \"number\" ? hizb : Number(hizb);\n  if (!parsedHizb || parsedHizb <= 0 || parsedHizb > 60) return false;\n  return true;\n};\n","import type { PageNumber } from \"../types\";\n\n/**\n * Validates mushaf page number\n * @param page mushaf page number\n * @example\n * isValidQuranPage('1') // true\n * isValidQuranPage('604') // true\n * isValidQuranPage('0') // false\n * isValidQuranPage('-1') // false\n * isValidQuranPage('1000') // false\n */\nexport const isValidQuranPage = (page: string | number): page is PageNumber => {\n  const parsedPage = typeof page === \"number\" ? page : Number(page);\n  if (!parsedPage || parsedPage <= 0 || parsedPage > 604) return false;\n  return true;\n};\n","/**\n * Maps chapter number to verse count\n */\nexport const versesMapping = {\n  1: 7,\n  2: 286,\n  3: 200,\n  4: 176,\n  5: 120,\n  6: 165,\n  7: 206,\n  8: 75,\n  9: 129,\n  10: 109,\n  11: 123,\n  12: 111,\n  13: 43,\n  14: 52,\n  15: 99,\n  16: 128,\n  17: 111,\n  18: 110,\n  19: 98,\n  20: 135,\n  21: 112,\n  22: 78,\n  23: 118,\n  24: 64,\n  25: 77,\n  26: 227,\n  27: 93,\n  28: 88,\n  29: 69,\n  30: 60,\n  31: 34,\n  32: 30,\n  33: 73,\n  34: 54,\n  35: 45,\n  36: 83,\n  37: 182,\n  38: 88,\n  39: 75,\n  40: 85,\n  41: 54,\n  42: 53,\n  43: 89,\n  44: 59,\n  45: 37,\n  46: 35,\n  47: 38,\n  48: 29,\n  49: 18,\n  50: 45,\n  51: 60,\n  52: 49,\n  53: 62,\n  54: 55,\n  55: 78,\n  56: 96,\n  57: 29,\n  58: 22,\n  59: 24,\n  60: 13,\n  61: 14,\n  62: 11,\n  63: 11,\n  64: 18,\n  65: 12,\n  66: 12,\n  67: 30,\n  68: 52,\n  69: 52,\n  70: 44,\n  71: 28,\n  72: 28,\n  73: 20,\n  74: 56,\n  75: 40,\n  76: 31,\n  77: 50,\n  78: 40,\n  79: 46,\n  80: 42,\n  81: 29,\n  82: 19,\n  83: 36,\n  84: 25,\n  85: 22,\n  86: 17,\n  87: 19,\n  88: 26,\n  89: 30,\n  90: 20,\n  91: 15,\n  92: 21,\n  93: 11,\n  94: 8,\n  95: 8,\n  96: 19,\n  97: 5,\n  98: 8,\n  99: 8,\n  100: 11,\n  101: 11,\n  102: 8,\n  103: 3,\n  104: 9,\n  105: 5,\n  106: 4,\n  107: 7,\n  108: 3,\n  109: 6,\n  110: 3,\n  111: 5,\n  112: 4,\n  113: 5,\n  114: 6,\n} as const satisfies Record<number, number>;\n","import type { ChapterId, VerseKey } from \"../types\";\nimport { isValidChapterId } from \"./is-valid-chapter-id\";\nimport { versesMapping } from \"./verses-mapping\";\n\n/**\n * Validates verse key\n * @param key colon separated verse key (chapter:verse)\n * @example\n * isValidVerseKey('1:1') // true\n * isValidVerseKey('30:1') // true\n * isValidVerseKey('0') // false\n * isValidVerseKey('1:-') // false\n * isValidVerseKey('1_1') // false\n */\nexport const isValidVerseKey = (key: string): key is VerseKey => {\n  const [chapterId, verseId] = key.trim().split(\":\");\n  if (!chapterId || !verseId || !isValidChapterId(chapterId)) return false;\n\n  const parsedVerse = Number(verseId);\n  const verseCount = versesMapping[chapterId as ChapterId];\n  if (!parsedVerse || parsedVerse <= 0 || parsedVerse > verseCount)\n    return false;\n\n  return true;\n};\n","import type {\n  AnswerCountWithinRangeResponse,\n  AnswerQuestion,\n  AnswersByAyahResponse,\n  BaseApiParams,\n  QuranFetchClient,\n  VerseKey,\n} from \"@/types\";\nimport { isValidVerseKey } from \"@/utils\";\n\ntype GetAnswersByAyahOptions = BaseApiParams & {\n  page?: number;\n  pageSize?: number;\n};\n\ntype CountAnswersWithinRangeOptions = BaseApiParams;\n\nconst normalizeAnswerCountWithinRangeResponse = (\n  response: AnswerCountWithinRangeResponse,\n): AnswerCountWithinRangeResponse => {\n  return Object.fromEntries(\n    Object.entries(response).map(([verseKey, count]) => {\n      if (!count.types) return [verseKey, count];\n\n      return [\n        verseKey,\n        {\n          ...count,\n          types: Object.fromEntries(\n            Object.entries(count.types).map(([type, value]) => [\n              type.toUpperCase(),\n              value,\n            ]),\n          ),\n        },\n      ];\n    }),\n  );\n};\n\n/**\n * Quran answers API methods.\n */\nexport class QuranAnswers {\n  constructor(private fetcher: QuranFetchClient) {}\n\n  /**\n   * Get published answer questions linked to a specific ayah.\n   * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"2:255\")\n   * @param {GetAnswersByAyahOptions} options\n   * @example\n   * client.answers.findByAyah(\"2:255\", { page: 1, pageSize: 2 })\n   */\n  async findByAyah(\n    key: VerseKey,\n    options?: GetAnswersByAyahOptions,\n  ): Promise<AnswersByAyahResponse> {\n    if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n    return this.fetcher.fetch<AnswersByAyahResponse>(\n      `/content/api/v4/answers/by_ayah/${key}`,\n      options,\n    );\n  }\n\n  /**\n   * Get a published answer question by id.\n   * @param {string | number} questionId question id\n   * @example\n   * client.answers.findByQuestionId(\"988\")\n   */\n  async findByQuestionId(\n    questionId: string | number,\n  ): Promise<AnswerQuestion> {\n    return this.fetcher.fetch<AnswerQuestion>(\n      `/content/api/v4/answers/${questionId}`,\n    );\n  }\n\n  /**\n   * Get a verse-key to answer-count map within an inclusive ayah range.\n   * @param {VerseKey} from start verse key in format \"chapter:verse\"\n   * @param {VerseKey} to end verse key in format \"chapter:verse\"\n   * @param {CountAnswersWithinRangeOptions} options\n   * @example\n   * client.answers.countWithinRange(\"2:255\", \"2:256\")\n   */\n  async countWithinRange(\n    from: VerseKey,\n    to: VerseKey,\n    options?: CountAnswersWithinRangeOptions,\n  ): Promise<AnswerCountWithinRangeResponse> {\n    if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n      throw new Error(\"Invalid verse key\");\n    }\n\n    const response = await this.fetcher.fetch<AnswerCountWithinRangeResponse>(\n      \"/content/api/v4/answers/count_within_range\",\n      {\n        ...options,\n        from,\n        to,\n      },\n    );\n\n    return normalizeAnswerCountWithinRangeResponse(response);\n  }\n}\n","import type {\n  BaseApiParams,\n  ChapterId,\n  ChapterRecitation,\n  NormalizedVerseRecitation,\n  Pagination,\n  QuranFetchClient,\n  VerseKey,\n  VerseRecitation,\n  VerseRecitationField,\n} from \"@/types\";\nimport { isValidChapterId, isValidVerseKey } from \"@/utils\";\n\ntype GetChapterRecitationOptions = BaseApiParams;\n\ntype GetVerseRecitationOptions = BaseApiParams & {\n  fields?: Partial<Record<VerseRecitationField, boolean>>;\n};\n\ntype RawVerseRecitation = Omit<VerseRecitation, \"audioUrl\">;\n\n/**\n * Base URL for verse audio files from Quran.com\n * Used to convert relative paths to absolute URLs\n */\nconst AUDIO_BASE_URL = \"https://verses.quran.com\";\n\n/**\n * Normalize verse recitation data by adding absolute audioUrl\n * The API returns relative paths in the 'url' field, but we want\n * to provide absolute URLs for consistency with chapter recitations\n */\nfunction normalizeVerseRecitations(\n  audioFiles: RawVerseRecitation[],\n): NormalizedVerseRecitation[] {\n  return audioFiles.map((file) => {\n    // If url is already absolute, use it; otherwise prepend the base URL\n    const absoluteUrl =\n      file.url.startsWith(\"http://\") || file.url.startsWith(\"https://\")\n        ? file.url\n        : `${AUDIO_BASE_URL}/${file.url.replace(/^\\/+/, \"\")}`;\n\n    return {\n      ...file,\n      audioUrl: absoluteUrl,\n    };\n  });\n}\n\n/**\n * Audio API methods\n */\nexport class QuranAudio {\n  constructor(private fetcher: QuranFetchClient) {}\n\n  /**\n   * Get all chapter recitations for specific reciter\n   * @param {string} reciterId\n   * @param {GetChapterRecitationOptions} options\n   * @example\n   * client.audio.findAllChapterRecitations('2')\n   */\n  async findAllChapterRecitations(\n    reciterId: string,\n    options?: GetChapterRecitationOptions,\n  ): Promise<ChapterRecitation[]> {\n    const { audioFiles } = await this.fetcher.fetch<{\n      audioFiles: ChapterRecitation[];\n    }>(`/content/api/v4/chapter_recitations/${reciterId}`, options);\n\n    return audioFiles;\n  }\n\n  /**\n   * Get a specific chapter recitation by reciter and chapter\n   * @param {string} reciterId\n   * @param {ChapterId} chapterId\n   * @param {GetChapterRecitationOptions} options\n   * @example\n   * client.audio.findChapterRecitationById('2', '1')\n   */\n  async findChapterRecitationById(\n    reciterId: string,\n    chapterId: ChapterId,\n    options?: GetChapterRecitationOptions,\n  ): Promise<ChapterRecitation> {\n    if (!isValidChapterId(chapterId)) throw new Error(\"Invalid chapter id\");\n\n    const { audioFile } = await this.fetcher.fetch<{\n      audioFile: ChapterRecitation;\n    }>(\n      `/content/api/v4/chapter_recitations/${reciterId}/${chapterId}`,\n      options,\n    );\n\n    return audioFile;\n  }\n\n  /**\n   * Get verse recitations by chapter\n   * @param {ChapterId} chapterId\n   * @param {string} recitationId\n   * @param {GetVerseRecitationOptions} options\n   * @example\n   * client.audio.findVerseRecitationsByChapter('1', '2')\n   */\n  async findVerseRecitationsByChapter(\n    chapterId: ChapterId,\n    recitationId: string,\n    options?: GetVerseRecitationOptions,\n  ): Promise<{\n    audioFiles: NormalizedVerseRecitation[];\n    pagination: Pagination;\n  }> {\n    if (!isValidChapterId(chapterId)) throw new Error(\"Invalid chapter id\");\n\n    const data = await this.fetcher.fetch<{\n      audioFiles: RawVerseRecitation[];\n      pagination: Pagination;\n    }>(\n      `/content/api/v4/recitations/${recitationId}/by_chapter/${chapterId}`,\n      options,\n    );\n\n    return {\n      ...data,\n      audioFiles: normalizeVerseRecitations(data.audioFiles),\n    };\n  }\n\n  /**\n   * Get verse recitations by verse key\n   * @param {VerseKey} key\n   * @param {string} recitationId\n   * @param {GetVerseRecitationOptions} options\n   * @example\n   * client.audio.findVerseRecitationsByKey('1:1', '2')\n   */\n  async findVerseRecitationsByKey(\n    key: VerseKey,\n    recitationId: string,\n    options?: GetVerseRecitationOptions,\n  ): Promise<{\n    audioFiles: NormalizedVerseRecitation[];\n    pagination: Pagination;\n  }> {\n    if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n    const data = await this.fetcher.fetch<{\n      audioFiles: RawVerseRecitation[];\n      pagination: Pagination;\n    }>(`/content/api/v4/recitations/${recitationId}/by_ayah/${key}`, options);\n\n    return {\n      ...data,\n      audioFiles: normalizeVerseRecitations(data.audioFiles),\n    };\n  }\n}\n","import type {\n  BaseApiParams,\n  Chapter,\n  ChapterId,\n  ChapterInfo,\n  ChapterInfoResponse,\n  QuranFetchClient,\n} from \"@/types\";\nimport { isValidChapterId } from \"@/utils\";\n\ntype GetChapterOptions = BaseApiParams;\ntype GetChapterInfoOptions = BaseApiParams & {\n  resourceId?: string | number;\n  includeResources?: boolean;\n};\n\n/**\n * Chapters API methods\n */\nexport class QuranChapters {\n  constructor(private fetcher: QuranFetchClient) {}\n\n  /**\n   * Get all chapters.\n   * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/list-chapters\n   * @param {GetChapterOptions} options\n   * @example\n   * client.chapters.findAll()\n   */\n  async findAll(options?: GetChapterOptions): Promise<Chapter[]> {\n    const { chapters } = await this.fetcher.fetch<{ chapters: Chapter[] }>(\n      \"/content/api/v4/chapters\",\n      options,\n    );\n\n    return chapters;\n  }\n\n  /**\n   * Get chapter by id.\n   * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter\n   * @param {ChapterId} id chapter id, minimum 1, maximum 114\n   * @param {GetChapterOptions} options\n   * @example\n   * client.chapters.findById('1')\n   * client.chapters.findById('114')\n   */\n  async findById(id: ChapterId, options?: GetChapterOptions): Promise<Chapter> {\n    if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n    const { chapter } = await this.fetcher.fetch<{ chapter: Chapter }>(\n      `/content/api/v4/chapters/${id}`,\n      options,\n    );\n\n    return chapter;\n  }\n\n  /**\n   * Get chapter info by id.\n   * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter-info\n   * @param {ChapterId} id chapter id, minimum 1, maximum 114\n   * @param {GetChapterInfoOptions} options\n   * @example\n   * client.chapters.findInfoById('1')\n   * client.chapters.findInfoById('114')\n   */\n  async findInfoById(\n    id: ChapterId,\n    options?: GetChapterInfoOptions,\n  ): Promise<ChapterInfo | null> {\n    const { chapterInfo } = await this.findInfoResponseById(id, options);\n\n    return chapterInfo;\n  }\n\n  /**\n   * Get the full chapter info response, including available resources when requested.\n   * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/get-chapter-info\n   * @param {ChapterId} id chapter id, minimum 1, maximum 114\n   * @param {GetChapterInfoOptions} options\n   * @example\n   * client.chapters.findInfoResponseById('1', { includeResources: true })\n   * client.chapters.findInfoResponseById('1', { resourceId: 'en-tafsir-ibn-ashur' })\n   */\n  async findInfoResponseById(\n    id: ChapterId,\n    options?: GetChapterInfoOptions,\n  ): Promise<ChapterInfoResponse> {\n    if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n    return this.fetcher.fetch<ChapterInfoResponse>(\n      `/content/api/v4/chapters/${id}/info`,\n      options,\n    );\n  }\n}\n","import type {\n  BaseApiParams,\n  HadithCountWithinRangeResponse,\n  HadithReferencesByAyahResponse,\n  HadithsByAyahResponse,\n  QuranFetchClient,\n  VerseKey,\n} from \"@/types\";\nimport { isValidVerseKey } from \"@/utils\";\n\ntype GetHadithReferenceOptions = BaseApiParams;\n\ntype GetHadithsByAyahOptions = BaseApiParams & {\n  page?: number;\n  limit?: number;\n};\n\ntype CountHadithsWithinRangeOptions = BaseApiParams;\n\n/**\n * Hadith reference API methods.\n */\nexport class QuranHadithReferences {\n  constructor(private fetcher: QuranFetchClient) {}\n\n  /**\n   * Get ordered hadith reference records linked to a specific ayah.\n   * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"12:12\")\n   * @param {GetHadithReferenceOptions} options\n   * @example\n   * client.hadithReferences.findByAyah(\"12:12\")\n   */\n  async findByAyah(\n    key: VerseKey,\n    options?: GetHadithReferenceOptions,\n  ): Promise<HadithReferencesByAyahResponse> {\n    if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n    return this.fetcher.fetch<HadithReferencesByAyahResponse>(\n      `/content/api/v4/hadith_references/by_ayah/${key}`,\n      options,\n    );\n  }\n\n  /**\n   * Get paginated hadith payloads linked to a specific ayah.\n   * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"12:12\")\n   * @param {GetHadithsByAyahOptions} options\n   * @example\n   * client.hadithReferences.findHadithsByAyah(\"12:12\", { limit: 4 })\n   */\n  async findHadithsByAyah(\n    key: VerseKey,\n    options?: GetHadithsByAyahOptions,\n  ): Promise<HadithsByAyahResponse> {\n    if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n    return this.fetcher.fetch<HadithsByAyahResponse>(\n      `/content/api/v4/hadith_references/by_ayah/${key}/hadiths`,\n      options,\n    );\n  }\n\n  /**\n   * Get a verse-key to hadith-count map within an inclusive ayah range.\n   * @param {VerseKey} from start verse key in format \"chapter:verse\"\n   * @param {VerseKey} to end verse key in format \"chapter:verse\"\n   * @param {CountHadithsWithinRangeOptions} options\n   * @example\n   * client.hadithReferences.countWithinRange(\"12:12\", \"12:13\")\n   */\n  async countWithinRange(\n    from: VerseKey,\n    to: VerseKey,\n    options?: CountHadithsWithinRangeOptions,\n  ): Promise<HadithCountWithinRangeResponse> {\n    if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n      throw new Error(\"Invalid verse key\");\n    }\n\n    return this.fetcher.fetch<HadithCountWithinRangeResponse>(\n      \"/content/api/v4/hadith_references/count_within_range\",\n      {\n        ...options,\n        from,\n        to,\n      },\n    );\n  }\n}\n","import type { Juz, QuranFetchClient } from \"@/types\";\n\n/**\n * Juzs API methods\n */\nexport class QuranJuzs {\n  constructor(private fetcher: QuranFetchClient) {}\n\n  /**\n   * Get All Juzs\n   * @description https://api-docs.quran.com/docs/quran.com_versioned/4.0.0/juzs\n   * @example\n   * client.juzs.findAll()\n   */\n  async findAll(): Promise<Juz[]> {\n    const { juzs } = await this.fetcher.fetch<{ juzs: Juz[] }>(\n      \"/content/api/v4/juzs\",\n    );\n    return juzs;\n  }\n}\n","import type {\n  BaseApiParams,\n  ChapterInfoResource,\n  ChapterReciterResource,\n  ContentResourceSnapshot,\n  ContentResourceSnapshotOptions,\n  ContentSyncOptions,\n  ContentSyncResourceGroup,\n  ContentSyncResponse,\n  LanguageResource,\n  QuranFetchClient,\n  RecitationInfoResource,\n  RecitationResource,\n  RecitationStylesResource,\n  TafsirInfoResource,\n  TafsirResource,\n  TranslationInfoResource,\n  TranslationResource,\n  VerseMediaResource,\n} from \"@/types\";\n\ntype GetResourceOptions = BaseApiParams;\n\n/**\n * Resources API methods\n */\nexport class QuranResources {\n  constructor(private fetcher: QuranFetchClient) {}\n\n  /**\n   * Get all recitations.\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findAllRecitations()\n   */\n  async findAllRecitations(\n    options?: GetResourceOptions,\n  ): Promise<RecitationResource[]> {\n    const { recitations } = await this.fetcher.fetch<{\n      recitations: RecitationResource[];\n    }>(\"/content/api/v4/resources/recitations\", options);\n\n    return recitations;\n  }\n\n  /**\n   * Get all translations.\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findAllTranslations()\n   */\n  async findAllTranslations(\n    options?: GetResourceOptions,\n  ): Promise<TranslationResource[]> {\n    const { translations } = await this.fetcher.fetch<{\n      translations: TranslationResource[];\n    }>(\"/content/api/v4/resources/translations\", options);\n\n    return translations;\n  }\n\n  /**\n   * Get all tafsirs.\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findAllTafsirs()\n   */\n  async findAllTafsirs(\n    options?: GetResourceOptions,\n  ): Promise<TafsirResource[]> {\n    const { tafsirs } = await this.fetcher.fetch<{\n      tafsirs: TafsirResource[];\n    }>(\"/content/api/v4/resources/tafsirs\", options);\n\n    return tafsirs;\n  }\n\n  /**\n   * Get all languages.\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findAllLanguages()\n   */\n  async findAllLanguages(\n    options?: GetResourceOptions,\n  ): Promise<LanguageResource[]> {\n    const { languages } = await this.fetcher.fetch<{\n      languages: LanguageResource[];\n    }>(\"/content/api/v4/resources/languages\", options);\n\n    return languages;\n  }\n\n  /**\n   * Get recitation info by id.\n   * @param {string} id recitation id\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findRecitationInfo('1')\n   */\n  async findRecitationInfo(\n    id: string,\n    options?: GetResourceOptions,\n  ): Promise<RecitationInfoResource> {\n    const { recitationInfo } = await this.fetcher.fetch<{\n      recitationInfo: RecitationInfoResource;\n    }>(`/content/api/v4/resources/recitations/${id}/info`, options);\n\n    return recitationInfo;\n  }\n\n  /**\n   * Get translation info by id.\n   * @param {string} id translation id\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findTranslationInfo('131')\n   */\n  async findTranslationInfo(\n    id: string,\n    options?: GetResourceOptions,\n  ): Promise<TranslationInfoResource> {\n    const { translationInfo } = await this.fetcher.fetch<{\n      translationInfo: TranslationInfoResource;\n    }>(`/content/api/v4/resources/translations/${id}/info`, options);\n\n    return translationInfo;\n  }\n\n  /**\n   * Get tafsir info by id.\n   * @param {string} id tafsir id\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findTafsirInfo('171')\n   */\n  async findTafsirInfo(\n    id: string,\n    options?: GetResourceOptions,\n  ): Promise<TafsirInfoResource> {\n    const { tafsirInfo } = await this.fetcher.fetch<{\n      tafsirInfo: TafsirInfoResource;\n    }>(`/content/api/v4/resources/tafsirs/${id}/info`, options);\n\n    return tafsirInfo;\n  }\n\n  /**\n   * Get all chapter infos.\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findAllChapterInfos()\n   */\n  async findAllChapterInfos(\n    options?: GetResourceOptions,\n  ): Promise<ChapterInfoResource[]> {\n    const { chapterInfos } = await this.fetcher.fetch<{\n      chapterInfos: ChapterInfoResource[];\n    }>(\"/content/api/v4/resources/chapter_infos\", options);\n\n    return chapterInfos;\n  }\n\n  /**\n   * Get all chapter reciters.\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findAllChapterReciters()\n   */\n  async findAllChapterReciters(\n    options?: GetResourceOptions,\n  ): Promise<ChapterReciterResource[]> {\n    const { reciters } = await this.fetcher.fetch<{\n      reciters: ChapterReciterResource[];\n    }>(\"/content/api/v4/resources/chapter_reciters\", options);\n\n    return reciters;\n  }\n\n  /**\n   * Get all recitation styles.\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findAllRecitationStyles()\n   */\n  async findAllRecitationStyles(\n    options?: GetResourceOptions,\n  ): Promise<RecitationStylesResource> {\n    const { recitationStyles } = await this.fetcher.fetch<{\n      recitationStyles: RecitationStylesResource;\n    }>(\"/content/api/v4/resources/recitation_styles\", options);\n\n    return recitationStyles;\n  }\n\n  /**\n   * Get verse media.\n   * @param {GetResourceOptions} options\n   * @example\n   * client.resources.findVerseMedia()\n   */\n  async findVerseMedia(\n    options?: GetResourceOptions,\n  ): Promise<VerseMediaResource> {\n    const { verseMedia } = await this.fetcher.fetch<{\n      verseMedia: VerseMediaResource;\n    }>(\"/content/api/v4/resources/verse_media\", options);\n\n    return verseMedia;\n  }\n\n  /**\n   * Bootstrap or incrementally sync public content resources.\n   * @param {ContentSyncOptions} options\n   * @example\n   * client.resources.sync({\n   *   bootstrap: true,\n   *   resources: \"mushafs:1;translations:19;word_by_word_transliterations:60\"\n   * })\n   */\n  async sync<TData extends Record<string, unknown> = Record<string, unknown>>(\n    options?: ContentSyncOptions,\n  ): Promise<ContentSyncResponse<TData>> {\n    return this.fetcher.fetch<ContentSyncResponse<TData>>(\n      \"/content/api/v4/resources/sync\",\n      options,\n    );\n  }\n\n  /**\n   * Fetch the current full snapshot for a syncable public content resource.\n   * @param {ContentSyncResourceGroup} resourceGroup\n   * @param {string | number} id\n   * @param {ContentResourceSnapshotOptions} options\n   * @example\n   * client.resources.findSnapshot(\"word_by_word_transliterations\", 60)\n   */\n  async findSnapshot<\n    TRecord extends Record<string, unknown> = Record<string, unknown>,\n  >(\n    resourceGroup: ContentSyncResourceGroup,\n    id: string | number,\n    options?: ContentResourceSnapshotOptions,\n  ): Promise<ContentResourceSnapshot<TRecord>> {\n    return this.fetcher.fetch<ContentResourceSnapshot<TRecord>>(\n      `/content/api/v4/resources/snapshots/${resourceGroup}/${id}`,\n      options,\n    );\n  }\n}\n","import type { QuranFetchClient, SearchParams, SearchResponse } from \"@/types\";\n\ntype SearchOptions = Omit<SearchParams, \"query\">;\n\n/**\n * Search API methods\n */\nexport class QuranSearch {\n  constructor(private fetcher: QuranFetchClient) {}\n\n  /**\n   * Search\n   * @description /v1/search\n   * @param {string} query search query\n   * @param {SearchOptions} options\n   * @example\n   * client.search.search('نور', { mode: SearchMode.Quick })\n   * client.search.search('نور', { mode: SearchMode.Advanced, exactMatchesOnly: '1' })\n   * client.search.search('نور', { mode: SearchMode.Quick, size: 10 })\n   * client.search.search('نور', { mode: SearchMode.Quick, page: 2 })\n   */\n  async search(query: string, options: SearchOptions): Promise<SearchResponse> {\n    return this.fetcher.fetch<SearchResponse>(\"/v1/search\", {\n      query,\n      size: 30, // search-specific default\n      ...options,\n    });\n  }\n}\n","import type {\n  BaseApiParams,\n  ChapterId,\n  HizbNumber,\n  JuzNumber,\n  PageNumber,\n  PaginationParams,\n  QuranFetchClient,\n  RubNumber,\n  TranslationField,\n  Verse,\n  VerseField,\n  VerseKey,\n  WordField,\n} from \"@/types\";\nimport {\n  isValidChapterId,\n  isValidHizb,\n  isValidJuz,\n  isValidQuranPage,\n  isValidRub,\n  isValidVerseKey,\n} from \"@/utils\";\n\ntype GetVerseOptions = BaseApiParams &\n  PaginationParams & {\n    reciter?: string | number;\n    words?: boolean;\n    translations?: string[] | number[];\n    tafsirs?: string[] | number[];\n    wordFields?: Partial<Record<WordField, boolean>>;\n    translationFields?: Partial<Record<TranslationField, boolean>>;\n    fields?: Partial<Record<VerseField, boolean>>;\n  };\n\n/**\n * Verses API methods\n */\nexport class QuranVerses {\n  constructor(private fetcher: QuranFetchClient) {}\n\n  /**\n   * Get a specific verse by its key.\n   * @param {VerseKey} key verse key in format \"chapter:verse\" (e.g., \"1:1\")\n   * @param {GetVerseOptions} options\n   * @example\n   * client.verses.findByKey('1:1')\n   * client.verses.findByKey('2:255')\n   */\n  async findByKey(key: VerseKey, options?: GetVerseOptions): Promise<Verse> {\n    if (!isValidVerseKey(key)) throw new Error(\"Invalid verse key\");\n\n    const { verse } = await this.fetcher.fetch<{ verse: Verse }>(\n      `/content/api/v4/verses/by_key/${key}`,\n      {\n        words: false, // verses-specific default\n        ...options,\n      },\n    );\n\n    return verse;\n  }\n\n  /**\n   * Get verses by range.\n   * @param {VerseKey} from start verse key (e.g., \"1:1\")\n   * @param {VerseKey} to end verse key (e.g., \"1:7\")\n   * @param {GetVerseOptions} options\n   * @example\n   * client.verses.findByRange('1:1', '1:7')\n   */\n  async findByRange(\n    from: VerseKey,\n    to: VerseKey,\n    options?: GetVerseOptions,\n  ): Promise<Verse[]> {\n    // We could validate keys here, but the API will also valid it.\n    // simpler to just pass through for now, or use isValidVerseKey if desired.\n    if (!isValidVerseKey(from) || !isValidVerseKey(to)) {\n      throw new Error(\"Invalid verse key\");\n    }\n\n    const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n      \"/content/api/v4/verses/by_range\",\n      {\n        words: false, // verses-specific default\n        ...options,\n        from,\n        to,\n      },\n    );\n\n    return verses;\n  }\n\n  /**\n   * Get verses by chapter.\n   * @param {ChapterId} id chapter id, minimum 1, maximum 114\n   * @param {GetVerseOptions} options\n   * @example\n   * client.verses.findByChapter('1')\n   */\n  async findByChapter(\n    id: ChapterId,\n    options?: GetVerseOptions,\n  ): Promise<Verse[]> {\n    if (!isValidChapterId(id)) throw new Error(\"Invalid chapter id\");\n\n    const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n      `/content/api/v4/verses/by_chapter/${id}`,\n      {\n        words: false, // verses-specific default\n        ...options,\n      },\n    );\n\n    return verses;\n  }\n\n  /**\n   * Get verses by page number.\n   * @param {PageNumber} page page number\n   * @param {GetVerseOptions} options\n   * @example\n   * client.verses.findByPage('1')\n   */\n  async findByPage(\n    page: PageNumber,\n    options?: GetVerseOptions,\n  ): Promise<Verse[]> {\n    if (!isValidQuranPage(page)) throw new Error(\"Invalid page number\");\n\n    const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n      `/content/api/v4/verses/by_page/${page}`,\n      {\n        words: false, // verses-specific default\n        ...options,\n      },\n    );\n\n    return verses;\n  }\n\n  /**\n   * Get verses by juz number.\n   * @param {JuzNumber} juz juz number\n   * @param {GetVerseOptions} options\n   * @example\n   * client.verses.findByJuz('1')\n   */\n  async findByJuz(juz: JuzNumber, options?: GetVerseOptions): Promise<Verse[]> {\n    if (!isValidJuz(juz)) throw new Error(\"Invalid juz\");\n\n    const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n      `/content/api/v4/verses/by_juz/${juz}`,\n      {\n        words: false, // verses-specific default\n        ...options,\n      },\n    );\n\n    return verses;\n  }\n\n  /**\n   * Get verses by hizb number.\n   * @param {HizbNumber} hizb hizb number\n   * @param {GetVerseOptions} options\n   * @example\n   * client.verses.findByHizb('1')\n   */\n  async findByHizb(\n    hizb: HizbNumber,\n    options?: GetVerseOptions,\n  ): Promise<Verse[]> {\n    if (!isValidHizb(hizb)) throw new Error(\"Invalid hizb\");\n\n    const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n      `/content/api/v4/verses/by_hizb/${hizb}`,\n      {\n        words: false, // verses-specific default\n        ...options,\n      },\n    );\n\n    return verses;\n  }\n\n  /**\n   * Get verses by rub number.\n   * @param {RubNumber} rub rub number\n   * @param {GetVerseOptions} options\n   * @example\n   * client.verses.findByRub('1')\n   */\n  async findByRub(rub: RubNumber, options?: GetVerseOptions): Promise<Verse[]> {\n    if (!isValidRub(rub)) throw new Error(\"Invalid rub\");\n\n    const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(\n      `/content/api/v4/verses/by_rub/${rub}`,\n      {\n        words: false, // verses-specific default\n        ...options,\n      },\n    );\n\n    return verses;\n  }\n\n  /**\n   * Get a random verse.\n   * @param {GetVerseOptions} options\n   * @example\n   * client.verses.findRandom()\n   */\n  async findRandom(options?: GetVerseOptions): Promise<Verse> {\n    const { verse } = await this.fetcher.fetch<{ verse: Verse }>(\n      \"/content/api/v4/verses/random\",\n      {\n        words: false, // verses-specific default\n        ...options,\n      },\n    );\n\n    return verse;\n  }\n}\n","import type {\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 { QuranAnswers } from \"./answers\";\nimport { QuranAudio } from \"./audio\";\nimport { QuranChapters } from \"./chapters\";\nimport { QuranHadithReferences } from \"./hadith-references\";\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 answers: QuranAnswers;\n  public readonly verses: QuranVerses;\n  public readonly juzs: QuranJuzs;\n  public readonly audio: QuranAudio;\n  public readonly hadithReferences: QuranHadithReferences;\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.answers = new QuranAnswers(this.fetcher);\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.hadithReferences = new QuranHadithReferences(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","const readErrorPayload = async (response: Response): Promise<unknown> => {\n  try {\n    const body = await response.text();\n    if (!body) {\n      return undefined;\n    }\n\n    if (response.headers.get(\"content-type\")?.toLowerCase().includes(\"json\")) {\n      try {\n        return JSON.parse(body) as unknown;\n      } catch {\n        return body;\n      }\n    }\n\n    return body;\n  } catch {\n    return undefined;\n  }\n};\n\nexport interface QuranHttpError extends Error {\n  readonly headers: Headers;\n  readonly payload: unknown;\n  readonly status: number;\n}\n\nconst QuranHttpErrorClass = class QuranHttpError\n  extends Error\n  implements QuranHttpError\n{\n  public readonly headers: Headers;\n  public readonly payload: unknown;\n  public readonly status: number;\n\n  private constructor(response: Response, payload: unknown) {\n    super(`${response.status} ${response.statusText}`);\n    this.name = \"QuranHttpError\";\n    this.headers = new Headers(response.headers);\n    this.payload = payload;\n    this.status = response.status;\n  }\n\n  public static async fromResponse(\n    response: Response,\n  ): Promise<QuranHttpError> {\n    return new QuranHttpError(response, await readErrorPayload(response));\n  }\n};\n\ntype QuranHttpErrorConstructor = typeof QuranHttpErrorClass;\n\nObject.defineProperty(QuranHttpErrorClass, \"name\", {\n  configurable: true,\n  value: \"QuranHttpError\",\n});\n\nconst QURAN_HTTP_ERROR_CONSTRUCTOR = Symbol.for(\n  \"@quranjs/api/QuranHttpError/v1\",\n);\nconst constructorRegistry = globalThis as typeof globalThis & {\n  [QURAN_HTTP_ERROR_CONSTRUCTOR]?: QuranHttpErrorConstructor;\n};\n\nexport const QuranHttpError: QuranHttpErrorConstructor =\n  constructorRegistry[QURAN_HTTP_ERROR_CONSTRUCTOR] ?? QuranHttpErrorClass;\n\nconstructorRegistry[QURAN_HTTP_ERROR_CONSTRUCTOR] = QuranHttpError;\n","import { QuranHttpError } from \"./http-error\";\n\nexport type AppStateErrorCode =\n  | \"app_state_data_deleted\"\n  | \"app_state_disabled\"\n  | \"app_state_policy_changed\"\n  | \"app_state_unavailable\"\n  | \"bootstrap_required\"\n  | \"collection_not_allowed\"\n  | \"document_not_found\"\n  | \"document_too_large\"\n  | \"idempotency_key_reused\"\n  | \"internal_server_error\"\n  | \"insufficient_scope\"\n  | \"invalid_collection\"\n  | \"invalid_etag\"\n  | \"invalid_idempotency_key\"\n  | \"invalid_json\"\n  | \"invalid_key\"\n  | \"invalid_precondition\"\n  | \"invalid_sync_token\"\n  | \"invalid_token\"\n  | \"namespace_resolution_unavailable\"\n  | \"payload_too_large\"\n  | \"precondition_failed\"\n  | \"precondition_required\"\n  | \"quota_exceeded\"\n  | \"rate_limit_exceeded\"\n  | \"sync_token_expired\";\n\nexport interface AppStateServiceError {\n  code: AppStateErrorCode;\n  details?: {\n    currentETag?: string | null;\n    [key: string]: unknown;\n  };\n  message?: string;\n  [key: string]: unknown;\n}\n\nexport interface AppStateErrorPayload {\n  details: {\n    currentETag?: string | null;\n    error: AppStateErrorCode | AppStateServiceError;\n    [key: string]: unknown;\n  };\n  message: string;\n  success: false;\n  type: string;\n}\n\nexport type AppStateHttpError = QuranHttpError & {\n  readonly payload: AppStateErrorPayload;\n};\n\nconst APP_STATE_ERROR_CODES: ReadonlySet<string> = new Set<AppStateErrorCode>([\n  \"app_state_data_deleted\",\n  \"app_state_disabled\",\n  \"app_state_policy_changed\",\n  \"app_state_unavailable\",\n  \"bootstrap_required\",\n  \"collection_not_allowed\",\n  \"document_not_found\",\n  \"document_too_large\",\n  \"idempotency_key_reused\",\n  \"internal_server_error\",\n  \"insufficient_scope\",\n  \"invalid_collection\",\n  \"invalid_etag\",\n  \"invalid_idempotency_key\",\n  \"invalid_json\",\n  \"invalid_key\",\n  \"invalid_precondition\",\n  \"invalid_sync_token\",\n  \"invalid_token\",\n  \"namespace_resolution_unavailable\",\n  \"payload_too_large\",\n  \"precondition_failed\",\n  \"precondition_required\",\n  \"quota_exceeded\",\n  \"rate_limit_exceeded\",\n  \"sync_token_expired\",\n]);\n\nexport const getAppStateErrorCode = (\n  error: unknown,\n): AppStateErrorCode | undefined => {\n  if (!(error instanceof QuranHttpError)) {\n    return undefined;\n  }\n\n  const payload = error.payload;\n  if (typeof payload !== \"object\" || payload === null) {\n    return undefined;\n  }\n\n  const details = (payload as { details?: unknown }).details;\n  if (typeof details !== \"object\" || details === null) {\n    return undefined;\n  }\n\n  const serviceError = (details as { error?: unknown }).error;\n  const code =\n    typeof serviceError === \"string\"\n      ? serviceError\n      : typeof serviceError === \"object\" && serviceError !== null\n        ? (serviceError as { code?: unknown }).code\n        : undefined;\n  return typeof code === \"string\" && APP_STATE_ERROR_CODES.has(code)\n    ? (code as AppStateErrorCode)\n    : undefined;\n};\n\nexport function isAppStateHttpError(\n  error: unknown,\n  code?: AppStateErrorCode,\n): error is AppStateHttpError {\n  const actualCode = getAppStateErrorCode(error);\n  return (\n    actualCode !== undefined && (code === undefined || code === actualCode)\n  );\n}\n","import type {\n  AppStateAccountState,\n  AppStateChange,\n  AppStatePendingMutation,\n  AppStatePendingPut,\n  AppStatePutBody,\n  AppStateStateView,\n  AppStateStore,\n  AppStateStoredDocument,\n  AppStateStoreReducer,\n  AppStateVisibleDocument,\n} from \"@/types\";\n\nexport type AppStateProtocolErrorCode =\n  | \"bootstrap_cursor_missing\"\n  | \"bootstrap_sync_token_missing\"\n  | \"put_response_etag_missing\"\n  | \"same_version_conflict\";\n\nexport class AppStateProtocolError extends Error {\n  public readonly code: AppStateProtocolErrorCode;\n\n  public constructor(code: AppStateProtocolErrorCode) {\n    super(`App State reconciliation protocol error: ${code}`);\n    this.name = \"AppStateProtocolError\";\n    this.code = code;\n  }\n}\n\nconst cloneJson = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst deepFreeze = <T>(value: T): Readonly<T> => {\n  if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n    return value;\n  }\n\n  for (const child of Object.values(value)) {\n    deepFreeze(child);\n  }\n  return Object.freeze(value);\n};\n\nconst stableJson = (value: unknown): string => {\n  if (Array.isArray(value)) {\n    return `[${value.map(stableJson).join(\",\")}]`;\n  }\n  if (typeof value === \"object\" && value !== null) {\n    const object = value as Record<string, unknown>;\n    return `{${Object.keys(object)\n      .sort()\n      .map((key) => `${JSON.stringify(key)}:${stableJson(object[key])}`)\n      .join(\",\")}}`;\n  }\n  return JSON.stringify(value);\n};\n\nexport const appStateDocumentId = (collection: string, key: string): string =>\n  `${collection}/${encodeURIComponent(key)}`;\n\nexport const createInitialAppStateState = (): AppStateAccountState => ({\n  bootstrapCursor: null,\n  localRevision: 0,\n  pendingMutations: [],\n  shadow: {},\n  stagingBootstrap: null,\n  syncToken: null,\n});\n\nconst assertSynchronousResult = (value: unknown): void => {\n  if (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"then\" in value &&\n    typeof (value as { then?: unknown }).then === \"function\"\n  ) {\n    throw new TypeError(\"App State store reducers must be synchronous.\");\n  }\n};\n\nexport const createAppStateMemoryStore = (\n  initialStates: Readonly<Record<string, AppStateAccountState>> = {},\n): AppStateStore => {\n  const accounts = new Map<string, AppStateAccountState>(\n    Object.entries(initialStates).map(([accountId, state]) => [\n      accountId,\n      deepFreeze(cloneJson(state)) as AppStateAccountState,\n    ]),\n  );\n  const transactions = new Map<string, Promise<void>>();\n\n  return {\n    transaction: <T>(\n      accountId: string,\n      reducer: AppStateStoreReducer<T>,\n    ): Promise<T> => {\n      if (!accountId) {\n        return Promise.reject(\n          new TypeError(\"App State transactions require an account ID.\"),\n        );\n      }\n\n      const previous = transactions.get(accountId) ?? Promise.resolve();\n      const operation = previous.then(() => {\n        const current = accounts.get(accountId) ?? createInitialAppStateState();\n        const draft = cloneJson(current);\n        const result = reducer(draft);\n        assertSynchronousResult(result);\n        deepFreeze(draft);\n        accounts.set(accountId, draft);\n        return result;\n      });\n      transactions.set(\n        accountId,\n        operation.then(\n          () => undefined,\n          () => undefined,\n        ),\n      );\n      return operation;\n    },\n  };\n};\n\nconst applyChange = (\n  documents: Record<string, AppStateStoredDocument>,\n  change: AppStateChange,\n): void => {\n  const id = appStateDocumentId(change.collection, change.key);\n  const current = documents[id];\n  if (current && change.version < current.version) {\n    return;\n  }\n  if (current && change.version === current.version) {\n    if (stableJson(current) !== stableJson(change)) {\n      throw new AppStateProtocolError(\"same_version_conflict\");\n    }\n    return;\n  }\n  documents[id] = cloneJson(change);\n};\n\nexport const applyAppStateChangePage = (\n  state: AppStateAccountState,\n  changes: readonly AppStateChange[],\n  nextSyncToken: string,\n  target: \"shadow\" | \"stagingBootstrap\" = \"shadow\",\n): void => {\n  const current =\n    target === \"shadow\" ? state.shadow : (state.stagingBootstrap ?? {});\n  const replacement = cloneJson(current);\n  for (const change of changes) {\n    applyChange(replacement, change);\n  }\n\n  if (target === \"shadow\") {\n    state.shadow = replacement;\n  } else {\n    state.stagingBootstrap = replacement;\n  }\n  state.syncToken = nextSyncToken;\n};\n\nexport const applyAppStateBootstrapPage = (\n  state: AppStateAccountState,\n  items: readonly AppStateStoredDocument[],\n  nextCursor: string | null,\n): void => {\n  const replacement = cloneJson(state.stagingBootstrap ?? {});\n  for (const item of items) {\n    applyChange(replacement, item);\n  }\n  state.stagingBootstrap = replacement;\n  state.bootstrapCursor = nextCursor;\n};\n\nexport const promoteAppStateBootstrap = (state: AppStateAccountState): void => {\n  state.shadow = cloneJson(state.stagingBootstrap ?? {});\n  state.stagingBootstrap = null;\n  state.bootstrapCursor = null;\n};\n\nconst currentPrecondition = (\n  state: AppStateAccountState,\n  collection: string,\n  key: string,\n): Pick<AppStatePendingMutation, \"ifMatch\" | \"ifNoneMatch\"> => {\n  const current = state.shadow[appStateDocumentId(collection, key)];\n  return current?.operation === \"upsert\"\n    ? { ifMatch: current.etag }\n    : { ifNoneMatch: \"*\" };\n};\n\nexport const queueAppStatePut = (\n  state: AppStateAccountState,\n  collection: string,\n  key: string,\n  body: AppStatePutBody,\n  idempotencyKey: string,\n): number => {\n  const localRevision = state.localRevision + 1;\n  const mutation: AppStatePendingPut = {\n    ...currentPrecondition(state, collection, key),\n    body: cloneJson(body),\n    collection,\n    idempotencyKey,\n    key,\n    localRevision,\n    method: \"PUT\",\n  };\n  deepFreeze(mutation);\n  state.pendingMutations = [...state.pendingMutations, mutation];\n  state.localRevision = localRevision;\n  return localRevision;\n};\n\nexport const queueAppStateDelete = (\n  state: AppStateAccountState,\n  collection: string,\n  key: string,\n  idempotencyKey: string,\n): number => {\n  const localRevision = state.localRevision + 1;\n  const mutation: AppStatePendingMutation = {\n    ...currentPrecondition(state, collection, key),\n    collection,\n    idempotencyKey,\n    key,\n    localRevision,\n    method: \"DELETE\",\n  };\n  deepFreeze(mutation);\n  state.pendingMutations = [...state.pendingMutations, mutation];\n  state.localRevision = localRevision;\n  return localRevision;\n};\n\nconst visibleFromShadow = (\n  shadow: Readonly<Record<string, AppStateStoredDocument>>,\n): Record<string, AppStateVisibleDocument> => {\n  const visible: Record<string, AppStateVisibleDocument> = {};\n  for (const [id, document] of Object.entries(shadow)) {\n    if (document.operation === \"delete\") {\n      continue;\n    }\n    visible[id] = {\n      collection: document.collection,\n      etag: document.etag,\n      key: document.key,\n      pending: false,\n      schemaVersion: document.schemaVersion,\n      updatedAt: document.updatedAt,\n      value: cloneJson(document.value),\n      version: document.version,\n    };\n  }\n  return visible;\n};\n\nexport const deriveAppStateStateView = (\n  state: AppStateAccountState,\n): AppStateStateView => {\n  const snapshot = cloneJson(state);\n  const visible = visibleFromShadow(snapshot.shadow);\n  for (const mutation of snapshot.pendingMutations) {\n    const id = appStateDocumentId(mutation.collection, mutation.key);\n    if (mutation.method === \"DELETE\") {\n      delete visible[id];\n      continue;\n    }\n    const current = visible[id];\n    visible[id] = {\n      collection: mutation.collection,\n      etag: current?.etag ?? null,\n      key: mutation.key,\n      pending: true,\n      schemaVersion: mutation.body.schemaVersion,\n      updatedAt: current?.updatedAt ?? null,\n      value: cloneJson(mutation.body.value),\n      version: current?.version ?? null,\n    };\n  }\n  return deepFreeze({ ...snapshot, visible }) as AppStateStateView;\n};\n\nexport const snapshotAppStateMutations = (\n  state: AppStateAccountState,\n): readonly AppStatePendingMutation[] =>\n  deepFreeze(cloneJson(state.pendingMutations));\n\nexport const removeAppStateMutation = (\n  state: AppStateAccountState,\n  localRevision: number,\n): void => {\n  state.pendingMutations = state.pendingMutations.filter(\n    (mutation) => mutation.localRevision !== localRevision,\n  );\n};\n\nexport const replaceAppStateMutation = (\n  state: AppStateAccountState,\n  mutation: AppStatePendingMutation,\n): void => {\n  state.pendingMutations = state.pendingMutations.map((pending) =>\n    pending.localRevision === mutation.localRevision\n      ? (deepFreeze(cloneJson(mutation)) as AppStatePendingMutation)\n      : pending,\n  );\n};\n","import type {\n  AppStateAccountState,\n  AppStateChange,\n  AppStateMutationOptions,\n  AppStatePendingMutation,\n  AppStatePendingPut,\n  AppStatePutBody,\n  AppStateReconciler,\n  AppStateReconcilerOptions,\n  AppStateResponse,\n  AppStateStateView,\n  AppStateStoredDocument,\n  AppStateTransport,\n} from \"@/types\";\nimport { getAppStateErrorCode } from \"@/sdk/app-state-errors\";\n\nimport {\n  applyAppStateBootstrapPage,\n  applyAppStateChangePage,\n  appStateDocumentId,\n  AppStateProtocolError,\n  deriveAppStateStateView,\n  promoteAppStateBootstrap,\n  queueAppStateDelete,\n  queueAppStatePut,\n  removeAppStateMutation,\n  replaceAppStateMutation,\n  snapshotAppStateMutations,\n} from \"./app-state-state\";\n\ninterface ReconcileContext {\n  accountId: string;\n  generation: number;\n  transport: AppStateTransport;\n}\n\nconst DEFAULT_PAGE_SIZE = 100;\nconst DEFAULT_MAX_BOOTSTRAP_RESTART_ATTEMPTS = 3;\nconst DEFAULT_MAX_REBASE_ATTEMPTS = 3;\n\nconst defaultIdempotencyKey = (): string => {\n  const runtimeCrypto = (\n    globalThis as { crypto?: { randomUUID?: () => string } }\n  ).crypto;\n  if (typeof runtimeCrypto?.randomUUID !== \"function\") {\n    throw new Error(\n      \"App State reconciliation requires createIdempotencyKey when crypto.randomUUID is unavailable.\",\n    );\n  }\n  return runtimeCrypto.randomUUID();\n};\n\nconst mutationOptions = (\n  mutation: AppStatePendingMutation,\n): AppStateMutationOptions => {\n  if (mutation.ifMatch !== undefined) {\n    return {\n      idempotencyKey: mutation.idempotencyKey,\n      ifMatch: mutation.ifMatch,\n    };\n  }\n  if (mutation.ifNoneMatch !== undefined) {\n    return {\n      idempotencyKey: mutation.idempotencyKey,\n      ifNoneMatch: mutation.ifNoneMatch,\n    };\n  }\n  return { idempotencyKey: mutation.idempotencyKey };\n};\n\nconst bootstrapItems = (\n  items: readonly Omit<AppStateStoredDocument, \"operation\">[],\n): AppStateStoredDocument[] =>\n  items.map((item) => ({ ...item, operation: \"upsert\" }));\n\nconst isRecoveryError = (error: unknown): boolean => {\n  const code = getAppStateErrorCode(error);\n  return code === \"bootstrap_required\" || code === \"sync_token_expired\";\n};\n\nconst positiveInteger = (value: number, name: string): number => {\n  if (!Number.isInteger(value) || value <= 0) {\n    throw new TypeError(`${name} must be a positive integer.`);\n  }\n  return value;\n};\n\nexport const createAppStateReconciler = ({\n  accountId: initialAccountId,\n  createIdempotencyKey = defaultIdempotencyKey,\n  maxRebaseAttempts = DEFAULT_MAX_REBASE_ATTEMPTS,\n  pageSize = DEFAULT_PAGE_SIZE,\n  store,\n  transport: initialTransport,\n}: AppStateReconcilerOptions): AppStateReconciler => {\n  if (!initialAccountId) {\n    throw new TypeError(\"App State reconciliation requires an account ID.\");\n  }\n  positiveInteger(pageSize, \"pageSize\");\n  if (!Number.isInteger(maxRebaseAttempts) || maxRebaseAttempts < 0) {\n    throw new TypeError(\"maxRebaseAttempts must be a non-negative integer.\");\n  }\n\n  let activeAccountId = initialAccountId;\n  let activeTransport = initialTransport;\n  let accountGeneration = 0;\n  let reconcileQueue = Promise.resolve();\n\n  const isCurrent = (context: ReconcileContext): boolean =>\n    context.accountId === activeAccountId &&\n    context.generation === accountGeneration;\n\n  const context = (): ReconcileContext => ({\n    accountId: activeAccountId,\n    generation: accountGeneration,\n    transport: activeTransport,\n  });\n\n  const commit = async (\n    reconcileContext: ReconcileContext,\n    reducer: (state: AppStateAccountState) => void,\n  ): Promise<boolean> => {\n    if (!isCurrent(reconcileContext)) return false;\n    return store.transaction(reconcileContext.accountId, (state) => {\n      if (!isCurrent(reconcileContext)) return false;\n      reducer(state);\n      return true;\n    });\n  };\n\n  const readProgress = (reconcileContext: ReconcileContext) =>\n    store.transaction(reconcileContext.accountId, (state) => ({\n      bootstrapCursor: state.bootstrapCursor,\n      hasStaging: state.stagingBootstrap !== null,\n      syncToken: state.syncToken,\n    }));\n\n  const resetBootstrap = (\n    reconcileContext: ReconcileContext,\n  ): Promise<boolean> =>\n    commit(reconcileContext, (state) => {\n      state.bootstrapCursor = null;\n      state.stagingBootstrap = {};\n      state.syncToken = null;\n    });\n\n  const rebuildBootstrap = async (\n    reconcileContext: ReconcileContext,\n    reset: boolean,\n  ): Promise<void> => {\n    let restartAttempts = 0;\n    if (reset && !(await resetBootstrap(reconcileContext))) return;\n\n    while (isCurrent(reconcileContext)) {\n      while (isCurrent(reconcileContext)) {\n        const progress = await readProgress(reconcileContext);\n        if (!isCurrent(reconcileContext)) return;\n        if (\n          progress.hasStaging &&\n          progress.bootstrapCursor === null &&\n          progress.syncToken !== null\n        ) {\n          break;\n        }\n\n        let response: Awaited<ReturnType<AppStateTransport[\"bootstrap\"]>>;\n        try {\n          response = await reconcileContext.transport.bootstrap({\n            ...(progress.bootstrapCursor === null\n              ? {}\n              : { cursor: progress.bootstrapCursor }),\n            limit: pageSize,\n          });\n        } catch (error) {\n          if (!isCurrent(reconcileContext)) return;\n          throw error;\n        }\n        if (!isCurrent(reconcileContext)) return;\n\n        const page = response.data;\n        if (page.hasMore && page.nextCursor === null) {\n          throw new AppStateProtocolError(\"bootstrap_cursor_missing\");\n        }\n        if (!page.hasMore && page.nextSyncToken === null) {\n          throw new AppStateProtocolError(\"bootstrap_sync_token_missing\");\n        }\n        const pageCommitted = await commit(reconcileContext, (state) => {\n          applyAppStateBootstrapPage(\n            state,\n            bootstrapItems(page.items),\n            page.hasMore ? page.nextCursor : null,\n          );\n          if (!page.hasMore) {\n            state.syncToken = page.nextSyncToken;\n          }\n        });\n        if (!pageCommitted) return;\n        if (!page.hasMore) break;\n      }\n\n      while (isCurrent(reconcileContext)) {\n        const { syncToken } = await readProgress(reconcileContext);\n        if (!isCurrent(reconcileContext)) return;\n        if (syncToken === null) {\n          throw new AppStateProtocolError(\"bootstrap_sync_token_missing\");\n        }\n        let response: Awaited<ReturnType<AppStateTransport[\"getChanges\"]>>;\n        try {\n          response = await reconcileContext.transport.getChanges(syncToken, {\n            limit: pageSize,\n          });\n        } catch (error) {\n          if (!isCurrent(reconcileContext)) return;\n          if (!isRecoveryError(error)) throw error;\n          const resetCommitted = await resetBootstrap(reconcileContext);\n          if (!resetCommitted) return;\n          if (restartAttempts >= DEFAULT_MAX_BOOTSTRAP_RESTART_ATTEMPTS) {\n            throw error;\n          }\n          restartAttempts += 1;\n          break;\n        }\n        if (!isCurrent(reconcileContext)) return;\n\n        const pageCommitted = await commit(reconcileContext, (state) => {\n          applyAppStateChangePage(\n            state,\n            response.data.changes,\n            response.data.nextSyncToken,\n            \"stagingBootstrap\",\n          );\n          if (!response.data.hasMore) {\n            promoteAppStateBootstrap(state);\n          }\n        });\n        if (!pageCommitted || !response.data.hasMore) return;\n      }\n    }\n  };\n\n  const pull = async (reconcileContext: ReconcileContext): Promise<void> => {\n    const initial = await readProgress(reconcileContext);\n    if (!isCurrent(reconcileContext)) return;\n    if (initial.syncToken === null || initial.hasStaging) {\n      await rebuildBootstrap(reconcileContext, false);\n      return;\n    }\n\n    while (isCurrent(reconcileContext)) {\n      const { syncToken } = await readProgress(reconcileContext);\n      if (!isCurrent(reconcileContext)) return;\n      if (syncToken === null) {\n        await rebuildBootstrap(reconcileContext, false);\n        return;\n      }\n\n      try {\n        const response = await reconcileContext.transport.getChanges(\n          syncToken,\n          {\n            limit: pageSize,\n          },\n        );\n        if (!isCurrent(reconcileContext)) return;\n        const pageCommitted = await commit(reconcileContext, (state) => {\n          applyAppStateChangePage(\n            state,\n            response.data.changes,\n            response.data.nextSyncToken,\n          );\n        });\n        if (!pageCommitted || !response.data.hasMore) return;\n      } catch (error) {\n        if (!isCurrent(reconcileContext)) return;\n        if (!isRecoveryError(error)) throw error;\n        await rebuildBootstrap(reconcileContext, true);\n        return;\n      }\n    }\n  };\n\n  const applySuccessfulPut = async (\n    reconcileContext: ReconcileContext,\n    mutation: AppStatePendingPut,\n    response: AppStateResponse<{\n      collection: string;\n      key: string;\n      schemaVersion: number;\n      updatedAt: string;\n      version: number;\n    }>,\n  ): Promise<void> => {\n    const etag = response.etag;\n    if (etag === null) {\n      throw new AppStateProtocolError(\"put_response_etag_missing\");\n    }\n    await commit(reconcileContext, (state) => {\n      if (state.syncToken !== null) {\n        const change: AppStateChange = {\n          ...response.data,\n          etag,\n          operation: \"upsert\",\n          value: mutation.body.value,\n        };\n        applyAppStateChangePage(state, [change], state.syncToken);\n      }\n      removeAppStateMutation(state, mutation.localRevision);\n    });\n  };\n\n  const acknowledgeDelete = async (\n    reconcileContext: ReconcileContext,\n    mutation: AppStatePendingMutation,\n  ): Promise<void> => {\n    await commit(reconcileContext, (state) => {\n      const id = appStateDocumentId(mutation.collection, mutation.key);\n      const current = state.shadow[id];\n      if (current) {\n        state.shadow[id] = { ...current, operation: \"delete\", value: null };\n      }\n      removeAppStateMutation(state, mutation.localRevision);\n    });\n  };\n\n  const refreshAndRebase = async (\n    reconcileContext: ReconcileContext,\n    mutation: AppStatePendingMutation,\n  ): Promise<AppStatePendingMutation | null> => {\n    let current: Awaited<ReturnType<AppStateTransport[\"getDocument\"]>> | null;\n    try {\n      current = await reconcileContext.transport.getDocument(\n        mutation.collection,\n        mutation.key,\n      );\n    } catch (error) {\n      if (getAppStateErrorCode(error) !== \"document_not_found\") throw error;\n      current = null;\n    }\n    if (!isCurrent(reconcileContext)) return null;\n    if (current !== null && current.etag === null) {\n      throw new Error(\"App State conflict refresh did not return an ETag.\");\n    }\n\n    if (current === null && mutation.method === \"DELETE\") {\n      await acknowledgeDelete(reconcileContext, mutation);\n      return null;\n    }\n\n    const rebased: AppStatePendingMutation =\n      mutation.method === \"PUT\"\n        ? {\n            body: mutation.body,\n            collection: mutation.collection,\n            idempotencyKey: createIdempotencyKey(),\n            ...(current === null\n              ? { ifNoneMatch: \"*\" }\n              : { ifMatch: current.etag! }),\n            key: mutation.key,\n            localRevision: mutation.localRevision,\n            method: \"PUT\",\n          }\n        : {\n            collection: mutation.collection,\n            idempotencyKey: createIdempotencyKey(),\n            ifMatch: current!.etag!,\n            key: mutation.key,\n            localRevision: mutation.localRevision,\n            method: \"DELETE\",\n          };\n\n    const committed = await commit(reconcileContext, (state) => {\n      if (current !== null && state.syncToken !== null) {\n        applyAppStateChangePage(\n          state,\n          [\n            {\n              ...current.data,\n              etag: current.etag!,\n              operation: \"upsert\",\n            },\n          ],\n          state.syncToken,\n        );\n      }\n      replaceAppStateMutation(state, rebased);\n    });\n    return committed ? rebased : null;\n  };\n\n  const replayMutation = async (\n    reconcileContext: ReconcileContext,\n    captured: AppStatePendingMutation,\n  ): Promise<void> => {\n    let mutation = captured;\n    let rebaseAttempts = 0;\n\n    while (isCurrent(reconcileContext)) {\n      try {\n        if (mutation.method === \"PUT\") {\n          const response = await reconcileContext.transport.putDocument(\n            mutation.collection,\n            mutation.key,\n            mutation.body,\n            mutationOptions(mutation),\n          );\n          if (!isCurrent(reconcileContext)) return;\n          await applySuccessfulPut(reconcileContext, mutation, response);\n        } else {\n          await reconcileContext.transport.deleteDocument(\n            mutation.collection,\n            mutation.key,\n            mutationOptions(mutation),\n          );\n          if (!isCurrent(reconcileContext)) return;\n          await acknowledgeDelete(reconcileContext, mutation);\n        }\n        return;\n      } catch (error) {\n        if (!isCurrent(reconcileContext)) return;\n        const errorCode = getAppStateErrorCode(error);\n        if (\n          mutation.method === \"DELETE\" &&\n          errorCode === \"document_not_found\"\n        ) {\n          await acknowledgeDelete(reconcileContext, mutation);\n          return;\n        }\n        if (\n          errorCode !== \"precondition_failed\" ||\n          rebaseAttempts >= maxRebaseAttempts\n        ) {\n          throw error;\n        }\n        rebaseAttempts += 1;\n        const rebased = await refreshAndRebase(reconcileContext, mutation);\n        if (rebased === null) return;\n        mutation = rebased;\n      }\n    }\n  };\n\n  const replay = async (reconcileContext: ReconcileContext): Promise<void> => {\n    const captured = await store.transaction(\n      reconcileContext.accountId,\n      snapshotAppStateMutations,\n    );\n    for (const mutation of captured) {\n      if (!isCurrent(reconcileContext)) return;\n      await replayMutation(reconcileContext, mutation);\n    }\n  };\n\n  const reconcileContext = async (\n    reconcileContext: ReconcileContext,\n  ): Promise<void> => {\n    await pull(reconcileContext);\n    if (!isCurrent(reconcileContext)) return;\n    try {\n      await replay(reconcileContext);\n    } catch (error) {\n      if (!isRecoveryError(error)) throw error;\n      await rebuildBootstrap(reconcileContext, true);\n      if (!isCurrent(reconcileContext)) return;\n      await replay(reconcileContext);\n    }\n    if (!isCurrent(reconcileContext)) return;\n    await pull(reconcileContext);\n  };\n\n  const getStateFor = (accountId: string): Promise<AppStateStateView> =>\n    store.transaction(accountId, deriveAppStateStateView);\n\n  return {\n    deleteDocument: async (collection, key) => {\n      const mutationContext = context();\n      const idempotencyKey = createIdempotencyKey();\n      await store.transaction(mutationContext.accountId, (state) => {\n        queueAppStateDelete(state, collection, key, idempotencyKey);\n      });\n      return getStateFor(activeAccountId);\n    },\n    getState: () => getStateFor(activeAccountId),\n    putDocument: async (collection, key, body: AppStatePutBody) => {\n      const mutationContext = context();\n      const idempotencyKey = createIdempotencyKey();\n      const bodySnapshot = JSON.parse(JSON.stringify(body)) as AppStatePutBody;\n      await store.transaction(mutationContext.accountId, (state) => {\n        queueAppStatePut(\n          state,\n          collection,\n          key,\n          bodySnapshot,\n          idempotencyKey,\n        );\n      });\n      return getStateFor(activeAccountId);\n    },\n    reconcile: () => {\n      const capturedContext = context();\n      const operation = reconcileQueue.then(() =>\n        reconcileContext(capturedContext),\n      );\n      reconcileQueue = operation.then(\n        () => undefined,\n        () => undefined,\n      );\n      return operation.then(() => getStateFor(activeAccountId));\n    },\n    switchAccount: (accountId, transport) => {\n      if (!accountId) {\n        return Promise.reject(\n          new TypeError(\"App State reconciliation requires an account ID.\"),\n        );\n      }\n      accountGeneration += 1;\n      activeAccountId = accountId;\n      activeTransport = transport;\n      return getStateFor(accountId);\n    },\n  };\n};\n"]}